Архитектура 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 */
Сборка кода
[править]Внесем в созданный ранее
Makefile
следующие изменения.Добавим новую переменную
BAUD
, определив ее так:BAUD = 115200
Дополним определение переменной
CPPFLAGS
параметром-DBAUD=$(BAUD)
.Добавим следующие цели:
default: uarthelo.hex uarthelo uarthelo: uarthelo.c uart.c
Создадим файл
uarthelo.c
приведенного выше содержания.Скопируем файлы
uart.c
иuart.h
используемой библиотеки УАПП (uartlibrary.zip
) в директорию с исходным кодом.[2]Соберем рассматриваемый пример выполнив команду
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
Удостоверимся в отсутствии ошибок сборки и в появлении файла
uarthelo.hex
, содержащего результирующий машинный код в формате Intel hex.
Загрузка и проверка работоспособности
[править]Загрузку кода в МК выполним аналогично ранее рассмотренному примеру.
Проверим работоспособность кода и устройства установив соединение и сбросив МК:
$ 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 $
Примечания
[править]- ↑ optiboot — An optimised bootloader for Arduino platforms. Проверено 15 марта 2014.
- ↑ 2,0 2,1 Peter Fleury AVR-GCC libraries. Проверено 15 марта 2014.