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]