Programování obvodu lze zajistit různými způsoby. Kromě hardwarového programování (SPI, JTAG, paralel) existuje i softwarové programování pomocí programového zavaděče (bootloaderu). Bootloader je část kódu umístěná v horní části programové paměti, která má za úkol přijímat kód a zapisovat jej do dolní části programové paměti. U softwarového (vnitřního) programování je podnět k přepsání programové paměti nebo pojistek dán provedením speciální instrukce. Kód, který chceme nahrát do programové paměti, musí být odněkud získán - narozdíl od hardwarového programování (kde jsou pevně určeny vodiče a protokol) lze použít libovolný prostředek mikrokontroléru (sériová linka, USB, SPI, TWI nebo vlastní rozhraní). Běžící program tedy může například při startu nebo pravidelně za běhu kontrolovat, zda je k dispozici nová verze softwaru, provést její nahrání do programové paměti a spustit ji.
Existuje řada hotových zavaděčů, avšak naprogramování vlastního zavaděče není obtížné. Věnujeme-li čas na pochopení funkce bootloaderu a na jeho naprogramování, můžeme si být do budoucna naprosto jisti tím, jaké operace procesor vykonává, ke kterým periferiím přistupuje a jak dlouho programování probíhá. U aplikací, jako je USB, je nezbytně nutné znát přesný stav procesoru a periferií. Nedbalým naprogramováním bootloaderu může po jeho činnosti vzniknout řada pozůstatků - povolená přerušení, nastavené směry portů a jiné skutečnosti, které pak způsobují nepředvídané a mnohdy špatně odhalitelné chyby ve vlastním programu.
Bootloader pro ATmega128
U procesorů s malou programovou pamětí (do 16kB) je možné bez podstatných potíží používat pouze sériové programování (např. PonyProgem) a bootloader úplně vynechat. Avšak u ATmega128 je sériové programování natolik zdlouhavé, že se bootloader použít musí. Sériový programátor se tedy použije pouze jednou (na nahrání bootloaderu).
Pro komunikaci se zavaděčem jsem zvolil sériovou linku. Po startu procesoru se čeká přibližně dvě sekundy na příjem znaku po sériové lince. V případě, že ke komunikaci nedojde, zavaděč ukončí svou činnost a předá řízení hlavnímu programu. Pokud počítač pošle programovací data, bootloader začne postupně přeprogramovávat programovou paměť. Po úspěšném dokončení se nastaví indikace a bootloader čeká na externí reset.
Formát dat
Zavaděč očekává, že mu počítač pošle po sériové lince programovací HEX soubor (výstup AVR Studia). Přijatý soubor naparsuje a po pevně daných blocích data zapíše do programové paměti. Tento mechanismus používá standardní vstupně-výstupní operace DOSu a tudíž není nutno tvořit extra program pro zápis na sériovou linku.
Parametry sériové komunikace:
Bitrate:
19200 baud
Počet datových bitů:
8
Parita:
lichá
Počet stop bitů:
1
Handshake:
přijímač nastavuje CTS, pokud je schopen přijímat. Počítač nesmí vysílat, pokud je CTS neaktivní. počítač nastavuje DTR (nepovinné)
přijímač spojuje DTR s DCD a DSR (nepovinné)
komunikace je jednosměrná - počítač má RTS nastaven stále
Dávka (.bat, skript) pro DOS a Windows 9x, která odešle soubor po sériové lince (parametrem je název projektu):
MODE COM1:BAUD=19200 PARITY=e DATA=7 STOP=2 rts=on
type d:\design\%1\%1.hex
type d:\design\%1\%1.hex >> COM1
Dávka (.bat, skript) pro Windows XP:
MODE COM1:BAUD=19200 PARITY=e DATA=7 STOP=2 rts=on odsr=off octs=on idsr=on to=on
type d:\design\%1\%1.hex
type d:\design\%1\%1.hex >> COM1
Ve Windows XP se kromě základních parametrů musí také specifikovat zapnutí obvodů hanshakingu. Příkazová řádka vyvolaná příkazem cmd není totožná s příkazovou řádkou command.
cmd
Microsoft Windows XP [Verze 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
command
Microsoft(R) Windows DOS
(C)Copyright Microsoft Corp 1990-2001.
Windows XP data odešlou, ale bootloader skončí s chybou. Bližší zkoumání je nutné teprve provést. Chyba je pravděpodobně způsobena ignorováním některého z nastavených parametrů (citlivost na CTS, parita, počet bitů).
Pinout
Pro převod úrovní RS-232 na TTL je použito zařízení s obvodem MAX232. Výzor zařízení je podobný SI-progu, neboť se také jedná o převodník zabudovaný do konektoru DB9 sériové linky a výstupním headerem 5x2 pinů (obr. 1).
Pinout je odvozen od portu E, směr je vyznačen z hlediska přijímače (AVR):