|
PICBASIC |
NAREDBE I - P
I2CREAD Podatak, Takt,
Kontrolni_bajt,
{Adesa,}[Prom{,Prom...}]{,Labela}
Ovom komandom
se šalje Kontrolni i opcionalno Adresni podatak preko I2C linija, dok se
primljeni bajtovi smeštaju u promenljive Prom jednu ili više njih.
I2CREAD
i I2CWRITE komanda se najčešće koriste upis i čitanje
podataka sa I2C kola kao što su serijski EEPROM-i serije 24Cxx, I2C A/D
konvertori i slično. Sama komanda radi sa tzv. I2C master bajtom sa
modovima čitanja i upisivanja. 12-bitni mikrokontroleri imaju već
definisane I2C data i I2C adres pinove, pa je tada moguće koristi DEFINE
direktivu.
DEFINE I2C_SCL PORTA,1
'samo za 12-bitne mikrokontolere
DEFINE I2C_SDA PORTA,1
'samo za 12-bitne mikrokontolere
Struktura
Kontrolnog bajta data je na donjoj
slici.
Viša
4 bita određuju adresu uređaja koji dodeljuje I2C komitet za svaku
vrstu I2C jedinice pa tako serijski EEPROM 23LC01B ima adrseu %1010=A, dok se
sledeća 3-bita koriste za adresu I2C kola(chip select). Zadnji bit R/W kada je postavljen na 1 uzrokuju
čitanja a ako je postavljen na 0 upis u I2C kolo. U donjoj tabeli
prikazane su adrese nekih serijski EEPROM-a sa njihovim kapacitetom.
EEPROM |
Kapacitet |
Kontrolni
bajt |
Veličina
adrese |
24LC01B |
128 bajta |
%1010xxx0 |
1 bajt |
24LC02B |
256 bajta |
%1010xxx0 |
1 bajt |
24LC04B |
512 bajta |
%1010xxx0 |
1 bajt |
24LC08B |
1K bajta |
%1010xbb0 |
1 bajt |
24LC16B |
2K bajta |
%1010bbb0 |
1 bajt |
24LC32B |
4K bajta |
%1010ddd0 |
2 bajt |
24LC65 |
8K bajta |
%1010ddd0 |
2 bajt |
Pri
čemu bbb znači selekciju
bloka, ddd su chip select bitovi, dok
oznaka xxx nema uticaja. Ako se prima
podatak čija je dužina 2-bajta(1-reč) tada se prvo šalje
viši bajt a zatim niži. Kada se koriste nizovi u prenosu tadase
ispred oznake stavlja STR zatim znak \ i
na kraju broj taktova kao u donjem primeru.
a var byte[8]
I2CREAD PORTC.4,
PORTC.3,$A0,0,[STR a\8]
Ako se
u komandi stavi opciona labele i kada nema odziva sa I2C linje biće
izvršen skok na programsku liniju ispred koje stoji data labela. Kada se
koristi oscilator od 8 MHz tada je brzina prenosa 100 KHz a sa oscilatorm od 20
MHz tada je brzina prenosa 400 MHz. Kada se prenos obavlja sa sporijim
oscilatorom neophodno je dati direktivu.
DEFINE I2C_SLOW 1
Da bi
I2C clock interfejs bio bipolaran a ne sa otvorenim kolektorm treba koristi
direktivu:
DEFINE I2C_SCLOUT
Na
donjoj slici data je tipična šema spoja mikrokontrolera sa serijskim
EEPROM-om.
adr var byte
cont con
%10100000
addr=17 'postavi adresu na 17
'procitaj
podatak sa adrese 17 i smesti u promenljivu B2
I2CREAD
PORTA.0,PORTA.1,cont,addr,[B2]
Prilikom upotrebe I2C kola
neophodno je dobro proučiti specifikaciju proizvođača.
I2CWRITE Podatak, Takt,
Kontrolni_bajt,
{Adesa,}[Prom{,Prom...}]{,Labela}
Ovom
komandom se šalje Podatak i Kontrolni_bajt preko I2C linije. Da li
se šalje adresa dužine bajta ili reči određuje definicija
parametra adrese kao
promenljive.
Kada
se koristi serijski EEPROM treba sačekati 10ms(zavisno od upotrebljenog
čipa) dok se upis ne izvrši. Tek tada je moguća nova I2C
komunikacija. U slučaju upisa više uzastopnih bajtova sa jednom
naredbom mogu se javiti problemi u slučaju ako koristimo dato čekanje
a ne koristimo serijski EEPROM već neko durgo I2C kolo. Kada šaljemo
podatak od 2 bajta(1-reč), šalje se viši a zatim niži bajt
reči. Kada se vrši prenos niza ispred oznake niza stavlja se STR, a
posle znak \ i na kraju broj taktova.
a var byte[8]
I2CWRITE PORTC.4,
PORTC.3,$A0,0,[STR a\8]
Ako se
u komandi stavi opciona labele i kada nema odziva sa I2C linje biće
izvršen skok na programsku liniju ispred koje stoji data labela. Kada se
koristi oscilator od 8 MHz tada je brzina prenosa 100 KHz a sa oscilatorom od
20 MHz tada je brzina prenosa 400 KHz. Kada se prenos obavlja sa sporijim
oscilatorom neophodno je dati direktivu.
DEFINE I2C_SLOW 1
Da bi
I2C clock interfejs bio bipolaran a ne sa otvorenim kolektorm treba koristi
direktivu:
DEFINE I2C_SCLOUT
U
donjem kodu dat je primer upotrebe I2CWRITE komande.
adr var byte
cont con
%10100000
addr=17 'postavi adresu na 17
posalji
6-ti bajt na adresu 17
I2WRITE
PORTA.0,PORTA.1,cont,addr,[6]
Pause 'sakecaj 10ms dok se upis ne izvrsi
addr=1 'postavi adresu na 1
'posalji
bajt upisan u B2 na adresu 1
I2WRITE
PORTA.0,PORTA.1,cont,addr,[B2]
Pause 'sakecaj 10ms dok se upis ne izvrsi
IF Izraz {AND / OR izraz} THEN labela
{naredbe}
ELSE
{naredbe}
ENDIF
Ova
naredba ima dva oblika i to: If .. Then ... i If .. Then ...Else ... U
prvom slučaju zavisno da li je Izraz
tačan prelazi se na izvršenje naredbe koja ima datu labelu ispred
sebe, ili se izvšava data instrukcija.
If
Pin0 = 0 Then Pushd 'ako je
promenljiva Pin0 jednaka 0 skoci na labelu Pushd
If
B0 > 40 Then Old 'ako je vrednost promelnljive B0 veca od 40
skoci na labelu Old
If
(B0 = 10) And (B1 = 20) Then Loop
If
B0 = 10 Then B0 = B0 + 1 'ako je B0=10 uvecaj B0 za 1
U
drugom slučaju kada je Izraz
tačan skače se na datu labelu, ili se izvršava instrukcija iza
reči Then a ako uslov nije
tačan skače se na labelu ili izvršava instrukcija iza reči Else.
If B0
= 10 Then
Led =
1
Else
Led =
0
EndIf
'ako je B0 = 10
postavi Led na 1 inace postavi Led na 0
INPUT Pin
Naredba
Input proglašava dati pin
ulaznim kao što je dato u sledećim primerima.
INPUT
0 'postavi pin 0 kao ulazni
INPUT
PORTA.0 'postavi pin PORTA.0 kao ulazni
Dati
pin može se proglasiti ulaznim i upotrebom TRIS registra tako da mu se
odgovarajući bit postavi na 1 kao u donjem primeru.
TRISB.0
= 1 'postavi
pin 0 porta B kao ulazni
TRISB.0
= %11111111 'postavi
sve pinove porta B kao ulazne
LCDIN {Adresa,}[Promenljiva{,Promenljiva...}]
Naredbom
LCDIN čita sa RAM lokacija u LCD-u(Liquid Crystal Display) sa zadate adrese
i pročitani podatak se smešta u Promenljivu.
Prilikom upotrebe ove naredbe linija R/W sa LCD displeja mora biti spojena na
mikrokontroler. Ako se na LCD vrši samo upis ova linija se spaja na
logičku nulu. Obično su oblici karaktera(caracter generator) smešteni od adrese $40 do $7F. Za upotrebu
ove naredbe koriste se dve DEFINE direktive kao u donjem primeru.
DEFINE
LCD_RWREG PORTE 'proglasava PORTE kao R/W port
DEFINE
LCD_RWBIT 2 'proglasava 2 pin kao R/W bit
LCDIN [B0] 'procitani
sadrzaj smesti u promenljivu B0
LCDOUT {Podatak}{,Podatak...}
Naredbom
LCDOUT šalju se podaci na LCD
displej. PICBasic podržava razne modele displeja koji imaju Hitachi 44780 kontroler ili
kompatibilan. Najčešće LCD ima 14 ili 16 pinova za povezivanje
sa mikrokontrolerom. U slučaju ako se ispred podatka koji se šalje na
displej nalazi znak #, tada se podrazumeva slanje ASCII vrednosti svakog znaka.
LCDOUT koristi modifikatore kao i naredbe SEROUT2 što je dato u donjoj
tabeli.
Modifikator |
Šalje |
{I}{S} BIN{1..16} |
binarni broj |
{I}{S}DEC{1..5} |
decimalni broj |
{I}{S}HEX{1..4} |
heksadecimalni broj |
REP c\n |
znak c ponovljen n puta |
STR ArrayVar{\n} |
niz od n članova |
Pre
slanja prve komande na LCD treba sačekati oko pola sekundi da bi se LCD
inicijalizovao. LCD se inicijalizuje nekim karakterom ili komandom poslatom LCDOUT
naredbom. Komande na LCD displej se šalju slanjem $FE karaktera a zatim
komande prema donjoj tabeli.
Komanda |
Operacija na displeju |
$FE,1 |
obriši displej |
$FE,2 |
vrati se na početak prve linije |
$FE,$OC |
isključi kursor |
$FE,$OE |
uključi underline kursor |
$FE,$OF |
uključi blinkajući kursor |
$FE,$1O |
pomeri kursor u levo za 1 mesto |
$FE,$14 |
pomeri kursor u desno za 1 mesto |
$FE,$80 |
vrati kursor na početak prve linije |
$FE,$C0 |
vrati kursor na početak druge linije |
$FE,$94 |
vrati kursor na početak treće linije |
$FE,$D4 |
vrati kursor na početak četvrte linije |
Za
displeje 16x2 tj. dve linije sa 16 karaktera prva linija počinje na adresi
$80 a druga na $C0.Tako bi komandom
LCDOUT
$FE, $80+4
bio
postavljen kursor na 4 mesto u prvoj liniji. Za upotrebu ove komande neophodno
je dobro proučiti upustvo proizvođača LCD displeja. U donjem
primeru dato je nekoliko načina upotrebe LCDOUT naredbe.
LCDOUT
$FE,1 "Hello" 'brise displej i ispisuje rec Hello
LCDOUT
$FE,$C0 "World" 'ispisuje rec World od pocetka druge linije
LCDOUT
B0,#B1 'ispisuje
B0 i ASCII vrednost B1
LCD displej se povezuje sa mikrokontrolerom preko 4-bitne
ili 8-bitne linije. Kada se koristi 8-bitna linija svih 8-bita mora biti
uključeno na isti port, a u slučaju 4-bitne linije sva četiri
bita moraju biti u gornjem ili donjem delu bajta. PICBasic podrazumeva da je
LCD displej priključen na specifične pinova ako sa DEFINE direktivama
nije drugačije određeno. Kod 4-bitnih linija označenih sa
DB4-DB7 petpostavlja se da su spojene na
RA.0-RA.3 pinove, RS je povezan na RA.4 i E pin se povezuje na RB.3 i da
se koristi LCD 2x16.
Kada
se LCD poveže na druge linije
mikrokontrolera tada se koriste sledeće DEFINE direktive.
DEFINE
LCD_DREG PORTB 'dodeli LCD-u PORTB
DEFINE
LCD_DBIT 4 'dodelipocetnog bita(0 ili 4)
kada se koriste 4-bitne linije DEFINE LCD_RSREG PORTB 'dodela
PORTB Register Select LCD-a
DEFINE
LCD_RSBIT 1 'postavi Register Select bit
DEFINE
LCD_EREG PORTB 'omoguci port
DEFINE
LCD_BIT 0 'omoguci bit
DEFINE
LCD_BITS 4 'broj linija 4 ili 8
DEFINE
LCD_LINES 2 'broj linija na LCD-u
DEFINE
LCD_COMMANDUS 2000 'kasnjenje komandi u mikrosekundama
DEFINE
LCD_DATUS 50 'kasnjenje podataka u
mikrosekundama
Na
donjoj slici prikazano je podrazumevano spajanje LCD displeja i
mikrokontrolera.
{LET} Promenljiva=Vrednost
Ovom naredbom
dodeljuje se promenljivoj vrednost izraza. Takođe su mogu dodeliti
konstante i promenljve. Najčešće se neobavezna reč LET
izostavlja.
LET
B0 = B1 * B2 + B3
B0 =
Sqr W1
LOOKDOWN Trazi,{Konst{,Konst...}],Prom
Ova
naredbe pretražuje listu konstati i utvrđuje da li se zadata vrednost
Trazi nalazi u toj listi. U
slučaju ako se ta vrednost nalazi u listi u promenljivu Prom upisati će indeks nađenog
člana, s tim što se indeksi konstati kreću od 0 pa nadalje. Ako se tražena vrednost se ne
pronađe, vrednost promenljive Prom
ostaje nepromenjena. Lista konstanti može biti sastavljena od
brojčanih i stringovnih konstati. Svako slovo u nizu se uzima kao zasebna
konstanta predstavljena svojom ASCII vrednosti.
Serin
1,N2400,B0 'preuzmi heksa vrednost serijskog
ulaza sa pina 1
LOOKDOWN B0,["0123456789ABCDEF"],B1
'konverutj heksa vrednost iz BO u decimalnu u B1
Serout
0,N2400,[#B1] 'posalji decimalnu vrednost
serijski preko pina 0
LOOKDOWN2 Trazi,{Test}[{Vrednost{,Vrednost...}],Prom
Ova
naredbe pretražuje listu vrednosti i utvrđuje da li se zadata
vrednost Trazi nalazi u toj listi. U
slučaju ako se ta vrednost nalazi u listi Vrednosti u promenljivu Prom upisati
će indeks nađenog člana, s tim što se indeksi vrednosti
kreću od 0 pa nadalje. Ako se tražena
vrednost se ne pronađe vrednost promenljive Prom ostaje nepromenjena. Ako se koristi parametar Test ispituje se da li je vrednost Trazi veća ili manje od neke
vrednosti u listi, a u promenljivu Var
se smešta indeks prve vrednosti koja zadovoljava zadati uslov. Lista
vrednosti može biti sastavljena od 16-bitnih numeričkih vrednosti,
stringova ili promenljivih. Svaki karaketr u stringu se posmatra kao ASCII
vrednost datog karaktera. LOOKDOWN2 naredba generiše oko 3 puta veći
kod od LOOKDOWN naredbe pa ako koristimo 8-bitne konstane ili stringove
preporučuje se upotreba LOOKDOWN naredbe.
LOOKDOWN2
W0,[512,W1,1024,B0
LOOKDOWN2
W0,>[1000,100,10],B0
LOOKUP Indeks,[{Konstanta{,Konstanta...}],Prom
Ova
naredbe koristi se za čitanje vrednosti iz tabele konstani na osnovu
zadatog Indeksa, pri čemu se
vrednost Indeksa kreće u
granicama od 0 pa nadalje. Kada je 0 to je indeks prvog člana tabele.
Vrednost člana sa datim Indeksom
se smešta u promenljivu Var. U
slučaju ako je vrednost Indeksa
veća ili jednaka broju članova tabele promenljiva Var zadržava prethodnu vrednost.
Lista konstanti može biti sastavljena od brojčanih vrednosti i
stringovnih konstati. Svako slovo u nizu se uzima kao zasebna konstanta
predstavljena svojom ASCII vrednosti.
For B0 = 0
To 5 'brojac od 0 do 5
LOOKUP
B0,["Hello!"],B1 'preuzmi karakter i smesti u B1
Serout
0,N2400,[B1] 'posalji karakter iz B1
serijski preko pina 0
Next B0 'sledeci
karakter
LOOKUP2 Indeks,[{Vrednost{,Vrednost...}],Prom
Ova
naredbe koristi se za čitanje vrednosti iz tabele vrednosti na osnovu
zadatog Indeksa, pri čemu se
vrednost Indeksa kreće u
granicama od 0 pa nadalje. Kada je 0 to je indeks prvog člana tabele
vrednosti. Vrednost člana sa datim Indeksom
se smešta u promenljivu Var. U
slučaju ako je vrednost Indeksa
veća ili jednaka broju članova tabele promenljiva Var zadržava prethodnu vrednost.
Lista vrednosti može biti sastavljena od 16-bitnih brojčanih
podataka, stringovnih konstati i promenljivih. Svako slovo u stringu se uzima
kao zasebna konstanta predstavljena svojom ASCII vrednosti. LOOKUP2 naredba
generiše oko 3 puta veći kod od LOOKUP naredbe pa ako koristimo
8-bitne konstane ili stringove preporučuje se upotreba LOOKUP naredbe.
LOOKUP2
B0,[256,512,1024],W1
LOW Pin
Ova
naredbe postavlja zadati pin na logičku nulu, pri čemu se on
automatski proglašava izlaznim.
LOW 0 'pin
0 proglasava izlaznim i postavlja na 0
LOW PORTA.0 'pin
PORTA.0 proglasava izlaznim i postavlja na 0
Isti
se efekat postiže i naredbom dodele.
PORTA.0 = 0 'pin PORTA.0 postavlja na 0
NAP Period
Postavlja
mikrokontroler u low power mode
odnoso stanje niske potrošnje za dati period. Navedeni period je samo
približan zato što se vreme meri preko watch dog tajmera i
zavisi od upotrebljenog mikrokontrolera kao i temperature. Unešeni period
odgovara broju sekundi prema donjoj tabeli.
Period |
Kašnjenje
u ms |
0 |
18 |
1 |
36 |
2 |
72 |
3 |
144 |
4 |
288 |
5 |
576 |
6 |
1152 |
7 |
2304 |
NAP 7 'niska potrosnja u trajanju 2.3 sekunda
OUTPUT Pin
Postavlja
zadati pin kao izlazni.
OUTPUT 0 'pin
0 proglasava izlaznim
OUTPUT
PORTA.0 'pin
PORTA.0 proglasava izlaznim
Ovo se
može postići i upotrebom TRIS registra.
TRISA.0 = 0 'pin
PORTA.0 proglasava izlaznim
OWIN Pin,Mode,[Promenljiva...]
OWIN
komanda šalje reset signal na one-wire
komunikaciju na zadati Pin, pri
čemu njegovo slanje zavisi od izabranog Moda prema donjoj tabeli.
Mode |
Opis |
0 |
1-slanje reset signala pre
podataka |
1 |
1-slanje reset signala posle
podataka |
2 |
0=podatak veličine bajta 1=podatak veličine bita |
Promenljiva može biti jedna ili više međusobno odvojenih zarezom.
Dozvoljeni modifikatori su STR za učitavanje niza bajta kao i SKIP za
preskakanje zadatog broja ulaznih vrednosti. SKIP i STR nisu podržani na 12-bitnim
mikrokontrolerima.
OWIN
PORTC.0,[STR
temperature\2, SKIP 4,
count_remain, count_per_c]
Ovom
naredbom biće primljeni bajti sa one-wire
jedinice priključene na PORTC.0 sa ne izdatim reset signalom pre
početka slanja. Biće primljena 2 bajta i smeštena u niz temperature, zatim preskočena 4,
dok će preostala 2 bajta biti učitana u promenljive count_remain i count_per_c.
OWOUT Pin,Mode,[Promenljiva...]
OWOUT
šalje reset signal na one-wire
komunikaciju na zadati Pin, pri
čemu upisuje jedan ili više bita ili bajta u nju
zavšavajući sa zadnjim reset impulsom. Slanje reset signala zavisi od
odabranog moda prema donjoj tabeli.
Mode |
Opis |
0 |
1-slanje reset signala pre
podataka |
1 |
1-slanje reset signala posle
podataka |
2 |
0=podataka veličine bajta 1=podatak veličine bita |
Promenljiva može biti jedna ili više međusobno odvojenih zarezom.
Dozvoljeni modifikatori su STR za učitavanje niza bajta kao i SKIP za
preskakanje zadatog broja ulaznih vrednosti. SKIP i STR nisu podržani na 12-bitnim
mikrokontrolerima.
OWOUT
PORTC.0,1,[$cc,$be]
Ova
komanda šalje reset signal preko pina PORTC.0 a zatim dva bajta podataka
$cc i $be na one-wire jedinicu.
PAUSE Period
Komanda
PAUSE zaustavlja izvšenje programa za zadati Period koji se izražava u milisekundama. Period je 16-bitni podatak što znači da može imati
vrednost od 0 do 65535 milisekundi(nešto više od jednog minuta). Za
razliku od drugih funkcija zaustavljanja programa kao što su NAP i SLEEP
ova komanda ne postavlja PIC mikrokontroler u stanje male potrošnje. Ova
naredba troši više enegrije ali je zato velike preciznosti kao i
sistemski klok. Podrazumeva upotrebu oscilatora od 4 Mhz pa ako se koristi
drugi mora se DEFINE Osc direktivom definisati njegova brzina.
PAUSE 1000 'sacekaj 1 sekundu
PAUSES Period
Komanda
PAUSES zaustavlja izvšenje programa za zadati Period koji se izražava u mikrosekundama. Period je 16-bitni podatak što znači da može imati
vrednost od 0 do 65535 mikrosekundi. Za razliku od drugih funkcija
zaustavljanja programa kao što su NAP i SLEEP ova komanda ne postavlja PIC
mikrokontroler u stanje male potrošnje. Ova naredba troši više
enegrije ali je zato velike preciznosti kao i sistemski klok. Podrazumeva
upotrebu oscilatora od 4 Mhz pa ako se koristi drugi mora se DEFINE Osc
direktivom definisati njegova brzina. Minimalno kašnjenje kod PAUSES
naredbe zavisi od upotrebljenog oscilatora i ono je dato u tabeli.
OSC |
Minimalno
kašnjenje |
3(3.58) |
20 ms |
4 |
24 ms |
8 |
12 ms |
10 |
8 ms |
12 |
7 ms |
16 |
5 ms |
20 |
3 ms |
24 |
3 ms |
25 |
2 ms |
32 |
2 ms |
33 |
2 ms |
40 |
2 ms |
PAUSES 1000 'sacekaj
1 milisekundu
PEEK Adresa,Promenljiva
Čita vrednost u delu
koda na naznačenoj Adresi i
smešta u Promenljivu.
POKE Adresa,Vrednost
Upisuje
zadatu Vrednost na specificiranu Adresu.
POKECODE Vrednost{,Vrednost...}
Upisuje
zadate Vrednosti u kodni prostor na
tekuću programsku adresu.
POT Pin,Scale,Var
Upisuje
zadate Vrednosti u kodni prostor na
tekuću programsku adresu.
http://vojo.milanovic.org
© Copyright, 2004 Milanović Vojo
All right reserved