Hogyan süssünk AVR mikrokontrollert?

(Egyelőre csak AT90S1200, AT90S2313, ATtiny2313 és ATmega8 típusokra tesztelve)

Mi az a mikrokontroller? Miért éppen AVR?

Kinek ne lett volna olyan problémája, hogy valami primitív digitális áramkört kellett összeraktia gyorsan. Ilyenkor az ember vagy körülnéz a polcon porosodó SN74*** vagy más digitális áramkörcsalád meglévő tagjai között, vagy megveszi méreg drágán a kész áramkört, vagy pedig potom 400 Ft-ért (nagyságrendileg) beszerez egy mikrokontrollert, és felprogramozza.

A mikrokontroller nem más, mint egy komplett számítógép, aminek csak és kizárólag néhány perifériája van kivezetve. Na jó, lehet, hogy a mai GHz-es nagyságrendű órajellel menő 64-bites processzorokkal menő gépekhez képest túlzás a "számítógép" kifejezés egy 1-2 MHz-el menő áramkörre, amiben egy 8 bites processzor van, és pár 100 Byte memória gubbaszt mellette, ha egyáltalán van benne memória. Architektúráját tekintve viszont teljesen illeszkedik a Neuman által elképzelt rendszerre.

A nagy világban sok mikrokontroller létezik, mindegyikhez külön-külön égető és fejlesztőeszköz tartozik. Általában egy égető beszerzése nem olcsó mulatság, csak akkor érdemes, ha sorozatban gyártunk valamit, vagy nagyon elszánt "hobby-elektrobűvészek" vagyunk. Az Atmel által fejlesztett AVR architektúra esetén sincs ez másképp. Fejlesztőeszköznek az AVR Studio-t ajánlják, ami ingyenesen letölthető, de kizárólag Windows alatt fejleszthetünk vele. Az égetőt is meg lehet venni, ami nagyságrendileg 20 000 Ft-os beruházás.

Hohó! Ennyire nem szomorú a helyzet. Az AVR architektúra esetén léteznek más fejlesztői eszközök is, pl. tavrasm, avr-gcc (mellesleg ezt hasztálja az AVR Studio is), amelyek UNIX alatt is mennek. Hurrá, tudunk a megszokott UNIX-os környezetben fejleszteni, már csak rá kell égetni a programot a chip-re...

Az égető hardver

Mint azt lent látni fogjuk, az égetéshez gyakorlatilag nem is kell hardver, elég a párhuzamos port 3 drótját bekötni a megfelelő helyre, és kész a "kis feszültségű" írónk.

Ezzel az írási móddal azonban nem tudunk mindent megoldani. Vannak bizonyos speciális bitek (fuse bits, lock bits), amiket csak "nagy feszültségű" íróval lehet állítani. Ide tartozik a beépített RC oszcillátor ki-be kapcsolása.

A "nagy feszültségű" írás attól nagy feszültségű, hogy a mikrokontroller RESET lábára 12V-ot kell kapcsolni. Az égetőhöz kell egy egyszerű tápegység, ami ad nekünk 12V-ot, és egy kis illesztőáramkör, amivel tud kommunikálni a PC.

Egy ilyen illesztőáramkört a fent leírt okok miatt a legegyszerűbben és legolcsóbban egy mikrokontrollerrel tudunk megvalósítani. Erre az AT90S1200-at választottam. Ez teljesen kompatibilis az AT90S2313-mal és az ATtiny2313-mal.
Az elvi kapcsolási rajz itt látható:

A párhuzamos port 8 adatbitje egy az egyben hozzá lett kötve az égetendő mikrokontroller adatportjára (AT90S1200 esetn PortB). Itt fog megjelenni a megfelelő cím- vagy adat-byte. Valahol vezérelni is kell a vezérlő mikrokontrollert is, így az első 2 adatbit a vezérlő IC-hez is hozzá lett kötve. Az, hogy ugyanazon vezetékeken egyszer az égetendő, egyszer pedig vezérlő IC-nek szóló jel jelenik meg, nem okozhat gondot, ugyanis a vezérlő IC mindig tudja, hogy éppen mi van az adatkábeleken, az égetendő IC-nek meg csak akkor ad órajelet a vezérlő IC, amikor éppen neki szóló byte van beállítva. (Ez persze csak akkor igaz, ha a vezérlő IC-be égetett program illeszkedik a meghajtóprogramhoz.)

Hogy az IO lábakat pontosan hogy kötjük be, azt programból könnyű beállítani, ezért nem arra törekedtem, hogy az 1-es bit az aktuális port 1-es bitjére kerüljön, hanem arra, hogy a nyák ne legyen nagyon kusza. Az általam készített nyák egy egyszerű egy oldalas nydák, házilag fotolakkos vagy vasalós technikával elkészitheto. Igénytelenebbek alkoholos filctollal is kísérletezhetnek. Íme a nyákrajz:
avrburn_nyak-1.0.0.fig
avrburn_nyak-1.0.0.pdf
avrburn_nyak-vasalo-1.0.0.pdf
Ez utóbbi nyákrajz a "vasalós" technikához készült, vagyis a tényleges nyák fordítottját látjuk a pdf fájlban. Ha ezt kinyomtatjuk lézernyomtatóval és rávasaljuk a nyers nyáklapra, akkor éppen jó lesz. Ajánlatos vasalás után alkoholos filctollal átrajzolni ,,lyukak'' számának csökkentése érdekében.

Ahhoz, hogy tényleg meg tudjuk építeni, szűkségünk van a páruhamos port bekötésére, ez itt van: parport.html

A vezérlő program

Mind a mikrokontroller programja, mind a vezérlőprogram több, mint valószínű, hogy idővel változni fog. Az egyidőben letölthető változatok működnek együtt, de a különböző alverzióhoz tartozók nem! A jelenlegi verzió a 1.0.0-beta1 (ez a 1.0.* verziójú mikrokontroller programokkal megy együtt). Ha a főverzió is változik, akkor valószínűleg a hardveren is kell változtatni.

Itt tölthető le a jelenlegi vezérlőprogram:
avrburn-1.0.0-beta1.tar.gz
A forrás tartalmazza a mikrokontroller kódjának forrását továbbá a nyákrajzokat és a kapcsolási rajzot is.

Használat

Ha lefordítottuk (make) és feltelepítettük (make install), érdemes megnézni a -h kapcsoló hatására kiírt help menüt. A program a megadott file-ból, vagy a standard input-ról beolvasott bináris adatot írja fel a mikrokontrollerre. A bináris formátum byte sorrendje "little endian" azaz a kisebb helyiértékű byte van elöl. Ilyet generál a tavrasm is (-b kapcsolóval).

Mivel nem minden AVR mikrokontrollernek egyezik meg az írási módja, meg kell adnunk egy típust is a -t kapcsolóval. Ajánlatos a -e kapcsolót használni, ekkor törli is a mikrokontrollert az írás előtt.
Pl.:
avrburn -t atmega -e prog.bin

Tyúk, vagy tojás?

Igen. Ahhoz, hogy meg tudjuk építeni az AVR égetőt, szűkségünk van egy AVR égetőre. Ez az ellentmondás úgy oldható fel, hogy nem csak "nagy feszültségű" író létezik hozzá, hanem "kis feszültségű" is. Ehhez nincs szűkség 12V-os tápfeszültségre, elég egy 5V-os feszültség is, amit akár a párhuzamos portról is le lehet szedni. Mint azt fent említettem, ezzel az íróval viszont csak a programot lehet beégetni, a speciális biteket nem lehet vele állítani.
Az éget hardverben nem használtuk ki a specilis biteket, így ez tökéletesen elegendő ahhoz, hogy az égető mikrokontrollert felprogramozzuk. Nem véletlen tehát, hogy a párhuzamos port D0 és D1 bitje éppen a 17-es és 19-es lábra csatlakozik, illetve egy jumper segítségével a RESET (1-es) lábát földre tudjuk kötni. Az égeto hardver ,,firmware''-jét bármikor (bármely verzióból) frissíteni tudjuk soros írással (lásd ,,serial downloading'' szakasz az AVR dokumentációban). Ehhez root felhasználóként kell indítani a programot a --update-firmware kapcsolóval. A soros írás több, mint 10 percig is eltarthat, legyünk türelemmel!
A soros írás során nem kapunk visszajelzést a párhuzamos portról, hogy a hardver kiolvasta-e a leguujabb byte-ot (BUSY, ACK), így nem tudunk közvetlenül a /dev/lp0-ra írni. Az írás során közvetlenül a hardvert piszkáljuk (0x378-as port), amihez nem lehet megkerülni, hogy root jogosultsággal indítsuk a programot.

Az eredmény


Figyelem! Ez nem követendő példa! A 220V-ot tiszteletben kell tartani. Illene egy ilyen fém házat rákötni a védőföldre. Ezen kívül melegen ajánlott a jumpereket kitenni házon kívülre (pl kapcsoló formában), hogy ne a 220V mellett kelljen babrálni.