Наистина евтина и минималистична реализация на Ардуино проект

(Arduino ISP и ATmega8)

Преди да се усетя и вече пиша следващия си туториал. Предложението за създаването му отново беше на Симо от 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 на разположение е цялата програмна памет.

Share