Vývojové nástroje pro osmibitové mikrořadiče PIC

21. 9. 2010
Doba čtení: 21 minut

Sdílet

V dnešní části seriálu o architekturách počítačů se zaměříme na popis vývojových nástrojů dostupných pro osmibitové mikrořadiče PIC. Popíšeme si sadu nástrojů gputils, dvojici navzájem značně odlišných implementací jazyka Forth (PicForth a FlashForth) a následně se seznámíme s vývojovým kitem BASIC Stamp.

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

4. Programovací jazyk Forth

5. Vývoj aplikací pro mikrořadiče ve Forthu

6. PicForth a FlashForth

7. Vývojový kit BASIC Stamp

8. Základní vlastnosti PBasicu

9. Odkazy na Internetu

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š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).

ibm-4

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/pic­blinker.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 W0W6, při přístupu po bajtech se používají jména B0B13. 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ší.

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 W0W6 a B0B13. 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:

ict ve školství 24

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

  1. Seriál o programovacím jazyce Forth:
    seriál o programovacím jazyce Forth
  2. Stránky firmy Microchip Technology
    http://www.mi­crochip.com/
  3. Výběr z různých modelů (osmibitových) mikrořadičů PIC
    http://www.mi­crochip.com/ste­llent/idcplg?Id­cService=SS_GET_PA­GE&nodeId=2661
  4. Řada (rodina) osmibitových mikrořadičů PIC 10
    http://www.mi­crochip.com/Pa­ramChartSearch/char­t.aspx?branchID=1009&mi­d=10&lang=en&pa­geId=74
  5. Řada (rodina) osmibitových mikrořadičů PIC 12
    http://www.mi­crochip.com/Pa­ramChartSearch/char­t.aspx?branchID=1001&mi­d=10&lang=en&pa­geId=74
  6. Řada (rodina) osmibitových mikrořadičů PIC 14
    http://www.mi­crochip.com/Pa­ramChartSearch/char­t.aspx?branchID=1008&mi­d=10&lang=en&pa­geId=74
  7. Řada (rodina) osmibitových mikrořadičů PIC 16
    http://www.mi­crochip.com/Pa­ramChartSearch/char­t.aspx?branchID=1002&mi­d=10&lang=en&pa­geId=74
  8. Další výběr z různých modelů mikrořadičů PIC
    http://www.mi­crochip.com/map­s/microcontro­ller.aspx
  9. PIC microcontroller (Wikipedia EN)
    http://en.wiki­pedia.org/wiki/PIC_mi­crocontroller
  10. Mikrokontrolér PIC (Wikipedia CZ)
    http://cs.wiki­pedia.org/wiki/Mi­krokontrolér_PIC
  11. FLASHFORTH for the PIC18F and the dsPIC30F
    http://flashf­orth.sourcefor­ge.net/
  12. FlashForth
    http://www.sou­rceforge.net/pro­jects/flashfor­th
  13. Free Pic software tools
    http://softwa­repic.50webs.com/fre­esoft.html
  14. What is Amicus?
    http://www.pic­basic.org/pro­ton_lite.php
  15. Amicus FAQ
    http://www.my­amicus.co.uk/faq­.php?s=2e8d12e7f4c23e775­776f4916876354b&
  16. Microcontrollers development tools
    http://www.gnu­pic.dds.nl/
  17. gpsim (Wikipedia EN)
    http://en.wiki­pedia.org/wiki/Gpsim
  18. gpsim home page
    http://gpsim.sou­rceforge.net/gpsim­.html
  19. The FreeRTOS Project
    http://www.fre­ertos.org/
  20. FreeRTOS (Wikipedia)
    http://en.wiki­pedia.org/wiki/Fre­eRTOS
  21. Serial EEPROM (93C46 / 93CS46) Routines
    http://www.pjrc­.com/tech/8051/se­rial-eeprom.html
  22. Great Microprocessors of the Past and Present (V 13.4.0)
    http://jbayko­.sasktelwebsi­te.net/cpu.html
  23. SPI interface tutorial
    http://www.best-microcontroller-projects.com/spi-interface.html
  24. Serial Peripheral Interface Bus
    http://en.wiki­pedia.org/wiki/Se­rial_Peripheral_In­terface_Bus
  25. EUSB to SPI bus Kit
    http://www.ei­dusa.com/Elec­tronics_Kits_E­USB_To_SPI_BUS­.htm
  26. SPI Block Guide V03.06, Freescale Semiconductor
    http://www.fre­escale.com/fi­les/microcontro­llers/doc/ref_ma­nual/S12SPIV3­.pdf
  27. What is SPI?
    http://www.fpga4fun­.com/SPI1.html
  28. SPI – A simple implementation
    http://www.fpga4fun­.com/SPI2.html
  29. Bit-banging
    http://en.wiki­pedia.org/wiki/Bit-banging
  30. Joint Test Action Group
    http://en.wiki­pedia.org/wiki/JTAG
  31. I2C
    http://en.wiki­pedia.org/wiki/I2C
  32. Display Data Channel
    http://en.wiki­pedia.org/wiki/Dis­play_Data_Chan­nel
  33. I2 Background
    http://www.mi­croport.tw/blog­new.php?blog_no­=7#theory
  34. PIC16F87X, 28/40-pin 8-Bit CMOS FLASH Microcontrollers
    Microchip Technology Inc.
    http://www.mi­crochip.com

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.