Jak na programy z Arduina v ATmega8 bez bootloaderu
V tomto blogpostu jsou popsány dvě věci - jak použít Arduino jako programátor pro rodinu AVR a jak použít programy z Arduina v ATmega8-16PU bez nutnosti bootloaderu a dalších opičin.
Arduino mám už nějaký ten pátek a musím říct, že je to skvělá věc. Stovky knihoven, jednoduché, přesto mocné a snadno pochopitelné API, zabudovaná podpora USB, příjemné, multiplatformní IDE .. co víc si přát? Jediný jeho "problém" je cena. Přeci jen stojí nemalé peníze a tak není úplně optimální ho zabudovávat do projektů na trvalo.
Naštěstí existuje způsob, jak tento problém odstranit - nepoužívat celé Arduino, ale jen samotný čip s regulátorem napětí. Je jasné že přijdete o možnost komunikace s počítačem, ale to se mi nezdá jako nevýhoda - předpokládám že na Arduinu program ozkoušíte a pak ho již funkční vpálíte do standalone ATmegy. Doma se mi už delší dobu válí pár ATmega8-16PU ještě z doby kdy stály cca 70kč, takže to budu demonstrovat na nich. Pokud je nemáte, můžete klidně použít jejich novější verzi - ATmega88, nebo něco výkonnějšího.
Jak na to?
Celý postup se dá rozdělit do těchto kroků:
I. Zapojení podle schématu
Na začátku je zapotřebí zapojit obvod podle následujícího schématu:
II. Upload programátoru do Arduina
Dál následuje přeměna Arduina na programátor. Jedná se o velice jednoduchý krok - stačí si stáhnout mega-isp sketch. Poté co jej flashnete do Arduina se z něj stane primitivní, ale pro naše účely postačující programátor.
III. Změna konfiguračního souboru
Protože Arduino IDE normálně používá jiné čipy, je zapotřebí mu sdělit že chceme kompilovat pro náš mikroprocesor. Ve složce arduino-00{V}/hardware/arduino (kde {V} je současná verze, v době psaní článku 22) najdete soubor boards.txt. Otevřete ho a přidejte na konec cosi jako:
atmega8noxtal.name=ATmega8-noxtal @8MHz
atmega8noxtal.upload.protocol=stk500
atmega8noxtal.upload.maximum_size=7168
atmega8noxtal.upload.speed=38400
atmega8noxtal.bootloader.low_fuses=0xe4
atmega8noxtal.bootloader.high_fuses=0xc4
atmega8noxtal.bootloader.path=atmega8_noxtal
atmega8noxtal.bootloader.file=ATmegaBOOT.hex
atmega8noxtal.bootloader.unlock_bits=0x3F
atmega8noxtal.bootloader.lock_bits=0x0F
atmega8noxtal.build.mcu=atmega8
atmega8noxtal.build.f_cpu=8000000L
atmega8noxtal.build.core=arduino
Povšiměte si hlavně řádek s parametry build.f_cpu a build.mcu, kam dosaďte frekvenci na které váš čip poběží (8000000L je vhodné pro interní oscilátor) a vámi používaný čip (parametr je pro avr-gcc, najdete ho v manu). Upravený soubor uložte.
IV. Kompilace programu
Spusťte IDE. V záložce Tools/Boards se vám objevila nová deska (ATmega8-noxtal @8MHz) - vyberte jí.
Nyní si něco naprogramujte, můžete použít třeba základní sketch z File/Examples/Basics/Blink, nezapomeňte však na potřebný výstup připojit diodu. Já jsem použil toto:
#define LEDPIN 8
void setup(){
pinMode(LEDPIN, OUTPUT);
}
void loop(){
digitalWrite(LEDPIN, HIGH); // sets the LED on
delay(1000); // waits for a second
digitalWrite(LEDPIN, LOW); // sets the LED off
delay(1000); // waits for a second
}
Nyní program zkompilujte kliknutím na ikonu šipky v levo nahoře. Nepokoušejte se program uploadnout, nevložil by se do čipu, ale do Arduina!
V. Upload
Doufám že máte nainstalované avrdude, pokud ne, nainstalujte si ho.
Další část je poněkud .. nečistá. Otevřete si /tmp a najděte složku se jménem začínajícím na build. Nezavírejte během toho IDE, jinak se smaže. Otevřete si v ní konzoli a zadejte příkaz
avrdude -C /etc/avrdude.conf -p m8 -c avrisp -b 19200 -P /dev/ttyUSB0 -U flash:w:`ls *.hex`
Za m8 dosaďte váš čip dle manuálu avrdude.
bystrousak@kitakitsune:/tmp/build5859820408225631991.tmp$ avrdude -C /etc/avrdude.conf -p m8 -c avrisp -b 19200 -P /dev/ttyUSB0 -U flash:w:`ls *.hex`
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.12s
avrdude: Device signature = 0x1e9307
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "AtMega8_sigle_blink.cpp.hex"
avrdude: input file AtMega8_sigle_blink.cpp.hex auto detected as Intel Hex
avrdude: writing flash (812 bytes):
Writing | ################################################## | 100% 1.27s
avrdude: 812 bytes of flash written
avrdude: verifying flash memory against AtMega8_sigle_blink.cpp.hex:
avrdude: load data flash data from input file AtMega8_sigle_blink.cpp.hex:
avrdude: input file AtMega8_sigle_blink.cpp.hex auto detected as Intel Hex
avrdude: input file AtMega8_sigle_blink.cpp.hex contains 812 bytes
avrdude: reading on-chip flash data:
Reading | ################################################## | 100% 1.46s
avrdude: verifying ...
avrdude: 812 bytes of flash verified
avrdude: safemode: Fuses OK
avrdude done. Thank you.
bystrousak@kitakitsune:/tmp/build5859820408225631991.tmp$
Co dělat když to nejde
Pokud se vám stane, že avrdude vypisuje cosi jako
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.12s
avrdude: Device signature = 0x000000
avrdude: Yikes! Invalid device signature.
Double check connections and try again, or use -F to override
this check.
avrdude done. Thank you.
neklesejte na mysli a zkontrolujte zapojení drátů - tahle chyba typicky nastává pokud dráty nemají kontakt, čip je zablokovaný (teba jste v minulosti použili špatné fuse), nebo vypálený.
Odkazy
- Piny - porovnání pinů ATmega8 s označeními použitými v Arduinu
- Atmega Standalone - nějaká ta teorie, ovšem zdaleka ne všechna
- Programming an atmega with the Arduino IDE - odsud jsem kdysi získal inspiraci
- kitakitsune.org - něco pro zlepšení SEO :P
Závěr
Jedná se o poměrně užitečnou schopnost IDE, protože kdo někdy zkusil programovat AVR v čistém C, určitě mi dá za pravdu že programovat Arduino je mnohokrát jednodušší a komfortnější. Doufám že tento blogpost pomůže těm kteří by to sami nezvládli a ukáže možnost těm, které to nenapadlo.
Na závěr bych rád poděkoval AsciiWolfovi, že mě svými dotazy donutil tohle sepsat :).