Arduino ISP programátor

programování ATTINY / ATMEGA pomocí Arduina



Už nějakou dobu se poohlížím po maličkých jednočipech v pouzdrech DIL8-16. Dosud jsem pro malé a jednoduché projektíky používal AT89C2051, což je zmenšený klon mé oblíbené řady x51. Jenže i ten je díky pouzdru DIL20 pořád dost velký a hlavně mi začaly chybět analogové vstupy. Vynechám-li parodie procesorů typu PIC a podobné, zbývá se podívat na ATTINY od bývalého Atmelu. Tam je výběr docela slušný, ale učit se zase AVR assembler... Když jsem se ovšem dozvěděl o možnosti programovat vybrané ATTINY jako Arduino a také je prostřednictvím Arduina "nahrávat", neváhal jsem. Nejprve jsem si to vyzkoušel na nepájivém poli a pohrál jsem si s 8-pinovým ATTINY85. A když to fungovalo, vylovil jsem ze zásob univerzální desku pro konstrukci UNO shieldu a postavil tento jednoduchý programovací přípravek pro ATTINY48/85 (DIL8), ATTINY44/84 (DIL14) a také ATMEGA168/328 (DIL28). Ty Atmegy hlavně proto, abych mohl postavit nějaký ten Aduino projekt jako samostatný bez Arduina a třeba i bez Bootloaderu. Zapojení přípravku je následující:

Arduino ISP prog shield
Arduino ISP prog shield

Tři barevné LED slouží jako indikace funkce Arduina UNO jako ISP programátoru. Význam LEDek PROG a ERR je snad jasný. LEDka HB (HeartBeat) se periodicky pomalu rozsvěcí a zhasíná ve smylu imitace bijícího srdce. Je to užitečná kontrolka toho, že v Arduinu opravdu máme nahraný sketch ISP programátoru, který naleznete ve vývojovém protředí v menu File - Examples - ArduinoISP. LEDka ve schématu vpravo je univerzální kontrolka, díky které si můžeme ověřit činnost ISP programátoru i programovaného jednočipu. Stačí vzít z Examples - Basics program Blink a změnit číslo pinu s LEDkou na 3. Pin 3 jsem zvolil z toho důvodu, že u všech podporovaných procesorů je volný. Pin 3 je myšlen z hlediska číslování Arduina. Z hlediska DIL pouzdra se jedná pokaždé o jiný vývod, viz schéma zapojení a také níže přiložené PDF s pinouty podporovaných procesorů ATTINY a ATMEGA. Hotový shield je na následujících obrázcích:


Arduino ISP prog shield
Arduino ISP prog shield
Arduino ISP prog shield
Arduino ISP prog shield



Pinouty ATTINY a ATMEGA jako Arduino


Následující popis, jak uvedené ATTINY44/45/84/85 programovat se vztahuje k vývojovému prostředí 1.0.5-r2, které stále používám. Vím, že existují podstatně novější verze IDE, ale s touto jsem zatím nenarazil na žádný podstatný problém a nerad se šťourám ve věcech, které fungují (pokud vyloženě nechci:-)) Nicméně na to upozorňuji proto, že u novějších verzí může být postup trochu jiný. Nutno konzultovat s netem nebo netem:-) Do vývojového prostředí Arduina je potřeba nahrát podporu pro uvedené ATTINY. U mé verze stačilo nahrát adresář Hardware z níže uvedeného ZIPu do složky s Arduino projekty v Dokumentech. Nové procesory se pak objeví v menu Tools - Board. Nemusím snad zdůrazňovat, že v může být obsazená vždy jen a pouze jediná programovací patice, že ne:-)


ATTINY podpora

Zde je nutné zdůraznit, že z výroby jsou uvedené ATTINY naprogramovány na použití vnitřního oscilátoru 1MHz. Pokud byste chtěli používat interní takt 8MHz, je nutné nejprve nahrát Bootloader (Tools - Burn Bootloader) pro 8MHz. Z nabídky vybereme možnost třeba ATtiny85 (internal 8MHz clock) a v menu Tools klikneme na Burn Bootloader. Stejným postupem čip nastavíme zpět na frekvenci 1MHz. Nejedná se o klasický Bootloader, ale o přeprogramování interních fuse bitů ATTINY na požadovanou rychlost procesoru. Stejné je to i případě použití krystalu 20MHz, ale připojovat externí "šutr" na 8-pinový jednočip asi nebude nikdo... Když se pokusíte nahrát program přeložený pro 8MHz do ATTINY s vnitřními hodinami 1MHz, tak to normálně jde, ale veškeré čekací smyčky jsou 8x delší a běh programu tedy pomalejší, protože překladač předpokládá 8x rychlejší procesor. Když to uděláte naopak a kompilujete pro 1MHz a nahráváte do 8MHz čipu, bude vše 8x rychlejší. Ověřeno:-)

Při psaní programu (sketche) je nutné si uvědomit, že ATTINY podporuje jen vybrané příkazy z palety Arduino příkazů:

     pinMode()
     digitalWrite()
     digitalRead()
     analogRead()
     analogWrite() – tato funkce je použitelná jen u pinů s PWM
     millis()
     micros()
     delay()
     delayMicroseconds()
     shiftOut()
     pulseIn()

Pochopitelně nebudou fungovat ani již hotové knihovny funkcí, které využívají přikazy, jež ATTINY nepodporuje.

Máme-li hotový a zverifikovaný náš program pro ATTINY, přeneseme ho do čipu volbou File - Upload Using Programmer. Tedy nikoliv klasickou šipkou z IDE prostředí! Aby to fungovalo, musí být v UNU nahrán ISP programátor (File - Examples - ArduinoISP) a musí být zvoleno toto UNO jako programátor (Tools - Programmer - Arduino as ISP). Při programování vlastního UNA použijeme nejspíš volbu programátoru AVRISP_mkII. Během ISP programování svítí žlutá LED PROG. Ovšem na začátku krátce blikne i červená LED ERR. Toho si netřeba všímat. Pokud červená LEDka nezůstane svítit trvale, je programování úspěšné. Při programování ATTINY mi vývojové prostředí vždy vyhodí hlášku:

avrdude: please define PAGEL and BS2 signals in the configuration file for part ATtiny85
avrdude: please define PAGEL and BS2 signals in the configuration file for part ATtiny85

Na netu jsem nalezl, že nejlepší je ignorovat ji. Procesor se správně naprogramuje vždy.

V případě, že do programovacího shieldu vložíme ATMEGu 168/328, máme dvě možnosti. Za prvé do ní můžeme nahrát jen Bootloader volbou Tools - Burn Bootloader a tím si vlastně vytvoříme vlastní Arduino, do kterého je možné nahrávat programy po sériové lince. Nebo můžeme nahrát pouze samotný program bez bootloaderu volbou File - Upload Using Programmer. To je velice výhodné v případě, že máme odladěnou aplikaci a chceme ji dát do finálního výrobku a aktivace bootloaderu by nás akorát zdržovala a rozčilovala:-) Pro ATMEGy 168/328 není nutné dohrávat další podporu těchto procesorů, stačí zvolit příslušné Arduino Pro Mini 168/328 s krystalem 16MHz a jako programátor Arduino as ISP.

Při pokusech s programováním ATMEGA 328 jsem u svého IDE narazil na problém s verzemi P-PU a PU. Novější procesory 328PU totiž mají jinou "signaturu", než 328P-PU (který mám v UNU) a při pokusu o jeho naprogramování jsem obdržel hlášku:

avrdude: Device signature = 0x1e9514
avrdude: Expected signature for ATMEGA328P is 1E950F
Double check chip, or use -F to override this check.

K nápravě stačí otevřít soubor C:\Program Files\Arduino\hardware\tools\avr\etc\avrdude.conf najít v něm řetězec 0x1e 0x95 0x0F (nebo "ATMEGA328P"), nahradit jej řetězcem: 0x1e 0x95 0x14 a restartovat Arduino IDE. Hloupé je, že se to musí udělat pokaždé, když zaměníme procesor P-PU/PU. V novějších verzích IDE by toto již mělo být odstraněno a rozeznání signatur P-PU/PU je opraveno. Další možností je spouštět překladač z příkazového řádku s parametrem -F, ale to jsem nezkoušel.


Arduino ISP prog shield
Arduino ISP prog shield
Arduino ISP prog shield
Arduino ISP prog shield


Prvním projektem, který jsem postavil s malým jednočipem ATTINY85 byla klasická hrací hrací kostka.

A ještě poznámka na závěr: chystám se tyto malé jednočipy použít i na modelovém kolejišti, kde budou nezřídka řídit modelářská serva (přestavování výhybek, stahování závor, apod). Ovšem standardní Arduino knihovna Servo na těchto jednočipech nefunguje (chybí jim 16-bitový časovač, který knihovna využívá). Naštěstí existuje alternativní knihovna Servo8Bit, která asi bude více zatěžovat "výpočetní výkon" ATTINY, ale pro uvažované jednoduché projekty to vůbec nevadí. Knihovnu jem vyzkoušel a funguje v pohodě. Naleznete ji v ZIPu níže, vč. ukázkového programu. ZIP obsahuje složku servo8, kterou umístíme do Arduino složky v Dokumentech. Knihovna pracuje s procesory nastavenými na 1 i 8MHz. Jen je potřeba vždy dbát na to, abychom měli nastavenou správnou rychlost, odpovídající rychlosti, pro kterou program kompilujeme. Program lze při provizorním připojení serva otestovat přímo v programátoru.


ATTINY Servo8Bit

A ještě drobnost: doporučuji u příkazu myServo.attach vždy nastavit rozumné reálné hodnoty minimální a maximální délky servopulsu. Ty defaultní (544uS a 2400uS) totiž mohou některá klasická serva poškozovat najížděním na dorazy. Standardní hodnoty servopulsů kdysi bývaly 1000 - 2000uS, ale současná serva mívají zpravidla rozsahy větší. Chce to vždy vyzkoušet a hodnoty po krocích posouvat, než nalezneme dorazy. Nicméně všechna serva co jsem zkoušel, spolehlivě chodí od 800 do 2200uS. Toto doporučení platí i pro standardní Servo knihovnu.



BIG Arduino

Pokud byste se chtěli vydat opačnou cestou a potřebovali naopak větší počet pinů Arduina (a nechce se vám do MEGY), můžete se inspirovat u Martina Malého. Používá ATMEGU v DIL40 a k dispozici má až 31 volných pinů.



Předstabilizátor 9V (nejen) pro Arduino

A ještě malá odbočka k Arduinu UNO. Už dvakrát se mi podařilo odprásknout vestavěný stabilizátor napětí typu 1117. Maximální doporučené vstupní napětí tohoto stabilizátoru je 12V. Napětí typu "absolute maximum ratings" je 15V. Obojí není problém s nestabilizovaným adaptérem 9V a více přešvihnout a stabilík odpálit. Jelikož mám těchto adaptérů hafo a některé dávají naprázdno i 17V, postavil jsem si takový malý předstabilizátor se 7809 v základním zapojení. Vybavil jsem jej konektory 5,5/2,1 a používám hlavně pro Arduina. Nakonec jsem si jich postavil vícero. Opravdu se hodí. Na obrázku dole jsou dva exempláře. Ten třetí je jen dodatečný filtrační kondík, ale to už je zas k něčemu jinému...

Předstabilizátor pro Arduino
Předstabilizátor pro Arduino



PS...

Výše uvedený text ale neznamená, že se zříkám své oblíbené řady x51. Vůbec ne! Kdyby existoval 8 a 14 pinový klon s jádrem x51 a alespoň 2 analogovými vstupy, tak si o nějaké AVR nevopřu ani kolo:-)


RET



Odladěno na MS IE 8.0 a Firefoxu při rozlišení min. 1024 x 768 pixelů
www.NOSTALCOMP.cz    2010  -  2019