Белов, А.В. Микроконтроллеры AVR: от азов программирования до создания практических устройств
Шаг 6. Осваиваем все возможности микроконтроллера ATtiny2313 479 ldi г16, L0W(-1) USART_ReceiveNoError : , Выделяем 9-й бит и возвращаем полученные данные 1ST г17 andi г17, 0x01 ret Листинг 6.14. Пример на языке СИ (Code Vision) «define RXC 7 «define FE 4 «define DOR 3 «define UPE 2 unsigned int USART_Receive( void ) { unsigned char status, resh, resl, /* Ожидаем пока данные будут получены */ while ( ! (UCSRA & (1«RXC)) ); /* Получаем статус и 9-й бит данных, а затем остальные данные из буфера */ status = UCSRA, resh = UCSRB; resl = UDR; /* Если ошибка, возвращаем -1*/ if ( status & (1«FE)|(1«D0R)|(1«UPE) ) return -1; /* Выделяем 9-й бит, соединяем все 9 бит вместе и возвращаем полученное значение */ resh = (resh » 1) & 0x01, return (((unsigned int)resh « 8) | resl); } Флаг готовности приемника и вызов прерывания Приемник USART использует всего один флаг, который индицирует его состояние. Флаг «Прием завершен» (RXC) позволяет определить, есть ли непрочитанные данные в буфере приема. Этот флаг устанавливается в единицу, если в буфере приема существуют непрочитанные данные, и равен нулю, если буфер приема пуст (то есть не содержит никаких непро читанных данных). Если приемник отключен (RXEN = 0), то буфер приема будет сброшен, и, следовательно, бит RXC будет равен нулю. Если прерывание по событию «Прием завершен» разрешено (бит RXCIE регистра UCSRB установлен), оно будет вызываться все время, пока флаг RXC установлен (при условии глобального разрешения пре рываний). Если для получения данных используется прерывание, процедура обработки этого прерывания должна обязательно прочитать данные из регистра UDR для того, чтобы сбросить флаг RXC. Иначе как только закончится текущее прерывание, будет вызвано новое.
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==