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