PBP naredbe od L do O

LCDIN
lcdin {address, }[var{, var...}]
  Čita RAM memoriju LCD-a, adresu 'address', i smešta sadržaj u promenljivu 'var'. LCD ima RAM na sebi koji se koristi za smeštaj karaktera. Većina displeja ima više RAM-a nego što je to potrebno za prikaz. U taj RAM može da se upisuje naredbom LCDOUT, a da se čita naredbom LCDIN.
CG (karakter generator) RAM se nalazi od adrese $40 do $7F, a RAM za prikaz počinje od adrese $80. Potrebno je povezati "read/write" liniju LCD-a na PIC da bi mogao da čita i piše. Za to se koriste dve DEFINE naredbe:

    DEFINE LCD_RWREG PORTE  'port na kome je priključen LCD read/write pin
    DEFINE LCD_RWBIT 2      'LCD read/write pin bit

[nazad]

 

LCDOUT
lcdout item{, item...}
  Prikazuje 'item' na inteligentnom LCD-u. PBP podržava LCD module sa HITACHI-jevim 44780 kontrolerom ili ekvivalentnim. Ovi LCD displeji obično imaju 14 ili 16 pinova u jednom ili dva reda.
Ako se stavi znak # ispred 'item', šalje se ASCII izgled za svaku cifru poslatu na LCD. LCDOUT može takodje da koristi bilo koji modifikator kao i SEROUT2.

Modifikator
Operacija
{I}{S}BIN{1...16}
šalje binarne cifre
{I}{S}DEC{1...5}
šalje decimalne cifre
{I}{S}HEX{1...4}
šalje heksadecimalne cifre
REP c\n
ponavlja slanje karaktera c n puta
STR ArrayVar{\n}
šalje string od n karaktera

Program bi trebalo da sačeka bar pola sekunde pre prvog slanja na LCD zbog inicijalizacije samog displeja. Komande se šalju LCD-u tako što se prvo pošalje $FE, a zatim komanda. Neke od komandi su:

Komanda
Dejstvo
$FE, 1
briše displej
$FE, 2
povratak na početak prve linije
$FE, $0C
kursor isključen
$FE, $0E
uključen kursor u obliku donje crte
$FE, $0F
uključen kursor koji treperi
$FE, $10
pomeri kursor ulevo za jedno mesto
$FE, $14
pomeri kursor udesno za jedno mesto
$FE, $C0
pomeri kursor na početak druge linije
$FE, $94
pomeri kursor na početak treće linije
$FE, $D4
pomeri kursor na početak četvrte linije

Obratite pažnju da postoji komanda koja pomera kursor na početak druge linije; za većinu displeja kraj prve i početak druge linije se ne nalaze jedan do drugog u RAM-u. Za većinu displeja sa 16 karaktera u 2 reda (16 X 2), prva linija počinje na adresi $0, a druga na $40. Displeji 16 X 1 su obično formatizovani kao 8 X 2 displeji sa razmakom u RAM-u izmedju osmog i devetog karaktera. Displeji sa 4 reda takodje imaju "izmešanu" memorijsku mapu.

    lcdout $fe, 1, "Hello"   'briše displej i prikazuje reč "Hello"
    lcdout b0, #b1           'prikazuje brojčanu vrednost za b0 i ASCII za b1

LCD može da se poveže na mikrokontroler koristeći 4-bitnu ili 8-bitnu magistralu; ako se koristi 8-bitna onda svih 8 pinova moraju da budu na jednom portu. Ako se koristi 4-bitna, moraju da budu povezani na 4 gornja ili donja bita jednog porta. Pinovi ENABLE i REGISTAR SELECT mogu da budu povezani na bilo koji pin bilo kog porta, a R/W pin može da se poveže na masu, s obzirom da je LCDOUT samo izlazna naredba (ako se ne koristi LCDIN). PBP podrazumeva da je LCD spojen na odredjenje pinove sem ako mu se ne kaže drugačije. Podrazumeva da se koristi 4-bitna magistrala sa DATA linijama DB4 - DB7 povezanim na PORTA.0 - PORTA.3 pinove PIC-a, da je REGISTAR SELECT povezan na PORTA.4, a ENABLE na PORTB.3 (za shemu povezivanja pogledajte originalno uputstvo). Takodje se podrazumeva da je upotrebljen LCD sa dve linije. Ove vrednosti mogu da se promene upotrebom DEFINE naredbi (ne zaboravite da sve moraju da budu napisane velikim slovima):

    DEFINE LCD_DREG PORTB     'odredjuje port za DATA linije
    DEFINE LCD_DBIT 4         'odredjuje početni DATA bit (0 ili 4) za 4-bitnu magistralu
    DEFINE LCD_RSREG PORTB    'odredjuje port na koji je povezan REGISTER SELECT
    DEFINE LCD_RSBIT 1        'odredjuje bit na koji je povezan REGISTER SELECT
    DEFINE LCD_EREG PORTB     'odredjuje port na koji je povezan ENABLE
    DEFINE LCD_EBIT 0         'odredjuje bit na koji je povezan ENABLE
    DEFINE LCD_BITS 4         'odredjuje 4-bitnu ili 8-bitnu magistralu
    DEFINE LCD_LINES 2        'odredjuje broj linija na LCD-u
    DEFINE LCD_COMMANDUS 2000 'odredjuje zadršku za komandu u µs (mikrosekundama)
    DEFINE LCD_DATAUS 50      'odredjuje zadršku za podatke u µs

[nazad]

 

{LET}
{let} var=value
  Dodeljuje vrednost 'value' promenljivoj 'var'. 'Value' može da bude konstanta, druga promenljiva ili rezultat nekog izraza. Naredba LET je opciona (nije obavezna).

    let b0=b1*b2+b3    'izračunaj izraz i rezultat dodeli promenljivoj b0
    b0 = sqr w1        'izračunaj kvadratni koren iz w1 i rezultat dodeli b0 

[nazad]

 

LOOKDOWN
lookdown search,[constant{,constant...}],var
  Ova komanda traži da li se 8-mo bitna vrednost 'search' nalazi u listi vrednosti 'constant'; ako pronadje tu vrednost, u 'var' smešta indeksnu vrednost te promenljive (njen redni broj). Ako je pronadjena vrednost prva u listi, u 'var' će biti smeštena vrednost 0; ako je ta vrednost druga u listi, u 'var' će biti smeštena vrednost 1 itd. Ako vrednost nije pronadjena, vrednost u 'var' će ostati nepromenjena.
Lista konstanti može da sadrži mešavinu brojeva i stringova; svaki karakter stringa će biti posmatran kao nezavisna 8-bitna ASCII vrednost za taj karakter. Nizovi sa promenljivim indeksom ne mogu da se koriste u ovoj naredbi, dok nizovi sa fiksnim indeksom mogu. U listi može da bude do 255 konstanti (256 za 18Cxxx).

    serin 1,n2400,b0                    'uzmi hexadecimalni karakter sa pin1 serijskom vezom
    lookdown b0,["0123456789ABCDEF"],b1 'pretvori hex karakter u decimalni broj i smesti u b1
    serout 0,n2400,[#b1]                'pošalji decimalni broj serijski na pin0

[nazad]

 

LOOKDOWN2
lookdown2 search,{test}[value{,value...}],var
  Ova komanda traži da li se 16-to bitna vrednost 'search' nalazi u listi vrednosti 'value'; ako pronadje tu vrednost, u 'var' smešta indeksnu vrednost te promenljive. Ako je pronadjena vrednost prva u listi, u 'var' će biti smeštena vrednost 0; ako je ta vrednost druga u listi, u 'var' će biti smeštena vrednost 1 itd. Ako vrednost nije pronadjena, vrednost u 'var' će ostati nepromenjena.
Opcioni parametar 'test' može da se upotrebi ako je uslov nešto drugo od "jednako je". Na primer, lista vrednosti 'value' može da se pretražuje za vrednost veću od vrednosti za 'search' i u tom slučaju za 'test' treba staviti znak veće ">". Ako se 'test' izostavi, podrazumeva se znak jednakosti "=".
Lista vrednosti može da sadrži mešavinu 16-to bitnih brojeva i stringova; svaki karakter stringa će biti posmatran kao nezavisna 8-bitna ASCII vrednost za taj karakter. Matematički izraz ne može da bude upotrebljen kao vrednost za 'value', ali može za 'search'. Nizovi sa promenljivim indeksom ne mogu da se koriste u ovoj naredbi, dok nizovi sa fiksnim indeksom mogu. U listi može da bude do 85 vrednosti (256 za 18Cxxx).
LOOKDOWN2 generiše oko tri puta veći kod nego LOOKDOWN, pa je bolje koristiti LOOKDOWN ako se pretražuju samo 8-bitne vrednosti.

    lookdown2 w0,[512,w1,1024],b0   'pronadji vrednost u listi jednaku vrednosti u w0 i njen
                                    'indeks (redni broj) smesti u b0
    lookdown2 w0,>[10,100,1000],b0  'pronadji prvu vrednost u listi koja je veća od vrednosti
                                    'u w0 i njen indeks smesti u b0

[nazad]

 

LOOKUP
lookup index,[constant{,constant...}],var
  Ova naredba se koristi da se vrednost 'constant' iz tabele koja se nalazi na rednom broju koji se nalazi u promenljivoj 'index', smesti u promenljivu 'var'. Ako je vrednost za 'index' nula, uzima se prva vrednost iz tabele i smešta u 'var'; ako je vrednost za 'index' jedan, uzima se druga vrednost iz tabele i smešta u 'var' itd. Ako je 'index' jednak ili veći od broja konstanti u listi, ništa se neće preduzeti i vrednost za 'var' će ostati nepromenjena. Lista konstanti može da sadrži mešavinu brojeva i stringova; svaki karakter stringa će biti posmatran kao nezavisna 8-bitna ASCII vrednost za taj karakter.
Nizovi sa promenljivim indeksom ne mogu da se koriste u ovoj naredbi, dok nizovi sa fiksnim indeksom mogu. U listi može da bude do 255 konstanti (256 za 18Cxxx).

    for b0=0 to 5                'for petlja koja za b0 postavlja vrednosti od 0 do 5
      lookup b0, ["Hello!"], b1  'uzima karakter na rednom broju b0 i smešta vrednost u b1
      serout 0, n, 2400, [b1]    'šalje karakter b1 serijski na pin0
    next b0                      'uzima sledeću vrednost za b0 i radi sve ponovo

[nazad]

 

LOOKUP2
lookup2 index,[value{,value...}],var

  Ova naredba se koristi da se vrednost 'value' iz tabele koja se nalazi na rednom broju koji se nalazi u promenljivoj 'index', smesti u promenljivu 'var'. Ako je vrednost za 'index' nula, uzima se prva vrednost iz tabele i smešta u 'var'; ako je vrednost za 'index' jedan, uzima se druga vrednost iz tabele i smešta u 'var' itd. Ako je 'index' jednak ili veći od broja elemenata u listi, ništa se neće preduzeti i vrednost za 'var' će ostati nepromenjena.
Lista elemenata može da sadrži mešavinu 16-to bitnih brojeva i stringova; svaki karakter stringa će biti posmatran kao nezavisna 8-bitna ASCII vrednost za taj karakter. Matematički izraz ne može da bude upotrebljen kao vrednost za 'value', ali može za 'search'.
Nizovi sa promenljivim indeksom ne mogu da se koriste u ovoj naredbi, dok nizovi sa fiksnim indeksom mogu. U listi može da bude do 85 elemata (256 za 18Cxxx).
LOOKUP2 generiše oko tri puta veći kod nego LOOKUP, pa je bolje koristiti LOOKUP ako se u listi koriste samo 8-bitne vrednosti.

    lookup2 b0, [256, 512, 1024], w1

[nazad]

 

LOW
low pin

  Postavlja logičko "0" na navedeni pin koji se automatski postavlja kao izlaz. 'Pin' može da bude konstanta, od 0 do 15, ili promenljiva koja sadrži broj od 0 do 15, ili ime pina (npr. porta.0).

    low 0          'šalje na pin0 logičko "0" (nula volti)

    low porta.0    'šalje na porta.0 logičko "0"

led var portb.0    'definiše pin za LED
    low led        'šalje na LED logičko "0"

Ako je pin već postavljen kao izlaz, brži i kraći način (sa stanovišta generisanog koda) da se postavi na log. "0" je:

    portb.0=0      'postavi logičko "0" na portb

[nazad]

 

NAP
nap period
  Zaustavlja rad mikrokontrolera i postavlja ga u režim male potrošnje na kratak vremenski period. Vrednosti za 'period' dati u tabeli ispod su samo približne vrednosti s obzirom da se koristi WATCHDOG tajmer koji ima R/C član, pa vrednost zavisi od čipa do čipa, a i od temperature. Pošto ova naredba koristi WATCHDOG tajmer, vreme ne zavisi od frekvencije upotrebljenog oscilatora.

Period
Interval (približno)
0
18 millisekundi
1
36 millisekundi
2
72 millisekundi
3
144 millisekundi
4
288 millisekundi
5
576 millisekundi
6
1.152 sekundi
7
2.304 sekundi
    nap 7     'pauza sa malom potrošnjom u trajanju od priblizno 2.3 sekunde

[nazad]

 

ON DEBUG
on debug goto label
  Ova naredba omogućava da se program za nadziranje izvršava izmedju svake PBP naredbe. Princip po kome se ovo dešava sličan je principu u naredbi ON INTERRUPT GOTO. Kada se upotrebi ova naredba, pre svake PBP naredbe ubacuje se poziv potprograma za nadzor (dibag potprogram). DISABLE DEBUG naredba onemogućava ubacivanje tog poziva, a naredba ENABLE DEBUG ga omogućava. Program za nadzor može da se napiše tako da šalje podatke na LCD ili serijski na PC računar. Primer malog programa za nadzor možete naći na sajtu proizvodjača PBP kompajlera. Promenljiva tipa word iz banke 0 potrebna je za čuvanje adrese na kojoj je program bio pre poziva potprograma za nadzor, koji je pozvan ON DEBUG GOTO naredbom:

    DEBUG_ADDRESS VAR WORD BANK0 SYSTEM

Može da se koristi dodatna promenljiva tipa "byte" za čuvanje trenutnog nivoa steka:

    DEBUG_STACK VAR BYTE BANK0 SYSTEM

Ovaj nivo nikada ne bi trebalo da bude veći od 4 u PBP programu. Ta promenljiva će biti uvećana za svaku GOSUB naredbu i umanjena za svaku RETURN naredbu.

[nazad]

 

ON INTERRUPT GOTO
on interrupt goto label
  Omogućava rad sa interaptima preko PBP potprograma. Postoje dva načina korišćenja interapta u PBP-u. Prvi je pisanje interapt rutine u asembleru; taj način omogućava najbrži odziv i o tom načinu će biti više reči kasnije. Drugi način je pisanje interapt rutine u PBP-u; ta rutina izgleda kao svaki drugi PBP potprogram, ali se završava sa RESUME.
Kada nastupi interapt, setuje se indikator za interapt; čim se završi izvršavanje tekuće PBP naredbe, program skače na BASIC interapt rutinu. Nakon što se izvršavanje rutine završi, glavni program nastavlja tamo gde je stao.
DISABLE i ENABLE naredbe omogućavaju da se delovi PBP programa izvršavaju bez mogućnosti da budu prekinuti. Najbolje je postaviti DISABLE pre same interapt rutine. Ili se interapt rutina može postaviti pre ON INTERRUPT naredbe jer se indikator za interapt ne proverava pre prve ON INTERRUPT naredbe u programu.
Kašnjenje interapta je vreme od nastanka uslova za interapt pa do trenutka kada počne izvršavanje interapt rutine. S obzirom da je nemoguće nastaviti izvršavanje započete PBP naredbe ako se prekine, potrebno je da se prvo tekuća naredba završi, pa se tek onda izvršava interapt rutina, i tu dolazi do kašnjenja. Ako se interapt desi za vreme naredbi PAUSE ili SERIN, to kašnjenje može da bude značajno. Pri pisanju programa kašnjenje treba imati u vidu, i ako je ono neprihvatljivo veliko, potrebno je upotrebiti asemblersku interapt rutinu. ON INTERRUPT će ubaciti dodatnu instrukciju nakon svake PBP naredbe, da proveri da li je nastupio uslov za interapt; DISABLE isključuje ubacivanje te dodatne instrukcije, a ENABLE uključuje.
U programu može biti više od jedne ON INTERRUPT naredbe.

    ON INTERRUPT GOTO myint 'interapt rutina počinje na labeli myint
    INTCON = %10010000      'omogućen interapt na RB0
    . . .
    DISABLE                 'onemogući interapte pre same interapt rutine
myint:
    led = 1                 'uključi LED pri interaptu
    RESUME                  'vrati se u glavni program
    ENABLE                  'omogući interapte nakon interapt rutine

Da bi ste isključili interapte trajno (ili dok Vam ponovo ne zatrebaju) nakon što je upotrebljena naredba ON INTERRUPT, postavite INTCON registar na $80:

    INTCON=$80

[nazad]

 

OUTPUT
output pin
  Postavlja odredjeni 'pin' kao izlazni. 'Pin'može da bude konstanta, od 0 do 15, ili promenljiva koja sadrži broj od 0 do 15, ili ime pina (npr. porta.0).

    output 0         'postavlja pin0 kao izlaz
    output porta.0   'postavlja RA0 kao izlaz

Alternativno, pin može na brži i kraći način (gledano sa stanovišta generisanog koda) da se postavi kao izlaz:

    trisb.0=0

Svi pinovi jednog porta mogu odjednom da se postave kao izlazi ako se resetuju svi bitovi odgovarajućeg TRIS registra:

    trisb=%00000000 'postavi sve pinove porta b kao izlazne

[nazad]