ЯЗЫК ПРОГРАММИРОВАНИЯ МИКРОПРОЦЕССОРОВ


Программирование микропроцессора AVR на разновидности языка C тесно связано с его архитектурой. Микропроцессор имеет порты ввода/вывода, обозначаемые заглавными латинскими буквами A,B,C и т.п., количество которых зависимосит от модели контроллера. Порт имеет восемь разрядов, которым соответствуют ножки микроконтроллера.

Порт A обычно используется для оцифровки аналоговых сигналов, порт B связан с программатором (но при его отключении он свободен), порты С, D употребляются чаще дискретно, причем первые ножки D задействованы для цифровой связи микропроцессоров. Каждая из ножек может работать на ввод или на вывод. В зависимости от того, как используются ножки, программно их обозначают PORTx (регистры вывода) или PINx (регистр ввода).

Назначением функций ножек заведует регистр DDRx, x это порт A, B, C и т.д.

Для того, чтобы настроить ножку на вывод, надо установить в единицу соответствующий бит регистра DDRx. В таком случае единица, установленная в бите регистра PORTx, формирует на ножке сигнал высокого уровня, ноль – низкого.

Установка в ноль бита регистра DDRx настраивает ножку на ввод. Существует та тонкость, что в этом случае установка в едниницу бита регистра PORTx подключает к ножке pull-up регистор, обеспечивающий высокий уровень на выводе при отсутствии внешнего сигнала. Для чтения данных служат регистры PINx. Если на ножке высокий уровень, то соответстующей бит установлен в единицу.

Существо задачи и структура регистров повышает интерес к операциям с битами (а не байтами). Первым следствием такого подхода является то, что биты получают формальные обозначения, причем избыточные. Константы PA0 и PB0 и т.д. обозначают 0 бит. В системе программирования они рассматриваются как различные между собой имена (хотя их можно заменить одинаковыми номерами), причем биты входных и выходных регистров по разному называются.

Практика именования битов распространена очень широко, но в ряде случаев имя бита связано не с номером, это не столь важно, сколько с его функциональностью. Именные биты имею регистры, управляющие важными функциями микропроцессора. Фактически это флаги разрешения тех или иных операций. Например биты RXEN и TXEN регистра UCSRB управляют каналом связи микропроцессоров по UART-интерфейсу.

Имя PA0 (константа, численно равная 0) отвечает начальному биту регистра A, PA1 (константа, численно равная 1) – следующему биту и т.п. Фактически за именем скрывается порядковый номер бита. Разница PA0 и PB0 чисто семантическая. Число, в котором старший бит (например) установлен в 1, записывается так



Той же цели служит функция _BV(PA7). Если присвоить регистру значение этого числа, остальные биты его сбросятся в 0, что неудобно, если биты информативны. Помимо системы наименований битов и функций перевода наименований в числа с единичками напротив соответствующего бита, есть еще система изменения содержимого только этого бита в 0 или в 1. Указанной цели служат логические операции, употребляемые с функцией _BV() формально. Можно знакомиться с тем, что они делают, побитно, но проще воспринимать их как цельные семантические конструкции.

Операция перевода заданного бита в единицу имеет вид



Операция перевода заданного бита в ноль имеет вид



Операция инверсии бита в противоположное состояние (употребляется для подсветок или проверок циклов миганием светодиода)



В первых версиях программ употреблялись вышедшие из употребления макросы установления и очистки бита



Интерес к логике, к чему приводят те или иные операции, во всем их внушительном разнообразии, удовлетворяется справочником по C или даже javascript, опираясь на сходство синтаксиса. Перечисление отдалит нас от задачи краткого обзора особенностей программирования микропроцессоров. Тем не менее констатируем следующее. Работать с битами можно при помощи операторов |=, &=, ^=.

A|=B осуществляет побитное сложение чисел A, B с размещением итога в A. Она используется для установок битов, помечаемых в B, в 1. Инверсная операция установок битов в 0 собирается на основе логического умножения и инверсии A&=~B.

Помимо экзотики в виде смещения <<, существует прямое обозначение битов b00000001. В шестнадцатиричной системе обозначений числа выглядят короче 0x01, наиболее популярно 0xFF означающее восемь единичек. Шестнадцать чисел от 0 до F занимают 4 бита: 0000, 0001, ..., 1111.

Приведем краткую сводку имен битов наиболее популярных регистров канала передачи данных.

Микроконтроллер AVR имеет последовательный интерфейс UART, позволяющий ему обмениваться данными с другими устройствами по протоколу RS232. Для ввода-вывода сигналов Rx, Tx часто используются ножки D0, D1. Для управления модулем UART предназначены регистры UDR, UCSRA, UCSRB, UCSRC. Чтобы включить приемник и передатчик UART нужно установить в единицу биты RXEN и TXEN регистра UCSRB. Флаги (биты) UDRE, RXC и UDRIE, RXCIE синхронизируют прямую передачу данных и передачу данных по прерыванию соответственно.

Чтобы отправить байт нужно записать его в регистр UDR. После пересылки данных будет установлен флаг UDRE регистра UCSRA, после чего можно пересылать следующий байт данных. Установка бита UDRIE регистра UCSRB разрешает прерывание от UART после передачи байта. С помощью обработчика этого прерывания контроллер может передавать данные по UART в фоновом режиме.

Для приема байта надо считать значение из регистра UDR. Узнать о том, что принят байт можно прочитав флаг RXC регистра UCSRA. Установка бита RXCIE регистра UCSRB разрешает прерывание от UART при приеме байта, что позволяет принимать данные в фоновом режиме.

Для настройки скорости передачи данных используется регистр UBRR, физически размещенный в двух регистрах, в UBRRH – старшая часть, и в UBRRL – младшая. Значение, которое надо записать в UBRR расчитывается по формуле: UBRR=F/(16*BAUD)–1, где F – тактовая частота контроллера, BAUD – требуемая скорость передачи данных.

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

ЭМУЛЯТОР AVR GCC – ПРИМЕРЫ

Rambler's Top100