Bystroushaak's blog / Czech section / Hardware / Jak na programy z Arduina v ATmega8 bez bootloaderu

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

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 :).

Become a Patron