Bootloader pro ATmega8 board

Tento text popisuje, kterak jsem rozchodil avr109 bootloader (Atmel application note, původní zdrojáky) na všemi milované ATmega8 desce. Při popisu vycházím ze svého původního textu v angličtině na http://artax.karlin.mff.cuni.cz/~isa_j1am/projects/bootloader-for-atmega8-board/.

Upozornění na úvod: Ti, kteří mají vlastní desku s Atmelovým procesorem, mohou se zde dozvědět pár zajímavostí. Nejlépe ale učiní, když se přiučí, a pak provedou úpravu původních zdrojáků podle vlastní potřeby.

Proč vůbec bootloader?

Protože hardwarové programátory už nestačí. Dosud jsme používali převážně programátory na paralelní port. Jak ale ukázal nejen letošní český Eurobot, paralelních portů není na noteboocích nazbyt. Dosud jsem tento problém řešil pomocí dasa programátoru, který jsem věšel na USB-RS232 redukci. Odstranění uisp z FreeBSD portů a nefunkčnost s avrdude (možná připad mého konkrétního hw) mě také odstranila od korýtka. Nezbyla mi možnost, jak nahrávat nové programy. Bootloader nabízí možnost svého nahrátí z klidu a jistoty domácího desktopového PC s následným jednoduchým nahráváním nových programů přes sériovou linku (ke slovu opět může přijít konvertor USB-RS232).

Proč zrovna avr109?

Potřebuji něco, co bude fungovat s různýmy operačními systémy, které potkávám (FreeBSD, Linux, Windows). Tahle podmínka vyřazuje ze hry bootloadery jako třeba MegaLoad. V podstatě zůstávají ve hře jen bootloadery odvozené od STK500 a avr109. Z několika STK500 bootloaderů se mi nepodařilo žádný zprovoznit, kdežto avr109 mi po několika pokusech funguje.

Jak to rozchodit?

Programátor

Ponejprv, hardwarový programátor je pro nahrátí bootloaderu do procesoru stále potřeba. Kdo ho nemá, nechť si nějaký pořídí.

Nastavení a kompilace

Používám Gcc větev původního zdrojového kódu překládanou pomocí avr-gcc s avr-libc. Tato větev je sice přednastavena pro ATmega128, ale to lze snadno změnit. Balíček se zdrojáky obsahuje soubor preprocessor.xls, který je k tomu určen (Varování: Obsahuje makra; Zkušenost: Funguje to i s OpenOffice.org). Podle návodu na první záložce jsem na druhé záložce změnil typ zařízení na _ATMEGA8 a velikost bootloaderu na _B1024. Starší desky byly šířeny s nastavením rychlosti na 1MHz. V takovém případě se patří změnit CPU_FREQ na 1000000. Novější desky jsou již nastaveny na 8MHz. Pak je potřeba použít hodnotu 8000000. Používám baudrate nastavenou na 4800 baudů, protože s vyššími rychlostmi mám potíže. Doporučuji ušetřit si problémy a udělat to samé.

Makra v tabulce vygenerují na základě zadaných parametrů obsah hlavičkového souboru. Tento text je potřeba vložit do souboru defines.h.

Pro kompilaci bootloaderu stačí napsat make v příslušném adresáři.

Nahrátí bootloaderu do procesoru

Tady moc nepomůžu, protože tohle silně závisí na kombinaci hardware a software. Doporučuji věnovat pozornost přednastavené metodě v Makefile. Mně stačilo změnit AVRDUDE_PROGRAMMER na dasa (to je ta věc, kterou používám) a AVRDUDE_PORT na /dev/ttyUSB0 (protože jsem zrovna použil svůj převodník). Pak jsem naťukal make program, chvíli počkal a bylo to.

Nastavení pojistek (fuses)

ATmega potřebuje vědět, že se po ní chce podpora bootloaderu a kde ho najde. To první se dozví přenastavením nejnižšíh bitu horní pojistky (BOOTRST) na 0 (z defaultní hodnoty 1). Kde bootloader najít se dozví přes jeho velikost zadanou pomocí dvou vyšších bitů (BOOTSZ0 a BOOTSZ1). Pro velikost, kterou jsem zvolil při konfiguraci, by měly oba tyto bity mít hodnotu 0. To mi dohromady dává hodnotu vyšši pojistky 0xD8. Následující příkaz tuto hodnotu nastaví (opět pro moji dasu a /dev/ttyUSB0):

avrdude -p m8 -c dasa -P /dev/ttyUSB0 -U hfuse:w:0xD8:m

Kdo neví, nebo by chtěl změnit rychlost desky, měl by si nastudovat bity CKSEL0 ... CKSEL3 v dolní pojistce.

Nahrátí nového programu pomocí bootloaderu

Nejprve je potřeba stáhnout pin PD4 (stisknout tlačítko, zasunout startovací kabel, nebo jinak), a potom pustit desku. Nyní bootloader čeká na další pokyny přes sériový port. Pro nahrátí nového kódu používám následující přikaz:

avrdude -p m8 -c avr109 -b 4800 -P /dev/ttyUSB0 -U program.hex

Úpravy

Původní verze bootloaderu se spustí, podívá se na pin PD4, a pokud je tento pin stažený, čeká na nový kód. V opačném případě pokračuje běh "skutečným" programem. Naštěstí právě PD4 používáme pro startovací kabel Eurobotích robotů. Proto jsem toto nastavení neměnil. Když zasunu startovací kabel před spuštěním desky, očekává bootloader nový kód. Když nejdříve pustím desku, spustí se soutěžní kód, který může např. čekat na zasunutí startovního kabelu.

Běhěm rozhýbávání bootloaderu jsem narazil na zádrhel (baudrate). Z tohoto důvodu chápu lidi, kteří si do bootloaderu přidávají LED signalizaci. Udělal jsem to samé. ATmega8 board je přesně pro tyto účely vybaven LEDkou na PB0 (je to ta červená). Přidal jsem její použití do kódu bootloaderu. A to je přesně ten důvod, proč nedoporučuji používat moji variantu kódu na něco jiného než na ATmega8 board. Moje úpravy je možné najít hledáním řetězce status LED v souboru main.c. Když se bootloader spustí, rozsvítí červenou LEDku. Když skončí, přebírá kontrolu nahraný kód, který touto diodou typicky bliká.

Download

BootloaderProATmega8Board (naposledy editoval localhost dne 2009-12-27 18:41:42 )