ЭМУЛЯТОР AVR GCC

По материалам научной сети MATHSCINET.RU

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

C | СПРАВОЧНИК БИБЛИОТЕК | [2]

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

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

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

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

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

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

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


Шапка первой программы практически не требует комментариев. Указывается частота работы кристалла, установленная в фузах: энергонезависимой памяти. Подгружаются базовая и вспомогательная библиотеки, вторая позволяет ссылаться на задержку 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.

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

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

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

Генератор случайного нажатия кнопки 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). Пишется тело подпрограммы обработки прерывания ISR, переключающей светодиод, подсоединенный к ножке PC5. Директива «volatile» указывает глобальные переменные, изменяемые при прерываниях (см. замечание выше).


© 2010 artspb.com