ЭМУЛЯТОР AVR GCC


Эмулятор отлажен под Internet Explorer, прочие браузеры заведомо работают с отклонениями в исполнении кодов, более или менее критичными.

Минимальная рабочая схема с ATmega8 содержит лишь внешний кварц и питание. Установленная на производстве частота в 1 MHz позволяет обойтись без кварца, однако процессор будет работать в 8 раз медленнее. См. также эмулируемые РОБОТЫ.


ЯЗЫК AVRGCC | БИБЛИОТЕКИ | [2] | C



Помимо сетевого эмулятора можно инсталлировать компилятор WinAVR: желательно в папку с лаконичным именем WINAVR (только не в Program Files, пробел нежелателен). Поверх ставится организующая работу компилятора бесплатно скачиваемая у производителя микропроцессоров Atmel AVR-Studio.


Учебные программы транслируются студией в hex-коды и через SPI-порт закачиваются в память микросхемы с помощью USB-программатора, дешевые программаторы используют программу PonyProg. Рекомендуется заглянуть в справочник: Шпак Ю.А. Программирование на языке C для AVR и PIC микроконтроллеров. Первое время проще не паять, а использовать учебные комплекты Olimex по мехатронике.

Эмулятор AVR GCC работает в книгах, блогах и форумах с установленным плагином. Программно можно мигать, в частности, светодиодом, подцепленным к второй ножке микроконтроллера: к порту PD0. Среда кроссбраузерная, но для вывода графики используются мультимедийные возможности Интернет эксплорера (IE).

ОТЛАДЧИК (ДЕБАГГЕР)


Расположение индикаторов отладчика отвечает архитектуре микропроцессора ATmega8. Две линии, PD0 и PC5, подсвечиваются "светодиодом". Зеленым маркером отмечается единичное (высокое) состояние пина. Для физических стендов характерно инверсное подключение, когда светодиоды горят при нулевых выходах. При анимации роботов команда clear() отключает заставку со светодиодами.

Дебаггер эмулятора представлен функцией вывода содержимого портов alerts(), которая нужна только в том случае, если содержимое порта не меняется явно. Вывод содержимого портов и переменных с остановом выполняется сходной конструкцией вида alert(PORTx), без остановки по puts(переменная).

Глобальные переменные обязательно декларируются по //variables и после описания их следует переключатель //program. В AVR GCC переменная помечается при описании ее типа как volatile, иначе оптимизатор распространенного компилятора утрирует логические условия с ней, если она изменяется вне зоны его компетенции (при прерываниях).

Для простоты учебного дебаггера подпрограммы предваряются комментарием //function. Отсутствующие аргументы подпрограмм декларируются по void (пусто). Далее пишется тело исполняемой программы со стандартным наименованием main. Циклы и логические конструкции, помимо while и if, не должны включать в себя пауз с delay.

В пределах основной программы while и if с открывающей скобкой нельзя вкладывать, они требуют в своем завершении комментария (как в примере). Ограничения не касаются использования в подпрограммах, кроме того, while и if без скобки при них (или помеченные значком "антидебаггера" /**/) работают как обычно. Эти меры позволяют отладчику замедлять темп вывода графической и текстовой информацию с тем, чтобы мы успели ее воспринять.

Иными словами, есть два вида if (и while), в первом (с завершением //if) дебаггер разрешает выводить графику и делать паузу - эти if нельзя вкладывать друг в друга, проверка условий идет только подряд



во втором дебаггер не делает пауз



Во втором случае нет комментария в конце.

ПОМИГАЕМ СВЕТОДИОДОМ


Классическое начало работы с микропроцессором, осваиваем порт дискретного вывода. Светодиоды данной конкретной модели связаны с линиями PD0 и PC5.

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

Двунаправленные порты ввода-вывода микропроцессора PORTx управляются регистром конфигурации DDRx (единички, как выход), битовое содержимое которого позволяет установить направленность восьми линий порта Pxn (PINxn). При чтении данных используется содержимое буфера входов PINx.

Некоторые конструкции выходят из употребления, это касается макросов sbi и cbi.



Макрос sbi(PORTx,bit) эквивалентен PORTx |= _BV(bit), второй макрос cbi(PORTx,bit) эквивалентен PORTx &= ~_BV(bit). Знать их полезно, они встречаются в ранних программах, но ныне чаще используются отмеченные конструкции.

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

ПРОГРАММИРОВАНИЕ UART


Искусство программирования UART (связи по RS232) заключается в расчете значений регистров канала, зависящих от частоты процессора и частоты обмена. Эмулятор имитирует передачу и прием данных со стороны внешнего источника.

Доступ к регистру обмена UDR регулируется флажками (битами) UCSRC, нумерация битов начинается с нуля. Биты с номерами RXEN=4 и TXEN=3 устанавливаются в 1 сдвиговыми операциями, которые приводят к 00010000 и 00001000. Побитовое ИЛИ (вертикальная черта) установит UCSRB в 00011000. Аналогично флажки-биты выставляются в UCSRC. Линии PD0, PD1 заняты под UART (RXD, TXD), поэтому из двух доступных тут диодов следует пользоваться индикатором на PC5.

На сайте chipenable.ru приведены терминальные программы обмена. Скриптовый обмен данными (по сценарию) обеспечивается, в частности, студией Visual Matlab. Для связи вход-выходные линии com-порта компьютера через микросхему MAX232 подключается внахлест к первым двум линиям порта D.


Из неприятностей, которые могут поджидать на этом пути, отметим возможное ошибочное представление о реальной частоте работы микропроцессора. При прошивке в фузах есть настройка частоты (на предприятии прошивается частота 1 Мгц, позволяющая микросхеме работать без кварца). На отладочных платах универсальный порт может быть не подпаян, см. фото распайки 2-мя проводами.

В микроконтроллере ATmega8535 есть 5 регистров – UBRRH, UBRRL, UCSRA, UCSRB, UCSRC. Биты регистра UСSRB именуют RXCIE, TXCIE, UDRIE, RXEN, TXEN, UCSZ2, RXB8, TXB8. Для разрешения работы приемника и передатчика нужно установить в единицу биты RXEN и TXEN. Прерывания по завершению передачи и прерывания при очистке регистра данных разрешают биты TXCIE и UDRIE. Размер слова данных передаваемых/принимаемых модулем USART может варьироваться от 5 до 9 разрядов и определяется битами UCSZ2..UCSZ0. В регистре UCSRB находится только бит UCSZ2. Остальные биты находятся в регистре UCSRC. Если использовать 8-ми разрядные слова, то эти три бита должны быть установлены 011. Селектор URSEL взводится в 1 для передачи данных в UCSRC (есть еще теневой регистр). Биты RXB8 и TXB8 – это 8-ой разряд принимаемых/передаваемых данных соответственно. Они используются, если размер слова данных – 9 бит.



КНОПКИ И СВЕТОДИОДЫ


Генератор случайного нажатия кнопки Button(PINDn) порта D отличается от _BV(PDn) рандомизированным характером результата. В цикле кнопка опрашивается дважды. Содержимое регистров указывается в шестнадцатиричной системе 0x.

В примере нажатие эмулируемой кнопки на входе PIND2 используется для переключения состояния светодиода PC5. Условие обнаружения нажатия (нулевого состояния ножки) формулируется в характерной для кнопок логике, учитывающей номер n анализируемой линии PINDn. На практике к ножке микросхемы подпаивается реальная кнопка, вход присоединяется резистором к плюсу VCC. Заметим, что до использования на этот вход программно подается 1 (подтяжка).


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

ТАЙМЕР И ПРЕРЫВАНИЯ


Команды запрещения и разрешения прерывания cli() и sei() дифференцируются по типам прерывания флажками (битами) регистров, в данном случае, битом TOIE0 регистра TIMSK.

Отличие от ранее рассмотренных программ небольшое. Во введении декларируется имя программы обработки прерывания ISR по событию сброса счетчика таймера и пишется ее содержимое: инверсия выходов порта. В главной программе присутствует формализованная строчка выбора режима TCCR0 работы (нулевого) таймера со счетчиком TCNT0. Выполнение программы обработки прерывания управляется флажком разрешения TIMSK. В эмуляторе тик таймера составляет 10 миллисекунд. На практике таймер тикает чаще. У более продвинутых моделей микроконтроллеров для варьирования времени срабатывания есть штатный регистр под порог накопления OCR0. Директива «volatile» указывает глобальные переменные, изменяемые при прерываниях. Это важно, поскольку оптимизатор компилятора Си удаляет формально никогда не выполняющиеся (в рамках программы) условия с ними и возникает ошибка.

ВНЕШНИЕ ПРЕРЫВАНИЯ


Периодическое нажатие кнопки PD2 в эмуляторе имитируется системой. Программа обработки прерывания ISR в качестве аргумента используется вектор-прерывания (адрес). Эта константа берется из справочника. Макросы sei() и cli() разрешают и запрещают прерывания глобально, помимо нужно разрешить частное прерывание с помощью GIMSK, поскольку по умолчанию они все запрещены.

У микропроцессора ATmega16 устаревшее обозначение GIMSK заменено на GICR, в остальном все то же самое. В системе прерываний с кнопкой PD2 связан сигнал INT0, что видно из рисунка микропроцессора. Биты ISCx0 и OSCx1 регистра MCUCR устанавливаются в соответствии с нужным режимом прерывания (по низкому уровню, по изменению уровня, по перепаду с 1 в 0 или по перепаду с 0 в 1). Директива «volatile» указывает глобальные переменные, изменяемые при прерываниях (см. замечание выше). Пишется тело подпрограммы обработки прерывания ISR, переключающей светодиод, подсоединенный к ножке PD0, и изменающей глобальную переменную T. Основная программа управляет светодиодом PC5 в зависимости от T, значение которой сбрасывается в 0.











Rambler's Top100