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 нажатая клавиша.



