Отчет от замене AT90S2313 на ATtiny2313 Первой, бросающейся в глаза, причиной для такой замены является снятие МК AT90S2313 с производства и рекомендация фирмы Atmel заменять ее на ATtiny2313 в схемах, разработанных для ее предшественника. Написать отчет о проведении такой работы меня побудило то обстоятельство, что эта замена оказалась отнюдь не тривиальным занятием, хотя оба МК совместимы по выводам и (снизу вверх) по системе инструкций.
Несмотря на то, что AT90S2313 все еще широко имеются в продаже и даже по цене дешевле, чем ATtiny2313, имеются дополнительно весомые аргументы для такой замены.
1) Добавлен буфер FIFO на прием UART RS-232 потока. И хотя в нем помещается только две посылки, тем не менее это позволяет смело обрабатывать входящие байты прямо в процедуре прерывания от полного приемника RX, не опасаясь о пропаже следующего за ним байта.
2) Новый МК имеет встроенный в чип осциллятор, что позволяет использовать его без внешнего кварца (который обычно превосходит МК габаритами). Имеются средства точной подстройки частоты этого осциллятора. Таким образом ATtiny2313 становится "самодостаточной", т.к. не требует сосем никакой обвязки.
3) Добавлены новые инструкции, которые позволяют укоротить код. Это MOVW - копирование регистровых пар, и синтаксис команды LPM, позволяющей быстро копировать байты из flash в нужный регистр:
LPM R16,Z+
У старого МК аргументы у LPM отсутствовали, поскольку загружал он всегда в R0, а инкрементировать поинтер приходилось отдельной командой. Как впрочем и перегружать R0.
4) Новый МК почти вдвое экономичнее по энергопотреблению (в общем-то эта серия в основном как раз и позиционируется как простой и экономичный МК).
5) У версии ATtiny2313v снижено и напряжение питания. По паспорту ему достаточно Vcc=1.8 В, но я запускала на одной свежей батарейке 1.5 В и все работало! А если пробить простенькую программку (
http://pol-sem.narod.ru/muson/muson.htm), то МК играет музыку :-) Когда я ради смеха прошила эту программу в свое устройство и оно заиграло "Черный бумер", то меня чуть не задавили сотрудники, которые сбежались отовсюду смотреть на чудо :-).
6) Это далеко не все нововведения, но я остановилась на наиболее, на мой взгляд, важных.
...
Надо сказать, что фирменное руководство по замене "AVR091: Replacing AT90S2313 by ATtiny2313" написано совершенно бездарно и изобилует противоречиями и двусмысленностями. Именно по этой причине новой "тиньки" многие бояться, т.к. с разбега чаще всего она не "заводится", а долгие разбирательства не всем по вкусу. Надо сказать, что и я сама сделала на этом пути почти все ошибки, которые можно только совершить :-), несмотря на предварительное обсуждение этой проблема на этом форуме два месяца назад. Так пусть же мой отчет послужит предупреждением.
Начну с того, что новый МК, запаянный на место старого и пробитый той же программой обычно не работает. На команды не отвечает и выдает по UART какую-то ахинею с огромным числом ошибок. Именно в таком состоянии я застала производственный процесс: устройство с тинькой не заработало, а потому в остальные платы МК впаивать не стали, дожидаясь моего возвращения из отпуска.
Разбиралась двое суток. Дело оказалось в фузах, которых у нового МК оказалось видимо-невидимо. В то время как у старого МК в их использовании не было необходимости. И не мудрено, если в фирменном руководстве под таблицей их значений читаем:
"Notes: 1. 0 = programmed, 1 = unprogrammed"
После этого становится совершенно непонятно устанавливать мне фузу или сбрасывать. Поэтому установку фуз я буду приводить в соответствии с параметрами программы прошивки AVRreal, а не по фирменному описанию.
Проблема сильно усугубляется двумя обстоятельствами:
1) Установка фуз (CKSEL и CKDIV8) влияет на рабочую частоту МК.
2) Новый МК ГОРАЗДО (!) требовательнее по точности установки параметра частоты осциллятора, чем его предшественник. Последний легко синхронизируется со связкой AVRreal+STK300 почти при любом заданном значении частоты, в то время как тинька при тех же параметрах не желает не только программироваться, но и обнаруживаться.
Даже удачная установка фузов сразу приводит к диагностике ошибки, т.к. после этого рабочая частота МК изменяется и синхронизация пропадает. В этих случаях обычно хватаются за голову и кричат "сожгла!" :-).
Должна заметить, что испортить МК установкой фузов нельзя. Тем не менее думаю, что далеко не каждый догадается как выкрутиться из плачевной ситуации. Чаще всего, под влиянием чтения фирменного руководства, сбрасываются фузы CKSEL3-1 (или они имеют тенденцию сами сбрасываться при неточно установленном параметре частоты осциллятора). В этом состоянии МК оказывается в состоянии "External Clock", когда он ждет внешнего тактирования, в то время как встроенный осциллятор отключается, а внешний кварц не работает, поскольку на контакт "кварц-OUT" сигнал не поступает. В таком состоянии программатор не может синхронизироваться с МК и отказывается его обнаруживать. А значит и перепрограммировать такую ошибку не представляется возможности.
Я сама попала в эту, казалось бы безнадежную ситуацию. Меня спасла только правильная догадка о случившимся и наличие на той же монтажной плате АЦП, имеющего собственный кварц (хотя и другой частоты). Перебросив единственный проводок "Кварц-ОUT" от АЦП на "Кварц-IN" у МК, удалось заставить последний запуститься. А дальше AVRreal сразу его увидел и позволил перепрограммировать фузы. Так то не спешите выбрасывать "сгоревшую" тиньку. Ее еще можно оживить подачей внешней частоты.
Короче говоря, необходимо устанавливать CKSEL=b (если частота внешнего кварца меньше 3 Мгц) или CKSEL=f (если больше), и CKDIV=1. Примерно вот таким образом:
avreal.exe +TINY2313 -p1 -as -fcksel=b,ckdiv=1 -e -w -v -o??????hz -5 prog.gen
где: ????? - частота осциллятора, которую я предварительно (не трогая фузов) подбирала вручную. Она оказалась в 12.5 раза меньше частоты кварца. Отчего так не знаю.
Обращаю внимание, что делитель частоты на 8 (CKDIV) необходимо тоже устанавливать, иначе работать как старый МК тинька не станет. А все что написано про CKDIV в руководстве - чепуха :-).