Portál AbcLinuxu, 26. dubna 2024 17:01

Jednočipy pod Linuxem - I

18. 12. 2003 | Jan Martínek
Články - Jednočipy pod Linuxem - I  

Nový tutoriál vás naučí programovat (pod Linuxem) v jazyce C jednočipové mikropočítače firmy Atmel.

Pod pojmem jednočipový mikropočítač se obvykle rozumí součástka (integrovaný obvod, brouk), která obsahuje téměř všechny obvody nutné pro samostatný běh interního programu. Jednočipový mikropočítač tedy obsahuje procesor, paměť a vstupně-výstupní obvody. Jednočipových mikropočítačů je na trhu celá škála. Liší se zejména taktovací frekvencí, architekturou, velikostí paměti RAM, velikostí paměti FLASH (pro uložení kódu programu), velikostí paměti EEPROM (nemusí být vůbec žádná), vybavením různými periferiemi (čítače, časovače, AD převodníky, komparátory, sériový port, atd.), spotřebou proudu a dalšími parametry.

Smysl jednočipových mikropočítačů spočívá v ovládání jednoduchých věcí, uživatelský interface představuje nejčastěji zkratování nožiček či rozsvícení LEDky, takže jejich parametry mohou být nesrovnatelně horší než u stolních počítačů. Ale neopovrhujte jimi - jejich výhodami jsou nízká cena, jednoduchost a nízká spotřeba.

Jednočipové mikropočítače vyrábí mnoho firem, z nichž nejznámnější (nikoliv jediné) jsou čipy Atmel a PIC. Vyznavači jednotlivých firem mezi sebou neustále vedou nekonečné hádky, které jednočipy jsou lepší, které se lépe programují, které lépe chutnají či hoří a vůbec. Doufám, že nikoho neurazím, když se v tomto článku budu věnovat čipům firmy Atmel.

I od firmy Atmel pochází mnoho typů obvodů, jejichž zevrubný popis by byl velmi zdlouhavý. Soustředím se pouze na to, s čím mám praktické zkušenosti, a to jsou obvody

Obvod AT89C2051 lze zakoupit za necelých 50 Kč a dostanete za to procesor s CISC architekturou pracující až do frekvence 24 MHZ, 2KB FLASH (tam se zapisuje kód programu), 128 bytů RAM, sériový port, 15 vstupně-výstupních pinů a dva šestnáctibitové čítače/časovače. Zpracování jedné instrukce trvá nejméně šest hodinových tiků.

Obvod AT90S2313 stojí trochu víc, asi 70 Kč a procesor pracuje do 10 MHz. Patří do řady, kterou výrobce označuje jako AVR. Je to architektura RISC a zpracování instrukce trvá většinou pouze jeden tik, takže procesor je ve výsledku výrazně rychlejší, než dříve zmíněný AT89C2051. Čip dále obsahuje 2KB FLASH, 128 bytů EEPROM, 128 bytů RAM, a jeden osmibitový a jeden šestnáctibitový čítač/časovač. V počtu IO pinů, RS 232 rozhraní (sériový port) a komparátoru se čipy neliší. Za tu dvacku navíc však získáte obrovskou, opakuji OBROVSKOU výhodu - pro přeprogramování čipu nepotřebujete žádný zvláštní obvod (programátor), a navíc jej můžete přeprogramovat přímo za běhu. Nemusíte jej kvůli změně programu ani vytahovat z patice.

Pro oba čipy platí, že jestliže pouze připojíte napájecí zdroj, nebude se navenek vůbec nic dít, protože nejsou připojeny žádné výstupní periferie. Ba dokonce se nebude nic dít ani uvnitř, a to z toho důvodu, že čip neobsahuje žádný zdroj hodin (clock), taktů čili tiků, takže neprovádí instrukce. Nicméně pro hodiny má vyveden vstup - XTAL1 (pin č.5). Uzemníte-li drátkem tento vstup a pak ho naopak připojíte na +5V a pak ho zase uzemníte a tak pořád dokola, začnou se líně vykonavát instrukce. To je sice postup možný, ale velmi nepraktický, proto je vhodnější tuto práci svěřit krystalu. Krystal se připojuje na vývody XTAL1 a XTAL2 a každý vývod se ještě přes kondenzátor o kapacitě cca 30pF spojí se zemí. Schéma tedy vypadá následovně:

Krystal můžete připojit jakýkoli až do maximální frekvence, kterou zvládá čip. Pro čip AT90S2313 vřele doporučuji použít krystal o frekvenci 9.216 MHz, protože tuto frekvenci lze celočíselně vydělit tak, že dostanete pro sériový port některou ze standardních přenosových rychlostí. Ale o sériovém portu až příště. Ještě jedna poznámka ke krystalu - připlaťte si desetikačku a kupte si přesnější variantu. Vyplatí se to, až třeba budete programovat hodiny reálného času.

Takže teď už program v jednočipu běží. Jaký program? Ten, co tam zrovna je. Cílem tohoto článku je ukázat způsob, jak právě váš program nasypat do jednočipu.

Zdroják pro program se píše na klasickém počítači, tam se i kompiluje a binárka se poté přelije do jednočipu.

Výsledkem kompilace je buď přimo binárka nebo soubor ve formátu Intel HEX. Intel HEX je v podstatě taky zápis binárky, ale pomocí ASCII hexadecimálně zapsaných hodnot a ještě čehosi, ale zkrátka je to textový soubor. Smysl jeho existence jsem nepochopil, ale tento formát už v oblasti jednočipů patří ke koloritu. Naštěstí je možné jej zkonvertovat do binárky pomocí programu makebin případně hex2bin.

Výslednou binárku je potřeba nějakým způsobem dostat do jednočipu. K programování obvodu AT89C2051 je potřeba za několik set až tisíc korun zakoupit tzv. programátor. Při každé změně kódu je nutné vytáhnout čip, zasunout do patice programátoru, nalít nový program, a opět čip přemístit zpátky. Komunikační protokol pro ovládání daného typu programátoru navíc bývá proprietární záležitost.

Anebo si kupte AT90S2313, který je o chlup dražší, ale je s ním podstatně veselejší práce. Ještě poslední zmínku o řadě AT89 - abych jen nezatracoval - existuje ještě AT89C4051, který má dvakrát tolik paměti pro program (4KB) a stojí asi 60 Kč. V dalším popisu se budu věnovat pouze AT90S2313.

Teď přijde na řadu "programátor". Využijeme zde paralelního portu, jehož piny připojte na piny jednočipu podle této tabulky:

piny jednočipu piny paralelního portu
SCK (19) Strobe (1)
MISO (18) Busy (11)
MOSI (17) D0 (2)
Reset (1) Init (16)
GND (10) GND (18)

V závorce je uvedeno číslo pinu. K přeprogramování tedy potřebujete pět drátků a konektor (samec) do paralelního portu. K čipu musí být připojeno napájení a krystal (přes ty dva cca 30pF kondenzátory, jak je popsáno výše). Takže celkové schéma bude vypadat následovně:

Krása hotového obvodu vás jistě donutí k slzám:

Budete tedy potřebovat následující součástky:

V seznamu součástek jsem zmínil nepájivé kontaktní pole, které se může zdát zbytečné, ale rozhodně si ho za nekřesťanských 150 Kč kupte. Připravte se na to, že v obvodu budete každou chvíli provádět nějakou změnu a neustálé pájení drátků by vás brzy dokonale znechutilo. Jestliže nemáte napájecí zdroj 3-5 V, kupte si obvod LM78L05 (což je napěťový stabilizátor na 5 V) a vykšeftujte ve vietnamské tržnici libovolný adaptér, k němu si kupte konektor coby protikus, hasící přístroj a zapojte takto:

Pro jistotu uvádím rozmístění vývodů u obvodu LM78L05:

Na nepájivém kontaktním poli to může vyhlížet třeba takhle (omlouvám se, na fotce je omylem trochu jiný kondenzátor):

Až se vám vše podaří pospojovat dohromady, podívejte se na stránku projektu AVR Cross Development Kit, který se zabývá programováním jednočipů AVR a stáhněte si a nainstalujte alespoň tyto balíčky:

Dále zkuste napsat

uisp -dlpt=/dev/parport0 -dprog=dapa -v=4

a jednočip by se měl takto nadetekovat:

Reset inactive time (t_reset) 1000 us
AVR Direct Parallel Access succeeded after 31 retries.
Vendor Code: 0x1e
Part Family: 0x91
Part Number: 0x01
Atmel AVR AT90S2313 is found.
Page Write Disabled
FLASH Write Delay (t_wd_flash): 11111 us
EEPROM Write Delay (t_wd_eeprom): 11111 us

Pokud místo toho dostanete hlášku

Reset inactive time (t_reset) 1000 us
AVR Direct Parallel Access failed after 32 retries.
Vendor Code: 0xff
Part Family: 0xff
Part Number: 0xff
An error has occurred during the AVR initialization.
* Target status:
Vendor Code = 0xff, Part Family = 0xff, Part Number = 0xff

Segmentation fault

něco je špatně se zapojením. Toho Segmentation fault si nevšímejte. Jestliže příkaz vyplivne nějakou jinou chybu, zkotrolujte práva na /dev/parport0 a také to, jestli máte k dispozici moduly pro paralelní port:

Pokud se obvod způsobně ohlásí, máte protentokrát vyhráno. Příkazem

uisp -dlpt=/dev/parport0 -dprog=dapa --erase

můžete kód v čipu smazat. Smazání čipu znamená nastavení všech bitů na jedničku. O tom, že jsou v čipu samé jedničky, se lze přesvědčit takto:

uisp -dlpt=/dev/parport0 -dprog=dapa --download

Příkaz by měl vypsat obsah paměti čipu na standardní výstup. Je to bohužel v Intel HEX formátu. Uvidíte, že každý řádek má jakousi hlavičku, po které následují data, a na konci každého řádku je zase cosi. Popis formátu je uveden například zde, kdyby to snad někoho zajímalo. Z výpisu lze však vytušit, že čip je opravdu prázdný a obsahuje samé FF.

Prozatím nebyl výsledek snažení nijak závratný, ale příště bude řeč o vytvoření fungujícího kódu. Jestli to myslíte s programováním jednočipů vážně a zrovna se chystáte do obchodu na nákup součástek, připište si do seznamu ještě

Běžte si to všechno koupit a možná se příště dozvíte, co s tím ;-)

Související články

Jednočipy pod Linuxem - II
cfIDE: Compact Flash přes IDE

Odkazy a zdroje

Intel Hexadecimal Object File
AVR Cross Development Kit
LM78L05 Product Folder
AT89C2051
AT90S2313

Další články z této rubriky

HW novinky: podzimní přehled #2
HW novinky: podzimní přehled #1
HW novinky: návrat skleněných ploten v HDD
HW novinky: PCI Express 4.0 prý ještě letos
HW novinky: i Skylake-X s 12 jádry používá levnou teplovodivou pastu

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.