Программирование последовательной коммуникации между микроконтроллером и компьютером


Конфигурация, использованная в упражнении.
ПараметрЗначение
Базовая
схема
STK500
ПроцессорATMega16
Тактовая
частота
4,0 МГц
Частота
коммуникации
9600 бит/с
ПОWinAVR
Используемые регистры
РегистрПримечание
MCUCR
TIMSK
UBRRL $09($29)Регистр выбора скорости приема/передачи UART (младшие 8 бит)
UBRRH $20($40)Регистр выбора скорости приема/передачи UART (старшие 4 бита)
UCSRA $0B($2B)Регистр управления и состояния UART A
UCSRB $0A($2A)Регистр управления и состояния UART B
DDRA/DDRB/DDRD
PINA
UDR $0C($2C)Регистр ввода/вывода данных UART
В стандартной конфигурации экспериментальной платы STK500 регистр D используется для опроса состояния кнопок, а регистр B - для вывода информации о нажатых кнопках на светодиоды.
В микроконтроллере ATMega16, как и во многих других AVR-контроллерах, линии последовательного интерфейса TXD и RXD совмещены с выводами порта D D0 и D1 (D0<=>RXD; D1<=>TXD).Для использования вывода D0 в качестве приемника UART необходимо установить в единицу флаг RXEN регистра UCR (UCSRB.4=1). Если этот флаг сброшен, линия используется для обычных операций ввода/вывода. Для использования вывода D1 в качестве передатчика UART необходимо установить в единицу флаг TXEN регистра UCR (UCSRB.3=1). Если этот флаг сброшен, линия используется для обычных операций ввода/вывода.

Регистр UCSRA
БитОбозначениеПримечание
7: RXCUART Receive Complete
6: TXCUART Transmit Complete
5: UDREUART Transmit CompleteData Register Empty Этот бит устанавливается (=1), когда записанный в UDR символ передан в сдвиговый регистр передачи. Установка этого бита сигнализирует, что передатчик готов к приему и обработке следующего символа.
Если установлен бит UDRIE в регистре UCR, то проиходит генерация прерывания UART Transmit Complete до тех пор, пока бит UDRE не будет сброшен. Бит UDRE сбрасывается автоматически при записи следующего символа в UDR. При коммуникации с использованием прерываний процедура обработки прерывания UART Transmit Complete должна записать в UDR следующий символ для сброса флага UDRE, в противном случае новое прерывание будет сгенерировано сразу после завершения процедуры обработки прерывания.
Во время сброса UDRE устанавлен (=1) для индикации готовности передатчика к работе.
4: FEFraming Error
3: OROverRun
2: -reserved
1: U2XDouble the UART Transmission Speed
0: MPCMMultiprocessor Communication Mode


После выполнения подготовительных операций экспериментальная плата была соединена с компъютером (COM2), запущена программа Hyperterminal и в ней произведены необходимые настройки (COM2/9600/N/1). Программа на микроконтроллере запущена - никакого эффекта. Окно Hyperterminal оставалось пустым. В Интернете найдены и скопированы в проект другой вариант процедуры настройки UART. Новая компиляция и программирование, перезапуск - опять неудача. Игра с FUSE-битами (частота внутреннего осциллятора) тоже не дала результатов. Возникло подозрение, что внутренний осциллятор недостаточно точен для обеспечения последовательной коммуникации и необходимо использовать внешний резонатор. Начался поиск информации по правильному конфигурированию контроллера для использования внешнего резонатора, но в процессе возникла мысль - а не имеет ли STK500 каких-нибудь настроек, связанных с UART. Тут-то и выяснилось, что для активации пользовательского COM-порта на STK500 необходимо установить дополнительные соединения D0-RXD и D1-TXD. Тогда сигналы становятся доступными на RS232-SPARE-разъеме.
Быстро установил эти соединения и по экрану Hyperterminal побежали принимаемые символы. Заработало! Значит, можно осуществлять последовательную коммуникацию и без внешнего резонатора - точности внутреннего исциллятора для этого вполне достаточно.