Белов, А.В. Микроконтроллеры AVR: от азов программирования до создания практических устройств

478 Микроконтроллеры AVR от азов программирования... Листинг 6.12. Пример на языке СИ (Code Vision) «define RXC 7 unsigned char USART_Receive( void ) { /* Ожидаем пока данные будут получены */ while ( ' (UCSRA & (1«RXC)) ); /* Читаем данные из буфера и возвращаем их при выходе из подпрограммы */ return UDR, } Прием кадра данных длиной 9 бит При использовании кадра, содержащего 9-разрядное слово данных (UCSZ=7), девятый разряд помещается в бит RXB8 регистра UCSRB. Процессор должен прочитать этот бита перед тем, как будут прочитаны восемь младших битов из регистра UDR. Это правило также необхо ­ димо соблюдать при проверке флагов FE, DOR и UPE в регистре статуса. Сначала прочитайте содержимое регистра статуса UCSRA, а затем можете читать данные из регистра UDR. При чтении регистра UDR изменится состояние FIFO буфера приема, а следовательно, изменится состояние разрядов ТХВ8, FE, DOR и UPE, кото ­ рые все сохранены в FIFO. В следующем программном примере показана простая функция приема данных USART, которая работает со словом данных в девять разрядов и с битами статуса (листинги 6.13 и 6.14). В приведенном примере функция сначала читает данные из реги ­ стров ввода-вывода и помещает каждое из прочитанных значений в свой отдельный регистр общего назначения. И лишь затем она может выпол ­ нять все необходимые операции с прочитанными значениями. Такое решение позволяет оптимально использовать буфер приема, так как в этом случае буфер будет освобожден как можно раньше и будет готов принять новые данные. Листинг 6.13. Пример на языке Ассемблер USART.Receive: ; Ожидаем пока данные будут получены sbis UCSRA, RXC rjmp USART.Receive ; Получаем статус и 9-й бит данных, а затем остальные данные in г18, UCSRA in г17, UCSRB in r16, UDR ; Если ошибка, возвращаем -1 andi г18, (1«FE) | ( 1«DOR ) | ( 1«UPE) breq USART.ReceiveNoError ldi r17, HIGH(-I)

RkJQdWJsaXNoZXIy MTExODQxMg==