Белов, А.В. Микроконтроллеры 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)
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==