Преди да се усетя и вече пиша следващия си туториал. Предложението за създаването му отново беше на Симо от robotev.com. Мда. Много лесно се съгласявам.
Когато се запознах с платформата Ардуино много ми хареса лекотата, с която от идея се стига до реализиран работещ прототип. След няколко опитни идеи съвсем естествено възниква желанието за реализирането на някоя от тях като завършено изделие. И тук, както вероятно повечето Ардуино ентусиасти, се сблъсках с много важен въпрос. Да вградя ли моето Ардуино за постоянно или да се откажа от реализацията? За съжаление най-често избирах второто като основната причина беше финансова.
(Ардуино на цена 46лв.)
Освен това полученото ще е излишно обемисто. Следващата ми идея беше, че вместо цяло Ардуино бих могъл да вградя само чипа на микроконтролера с минималния брой елементи необходими за работата му. Така цената спада неколкократно но все още остава прекалено висока.
(микроконтролер на цена 9лв.)
Повечето проекти (поне моите) са сравнително малки и не могат да оправдаят вграждането за постоянно дори само на микроконтролера и основната причина е цената му. Така ATmega168 и ATmega328 отпаднаха като подходящи кандидати. Тогава в полезрението ми попадна tiny серията и по-точно ATtiny85.
(ATtiny85 на цена 4.60лв.)
Програмирах го чрез моето Ардуино и с добавен преместващ регистър 74HC595 успях да управлявам 16 светодиода чрез мултиплексиране. В стремежа си към опростяване изпробвах предположението ми, че токоограничващите резистори на светодиодите не са необходими и се оказах прав. Имах управление съставено само от микроконтролер работещ на 8MHz без външни елементи и регистър но все още не бях доволен. Причините за неудовлетворението ми бяха, че чиповете са 2 и макар с малко по-ниската си цена микроконтролера не беше достатъчно евтин в сравнение с останалите елементи. Тогава се случи така, че най-после станах притежател на дебитна карта. С нейна помощ интернет пазаруването и от чуждестранни сайтове стана възможно. Последва обстойно търсене от моя страна и в eBay.com успях да намеря подходящия микроконтролер а той се оказа ATmega8.
ATmega8 на цена 5.60лв.
ATmega8 на цена 4лв.
ATmega8 на цена 3лв.
При поръчка на пакет от 10 броя цената беше достатъчно ниска и получавах достатъчно функционален чип.
(eBay.com пакет 10 броя на обща цена под $9 и се получава под 1.50лв. за брой)
Програмирането щеше да е аналогично на ATtiny85. Обаче не познах. Вече бях получил поръчаните микроконтролери но все още търсенията ми в интернет бяха безрезултатни. Намерените от мен ръководства за ATmega8 освен чипа включваха и външни елементи за осигуряване работата му а това не ми харесваше. Целта ми беше само с един единствен сравнително евтин чип и нищо повече да мога да имам работещ проект. Обаче така и не намирах каквото търсех. Не ми остана друг избор и започнах да разглеждам конфигурации за boards.txt и да чета за fuse bit. Постепенно придобих известна увереност и благодарение на ниската цена на чипа и въпреки риска от брикването му се осмелих да изпробвам наученото от мен на практика. Най-после успех! Следващото беше да се възползвам от възможността честотата на вътрешния осцилатор да е друга а не използваната в случая от мен 8MHz. Останалите възможни са 1, 2 и 4MHz. Подходящи са за използване когато осигуряваната от тях производителност е достатъчна и е важна консумацията на енергия от микроконтролера - например при работа на батерии. Използването на вградения осцилатор има допълнителното предимство , че 2-та пина XTAL остават свободни и могат да се използват като допълнителни цифрови входно/изходни пина. Край на общите приказки.
Използван е 'чист' фабричен чип (без bootloader) - заводски е програмиран за работа чрез вградения RC осцилатор. За да се добави поддръжка за споменатите режими на ATmega8 е необходимо файла boards.txt намиращ се в папка \hardware\arduino\ на IDE-то да се отвори с Notepad (при нестартирано IDE), да се добавят конфигурациите и да се запише.
##################################################### atmsa8one.name=ATmega8 in Stand Alone at 1MHz (w/ Arduino as ISP) atmsa8one.upload.using=arduino:arduinoisp atmsa8one.upload.maximum_size=8192 atmsa8one.upload.speed=2400 atmsa8one.bootloader.low_fuses=0xE1 atmsa8one.bootloader.high_fuses=0xD1 atmsa8one.build.mcu=atmega8 atmsa8one.build.f_cpu=1000000L atmsa8one.build.core=arduino atmsa8one.build.variant=standard ##################################################### atmsa8two.name=ATmega8 in Stand Alone at 2MHz (w/ Arduino as ISP) atmsa8two.upload.using=arduino:arduinoisp atmsa8two.upload.maximum_size=8192 atmsa8two.upload.speed=2400 atmsa8two.bootloader.low_fuses=0xE2 atmsa8two.bootloader.high_fuses=0xD1 atmsa8two.build.mcu=atmega8 atmsa8two.build.f_cpu=2000000L atmsa8two.build.core=arduino atmsa8two.build.variant=standard ##################################################### atmsa8four.name=ATmega8 in Stand Alone at 4MHz (w/ Arduino as ISP) atmsa8four.upload.using=arduino:arduinoisp atmsa8four.upload.maximum_size=8192 atmsa8four.upload.speed=4800 atmsa8four.bootloader.low_fuses=0xE3 atmsa8four.bootloader.high_fuses=0xD1 atmsa8four.build.mcu=atmega8 atmsa8four.build.f_cpu=4000000L atmsa8four.build.core=arduino atmsa8four.build.variant=standard ##################################################### atmsa8eight.name=ATmega8 in Stand Alone at 8MHz (w/ Arduino as ISP) atmsa8eight.upload.using=arduino:arduinoisp atmsa8eight.upload.maximum_size=8192 atmsa8eight.upload.speed=4800 atmsa8eight.bootloader.low_fuses=0xE4 atmsa8eight.bootloader.high_fuses=0xD1 atmsa8eight.build.mcu=atmega8 atmsa8eight.build.f_cpu=8000000L atmsa8eight.build.core=arduino atmsa8eight.build.variant=standard
При стартиране на IDE (изпробвано и работещо с версия 1.0.3) в меню Tools\Board вече има налични ATmega8 in Stand Alone at (*)MHz (w/ Arduino as ISP) като (*) указва 4 различни честоти. Както подсказва името им програмирането им става по схемата за използване на Ардуино като ISP.
Зеления и червен светодиод не са задължителни. Може да са съвсем други цветове (включително и еднакви). Използват се за демонстриране на 2-та допълнителни пина като се зареди програмата за целта и то без да са им необходими токоограничаващи резистори.
const word LED = 1000; void setup () { DDRB = B11000000; } void loop () { for ( word n = 1; n < LED; n ++ ) { PORTB = B10000000; delayMicroseconds ( n ); PORTB = B01000000; delayMicroseconds ( LED - n ); } for ( word n = 1; n < LED; n ++ ) { PORTB = B01000000; delayMicroseconds ( n ); PORTB = B10000000; delayMicroseconds ( LED - n ); } PORTB = B10000000; delay ( LED ); PORTB = B01000000; delay ( LED ); }
Програмирането става по следния начин. Прави се свързването по дадената схема - използвам Arduino Nano защото го имам и е много удобно за работа с breadboard платката но може и да е друго. Стартира се IDE-то, избира се Arduino Nano w/ ATmega328 (или каквото е ако е друго) с подходящия COM порт и Programmer да е на Arduino as ISP. Отваря се скеча ArduinoISP и се ъплоадва. След това се избира ATmega8 с желаната работна честота и се стартира Burn Bootloader. Това се прави само при 'чист' фабричен чип и когато се налага промяна на работната му честота. Реално не се качва bootloader а само се програмират fuse bit и се изтрива програмната памет. Отваря се скеча, който ще се изпълнява на ATmega8 и се цъка Upload. Времето за качване е повече от обикновено заради намалените скорости. Корекцията им се наложи заради получавана sync-подобна грешка. Дори при тези условия е възможна поява на подобна грешка но е сравнително рядка и обикновено при последващо цъкане на Upload скеча се качва без проблем. Така вече имаме 'мозък' за Ардуино проект на цена 1.50лв. Недостатък на ATmega8 е, че като по-старо поколение само на 3 пина има ШИМ (PWM 9, 10 и 11).
Предимства са изключително ниската цена, минималистичната работна схема и понеже не се ползва bootloader на разположение е цялата програмна памет.