| AVReAl | Описание | Адаптеры | History | FAQ | English | Russian |
Программа компилируется в следующих вариантах
| W95/W98 | - встроенный модуль прямого доступа к портам |
| NT4,W2000,WinXP | - DLportIO.DLL и DLportIO.sys |
Это файлы из комплекта DriverLINX от Scientific Software Tools, Inc.
(http://www.sstnet.com).
С некоторых пор этот драйвер перестал поддерживаться и исчез
с основной страницы фирмы.
В сокращённом виде без описания и множественных примеров применения
можно взять тут dlportio.zip (170KB).
В некоторых случаях могут быть проблемы с установкой сокращённой версии под
WinXP (возможно, начиная с какого-то сервис-пака, так как под WinXPsp1
нормально устанавливался и сокращённый вариант). В таком случае следует
взять полную версию инсталлятора (1.5МБ).
Программа AVReAl предназначена для программирования микроконтроллеров серии AVR фирмы Atmel в режиме ISP (in-cirсuit serial programming, последовательное программирование в схеме). Т.е. на плату устройства устанавливаются штыри, к которым впоследствии подключается шлейфик от программатора (подключение LPT к контроллеру рассмотрено в разделе "адаптеры"). По окончании процесса программирования снимается сигнал сброса и процессор начинает выполнять зашитую в него программу.
В режиме "fbprg" незадействованные выходы данных LPT могут быть использованы как питание (ключ -ap).
При использовании буферированных адаптеров (Altera ByteBlaster, Atmel STK*00) программа рассчитана на шитьё в плате с "родными" питанием и кварцем.
Также возможна генерация XTAL программой (ключ -o0), данный режим может оказаться полезен и при наличии кварца в плате (LPT-порт легко его пересилит) для "обхода" ошибок кристалов "не читается содержимое EEPROM данных при частотах кварца, близких к максимальной".
Принимает INTEL HEX (avrasm -i). Загружает HEX в память не в массив, а в список. Т.е. различается ситуация "байт 0xFF в .hex" и "неупомянутый байт" В результате есть возможность шить только то, что надо, остальное только проверять при необходимости (см. ключ -v+).
Для любителей корректировать прошивку прямо по HEX-файлу: если не совпадает контрольная сумма
строки, то задается вопрос - "игнорировать?". При ответе 'Y' (или 'y') эта и все
остальные ошибки CSUM игнорируются (но сами символы контрольной суммы должны
присутствовать, иначе программа закончит работу еще раньше по недопустимому символу в
строке).
Для облегчения такого редактирования (особенно "форматных" записей в EEPROM)
реализована возможность, подсмотренная у программы от VMK для
программирования PIC через Tait-совместимое железо: перед анализом строки из нее
убираются пробелы и табуляции. В итоге можно дать:
:08 0001 00 00 01 0203 0405 0 6 0 7 DBТакже игнорируются пустые строки и строки, начинающиеся с символа '#', последнее предназначено для помещения комментариев о версии непосредственно в HEX-файлы.
Проверяется верхний адрес в HEX-файле, если не влазит в опознанный кристалл, то
никаких действий (кроме выдачи сообщения об ошибке) не производится.
Проверяется перекрытие
адресов записей в HEX файле. При нахождении первого перекрытия производится
выход из программы с указанием диапазона адресов перекрывающихся данных.
Для кристаллов с объёмом ПЗУ более 64KB необходим расширенный формат HEX-файла (обычный не поддерживает объем больше 64KB). Запись прочитанных данных в файл всегда производится с дополнительными записями тип '04' - Extended Linear Address Record, как не имеющим разночтений. Чтение из HEX-файла записей типа '02' Extended Segment Address Record производится в соответствии с формированием их в AVRASM by Atmel (без предусмотренного документацией Intel сворачивания адреса смещения по модулю 64Kb).
avreal [ключи] [[-c] имя_файла_кода [[-d] имя_файла_данных]] или avreal [ключи] -d имя_файла_данных (когда код трогать желания нет)Если есть только имена файлов, но нет относящихся к ним ключей (-r -w -v), то файлы игнорируются. Подробнее про работу с файлами и про ключи -c, -d рассказано после описания остальных ключей.
Ключи
-h (-?)
avreal +имя -h(
+имя должен быть задан раньше ключа -h)
выдает список fuses, поддерживаемых в режиме ISP для заданного контроллера.
+имя
имя допускается задавать как с префиксом
'AT', так и без него, в том виде, в котором имена выдаются по -h.
Регистр букв не важен. Например, at90s1200, attiny22l, atmega103
либо 90s1200, tiny22l, mega103.
Обязательный ключ, никаких действий по умолчанию не производится.
Если задан только тип (больше нет ни ключей, ни имен файлов), то контроллер будет
сброшен и выдана информация о нем (наличие, если есть доступные по ISP
fuses - их состояние).
-p<порт>[,<скорость>]
порт
-p3BC, и в виде -p0x3BC воспринимается как
шестнадцатеричное число. По умолчанию -p2 (LPT2)/dev/parport0/dev/ppi0
скорость
Hz, kHz, MHz, например,-o3.686MHZ -o14745600hz
-e -w -n если последние 2
байта заняты кодом, то -n игнорируется.
<fuselist> выглядит как
fusename=value,fusename=value,bytename=value...
где value - ШЕСТНАДЦАТЕРИЧНОЕ значение без префиксов и суффиксов.
Для однобитовых fuse добавлены значения ON и OFF (прошить и стереть,
0 и 1 соответственно).name=val выдается сообщение об ошибке.
Перечень fusename для конкретного кристалла с диапазоном value и комментарием
можно получить при помощи avreal +chipname -?Для сокращения строки возможно задание полного байта fuses при помощи специальных имен bytename, представляющие собой названия байтов по документации с лидирующим подчерком:
_low,_high,_ext,_lock.
Нереализованные в данном байте биты рекомендуется устанавливать в '1'.
Имя _lock относится к байту lock-битов и BLB, однако на состояние
lock-битов не влияет. Для блокировки кристалла по прежнему надо
использовать ключ -l.
Допускается комбинация отдельных fuse и байтов, однако они при этом
не должны пересекаться, т.е. каждый байт fuses должен быть задан
либо только через специальное имя, либо только через имена отдельных
fuse. Например,
допустимо: -f_low=C3,_high=F4,blb2=1
недопустимо: -f_lock=F7,blb2=1
Если работа с fuses по SPI поддерживается, то их состояние сообщается
при любой операции с кристаллом, задание ключа -f необязательно.
Fuses программируются или верифицируются указанием ключа -w
или -v совместно с ключом -f (в том числе в одном сеансе
с программированием/верификацией кода или данных).
-e
независимо от ключа -f).
Группа BLB относится скорее к lock-битам, записать 1 поверх уже
запрограммированной в 0 fuse невозможно. Если запрошена
такая операция и контроллер не стирался, то программа завершает работу
с соответствующим предупреждением.
-fspien=1 (-fspien=off) сотрет SPIEN и запретит дальнейшее
низковольтное программирование. То же произойдет и при
программировании RSTDSBL (-frstdsbl=0 или -frstdsbl=on).
+name) а также если не обнаружен указанный в
командной строке адаптер.
Попытка стереть нераспознанный (возможно просто
залоченный) кристалл при наличии команды стирания производится и без -!,
после чего проводится повторное детектирование типа.
возможны осмысленные комбинации:
-v -w записать, проверить
-e- -w -v+ стереть с сохранением EEPROM, записать, верифицировать
с проверкой на чистоту свободных участков.
-b -w проверить на чистоту, если грязная - выход, иначе писать
ВНИМАНИЕ! в связи с усложнением форматов ключей во избежание разночтений
в дальнейшем возможность указывать группу ключей одним аргументом
(например, -ewv) может быть исключена
Порядок ключей не важен, выполнение производится в порядке E B W V L. Если проверка (B, V) дала отрицательный результат, то дальнейшая работа не производится. Т.е.
-e -b -w -v -l2означает: стереть, если стёрлось - писать, если верифицировалась - залочить.
+tiny12 -w -c foo.hex -c*osccal=1f3 -fcksel=3,boden=0Для tiny12 записать во флеш кода файл foo.hex, по адресу байта 0x1F3 занести прочитанное из контроллера значение OSCCAL, запрограммировать fuse boden и установить fuse CKSEL в бинарное значение 0011
-d*name=offset,ext - как байты в EEPROM данных
-c*name=offset,ext - как байты во FLASH кода (под команду LPM)
-с?name=offset,ext - как часть последовательных команд LDI начиная с offset
где
name offset ext
Значение калибровочного байта RC-генератора
В качестве имени используется слово osccal с номером калибровочного байта.
При использовании нулевого байта OSCCAL указание номера 0 не обязательно.
Дополнительный аргумент ext - корректирующее значение к прочитанной
из кристалла
величине OSCCAL (может быть необходимо при напряжении питания, отличающемся
от напряжения калибровки на производстве). При выходе корректированного
значения за пределы [0..255] происходит ограничение значения и выдача
предупреждения.
Примеры.
1. Необходимо записать значение 3-го (считая с 0) байта osccal как байт по адресу
0x3F в EEPROM данных. Используется ключ
-d*osccal3=3F2. Необходимо записать значение 0-го байта osccal, уменьшенное на 3, как часть команды LDI.
public osccal_ldi ... osccal_ldi: ldi R16,0xFF out OSCCAL,R16 ...Далее смотрим по MAP-файлу значение
osccal_ldi,
например оно вышло 0x120. Команда примет вид:
avreal +tiny12 -ewv -c foo.hex -c?osccal=120,-3
serno
с числом - длиной
номера в байтах от 1 до 4. Серийный номер записывается в двоичном виде,
младший байт записывается первым. Дополнительный аргумент ext
- имя текстового
файла, в котором записан номер в десятичном виде. После успешной записи
в кристалл номер увеличивается на 1 и записывается назад в файл.
Файл при этом переписывается полностью, если после серийного номера в нём была
другая информация - она теряется.
При сбое верификации при команде -w -v номер не меняется.
Если в командной строке задана только верификация (без записи), то значение
серийного номера из файла используется, но не инкрементируется,
файл остаётся без изменений.
-d*serno2=12,serno.txt2. Необходимо записать значение 3-байтового серийного номера как часть команд LDI. Номер записан в файле proj.serno
public serno_load ... serno_load: ldi R16,0xFF ; младший байт ldi R17,0xFF ; средний байт ldi R18,0xFF ; старший байтПусть значение
serno_load по map-файлу вышло 0x120. Используется ключ:
-c?serno3=120,proj.serno
Произвольная последовательность байтов
Предназначено для записи произвольных данных.
В качестве имени параметра используется слово bytes с числом
записываемых байтов. Дополнительный аргумент ext - шестнадцатеричная
строка, число букв (hex-цифр) должно быть равно удвоенному числу байтов.
Младший байт в hexstr должен быть расположен первым, т.е. для записи числа
0xDEADBEEF надо задать
-c*bytes4=addr,EFBEADDE
Файл конфигурации позволяет задать соответствие сигналов ISP-программатора
выводам LPT-порта, а также название адаптера, используемое при выводе
диагностических сообщений. Файл состоит из отдельных записей вида
параметр = значение
по одной на строке.
Название адаптера (параметр 'name') задаётся записью
name = "произвольная строка"Сигналы программатора (параметры mosi, miso, sck, reset, xtal) задаются записями вида
signal_name = [~]lpt_pin_nameПризнак инверсии '~' означает, что между выводом LPT и выводом микроконтроллера присутствует инвертор. Внутренняя инверсия контроллера LPT учитывается автоматически. Допустимые имена выводов LPT: d0..d7 alf init strobe select ask busy error pe online. Внимание! В настоящее время для выходных сигналов программатора можно использовать только выводы d0..d7 порта LPT.
Существуют специальные группы выводов set, power, enable, в записях для этих групп допускается перечисление нескольких выводов LPT через запятую. Признак инверсии при каждом выводе означает, что на вывод необходимо выдать низкий уровень. Перед началом работы в заданное (активное) состояние устанавливаются выводы группы set. Затем активируются выводы группы power, выдерживается пауза около 0.3секунды и активируются выводы enable. По окончании работы в пассивное состояние переводятся выводы enable, затем выводы power. Выводы set остаются в установленном в начале состоянии.
Примеры описания адаптера для системы, состоящей из двух микроконтроллеров AVR, связанных между собой по SPI. Пусть контролеры соединены следующим образом:

При высокоимпедансном состоянии адаптера программирования или его отсутствии контроллеры могут свободно обмениваться информацией по последовательному интерфейсу.
Для программирования первого микроконтроллера необходимо использовать следующий конфигурационный файл.
name=1'st controller programmer mosi=D6 miso=BUSY sck = D0 reset = D1 enable=~ALF set =~D3Для программирования второго контроллера конфигурация адаптера должна быть следующая.
name=2'nd controller programmer mosi=D6 miso=BUSY set = ~D0 reset = D1 enable=~ALF sck = D3
Раздел "СВЕТЛОЕ БУДУЩЕЕ" убран в силу нехватки времени и изменения моих собственных потребностей. Коммунизм нам тоже когда-то обещали к 80 году, так что лучше я ничего обещать не буду, а вот если что-то интересное смогу, то будет сюрприз :-)
P.S. При обнаружении неприятностей просьба сообщать версию и
очень желательно копию
расширенной выдачи программы по -% (перенаправив выдачу в файл).
Внимание!!! Письма по поводу avreal с аттачами в виде
скриншотов, WORD-овских и прочеофисовских документов и других способов переслать
1-килобайтный текст с помощью 100-килобайтного файла не будут даже читаться,
не говоря уже об ответах