USART/UART на ATmega16 — микроконтроллер ATmega16 (ATmega32) имеет в своем составе модуль универсального синхронно/асинхронного приемопередатчика — USART. С его помощью можно организовать обмен данными по последовательному каналу между компьютером и микроконтроллером или между двумя микроконтроллерами.
Как создать проект в Atmel Studio 7 смотрим здесь.
Пример программы в Atmel Studio 7 на C
// UART на ATmega16 #define F_CPU 8000000UL #define BAUD 9600 #define MYUBRR F_CPU/16/BAUD-1 #include <avr/io.h> void USARTInit(unsigned int ubrr) { // нормальный асинхронный двунаправленный режим работы // UBRR = f / (16 * band) // Установка скорости UBRRH = (unsigned char)(ubrr>>8); UBRRL = (unsigned char)(ubrr); // RXC - завершение приёма // |TXC - завершение передачи // ||UDRE - отсутствие данных для отправки // |||FE - ошибка кадра // ||||DOR - ошибка переполнение буфера // |||||PE - ошибка чётности // ||||||U2X - Двойная скорость // |||||||MPCM - Многопроцессорный режим // |||||||| // 76543210 UCSRA = 0; // RXCIE - прерывание при приёме данных // |TXCIE - прерывание при завершение передачи // ||UDRIE - прерывание отсутствие данных для отправки // |||RXEN - разрешение приёма // ||||TXEN - разрешение передачи // |||||UCSZ2 - UCSZ0:2 размер кадра данных // ||||||RXB8 - 9 бит принятых данных // |||||||TXB8 - 9 бит переданных данных // |||||||| // 76543210 // разрешен приём и передача данных по UART UCSRB = 1<<RXEN | 1<<TXEN; // URSEL - всегда 1 // |UMSEL - режим: 1-синхронный 0-асинхронный // ||UPM1 - UPM0: 1 чётность // |||UPM0 - UPM0: 1 чётность // ||||USBS - стоп биты: 0-1, 1-2 // |||||UCSZ1 - UCSZ0: 2 размер кадра данных // ||||||UCSZ0 - UCSZ0: 2 размер кадра данных // |||||||UCPOL - в синхронном режиме - тактирование // |||||||| // 76543210 // 8-битовая посылка, 2 стоп бита UCSRC = 1<<URSEL | 1<<USBS | 1<<UCSZ0 | 1<<UCSZ1; } // Отправка байта void USARTTransmitChar(char c) { // Устанавливается, когда регистр свободен while(!( UCSRA & (1<<UDRE))); UDR = c; } // Отправка строки void USARTTransmitString(char str[]) { register char i = 0; while(str[i]) { USARTTransmitChar(str[i++]); } } // Отправка строки void USARTTransmitStringLn(char str[]) { USARTTransmitString(str); USARTTransmitChar((char)13); USARTTransmitChar((char)10); } // Получение байта char USARTReceiveChar(void) { // Устанавливается, когда регистр свободен while(!(UCSRA & (1<<RXC))); return UDR; } int main(void) { USARTInit(MYUBRR); USARTTransmitStringLn("Привет"); USARTTransmitStringLn("Сайт: micro-pi.ru"); while (1) { char c = USARTReceiveChar(); USARTTransmitString("Вы отправили: "); USARTTransmitChar(c); USARTTransmitStringLn(""); } }
Регистры UART на ATmega16
UBRRL и UBRRH
UCSRA
UCSRB
UCSRC
UDR
Схема подключения. Создание схемы в ISIS 7 Professional — Proteus. Симуляция программы на ATmega16
Для начала нам нужно создать схему, добавить компоненты, указывать путь к .hex или .elf файлу. Если не знаем как это делается переходим на странице Мигание светодиодом на ATmega16/32.
- В Virtual Instruments Mode выбираем VIRTUAL TERMINAL и добавляем его.
- Соединяем терминал к микроконтроллеру: RXD контроллера к TXD терминала и RXD терминала к TXD контроллера.
- Нажимаем кнопку Play для запуска симуляции. В терминале нажимаем на клавиши чтобы отправить на контроллер данные. К примеру, если нажать ‘x‘ контроллер отвечает нам сообщением: ‘Вы отправили: x‘, где x нажатая клавиша.
Привет. Хороший материал. Вот только почему то в протеусе нет русского текста и ошибки в студии. Ничего не изменял, все скопировал и вставил в студию. Спасибо
Опция Set Font вызывает дополнительное окно выбора шрифта для окна терминала.
Хочу отметить, что обычно после установки Протеуса для терминала принят западноевропейский шрифт, поэтому, если вам нужна кириллица в терминале, то вам прямиком сюда. Здесь необходимо выбрать шрифт, в котором наверняка имеется кириллица, например, Courier. В этом же окне можно установить и размер шрифта по умолчанию стоит 8, что, например, для меня полуслепого мелковато. Шрифт достаточно установить один раз, потом в последующих проектах при выборе терминала он будет таким, каким вы его прописали ранее.
А вот по поводу ошибок можно по подробнее, какие именно ошибки и выдаёт?
Здравствуйте, я надеюсь, что тема еще жива. Спасибо автору за статью, в общем работает в симуляторе но не очень правильно. Мне нужна помощь. В консоли терминала протеуса рисует одну верхнюю кавычку, в терминале путти пишет строку micro-pi.ru но при этом есть куча мусора, вместо символов прямоугольники полосами. Не понимаю что нужно делать, что я не так настроил.
Здравствуйте, а между двумя контроллерами можно сделать такую же связь?