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‘, где  нажатая клавиша.
    Схема подключения. USART/UART на ATmega16 - Обмен данными по последовательному каналу (3)

 

 

Похожие записи

Комментарии 5

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


    • Опция Set Font вызывает дополнительное окно выбора шрифта для окна терминала.

      Хочу отметить, что обычно после установки Протеуса для терминала принят западноевропейский шрифт, поэтому, если вам нужна кириллица в терминале, то вам прямиком сюда. Здесь необходимо выбрать шрифт, в котором наверняка имеется кириллица, например, Courier. В этом же окне можно установить и размер шрифта по умолчанию стоит 8, что, например, для меня полуслепого мелковато. Шрифт достаточно установить один раз, потом в последующих проектах при выборе терминала он будет таким, каким вы его прописали ранее.

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

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

  • Здравствуйте, а между двумя контроллерами можно сделать такую же связь?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *