USART/UART на ATmega16 — Обмен данными по последовательному каналу

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
UBRRL и UBRRH Register - UART(USART) ATmega16 - Обмен данными по последовательному каналу (6)
UCSRA
UCSRA Register - UART(USART) ATmega16 - Обмен данными по последовательному каналу (5)
UCSRB
UCSRB Register - UART(USART) ATmega16 - Обмен данными по последовательному каналу (8)
UCSRC
UCSRC Register - UART(USART) ATmega16 - Обмен данными по последовательному каналу (7)
UDR
UDR Register - UART(USART) ATmega16 - Обмен данными по последовательному каналу (4)

Схема подключения. Создание схемы в ISIS 7 Professional — Proteus. Симуляция программы на ATmega16

Для начала нам нужно создать схему, добавить компоненты, указать путь к .hex или .elf файлу. Если не знаем, как это делается, переходим на страницу Мигание светодиодом на ATmega16/32.

  1. В Virtual Instruments Mode выбираем VIRTUAL TERMINAL и добавляем его.Схема подключения. USART/UART на ATmega16 - Обмен данными по последовательному каналу (1)
  2. Соединяем терминал к микроконтроллеру: RXD контроллера к TXD терминала и RXD терминала к TXD контроллера.
    Схема подключения. USART/UART на ATmega16 - Обмен данными по последовательному каналу (2)
  3. Нажимаем кнопку Play для запуска симуляции. В терминале нажимаем на клавиши, чтобы отправить на контроллер данные. К примеру, если нажать ‘x‘, контроллер отвечает нам сообщением: ‘Вы отправили: x‘, где x — нажатая клавиша.
    Схема подключения. USART/UART на ATmega16 - Обмен данными по последовательному каналу (3)

 

 

Чтобы точно рассчитать делитель UBRR для нужной скорости и оценить погрешность, удобно воспользоваться калькулятором UART Baud Rate.

4 комментария к “USART/UART на ATmega16 — Обмен данными по последовательному каналу”

  1. Привет. Хороший материал. Вот только почему то в протеусе нет русского текста и ошибки в студии. Ничего не изменял, все скопировал и вставил в студию. Спасибо

    Ответить
    • Proteus Virtual Terminal настройка кириллицы set font
      Опция Set Font вызывает дополнительное окно выбора шрифта для окна терминала.
      Proteus Virtual Terminal настройка кириллицы courier new
      Хочу отметить, что обычно после установки Протеуса для терминала принят западноевропейский шрифт, поэтому, если вам нужна кириллица в терминале, то вам прямиком сюда. Здесь необходимо выбрать шрифт, в котором наверняка имеется кириллица, например, Courier. В этом же окне можно установить и размер шрифта по умолчанию стоит 8, что, например, для меня полуслепого мелковато. Шрифт достаточно установить один раз, потом в последующих проектах при выборе терминала он будет таким, каким вы его прописали ранее.
      Proteus Virtual Terminal настройка кириллицы всё работает

      А вот по поводу ошибок можно по подробнее, какие именно ошибки и выдаёт?

      Ответить
  2. Здравствуйте, я надеюсь, что тема еще жива. Спасибо автору за статью, в общем работает в симуляторе но не очень правильно. Мне нужна помощь. В консоли терминала протеуса рисует одну верхнюю кавычку, в терминале путти пишет строку micro-pi.ru но при этом есть куча мусора, вместо символов прямоугольники полосами. Не понимаю что нужно делать, что я не так настроил.

    Ответить

Оставьте комментарий

Отправляя комментарий, вы соглашаетесь с обработкой ваших данных (имя, адрес электронной почты, текст комментария) в соответствии с политикой конфиденциальности.