-

Осваиваем AVR!

новости  | с чего начать? | ссылки | учебник | примеры | программатор | отладчики | осциллограф | давно это было | download | сотрудничество | пишите мне

пример отладки  | бегущие огни | Мигалка | Экономим ресурс ПЗУ | Работаем с USART | 555

 

Рис.1

Итак, программа для микроконтроллера написана, оттранслирована, проверена на эмуляторе и записана в МК. Включаем девайс - не работает, или работает не так как надо. Еще раз смотрим на программу - ой, ашипка. Это вполне нормальное явление.

Исправляем, транслируем, стираем старую и прошиваем новую. Вроде проблем -то нет, но тут надо помнить о том, что вышеописанный процесс исправления ошибок (и внесения новых) будет повторяться неоднократно, а количество гарантированных циклов перезаписи flash-ПЗУ обычно не более 1000.

Тут, конечно, кто-то скажет - ну и не беда, сгорит - куплю новый, 5$ - не деньги. Возможно, оно и так... А все-таки жалко. Это во первых. А во вторых - что делать, если вы отлаживаете устройство на Mega128? Корпус TQFP, припаянный на плату, без специального оборудования и не снимешь.

 

Рис.2

Существует достаточно простой способ, позволяющий увеличить ресурс ПЗУ как минимум на порядок. Зачастую размер программы значительно меньше общего объема ПЗУ. Казалось бы - надо просто разместить программу в другом месте ПЗУ - например, за концом первой и так далее. Но всю малину портят вектора прерываний, которые должны находиться в фиксированных адресах.

 А я прерывания не использую! -Но ведь программа МК откуда-то стартует, и это обычно ячейка ПЗУ с адресом 0, или вектор сброса. Так что вектор все равно есть.

Что такое цикл перезаписи? По сути, это количество стираний ПЗУ. После стирания ячейка ПЗУ обычно содержит все "1", которые при программировании могут сбрасываться в "0". А вот обратно в "1" состояние можно возвратить только стиранием, причем не байта, а всего ПЗУ микроконтроллера. Следовательно, в любую ячейку, что бы в ней не находилось, мы всегда можем написать 0 - а это код команды NOP (то есть ничего не делать).

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

Да все очень просто. Следующая версия программы пишется так, чтобы обработчики начинались там, где закончилась предыдущая программа, для этого существует .ORG, вектора не поменялись, а дополнительные JMP смещаются на одну ячейку простым добавлением одного NOP, который после трансляции имеет код 0 и соответственно "забивает" предыдущее содержимое ячейки.

 

 

Рис.3

После проделывания выщеуказанного программа будет иметь вид (см. Рис.3) и все будет работать, только после каждого смещения программы будут добавляться по два такта времени при обработке прерываний, что, в общем-то, практически всегда несущественно.

Ну а после того, как место в ПЗУ кончится (или место в таблице дополнительных JMP), МК стирается и программа возвращается к Рис.2

И в завершение надо отметить - у меня еще не было случаев выхода МК из строя из-за отказа ПЗУ - либо они такие надежные, либо данный метод помог :-)

 

Рис.4

А вот так этот метод будет выглядеть при использовании Algorithm Builder (см. рис.4)

При первой прошивке макро Nopiki должно быть пустым, при второй - состоять из одной команды NOP и так далее, прибавляя каждый раз по одному NOPу. (Для Mega128 - надо ставить по два, поскольку объем ПЗУ у него большой и таблица векторов рассчитана не на однословную команду RJMP, а на двухсловную LJMP). Учтите, рисунок - как раз для Mega128!

В общем, надеюсь, все понятно. Единственное неудобство - прожигать вам придется не прямо из Builder-а, а моим программатором. Дело в том, что программатор Builder-а даст ошибку в случае записи $FFFF туда, где уже что-то записано - а в моем это по умолчанию выключено. Да и посмотреть, где кончается "старая" программа - моим проще.

Как сделать то же самое для обычных AVR (не Mega, то есть у которых в вектора вставляется RJMP) вы можете на страничке  пример работы с RS232


Rekl:

 

(с)nml 08-Dec-2006