PBP naredbe od E do I

EEPROM
eeprom {location,} [constant{, constant...}]
 
Smešta konstante u EEPROM koji je ugradjen u sam PIC. Ako je vrednost za 'location' izostavljena, smeštanje počinje od adrese 0, a ako je navedena, smeštanje počinje od te adrese.
'Constant' može da bude numerička konstanta ili string konstanta. Samo se bajt najniže vrednosti konstante smešta u EEPROM, a stringovi se smeštaju kao ASCII vrednosti svakog znaka.
Ova naredba radi samo kod mikrokontrolera koji imaju ugradjeni EEPROM smešten na sam čip, kao što su PIC16F84 i PIC16C84; naredba ne radi na mikrokontrolerima kod kojih ugradjeni EEPROM ima I2C interfejs, kao što su 12CE67X ili 16CE62X. S obzirom da je u pitanju EEPROM memorija, podaci se ne gube čak i kada se isključi napajanje.
Podaci se smeštaju u EEPROM samo kada se PIC programira, ne kada se program startuje; za to se koristi naredba WRITE.

    eeprom 5, [10, 20, 30] 'smešta vrednosti 10, 20 i 30 u EEPROM počev od adrese 5

[nazad]

 

ENABLE
enable

  Ova naredba omogućava dibagovanje i izvršavanje interapt programa koji su prethodno zabranjeni naredbom DISABLE. ENABLE je, u stvari, pseudo naredba, jer daje uputstva kompajleru, a ne proizvodi nikakav kod. Za više informacija pogledajte naredbe ON DEBUG i ON INTERRUPT.

[nazad]

 

ENABLE DEBUG
enable debug
  Posle ove naredbe omogućeno je dibagovanje. Ovo je, u stvari, pseudo naredba. Za više informacija pogledajte naredbu ON DEBUG.

[nazad]

 

ENABLE INTERRUPT
enable interrupt
  Ova naredba omogućava izvršenje interapt programa koji su prethodno zabranjeni. Ovo je, u stvari, pseudo naredba. Za više informacija pogledajte naredbu ON INTERRUPT.

[nazad]

 

END
end
  Zaustavlja izvršavanje programa i prelazi u režim male potrošnje; svi pinovi ostaju u svom trenutnom stanju. END radi tako što izvršava asemblersku SLEEP naredbu u beskonačnoj petlji.
Dobro je da se na sam kraj programa stavi END, STOP ili GOTO naredba da bi se sprečio izlazak programa iz memorije i ponovno pokretanje.

[nazad]

 

FOR ... NEXT
for count = start to end {step {-} inc}
 {body}
next {count}

  Petlja FOR...NEXT dozvoljava izvršavanje dela programam ('body') odredjeni broj puta koristeći promenljivu kao brojač. S obzirom na kompleksnost naredbe, najbolje je objasniti je korak po korak:

1) Vrednost promenljive 'start' dodeljuje se indeksnoj promenljivoj 'count' koja može da bude bilo kog tipa.
2) Izvršava se deo programa izmedju FOR i NEXT ('body') koji može i da se izostavi, npr. za vremensku zadršku.
3) Vrednost promenljive 'inc' se sabira (ili oduzima ako je upotrebljen znak "-") sa vrednosću promenljive 'count'. Ako nije      navedena vrednost za 'step', korak je 1
4) Ako vrednost za 'count' nije premašila vrednost za 'end' ili maksimalnu vrednost za upotrebljeni tip promenljive,      program se vraća na tačku 2).

  Ako je potrebno da se petlja izvršava više od 255 puta, mora da se upotrebi word tip promenljive.

-primer 1:
    for i=1 to 10                  'izvrsavanje petlje 10 puta
      serout 0, n2400, [#i, " "]   'salje vrednost promenljive 'i' serijski na pin0
    next i                         'vracanje nazad i uzimanje nove vrednosti za 'i'
    serout 0, n2400, [10]          'salje komandu "novi red"

 -primer 2:
    for b2=20 to 10 step -2        'broji od 20 do 10 sa umanjenjem za dva
      serout 0, n2400, [#b2, " "]  'salje vrednost promenljive 'b2' serijski na pin0
    next b2                        'vracanje nazad i uzimanje nove vrednosti za 'b2'
    serout 0, n2400, [10]          'salje komandu "novi red" 

[nazad]

 

FREQOUT
freqout pin, onms, frequency1, {frequency 2}
 
Proizvodi jednu ili dve frekvencije i šalje na 'pin' u trajanju od 'onms' milisekundi. 'Pin' 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). Vrednost za 'frequency1' i 'frequency2' se kreće od 0 do 32767 herca (Hz).
Ova naredba generiše tonove impulsno-širinskom modulacijom (PWM). Čist ton koji izlazi iz pina nije dobar za korišćenje, pa je potreban filter koji će da eliminiše neke harmonike i signal približi sinuosoidi:


PIC na pojačalo


 

 

FREQOUT radi najbolje sa oscilatorom od 20MHz. Može da radi sa 10 MHz, pa čak i sa 4 MHz, ali će biti vrlo teško isfiltrirati signal, a i amplituda će biti manja. Korišćenje bilo koje druge vrednosti oscilatora će proizvesti ton koji je odnos upotrebljene frekvence i 20 MHz.

    freqout portb.1, 2000, 1000 'šalje ton frekvencije 1 kHz na portb.1 koji traje 2 sekunde

[nazad]

 

GOSUB
gosub label

  Skače na potprogram koji je obeležen labelom 'label' i čuva adresu povratka na steku. Kada program naidje na RETURN naredbu, vraća se nazad i izvršava se naredba odmah iza naredbe GOSUB.
U programu može da bude neograničen broj GOSUB naredbi. Potprogrami mogu da budu ugnježdeni, što znači da iz jednog potprograma može da se pozove drugi, ali takvih ugnježdenih potprograma može da bude maksimalno 4.

    gosub beep        'pozovi potprogram 'beep'
    ...
    ... 
beep:
    high 0            'uključi LED spojenu  na pin0
    sound 1, [80, 10] 'aktiviraj zvučnik spojen na pin1
    low 0             'isključi LED
    return            'vrati se u glavni program

[nazad]

 

GOTO
goto label
 
Program nastavlja izvršavanje od labele 'label'.

    goto send                'skoci na labelu 'send'
    ...
    ...
send:
    serout 0, n2400, ["Hi"]  'posalji "Hi" serijski na pin0 

[nazad]

 

HIGH
high pin
 
Postavlja logičko "1" 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).

    high 0             'šalje na pin0 logicko "1" (priblizno naponu napajanja)
    high porta.0       'šalje na porta.0 logicko "1"
    led var portb.0    'definiše pin za LED
    high led           'šalje na LED logičko "1"

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

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

[nazad]

 

HSERIN
hserin {paritylabel, }{timeout, label, }[item{,...}]
 
Prima jedan ili više 'item'-a sa hardverskog serijskog porta na kontroleru koji hardverski podržava serijsku komunikaciju. HSERIN je jedna od nekoliko ugradjenih asinhronih serijskih funkcija i može da se koristi jedino sa kontrolerima koji imaju hardverski USART (univerzalni sinhrono-asinhroni prijemnik- predajnik). Pogledajte podatke za tačne informacije o serijskom ulazu i ostalim parametrima za željeni uredjaj. Parametri za serijsku komunikaciju odredjuju se sa DEFINE:

    DEFINE HSER_RCSTA 90h 'postavlja prijemni registar na "prijem omogućen"
    DEFINE HSER_TXSTA 20h 'postavlja predajni registar na "predaja omogućena"
    DEFINE HSER_BAUD 2400 'definiše brzinu
    DEFINE HSER_SPBRG 25  'definiše direktno SPBRG (normalno se definiše pomoću HSER_BAUD)

HSERIN pretpostavlja da je upotrebljen oscilator od 4 MHz pri računanju brzine. Ako koristite drugu frekvencu za oscilator, upotrebite DEFINE OSC da kažete PBP-u koju frekvencu koristite.
Opciono mogu da se upotrebe 'timeout' i 'label' da bi se omogućilo programu da nastavi dalje u slučaju da karakter nije primljen za odredjeno vreme. 'Timeout' je izražen u milisekundama. Unapred definisani format podatka je 8N1 (8 bitova podatka, bez bita parnosti, 1 stop bit). Moguće je koristiti i formate 7E1 i 7O1 koristeći respektivno sledeće DEFINE naredbe:

    DEFINE HSER_EVEN 1 'koristiti ako je potrebna parna provera parnosti
    DEFINE HSER_ODD 1  'koristiti ako je potrebna neparna provera parnosti

Podešavanje parnosti, zajedno sa ostalim DEFINE naredbama, utiče i na HSERIN i na HSEROUT. Opciono u naredbi može da se navede 'paritylabel'; program će da predje na izvršavanje od te labele u slučaju da je došlo do greške pri proveri parnosti. Ovo može da se koristi samo u slučaju da je sa jednom od gornje dve DEFINE naredbe upotrebljena provera parnosti. S obzirom da se serijski prijem vrši hardverski, nije moguće invertovati stanje da bi se eliminisao RS232 drajver. Zbog toga treba koristiti odgovarajući drajver.
HSERIN koristi iste modifikatore kao i SERIN2:

Modifikator
Operacija
BIN{1...16}
prima binarne cifre
DEC{1...5}
prima decimalne cifre
HEX{1...4}
prima heksadecimalne cifre
SKIP n
preskače n primljenih karaktera
STR ArrayVar\n{\c}
prima string od n karaktera, opcino se završava c karakterom
WAIT ( )
čeka odredjenu sekvencu karaktera
WAITSTR ArrayVar{\n}
čeka karakter string

Na 17Cxxx mikrokontroleru koji ima dva serijska porta, HSERIN će da pristupi samo prvom; drugom treba pristupati direktno preko registara.

[nazad]

 

HSEROUT
hserout [item{, item, ...}]
 
Šalje jedan ili više 'item'-a na hardverski serijski port na kontroleru koji hardverski podržava serijsku komunikaciju. HSEROUT je jedna od nekoliko ugradjenih asinhronih serijskih funkcija i može da se koristi jedino sa kontrolerima koji imaju hardverski USART (univerzalni serijski asinhroni prijemnik- predajnik). Pogledajte podatke za tačne informacije o serijskom izlazu i ostalim parametrima za željeni uredjaj. Parametri za serijsku komunikaciju odredjuju se sa DEFINE:

    DEFINE HSER_RCSTA 90h 'postavlja prijemni registar na "prijem omogućen"
    DEFINE HSER_TXSTA 20h 'postavlja predajni registar na "predaja omogućena"
    DEFINE HSER_BAUD 2400 'definiše brzinu
    DEFINE HSER_SPBRG 25  'definiše direktno SPBRG (normalno se definiše pomocu HSER_BAUD)

HSEROUT pretpostavlja da je upotrebljen oscilator od 4 MHz pri računanju brzine. Ako koristite drugu frekvencu za oscilator, upotrebite DEFINE OSC da kažete PBP-u koju frekvencu koristite.
Unapred definisani format podatka je 8N1 (8 bitova podatka, bez bita parnosti, 1 stop bit). Moguće je koristiti i formate 7E1 i 7O1 koristeći respektivno sledeće DEFINE naredbe:

     DEFINE HSER_EVEN 1 'koristiti ako je potrebna parna provera parnosti
     DEFINE HSER_ODD 1  'koristiti ako je potrebna neparna provera parnosti

Podešavanje parnosti, zajedno sa ostalim DEFINE naredbama, utiče i na HSERIN i na HSEROUT. S obzirom da se serijsko slanje vrši hardverski, nije moguće invertovati stanje da bi se eliminisao RS232 drajver. Zbog toga treba koristiti odgovarajući drajver. HSERIN koristi iste modifikatore 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

Na 17Cxxx mikrokontroleru koji ima dva serijska porta, HSEROUT će da pristupi samo prvom; drugom treba pristupati direktno preko registara.

    hserout [dec b0, 10] 'salje decimalnu vrednost promenljive b0, zatim kod za novi red 

[nazad]

 

I2CREAD
i2cread datapin, clockpin, control, {address,}[var{, var...}]{, label}
 
Šalje 'control' i opciono 'adress' bajtove na 'clockpin' i 'datapin' i smešta primljene bajtove u promenljivu (ili u više njih). 'Clockpin' i 'datapin' mogu da budu konstanta, od 0 do 15, ili promenljiva koja sadrži broj od 0 do 15, ili ime pina (npr. porta.0).
I2CREAD i I2CWRITE naredbe mogu da se koriste za čitanje i upis podataka u serijski EEPROM sa I2C interfejsom kao što je 24C01 i sl. To omogućava smeštanje podataka u memoriju koja čuva podatke i nakon isključenja napajanja. Pomoću ovih naredbi takodje može da se komunicira sa ostalim uredjajima koji imaju I2C interfejs kao što su A/D konvertori, temperaturni senzori i sl.
Gornjih 7 bitova 'control' bajta sadrži kontrolni kod zajedno sa informacijom o izboru čipa, a u zavisnosti od konkretnog uredjaja. Bit 0 odredjuje da li je u pitanju upis ili čitanje i treba ga staviti na 0.
Na primer, kada se komunicira sa 24C01, kontrolni kod je %1010, a izbor čipa se ne koristi, tako da je 'control' bajt %10100000 ili $A0. Evo 'control' bajta za neke EEPROM-e:

EEPROM
Kapacitet
'control'
Veličina adrese
24LC01B
128 bajtova
%1010xxx0
1 bajt
24LC02B
256 bajtova
%1010xxx0
1 bajt
24LC04B
512 bajtova
%1010xxb0
1 bajt
24LC08B
1K bajt
%1010xbb0
1 bajt
24LC16B
2K bajta
%1010bbb0
1 bajt
24LC32B
4K bajta
%1010ddd0
2 bajta
24LC65
8K bajta
%1010ddd0
2 bajta

        xxx - nije važno
        bbb - izbor bloka (viši bitovi adrese)
        ddd - izbor čipa

Broj bitova koji se šalju za 'address' zavise od tipa upotrebljene promenljive; ako je BYTE, za 'address' se šalje 8 bitova, a ako je WORD, onda se šalje 16 bitova. Proverite da li ste odabrali odgovarajući tip promenljive za 'address' u skladu sa čipom.
Ako je za 'var' upotrebljena promenljiva tipa WORD, biće pročitana dva bajta i smeštena u 'var', prvo bajt veće težine, a zatim bajt manje težine. Ovaj redosled je suprotan u odnosu na standardni PBP način.
Modifikator STR može da se stavi ispred imena promenljive i na taj način može da se odjednom učita ceo niz. Ako se upotrebi STR, promenljiva koja sledi mora da bude niz tipa BYTE ili WORD, a zatim sledi kosa crta i broj koji odredjuje koliko se elemenata učitava.

a   var byte[8]
    i2cread portc.4, portc.3, $a0, 0, [str a/8]

Ako je opciono navedena labela 'label', program će da skoči na tu labelu ako nije primljena potvrda od I2C čipa.
I2C instrukcije mogu da se koriste za pristup EEPROM-ima u samom PIC-u koji ima ugradjen I2C interfejs, kao što su 12CExxx i 16CExxx. Jednostavno naznačite imena pinova za odgovarajuće interne linije kao deo I2C komande i stavite sledeću DEFINE na početku programa:

    DEFINE I2C_INTERNAL 1

Za 12CE67x kontrolere, DATA linija je GPIO.6, a CLOCK je GPIO.7. Za 16CE62x, DATA linija je EEINTF1, a CLOCK je EEINTF2.
Tajminzi su podešeni tako da se sa oscilatorom od 8 MHz dobija standardna brzina od 100 KHz. Brži mod (400 KHz) može da se dobije sa oscilatorima do 20 MHz. Ako je potrebna standardna brzina od 100 KHz sa oscilatorom preko 8 MHz, treba dodati sledeću DEFINE naredbu:

    DEFINE I2C_SLOW 1

Transfer na I2C magistrali može da se pauzira tako što prijemni uredjaj drži CLK liniju na niskom nivou. Da bi se to omogućilo, treba upotrebiti sledeću DEFINE naredbu:

    DEFINE I2C_HOLD 1

Linije DATA i CLK treba preko otpornika od 4K7 vezati na Vcc s obzirom da obe rade kao OPEN-COLLECTOR dvosmerne linije.
Da bi se CLK linija koristila u bipolarnom režimu, treba dodati sledeću DEFINE naredbu:

    DEFINE I2C_SCLOUT 1
primer:
addr var byte
cont con %10100000
addr=17 'postavi promenljivu addr na 17
i2cread porta.0, porta.1, cont, addr, [b2] 'čitaj adresu 17 i smesti u promenljivu b2

[nazad]

 

I2CWRITE
i2cwrite datapin, clockpin, control, {address, }[value{, value...}]{,label}
  Šalje 'control' i opciono 'adress' bajtove na 'clockpin' i 'datapin', a zatim šalje vrednosti promenljive 'value' (ili više njih). 'Clockpin' i 'datapin' mogu da budu konstanta, od 0 do 15, ili promenljiva koja sadrži broj od 0 do 15, ili ime pina (npr. porta.0).
Broj bitova koji se šalju za 'address' zavise od tipa upotrebljene promenljive; ako je BYTE, za 'address' se šalje 8 bitova, a ako je WORD, onda se šalje 16 bitova. Proverite da li ste odabrali odgovarajući tip promenljive za 'address' u skladu sa čipom.
Kada se vrši upis u EEPROM, neophodno je sačekati oko 10 ms da se završi proces upisa pre nego što se pokuša nova komunikacija sa čipom. Ako se primeni I2CREAD ili I2CWRITE pre nego što se upis završi, naredba će biti ignorisana. Iako sa jednom I2CWRITE naredbom može da se izvrši upis više bajtova odjednom, to može da naruši potrebne tajminge i da se upis ne izvrši pravilno. Neki serijski EEPROM-i omogućavaju upis više bajtova odjednom bez potrebe da se čeka 10 ms za upis izmedju pojedinih bajtova, već je dovoljno sačekati 10 ms za upis svih bajtova. Proverite podatke za odredjeni EEPROM pre upotrebe ove mogućnosti.
Ako je za 'value' upotrebljena promenljiva tipa WORD, šalju se 2 bajta, prvo bajt veće težine, a zatim bajt manje težine, što je suprotno od normalnog redosleda u PBP-u. Modifikator STR može da se stavi ispred imena promenljive i na taj način može da se odjednom upiše ceo niz, tj. da se iskoristi PAGE WRITE (upis stranice) mogućnost EEPROM-a. Veličina stranice zavisi od EEPROM-a. Ako se upotrebi STR, promenljiva koja sledi mora da bude niz tipa BYTE ili WORD, a zatim sledi kosa crta i broj koji odredjuje koliko se elemenata upisuje.

a   var byte[8]
    i2cwrite portc.4, portc.3, $a0, 0, [str a/8]

Ako je opciono navedena labela 'label', program će da skoči na tu labelu ako nije primljena potvrda od I2C čipa. I2C instrukcije mogu da se koriste za pristup EEPROM-ima u samom PIC-u koji ima ugradjen I2C interfejs, kao što su 12CExxx i 16CExxx. Jednostavno naznačite imena pinova za odgovarajuće interne linije kao deo I2C komande i stavite sledeću DEFINE na početku programa:

    DEFINE I2C_INTERNAL 1

Za 12CE67x kontrolere, DATA linija je GPIO.6, a CLOCK je GPIO.7. Za 16CE62x, DATA linija je EEINTF1, a CLOCK je EEINTF2.
Tajminzi su podešeni tako da se sa oscilatorom od 8 MHz dobija standardna brzina od 100 KHz. Brzi mod (400 KHz) može da se dobije sa oscilatorima do 20 MHz. Ako je potrebna standardna brzina od 100 KHz sa oscilatorom preko 8 MHz, treba dodati sledeću DEFINE naredbu:

    DEFINE I2C_SLOW 1

Transfer na I2C magistrali može da se pauzira tako što prijemni uredjaj drži CLK liniju na niskom nivou. Da bi se to omogućilo, treba upotrebiti sledeću DEFINE naredbu:

    DEFINE I2C_HOLD 1

Linije DATA i CLK treba preko otpornika od 4K7 vezati na Vcc s obzirom da obe rade kao OPEN-COLLECTOR dvosmerne linije. Da bi se CLK linija koristila u bipolarnom režimu, treba dodati sledeću DEFINE naredbu:

    DEFINE I2C_SCLOUT 1
primer:
addr var byte
cont con %10100000
    addr = 17                                   'postavi adresu na 17
    i2cwrite porta.0, porta.1, cont, addr, [6]  'upiši 6 na adresu 17
    pause 10                                    'sačekaj 10 ms da se upis završi
    addr = 1                                    'postavi adresu na 1
    i2cwrite porta.0, porta.1, cont, addr, [b2] 'upiši vrednost iz b2 na adresu 1
    pause 10                                    'sačekaj 10 ms da se upis završi

[nazad]

 

IF..THEN
if comp {and/or comp...} then label

if comp {and/or comp...} then
  statement...
else
  statement...
endif
  Vrši jedno ili više poredjenja. Svaki 'comp' izraz može da se odnosi na promenljivu i konstantu ili na promenljivu i drugu promenljivu i uključuje jedan od izraza za poredjenje navedenih ranije u sedmom delu ovog serijala, u odeljcima 4.18. i 4.19.
Rezultat poredjenja može biti tačan ili netačan (TRUE ili FALSE); ako je rezultat tačan, izvršava se operacija iza THEN, a ako je netačan, operacija iza THEN se ignoriše. Poredjenje koje za rezultat ima nulu smatra se netačnim, svaka druga vrednost smatra se za tačnu. Poredjenje je neoznačeno, jer PBP ne radi sa označenim brojevima. Ako je potrebno, upotrebite zagrade da bi ste odredili redosled kojim želite da se operatori testiraju.
IF... THEN naredba može da radi na dva načina; kod prvog načina THEN se ponaša kao GOTO i iza THEN može da se nalazi jedino labela: ako je rezultat poredjenja tačan, program nastavlja izvršenje od labele navedene iza THEN, a ako je rezultat netačan, program izvršava naredbu koja sledi posle IF...THEN.

    if pin0=0 then pushd    'ako je stanje na pin0=0, idi na labelu pushd

if b0>=40 then old 'ako je vrednost promenljive veća ili jednaka 40, idi na old

if portb.0=1 then itson 'ako je stanje na RB0=1, idi na labelu itson

if (b0=10) and (b1=20) then loop 'ako je vrednost b0=10 i istovremeno vrednost b1=20, 'idi na lebelu loop

Kod drugog načina, IF...THEN uslovno izvršava grupu naredbi 'statement' koja se nalazi iza THEN. Iza 'statement' mora da se nadje ELSE ili ENDIF da bi se struktura kompletirala.

    if b0 <>10 then    'ako je b0 različito od 10
      b0=b0+1          'uvećaj b0 za 1
      b1=b1-1          'i umanji b1 za 1
    endif              'kraj IF...THEN strukture

    if b0=20 then      'ako je b0 jednako 20
      led=1            'postavi promenljivu led na 1
    else               'u suprotnom
      led=0            'postavi promenljivu led na 0
    endif              'kraj IF...THEN strukture

[nazad]

 

INPUT
input pin

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

    input 0          'postavlja pin0 kao ulaz
    input porta.0    'postavlja RA0 kao ulaz

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

    trisb.0=1

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

    trisb=%11111111 'postavi sve pinove porta b kao ulazne

[nazad]