Avr uart. Использование UART в микроконтроллерах AVR: полное руководство

Как настроить и использовать UART в микроконтроллерах AVR. Какие существуют режимы работы UART. Как подключить микроконтроллер к компьютеру по UART. Какие основные команды используются для работы с UART.

Содержание

Что такое UART и для чего он используется

UART (Universal Asynchronous Receiver-Transmitter) — это универсальный асинхронный приемопередатчик, который используется для передачи данных между устройствами. UART позволяет осуществлять обмен данными между:

  • Компьютером и компьютером
  • Компьютером и микроконтроллером
  • Микроконтроллером и микроконтроллером

UART использует два сигнальных провода для передачи данных: TX (передача) и RX (прием). Данные передаются побитово на определенной скорости (бодрейте).

Основные режимы работы UART

UART в микроконтроллерах AVR может работать в нескольких режимах:

  • Асинхронный режим — данные передаются без использования тактового сигнала
  • Синхронный режим — используется дополнительная линия тактирования
  • Ведущий (Master) режим — микроконтроллер генерирует тактовый сигнал
  • Ведомый (Slave) режим — микроконтроллер принимает внешний тактовый сигнал

Наиболее часто используется асинхронный режим без дополнительного тактирования.


Настройка UART в микроконтроллере AVR

Для настройки UART в микроконтроллере AVR необходимо выполнить следующие шаги:

  1. Включить тактирование UART
  2. Настроить скорость передачи данных (бодрейт)
  3. Задать формат кадра (число бит данных, четность, стоп-биты)
  4. Включить передатчик и/или приемник
  5. При необходимости настроить прерывания

Пример базовой инициализации UART на языке C:


// Установка скорости 9600 бод при частоте МК 16 МГц
#define F_CPU 16000000UL
#define BAUD 9600
#define MYUBRR F_CPU/16/BAUD-1

// Инициализация UART
void USART_Init(unsigned int ubrr)
{
  // Установка скорости
  UBRR0H = (unsigned char)(ubrr>
>8); UBRR0L = (unsigned char)ubrr; // Включение приемника и передатчика UCSR0B = (1<

Подключение микроконтроллера к компьютеру по UART

Для подключения микроконтроллера к компьютеру по UART необходимо использовать преобразователь уровней, так как UART микроконтроллера работает на уровнях TTL (0-5В), а COM-порт компьютера использует уровни RS-232 (+/-12В).

Наиболее распространенные варианты подключения:

  • Использование микросхемы MAX232 для преобразования уровней
  • Использование USB-UART преобразователя на микросхеме FT232 или CH340

Схема подключения через MAX232:


      AVR         MAX232       DB9
      
     TXD  -----> T1IN   ---> PIN 2 (RXD)
     RXD  <----- R1OUT  <--- PIN 3 (TXD)
     GND  <---->
GND <--> PIN 5 (GND)

Основные команды для работы с UART

Для работы с UART используются следующие основные команды:


  • UDR0 - регистр данных для отправки/приема байта
  • UCSR0A - регистр состояния и управления A
  • UCSR0B - регистр состояния и управления B
  • UCSR0C - регистр состояния и управления C
  • UBRR0 - регистр скорости передачи данных

Пример отправки байта:


void USART_Transmit(unsigned char data)
{
  // Ожидание опустошения буфера передатчика
  while (!(UCSR0A & (1<

Пример приема байта:


unsigned char USART_Receive(void)
{
  // Ожидание данных для приема
  while (!(UCSR0A & (1<

Использование прерываний для работы с UART

Для более эффективной работы с UART рекомендуется использовать прерывания. Это позволяет не блокировать выполнение основной программы при ожидании приема или передачи данных.

Пример настройки прерывания по приему данных:


// Включение прерывания по приему
UCSR0B |= (1 << RXCIE0);

// Обработчик прерывания
ISR(USART_RX_vect)
{
  unsigned char data = UDR0;
  // Обработка принятого байта
}

Буферизация данных при работе с UART

При интенсивном обмене данными по UART рекомендуется использовать буферизацию. Это позволяет избежать потери данных при невозможности их мгновенной обработки.

Пример реализации кольцевого буфера для приема данных:


#define BUFFER_SIZE 64

volatile uint8_t rx_buffer[BUFFER_SIZE];
volatile uint8_t rx_head = 0;
volatile uint8_t rx_tail = 0;

ISR(USART_RX_vect)
{
  uint8_t data = UDR0;
  
  uint8_t next = (rx_head + 1) % BUFFER_SIZE;
  
  if (next != rx_tail) {
    rx_buffer[rx_head] = data;
    rx_head = next;
  }
}

uint8_t uart_read()
{
  if (rx_head == rx_tail) {
    return 0; // Буфер пуст
  }
  
  uint8_t data = rx_buffer[rx_tail];
  rx_tail = (rx_tail + 1) % BUFFER_SIZE;
  
  return data;
}

Часто задаваемые вопросы о UART

Вопрос: Какая максимальная скорость передачи данных по UART?


Ответ: Теоретически UART может работать на скоростях до нескольких Мбит/с. Однако на практике максимальная скорость ограничена возможностями конкретного микроконтроллера и качеством линии связи. Для большинства применений достаточно скорости 115200 бод.

Вопрос: Можно ли использовать UART для связи на большие расстояния?

Ответ: UART предназначен для связи на короткие расстояния (до нескольких метров). Для больших расстояний рекомендуется использовать интерфейсы RS-485 или CAN.

Вопрос: Чем отличается UART от USART?

Ответ: USART (Universal Synchronous/Asynchronous Receiver-Transmitter) является расширением UART и поддерживает как синхронный, так и асинхронный режимы работы. UART работает только в асинхронном режиме.

Заключение

UART является простым и эффективным интерфейсом для обмена данными между микроконтроллерами и другими устройствами. Правильная настройка и использование UART позволяет реализовать надежный канал связи в различных проектах на базе микроконтроллеров AVR.


Прошивка Arduino через USB (UART) / AVR ISP разъём (USBasp программатор) – urpylka՚s blog!

Эта заметка нацелена на изложение основных действий для перепрошивки Arduino как при помощи встроенного бутлодера, так и с помощью программатора. В первых двух разделах я коротко изложу техническую базу и особенности использования двух методов, а в третьем разделе среду разработки и утилиты необходимые для прошивки.

Прошивка с помощью встроенного bootloader (через последовательный порт)

Все платы Arduino (основная линейка) построены на базе чипа Atmega с архитектурой AVR. AVR – это семейство микроконтроллеров, их прошивка, а именно запись постоянной памяти и выставление Fuse битов реализовано через ICSP порт очень похожий на SPI. Однако наиболее распространенным способом прошивки является прошивка через USB. Точнее через UART, тк на самом деле на плате разведён USB-RS232 преобразователь.

RS232 это надстройка над UART. UART содержит только пины RX, TX

. Тогда как RS232 содержит ещё и другие линии (подробнее на UART, COM-порт, RS-232, что это и как они связаны?):

Для перепрошивки через UART требуется выполнение двух условий:

  1. Наличие загрузчика в МК (его вполне может и не быть там, тогда остается только вариант с прошивкой через программатор)
  2. Для начала загрузки прошивки необходимо перезагрузить МК в очень узкое временное окно и затем начать передавать прошивку через UART. На некоторых платах отсуствует встроенный USB-RS232 преобразователь, например Arduino Pro Mini. В этом случае вы можете попробовать перезагрузить МК с кнопки на плате Arduino (у меня это получилось раза 20го). Как альтернатива, если вы используете внешний USB-RS232 преобразователь с линией DTR. Вы можете подключить этот вывод на пин RESET Arduino. Аналогичным способом подключен встроенный преобразователь на Arduino.

Для начала разберемся с тем, что нужно постоянно искать – пинами на программаторе.

Прошивка с помощью программатора

Есть множество различных программаторов, я использую USBasp (USBASP: USB AVR программатор для микроконтроллеров ATmega, ATtiny).

Также в качестве программатора можно использовать ещё одну плату Arduino со специальной прошивкой.

Все сложность в прошивки этим способом обеспечить корректное подключение программатора к Arduino. Также обратите внимание, что лучше запитать Arduino непосредственно от программатора.

Основная проблема в том, что на большинстве программаторов ICSP-разъём содержит 10 пинов, тогда как на всех платах Arduino, и не только, он 6ти пиновый.

Для прототипирования небольших проектов, я люблю использовать Arduino Nano, ниже описание выводов:

На некоторых программаторах, в том числе на USBasp выведены также I2C, UART-линии:

Для облегчения процесса перепрошивки, может быть сделан переходник. Подробнее в статье AVR ISP Разъемы (webarchive).

Иногда при прошивке с помощью программатора возникает ошибка avrdude: warning: cannot set sck period, please check for usbasp firmware update, при этом она может вызвана двумя причинами:

  1. Плохой контакт тактирующего сигнала SCK.
  2. Устаревшая прошивка на программаторе, подробнее как её обновить тут Прошивка USBasp.

Среда разработки и прошивка

Стандартная среда разработки Arduino IDE включает в себя:

  1. Магазин библиотек
  2. Текстовый редактор
  3. Набор драйвером для сериал портов (последовательных портов)
  4. Монитор последовательного порта
  5. Обертку над avrdude
  6. Компилятор

По сути весь процесс прошивки заключается в запуске avrdude с разными аргументами. Мне не нравится среда Arduino IDE ввиду крайне неудобного редактора при открытии нескольких файлов.

Я использую в качество основного редактора кода VSCode, для него есть замечательный плагин Platformio, который позволяет производить сборку, а также прошивку устройств через встроенный загрузчик. Однако для перепрошивки, а также для работы с последовательным интерфейсом я предпочитаю использовать напрямую утилиты avrdude и screen. Для этого я добавляю в репозиторий примерно следующий Makefile:

all: upload
upload:
	platformio run --target upload
clean:
	platformio run --target clean
build:
	platformio run
list:
	ls -l /dev/tty.*
monitor:
	screen /dev/tty.usbserial-AH05WAKX 115200
usbasp:
	avrdude -c usbasp -p m328p -P usb -U flash:w:.pio/build/ATmega328P/firmware.hex:i -FD
direct:
	avrdude -c arduino -p m328p -U flash:w:.pio/build/ATmega328P/firmware.hex:i -P /dev/tty.usbserial-AH05WAKX
info:
	avrdude -c usbasp -p m328p -P usb -v
setup:
	brew install avrdude screen

Адрес последовательного интерфейса может отличаться, также цель setup использует пакетный менеджер brew для установки зависимостей на macOS.

Библиотеки я предпочитаю лично контролировать включением их в репозиторий, для этого в проекте Platformio необходимо создать папку lib.

Небольшое обновление: я сделал репозиторий-шаблон на Github, который можно взять за основу при написании кода под МК Atmega.


Пожалуй, это основные лайфхаки которые я использую для прошивки Arduino. Я умышленно упростил и недосказал некоторые моменты, возможно я допишу это когда-нибудь.

Передача данных через UART в AVR. Урок AVR 9

GreenChip.com.ua

Опубликовано 2010-05-07 11:30:31 автором Ruslan


Для связи микроконтроллера со своим старшим братом - ПК - можно использовать интерфейсы передачи данных, но так как я учебный курс по AVR стараюсь построить на микроконтроллере mega8, то предпочтительней всего для связи с ПК использовать интерфейс USART. Нет, можно, конечно, заюзать и USB, но USART в mega8 реализован аппаратно, а это значит, что нам не придется вручную реализовывать логику передачи данных, мы просто запишем данные в регистр, а самим процессом отправки уже будет рулить МК аппаратно.
Протокол UART (Universal asynchronous receiver/transmitter) является одним из самых распространённых протоколов передачи данных между устройствами. У Atmega8 один USART, выведен он на ножки PD0 — Rx, receiver (приемник) и PD1 — Tx, transmitter (передатчик). Давайте попробуем передать данные с пк. Когда с пк будет приходить 1, то светодиод будет светиться, когда 0, то гаснуть. Схема выглядит следующим образом:

Далее нам нужно написать программу:
В CodeVision AVR создаем новый проект, частоту мк устанавливаем на 8 мегагерц, далее переходим во вкладку USART, там включаем приемник и передатчик

Уберем все лишнее и допишем свой код

 #include <mega8.h> 
 void main(void) 
 { 
 char date=0; 
  PORTC=0x00; 
 DDRC=0x01;  
 // USART initialization 
 // Communication Parameters: 8 Data, 1 Stop, No Parity 
 // USART Receiver: On 
 // USART Transmitter: On 
 // USART Mode: Asynchronous 
 // USART Baud Rate: 9600 
 UCSRA=0x00; 
 UCSRB=0x18; 
 UCSRC=0x86; 
 UBRRH=0x00; 
 UBRRL=0x33; 
  while (1) 
 { 
 date=UDR; 
  
 if (date=='1')   PORTC. 0=1; 
 if (date=='0')   PORTC.0=0;  
 };    
 } 

У AVR есть регистр UDR. На самом деле, это два разных регистра, которые имеют один адрес. Когда записываем данные, то они попадают в регистр передатчика, а когда читаем - берутся из регистра приемника. Для отправки мы просто записываем данные в этот регистр и они улетят к приемнику, а если нам что-то пришло - считываем их из регистра.
Следить за UART вручную не нужно, все обслуживание можно повесить на прерывания. Когда нам приходят данные, генерируется прерывание по завершению приема, а когда данные отправятся - вызовется прерывание по опустошению
Компилим программу, закидываем в мк в протеусе. Для отсылки данных из терминала нужно поставить галочку возле:

Вводим единичку - светодиод светится

Вводим 0 - светодиод гаснет

Работа на прерываниях
Как вы заметили, наша программа бесконечно ожидает прихода байта. Так делать нецелесообразно, потому что главный цикл загружен приемом и передачей данных через uart и больше ничего делать не может. Конечно, можно не зацикливаться, а например периодически раз в 10 милисекунд проверять, не пришли ли нам данные, в остальное время делать что-то своё. Но тогда, если передача идет на большой скорости, можно пропустить байты. Лучше всего эту малину замутить на прерываниях: пришли данные - вызвался обработчик прерывания и все. Для этого в CodeWizard AVR во вкладке USART нужно поставить галочку возле Rx Interrapt


Генерим код, и получаем

 #include  <mega8.h>  
 #ifndef RXB8 
 #define RXB8 1 
 #endif  
 #ifndef TXB8 
 #define TXB8 0 
 #endif  
 #ifndef UPE 
 #define UPE 2 
 #endif  
 #ifndef DOR 
 #define DOR 3 
 #endif  
 #ifndef FE 
 #define FE 4 
 #endif  
 #ifndef UDRE 
 #define UDRE 5 
 #endif  
 #ifndef RXC 
 #define RXC 7 
 #endif  
 #define FRAMING_ERROR (1<<FE) 
 #define PARITY_ERROR (1<<UPE) 
 #define DATA_OVERRUN (1<<DOR) 
 #define DATA_REGISTER_EMPTY (1<<UDRE) 
 #define RX_COMPLETE (1<<RXC)  
  // USART Receiver buffer 
 #define RX_BUFFER_SIZE 8 char rx_buffer[RX_BUFFER_SIZE];  
 #if RX_BUFFER_SIZE<256 unsigned char rx_wr_index,rx_rd_index,rx_counter; 
 #else unsigned int rx_wr_index,rx_rd_index,rx_counter; 
 #endif
   // This flag is set on USART Receiver buffer overflow bit rx_buffer_overflow;  
 // USART Receiver interrupt service routine interrupt [USART_RXC] void usart_rx_isr(void) 
 { char status,data; status=UCSRA; 
 data=UDR; 
 if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) 
 {    
 rx_buffer[rx_wr_index]=data; 
 if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0; 
 if (++rx_counter == RX_BUFFER_SIZE) 
 { 
 rx_counter=0;  
 rx_buffer_overflow=1; 
 }; 
 };  
 if (data=='1')   PORTC. 0=1;  
 if (data=='0')   PORTC.0=0; 
 } 
  
 #include  <stdio.h >  
 void main(void) 
 { 
 // Port C initialization 
 PORTC=0x00; 
 DDRC=0x01;  
 // USART initialization 
 // Communication Parameters: 8 Data, 1 Stop, No Parity 
 // USART Receiver: On 
 // USART Transmitter: Off 
 // USART Mode: Asynchronous 
 // USART Baud Rate: 9600 
 UCSRA=0x00; 
 UCSRB=0x90; 
 UCSRC=0x86; 
 UBRRH=0x00; 
 UBRRL=0x33; 
  // Global enable interrupts 
 #asm("sei") 
  while (1) 
 { 
 }; 
 } 

Здесь codewizard сгенерировал разные проверки четности и буфер для записи данных, которые пришли. Нам для того, чтобы засветить светодиод все это не нужно, поэтому удаляем лишнее, и получаем
 #include <mega8.h> 
 #include <stdio.h> 
 // USART Receiver interrupt service routine interrupt [USART_RXC] void usart_rx_isr(void) 
 { 
 char data; 
 data=UDR;  
          
 if (data=='1')   PORTC.0=1;  
 if (data=='0')   PORTC.0=0; 
 } 
  
 void main(void) 
 { 
 // Port C initialization 
 PORTC=0x00; 
 DDRC=0x01; 
  // USART initialization 
 // Communication Parameters: 8 Data, 1 Stop, No Parity 
 // USART Receiver: On 
 // USART Transmitter: Off 
 // USART Mode: Asynchronous 
 // USART Baud Rate: 9600 
 UCSRA=0x00; 
 UCSRB=0x90; 
 UCSRC=0x86; 
 UBRRH=0x00; 
 UBRRL=0x33; 
  // Global enable interrupts 
 #asm("sei") 
  
 while (1)
        {  
 }; 
 } 

Как видите, главный цикл свободный. Теперь нам не нужно регулярно проверять, а не пришли ли данные по uart. Когда прийдет байт по uart, то вызовется обработчик прерывания, и мы уже в нем сделаем необходимы нам действия.

Переходим к железу
Если у вашего пк есть COM порт, то вам для сопряжения с микроконтроллером понадобится преобразователь уровней ТТЛ – RS232. Его легко собрать на микросхеме MAX232. Он нужен, потому что напряжение на выходе данных из COM-порта ПК:

  • логическая "1" от -5 до -15 вольт
  • логический "0" от +5 до +15 вольт
а в мк
  • логическая "1" от 1,8 до напряжения питания вольт
  • логический \"0\" от 0 до 1,3 вольт
Схема подключения RS232 примерно такая Если у вашего ПК нет СОМ-портов, то нужно юзать адаптер на микросхеме FT232 - он подключается к USB вашего ПК и в системе появляется виртуальный СОМ порт, а на выводах FT232 соответствующие сигналы UART.

Комментарии - (2)

  • алексей говорит:

    здравствуйте,скажите а как принять данные с контроллера на пк?

    Войдите, чтобы ответить

    • Admin говорит:

      Здравствуйте, все тем же способ, использовать преобразователь уровней

      Войдите, чтобы ответить

Добавить комментарий
Для отправки комментария вы должны авторизоваться.

Введение в AVR® USART — Помощь разработчикам

Введение в AVR® USART

Устройства

AVR® включают как минимум один, а иногда и несколько блоков универсального синхронного и асинхронного последовательного приемника и передатчика (USART). На блок-схеме USART показаны доступные регистры ввода-вывода центрального процессора (ЦП) и контакты ввода-вывода.

Блок-схема USART

Пунктирные прямоугольники на блок-схеме разделяют три основные части USART:

  • Тактовый генератор
  • Передатчик
  • Приемник

Логика Генерация тактового сигнала состоит из логики синхронизации для внешнего тактового входа, используемого синхронным ведомым устройством, и генератора скорости передачи. Контакт XCKn (тактовый генератор передачи) используется только в режиме синхронной передачи.

Передатчик состоит из одного буфера записи, последовательного регистра сдвига, генератора четности и управляющей логики для обработки различных форматов последовательных кадров. Буфер записи позволяет осуществлять непрерывную передачу данных без задержки между кадрами.

Приемник является наиболее сложной частью модуля USART из-за его часов и блоков восстановления данных. Блоки восстановления используются для асинхронного приема данных. В дополнение к блокам восстановления приемник включает в себя средство проверки четности, управляющую логику, сдвиговый регистр и двухуровневый приемный буфер (UDRn). Приемник поддерживает те же форматы фреймов, что и передатчик, и может обнаруживать ошибки фреймов, превышения данных и ошибки четности.

USART Особенности:

  • Полный дуплекс (независимые последовательные регистры приема и передачи)
  • Асинхронная или синхронная операция
  • Ведущий или ведомый Синхронный режим
  • Генератор скорости передачи данных высокого разрешения
  • Поддерживает последовательные кадры с 5, 6, 7, 8 или 9 битами данных и 1 или 2 стоповыми битами
  • Генерация четности или нечетности и проверка четности, поддерживаемые аппаратно
  • Обнаружение переполнения данных
  • Обнаружение ошибки кадрирования
  • Фильтрация шума включает обнаружение ложного начального бита и цифровой фильтр нижних частот
  • Три отдельных прерывания по завершению передачи, пустому регистру данных передачи и завершению приема
  • Многопроцессорный режим связи
  • Двухскоростной асинхронный режим связи
  • Начать обнаружение кадра

Последовательная связь — это способ передачи данных между двумя электронными устройствами с использованием всего двух проводов. USART передает и получает данные, используя стандартный формат без возврата к нулю (NRZ). NRZ реализуется с двумя уровнями: высокое выходное напряжение (VOH) или состояние метки, которое представляет бит данных «1», и низкое выходное напряжение (VOL) или состояние пробела, которое представляет бит данных «0». NRZ относится к тому факту, что последовательно передаваемые биты данных с одним и тем же состоянием остаются на одном и том же уровне выходного сигнала, не возвращаясь к нулевому или нейтральному уровню между каждой передачей бита. Состояние Idle помещает выходной контакт на отметку (т.е. высокое состояние). Передача может происходить синхронно или асинхронно.

Работа синхронных часов

Синхронная последовательная связь обычно используется в системах с одним ведущим и одним или несколькими ведомыми. Ведущее устройство содержит необходимую схему для генерации скорости передачи данных и обеспечивает синхронизацию для всех устройств в системе. Ведомые устройства могут использовать преимущества ведущих часов, устраняя внутреннюю схему генерации часов. В синхронном режиме есть две сигнальные линии:

  • Двунаправленная линия данных
  • Линия часов

Ведомые устройства используют внешние часы, предоставленные ведущим устройством, для сдвига последовательных данных в соответствующие регистры приема и передачи и из них. Поскольку линия данных является двунаправленной, синхронная работа осуществляется только в полудуплексном режиме. Полудуплекс относится к тому факту, что ведущее и ведомое устройства могут получать и передавать данные, но не одновременно. USART может работать как ведущее или ведомое устройство. Обычно стартовые и стоповые биты не требуются для синхронной передачи

При использовании синхронного режима (UMSEL = 1) контакт XCKn будет использоваться либо как тактовый вход (Slave), либо как тактовый выход (Master). Зависимость между фронтами тактовых импульсов и выборкой данных или изменением данных такая же. Основной принцип заключается в том, что входные данные ( RxDn, контакт ) отбираются на противоположном XCKn тактовом фронте фронта, выход данных ( TxDn, контакт ) изменяется.

Асинхронный прием данных

В асинхронной связи используются два контакта. Один из них — передача ( TxDn ), а один — получение ( RxDn ). TxDn одного устройства подключается к RxDn второго устройства. Каждая передача символа состоит из одного стартового бита, за которым следуют от пяти до девяти битов данных, и всегда заканчивается одним или несколькими стоповыми битами. Стартовый бит всегда является пробелом, а стоповые биты всегда метками. Каждый переданный бит сохраняется в течение периода 1/(Скорость передачи). Встроенный генератор скорости передачи используется для получения стандартных частот скорости передачи от системного генератора.

Генерация тактовой частоты

Логика генерации тактовой частоты генерирует базовую тактовую частоту для передатчика и приемника. USART поддерживает четыре режима работы часов:

  • Нормальный асинхронный
  • Двухскоростной асинхронный
  • Главный синхронный
  • Ведомый синхронный

Блок-схема часов

Описание сигнала:

  • txclk Часы передатчика (внутренний сигнал).
  • rxclk Базовая синхронизация приемника (внутренний сигнал).
  • xcki Вход с контакта XCK (внутренний сигнал). Используется для синхронной работы ведомого устройства.
  • xcko Тактовый выход на вывод XCK (внутренний сигнал). Используется для синхронной ведущей операции.
  • OSC Системная тактовая частота.

Генератор скорости передачи в бодах

Генерация внутреннего тактового сигнала используется для асинхронного и синхронного ведущего режимов работы. Регистр скорости передачи данных USART ( UBRRn ) и подключенный к нему обратный счетчик функционируют как программируемый прескалер или генератор скорости передачи. Счетчик обратного отсчета, работающий на системных часах (fosc), загружается UBRRn значение каждый раз, когда счетчик досчитал до нуля или когда записывается регистр UBRRnL . Часы генерируются каждый раз, когда счетчик достигает нуля. Эти часы являются выходным сигналом генератора скорости передачи данных (= fosc/(UBRRn+1)).

В таблице ниже приведены уравнения для расчета скорости передачи данных (в битах в секунду) и для расчета значения UBRRn для каждого режима работы с использованием внутреннего источника синхронизации.

Пример проекта с использованием ATmega324PB
Замечания по применению AVR306: Использование AVR USART на устройствах tinyAVR и megaAVR

Вернуться к началу

Использование UART

UART

Универсальный асинхронный приемник и передатчик (UART) может использоваться для отправки и получения данных между двумя устройствами. Более конкретно, эти устройства могут быть ПК-ПК, ПК-микроконтроллер и микроконтроллер-микроконтроллер. UART обменивается данными, используя напряжения TTL + 5 В и 0 В или LVTTL в зависимости от напряжения VCC вашего микроконтроллера.

 

Если вы хотите подключиться к ПК, вам необходимо использовать спецификации протокола RS232. Это означает, что аппаратная связь осуществляется с определенными уровнями напряжения. (+15В и -15В) Это может быть достигнуто с помощью преобразователя уровня MAX232.

 

Аппаратное обеспечение показано на этой схеме:

 

 

Разъем DB-9 имеет 9 контактов, но вам нужно использовать только 3 из них. Обратите внимание, что на рисунке выше показан ВИД СПЕРЕДИ, поэтому помните, что вы паяете с другой стороны. На большинстве разъемов контакты также можно найти на самом разъеме.

 

Если в вашем контроллере нет UART, вы можете использовать программный UART, см. ниже. Если ваш контроллер имеет один UART, вы подключаете контакты контроллера TxD и RxD к TxD и RxD на схеме выше. Если ваш контроллер имеет более одного UART, вы подключаете контакты контроллера TxD0 и RxD0 к TxD и RxD на схеме выше.

Теперь вам нужно инициализировать программу в вашем микроконтроллере, открыть новый файл .bas и добавить следующий код в начало вашей программы.

 

$regfile = "ваш микро здесь def.dat"

$crystal = 8000000

$baud = 19200

 

Убедитесь, что ваш микроконтроллер определен после $regfile, например, если вы используете файл ATMega32 $regfile

3 = "m32def.

dat"

 

Некоторые новые микросхемы могут использовать внутренний генератор, также некоторые микросхемы настроены на использование внутреннего генератора по умолчанию. Использование внутреннего генератора означает, что вам не нужен внешний кварц.

 

Выполняйте этот шаг только при наличии внутреннего генератора.

Откройте программатор BASCOM-AVR следующим образом:

 

Выберите вкладку «Lock and Fuse Bits» и разверните окно программатора.

Проверьте, есть ли в разделе «Fusebit» следующее:

  «1: Разделение часов на 3 0 9 9 3 отключено»

002         "Int. RC Osc. 8 МГц; Время запуска: X CK + X мс; [CKSEL=XXXX SUT=XX]"

 

 

у меня нет возможности не изменять биты предохранителей.

 

Если эти параметры доступны, но в неправильных настройках. Измените настройку в раскрывающемся списке и щелкните другой раздел Fuse. Наконец, нажмите кнопку "Программировать FS". Нажмите «Обновить», чтобы увидеть фактические настройки.

 

Теперь соедините прямым кабелем разъем DB-9, сторону микроконтроллера и сторону ПК.

Программа тестовой программы в вашем микроконтроллере, она должна выглядеть так:

$ regfile = "m32def.dat" 'Определите свой собственный

$ Crystal = 8000000

$ Baud = 19200

DO

 Напечатать "Hello World"

Waitms 25

Петля

 

Конец

 

Теперь откройте терминал BASCOM-AVR и установите параметры подключения, нажав «Терминал» -> «Настройки». , стоповые биты 1, рукопожатие отсутствует, эмуляция отсутствует.

 

 

Если вы видите сообщение Hello World в окне эмулятора терминала BASCOM-AVR, ваша конфигурация в порядке. Поздравляем.

 

Пример

Вы также можете попробовать этот пример с эмулятором терминала BASCOM, он показывает, как отправлять и получать различные команды.

$ regfile = "m88def.dat"

$ Crystal = 8000000

$ Baud = 19200

DIM PREANC нажмите любую буквенно-цифровую клавишу..."

Akey = Waitkey() 'Waitkey ждет, пока не будет получен символ от UART

Печать Akey

 

Подождите 1

Печать

Печать "Спасибо! Как вы могли видеть, контроллер печатает число"

Печать "но не нажатая клавиша".

Подождите 1

Печать

Печать "Теперь попробуйте ключ Enter ..."

Akey = WaitKey ()

Akey = WaitKey ()

число, которое вы видите, – это значение ASCII нажатой клавиши".

Print "Нам нужно преобразовать число обратно в ключ..."

Print     'Обратите внимание, что делает эта строка

Print "Пожалуйста, попробуйте еще раз ввести буквенно-цифровой ключ. .." Print Chr(akey) 'Обратите внимание, что это делает

Print "Все в порядке!"

 

Подождите 1

Печать

Печать "Для многих функций одной клавиши недостаточно..."

Печать "Теперь введите свое имя и нажмите Enter для подтверждения"

Dim Inpultring As String*12 'Dercaine String Variable здесь

DO

AKEY = WATKEY ()

, если AKEY = 13, то GOTO Спасибо' Введите ключ goTo. Chr(akey) 'Назначить строку

Цикл

 

Спасибо:

Print "Спасибо" ; Строка ввода ; " !" 'Обратите внимание, что ; делает

 

Подождите 1

Напечатать

Напечатать "Взгляните на код программы и попытаться понять"

Напечатать "как работает эта программа. Также нажмите F1 в операторах"

Напечатать

Напечатать "Если вы понимаете все, продолжайте "

 

End

 

ASCII

Как вы могли видеть в предыдущем примере, мы используем оператор PRINT для отправки чего-либо в UART. На самом деле мы не отправляем просто текст. Мы отправляем символы ASCII. ASCII означает американский стандартный код для обмена информацией. В основном ASCII представляет собой список из 127 символов.

Таблица ASCII (неполное)

Десятичное шестигранное двоичное значение

------- --- ------ -----

000 000 0000000000 NUL (NULL Char. )

008 008 00001000 BS (Backspace)

009 009 00001001 HT (горизонтальная вкладка)

010 0000101010 LF (линейная подача)

012 00C 00001100 FF (Form Feed)

013 012 00c 00001100 FF (Form Feed)

9000 013 012 00c 00001100 FF (Form Feed)

013 013 012 00c 00001100 FF (Form)

048 030 00110000 0

049 031 00110001 1

052 034 00110100 4

065 041 01000001 A

066 042 010010 B

067 043 0600111. CALED ASLIAL ASLI ASLI ASLI ASLIAN

00003

0,0003 00003 00003 00003 00003 00003

0,0003

0,0003

0,0003

1111.

ВОЗВРАТ КАРЕТКИ (CR) И ПЕРЕВОД СТРОКИ (LF)

В предыдущем примере вы также можете видеть, что второй оператор печати всегда печатает печатный текст на следующей строке. Это вызвано тем, что оператор печати всегда добавляет символы CR и LF.

 

Обычно, если указать:

Напечатать «ABC»

Мы отправляем 65 66 67 13 10 на UART. (В двоичном формате)

 

Символ возврата каретки (13) возвращает курсор обратно в позицию столбца 0 текущей строки. Перевод строки (10) перемещает курсор на следующую строку.

 

Печать «ABC»;

Когда мы вводим точку с запятой ( ; ) в конце строки...

Bascom не отправляет возврат каретки/перевод строки, поэтому вы можете печатать другой текст после ABC на той же строке.

 

Печать «ABC»; Хр(13) ;

Будет отправлено только ABC CR. Следующий отпечаток перезапишет ABC.

 

ОБЗОР

Вот некоторые другие команды, которые вы можете использовать для обмена данными по UART:

 

Waitkey()

Waitkey будет работать до тех пор, пока символ не будет получен в последовательном буфере.

 

Ischarwaiting()

Возвращает 1, когда символ ожидает в аппаратном буфере UART.

 

Inkey()

Inkey возвращает значение ASCII первого символа в буфере последовательного ввода.

 

Печать

Отправляет переменную или непеременную строку в UART

 

 

 

ДРУГОЙ ПРИМЕР ischar, как использовать клавишу ischar для использования

. И если есть, читать в переменную.

 

'Печать «Нажмите клавишу B, чтобы начать»

Dim Serialcharwaiting As Byte, Serialchar As Byte

SerialChaiting = ischarwaiting () 'Проверьте, нажимает ли B или B, затем Goto

, если SerialCharwaiting = 1, то

SerialChar = inkey ()

, если сериал -карч = 66 или сериал = 98, затем

Goto MyRoutine

End

. Если

END IF

GOTO MAIN

Myroutine:

'Заявления

Main:

' Заявления

END

 

 

БУФЕРИЗАЦИЯ ПОСЛЕДОВАТЕЛЬНЫХ ДАННЫХ

Если вы хотите отправлять и получать данные на высокой скорости, вам необходимо использовать буферы последовательного ввода и вывода. Эта буферизация реализована в BASCOM-AVR и может использоваться только для аппаратных UART.

 

Чтобы настроить UART для использования буферов, необходимо использовать оператор Config.

 

Config Serialout = Buffered , Size = 20

и/или

Config Serialin = Buffered , Size = 20

 

Дополнительную информацию можно найти в BASCOM-Help. Тема поиска = "config serialin". В папке с примерами также есть пример программы «RS232BUFFER.BAS», если вы хотите продемонстрировать буферизацию.

 

 

ПРОГРАММНЫЙ UART

В предыдущих примерах использовался аппаратный UART. Это означает, что компилятор использует внутренние регистры UART и внутреннее оборудование (RxD(0) и TxD(0)) AVR. Если у вас нет аппаратного UART, вы также можете использовать программный UART.

 

Компилятор Bascom упрощает «создание» дополнительных UART. Bascom создает программные UART практически для каждого контакта порта.

 

Помните, что программный UART не так надежен, как аппаратный UART, поэтому у вас могут возникнуть проблемы с синхронизацией, если в вашей программе много прерываний.

 

В этом примере мы используем выводы микроконтроллера portc.1 и portc.2.

Подключите порт c.1 к TxD и порт c.2 к RxD, см. схему выше.

Изменить $ regfile и программа.

 

'Открыть канал ПЕРЕДАЧИ для вывода

Открыть "comc.1:19200,8,n,1" для вывода как #1 канал для ввода

Открыть "comc.2:19200,8,n,1" For Input As #2

'Поскольку нет никакой связи между входным и выходным контактом

'НЕТ ЭХО при нажатии клавиш

 

Print Press #1, any" Числовой ключ "

'с inkey () мы можем проверить, есть ли данные доступны

' для использования с программным обеспечением UART, вы должны предоставить канал

DO

'Магазин в байте

b = inkey ( #2)

   'Когда значение > 0, мы получили что-то

Если b> 0, то

Печать#1, chr (b) 'Печать символа

End If

Loop

Закрыть#2' Закрыть каналы

Закрыть#1

Конец

После того, как вы запрограммировали контроллер и подключили последовательный кабель, откройте эмулятор терминала, нажав в Bascom.

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

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