Ответы на вопросы о микроконтроллерах MCS-51, Atmel AVR, PIC, Ubicom, ST10

     

Вопросы по AVR


Q: Какие кросс-средства есть для AVR и где их взять?
Q: Какое вpемя нyжно atmega для стабилизации кваpца пpи выходе из power save/power down pежимов или после подачи питания vcc/gnd ? То же самое - для стабилизации внешнего rtc-кваpца 32khz.
Q: Какие есть глюки у AVR ?
Q: Как определить причину сброса в AT90S2313 ?
Краткий FAQ по IAR C для Atmel AVR (компилятор версии 1.40c)
Q: Что еще почитать об AVR ?
Для высокочастотных кварцев добротность состовляет от 30000 до 800000, конкретно для РК169 и частоты 4 МГц добротность составляет 100000, откуда время запуска - 25 мс. Время запуска можно значиельно снизить уменьшив добротность кварца шунтированием последнего резистором, например 5.1 МОм, однако это снижает стабильность работы кварцевого генератора (хотя этим снижением во многих случаях можно пренебречь). Аналогичного эффекта можно добиться применив керамические резонаторы (которые сами по себе имеют низкую добротность). А теперь вернемся к AVR-кам: В AVR существует регистр SUT, который отвечает за задержку сигнала сброса, необходимую для полного выхода генератора на рабочий режим. Это время должно быть примерно в два раза больше (для запаса с учетом климатики, рабочего напряжения и т.д.). Оно выбирается в регистре SUT двумя битами: 00 - 5 циклов генератора 01 - от 0.4 до 0.6 мс 10 - от 3.2 до 4.8 мс 11 - от 128 до 192 мс Этими же битами делается задержка на запуск процессора и при выходе из режима PowerSave (в этом режиме тактовый генератор выключен для достижения низкого потребления - только так AVR можно заставить мало потреблять - в рекордно короткое время побольше сделать за счет большой вычислительной мощности, а потом спать, спать, спать! :) >Q: Какие есть глюки у AVR ? A: Владимир Василевский
При плавном понижении питания при выключении AVRы без brown-out detector-а имеют свойство иногда чего-то писать в EEPROM. Это трудно воспроизвести - эффект случайный и непонятным образом зависящий от устройства программы. Hа 100% лечится внешним супервизором, например, ADM705. Hасчет слетания Flash: если сигналы, используемые для внутрисхемного программирования, болтаются в воздухе, или при активном ресете на них подается что попало, то с ненулевой вероятностью возможен вход в режим програмирования со всеми вытекающими последствиями. Притяжка SCK к земле через резистор решает эту проблему. >Как определить причину сброса AT90S2313 ?
Андрей Черниченко Штатно - никак.


Когда мне это было актуально, я вешал на свободную ногу параллельную RC цепь типа 1 МОм + 0.1 мкФ; после инициализации программы выставлял на эту ногу "1", а непосредственно в начале программы анализировал уровень на этой ноге. Если только что включили питание, то будет "0". Если был сброс по WDT или от супервизора, то прочитается "1" (при условии, что от момента сброса прошло не более ~1.2 постоянных времени RC цепи, точную цифру лень считать - U=Ucc*exp(-T/RC) ). Второй путь, более сложный, но и более эффективный. Периодически подсчитывать контрольную сумму критичных регистров (адресов ОЗУ) с сохранением результата подсчета, а по старту проверять соответствие пересчитанной контрольной суммы тому значению, которое было сохранено. При использовании CRC-16 мне не удалось добиться ни "ложного срабатывания", ни "пропуска". Эффективность восстановления фазы работы просто великолепная! Видимо, с точки зрения простоты реализации более правильно использовать CRC-8 (я не проверял). Еще некоторые используют контрольные байты (фиксированные значения), равномерно распределенные в ОЗУ. Hо это таки на любителя острых ощущений, IMHO. Для AVR cброс (по WDT либо по reset') есть сброс в любом режиме, в том числе и в режиме Power Down. Соответственно, выполнение программы начинается с вектора reset', т.е. с самого начала в том числе и при срабатывании WDT в режиме Power Down. >Краткий FAQ по IAR C для Atmel AVR (компилятор версии 1.40c)
(c) Владимир Полетаев >Q: Я установил IAR Embedded Workbench 2.20 DEMO и кряк к нему. Что дальше? A: Лучше всего - полностью прочитать весь help. Это значительно упростит дальнейшее освоение. Печатная документация на компилятор практически один-в-один повторяет help. Если же читать совсем лень - то по крайней мере прочти разделы Overview и Tutorial в AT90S Windows Workbench Help. Далее нужно скачать с http://www.atmel.com/atmel/products/prod200.htm последнюю редакцию даташита и еррата на выбранный микроконтроллер. Там же, в http://www.atmel.com/atmel/products/prod201.htm лежат примеры AVR 8-Bit RISC - Application Notes.




Из них особенно рекомендую следующие: http://www.atmel.com/atmel/acrobat/doc1483.pdf AVR030: Getting Started With C for AVR (11 pages, updated 9/99) Как раз - "С чего начать". В принципе, повторение начальных разделов документации по EWA90. http://www.atmel.com/atmel/acrobat/doc1079.pdf AVR032: Linker Command Files for the IAR ICCA90 Compiler (12 pages, updated 10/98) Описывается написание командных файлов компоновщика (.XCL). Тоже повторение документации от IAR. http://www.atmel.com/atmel/acrobat/doc1234.pdf AVR034: Mixing C and Assembly Code with IAR Embedded Workbench for AVR (8 pages, updated 12/98) Как связать ассемблерную подпрограмму с программой на Си. Тоже повторение документации. http://www.atmel.com/atmel/acrobat/doc1497.pdf AVR035: Efficient C Coding for AVR (15 pages, updated 11/99) Очень толковый документ. Рекомендую к внимательному прочтению, особенно когда программа занимает памяти больше, чем есть в кристалле. Кроме того, в http://www.atmel.com/atmel/products/prod203.htm (раздел Software) рекомендую взять: ftp://www.atmel.com/pub/atmel/io_def.zip Там находится архив с символическими описаниями регистров ввода/вывода и битов в них для всех AVR микроконтроллеров. Файлы .h из этого архива следует положить в C:\IAR\EW22DEMO\A90\INC\ вместо старых. >Q: Отличается ли IAR C от стандартного ANSI C? A: Да. В IAR C входят различные расширения, связанные с реализацией компилятора для микропроцессора с Гарвардской архитектурой (два адресных пространства - для кода и данных) и для более эффективной работы в ограниченных условиях микроконтроллеров. Подробнее - смотри AT90S C Compiler Programming Help, раздел Language extensions. В исполняющей системе (библиотеке) отсутствуют функции, связанные с вызовами операционной системы (операции с файлами и пр.) >Q: Можно ли разместить таблицы (строки и т.д.) в ПЗУ? A: Можно. Для этого существует расширение языка - зарезервированное слово flash. Переменная, описанная с применением данного слова размещается в адресном пространстве кода и доступна только по чтению.


flash char aaa[] = "aaa"; flash char bbb[] = "bbb"; flash char ccc[] = "ccc"; flash char flash *xxx[] = {aaa, bbb, ccc, 0}; Если используется более чем один уровень вложенности, как в вышеприведенном примере (массив указателей на строки), то flash должен стоять для каждого уровня. >Q: Как передать строку char flash * в функцию? Прямое написание строки в параметрах функции не проходит: printf_P("Строка\n"); A: Только одним способом. Описать ее отдельно: { static flash char str[] = "Строка\n"; printf_P(str); } Рекомендую обратить внимание, что не обязательно выносить описание строки в начало функции. Можно сделать локальный блок и описать переменную в нем, как в примере. >Q: Как преобразовать указатель char * в char flash *? A: Воспользоваться промежуточным int: char *s; char flash *p; p = (char flash *)((int)s); >Q: Где размещаются переменные типа const? A: В ОЗУ. Слово const не является синонимом слова flash. Переменные, описанные как const, размещаются в ОЗУ. Таково требование стандарта ANSI. A: Аскольд Волков Точнее сказать в адресном пространстве данных. При включенном ключике "Writable constants and strings" они действительно окажутся в ОЗУ и будут инициализированы при startup-е, а при выключенном размещаются в отдельном сегменте CONST, котроый должен быть размещен в энергонезависимой памяти данных. Такой памяти на кристалле AVR нет, поэтому этот режим может использоваться только при наличии в схеме внешней памяти данных. >Q: Как работать с битами в регистрах внешних устройств? A: Для начала описать полезный макрос: #define Bit(n) (1 << (n)) Для установки бита n в порту p: p |= Bit(n); Для сброса бита: p &= ~Bit(n); Для проверки бита: if ((p & Bit(n)) != 0) ... и так далее.
Полный перечень всех битов доступен на сайте атмела в разделе software, файл io_def.zip. Следует поместить эти .h файлы из этого архива в каталог C: \IAR\EW22DEMO\A90\INC\ вместо существующих. >Q: У меня не работает printf.


Что делать? A: Во-первых, включить в свою программу отдельную функцию putchar: int putchar(int c) { while ((USR & (1 << UDRE)) == 0); UDR = c; return c; } Стандартный putchar в библиотеке скомпилирован под несуществующий 8414. Для доступа к именованным названиям битов регистров следует взять правильный .h-файл из io_def.zip. Эту функцию следует включать только при компиляции под target=release, иначе под отладчиком может отказаться работать окно Terminal I/O. Во-вторых, следует проверить процедуру установки скорости обмена последовательного порта. В-третьих, надо правильно выбрать вариант функции printf. Подробности - смотри AT90S C Compiler Programming Help, Configuration, Input and output. Стандартная функция printf требует для своей работы минимум 134 байта ОЗУ в стеке. Это страшное расточительство, поэтому есть сокращенные версии printf, которые обладают значительно меньшими возможностями форматирования (в частности, не поддерживают задание поля ширины вывода), но зато не требуют для работы так много ОЗУ. Я бы порекомендовал использовать C:\IAR\EW22DEMO\A90\ETC\intwri.c с небольшими исправлениями - заменить static const char hex[] = "0123456789ABCDEF"; на static flash char hex[] = "0123456789ABCDEF"; и перейти от printf к printf_P заменой: int printf (const char *format, ...) на int printf_P (const char flash *format, ...) Кроме того, я бы рекомендовал вообще отказаться от printf и перейти к printf_P. >Q: Мне не хватает ОЗУ. Что делать? A: Прочитать AVR035: Efficient C Coding for AVR и внедрить приведенные там рекомендации. Если кратко: По возможности использовать байтовые (char) переменные. Hе перегружать стек локальными переменными большого размера. Стараться делать функции большого (в меру!) размера - так компилятор разложит максимум переменных по регистрам. Об эффективности лучше судить по листингу. Передавать в функции лучше не более 2 входных переменных - так они лягут в регистры. Размещать константы в ПЗУ, с ключевым словом flash. Внимательно изучить используемый .xcl-файл - он приведен в поставке только для примера и кое-где неэффективен.


Поставить нижнюю границу всех DATA сегментов (RSTACK, CSTACK, IDATA1, UDATA1, ECSTR) в 60 - так будет достигнуто полное, без дырок, использование ОЗУ. Уточнить размеры аппаратного (RSTACK) и программного (CSTACK) стеков. >Q: У меня не работает порт A. Почему? A: Порт A используется как шина адреса-данных при работе с внешним ОЗУ. Если оно не используется, то в .xcl-файле следует закомментировать строку: -e?RSTACK_IN_EXTERNAL_RAM=?C_STARTUP >Q: Можно ли создать выходной файл в двоичном виде? A: Да. Для этого следует указать в качестве выходного формата mpds. Полученный файл с расширением .tsk и будет образом ПЗУ. >Q: Как заменить библиотечный модуль на свой? A: Проще всего - просто поместить исходный файл с ним в свой рабочий каталог проекта и подключить его к файлу проекта. Дальше оболочка сама разберется с его типом (.c или .s90) и позаботится о его пристыковке раньше библиотечного. >Q: Как лучше отлаживать программу? A: Если нужно отладить алгоритм, не зависимый от работы периферии, то тогда можно воспользоваться C-SPY. Преимущества - отладка на уровне исходного текста, недостатки - периферия практически отсутствует. Если работа со стандартной периферией, то можно создать .hex-файл и загрузить его в Astudio. Преимущества - достаточно достоверная эмуляция кристалла, недостатки - приходится работать только с дизассемблерным текстом. Адреса подпрограмм и переменных приходится выяснять из map-файла. Такие сложности возникают из-за того, что в демо-версии EWA90 формат внутренних файлов отличается от рабочей версии и этот формат не понимается другими программами. ВHИМАHИЕ! IAR адресует память программ побайтно, в то время как Atmel - пословно. Поэтому, если в map-файле от компоновщика подпрограмма имеет адрес 1234h, то в astudio надо указывать адрес 1234h/2=091Ah. >Q: EWA90 работает только под Windows? A: Оболочка - да. Однако есть command-line версии компилятора, ассемблера и компоновщика, которые прекрасно работают из-под MS-DOS, используя встроенный DOS Extender от Phar Lap Software, Inc. Основная сложность при работе с ними - огромное количество ключей.Рекомендую для начала поработать в виндовой оболочке, а затем взять список ключей из шапки листинга и поместить его в make - файл. Лично я пользуюсь maker.exe из состава Borland C 3.1 (просто потому, что она у меня уже была). >Q: Периодически при компиляции совершенно правильного файла мне выдается системная ошибка. Что делать? A: Повторить компиляцию. Это какая-то ошибка в компиляторе, которая иногда возникает. >Q: Что еще почитать об AVR ? На российском сайте Atmel есть подборка практических рекомендаций - почитать можно на http://www.atmel.ru/AVR/AVR.htm и на http://www.atmel.ru/Spec/Spec.htm. Ответы на вопросы по AVR, задаваемые посетителями сайта ATMEL, можно найти на http://www.atmel.ru/FAQ/FAQ.htm.

Содержание раздела