Архитектура AVR в примерах/Асинхронный порт

В этой работе мы рассмотрим использование встроенного в МК ATmega8 универсального асинхронного приемопередатчика (УАПП; англ. UART) на примере «классической» программы «Hello, world!» и программы, реализующей возврат данных отправителю («эхо»).

Перед началом

править

Для данной работы нам потребуется наличие связи между простейшим устройством и адаптером «USB—асинхронный порт» — которая, впрочем, уже существует, поскольку необходима для взаимодействия с загрузчиком Optiboot.[1]

Рассматриваемый код полагается на библиотеку УАПП за авторством Peter Fleury (uartlibrary.zip), которая является свободным программным обеспечением и доступна на условиях GNU General Public License.[2]

Со стороны системы разработчика, для связи с устройством можно применить такие программы, как cu (англ. call up или call Unix) или PuTTY.

Все прочие требования к среде разработки и устройству также сохраняются.

Привет, мир!

править
/*** uarthelo.c — “Hello, world!”, UART-based  -*- C -*- */
#include <avr/interrupt.h>      /* for sei () */
#include <avr/pgmspace.h>       /* FIXME: should be in uart.h */
#include <avr/sleep.h>          /* for sleep_cpu (), etc. */
#include <util/setbaud.h>       /* for UBRR_VALUE, USE_2X */

#include "uart.h"               /* for uart_puts_P (), etc. */

int
main ()
{
  /* initialize the UART library */
  uart_init ((UBRR_VALUE
              | (USE_2X ? 0x8000 : 0)));

  /* enable interrupts */
  sei ();

  /* show the message */
  uart_puts_P ("Hello, world!\r\n");

  /* halt */
  set_sleep_mode (SLEEP_MODE_PWR_DOWN);
  sleep_enable ();
  sleep_cpu ();

  /* not reached */
  /* . */
  return 0;
}
/*** uarthelo.c ends here */

Сборка кода

править
  1. Внесем в созданный ранее Makefile следующие изменения.

    • Добавим новую переменную BAUD, определив ее так:

      BAUD    = 115200
      
    • Дополним определение переменной CPPFLAGS параметром -DBAUD=$(BAUD).

    • Добавим следующие цели:

      default: uarthelo.hex uarthelo
      
      uarthelo: uarthelo.c uart.c
      
  2. Создадим файл uarthelo.c приведенного выше содержания.

  3. Скопируем файлы uart.c и uart.h используемой библиотеки УАПП (uartlibrary.zip) в директорию с исходным кодом.[2]

  4. Соберем рассматриваемый пример выполнив команду make:

    $ make uarthelo.hex 
    avr-gcc -O2 -Wall -std=gnu11 -mmcu=atmega8 -DF_CPU=7372800 -DBAUD=115200   uarthelo.c   -o uarthelo
    avr-objcopy -O ihex uarthelo uarthelo.hex
    $ 
    
    NB

    При использовании микроконтроллера, отличного от ATmega8, кварцевого резонатора на частоту, отличную от 7.3728 MHz, или же желаемой скорости передачи данных, отличной от 115200 bit⁄s, следует явно указать параметры сборки MCU, F_CPU, или BAUD, соответственно

    Так, для платы Arduino Uno R3, поставляемой с МК ATmega328P и кварцевым резонатором на 20 MHz, команда сборки может быть следующей:

    $ make MCU=atmega328p F_CPU=20000000 uarthelo.hex 
    
  5. Удостоверимся в отсутствии ошибок сборки и в появлении файла uarthelo.hex, содержащего результирующий машинный код в формате Intel hex.

Загрузка и проверка работоспособности

править
  1. Загрузку кода в МК выполним аналогично ранее рассмотренному примеру.

  2. Проверим работоспособность кода и устройства установив соединение и сбросив МК:

    $ cu -l /dev/ttyUSB1 -s 115200 
    Connected.
    Здесь МК следует сбросить, если это не было выполнено при установлении соединения.
    Hello, world!
    ~.
    Disconnected.
    $ 
    

    После появления сообщения «Hello, world!», МК можно сбросить повторно, чтобы проверить, что сообщение появляется вновь.

    NB

    Программа cu настаивает на использовании сигналов RTS и CTS порта RS-232. Поскольку сигнал CTS не формируется МК, передача данных устройству не будет выполняться. Отключить ожидание можно выполнив после запуска cu (но перед вводом каких-либо данных!) команду, подобную:

    $ stty -crtscts -F /dev/ttyUSB1 
    $ 
    

Примечания

править
  1. optiboot — An optimised bootloader for Arduino platforms. Проверено 15 марта 2014.
  2. 2,0 2,1 Peter Fleury AVR-GCC libraries. Проверено 15 марта 2014.