Главная > Электроника и компоненты > |
EMBEDDED FAQ: Микроконтроллеры |
Секция 1 из 2 - Предыдущая - Следующая
A: В журнале Chip News была опубликована хорошая обзорная статья М.Ахметова на эту тему. В первой части http://chipnews.gaw.ru/html.cgi/arhiv/99_09/stat_2.htm краткий обзор RISC семейств - Microchip PICmicro, Atmel AVR, Scenix SX и Xemics CoolRISC, во второй части http://chipnews.gaw.ru/html.cgi/arhiv/00_01/stat-3.htm обсуждаются традиционные CISC семейства - ST6, ST7, ST9 от STM, Motorola 68HC05, 68HC08, 68HC11, National COP8, Fairchild ACE, Zilog Z8, Z8Plus, Texas Instruments TMS370.
A: Аскольд Волков
Их очень много, попробовать все жизни не
хватит. Из заслуживающих внимания я бы
отметил:
1. Franclin ProView. Последняя версия 8.63. Интегрированная среда, Си, ассемблер, линкер, библиотекарь, библиотеки, RTOS, симулятор. С сайта http://www.fsinc.com свободно раздается демо-версия с ограничением объема кода 2кб, которая превращается в профессиональную (!) вводом серийного номера. Достоинства: удобная оболочка, хороший help, хороший симулятор, есть версии для win16, win32 и DOS. Hедостатки - много мелких глюков, которые, впрочем, легко вылавливаются с помощью симулятора. Я пользуюсь именно этим пакетом по историческим причинам.
2. IAR 8051 Embedded Workbench. Демо-версия с кучей ограничений раздается с сайта http://www.iar.com или http://www.iar.se. Можно бесплатно заказать на CD. Гуляет множество версий. Есть краки для v.5.21В и 5.31А. Обратите внимание - номер версии надо смотреть в файле EW8051D.TXT, в заставке указывается версия оболочки. Содержит тот же набор, что и Franclin, кроме RTOS. Достоинства: единая среда для целой кучи разных процессоров. Hедостатки: есть глюки, симулятор нормально симулирует только процессорное ядро, периферию можно описывать с помощью макросов, но это трудно.
3. Keil.
A: Андрей Мозжевилов
Пакет берется с http://www.keil.com.
Файл называется ek51.zip. Надо полазить по
сайту и поискать по ссылкам. Ограничения,
установленные в демо-версии, можно снять,
воспользовавшись советами на http://www.chat.ru/~keil_crk.
Использовать UVW51E никто не принуждает, это всего лишь редактор с функциями организации проекта. Можно использовать любой редактор, позволяющий встраивать запуск внешних программ. Это зачастую гораздо удобнее. Ассемблер, Си и линкер запускаются из командной строки.
В пакете фирмы Keil по сравнению с другими очень хорошая оптимизация, не сопровождаемая различными баго-фичами компилятора, которые часто присущи другим пакетам. Franklin в этом смысле сильно проигрывает.
>Q: Какие есть особенности использования I/O выводов в семействе mcs51?
A: Александр Редчук
1) Семейство mcs51 имеет 'квазидвунаправленные'
выводы портов. Т.е. вниз они тянут более-менее
прилично, а вверх тянет несильный pull-up. Для
конфигурирования ноги на ввод в
соответствующий бит порта просто выводится
единичка, наружный сигнал ее пересиливает. Hо
на этом ровном месте разложены
аккуратненькие грабельки.
Pull-up на самом деле состоит из трех частей (см. например doc0499.pdf с сайта Atmel). Самый слабый транзистор Q2 обеспечивает ток 8...10 мкА. Транзистор Q3 (ток до 0.5 мА) обеспечивает поддержание уровня '1', но при снижении напряжения на входе до уровня около 2 В (при питании 5В) он выключается. И, наконец, самый мощный транзистор Q1 (единицы мА) включается на 2 периода кварцевого генератора при переходе бита в регистре порта из '0' в '1', обеспечивая хорошее нарастание сигнала. Такая структура обеспечивает и возможность выдать достаточно приличную (по меркам работы на ТТЛ-микросхемы) '1' и в то же время не потреблять лишний ток при подаче на вход "0".
Hо:
a) если нога была притянута к земле внешним сигналом с открытым коллектором, то к питанию ее поначалу будет тянуть только ток 10 мкА, нарастание будет очень медленным. Из-за этого, например, может плохо работать обмен по I2C.
b) если нога работает через резистор на базу NPN транзистора, да еще и тока захотелось в базу дать побольше :-), то иногда даже наводка может дотянуть вывод вниз до выключения транзистора Q3. После этого тока транзистора Q2 может не хватать для того, чтобы вывести напряжение на нагружающем резисторе в зону включения Q3, выход защелкивается в '0'
2) Кроме этого, транзисторы Q1 в порту P2 при выводе адреса и обычно выключенный pull-up в порту P0 при выводе адреса и данных в лог. '1' включены все время. Падение напряжения на этих транзисторах около 0.5 В при токе 4...5 мА т.е. могут создать вполне приличные 'КМОП-уровни' на нагрузке 1К. В то же время в 'обычном' состоянии резистор 4.7 К на землю создает достаточно устойчивый '0' на входах процессоров серии mcs51.
Следствия:
a) Если даже в вашей системе используются внешние ОЗУ/ПЗУ, но есть также и внутреннее ПЗУ, то вы можете использовать линии порта P2 как входы, подключив входные сигналы через последовательные резисторы 2К...3К и опрашивая их подпрограммой, находящейся во внутренней памяти кода
b) Если внешнего ПЗУ нет, то можно расширить порты микроконтроллера не занимая выводов для стробирования следующим образом. Порт P2 используется как входы (через резисторы), напрямую же к нему подключены входы регистра ИР23, на строб регистра подается сигнал /PSEN.
Последовательность команд
mov DPH,somedata movc a,@a+DPTRзапишет в регистр значение somedata.
>Q: А можно прочитать кристалл MCS-51, если у него установлены биты защиты от считывания ?
A:
Можно. Помогут продукты от ChipExpert,
http://www.chipexpert.com, RD51 для Intel'овских или AT51 для
Atmel'овских кристаллов.
A: Аскольд Волков
Тут все проще:
1. От Atmel: бесплатный ассемблер - отстой IMHO; симулятор AVRSTUDIO - единственный симулятор, поддерживающий периферию процессоров. [пусть напишут те, кто пользуются]
2. Бесплатный ассемблер от IAR - это просто часть полного пакета.
3. IAR AVR Embedded Workbench. Демо-версия с кучей ограничений раздается с сайта http://www.iar.com или http://www.iar.se. Можно бесплатно заказать на CD. Есть краки для v.1.30A и 1.40C. Более новые версии полностью не ломаются - не генерят нормальных выходных форматов. Правда через @#% ими воспользоваться все же можно с помощью макроса для симулятора, но это неудобно и я предпочитаю работать с V1.40C. Обратите внимание - номер версии надо смотреть в файле EWA90D.TXT, в заставке указывается версия оболочки. Hайти старые версии и краки к ним можно на http://avr.boom.ru
Содержит интегрированную среду, Си, ассемблер, линкер, библиотекарь, библиотеки, симулятор.
О достоинствах и недостатках писать бестолку, т.к. это единственный достойный пакет для AVR, сравнивать не с чем. Глюки есть, но не фатальные. Симулятор симулирует только процессорное ядро, периферию можно описывать с помощью макросов, но это трудно.
A: Татьяна Кривченко
Поэтому удобно С-программы, подготовленные
в IAR AVR Embedded Workbench, отлаживать в AVRSTUDIO, который
умеет читать исходный текст на языке С и
одновременно симулирует периферию
процессора.
4. В последнее время появилось еще много чего (см. http://avr.boom.ru), но IMHO это все несерьезно.
A: Дмитрий Тимченко
На ftp://belichi.kiev.ua/pub/avra-0.5/
можно взять ассемблер AVRA, аналогичный AVRASM-у,
но поддерживающий директивы условной
компиляции.
A: Анатолий Бабицын
По поводу времени запуска кварцевого
генератора: время запуска (точнее выход на
максимальную амплитуду генерации)
практически определяется формулой:
tзап.=Q/f,где Q добротность резонатора, f - генерируемая частота (Гц)
Добротность низкочастототных кварцев составляет от 30000 до 2000000, конкретно часового кварца добротность может состовлять примерно от 30000 до 300000, откуда следует, что генератор на часовом кварце будет выходить на режим от 1 до 10 секунд. Для высокочастотных кварцев добротность состовляет от 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 можно заставить мало потреблять - в рекордно короткое время побольше сделать за счет большой вычислительной мощности, а потом спать, спать, спать! :)
A: Владимир Василевский
При плавном понижении питания при
выключении AVRы без brown-out detector-а имеют
свойство иногда чего-то писать в EEPROM. Это
трудно воспроизвести - эффект случайный и
непонятным образом зависящий от устройства
программы. Hа 100% лечится внешним
супервизором, например, ADM705.
Hасчет слетания Flash: если сигналы, используемые для внутрисхемного программирования, болтаются в воздухе, или при активном ресете на них подается что попало, то с ненулевой вероятностью возможен вход в режим програмирования со всеми вытекающими последствиями. Притяжка SCK к земле через резистор решает эту проблему.
>Краткий 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) ... и так далее.
>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: Повторить компиляцию. Это какая-то ошибка в компиляторе, которая иногда возникает.
На российском сайте Atmel есть подборка практических рекомендаций - почитать можно на http://www.atmel.ru/AVR/AVR.htm и на http://www.atmel.ru/Spec/Spec.htm.
Ответы на вопросы по AVR, задаваемые посетителями сайта ATMEL, можно найти на http://www.atmel.ru/FAQ/FAQ.htm.
Секция 1 из 2 - Предыдущая - Следующая
Вернуться в раздел "Электроника и компоненты" - Обсудить эту статью на Форуме |
Главная - Поиск по сайту - О проекте - Форум - Обратная связь |