Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

TUTORIJAL: PicBasic Pro 3 i PIC16F1827

[es] :: Elektronika :: Mikrokontroleri :: TUTORIJAL: PicBasic Pro 3 i PIC16F1827
(TOP topic, by veselinovic)
Strane: < .. 1 2 3 4 5

[ Pregleda: 54036 | Odgovora: 88 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

rsinisa
Siniša Radanočević
Smederevo

Član broj: 2716
Poruke: 1586
*.dynamic.isp.telekom.rs.



+321 Profil

icon Re: TUTORIJAL: PicBasic Pro 3 i PIC16F182722.02.2013. u 20:26 - pre 135 meseci
Definisanje nizova
----------------------
Nizovi nam služe da lakše baratamo većim količinama podataka. Niz je ograničen uređen skup promenljivih istog tipa, koje se nazivaju
komponente niza. Komponente niza često nazivamo i elementima ili članovima niza. Svakom elementu niza pridružen je indeks, uz pomoć koga je moguće pristupiti odgovarajućem elementu. Mogu da budu jednodimenzioni ili višedimenzioni, a PBP poznaje samo jednodimenzione.

Kreiraju se isto kao i skalari s tim da se u uglastoj zagradi navede broj elemenata tog niza, a važe svi modifikatori kao i za kreiranje skalara. Npr. ako hoćemo da kreiramo niz pod nazivom "vrednost" tipa bajt od 10 elemenata uradićemo to ovako:

Code:

vrednost var byte[10]


Ovime smo kreirali niz od 10 promenljivih sa vrednostima indeksa od 0 do 9, tj. moglo bi da se kaže da smo kreirali 10 promenljivih koja se zovu:
vrednost[0], vrednost[1], vrednost[2], vrednost[3], vrednost[4], vrednost[5], vrednost[6], vrednost[7], vrednost[8] i vrednost[9]

Zbog načina na koji se nizovi smeštaju u RAM memoriji, broj elemenata je ograničen u zavisnosti od tipa niza i samog PIC MCU-a:


Tip PIC18 Ostali PIC-evi
====================================================
Bit 256 256
----------------------------------------------------
Byte ograničeno količinom 96
ugradjenog RAM-a
----------------------------------------------------
Word ograničeno količinom 48
ugradjenog RAM-a
----------------------------------------------------
Long ograničeno količinom nije omogućeno
ugradjenog RAM-a
----------------------------------------------------


Za PIC kontrolere sa 12-to ili 14-to bitnim jezgrom (PIC10, PIC12 i PIC16) jedan niz mora da se nadje unutar jedne banke, ali ne treba da mislite o tome, kompajler će da generiše grešku ako to nije u stanju da uradi.

---------------------------------------------------------------------------
Sva pitanja vezana za tutorijal možete da postavite u ovoj temi:

 
Odgovor na temu

rsinisa
Siniša Radanočević
Smederevo

Član broj: 2716
Poruke: 1586
*.dynamic.isp.telekom.rs.



+321 Profil

icon Re: TUTORIJAL: PicBasic Pro 3 i PIC16F182726.02.2013. u 09:16 - pre 134 meseci
Upotreba skalarnih promenljivih
--------------------------------------
Njihova upotreba je veoma jednostavna, samo navedete ime u komandi ili nekom izrazu, pri čemu treba imati na umu da PBP zna o kakvom tipu je reč i na osnovu toga donosi "odluke" pa morate da upotrebite odgovarajući tip za konkretne potrebe. Ne koristite promenljivu većeg tipa nego što Vam je potrebno jer ćete pri ispravnom korišćenju dobiti kraći i brži program. Ako npr. očekujete da vrednost neke promenljive ne predje 255, obavezno upotrebite BYTE tip promenljive. Takodje, ako vam je za neku indikaciju dovoljna informacija 1 ili 0, upotrebite BIT tip.

Primeri upotrebe:
Code:

B_port      var byte
lokacija    var word


    B_port = portb        ; vrednost B porta smesti u promenljivu 'B_port'
    lokacija = 0          ; promenljivoj 'lokacija' dodeli vrednost 0



Koristeći modifikatore moguće je pristupiti manjim elementima neke promenljive. Za promenljivu tipa BIT nema modifikatora jer je to najmanji mogući tip.
Za promenljivu tipa bajt može da se koristi modifikator .BITX ili samo .X gde X predstavlja bit (od 0 do 7) kome želimo da pristupimo, a to smo već videli u prethodnim primerima.

Code:

znak        var bit
brojac      var byte


    brojac.bit3 = 1
    brojac.5 = 0
    znak = brojac.7


Za promenljivu tipa WORD može da se koristi modifikator .X da bi se pristupilo odredjenom bitu s tim da je opseg za X od 0 do 15. Moguće je pristupiti i odredjenom bajtu pomoću modifikatora .BYTEX gde X može da bude 0 ili 1; 0 za bajt niže vrednosti i 1 za bajt više vrednosti. Šta je sad pa to, bajt niže ili više vrednosti? Obzirom da je bajt osnovna memorijska jedinica i može, kao što znamo, da ima vrednost od 0 do 255, za WORD tip se koriste 2 bajta i potrebno je nekako smestiti broj preko 255 u ta dva bajta. Da bismo to razumeli, najbolje je da posmatramo WORD tip kao da imamo brojni sistem sa osnovom 256 pa takav broj može da se predstavi formulom BYTE1 * 2561 + BYTE0 * 2560. Npr. broj 520 se nalazi u 2 bajta pri čemu je vrednost bajta veće vrednosti 2, a bajta manje vrednosti je 8. Proverićemo to zamenom u formuli:

BYTE1 * 2561 + BYTE0 * 2560 = 2 * 2561 + 8 * 2560 = 512 + 8 = 520

Primeri:
Code:

znak        var bit
brojac_l    var byte
brojac_h    var byte
brojac      var word

    znak = brojac.15
    brojac_h = brojac.byte1
    brojac_l = 0
    brojac.byte0 = brojac_l


U prethodnoj verziji PBP kompajlera za WORD tip umesto BYTE0 mogao je da se koristi modifikator LOWBYTE, a umesto BYTE1 modifikator HIGHBYTE. Od verzije 3 ovi modifikatori se ne pominju u uputstvu, iako mogu da se koriste i još uvek spadaju u rezervisane reči, ali da biste smanjili mogućnost zabune, ne preporučujem njihovu upotrebu.


Na isti način za promenljivu tipa LONG mogu da se koriste modifikatori za bit i bajt, s tim da za bit vrednost može da bude od 0 do 31, a za bajt od 0 do 3. Pošto se LONG tip pravi od 4 bajta, imamo i novi modifikator za ovaj tip, .WORDX gde X može da bude 0 ili 1, opet 0 za WORD niže vrednosti i 1 za WORD više vrednosti.

Da bi sve bilo jasnije, pogledajte sledeću tabelu koju možete da nadjete u PBP uputstvu:


---------------------------------------------------------------------------
Sva pitanja vezana za tutorijal možete da postavite u ovoj temi:


[Ovu poruku je menjao rsinisa dana 26.02.2013. u 12:03 GMT+1]
Prikačeni fajlovi
 
Odgovor na temu

rsinisa
Siniša Radanočević
Smederevo

Član broj: 2716
Poruke: 1586
*.dynamic.isp.telekom.rs.



+321 Profil

icon Re: TUTORIJAL: PicBasic Pro 3 i PIC16F182704.03.2013. u 09:21 - pre 134 meseci
Upotreba nizova promenljivih
-----------------------------------
Niz možemo da posmatramo kao listu vrednosti; navodjenjem imena niza pristupamo listi, a navodjenjem indeksa pristupamo odredjenoj vrednosti u toj listi, tj. odredjenom elementu niza. Indeks se navodi u uglastoj zagradi, a može da bude broj, neka druga promenljiva ili neki izraz.

Code:

redbr     var byte
x         var byte
vrednost  var byte
moj_niz   var byte[8]

    moj_niz[0] = 5
    vrednost = moj_niz[redbr]
    moj_niz[x / 2] = 24


Da ponovimo još jednom da indeks počinje od 0 i ide do broja elemenata umanjeno za 1. U ovom primeru indeks ide od 0 do 7 za niz 'moj_niz'. Veoma je važno da ne navedete indeks koji ne postoji jer PBP neće da generiše grešku u tom slučaju i uzeće neku vrednost koja se nalazi van niza pa ćete imati pogrešan rezultat.

Vrednosti elementima niza mogu biti dodeljene individualno jedan po jedan, kroz neku petlju, ili upotrebom naredbe ARRAYWRITE:

Code:

arraywrite moj_niz, [25, 187, 0, 254, 11, 200, 38, 99]


Iako PBP ne može da radi sa višedimenzionim nizovima, možemo da ih emuliramo koristeći više promenljivih.

Recimo da nam je potreban niz od 4 reda i dve kolone 'moj_niz[4, 2]' koji ćemo da definišemo kao jednodimenzioni od 8 elemenata:

Code:

x         var byte
y         var byte
moj_niz   var byte[8]

    x = 1
    y = 2
    moj_niz[(x * 4) + y] = 100


Modifikatori koji se koriste za skalarne promenljive ne mogu da se koriste za nizove pa, da bi pristupili nekom manjem elementu jedne promenljive iz niza, moramo da upotrebimo neku privremenu promenljivu. Recimo da hoćemo viši bajt jednog elementa niza da postavimo na 0:

Code:

temp_vord  var word
niz_vord   var word[8]

    temp_vord = niz_vord[3]
    temp_vord.byte1 = 0
    niz_vord[3] = temp_vord


---------------------------------------------------------------------------
Sva pitanja vezana za tutorijal možete da postavite u ovoj temi:

[Ovu poruku je menjao rsinisa dana 04.03.2013. u 22:38 GMT+1]
 
Odgovor na temu

rsinisa
Siniša Radanočević
Smederevo

Član broj: 2716
Poruke: 1586
*.dynamic.isp.telekom.rs.



+321 Profil

icon Re: TUTORIJAL: PicBasic Pro 3 i PIC16F182705.03.2013. u 09:58 - pre 134 meseci
Konstante
=======
Pored promenljivih, PBP nam omogućava da možemo da definišemo i konstante, tj. fiksne vrednosti. Ta mogućnost nam je korisna ako na više mesta u programu koristimo istu vrednost koja je podložna promenama ili nam služi za neka podešavanja. Konstanta ne zauzima nikakvu memoriju MCU-a, njena vrednost se jednostavno zameni u postupku kompajliranja.

Za definisanje naziva konstanti važe ista pravila kao i za nazive labela; može da sadrži cifre, slova i donju crtu, ali ne može da počne cifrom. Dužina je praktično neograničena, ali PBP uzima u obzir samo 31 karakter ako je naziv duži. Sasvim je svejedno da li je konstanta pisana velikim ili malim slovima, to znači da se konstante 'VREDNOST' i 'VredNOSt' tretiraju kao da su iste.

Konstante su interno definisane kao 16-tobitni neoznačeni broj, mada možete da navedete i negativan broj, ali će on biti pretvoren u pozitivan drugi komplement. Npr. broj -500 će biti tretiran kao 65036.
Za definisanje se koristi reč CON.

Primer upotrebe:

Code:

zadrska   con 300

    pause zadrska



Aliasi
====
Alias je u stvari drugo, alternativno ime za promenljive, delove promenljivih i registre. Za definisanje naziva aliasa važe potpuno ista pravila kao i za nazive konstanti.

Primer:
Code:

zadrska    var word
podaci     var byte[4]

pauza      var zadrska
pauza_low  var zadrska.byte0
podatak2   var podaci[1]

LED1       var portb.0
data_pin   var porta.2
clk_pin    var porta.3


Sa aliasima program može da bude razumljivi jer je naredba 'high LED1' mnogo jasnija nego 'high portb.0', a izmene lakše ako, npr. odlučite da u nekom trenutku data_pin premestite sa jednog pina na drugi.

U starijim verzijama se za definisanje aliasa koristila reč SYMBOL koja i dalje može da se upotrebljava, ali se to ne preporučuje.

---------------------------------------------------------------------------
Sva pitanja vezana za tutorijal možete da postavite u ovoj temi:
 
Odgovor na temu

rsinisa
Siniša Radanočević
Smederevo

Član broj: 2716
Poruke: 1586
*.dynamic.isp.telekom.rs.



+321 Profil

icon Re: TUTORIJAL: PicBasic Pro 3 i PIC16F182711.03.2013. u 05:04 - pre 134 meseci
Primer 11:
=======
U ovom primeru koristi se postavka 1.

Sada ćemo da napišemo program iz primera 3 uz upotrebu konstanti i aliasa.

Code:

pauza       con 500       ;definišemo konstantu
d1          var portb.0   ;definišemo alias za led D1
 
    osccon=%01101000      ;interni oscilator na 4MHz
    anselb=0              ;ceo port B digitalni
    
    trisb.0=0             ;postavi pin 0 porta B kao izlazni

pocetak:
    d1=1                  ;uključi LED povezanu na pin 0 porta B
    pause pauza           ;napravi pauzu od 500 milisekundi
    d1=0                  ;isključi LED povezanu na pin 0 porta B
    pause pauza           ;napravi pauzu od 500 milisekundi
    goto pocetak          ;idi na labelu pocetak

end


Vidimo da je program potpuno iste dužine kao i onaj iz primera 3, tj. 63 vorda, ali nam je sada lakše da promenimo pauzu izmedju uključenja i isključenja LED D1. Takodje je jednostavnije i promeniti LED sa kojom radimo, uz napomenu da pri promeni LED treba podesiti i TRISB registar.

---------------------------------------------------------------------------
Sva pitanja vezana za tutorijal možete da postavite u ovoj temi:
 
Odgovor na temu

rsinisa
Siniša Radanočević
Smederevo

Član broj: 2716
Poruke: 1586
*.dynamic.isp.telekom.rs.



+321 Profil

icon Re: TUTORIJAL: PicBasic Pro 3 i PIC16F182714.03.2013. u 09:38 - pre 134 meseci
Primer 12:
=======
U ovom primeru koristi se postavka 1.

Ovaj program pali svih 8 LED sekvencijalno jednu po jednu praveći tzv. trčeći "light show". Upotrebom konstante 'pauza' lako i brzo možemo da menjamo vreme izmedju dve promene, tj. da odredimo brzinu "trčanja" LE dioda.

Code:

pauza       con 500       ;definišemo konstantu za pauzu
d1          var portb.0   ;definišemo alias za led D1
d2          var portb.1   ;definišemo alias za led D2
d3          var portb.2   ;definišemo alias za led D3
d4          var portb.3   ;definišemo alias za led D4
d5          var portb.4   ;definišemo alias za led D5
d6          var portb.5   ;definišemo alias za led D6
d7          var portb.6   ;definišemo alias za led D7
d8          var portb.7   ;definišemo alias za led D8
 
    osccon=%01101000      ;interni oscilator na 4MHz
    anselb=0              ;ceo port B digitalni
    
    portb=0               ;isključimo sve LED
    trisb=0               ;postavi ceo port B kao izlazni

    do                    ;početak petlje
      d1=1                ;uključi LED povezanu na pin 0 porta B
      pause pauza         ;napravi pauzu
      d1=0                ;isključi LED povezanu na pin 0 porta B
      d2=1                ;uključi LED povezanu na pin 1 porta B
      pause pauza         ;napravi pauzu
      d2=0                ;isključi LED povezanu na pin 1 porta B
      d3=1                ;uključi LED povezanu na pin 2 porta B
      pause pauza         ;napravi pauzu
      d3=0                ;isključi LED povezanu na pin 2 porta B
      d4=1                ;uključi LED povezanu na pin 3 porta B
      pause pauza         ;napravi pauzu
      d4=0                ;isključi LED povezanu na pin 3 porta B
      d5=1                ;uključi LED povezanu na pin 4 porta B
      pause pauza         ;napravi pauzu
      d5=0                ;isključi LED povezanu na pin 4 porta B
      d6=1                ;uključi LED povezanu na pin 5 porta B
      pause pauza         ;napravi pauzu
      d6=0                ;isključi LED povezanu na pin 5 porta B
      d7=1                ;uključi LED povezanu na pin 6 porta B
      pause pauza         ;napravi pauzu
      d7=0                ;isključi LED povezanu na pin 6 porta B
      d8=1                ;uključi LED povezanu na pin 7 porta B
      pause pauza         ;napravi pauzu
      d8=0                ;isključi LED povezanu na pin 7 porta B
    loop                  ;kraj petlje

end



Vidimo da smo prvo isključili sve LED naredbom PORTB=0, a tek zatim postavili ceo B port kao izlazni. Na prvi pogled ovo bi moglo da deluje nelogično, ali obzirom da je po uključenju stanje B porta unapred nepoznato tj. proizvoljno, a sam port postavljen kao ulazni, ako bismo prvo postavili B port kao izlazni desilo bi se da bi neka od LED zasvetlela. Doduše, u našem slučaju to bi trajalo svega nekoliko µs što mi ne bismo primetili i nije toliko ni bitno, ali u slučaju da umesto LE diodama upravljamo nekim uredjajima kod kojih je to kratkotrajno uključenje nepoželjno, došlo bi do problema. Zato je dobra praksa da se pre prebacivanja porta u izlazni režim postavi početno stanje porta.

U tehničkim podacima u tabeli "TABLE 3-8" možete da vidite stanja svih registara nakon reseta; predzadnja kolona pokazuje stanja nakon POR (Power-On Reset, reset nakon uključenja napajanja) i BOR (Brown-Out Reset, reset nakon pada napona ispod dozvoljene granice), a zadnja pokazuje stanja nakon svih ostalih reseta. Na osnovu toga možete da vidite da li po uključenju imate potrebe da postavite odredjeno početno stanje za neki registar.

Vidimo i da smo izbacili GOTO naredbu i ubacili dve nove, DO i LOOP, koje čine celinu, a puna sintaksa glasi:

DO {UNTIL uslov} {WHILE uslov} 
naredba...
LOOP {UNTIL uslov} {WHILE uslov}


Ova naredba se koristi za ponavljanje bloka naredbi koje se nalaze izmedju DO i LOOP. Ono što je napisano u vitičastim zagradama je opciono, tj. upotrebljava se po potrebi. Mi smo ovde upotrebili samo osnovnu varijantu bez ikakvih uslova i u tom slučaju se ceo blok naredbi izvršava u tzv. petlji i to beskonačno, sve do isključenja napajanja.

Ako je potrebno da se izvršavanje prekine ako je ispunjen neki uslov, koriste se opcije "UNTIL uslov" i "WHILE uslov" pri čemu se kod UNTIL izvršavanje prekida kada uslov postane tačan, a kod WHILE kada uslov postane netačan.
Ako se ispitivanje koristi u liniji gde se nalazi "DO", ispitivanje se vrši pre ulaska u petlju i ako uslov za ulazak u petlju nije zadovoljen, program se preusmerava na prvu naredbu posle LOOP.
Ako se ispitivanje koristi u liniji gde se nalazi "LOOP", ispitivanje se vrši nakon prolaska kroz petlju što znači da će se blok naredbi izvršiti bar jednom, čak i ako uslov nije ispunjen.

Za prevremeni izlaz iz petlje može da se upotrebi naredba EXIT.

Takodje vidimo i da smo sve naredbe izmedju DO i LOOP pomerili udesno što nije obavezno, ali je dobra programerska praksa kako bi se jasno video blok naredbi tj. jedna petlja. Ta praksa naročito može da bude korisna ako imate ugnježdene petlje, tj. petlju unutar petlje pa lako možete da vidite da li ste sve petlje "zatvorili" jer ako niste, kompajler će da javi grešku, a ako ste sve pisali ravno, imaćete problem da brzo utvrdite gde ste pogrešili.

Primeri upotrebe:
Code:

    i = 1  
    DO  
      SEROUT 0,N2400,["No:",#i,13,10] 
      i = i + 1  
    LOOP UNTIL i > 10  
 
 
    i = 1  
    DO WHILE i <= 10  
      SEROUT 0,N2400,["No:",#i,13,10] 
      i = i + 1  
    LOOP  
 
 
    i = 1  
    DO  
      SEROUT 0,N2400,["No:",#i,13,10] 
      i = i + 1  
      IF PORTB.0 = 0 THEN EXIT 
    LOOP WHILE i <= 10  
 


U ranijim verzijama PBP-a koristile su se dve naredbe za formiranje ovakvih petlji, REPEAT ... UNTIL i WHILE ... WEND koje su podržane i u ovoj verziji radi kompatibilnosti, ali je preporuka da se upotrebljava isključivo DO ... LOOP.

---------------------------------------------------------------------------
Sva pitanja vezana za tutorijal možete da postavite u ovoj temi:

[Ovu poruku je menjao rsinisa dana 14.03.2013. u 14:49 GMT+1]
 
Odgovor na temu

rsinisa
Siniša Radanočević
Smederevo

Član broj: 2716
Poruke: 1586
*.dynamic.isp.telekom.rs.



+321 Profil

icon Re: TUTORIJAL: PicBasic Pro 3 i PIC16F182726.03.2013. u 11:18 - pre 134 meseci
Primer 13:
=======
U ovom primeru koristi se postavka 1.


Ovo je isti program kao i prethodni, ali uz ograničenje broja izvršavanja petlje.

Code:

pauza       con 500       ;definišemo konstantu za pauzu
d1          var portb.0   ;definišemo alias za led D1
d2          var portb.1   ;definišemo alias za led D2
d3          var portb.2   ;definišemo alias za led D3
d4          var portb.3   ;definišemo alias za led D4
d5          var portb.4   ;definišemo alias za led D5
d6          var portb.5   ;definišemo alias za led D6
d7          var portb.6   ;definišemo alias za led D7
d8          var portb.7   ;definišemo alias za led D8

i           var byte      ;promenljiva za brojač

    include "1827_cfg1.pbp"
    DEFINE OSC 4 

inic:
    osccon=%01101000      ;interni oscilator na 4MHz
    anselb=0              ;ceo port B digitalni
    
    portb=0               ;isključimo sve LED
    trisb=0               ;postavi ceo port B kao izlazni
    i=0                   ;početna vrednost za promenljivu "i"


    do                    ;početak petlje
      d1=1                ;uključi LED povezanu na pin 0 porta B
      pause pauza         ;napravi pauzu
      d1=0                ;isključi LED povezanu na pin 0 porta B
      d2=1                ;uključi LED povezanu na pin 1 porta B
      pause pauza         ;napravi pauzu
      d2=0                ;isključi LED povezanu na pin 1 porta B
      d3=1                ;uključi LED povezanu na pin 2 porta B
      pause pauza         ;napravi pauzu
      d3=0                ;isključi LED povezanu na pin 2 porta B
      d4=1                ;uključi LED povezanu na pin 3 porta B
      pause pauza         ;napravi pauzu
      d4=0                ;isključi LED povezanu na pin 3 porta B
      d5=1                ;uključi LED povezanu na pin 4 porta B
      pause pauza         ;napravi pauzu
      d5=0                ;isključi LED povezanu na pin 4 porta B
      d6=1                ;uključi LED povezanu na pin 5 porta B
      pause pauza         ;napravi pauzu
      d6=0                ;isključi LED povezanu na pin 5 porta B
      d7=1                ;uključi LED povezanu na pin 6 porta B
      pause pauza         ;napravi pauzu
      d7=0                ;isključi LED povezanu na pin 6 porta B
      d8=1                ;uključi LED povezanu na pin 7 porta B
      pause pauza         ;napravi pauzu
      d8=0                ;isključi LED povezanu na pin 7 porta B

      i=i+1               ;uvećaj brojač za 1
    loop until i=4        ;izvršavaj petlju dok "i" ne bude 4

end


Posle definisanja promenljive "i" tipa bajt, koju ćemo da koristimo kao brojač prolazaka kroz petlju, imamo novu naredbu INCLUDE posle koje sledi naziv fajla. Ta naredba jednostavno na tom mestu ubaci sadržaj navedenog fajla, kao da smo mi ukucali taj tekst. Sintaksa za nju glasi:

INCLUDE "naziv_fajla"

U fajl pod nazivom "1827_cfg1.pbp" smo stavili konfiguraciju koju smo koristili do sada i koju do sada nismo navodili u primerima već smo morali na početku programa da je ukucamo prepisujući je iz poruke u kojoj se nalazi konfiguracija. Sada tu konfiguraciju ne morate više da kucate u programu, sada je izdvojena u poseban fajl koji je priključen uz ovu poruku i da biste mogli da ga koristite, stavite ga u isti direktorijum u kome su vam primeri.

Naredba "i=0" dodeljuje početnu vrednost promenljivoj "i". Puna sintaksa za tu naredbu glasi:

{LET} promenljiva = vrednost

pri čemu je naredba LET opciona, tj. ne mora da se koristi. Vrednost može da bude broj, druga promenljiva ili izraz. Npr:

Code:
LET p1 = 26
LET p1 = p2
p1 = p1 * 2
p1 = p3 * 4
p1 = p2 * p3 + 10


Pre naredbe LOOP imamo izraz "i=i+1" koji uvećava staro stanje promenljive "i" za 1 i to novo stanje opet dodeljuje promenljivoj "i"; time postižemo brojanje prolazaka kroz DO ... LOOP petlju.

Posle naredbe LOOP dodali smo i uslov za izlazak koji u ovom slučaju prekida izvršavanje petlje kada vrednost za i postane 4, tj. nakon 4 ciklusa program se zaustavlja.

---------------------------------------------------------------------------
Sva pitanja vezana za tutorijal možete da postavite u ovoj temi:

[Ovu poruku je menjao rsinisa dana 26.03.2013. u 12:32 GMT+1]
Prikačeni fajlovi
 
Odgovor na temu

rsinisa
Siniša Radanočević
Smederevo

Član broj: 2716
Poruke: 1586
*.dynamic.isp.telekom.rs.



+321 Profil

icon Re: TUTORIJAL: PicBasic Pro 3 i PIC16F182705.04.2013. u 09:57 - pre 133 meseci
Primer 14:
=======
U ovom primeru koristi se postavka 1.

Efekat trčećeg svetla može da se postigne na više načina; u primeru 12 upotrebljen je najočigledniji, a u ovom je primenjen način koji početnicima verovatno nije najjasniji.

Code:

pauza       con 500       ;definišemo konstantu za pauzu

    include "1827_cfg1.pbp"
    DEFINE OSC 4 

inic:
    osccon=%01101000      ;interni oscilator na 4MHz
    anselb=0              ;ceo port B digitalni
    
    latb=1                ;uključimo LED D1
    trisb=0               ;postavi ceo port B kao izlazni


    do                    ;početak petlje
      pause pauza         ;napravi pauzu
      latb=latb * 2       ;dupliraj vrednost za LATB
      if latb=0 then      ;ako je vrednost B leča = 0
        latb=1            ;postavi ga na 1
      endif               ;kraj IF ispitivanja
    loop                  ;kraj petlje

end




Pre nego što objasnimo program da vidimo prvo šta se dešava sa vrednostima B porta kod efekta trčećeg svetla. Napisaćemo svih 8 kombinacija, njihove binarne i dekadne vrednosti:


00000001 1
00000010 2
00000100 4
00001000 8
00010000 16
00100000 32
01000000 64
10000000 128


Vidimo da je vrednost B porta za svaku sledeću kombinaciju tačno 2 puta veća od prethodne, što je i logično obzirom na binarni sistem. To znači da za sledeću kombinaciju ne moramo da isključimo prethodno upaljenu LED pa da uključimo sledeću već možemo prethodnu vrednost da pomnožimo sa 2 i dobijemo sledeću, a to upravo i radimo u ovom primeru. Na ovaj način program je nešto lakši za pisanje, a i kraći od primera 12 za 13 vorda.

Naredbom "latb=1" postavimo početnu vrednost za leč porta B, tj. uključimo LED D1. Nakon toga u "DO ... LOOP" petlji pravimo pauzu koliko želimo da nam svetli jedna LED i zatim vrednost leča množimo sa 2 kako bismo dobili sledeću vrednost. Zatim imamo novu naredbu čiji je osnovni oblik "IF ... THEN" (kompletna sintaksa će biti objašnjena u sledećoj poruci) koja vrši poredjenje vrednosti registra LATB i ako je nula, dodeljuje mu ponovo vrednost 1, tj. ponovo uključuje D1.

Postavlja se pitanje kako je moguće da vrednost LATB registra bude 0 ako je početna vrednost 1, a svaka sledeća je duplo veća. To je zato što je LATB registar 8-bitni tj. njegova maksimalna vrednost je 255. Posle sedmog množenja njegova vrednost je 128 što znači da posle sledećeg množenja vrednost treba da bude 256, ali ona prevazlilazi maksimum za bajt pa njegova vrednost postaje 0. Da nam je potrebna regularna vrednost matematičke operacije, ovo bi bila greška, tj. očekivani rezultat nikada ne bismo dobili, ali u ovom slučaju nam ta greška omogućava da proverimo da li je trčeće svetlo došlo do poslednje kombinacije kako bismo ponovo postavili početnu.

---------------------------------------------------------------------------
Sva pitanja vezana za tutorijal možete da postavite u ovoj temi:


[Ovu poruku je menjao rsinisa dana 06.04.2013. u 14:24 GMT+1]
 
Odgovor na temu

rsinisa
Siniša Radanočević
Smederevo

Član broj: 2716
Poruke: 1586
*.dynamic.isp.telekom.rs.



+321 Profil

icon Re: TUTORIJAL: PicBasic Pro 3 i PIC16F182708.04.2013. u 11:12 - pre 133 meseci
IF ... THEN naredba
=============

IF uslov {AND/OR uslov...} THEN labela

IF uslov {AND/OR uslov...} THEN naredba...

IF uslov {AND/OR uslov...} THEN
naredba...
{ELSEIF uslov {AND/OR uslov...} THEN
naredba...}
{ELSE
naredba...}
ENDIF


Ova naredba vrši poredjenje jednog ili više uslova, a uslov može da bude promenljiva, konstanta ili izraz. Ona uporedjuje da li je uslov tačan (istinit) ili ne; ako je tačan, izvršava se naredba (ili blok naredbi) iza THEN. Ako je vrednost uslova 0, smatra se netačnim, a sve ostale vrednosti se smatraju tačnim. Uz pomoć operatora AND i OR moguće je ispitivati više uslova i potrebno je koristiti zagrade kako bi se odredio redosled testiranja.

IF ... THEN naredba može da se koristi u jednoj liniji ili kao višelinijski blok. Ako se koristi u jednoj liniji tada iza THEN mora da se nadje jedna naredba ili više razdvojenih dvotačkom, a ako je ta naredba GOTO, onda je dovoljno umesto GOTO navesti samo labelu na koju treba izvršiti skok.

Primeri:
Code:

    if porta.5=0 then portb.0=1  ; ako je RA5=0 postavi RB0 na 1
    if portb.7=1 then podesi     ; ako je RB7=1 idi na labelu podesi


U višelinijskom obliku iza THEN se navodi blok naredbi i u tom slučaju iza THEN ne sme da stoji ni jedna naredba već se one pišu ispod nje. Ceo blok se završava sa ENDIF naredbom.

Primer:
Code:

    if porta.5=1 then
      a=x * 2 + 1
      d1=1
      pause pauza
    endif


Moguće je izvršiti i naredbe u slučaju da uslov nije ispunjen pomoću naredbi ELSE i ELSEIF. Prva omogućava izvršavanje jedne ili više naredbi u slučaju da uslov nije ispunjen, a druga omogućava novo ispitivanje, kao da samo napisali novu IF naredbu, takodje ako uslov nije ispunjen.

Primeri:
Code:

    if x=1 then    ; ako je x=1
      portb.0=0    ; postavi RB0 na 0
    else           ; u protivnom
      portb.0=1    ; postavi RB0 na 1
    endif          ; kraj IF bloka


    if x=20 then   ; ako je x=20   
      d1=1         ; postavi d1 na 1
    elseif x=40    ; u protivnom da li je x=40
      d2=1         ; ako jeste, postavi d2 na 1
    else           ; ako nije
      d1=0         ; onda postavi d1 na 0
    endif          ; kraj if bloka


---------------------------------------------------------------------------
Sva pitanja vezana za tutorijal možete da postavite u ovoj temi:
 
Odgovor na temu

rsinisa
Siniša Radanočević
Smederevo

Član broj: 2716
Poruke: 1586
*.dynamic.isp.telekom.rs.



+321 Profil

icon Re: TUTORIJAL: PicBasic Pro 3 i PIC16F182709.04.2013. u 07:05 - pre 133 meseci
Primer 15:
=======
U ovom primeru koristi se postavka 1.

Ovaj primer radi isto što i prethodni sa tom razlikom da smo množenje brojem 2 zamenili sabiranjem sa samim sobom, što je potpuno isto u matematičkom smislu, a da li je i u dužini programa?

Code:

pauza       con 500       ;definišemo konstantu za pauzu

    include "1827_cfg1.pbp"
    DEFINE OSC 4 

inic:
    osccon=%01101000      ;interni oscilator na 4MHz
    anselb=0              ;ceo port B digitalni
    
    latb=1                ;uključimo LED D1
    trisb=0               ;postavi ceo port B kao izlazni


    do                    ;početak petlje
      pause pauza         ;napravi pauzu
      latb=latb + latb    ;dupliraj vrednost za LATB
      if latb=0 then      ;ako je vrednost B leča = 0
        latb=1            ;postavi ga na 1
      endif               ;kraj IF ispitivanja
    loop                  ;kraj petlje

end


Ovaj program zauzima samo 73 vorda, čak 29 manje od prethodnog primera. Razlog za to je što ovaj PIC, kao i ostali iz ove serije, od aritmetičkih operacija u jezgru nema implementirano ništa sem sabiranja i oduzimanja pa je množenje realizovano kao potprogram koji se sastoji iz dvadesetak asemblerskih instrukcija.

Ako imate mali broj množenja, a bitno Vam je da utrošak programske memorije bude što manji, vidite da li možete da ga zamenite nekim sabiranjem. Pošto se ova operacija realizuje kao potprogram, kod svakog sledećeg množenja potprogramu se prenose samo argumenti tako da se kod velikog broja množenja vrlo verovatno ne isplati menjati ih sabiranjem. U svakom slučaju, probajte na nekoliko načina.

A ako Vam utrošak memorije ne igra ulogu, jednostavno koristite množenje ako Vam je tako lakše i brže.

---------------------------------------------------------------------------
Sva pitanja vezana za tutorijal možete da postavite u ovoj temi:


[Ovu poruku je menjao rsinisa dana 09.04.2013. u 09:51 GMT+1]
 
Odgovor na temu

rsinisa
Siniša Radanočević
Smederevo

Član broj: 2716
Poruke: 1586
*.dynamic.isp.telekom.rs.



+321 Profil

icon Re: TUTORIJAL: PicBasic Pro 3 i PIC16F182715.04.2013. u 09:57 - pre 133 meseci
Primer 16:
=======
U ovom primeru koristi se postavka 1.

Ako nam treba suprotan smer "trčanja" LED-ova, možemo da upotrebimo ovaj program:

Code:

pauza       con 500       ;definišemo konstantu za pauzu

    include "1827_cfg1.pbp"
    DEFINE OSC 4 

inic:
    osccon=%01101000      ;interni oscilator na 4MHz
    anselb=0              ;ceo port B digitalni
    
    latb=128              ;uključimo LED D8
    trisb=0               ;postavi ceo port B kao izlazni


    do                    ;početak petlje
      pause pauza         ;napravi pauzu
      latb=latb / 2       ;prepolovi vrednost za LATB
      if latb=0 then      ;ako je vrednost B leča = 0
        latb=128          ;postavi ga na 128
      endif               ;kraj IF ispitivanja
    loop                  ;kraj petlje

end


Program je praktično isti kao primer 14 sem što u inicijalizaciji LATB postavljamo na 128 kako bi uključili LED D8, a da bi uključili sledeću LED koristi se deljenje sa 2, dok je uslov za ispitivanje poslednje kombinacije ostao isti jer je posle sedmog deljenja vrednost za LATB jednaka 1, tako da posle osmog deljenja dobijemo nulu obzirom da se radi o celim brojevima.

Vidimo da ovaj primer troši manje programske memorije od primera 14 što znači da je deljenje realizovano kao kraći potprogram od množenja.

---------------------------------------------------------------------------
Sva pitanja vezana za tutorijal možete da postavite u ovoj temi:

[Ovu poruku je menjao rsinisa dana 15.04.2013. u 20:00 GMT+1]
 
Odgovor na temu

rsinisa
Siniša Radanočević
Smederevo

Član broj: 2716
Poruke: 1586
*.dynamic.isp.telekom.rs.



+321 Profil

icon Re: TUTORIJAL: PicBasic Pro 3 i PIC16F182725.04.2013. u 07:30 - pre 133 meseci
Primer 17:
=======
U ovom primeru koristi se postavka 1.

Prethodni primer ne možemo da optimizujemo analogno onome kao što smo uradili sa primerom 14 u primeru 15, tj. ne možemo sabiranje sa samim sobom da zamenimo oduzimanjem jer bi rezultat odmah bio nula. Medjutim, ipak možemo da izbegnemo deljenje i dobijemo kraći program upotrebom jedne operacije koja se zove pomeranje, odn. šiftovanje.

Code:

pauza       con 500       ;definišemo konstantu za pauzu

    include "1827_cfg1.pbp"
    DEFINE OSC 4 

inic:
    osccon=%01101000      ;interni oscilator na 4MHz
    anselb=0              ;ceo port B digitalni
    
    latb=128              ;uključimo LED D8
    trisb=0               ;postavi ceo port B kao izlazni


    do                    ;početak petlje
      pause pauza         ;napravi pauzu
      latb=latb >> 1      ;pomeri bitove udesno za jedno mesto
      if latb=0 then      ;ako je vrednost B leča = 0
        latb=128          ;postavi ga na 128
      endif               ;kraj IF ispitivanja
    loop                  ;kraj petlje

end


U ovom primeru vidimo da je linija "latb=latb / 2" zamenjena sa "latb=latb >> 1". Dva znaka "veće" (>>) predstavljaju operator pomeranja udesno, a broj iza označava za koliko bitova se vrši pomeranje. Analogno tome, dva znaka "manje" (<<) predstavljaju pomeranje ulevo, a iza se takodje navodi broj bitova. Upotrebom ovog operatora umesto deljenja uštedeli smo 17 vorda programske memorije.

Ovaj operator vrši pomeranje bitova za onoliko mesta za koliko je navedeno pri čemu se gube bitovi koji "izlaze", a na mesto novih se ubacuju nule. Da bi bilo jasnije, pogledajmo primer ako u promenljivoj X tipa bajt imamo broj 100, tj. binarno 01100100:

X=%01100100

Y=X << 1       ; Y=%11001000
Y=X << 2 ; Y=%10010000
Y=X << 3 ; Y=%00100000

Y=X >> 1 ; Y=%00110010
Y=X >> 2 ; Y=%00011001
Y=X >> 3 ; Y=%00001100


Na ovaj način ujedno ostvarujemo brzo množenje ili deljenje brojem koji je stepen broja 2, tj. brojevima 2, 4, 8, 16 itd. Pomeranje udesno je deljenje, dok je pomeranje ulevo množenje. Naravno, pri tome morate da pazite na bitove koji "izlaze" iz promenljive jer možete da dobijete pogrešan rezultat.

Spisak svih operatora možete da vidite u PBP uputstvu u tabelama na stranama 68 i 69.

---------------------------------------------------------------------------
Sva pitanja vezana za tutorijal možete da postavite u ovoj temi:
 
Odgovor na temu

rsinisa
Siniša Radanočević
Smederevo

Član broj: 2716
Poruke: 1586
*.dynamic.isp.telekom.rs.



+321 Profil

icon Re: TUTORIJAL: PicBasic Pro 3 i PIC16F182705.05.2013. u 22:19 - pre 132 meseci
Primer 18:
=======
U ovom primeru koristi se postavka 1.

Prethodni primer može da se napiše tako da potroši još 6 vorda manje uz pomoć asmeblerskih naredbi koje smo upotrebili kako bismo se polako upoznavali sa njima jer nam njihovo poznavanje može biti od koristi kada budemo radili interapte. Njihovom upotrebom ostvarili smo i optimizaciju u smislu uštede programske memorije, mada postoji mišljenje da je danas sa ovim cenama bolje kupiti kontroler sa više memorije nego trošiti vreme na optimizaciju koja smanjuje veličinu programa. Optimizacija ili ne, odlučite sami šta više odgovara vašim potrebama i stilu pogramiranja.

Code:

pauza       con 500       ;definišemo konstantu za pauzu

    include "1827_cfg1.pbp"
    DEFINE OSC 4 

inic:
    osccon=%01101000      ;interni oscilator na 4MHz
    anselb=0              ;ceo port B digitalni
    
    latb=128              ;uključimo LED D8
    trisb=0               ;postavi ceo port B kao izlazni


    do                    ;početak petlje
      pause pauza         ;napravi pauzu
asm
      bcf STATUS, C       ;resetuj CARRY bit
      rrf LATB, 1         ;rotiraj udesno LATB registar
endasm
      if latb=0 then      ;ako je vrednost B leča = 0
        latb=128          ;postavi ga na 128
      endif               ;kraj IF ispitivanja
    loop                  ;kraj petlje

end


Sve BASIC naredbe su nam poznate pa ćemo da se posvetimo asemblerskim. Prva, "bcf STATUS, C" ima sintaksu koja glasi:

bcf f, b

Reč "bcf" je skraćenica od "bit clear file" gde "bit" označava da radimo sa jednim bitom, "clear" da "čistimo" oredjeni bit, tj. da ga postavljamo na 0, a "file" označava odredjenu promenljivu koja može da bude ili SFR ili neka naša promenljiva, tj. bilo koja lokacija u RAM-u kontrolera. Slovo "f" iza reči "bcf" označava da sledi naziv registra, a slovo "b" označava da sledi oznaka bita koji se resetuje - oznaka može da bude broj ili naziv bita. Da bi se koristio naziv, pre toga mora da bude definisan. Kraće rečeno, ova naredba resetuje odredjeni bit u nekom registru. A konkretno u ovom primeru ova naredba resetuje, tj. postavlja na nulu, u registru koji se zove STATUS, bit označen slovom C.

Naziv ovog registra i naziv bita su već definisani u PBP-u (kao i svi ostali SFR registri i njihovi bitovi) i njihove nazive MORAMO da pišemo velikim slovima u asemblerskim naredbama.

STATUS je SFR registar, čiji kompletan opis možete da vidite u tehničkim podacima na strani 21, koji čuva informacije o, kako mu i ime kaže, statusu nekih dogadjaja u kontroleru. Njegov bit 0 ima naziv "C" od reči "carry" koji služi kao informacija o prekoračenju rezultata nakon sabiranja ili oduzimanja. On se takodje koristi i u sledećoj naredbi u programu i ubrzo ćete videti zašto smo ga resetovali.

Postoji i asemblerska naredba koja setuje, tj. postavlja na 1 neki bit, a njena sintaksa glasi:

bsf f, b

Reč "bsf" je skraćenica od "bit set file".


Sledeća naredba u programu je "rrf LATB, 1" čija sintaksa glasi:

rrf f, d

Reč "rrf" je skraćenica od "rotate right file" što znači "rotiraj udesno promenljivu"; slovo "f" iza reči "rrf" označava da sledi naziv registra ili promenljive, a slovo "d" označava odredište ("destination") koje može da bude ista ta promenljiva, ili može da bude "w" registar. Ako je odredište ista ta promenljiva, umesto "d" pišemo broj 1, a ako je "w" registar, onda pišemo broj 0. Registar "w" je interni registar kontrolera, slovo "w" potiče od naziva "working registar" i jedini je registar koji nije smešten u RAM, a služi za prenos podataka izmedju RAM lokacija i vrši matematičko-logičke operacije sa RAM lokacijama.

Naredba "rrf" radi rotaciju samo za jedan bit, ali radi rotaciju kroz C bit STATUS registra što može da nam napravi problem. Da bi bilo jasnije, evo slike koja pojašnjava šta se tačno dešava:



Vidimo da kod rotacije udesno (postoji i naredba za rotaciju ulevo) bit 7 prelazi na mesto bita 6, bit 6 na mesto bita 5 itd sve do bita 0 koji prelazi na mesto C bita, dok C bit prelazi na mesto bita 7. Pošto nama nije potrebna rotacija već pomeranje, pre samog rotiranja moramo C bit STATUS registra da postavimo na 0 kako ne bi smo "vrteli" u krug ceo registar.

Pažljiv posmatrač može da vidi da u konkretnom primeru, pošto nam je u LATB registru samo jedan bit setovan, naredba "bcf STATUS, C" može da se izostavi, ali generalno nam je neophodna za "pretvaranje" asemblerske naredbe za rotiranje u naredbu za pomeranje jer ovaj PIC nema asemblersku naredbu za pomeranje bitova.

Pomenuli smo i naredbu za rotiranje ulevo i verovatno ste već pogodili kako glasi njena sintaksa:

rlf f, d

Reč "rlf" je skraćenica od, pogadjate, "rotate left file", a evo i slikovnog prikaza njenog delovanja:



---------------------------------------------------------------------------
Sva pitanja vezana za tutorijal možete da postavite u ovoj temi.

Prikačeni fajlovi
 
Odgovor na temu

rsinisa
Siniša Radanočević
Smederevo

Član broj: 2716
Poruke: 1586
*.dynamic.isp.telekom.rs.



+321 Profil

icon Re: TUTORIJAL: PicBasic Pro 3 i PIC16F182716.05.2013. u 10:44 - pre 132 meseci
Naredba LOOKUP
==========
Ova naredba će nam trebati za sledeće primere, a sintaksa glasi:

LOOKUP index, [konstanta {,konstanta ...}], promenljiva

Ova naredba se koristi da uzme vrednost iz liste (ili tabele, drugačije rečeno) 8-bitnih konstanti. Ako je vrednost za indeks jednaka nuli, u promenljivu se upisuje prva konstanta iz liste, ako je vrednost za indeks 1, u promenljivu se upisuje druga konstanta iz liste i tako dalje. Ako je vrednost za indeks jednaka broju elemenata u listi ili veća od njega, promenljiva neće da promeni svoju vrednost. Lista konstanti može da bude kombinacija brojeva i stringova.

Da ukratko objasnimo šta je string. Najkraće rečeno to je niz znakova, a u znakove se ubrajaju slova, brojevi, znakovi interpukcije, specijalni simboli i sve ono što može da se prikaže na ekranu ili odštampa kao neki tekst. Stringovi se u PBP-u stavljaju izmedju znakova navoda tako da je "123" string, a 123 je broj. Još neki primeri stringova: "asdfgh", "0123ABcde", "PBP=PicBasic PRO". Važno je napomenuti da svaki element stringa ima neku brojčanu vrednost, a ona je jednaka vrednosti njegovog ASCII koda.

Za naredbu LOOKUP u listi mogu da se koriste nizovi sa konstanim indeksom, ali ne i sa promenljivim indeksom. Jedna lista može da sadrži maksimalno 255 konstanti (za PIC18 seriju do 1024 konstanti).

Naredba LOOKUP2
==========
Sintaksa je ista kao i za naredbu LOOKUP:

LOOKUP2 index, [konstanta {,konstanta ...}], promenljiva

Njena funkcija je ista kao za naredbu LOOKUP uz par razlika, a to su: lista može da sadrži kombinaciju 8-mo i 16-bitnih brojevnih konstanti, stringova i promenljivih. Izrazi ne mogu da se koriste u listi, ali mogu da se koriste kao indeks. Maksimalan broj elemenata je 85 (1024 za PIC18 seriju).

Ova naredba generiše oko 3 puta veći kod u odnosu na LOOKUP naredbu pa je koristite samo ako vam nisu dovoljne 8-bitne vrednosti u listi.

---------------------------------------------------------------------------
Sva pitanja vezana za tutorijal možete da postavite u ovoj temi:

[Ovu poruku je menjao rsinisa dana 16.05.2013. u 12:22 GMT+1]
 
Odgovor na temu

rsinisa
Siniša Radanočević
Smederevo

Član broj: 2716
Poruke: 1586
*.host.redstation.co.uk.



+321 Profil

icon Re: TUTORIJAL: PicBasic Pro 3 i PIC16F182720.05.2013. u 14:14 - pre 132 meseci
Primer 19:
=======
U ovom primeru koristi se postavka 1.

U prethodnim primerima pravili smo efekat trčećeg svetla koristeći matematičke operacije. Medjutim, u slučaju kada ne možemo da izračunamo sledeću kombinaciju jedini način da uradimo nešto takvo je upotreba tabele i u tu svrhu u PBP-u je implementirana naredba LOOKUP koju smo upotrebili u ovom primeru.

Code:

brojac      var byte      ;definišemo promenljivu tipa bajt
pauza       con 500       ;definišemo konstantu za pauzu

    include "1827_cfg1.pbp"
    DEFINE OSC 4 

inic:
    osccon=%01101000      ;interni oscilator na 4MHz
    anselb=0              ;ceo port B digitalni
    latb=0                ;isključimo sve LED
    trisb=0               ;postavi ceo port B kao izlazni

pocetak:
    brojac=0              ;resetuj vrednost brojača
tabela:
    lookup brojac, [128, 192, 224, 240, 248, 252,_
    254, 255, 127, 63, 31, 15, 7, 3, 1], latb  ;uzmi podatak iz tabele
    pause pauza           ;napravi pauzu
    brojac = brojac + 1   ;uvećaj brojač
    if brojac > 14 then pocetak
                          ;ako je brojač veći od 14, idi resetuj ga
    goto tabela           ;ako nije, idi na labelu 'tabela'
end


Nakon inicijalizacije dodeljujemo nulu promenljivoj "brojac", a zatim LOOKUP naredba uzima prvi podatak iz liste (jer promenljiva "brojac" ima vrednost 0), a to je 128 i stavlja ga u registar LATB čime se na LE diodama postavlja prva kombinacija; pretvorite broj 128 u binarni oblik i videćete koja LED se pali. Nakon pauze uvećavamo "brojac" i proveravamo da li je vrednost veća od 14 pošto lista u LOOKUP naredbi ima 15 elemenata; u slučaju da vrednost predje 14, registar LATB ne bi promenio sadržaj jer ne postoji elemenat u listi na koji bi "brojac" pokazivao i zato se vraćamo na labelu "pocetak" kako bi resetovali promenljivu "brojac". U slučaju da uslov za IF nije ispunjen, idemo na labelu "tabela", tj. na uzimanje novog podatka iz LOOKUP liste jer smo prethodno uvećali "brojac" za 1.

Na kraju linije u kojoj se nalazi LOOKUP naredba vidimo donju crtu "_" koja u PBP-u služi da se dugačka linija "prelomi" u sledeći ekranski red. To znači da je ta naredba mogla da bude i u jednoj liniji (bez donje crte), ali smo je zbog njene dužine prelomili na 2 reda.

Iskreno rečeno, i ovaj efekat je mogao da se ostvari uz malo matematike, ali je cilj da savladamo korišćenje naredbe LOOKUP jer je veoma korisna za tabele, odn. liste i trebaće nam u mnogim primerima.

---------------------------------------------------------------------------
Sva pitanja vezana za tutorijal možete da postavite u ovoj temi:
 
Odgovor na temu

rsinisa
Siniša Radanočević
Smederevo

Član broj: 2716
Poruke: 1586
*.dynamic.isp.telekom.rs.



+321 Profil

icon Re: TUTORIJAL: PicBasic Pro 3 i PIC16F182724.05.2013. u 11:56 - pre 132 meseci
Primer 20:
=======
U ovom primeru koristi se postavka 1.

U prethodnom primeru napravili smo tzv. brojačku petlju upotrebom promenljive "brojac", tj. postavili smo njeno početno stanje, uvećavali je i proveravali da li je stigla do zadate vrednosti. Obzirom da su ovake petlje veoma česte pri programiranju, u PBP-u postoji naredba FOR ... NEXT koja olakšava izradu brojačkih petlji. Ovaj primer je realizovan uz pomoć te naredbe.

Code:

brojac      var byte      ;definišemo promenljivu tipa bajt
pauza       con 500       ;definišemo konstantu za pauzu

    include "1827_cfg1.pbp"
    DEFINE OSC 4 

inic:
    osccon=%01101000      ;interni oscilator na 4MHz
    anselb=0              ;ceo port B digitalni
    latb=0                ;isključimo sve LED
    trisb=0               ;postavi ceo port B kao izlazni

pocetak:
    for brojac=0 to 14    ;postavi uslove za brojačku petlju
      lookup brojac, [128, 192, 224, 240, 248, 252,_
      254, 255, 127, 63, 31, 15, 7, 3, 1], latb  ;uzmi podatak iz tabele
      pause pauza         ;napravi pauzu
    next brojac           ;uvećaj brojač i vrati se ako treba
    goto pocetak          ;ako ne, idi na labelu 'pocetak'
end


Da vidimo kako tačno funkcioniše naredba "FOR ... NEXT" čija puna sintaksa glasi:

FOR brojač = početak TO kraj {STEP {-}uvećanje}{naredba} NEXT {brojač}

Ova naredba omogućava izvršavanje neke naredbe ili bloka naredbi odredjeni broj puta koristeći promenljivu brojač. Obzirom da je relativno kompleksna, najbolje da rad ove naredbe objasnimo korak po korak:

1. Vrednost promenljive početak dodeljuje se promenljivoj brojač koja može da bude bilo kog tipa, u zavisnosti od potrebe.

2. Izvršava se naredba ili blok naredbi izmedju FOR i NEXT; ta naredba je opciona, tj. može i da se izostavi pa bi imali praznu FOR ... NEXT petlju koja bi u tom slučaju mogla da se iskoristi kao vremenska zadrška.

3. Pri nailasku na reč NEXT, ako se upotrebi reč STEP vrednost uvećanje se dodaje (ili oduzima ako se upotrebi predznak -) promenljivoj brojač. Ako se STEP izostavi, brojač se uvećava za 1.

4. Ako nakon uvećanja brojač nije veći od vrednosti kraj, ili nije došlo do prekoračenja tipa promenljive, program se vraća na korak 2. U protivnom program nastavlja izvršavanje naredbe posle NEXT.

5. Moguće je izaći pre kraja uslova iz petlje upotrebom naredbe EXIT.

Da analiziramo sada naš primer. Pri nailasku na naredbu "for brojac=0 to 14", promenljivoj "brojac" biće dodeljena prva vrednost, tj. nula. Zatim se izvršava naredba "LOOKUP" za koju već znamo šta radi. Posle pauze program nailazi na naredbu "next brojac" koja uvećava za 1 promenljivu "brojac" i proverava da li je njena vrednost veća od 14; ako nije, program se vraća na izvršavanje prve naredbe posle FOR, tj. u ovom slučaju LOOKUP naredbe, a u protivnom nastavlja dalje, tj. nailazi na naredbu "goto pocetak" kojom se započinje novi ciklus, i tako unedogled.

Vidimo da smo, kao i kod naredbe DO ... LOOP, sve naredbe izmedju FOR i NEXT uvukli jer one čine jedan blok i bilo bi dobro da prihvatite tu praksu.

Ako uporedimo dužinu ovog primera videćemo da je duži za 2 vorda u odnosu na prethodni, što i nije mnogo ako se uzme u obzir komfor koji ova naredba pruža, ali ako Vam je cilj ušteda programske memorije, upotrebite način iz prethodnog primera za izradu brojačke petlje.

---------------------------------------------------------------------------
Sva pitanja vezana za tutorijal možete da postavite u ovoj temi:

[Ovu poruku je menjao rsinisa dana 24.05.2013. u 13:28 GMT+1]
 
Odgovor na temu

rsinisa
Siniša Radanočević
Smederevo

Član broj: 2716
Poruke: 1586
*.dynamic.isp.telekom.rs.



+321 Profil

icon Re: TUTORIJAL: PicBasic Pro 3 i PIC16F182724.05.2013. u 13:43 - pre 132 meseci
Naredba EXIT
=========

EXIT

Ova naredba se koristi za prevremeni izlazak iz petlji pre ispunjenja uslova za regularan izlazak, a to su:

DO ... LOOP
FOR ... NEXT
IF ... THEN
WHILE ... WEND
REPEAT ... UNTIL

Kada naidje na ovu naredbu, program nastavlja izvršenje prve naredbe iza one koja označava kraj bloka odn. petlje. Iako EXIT može da se koristi i za dve zadnje navedene petlje, u lekciji za DO ... LOOP rekli smo da se njihova upotreba ne preporučuje.

Primeri:

Code:

DO
  naredba
  naredba
  IF x=255 then EXIT
LOOP
naredba



FOR i=0 to 100
  naredba
  naredba
  IF PORTA.5=1 then EXIT
NEXT i
naredba


---------------------------------------------------------------------------
Sva pitanja vezana za tutorijal možete da postavite u ovoj temi:
 
Odgovor na temu

rsinisa
Siniša Radanočević
Smederevo

Član broj: 2716
Poruke: 1586
*.dynamic.isp.telekom.rs.



+321 Profil

icon Re: TUTORIJAL: PicBasic Pro 3 i PIC16F182727.05.2013. u 06:49 - pre 131 meseci
Primer 21:
=======
U ovom primeru koristi se postavka 1.

Dobra strana korišćenja tabele pri izradi trčećeg svetla je što se veoma lako pravi kombinacija koja ide u suprotnom smeru; potrebno je samo uzimati podatke od zadnjeg elementa ka prvom. Da bismo to postigli, idealna nam je FOR ... NEXT naredba sa umanjenjem brojača.

Code:

brojac      var byte             ;definišemo promenljivu tipa bajt
pauza       con 500              ;definišemo konstantu za pauzu

    include "1827_cfg1.pbp"
    DEFINE OSC 4 

inic:
    osccon=%01101000             ;interni oscilator na 4MHz
    anselb=0                     ;ceo port B digitalni
    latb=0                       ;isključimo sve LED
    trisb=0                      ;postavi ceo port B kao izlazni

pocetak:
    for brojac=14 to 0 step -1   ;postavi uslove za brojačku petlju
                                 ;tako da broji unazad od 14 do 0
      lookup brojac, [128, 192, 224, 240, 248, 252,_
      254, 255, 127, 63, 31, 15, 7, 3, 1], latb  ;uzmi podatak iz tabele
      pause pauza                ;napravi pauzu
    next brojac                  ;uvećaj petlju i vrati se ako treba
    goto pocetak                 ;ako ne, idi na labelu 'pocetak'
end


Razlika u odnosu na primer 20 je što smo u FOR petlji stavili "step -1" čime se postiže umanjenje za 1 svaki put kada program naidje na NEXT naredbu i time LOOKUP uzima iz liste elemente od poslednjeg prema prvom.

---------------------------------------------------------------------------
Sva pitanja vezana za tutorijal možete da postavite u ovoj temi:


[Ovu poruku je menjao rsinisa dana 27.05.2013. u 09:39 GMT+1]
 
Odgovor na temu

rsinisa
Siniša Radanočević
Smederevo

Član broj: 2716
Poruke: 1586
*.dynamic.isp.telekom.rs.



+321 Profil

icon Re: TUTORIJAL: PicBasic Pro 3 i PIC16F182703.06.2013. u 10:05 - pre 131 meseci
Primer 22:
=======
U ovom primeru koristi se postavka 1.

Ovaj program pravi efekat trčećeg svetla sa 4 različite kombinacije, od kojih se svaka ponavlja po 4 puta. Svaka kombinacija ima 8 stanja, za razliku od prethodna 2 primera koji su imali po 15 stanja.

Code:

i           var byte      ;brojač za for petlju
brojac      var byte      ;brojač prolazaka za jednu kombinaciju
pauza       con 300       ;konstanta za pauzu


    include "1827_cfg1.pbp"
    DEFINE OSC 4 

inic:
    osccon=%01101000               ;interni oscilator na 4MHz
    anselb=0                       ;ceo port B digitalni
    latb=0                         ;isključimo sve LED
    trisb=0                        ;postavi ceo port B kao izlazni

pocetak:
    brojac=0                       ;resetuj brojač
    do                             ;početak prve kombinacije
      for i=0 to 7                 ;postavi uslove za brojačku petlju
        lookup brojac, [1,2,4,8,16,32,64,128], latb  ;uzmi podatak
        pause pauza                ;napravi pauzu
      next i                       ;uvećaj petlju i vrati se ako treba
      brojac=brojac + 1            ;uvećaj brojač ponavljanja kombinacije
    until brojac = 4               ;radi kombinaciju 4 puta

    brojac=0                       ;resetuj brojač
    do                             ;početak druge kombinacije
      for i=0 to 7                 ;postavi uslove za brojačku petlju
        lookup brojac, [1,3,7,15,31,63,127,255], latb  ;uzmi podatak
        pause pauza                ;napravi pauzu
      next i                       ;uvećaj petlju i vrati se ako treba
      brojac=brojac + 1            ;uvećaj brojač ponavljanja kombinacije
    until brojac = 4               ;radi kombinaciju 4 puta

    brojac=0                       ;resetuj brojač
    do                             ;početak treće kombinacije
      for i=0 to 7                 ;postavi uslove za brojačku petlju
        lookup brojac, [127,191,223,239,247,251,253,254], latb  ;uzmi podatak
        pause pauza                ;napravi pauzu
      next i                       ;uvećaj petlju i vrati se ako treba
      brojac=brojac + 1            ;uvećaj brojač ponavljanja kombinacije
    until brojac = 4               ;radi kombinaciju 4 puta

    brojac=0                       ;resetuj brojač
    do                             ;početak četvrte kombinacije
      for i=0 to 7                 ;postavi uslove za brojačku petlju
        lookup brojac, [192,96,48,24,12,6,3,129], latb  ;uzmi podatak
        pause pauza                ;napravi pauzu
      next i                       ;uvećaj petlju i vrati se ako treba
      brojac=brojac + 1            ;uvećaj brojač ponavljanja kombinacije
    until brojac = 4               ;radi kombinaciju 4 puta

    goto pocetak

end


Vidimo da je program praktično isti kao primer 20 s tim da smo za svaku kombinaciju napravili posebnu FOR petlju i da smo za 4 ponavljanja svake kombinacije upotrebili DO ... LOOP petlju.

Program zauzima 229 vorda, a u sledećem primeru videćemo kako možemo da napravimo isti efekat uz uštedu programske memorije.

---------------------------------------------------------------------------
Sva pitanja vezana za tutorijal možete da postavite u ovoj temi:
 
Odgovor na temu

rsinisa
Siniša Radanočević
Smederevo

Član broj: 2716
Poruke: 1586
*.dynamic.isp.telekom.rs.



+321 Profil

icon Re: TUTORIJAL: PicBasic Pro 3 i PIC16F182706.06.2013. u 07:56 - pre 131 meseci
Primer 23:
=======
U ovom primeru koristi se postavka 1.

Ako pogledamo prethodni primer, vidimo da se 4 puta ponavlja isti blok koji se razlikuju jedino u podacima za LOOKUP naredbu pa je logično pretpostaviti da program može da se preradi tako da zauzima manje programske memorije. Jedan od načina je ovaj:

Code:

i           var byte      ;brojač za FOR petlju
brojac      var byte      ;brojač prolazaka za jednu kombinaciju
pomeraj     var byte      ;pomeraj za LOOP
pauza       con 300       ;konstanta za pauzu


    include "1827_cfg1.pbp"
    DEFINE OSC 4 

inic:
    osccon=%01101000                   ;interni oscilator na 4MHz
    anselb=0                           ;ceo port B digitalni
    latb=0                             ;isključimo sve LED
    trisb=0                            ;postavi ceo port B kao izlazni

    do                                 ;početak beskonačne petlje
      pomeraj=0                        ;resetujemo "pomeraj"
      do                               ;petlja za izbor početnog elementa
        brojac=0                       ;resetujemo "brojac"
        do                             ;petlja za 4 ponavljanja
          for i=pomeraj to pomeraj + 7 ;postavi uslove za brojačku petlju
            lookup i, [1,2,4,8,16,32,64,128,_
            1,3,7,15,31,63,127,255,_
            127,191,223,239,247,251,253,254,_
            192,96,48,24,12,6,3,129], latb  ;uzmi podatak
            pause pauza                ;napravi pauzu
          next i                       ;uvećaj "i" i vrati se ako treba
          brojac=brojac + 1            ;ako ne, uvećaj "brojac"
        loop until brojac = 4          ;vrati se ako "brojac" nije 4
        pomeraj=pomeraj + 8            ;pomeri se na sledećih 8 u LOOP petlji
      loop until pomeraj=32            ;vrati se ako "pomeraj" nije 32
    loop

end


Program je veoma sličan jednom bloku iz prethodnog primera, s tim da smo u jednu LOOKUP listu ubacili sve kombinacije što znači da je potrebno da na neki način moramo da prozovemo jednu po jednu, tj. blok od 8 brojeva iz liste za svaku kombinaciju ponaosob. Da bi to uradili, uveli smo promenljivu "pomeraj" koja nam služi kao pokazivač, tj. da odredimo redni broj podatka od koga čitamo LOOKUP listu.

Nakon poznatog inicijalnog bloka nailazimo na prvu DO naredbu koja je u stvari tzv. "mrtva" petlja, tj. vidimo da odgovorajući LOOP nema nikakav uslov što znači da se ta prva petlja izvršava beskonačno, time i naš program.
Nakon toga sledi inicijalizacija promenljive "pomeraj", tj. postavljamo je na 0 jer ćemo LOOKUP listu da čitamo od prvog podatka.

Sledeća DO naredba izvršava jednom sve 4 kombinacije, a završava se kada "pomeraj" bude 32, tj. kada pokazivač na listu predje broj stavki u LOOKUP listi. Nakon nje sledi inicijalizacija promenljive "brojac" koja broji koliko puta je odradjena jedna kombinacija.

Zatim ide još jedna DO naredba koja se završava sa proverom da li je "brojac" došao do 4, tj. ta petlja radi jednu kombinaciju zadati broj puta, u ovom primeru je to 4.

Nakon toga ide poznata FOR petlja kod koje ovoga puta nisu zadate fiksne vrednosti za početak i kraj već petlja počinje od vrednosti koju ima promenljiva "pomeraj", a završava sa "pomeraj" uvećanom za 7, što čini 8 vrednosti koliko nam i treba za jednu kombinaciju. Ostatak programa nam je već dobro poznat.

U ovom primeru imamo 3 DO ... LOOP petlje i jednu FOR petlju koje se nalaze jedna unutar druge koje na ovaj način čine tzv. ugnježdene petlje i baš zbog takve situacije dobro je uvlačiti liniju svake petlje za nekoliko karaktera (2 u našem slučaju) kako bi lakše pratili šta se dešava u kojoj petlji i kako bi lakše pronašli eventualnu grešku.

Ovom optimizacijom smo uštedeli čak 70 vorda programske memorije.

---------------------------------------------------------------------------
Sva pitanja vezana za tutorijal možete da postavite u ovoj temi:
 
Odgovor na temu

[es] :: Elektronika :: Mikrokontroleri :: TUTORIJAL: PicBasic Pro 3 i PIC16F1827
(TOP topic, by veselinovic)
Strane: < .. 1 2 3 4 5

[ Pregleda: 54036 | Odgovora: 88 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.