Obsah
1. Vývojové nástroje pro osmibitové mikrořadiče PIC
2. Sada vývojových nástrojů gputils
3. Příklad použití nástrojů gputils
5. Vývoj aplikací pro mikrořadiče ve Forthu
8. Základní vlastnosti PBasicu
1. Vývojové nástroje pro osmibitové mikrořadiče PIC
V předchozích třech částech seriálu o architekturách počítačů jsme se seznámili se dvěma základními rodinami osmibitových mikrořadičů PIC firmy Microchip Technology. Jednalo se o minimalisticky pojatou rodinu PIC10 obsahující čipy, které i přes své nepatrné rozměry (tyto čipy mají z pouzdra vyvedeno pouze šest či osm pinů) i nízkou cenu mohou v elektronických zařízeních nahradit poměrně velké množství různých obvodů, například čítače, posuvné či záchytné registry, obvody zajišťující regulaci atd. Taktéž jsme si popsali i základní parametry výkonnějších čipů z rodiny PIC12. Mezi osmibitové mikrořadiče PIC ovšem patří i čipy z rodin PIC16 a PIC18. Před podrobnějším popisem těchto čipů, z nichž především řada PIC16Fxxx se díky svým vlastnostem těší mezi konstruktéry-programátory velmi velké popularitě, se však budeme zabývat tím, jakým způsobem je možné pro osmibitové mikrořadiče PIC vyvíjet vlastní aplikace.
Obrázek 1: Jednoduchý programátor mikrořadičů PIC, který se k osobnímu počítači připojuje přes sběrnici USB.
Již v závěru předchozí části tohoto seriálu jsme si řekli, že se mikrořadiče PIC staly poměrně brzy po svém uvedení na trh velmi populární, a to jak mezi profesionálními výrobci různých elektronických zařízení, tak i mezi uživateli, kteří tyto mikrořadiče používají ve svých domácích projektech. Vzhledem k velké oblibě těchto mikrořadičů tedy není divu, že pro ně vzniklo množství více či méně dokonalých vývojových nástrojů, a to jak základních utilit (assembler, disassembler, linker), tak i vysokoúrovňových programovacích jazyků, simulátorů těchto mikrořadičů a ucelených vývojových kitů. Mnohé z těchto nástrojů jsou vytvářeny na komerční bázi, ovšem v současnosti již existuje i poměrně velké množství nástrojů šířených například po licencemi GPL a LGPL. Některým z těchto nástrojů se budeme věnovat v dalších kapitolách a – vzhledem k tomu, že se jedná o poměrně rozsáhlou problematiku – i v navazující části tohoto seriálu.
Obrázek 2: Vývojový kit BASIC Stamp ve variantě vybavené rozhraním universální sériové sběrnice (USB).
Základem pro vytváření aplikací na osmibitových mikrořadičích PIC stále zůstává assembler a k němu příslušející pomocné nástroje. Open source alternativa k původnímu MPASM firmy Microchip je představovaná balíkem aplikací nazvaných gputils, které budou stručně představeny v následující kapitole. Namísto assembleru, nebo ještě lépe v součinnosti s assemblerem, lze však mikrořadiče PIC programovat i v mnoha vyšších programovacích jazycích, například v některé variantě programovacího jazyka Forth (viz též čtvrtou až šestou kapitolu), céčka či Pascalu (překladače těchto jazyků pro PIC budou popsány příště), ale i Basicu, jenž je mj. použit i ve velmi zajímavém vývojovém kitu nazvaném BASIC Stamp, kterým se budeme zabývat v kapitole sedmé i v kapitole navazujících.
Obrázek 3: Plně osazený modul BASIC Stamp 2, který je možné ihned po připojení na baterii nebo stabilizovaný zdroj začít používat.
2. Sada vývojových nástrojů gputils
Pro mikrořadiče PIC lze vyvíjet aplikace různým způsobem – s využitím jak nízkoúrovňových, tak i vysokoúrovňových programovacích jazyků. Jak se již stalo u osmibitových mikrořadičů různých typů i rozdílných architektur zvykem, je mnoho aplikací (nebo pomocných knihoven – modulů) vytvářeno přímo v assembleru, tj. v „jazyku symbolických adres“ (JSA) nebo též „jazyku symbolických instrukcí“ (JSI). Velmi časté použití assembleru pro různě složité projekty vychází zejména ze skutečnosti, že tyto mikrořadiče mívají poměrně striktně omezenou kapacitu datové paměti (řádově desítky až stovky bajtů), paměti pro uložení programu (tisíce slov) a samozřejmě i jejich výpočetní rychlost nebývá ve většině případů tak vysoká, aby byla srovnatelná s mainstreamovými 32bitovými a 64bitovými mikroprocesory. Navíc je možné při použití assembleru velmi přesně vypočítat dobu trvání určité operace (u osmibitových mikrořadičů PIC je doba trvání jednotlivých instrukcí samozřejmě popsána v dokumentaci).
Obrázek 4: Assembler byl v dávné minulosti mj. použit jako hlavní a po určitou dobu jediný programovací jazyk mainframů firmy IBM. Teprve s postupem času se k původnímu jednoduchému assembleru přidala podpora maker, vznikly první autokódy a z nichž už byl jen poměrně malý krok ke skutečným programovacím jazykům.
Assembler i k němu příslušející nástroje dodává například samotná firma Microchip pod jménem MPASM, ovšem pro vývoj lze použít i nástroje dostupné v balíčku nazvaném jednoduše gputils (GNU PIC Utilities), který je dostupný ve většině distribucí Linuxu. V tomto balíčku, který je primárně vyvíjen právě na Linuxu, ale existuje i ve variantě pro Mac OS X a MS Windows, můžeme nalézt několik navzájem spolupracujících nástrojů. Především se jedná o assembler nazvaný gpasm, linker gplink, disassembler gpdasm (použitelný pro zpětný překlad), prohlížeč vygenerovaných souborů .cod gpvc, prohlížeč přeložených objektových souborů gpvo a správce knihoven gplib. Syntaxe, kterou assembler rozpoznává, je zvolena takovým způsobem, aby byly zdrojové kódy kompatibilní s výše zmíněným assemblerem MPASM. Navíc je možné tyto nástroje integrovat do vývojových prostředí, například do PiKdev. Způsob použití některých zmíněných nástrojů si ukážeme v následující kapitole.
Obrázek 5: Minimální způsob zapojení mikrořadičů z rodiny PIC12 při jejich programování.
(zdroj: PIC12F629/675 Data Sheet)
3. Příklad použití nástrojů gputils
Jako malou ukázku způsobu použití nástrojů ze sady gputils si popíšeme překlad, slinkování a zpětný překlad jednoduchého demonstračního příkladu, jehož zdrojový kód je dostupný na adrese http://www.pic-resource.com/picblinker.html. Tento demonstrační příklad, který je primárně určený pro mikrořadič PIC16F630, po svém spuštění rozbliká LED připojenou na port C. Vzhledem k tomu, že se pro generování intervalu zhasínání diody používá zpožďovací smyčka a nikoli časovač, lze tento demonstrační příklad po nepatrných úpravách použít i pro další mikrořadiče PIC (úpravy se týkají pouze úvodních řádků programu, popř. adresy portu C). Pro vyzkoušení možností gputils je nejprve zapotřebí zkopírovat z výše uvedené adresy zdrojový kód příkladu a uložit ho na disk například pod názvem LED.asm. Posléze je možné spustit samotný překlad, jehož výsledkem je dvojice souborů LED.lst (listing programu obsahující jak adresy instrukcí, tak i jejich instrukční kód) a především LED.o (objektový soubor):
gpasm -c LED.asm
Následuje ukázka listingu programu vygenerovaného nástrojem gpasm. Tři sloupce čísel značí postupně adresu instrukce v paměti programu, následuje kód instrukce a konečně číslo řádku v původním zdrojovém souboru. Adresa a kód instrukce se samozřejmě používají pouze u skutečně přeložených programových řádků:
00039 ;------------------------------------------------------------------- 00040 ;Delay Routine 00041 000C 00042 delay 000C 30FF 00043 movlw 0xFF 000D 0080 00044 movwf delayA 000E 00045 loopA 000E 30FF 00046 movlw 0xFF 000F 0080 00047 movwf delayB 0010 00048 loopB 0010 0B80 00049 decfsz delayB, f 0011 2800 00050 goto loopB 0012 0B80 00051 decfsz delayA, f
Objektový soubor je před zápisem do paměti mikrořadiče nutné slinkovat; tím se jednotlivé kódy instrukcí umístí na správné adresy v paměti programu:
gplink LED.o
Výsledkem předchozího příkazu je trojice souborů a.cod (použito mnoha vývojovými nástroji, mj. i příště popsaným nástrojem gpsim), a.hex (použito například při zápisu do EPROM či EEPROM) a a.lst (listing). Opět jako malá ukázka následuje část listingu, z něhož je patrné, že zde již nejsou použita čísla řádků původního zdrojového textu a naopak se veškeré adresy vypisují jak v symbolické podobě (delayA), tak i ve formě numerické (0×20):
;------------------------------------------------------------------- ;Delay Routine delay 00000d 30ff movlw 0xff movlw 0xFF 00000e 00a0 movwf 0x20 movwf delayA loopA 00000f 30ff movlw 0xff movlw 0xFF 000010 00a1 movwf 0x21 movwf delayB loopB 000011 0ba1 decfsz 0x21, f decfsz delayB, f 000012 2811 goto 0x11 goto loopB 000013 0ba0 decfsz 0x20, f decfsz delayA, f 000014 280f goto 0xf goto loopA 000015 0008 return return
Vygenerovaný soubor a.hex obsahuje jak objektový kód, tak i například informaci o adresách v EPROM či EEPROM, na něž má být kód zapsán:
:020000040000FA :100000000128FF23831690000030870083128701A8 :100010000D20FF3087000D200728FF30A000FF30A3 :0C002000A100A10B1128A00B0F28080064 :02400E00843FED :00000001FF
Zpětný překlad objektového kódu do assembleru samozřejmě vede ke ztrátě některých původních informací (například jmen návěští a konstant), ovšem v některých případech se zpětnému překladu nemůžeme vyhnout:
gpdasm -p p16f630 a.hex > LED_disasm.asm
Jak již bylo řečeno v předchozím odstavci, neobsahuje zpětně přeložený program všechny informace, ale kódy instrukcí a adresy registrů, se kterými instrukce pracují, zůstávají zachovány:
000000: 2801 goto 0x1 000001: 23ff call 0x3ff 000002: 1683 bsf 0x3, 0x5 000003: 0090 movwf 0x10 000004: 3000 movlw 0 000005: 0087 movwf 0x7 000006: 1283 bcf 0x3, 0x5 000007: 0187 clrf 0x7 000008: 200d call 0xd 000009: 30ff movlw 0xff 00000a: 0087 movwf 0x7 00000b: 200d call 0xd 00000c: 2807 goto 0x7 00000d: 30ff movlw 0xff 00000e: 00a0 movwf 0x20 00000f: 30ff movlw 0xff 000010: 00a1 movwf 0x21 000011: 0ba1 decfsz 0x21, f 000012: 2811 goto 0x11 000013: 0ba0 decfsz 0x20, f 000014: 280f goto 0xf 000015: 0008 return 002007: 3f84 addlw 0x84
Obrázek 6: Zapojení pinů osmibitového mikrořadiče PIC12F675.
(zdroj: PIC12F629/675 Data Sheet)
4. Programovací jazyk Forth
Pro vývoj aplikací na osmibitových mikrořadičích PIC je možné použít i programovací jazyk Forth, jehož některé vlastnosti z něj dělají takřka ideální vyšší programovací jazyk vhodný pro „malé“ mikrořadiče a mikroprocesory, i když je nutné přiznat, že některá technologická omezení především základních řad mikrořadičů PIC vývoj ve Forthu komplikují (na druhou stranu se zde nesetkáme se snad nejvíce problematickou částí Forthu – práci s řetězci a tvorbě rozsáhlých aplikací). Ostatně sám tvůrce Forthu – Chuck Moore – vytvořil již v roce 1976 microFORTH určený pro osmibitový mikroprocesor CDP-1802 a v následujících několika letech tento systém velmi rychle portoval na další osmibitové mikroprocesory, například na Intel 8080, Motorola 6800, MOS 6502 či Zilog Z80. Jádro systému microFORTH mělo velikost pouze 1kB. V tomto jádru byly definovány především základní aritmetické operace (slova) pro šestnáctibitový datový typ integer a řídicí konstrukce – podmínky a cykly. Interaktivní vývojové prostředí Forthu umožňovalo zápis a testování programů, stejně jako ladění vlastního jádra, nazývané nucleus.
Obrázek 7: Chuck Moore.
Později pro tyto osmibitové mikroprocesory vznikl FIG Forth a mnohé další dialekty tohoto programovacího jazyka, šířené jak formou komerčních aplikací, tak i jako freeware. Ovšem Forth se používal a dodnes používá i na výkonných mikroprocesorech určených pro osobní počítače a pracovní stanice. Z moderních implementací Forthu je zajímavý například OpenBoot a Open Firmware firmy Sun (dnes Oracle). Kromě toho vznikly i specializované mikrořadiče, jejichž architektura a instrukční sada je optimalizována pro běh aplikací napsaných ve Forthu. Jmenujme například čipy MuP21 a F21, který byly navrženy Chuckem Moorem v jeho vlastním CADu. Těmito z technologického hlediska velmi zajímavými čipy, které ovšem z několika důvodů nezaznamenaly velký komerční úspěch, se ještě v tomto seriálu budeme zabývat (z dalších projektů Chucka Moora je zajímavý i ColorForth, o němž se říká, že pokud k nám přiletí mimozemšťané, budou zcela jistě psát aplikace právě v tomto jazyce, i když si osobně myslím, že spíše budou preferovat jazyk APL…
Obrázek 8: Slavný kalkulátor HP-35 s RPN
(35 v názvu značí počet tlačítek).
5. Vývoj aplikací pro mikrořadiče ve Forthu
Vraťme se však k vývoji aplikací pro mikrořadiče PIC. Jedním z důvodů relativně velké oblíbenosti Forthu při programování těchto čipů je to, že programy napsané ve Forthu jsou většinou mnohem menší než obdobné programy napsané v nějakém jiném vyšším programovacím jazyce. Je to způsobeno několika faktory, především tím, že programy ve Forthu velmi intenzivně využívají zásobník, a to jak pro předávání parametrů funkcím, tak i pro vlastní provádění výpočtů. Zápis aritmetických operací odpovídá převrácené polské notaci (Reverse Polish Notation – RPN), použité mj. i u některých kalkulátorů firmy HP, v jazyku pro popis tiskových stránek PostScript, posixové utilitě dc atd. Většina operací prováděných nad operandy uloženými v zásobníku je v přeloženém programu reprezentována pouze samotným kódem operace, protože operandy není zapotřebí explicitně adresovat – jsou přece uloženy na zásobníku a jejich formát lze odvodit přímo z kódu dané operace.
Obrázek 9: Jeden z prvních kalkulátorů s RPN od firmy HP (HP 9810).
Dále použití implicitních operandů a předávání parametrů přes zásobník vede k tomu, že ve Forthu je velmi snadné vytvářet nové funkce (zde se pro ně ovšem používá pojmenování „slovo“), takže se typický forthovský program skládá z volání poměrně krátkých funkcí/slov, z nichž každá prování jen velmi málo operací. Právě díky znovupoužitelnosti funkcí/slov se výsledný program zmenšuje. Ostatně používání většího množství malých funkcí řešících jediný omezený problém je jedním ze znaků dobře napsané aplikace v tomto programovacím jazyce – viz též skvělá kniha Thinking Forth od Lea Brodieho (je dostupná v elektronické knihovně). Následuje typický příklad jednoduchého slova vytvořeného ve Forthu, v němž se implicitně používá jak parametr slova, tak i operand(y) uložené na zásobníku operandů (Forth totiž pracuje s dvojicí zásobníků – většina operací se provádí na zásobníku operandů, návratové adresy, hodnoty explicitně uložené uživatelem a například počitadla smyček jsou uloženy na zásobníku návratových adres):
: mocnina dup * ;
Při zavolání slova mocnina se číselná hodnota uložená na vrcholu zásobníku operandů zduplikuje, takže počet hodnot na zásobníku o jednu vzroste, a následně jsou z tohoto zásobníku odstraněny obě nejvýše uložené hodnoty, které jsou nahrazeny svým součinem (podrobnější popis syntaxe i sémantiky Forhu byl již uveden v samostatném seriálu, viz odkazy na Internetu). Povšimněte si, že ani parametr tohoto slova ani vlastní výpočet nepoužívá žádné proměnné, protože veškeré operace jsou prováděny s položkami uloženými na zásobníku operandů.
Obrázek 10: Zásobníkový mikroprocesor SEAforth-24 optimalizovaný, jak již jeho název napovídá, pro běh programů naprogramovaných ve Forthu.
Třetím důvodem, proč jsou programy napsané ve Forthu většinou méně náročné na kapacitu paměti programu, je samotný formát přeložených programů. Těla funkcí/slov totiž ve skutečnosti obsahují pouze volání dalších funkcí, což znamená, že vlastní příkaz pro volání těchto funkcí není nutné nikde ukládat. Z interní struktury funkce systém sám pozná, zda se jedná o funkci naprogramovanou opět ve Forthu nebo o operaci vytvořenou v assembleru (například součet dvou čísel či základní manipulace se zásobníkem). Třetí popsaný faktor se ovšem uplatňuje v případě, že je forthovský program již v průběhu vývoje překládán do interpretovatelného bajtkódu, nikoli do strojového kódu mikrořadiče. Tento způsob byl použitý v klasických implementacích Forthu, dnes se ovšem v některých případech preferuje překlad do strojového kódu.
Obrázek 11: Rozměry vývojového kitu BASIC Stamp 2.
6. PicForth a FlashForth
Pro osmibitové mikrořadiče PIC existuje několik implementací programovacího jazyka Forth, z nichž se zaměříme na PicForth a FlashForth. Nejdříve si popíšeme PicForth. Jedná se o překladač, který ze zdrojových kódů naprogramovaných ve Forthu generuje zdrojový kód v assembleru přeložitelného například výše zmíněným nástrojem gpasm. Vygenerovaný assemblerovský kód je určený pro mikroprocesory PIC 16F87× a PIC 16F88×. Překladač samozřejmě není spouštěn přímo na mikrořadiči, ale na osobním počítači (ostatně samotný PicForth je založen na známém gforthu neboli GNU Forthu). Vzhledem k tomu, že se nevyužívá klasický interpret Forthu, není možné využít některé zajímavé vlastnosti tohoto programovacího jazyka, například možnosti interaktivní práce při psaní a testování jednotlivých slov. Na druhou stranu je však výsledný strojový kód umístěn přímo v paměti programu, kde může být přímo spuštěn a proveden s maximální rychlostí (nejedná se o interpret).
Následuje ukázka velmi jednoduchého programu převzatého přímo z manuálu tohoto jazyka, který je určen pro generování binárního signálu na portu B0. Tento program lze v PicForthu napsat pomocí pouhých čtyř slov:
( definice slova i/o, které uloží na zásobník ) ( dvojici čísel 0 a 6, kde 6 je index portu b ) 0 pin-b i/o
( inicializace ) : init i/o >output ;
( slovo, které na port pošle sekvenci logické 0 a 1 ) : pulse i/o high i/o low ;
( nekonečná smyčka tvořená slovy mezi begin a again ) : mainloop begin pulse again ;
( tímto slovem se program spouští ) main : program init mainloop ;
Kód v assembleru vygenerovaný PicForthem vypadá následovně:
0x0000 018A clrf 0x0A 0x0001 280C goto 0x00C ; (init-picforth) 0x0002 0000 nop ; name: init ; max return-stack depth: 0 0x0003 1683 bsf 0x03,5 0x0004 1006 bcf 0x06,0 0x0005 1283 bcf 0x03,5 0x0006 0008 return ; name: pulse ; max return-stack depth: 0 0x0007 1406 bsf 0x06,0 0x0008 1006 bcf 0x06,0 0x0009 0008 return ; name: mainloop ; max return-stack depth: 1 0x000A 2007 call 0x007 ; pulse 0x000B 280A goto 0x00A ; mainloop (rs depth: 1) ; name: (init-picforth) ; max return-stack depth: 0 0x000C 3032 movlw 0x32 0x000D 0084 movwf 0x04 ; name: program ; max return-stack depth: 1 0x000E 2003 call 0x003 ; init 0x000F 280A goto 0x00A ; mainloop (rs depth: 1)
Obrázek 12: Rozměry vývojového kitu BASIC Stamp 2px24.
Na rozdíl od PicForthu, který provádí překlad a generování assemblerovského zdrojového kódu na osobním počítači, je FlashForth představitelem „klasického“ Forthu s vlastnostmi uvedenými v předchozí kapitole, jehož interpret a k němu příslušející minimalistický operační systém je provozován přímo na mikrořadiči (jedná se skutečně o plnohodnotný Forth obsahující například slova CREATE, DOES>, apostrof, čárku atd.). Vzhledem k nárokům na kapacitu operační paměti je FlashForth určen pro výkonnou řadu mikrořadičů PIC18F a dsPIC30F. Zápis, spouštění i ladění programů lze provádět přes terminál připojený k mikrořadiči – může se samozřejmě jednat o osobní počítač (vybavený na Linuxu programem minicom nebo na Windows aplikací TeraTerm), ale není větším problémem si napsat obslužné rutiny pro ovládání textového LCD a například starší klávesnice se sériovým rozhraním (tj. s konektorem DIN či PS/2). Podrobnější popis všech možností FlashForthu by si vyžádal samostatný článek, v příští části tohoto seriálu bude uvedena malá ukázka složitějšího programu napsaného v tomto jazyce.
Následuje jednoduchý příklad ukazující použití nových slov FOR a NEXT při tvorbě počítané smyčky:
: test #10 for r@ . r@ 4 = if leave then next ; test 9 8 7 6 5 4 ok
Další poměrně jednoduchý příklad s definicí slova, které dokáže vynásobit dvojici šestnáctibitových čísel s 32bitovým výsledkem:
: m* 2dup xor >r abs swap abs um* r> ?dnegate ;
Obrázek 13: Fotografie vývojového kitu BASIC Stamp 2e.
7. Vývojový kit BASIC Stamp
Kromě programovacích jazyků, které překládají zdrojový text napsaný programátorem přímo do strojového kódu mikroprocesorů PIC, je možné pro vývoj použít i takové programovací jazyky, které programy překládají do speciálního bajtkódu, který je posléze interpretován. Jedním z typických jazyků, které jsou založeny na interpretaci bajtkódu (přesněji řečeno tokenizovaného programu) je i programovací jazyk BASIC, jehož popisem i historií vývoje jsme se již v tomto seriálu zabývali. Možná poněkud překvapující je to, že tento programovací jazyk lze použít i na osmibitových mikrořadičích PIC, ale je tomu skutečně tak – BASIC, resp. jeho dialekt nazvaný PBasic je nedílnou součástí poměrně zajímavého vývojového kitu nazvaného příznačně BASIC Stamp, který je v mnoha variantách vyráběn firmou Parallax Inc., popř. několika výrobci klonů tohoto kitu. Nejprve si stručně popíšeme architekturu prvního kitu BASIC Stamp označovaného jednoduše jako BASIC Stamp 1, dalšími verzemi tohoto kitu se budeme zabývat příště.
Obrázek 14: Modul vývojového kitu BASIC Stamp 1.
BASIC Stamp 1 je z konstrukčního hlediska tvořen relativně malým plošným spojem; proto se ostatně v jeho názvu vyskytuje slovo „stamp“ neboli poštovní známka. Na plošném spoji je umístěno pouze několik elektronických součástek. Především se jedná o osmibitový mikrořadič PIC16C56A odvozený od známého čipu PIC16C54 v pouzdru s dvaceti piny (osm pinů lze použít pro připojení periferních zařízení), dále je na plošném spoji umístěn krystal 4 MHz, napěťový stabilizátor a taktéž externí paměťový modul EEPROM s kapacitou 256 bajtů, který je k mikrořadiči připojen pomocí sériové sběrnice I2C, na níž komunikace probíhá s využitím pouhých dvou signálových vodičů – EEC (SCL) (hodinový signál) a EED (SDA) (obousměrný přenos dat). Zatímco v paměti EPROM umístěné přímo v mikrořadiči PIC je uložen interpret programovacího jazyka BASIC (resp. interpret již přeloženého bajtkódu), do externí paměti EEPROM se ukládá samotný bajtkód BASICového programu přeloženého na osobním počítači a přeneseného do této paměti přes sériový port. S využitím tohoto portu je taktéž prováděno ladění programů, včetně tisku textu na monitor (přenosová rychlost je nastavena na 4800 Bd bez parity a s jedním start a stop bitem.
Obrázek 15: Prototypová deska vývojového kitu BASIC Stamp 1.
Kapacita 256 bajtů externí paměti EEPROM postačuje pro uložení zhruba osmdesáti BASICových příkazů, což již umožňuje tvorbu poměrně zajímavých programů, protože dialekt PBasic obsahuje sofistikované příkazy pro ovládání periferních zařízení připojených k mikrořadiči (tyto příkazy si uvedeme v dalším textu). Kapacita paměti RAM, kterou může programátor využít, je v případě vývojového kitu BASIC Stamp 1 poměrně malá – jedná se o pouhých 14 bajtů, což odpovídá čtrnácti proměnným o šířce jednoho bajtu, popř. sedmi proměnným o dvoubajtové šířce (integer). Při přístupu do RAM po slovech lze použít symbolická jména jednotlivých slov W0 až W6, při přístupu po bajtech se používají jména B0 až B13. Další dva bajty jsou použity pro ovládání vstupně-výstupních pinů; první bajt je použit pro zápis dat na výstupní piny i čtení dat z pinů vstupních, bity v druhém bajtu slouží k přepínání režimu jednotlivých pinů – buď do režimu vstupního či výstupního. BASIC Stamp 1 lze napájet devítivoltovou baterií nebo prakticky libovolným zdrojem dodávajícím napětí v rozmezí 5 až 15 V.
Obrázek 16: Schéma zapojení modulu vývojového kitu BASIC Stamp 1.
8. Základní vlastnosti PBasicu
V předchozí kapitole jsme si řekli, že vývojový kit BASIC Stamp obsahuje mj. i paměť EEPROM, v níž je uložený tokenizovaný program napsaný v PBasicu. Překladač PBasicu se spouští z vývojového prostředí nainstalovaného na osobním počítači a po překladu (pokud samozřejmě neskončí s chybou) je výsledný bajtkód přenesen na BASIC Stamp. Interpret PBasicu postupně načítá kódy jednotlivých instrukcí i jejich operandů ze sériové EEPROM a následně tyto příkazy vykonává – interpretuje. Pokud se v programu nachází příkaz DEBUG, je parametr tohoto příkazu (znak, číselná hodnota, obsah proměnné) přenesen přes sériový port do osobního počítače, kde je zobrazen ve vývojovém prostředí. Tento příkaz tedy zhruba odpovídá klasickému BASICovému příkazu PRINT, i když jeho formátovací schopnosti jsou poněkud menší.
V PBasicu určeném pro BASIC Stamp 1 lze použít pouze omezený počet příkazů reprezentovaných klíčovými slovy, které jsou vypsány v následující tabulce (poznámka: příkazy Txxx, Nxxx, OTxxx a ONxxx jsou určeny pro řízení sériového portu):
AND | GOSUB | N2400 | PIN0..PIN7 | SOUND |
B0..B13 | GOTO | NAP | PINS | STEP |
BIT0..BIT15 | HIGH | NEXT | PORT | SYMBOL |
BRANCH | IF | ON300 | POT | T300 |
BSAVE | INPUT | ON600 | PULSIN | T600 |
BUTTON | LET | ON1200 | PULSOUT | T1200 |
CLS | LOOKDOWN | ON2400 | PWM | T2400 |
CR | LOOKUP | OR | RANDOM | THEN |
DEBUG | LOW | OT300 | READ | TO |
DIR0..DIR7 | MAX | OT600 | RETURN | TOGGLE |
DIRS | MIN | OT1200 | REVERSE | W0..W6 |
EEPROM | N300 | OT2400 | SERIN | WRITE |
END | N600 | OUTPUT | SEROUT | |
FOR | N1200 | PAUSE | SLEEP |
V předchozí tabulce stojí za povšimnutí především klíčová slova W0 až W6 a B0 až B13. Tato slova představují identifikátory jednotlivých bajtů operační paměti o kapacitě (jak již víme) pouhých 14 bajtů. Jednu paměťovou buňku lze současně adresovat jak po slovech (16 bitů), tak i po jednotlivých bajtech. PBasic je však vyšší programovací jazyk, takže programátorům umožňuje, aby přiřadili jednotlivým bajtům/slovům v operační paměti vlastní jména – to v podstatě odpovídá definici proměnných. Tuto operaci lze provést pomocí příkazu SYMBOL, jehož možnosti jsou ukázány v následujícím demonstračním příkladu. Povšimněte si, že vzhledem k tomu, že dvojice bajtů B0 a B1 leží ve stejném místě operační paměti jako slovo W0, tak se proměnné temporary a counter v paměti překrývají, což může či nemusí být programátorům záměr:
SYMBOL temporary = W0 ' uložená hodnota leží v intervalu 0 až 65535 SYMBOL counter = B1 ' uložená hodnota leží v intervalu 0 až 255 (+ překryv) SYMBOL result = B2 ' opět lze použít hodnoty 0 až 255 SYMBOL foo = result ' sdílení společné paměťové adresy dvojicí proměnných
Mnohé další vlastnosti PBasicu, především jeho rozšířené varianty určené pro vývojové kity BASIC Stamp 2, budou popsány v navazující části tohoto seriálu.
Obrázek 17: Zapojení napájecí baterie a připojení osobního počítače přes adaptér ke kitu BASIC Stamp 1.
9. Odkazy na Internetu
- Seriál o programovacím jazyce Forth:
seriál o programovacím jazyce Forth - Stránky firmy Microchip Technology
http://www.microchip.com/ - Výběr z různých modelů (osmibitových) mikrořadičů PIC
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2661 - Řada (rodina) osmibitových mikrořadičů PIC 10
http://www.microchip.com/ParamChartSearch/chart.aspx?branchID=1009&mid=10&lang=en&pageId=74 - Řada (rodina) osmibitových mikrořadičů PIC 12
http://www.microchip.com/ParamChartSearch/chart.aspx?branchID=1001&mid=10&lang=en&pageId=74 - Řada (rodina) osmibitových mikrořadičů PIC 14
http://www.microchip.com/ParamChartSearch/chart.aspx?branchID=1008&mid=10&lang=en&pageId=74 - Řada (rodina) osmibitových mikrořadičů PIC 16
http://www.microchip.com/ParamChartSearch/chart.aspx?branchID=1002&mid=10&lang=en&pageId=74 - Další výběr z různých modelů mikrořadičů PIC
http://www.microchip.com/maps/microcontroller.aspx - PIC microcontroller (Wikipedia EN)
http://en.wikipedia.org/wiki/PIC_microcontroller - Mikrokontrolér PIC (Wikipedia CZ)
http://cs.wikipedia.org/wiki/Mikrokontrolér_PIC - FLASHFORTH for the PIC18F and the dsPIC30F
http://flashforth.sourceforge.net/ - FlashForth
http://www.sourceforge.net/projects/flashforth - Free Pic software tools
http://softwarepic.50webs.com/freesoft.html - What is Amicus?
http://www.picbasic.org/proton_lite.php - Amicus FAQ
http://www.myamicus.co.uk/faq.php?s=2e8d12e7f4c23e775776f4916876354b& - Microcontrollers development tools
http://www.gnupic.dds.nl/ - gpsim (Wikipedia EN)
http://en.wikipedia.org/wiki/Gpsim - gpsim home page
http://gpsim.sourceforge.net/gpsim.html - The FreeRTOS Project
http://www.freertos.org/ - FreeRTOS (Wikipedia)
http://en.wikipedia.org/wiki/FreeRTOS - Serial EEPROM (93C46 / 93CS46) Routines
http://www.pjrc.com/tech/8051/serial-eeprom.html - Great Microprocessors of the Past and Present (V 13.4.0)
http://jbayko.sasktelwebsite.net/cpu.html - SPI interface tutorial
http://www.best-microcontroller-projects.com/spi-interface.html - Serial Peripheral Interface Bus
http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus - EUSB to SPI bus Kit
http://www.eidusa.com/Electronics_Kits_EUSB_To_SPI_BUS.htm - SPI Block Guide V03.06, Freescale Semiconductor
http://www.freescale.com/files/microcontrollers/doc/ref_manual/S12SPIV3.pdf - What is SPI?
http://www.fpga4fun.com/SPI1.html - SPI – A simple implementation
http://www.fpga4fun.com/SPI2.html - Bit-banging
http://en.wikipedia.org/wiki/Bit-banging - Joint Test Action Group
http://en.wikipedia.org/wiki/JTAG - I2C
http://en.wikipedia.org/wiki/I2C - Display Data Channel
http://en.wikipedia.org/wiki/Display_Data_Channel - I2 Background
http://www.microport.tw/blognew.php?blog_no=7#theory - PIC16F87X, 28/40-pin 8-Bit CMOS FLASH Microcontrollers
Microchip Technology Inc.
http://www.microchip.com