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: 54263 | 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 PIC16F182726.12.2012. u 11:12 - pre 137 meseci
U prvim verzijama BASIC-a programi su na početku svake linije imali broj koji je služio za identifikaciju i omogućavao da se program po potrebi preusmeri na odredjenu liniju naredbom GOTO ili GOSUB. Pokazalo se da je to veliki izvor grešaka jer je moguće pogrešiti pri kucanju i umesto jednog broja otkucati drugi pri čemu program nastavlja na pogrešnom mestu i ne radi kako treba. Kada bi ovaj program bio pisan na taj način, izgledao bi ovako:

10 high portb.0
20 pause 500
30 low portb.0
40 pause 500
50 goto 10

Ako u poslednjoj naredbi greškom otkucamo

50 goto 20

program će samo u prvom prolazu da uključi LED i više nikada neće doći na liniju 10 tako da će LED stalno biti isključena. U ovako kratkom programu i nije problem uočiti grešku, ali zamislite program sa više stotina, ili čak hiljada linija u kojima postoji greška u broju linije!
Zato su uvedene labele odn. oznake, čime je mogućnost greške drastično smanjena. Labela se, slično broju, postavlja pre neke instrukcije, ali ne i pre svake, čime se mogućnost greške drastično smanjuje. Labela u PBP-u može da sadrži cifre, slova i donju crtu, ali ne može da počne cifrom, a obavezno završava dvotačkom (samo kod definisanja, ne i kada je argument komande). Dužina je praktično neograničena, ali PBP uzima u obzir samo 31 karakter ako je naziv labele duži. Sasvim je svejedno da li je labela pisana velikim ili malim slovima, to znači da se labele 'POcetAK ' i 'pocEtaK ' tretiraju kao da su iste. Moguće je u istoj liniji staviti i labelu i PBP naredbu

Code:
pocetak:  high portb.0


mada je moj običaj da labelu stavim u zasebnu liniju čime se postiže dobra optička odvojenost labela.
 
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.12.2012. u 01:53 - pre 137 meseci
Kao prvo, kako se program uopšte izvršava? Tako što mikrokontroler izvršava jednu po jednu naredbu, počev od prve pa na dole - čim završi jednu, prelazi na sledeću, i može da izvršava SAMO JEDNU naredbu u jednom trenutku. A koliko traje izvršavanje jedne naredbe, tj. koliko je u stvari brz mikrokontroler?

Jedna asemblerska naredba se kod PIC MCU-a izvršava za jedan ili dva mašinska ciklusa (zavisi od naredbe), a jedan mašinski ciklus traje 4 takta oscilatora. Pošto u ovim primerima koristimo interni oscilator na 4 MHz, jedan mašinski ciklus traje tačno jednu mikrosekundu (1 us). Medjutim, PBP je program višeg nivoa kod koga se jedna naredba prevodi u jednu ili nekoliko asemblerskih, zavisi od njene složenosti, ali se jednostavnije naredbe izvršavaju za nekoliko mašinskih ciklusa (sem naredbi kao PAUSE koja izaziva namerno zasutavljanje odn. pauzu u izvršavanju programa). Naredbe HIGH i LOW traju svega nekoliko mikrosekundi jer se sastoje od malog broja asemblerskih naredbi tako da možemo da kažemo da se izvršavaju gotovo trenutno.

Hajde da sada analiziramo program. Primećujemo da se iza svake naredbe nalazi odredjeni tekst koji počinje sa znakom tačka-zarez (;). Njime se u PBP-u odvaja komentar od programa i veoma je dobra praksa da se program bogato komentariše jer će vam posle nekog vremena verovatno biti nejasno zašto ste upotrebili baš tu naredbu. Iako zahteva malo više kucanja, utrošeno vreme u komentarisanje može višestruko da vam se isplati ako posle nekog vremena treba da analizirate ili prepravite program, pogotovo što komentari ne povećavaju sam izvršni program, već samo izvorni kod programa. Takodje je moguće koristiti i apostrof ('), ali je dobro da se naviknete na korišćenje tačka-zarez znaka zbog ubacivanja asemblerskih instrukcija u PBP program, koje ne mogu da se komentarišu apostrofom.

Prva naredba u programu, 'high portb.0' postavlja visok logički nivo, postavlja tzv. logičku jedinicu (tj. postavlja napon jednak naponu napajanja) na pin 0 porta B, čime uključuje LED povezanu na pin 0 porta B. MCU koji koristimo ima dva tzv. porta koji su obeleženi slovima A i B, od kojih svaki ima po 8 pinova koji su obeleženi brojevima od 0 do 7, gde je pin broj 0 povezan sa bitom najmanje težine. Odredjeni bit se adresira nazivom porta nakon koga sledi tačka i zatim broj odredjenog bita. Kod ovog PIC-a, PORTB.0 je fizički povezan sa pinom broj 6 na kućištu (ostale veze pogledajte na šemi).

Sledeća naredba, 'pause 500', pravi pauzu od 500 milisekundi, dok naredba 'low portb.0' isključuje LED tako što postavlja nizak logički nivo, postavlja tzv. logičku nulu (tj. postavlja napon jednak masi) na pin 0 porta B. Sledeća linija, kao što smo već naučili, pravi pauzu od pola sekunde, a naredba 'goto pocetak' preusmerava izvršavanje programa na naredbu koja se nalazi neposredno posle labele 'pocetak'. Kao što vidimo, u nazivu labele iza naredbi ne koristi se dvotačka; ona se upotrebljava samo kod kreiranja labele, ne i kod poziva na nju, tj. kada se koristi kao argument uz naredbe GOTO i GOSUB. I tako program počinje da se izvršava opet od početka, što znači da ovaj program bekosnačno ukjučuje i isključuje LED povezanu na pin 0 B porta sa pauzama od po pola sekunde, sve dok ne isključimo napajanje.

Na kraju se nalazi pseudonaredba 'end', a zovemo je tako jer ona nije zaista prava naredba za PIC, ne proizvodi nikakav kod, već služi da kompajler zna gde je kraj našeg programa. Da budemo precizni, naredba END u svari proizvodi jednu asemblersku instrukciju koja se koristi kao neka vrsta zaštite, ali to za nas u ovom trenutku nije bitno.



[Ovu poruku je menjao rsinisa dana 27.12.2012. u 07:08 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 PIC16F182728.12.2012. u 21:37 - pre 137 meseci
PIC koji koristimo je pun raznih hardverskih modula i to je sa jedne strane veoma dobro, ali sa druge strane zahteva pažljivo čitanje dokumentacije i podešavanje mnogobrojnih registara koji kontrolišu rad svih periferija. Jedna od mogućnosti ovog PIC-a je veliki izbor frekvenci internog oscilatora, kao što smo videli u jednoj od prethodnih poruka. PIC koji sam jako dugo koristio ima samo 4MHz interni oscilator pa sam u brzini prevideo da je potrebno podesiti jedan registar za 16F1827 kako bi oscilator radio na 4 MHz, jer podrazumevana vrednost je svega 500 kHz tako da primer koji smo napisali radi 8 puta sporije od predvidjene brzine. Da bi frekvenca bila adekvatna, porebno je podesiti registar OSCCON koji kontroliše rad oscilatora; pre početka programa treba dodati jednu liniju tako da program sada izgleda ovako:

Code:

    osccon=%01101000

pocetak:
    high portb.0        ;uključi LED na pinu 0 porta B
    pause 500           ;napravi pauzu od 500 milisekundi
    low portb.0         ;isključi LED
    pause 500           ;napravi pauzu od 500 milisekundi
    goto pocetak        ;idi na labelu pocetak
end                     ;oznaka kompajleru da je ovde kraj našeg programa


I još jedna napomena: naredba PAUSE x pravi pauzu u izvršavanju programa gde x predstavlja milisekunde, a može da bude od 1 do 65535.

Za one koji hoće da znaju više o registru OSCCON: pogledajte tehničke podatke za PIC16F1827, strana 65, "5.6 Oscillator Control Registers".
 
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 PIC16F182728.12.2012. u 22:38 - pre 137 meseci
Sada kada imamo kompletan i ispravan program treba ga kompajlirati čime ćemo da dobijemo tzv. heks (.HEX) fajl kojim ćemo da programiramo mikrokontroler.
Pre kompajliranja treba snimiti program na standardan način, iz menija "File", opcija "Save" - možda je dobra varijanta da napravite direktorijum sa nazivom "PBP_tutorijal" ili sl. u kome ćete da čuvate sve primere koje ćemo da obradimo. Ako program nije prethodno snimljen, pri kompajliranju MCS će prvo od vas da zahteva da ga snimite. Ovaj program možete npr. da snimite pod imenom "primer_1".

Kompajliranje možemo da izvršimo na nekoliko načina: iz menija opcija "Project" pa "Compile", klikom na sličicu/dugme ispod menija na kome piše "Compile", ili pritiskom na taster F9. Koju god opciju da odaberete, ako je kompajliranje bilo uspešno u dnu MCS prozora treba da vidite poruku o uspešnosti i o količini utrošene programske memorije:



Vidi se da ovaj program zauzima 65 vorda.

Ako sada pogledate u direktorijum u koji ste snimili izvorni program videćete nekoliko fajlova od kojih svi imaju isto ime, ali različite nastavke (ekstenzije). Najvažniji su nam "primer_1.pbp" koji je tekstualni fajl izvornog programa i "primer_1.HEX" (takodje tekstualni fajl, ali specijalno formatizovan) kojim ćemo da isprogramiramo mikrokontroler.
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 PIC16F182729.12.2012. u 07:03 - pre 137 meseci
Došlo je vreme da najzad isprobamo naš prvi program, tj. da njime isprogramiramo razvojni sistem; ovde ćemo detaljno da opišemo taj postupak pomoću PICKit2 programatora.

U konektor za napajanje CON7 uključite konektor iz ispravljača (plus pol je u sredini) napona od 7 do 25V (najbolje što približnije 12V, sve preko toga izazvaće povećano zagrevanje stabilizatora 7805 - IC3). Priključite PICkit2 (PK2 u daljem tekstu) programator u USB port, priključite ICSP konektor od PK2 na ICSP konektor razvojnog sistema (CON2). Programator ima konektor od 6 pinova, a na razvojnom sistemu ih ima 5 (jer je to dovoljno za programiranje) pa pazite da pin 1 od PK2 spojite na pin 1 ISCP konektora, kao prema slici, i pri tome ostaje jedan pin programatora slobodan (zaokružen na slici).



Sada pokrenite program "PICkit 2 V2.61". Softver bi trebalo da prepozna PIC i ispiše njegovu oznaku u drugom redu ispod menija "Device: PIC16F1827". U slučaju da ne uspe da ga prepozna, verovatno da ste program instalirali pe dosta vremena pa nemate najnoviji fajl sa podacima o novim PIC-evima. U tom slučaju potrebno je da skinete najnoviji fajl pod nazivom "PK2DeviceFile.dat" koji možete da nadjete ovde:

http://ww1.microchip.com/downl...iceDoc/PK2DFUpdate-1-62-14.zip

i zamenite ga u PICKit2 direktorijumu.
Zatim u softveru PK2 u meniju odaberite "Tools" -> "Target VDD Source" -> "Auto-Detect".



Sada u meniju programa odaberite opcije "File" pa "Import HEX", izaberite fajl "primer_1.HEX" koji se nalazi u direktorijumu u koji ste snimili izvorni fajl, kliknite na dugme "Write" i sačekajte par sekundi da se završi programiranje PIC-a. Ako je sve u redu, statusni prozor će biti ispunjen zelenom bojom sa tekstom: "Programming Successful", a LED D1 počeće da treperi frekvencom od 1 Hz. Sada možete da odspojite PK2 od razvojnog sistema.

Ako imate neki drugi programator, imate dve opcije:
1. Da izvadite PIC iz podnožja razvojnog sistema, ubacite u vaš programator i nakon programiranja ga vratite u razvojni sistem.
2. Ako vaš programator ima ICSP (ili ste ga sami dodali), možete da probate programiranje u kolu priključenjem na ISCP konektor, ali morate da odspojite J1 pre priključenja programatora kako ne bi došlo do "sudara" Vdd napona sa programatora sa onim iz razvojnog sistema. A možete i da odspojite Vdd sa vašeg programatora, a da ostavite J1 kratkospojen.

[Ovu poruku je menjao rsinisa dana 29.12.2012. u 14:23 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 PIC16F182729.12.2012. u 13:20 - pre 137 meseci
Za one koji bi da probaju C, drugar sa foruma goran_68 pokrenuo je tutorijal koji će manje-više da prati paralelno ovaj kurs BASIC-a, a možete da ga pratite na ovom linku

http://www.elitesecurity.org/t459971-TUTORIJAL-xc-picF
 
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 PIC16F182729.12.2012. u 14:05 - pre 137 meseci
Primetili ste u prvom primeru da su sve naredbe pomerene udesno za 4 mesta, dok se labela nalazi uz levu ivicu. Potpuno je ispravno da i naredbe budu napisane uz levu ivicu, ali ja koristim takav način kako bi lako optički razdvojio labele ili linije sa komentarom od samog programa.

Primer 2
======
U ovom primeru koristi se postavka 1

Ovim primerom uključivaćemo i isključivati svih 8 LED odjednom koje su priključene na port B, umesto samo jedne. Pretpostavljam da ste i sami dobili ideju kako da se to uradi - isto kao u prethodnom primeru, samo ponovimo iste komande za svaki pin pojedinačno. Ne zaboravite da pre samog programa napišete linije u kojima su definisane konfiguracije i frekvenca oscilatora.

Code:

    osccon=%01101000
    anselb=0

pocetak:
    high portb.0        ;uključi LED na pinu 0 porta B (D1)
    high portb.1        ;uključi LED na pinu 1 porta B (D2)
    high portb.2        ;uključi LED na pinu 2 porta B (D3)
    high portb.3        ;uključi LED na pinu 3 porta B (D4)
    high portb.4        ;uključi LED na pinu 4 porta B (D5)
    high portb.5        ;uključi LED na pinu 5 porta B (D6)
    high portb.6        ;uključi LED na pinu 6 porta B (D7)
    high portb.7        ;uključi LED na pinu 7 porta B (D8)
    pause 500           ;napravi pauzu od 500 milisekundi
    low portb.0         ;isključi LED na pinu 0 porta B
    low portb.1         ;isključi LED na pinu 1 porta B
    low portb.2         ;isključi LED na pinu 2 porta B
    low portb.3         ;isključi LED na pinu 3 porta B
    low portb.4         ;isključi LED na pinu 4 porta B
    low portb.5         ;isključi LED na pinu 5 porta B
    low portb.6         ;isključi LED na pinu 6 porta B
    low portb.7         ;isključi LED na pinu 7 porta B
    pause 500           ;napravi pauzu od 500 milisekundi
    goto pocetak        ;idi na labelu pocetak

end                     ;oznaka kompajleru da je ovde kraj našeg programa



Vidimo da posle podešavanja registra OSCCON imamo novu liniju koja takodje služi za podešavanje hardvera. Oba porta imaju mogućnost rada sa analognim modulima koji su ugradjeni u PIC i povezani sa portovima. Proizvodjač je podesio da se pri uključenju PIC-a aktiviraju analogne funkcije I/O portova, a nama su ovde, za sada, potrebne digitalne pa moramo sami da isključimo analogne. Registri zaduženi za to su ANSELA za port A i ANSELB za port B, a pošto mi za sada radimo samo sa B portom, izmenili smo samo ANSELB. Kada je neki bit tog registra postavljen na 1, tada odgovarajući pin ima analognu funkciju što znači da moramo sve bitove da postavimo na 0 kako bi svi pinovi imali digitalnu funkciju. Mogli smo da napišemo i binarni oblik %00000000 kako bi smo videli vrednost za svaki pojedinačni bit, ali pošto su ionako svi bitovi 0, dekadni oblik je sasvim prikladan.

Naredbe koje slede su nam već poznate s tim što se menja argument uz naredbe 'high' i 'low'; prvo uključimo svih 8 LED jednu po jednu, bit po bit, pa napravimo pauzu od 500 milisekundi, zatim isključimo svih 8 LED, ponovo napravimo pauzu od 500 milisekundi pa se naredbom 'goto' vratimo na labelu 'pocetak' čime se program vraća na početak i tako vrti u krug.
Kao što se primetili, bitovi su obeleženi brojevima od 0 do 7, a ne od 1 do 8 kako bi bilo logičnije na prvi pogled. To je uradjeno zbog binarnog brojnog sistema koji smo već obradili.

Snimite ovaj program pod nazivom "primer_2" i iskompajlirajte ga; nakon kompajliranja vidimo da ovaj program zauzima 123 vorda programske memorije. Isprogramirajte PIC na razvojnom sistemu sa dobijenim "primer_2.HEX" fajlom i pogledajte šta se dešava.

[Ovu poruku je menjao rsinisa dana 30.12.2012. 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 PIC16F182729.12.2012. u 14:18 - pre 137 meseci
Naredbe 'high' i 'low' iako deluju kao odlične za ovakve primene, ipak nisu idealne i ne treba ih često koristiti. O čemu se radi? Pinovi mikrokontrolera imaju mogućnost da budu ulazni ili izlazni (I/O pinovi), što znači da mogu ili da provere koje je logičko stanje na njima (ulazna funkcija), ili da postave na pinove neko logičko stanje (izlazna funkcija) kao što je bio slučaj u ova dva primera. Funkciju pina odredjujemo postavljanjem odgovarajućeg stanja u registar specijalne namene kojih ima 2 za 18-to pinske PIC-eve i zovu se TRISA za port A i TRISB za port B - ako je neki bit tog registra postavljen na logičko 1 onda je odgovarajući pin ulazni, a ako je postavljen na logičko 0 onda je odgovarajući pin izlazni. Ovo se jednostavno pamti ako uvedemo kao asocijaciju engleske reči INPUT (ulaz) i OUTPUT (izlaz); vidimo da reč INPUT počinje slovom I koje asocira na broj 1, dok reč OUTPUT počinje slovom O koje asocira na broj 0.

Naredbe 'high' i 'low' pre postavljanja odgovarajućeg stanja postavljaju potreban pin kao izlazni, i to svaki put kada se naredba izvrši, ali to je potpuno nepotrebno jer se stanje svih registara, pa i TRISA i TRISB, pamti sve dok ne nestane napajanje, ili dok se ne izmeni njihov sadržaj (namerno ili slučajno), što znači da je program nepotrebno duži, a samim tim i sporiji. To u ovim prethodnim primerima i nije toliko važno jer progam ionako čeka dva puta po pola sekunde, ali u praksi ćete se sretati sa situacijama gde svaka mikrosekunda uštede može mnogo da vam znači.

Pa čemu onda ove dve naredbe? U praksi se najčešće jedan pin koristi samo kao ulazni ili samo kao izlazni, ali ima i situacija kada se jedan isti pin u jednom uredjaju koristi u jednom momentu kao ulazni, a u drugom kao izlazni. U tim situacijama, ako u nekom trenutku nismo sigurni da li je pin postavljen kao ulazni ili izlazni možemo da ih upotrebimo, ali je moja preporuka da programer ne koristi ove naredbe i da sam vodi računa o TRIS registrima. Kako se to radi, videćemo u sledećim primerima.
 
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 PIC16F182730.12.2012. u 08:23 - pre 137 meseci
U primeru 2 potkrala se jedna greška pa sam ispravio tekst i program; oni koju su već pročitali taj tekst treba ponovo da ga pogledaju.
 
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 PIC16F182730.12.2012. u 09:04 - pre 137 meseci
Još jedan tutorijal koji će da prati ove primere, ovoga puta u asembleru, pokrenuo je drugar elektrostudio, a možete da ga pratite na ovom linku:

http://www.elitesecurity.org/t459992-tutorijal-MPASM-PICF
 
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 PIC16F182702.01.2013. u 05:49 - pre 137 meseci
Primer 3
======
U ovom primeru koristi se postavka 1.

Vratićemo se prvom primeru, koji uključuje i isključuje jednu LED, ali ovoga puta ćemo to da uradimo malo drugačije.

Code:

    osccon=%01101000 ;interni oscilator na 4MHz
    anselb=0         ;ceo port B digitalni
    
    trisb.0=0        ;postavi pin 0 porta B kao izlazni

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

end


Prva PBP naredba 'trisb.0=0' postavlja nulti bit TRISB registra na logičku 0 čime, kao što smo objasnili, postavlja pin 0 porta B kao izlazni (postavljanje odredjenog I/O pina kao ulaznog ili izlaznog naziva se još i odredjivanje smera tog pina). Posle labele 'pocetak' sledi naredba 'portb.0=1' koja postavlja nulti bit B porta na logičko 1 i time uključuje LED, pa zatim posle već dobro poznate pauze od pola sekunde, naredba 'portb.0=0' postavlja taj isti pin na logičko 0, i posle još jedne pauze od pola sekunde naredba 'goto pocetak' vraća program na naredbu posle labele 'pocetak'. Kao što vidimo, naredba 'trisb.0=0' se više nikada ne izvršava jer za tim nema potrebe. Na ovaj način program se brže izvršava, a zahvaljujući nekorišćenju naredbi 'high' i 'low' program je nešto kraći - ovaj program zauzima 63 vorda programske memorije umesto 65 kao u primeru 1.

Treba još imati na umu da se prilikom priključenja PIC-a na napajanje svi bitovi TRISA i TRISB registra postavljaju na 1, što znači da su svi pinovi oba porta postavljeni kao ulazi, dok PORTA i PORTB zauzimaju proizvoljno, nepoznato stanje.
 
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.01.2013. u 10:24 - pre 137 meseci
Primer 4
======
U ovom primeru koristi se postavka 1.

Sada ćemo da izmenimo primer 2 koji uključuje i isključuje svih 8 LED odjednom na isti način kao što smo izmenili malo pre primer 1, izbeći ćemo naredbe 'high' i 'low' i koristićemo direktno izmene na TRISB registru, pa da vidimo koliku ćemo uštedu da ostvarimo kada je u pitanju programska memorija.

Code:

inic:
    osccon=%01101000        ;interni oscilator na 4MHz
    anselb=0                ;ceo port B digitalni

    trisb.0=0               ;postavi pin 0 porta B kao izlazni
    trisb.1=0               ;postavi pin 1 porta B kao izlazni
    trisb.2=0               ;postavi pin 2 porta B kao izlazni
    trisb.3=0               ;postavi pin 3 porta B kao izlazni
    trisb.4=0               ;postavi pin 4 porta B kao izlazni
    trisb.5=0               ;postavi pin 5 porta B kao izlazni
    trisb.6=0               ;postavi pin 6 porta B kao izlazni
    trisb.7=0               ;postavi pin 7 porta B kao izlazni

pocetak:
    portb.0=1               ;uključi LED povezanu na pin 0 porta B
    portb.1=1               ;uključi LED povezanu na pin 1 porta B
    portb.2=1               ;uključi LED povezanu na pin 2 porta B
    portb.3=1               ;uključi LED povezanu na pin 3 porta B
    portb.4=1               ;uključi LED povezanu na pin 4 porta B
    portb.5=1               ;uključi LED povezanu na pin 5 porta B
    portb.6=1               ;uključi LED povezanu na pin 6 porta B
    portb.7=1               ;uključi LED povezanu na pin 7 porta B
    pause 500               ;napravi pauzu od 500 milisekundi
    portb.0=0               ;isključi LED povezanu na pin 0 porta B
    portb.1=0               ;isključi LED povezanu na pin 1 porta B
    portb.2=0               ;isključi LED povezanu na pin 2 porta B
    portb.3=0               ;isključi LED povezanu na pin 3 porta B
    portb.4=0               ;isključi LED povezanu na pin 4 porta B
    portb.5=0               ;isključi LED povezanu na pin 5 porta B
    portb.6=0               ;isključi LED povezanu na pin 6 porta B
    portb.7=0               ;isključi LED povezanu na pin 7 porta B
    pause 500               ;napravi pauzu od 500 milisekundi
    goto pocetak            ;idi na labelu pocetak

end


Ovde nema naredbi koje već nismo koristili, samo smo proširili akciju na sve pinove B porta. Na početku, posle labele 'inic', nalazi se blok sa naredbama koje podešavaju oscilator i digitalnu funkciju B porta, i koje menjaju TRISB registar jedan po jedan bit, odn. koje postavljaju sve pinove B porta kao izlazne i taj deo se izvrši samo jednom pri uključenju, posle toga se više nikada ne izvršava. To podešavanje početnih vrednosti raznih registara koje se obavlja samo jednom na početku programa naziva se inicijalizacija i ubuduće ćemo se stalno sretati sa time. Labela 'inic' ovde nema nikakvu praktičnu vrednost jer ne postoji naredba skoka koja upućuje na nju, ali smo hteli da se jasno zna da je to inicijalni blok, a biće primera gde će nam ona trebati, pa je vreme da se navikavamo na to.

U poredjenju sa primerom 2 za koji je utrošeno 123 vorda, ovaj primer zauzima samo 84 što je značajna ušteda zahvaljujući drugačije napisanom programu, a koji radi potpuno istu stvar. Može li ovo još kraće? Može, a kako videćemo već u sledećem primeru.
 
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.01.2013. u 05:01 - pre 137 meseci
Primer 5
======
U ovom primeru koristi se postavka 1.

Code:

inic:
    osccon=%01101000        ;interni oscilator na 4MHz
    anselb=0                ;ceo port B digitalni
    trisb=%00000000         ;svi bitovi B porta izlazni

pocetak:
    portb=%11111111         ;postavi sve bitove B porta na logičko 1, tj. uključi sve LED istovremeno
    pause 500               ;napravi pauzu od 500 milisekundi
    portb=%00000000         ;postavi sve bitove B porta na logičko 0, tj. isključi sve LED istovremeno
    pause 500               ;napravi pauzu od 500 milisekundi
    goto pocetak            ;idi na labelu pocetak

end


Obzirom da uključujemo svih 8 LED na portu B iskoristićemo mogućnost da postavimo stanje celog registra odjednom umesto pojedinačnih bitova, kako na TRISB registru, tako i na PORTB registru i time značajno skratimo program. U naredbi 'trisb=%00000000' ne koristimo više tačku koja je označavala da radimo sa jednim bitom, što znači da radimo sa celim registrom odjednom, sa svih 8 bitova. Broj %00000000 napisan je u binarnom obliku i mogao je da bude napisan i kao 0, ali se na ovaj način veoma lepo i jasno vidi vrednost za svaki pojedinačni bit - krajnja desna cifra predstavlja bit 0, a krajnja leva, uz znak %, predstavlja bit 7. Isto važi i za naredbu 'portb=%11111111'; mogla je da bude napisana sa brojem u decimalnom obliku i tada bi glasila 'portb=255', ali se u binarnom obliku jasno vidi da su svi bitovi postavljeni na logičko 1, što znači da su sve LED uključene.

Time što smo odjednom postavili sve bitove PORTB i TRISB registara uštedeli smo čak 59 vorda u odnosu na program iz primera 2, a program i dalje radi potpuno istu stvar - program iz primera 2 sa 123 vorda sveo se na svega 64, što je ogromna ušteda, iz čega se vidi da nije dovoljno samo poznavati naredbe PBP-a, već i razmisliti malo koji pristup upotrebiti u odredjenoj situaciji, a za to će Vam trebati malo iskustva.

[Ovu poruku je menjao rsinisa dana 09.01.2013. u 08:23 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 PIC16F182712.01.2013. u 08:13 - pre 137 meseci
Registri specijalne namene
=================
Već ste primetili da je pre samog programa potrebno podesiti odredjene registre kako bi PIC funkcionisao onako kako nam je potrebno, tj. da bi podesili razne komponente ugradjene u PIC i njihove funkcije. Do sada smo to radili sa registrima OSCCON, ANSELB, TRISB i PORTB. Da, i PORTB spada u te registre (kao i PORTA) s tim da su njegovi bitovi povezani direktno na fizičke izvode na kućištu. Svi ti registri zovu se registri specijalne namene (skraćeno SFR od engleskog izraza "special function registers").

Spisak svih tih registara možete da nadjete u tabeli 3-3 tehničkih podataka počev od strane 23. Vidi se da ih ima mnogo, da su podeljeni u tzv. banke i da postoje čak 32 banke; takva podela je nasledstvo stare arhitekture ove familije PIC-eva koja ne može da adresira više od 128 bajtova odjednom kada se radi o pristupu RAM memoriji u koju su oni smešteni. Da bi se adresirao odredjeni SFR, potrebno je prethodno podesiti banku u kojoj se on nalazi, ali o tome ne treba da brinete jer sam PBP vodi računa o tome, vaše je samo da dodelite odgovarajuću vrednost željenom registru. Jedino ako ubacujete i asembler u PBP program onda morate sami da vodite računa o ispravnom podešavanju banke.

Na prvi pogled rad sa tolikim registrima deluje jako komplikovano, ali setite se šta radi dirigent orkestra - on ne radi ništa drugo sem što u odredjenom momentu izda komandu koji će instrumet da zasvira i tako izvede željenu kompoziciju. Tako je i sa ovim registrima, potrebno je samo da u odredjenom trenutku dodelite pravu vrednost nekom od SFR-ova i vaš uredjaj će da radi upravo onako kako ste zamislili.
 
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.01.2013. u 21:00 - pre 137 meseci
Primer 6
======
U ovom primeru koristi se postavka 1.

Postoje situacije u kojima ne treba da menjamo stanje celog porta odjednom već pojedinačne bitove kako nebismo poremetili već postavljena stanja. Recimo da treba da trepere LED D5 i D6 dok su D1 i D2 uključene, a D3, D4, D7 i D8 isključene. Taj primer bi izgledao ovako:

Code:

inic:
    osccon=%01101000        ;interni oscilator na 4MHz
    anselb=0                ;ceo port B digitalni
    trisb=%00000000         ;svi bitovi B porta izlazni
    portb=%00000011         ;postavi početno stanje na port B, tj. uključi D1 i D2

pocetak:
    portb.4=1               ;uključi LED povezanu na pin 4 porta B (D5)
    portb.5=1               ;uključi LED povezanu na pin 5 porta B (D6)
    pause 500               ;napravi pauzu od 500 milisekundi
    portb.4=0               ;isključi LED povezanu na pin 4 porta B
    portb.5=0               ;isključi LED povezanu na pin 5 porta B
    pause 500               ;napravi pauzu od 500 milisekundi
    goto pocetak            ;idi na labelu pocetak

end


Medjutim, u ovom programu se krije jedna zamka koja se, doduše, ovde neće "aktivirati", ali kada bismo umesto LED D5 imali neko kapacitivno opterećenje, mogli bismo da imamo problem, kao što sam ga ja imao u jednom uredjaju koji sam pravio. O čemu se radi?

Ako se vrše dva uzastopna postavljanja pinova jednog porta, može da dodje do nepravilnog postavljanja novog stanja jer se svaki pristup portovima vrši u 3 koraka: čitaj-izmeni-upiši (na engleskom: read-modify-write) što konkretno znači da se kod upisa novog stanja na port zapravo prvo preuzme stanje direktno sa pinova u interni registar, zatim se izmeni sadržaj tog registra i na kraju se njegovo stanje prosledi na port. Ako se na jednom od pinova nalazi neko kapacitivno opterećenje ili je pin strujno preopterećen, velike su šanse da će druga izmena porta da poništi prvu jer strujno preopterećen pin ima manji napon koji se onda tumači kao logička 0 umesto 1.

Pojasnićemo to na našem primeru: zamislimo da je na RB4 priključen kapacitivni potrošač kome je potrebno neko vreme da se napuni i stabilizuje napon, a na RB5 neki drugi potrošač. Pojašnjenje za početnike: kod priključenja napona na kapacitivno opterećenje prvo se javlja protok struje koja puni kondenzator, dok je napon na njegovim izvodima 0 volti i zatim se povećava, tako da tek nakon izvesnog vremena dostigne nivo koji može da se "protumači" kao visok logički nivo.

Pogledajmo deo ovog primera:

Code:

    portb=%00000011         ;postavi početno stanje na port B, tj. uključi D1 i D2

pocetak:
    portb.4=1               ;uključi LED povezanu na pin 4 porta B (D5)
    portb.5=1               ;uključi LED povezanu na pin 5 porta B (D6)


Naredba "portb.4=1" treba da postavi bit 4 porta B na logičko 1, tj. na napon napajanja. Zbog principa čitaj-izmeni-upiši biće pročitano stanje sa pinova u interni registar koji će da sadrži vrednost %00000011 jer smo pre toga postavili to stanje na port B, a zatim će biti setovan četvrti bit, i to novo stanje vraćeno na port, tj. na port će biti poslato %00010011. Kod sledeće naredbe "portb.5=1", takodje će prvo da bude pročitano stanje sa pinova B porta, ali pošto je na pin 4 priključeno kapacitivno opterećenje, stanje na njemu će da bude i dalje logička nula (jer se kondenzator nije napunio) pa će umesto 00010011 biti pročitano 00000011, zatim će biti setovan peti bit i takvo stanje vraćeno na port pa će na kraju umesto 00110011 na pinovima biti 00100011. Ovo može da se prevazidje na nekoliko načina, a kako, videćemo u sledećim primerima.

[Ovu poruku je menjao rsinisa dana 15.01.2013. u 22:27 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 PIC16F182719.01.2013. u 05:51 - pre 136 meseci
Da bismo rešili problem koji nam pravi kapacitivno opterećenje, očigledno je da moramo da napravimo vremensku zadršku izmedju dva uzastopna menjanja pinova istog porta kako bi kondenzator imao vremena da se napuni. Jedan od načina je da reorganizujemo program kako ne bismo ubacivali dodatne instrukcije koje bi trošile programsku memoriju. Pretpostavimo da deo programa izgleda ovako:

Code:

    portb.4=1
    portb.5=1
    sekunda=sekunda + 1
    if sekunda=60 then
      sekunda=0
    endif


Vidimo da posle naredbe "portb.5=1" imamo nekoliko naredbi čije izmeštanje ne dovodi ni do kakvih promena koje bi nam remetile rad programa tako da možemo da ih premestimo čime bi se pojavila odredjena zadrška izmedju dva uzastopna postavljanja stanja B porta koja bi omogućila da se kondenzator napuni, pa bi program izgledao ovako (naredbu "if ... then ... endif" objasnićemo drugi put):

Code:

    portb.4=1
    sekunda=sekunda + 1
    if sekunda=60 then
      sekunda=0
    endif
    portb.5=1


Primer 7:
======
U ovom primeru koristi se postavka 1.

Medjutim, u našem programu iz primera 6 nemamo nikakve naredbe koje bi mogli da premestimo, a da ne poremetimo logiku i rad programa pa je potrebno da na neki drugi način ubacimo pauzu. Jedan od načina je naredba PAUSEUS, koja slično naredbi PAUSE pravi pauzu time što se zaustavlja izvršavanje programa, a čija sintaksa glasi ovako:

PAUSEUS period

gde 'period' označava vreme u mikrosekundama i može da se kreće od 1 do 65535

Code:

inic:
    osccon=%01101000        ;interni oscilator na 4MHz
    anselb=0                ;ceo port B digitalni
    trisb=%00000000         ;svi bitovi B porta izlazni
    portb=%00000011         ;postavi početno stanje na port B, tj. uključi D1 i D2

pocetak:
    portb.4=1               ;uključi LED povezanu na pin 4 porta B (D5)
    pauseus 24              ;napravi pauzu od 24 mikrosekunde
    portb.5=1               ;uključi LED povezanu na pin 5 porta B (D6)
    pause 500               ;napravi pauzu od 500 milisekundi
    portb.4=0               ;isključi LED povezanu na pin 4 porta B
    pauseus 24              ;napravi pauzu od 24 mikrosekunde
    portb.5=0               ;isključi LED povezanu na pin 5 porta B
    pause 500               ;napravi pauzu od 500 milisekundi
    goto pocetak            ;idi na labelu pocetak

end


Problem kod upotrebe ove naredbe je što ona sama zauzima odredjeni broj lokacija programske memorije, i što za ovaj PIC pri frekvenci od 4 MHz pauza ne može da bude manja od 24 us (mikrosekunde) što može da bude previše vremena za punjenje kondenzatora. Nije probem u tome što će kondenzator duže da se puni, njemu to ne smeta, kada se napuni punjenje će da se prekine samo pošto je to osobina kondenzatora, ali 24 us može da bude u nekim situacijama nepotrebno gubljenje vremena jer je moguće da se kondenzator već napunio. Zato ćemo u pomoć da pozovemo jednu asemblersku instrukciju kako bi napravili kraću zadršku.
 
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.01.2013. u 00:54 - pre 136 meseci
Primer 8:
======
U ovom primeru koristi se postavka 1.

Tvorci PBP-a su omogućili ubacivanje asemblerskih naredbi u BASIC što i ne čudi jer je potpunu kontrolu nad MCU-om moguće ostvariti jedino pomoću asemblera. Postoje dve naredbe, jedna za ubacivanje samo jedne asemblerske naredbe, i druga za blok naredbi.

Sintaksa za prvu je:

@ asemblerska_naredba

Kada se znak @ upotrebi na početku linije, to znači da iza mora da sledi jedna asemblerska naredba. Ono što je bitno da zapamtite je da upotreba znaka @ postavlja banku na 0 i da ovu naredbu ne koristite za promenu banke, mada vam to za sada ne znači mnogo, ali trebaće kasnije. Iskoristićemo ovu naredbu da napravimo kratku pauzu u našem prethodnom primeru od svega jedne µs:

Code:

inic:
    osccon=%01101000        ;interni oscilator na 4MHz
    anselb=0                ;ceo port B digitalni
    trisb=%00000000         ;svi bitovi B porta izlazni
    portb=%00000011         ;postavi početno stanje na port B, tj. uključi D1 i D2

pocetak:
    portb.4=1               ;uključi LED povezanu na pin 4 porta B (D5)
@   nop                     ;napravi pauzu od 1 mikrosekunde
    portb.5=1               ;uključi LED povezanu na pin 5 porta B (D6)
    pause 500               ;napravi pauzu od 500 milisekundi
    portb.4=0               ;isključi LED povezanu na pin 4 porta B
@   nop                     ;napravi pauzu od 1 mikrosekunde
    portb.5=0               ;isključi LED povezanu na pin 5 porta B
    pause 500               ;napravi pauzu od 500 milisekundi
    goto pocetak            ;idi na labelu pocetak

end


Asemblerska naredba NOP je skraćenica od "No OPeration", u prevodu "nema operacije", tj. ova naredba ne radi baš ništa! Pa čemu onda služi uopšte? Korisna je upravo za ovakve stvari gde je potrebno napraviti neku pauzu koja neće da promeni baš ništa, ni jedan jedini bit bilo kog registra. Pošto PBP nema instrukciju koja ne radi ništa, u ovakvim situacijama primorani smo da upotrebimo ovu asemblersku instrukciju. Njeno izvršenje traje 1 mašinski ciklus što je u našem slučaju tačno 1 µs što bi moglo da bude prekratka pauza da se napuni kondenzator pa možemo da stavimo više ovih naredbi uzastopno.

Ako želimo da napravimo pauzu od 4 µs, treba da stavimo 4 ove naredbe i tada bi deo programa izgledao ovako:

Code:

pocetak:
    portb.4=1               ;uključi LED povezanu na pin 4 porta B (D5)
@   nop                     ;napravi pauzu od 1 mikrosekunde
@   nop                     ;napravi pauzu od 1 mikrosekunde
@   nop                     ;napravi pauzu od 1 mikrosekunde
@   nop                     ;napravi pauzu od 1 mikrosekunde
    portb.5=1               ;uključi LED povezanu na pin 5 porta B (D6)
    pause 500               ;napravi pauzu od 500 milisekundi

 
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 PIC16F182728.01.2013. u 15:01 - pre 136 meseci
Primer 9:
======
U ovom primeru koristi se postavka 1.

Pisanje više asemblerskih naredbi korišćenjem znaka @ može da bude malo naporno i nepraktično, i zato postoje naredbe za blok asemblerskih komandi čija sintaksa glasi ovako:

ASM
asemblerske instrukcije
ENDASM


Ovo zapravo i nisu PBP naredbe već pseudonardbe pošto ne proizvode nikakav kod već obaveštavaju PBP kompajler da ono što sledi nisu njegove naredbe i ne treba da ih prevodi pa će sav kod izmedju njih samo preneti dalje asembleru. Maksimalna veličina teksta tog bloka, uključujući i komentare, ne može da bude veća od 8 KB pa ako je taj tekst veći, jednostavno ga podelite u više ASM ... ENDASM blokova.

Kao i znak @, ASM postavlja banku na 0 pa pre ENDASM morate da je vratite opet na 0 ako ste je menjali u tom bloku. Takodje ni reč ENDASM ne sme da se nadje nigde u tom bloku asemblerskih naredbi kao komentar jer će PBP to da shvati kao kraj bloka.

Sada naš program iz prethodnog primera može da izgleda ovako:

Code:

inic:
    osccon=%01101000        ;interni oscilator na 4MHz
    anselb=0                ;ceo port B digitalni
    trisb=%00000000         ;svi bitovi B porta izlazni
    portb=%00000011         ;postavi početno stanje na port B, tj. uključi D1 i D2

pocetak:
    portb.4=1               ;uključi LED povezanu na pin 4 porta B (D5)
asm
    nop                     ;napravi pauzu od 1 mikrosekunde
    nop                     ;napravi pauzu od 1 mikrosekunde
    nop                     ;napravi pauzu od 1 mikrosekunde
    nop                     ;napravi pauzu od 1 mikrosekunde
endasm
    portb.5=1               ;uključi LED povezanu na pin 5 porta B (D6)
    pause 500               ;napravi pauzu od 500 milisekundi
    portb.4=0               ;isključi LED povezanu na pin 4 porta B
asm
    nop                     ;napravi pauzu od 1 mikrosekunde
    nop                     ;napravi pauzu od 1 mikrosekunde
    nop                     ;napravi pauzu od 1 mikrosekunde
    nop                     ;napravi pauzu od 1 mikrosekunde
endasm
    portb.5=0               ;isključi LED povezanu na pin 5 porta B
    pause 500               ;napravi pauzu od 500 milisekundi
    goto pocetak            ;idi na labelu pocetak

end



Tako smo uz pomoć asemblerske naredbe rešili problem kratke vremenske zadrške za kapacitivna opterećenja; to rešenje možemo da primenimo i u drugim slučajevima kada nam je potrebna pauza kraća od minimalne koju nam omogučava PBP naredba PAUSEUS.

Ako u praksi naidjete na problem kapacitivnog opterećenja, odredjivanje potrebne zadrške može da se uradi samo praktično tj. sistemom probe. Moglo bi i uz malo matematike, ali je tu nekoliko nepoznanica koje prosečan korisnik ne može da zna niti da izmeri.
 
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.02.2013. u 05:15 - pre 136 meseci
Primer 10:
======
U ovom primeru koristi se postavka 1.

Vidimo da smo se ovde "borili" softverskim metodama protiv jednog problema kojeg su konstruktori PIC kontrolera odlučili da reše na hardverskom nivou pa su dodali mogućnost čitanja stanja sa izlaza leča. Leč možemo da shvatimo kao memorijski element koji pamti jedan bit, i kod koga stanje na izlazu zavisi od stanja na ulazu.



Na slici je prikazan uprošćeni prikaz jednog pina PIC kontrolera sa koje se vidi da se ovde kao leč koristi D flip-flop (pravouganik ispod koga piše "Data Register"). Kada čitamo stanje sa porta, signal ide putanjom crvene boje obeležene brojem 1, tj, ide od pina (predstavljen precrtanim kvadratom ispod koga piše I/O pin) preko logičkog I kola kroz bafer (predstavljen trouglom) na sabirnicu podataka ("Data Bus").
Kada čitamo stanje iz leča, signal sada ide putanjom crvene boje obeležene brojem 2, tj. ide od izlaza leča (obeležen slovom "Q") preko bafera na sabirnicu podataka, a pošto je izlaz leča odvojen od pina baferom, vidimo da preopterećenje pina neće da dovede do promene stanja na Q izlazu tako da će uvek da bude pročitano upravo ono stanje koje je i upisano u leč, a ne aktuelno stanje na pinu.

Da bismo mogli da čitamo stanje leča, konstruktori su dodali SFR registre koji su označeni sa LATX, gde X pedstavlja naziv porta, tj. za PIC koji koristimo to su registri LATA i LATB tako da bi naš program iz primera 6 sada izgledao ovako:

Code:

inic:
    osccon=%01101000        ;interni oscilator na 4MHz
    anselb=0                ;ceo port B digitalni
    trisb=%00000000         ;svi bitovi B porta izlazni
    latb=%00000011          ;postavi početno stanje na port B, tj. uključi D1 i D2

pocetak:
    latb.4=1                ;uključi LED povezanu na pin 4 porta B (D5)
    latb.5=1                ;uključi LED povezanu na pin 5 porta B (D6)
    pause 500               ;napravi pauzu od 500 milisekundi
    latb.4=0                ;isključi LED povezanu na pin 4 porta B
    latb.5=0                ;isključi LED povezanu na pin 5 porta B
    pause 500               ;napravi pauzu od 500 milisekundi
    goto pocetak            ;idi na labelu pocetak

end


Sa slike se vidi da su upisi u port i u leč potpuno ista stvar, ali zbog principa čitaj-izmeni-upiši, koji funkcioniše i pri izmeni LATX registra, ne može da dodje do lažnog očitavanja ako je pin preopterećen pa nema potrebe za bilo kakvom zadrškom izmedju dve uzastopne izmene dva pina istog porta.

Pa dobro, ako postoje LATX registri, zašto smo potrošili nekoliko lekcija na obradu problema preopterećenog pina? Najpre zato što LATX registre nemaju svi PIC-evi; ako se budete ozbiljno bavili konstrukcijom uredjaja, koristićete razne PIC kontrolere i pre ili kasnije naići ćete na neki koji nema te registre pa treba da znate kako da se izborite sa potencijalnim problemom.

Medjutim, čitanje stanja direktno sa pina može da bude korisno u nekim situacijama jer možete da utvrdite da li se stanje na izlazu slaže sa postavljenim i na osnovu toga možete, recimo, da detektujete neki problem ili preopterećenje.
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 PIC16F182712.02.2013. u 17:23 - pre 136 meseci
Promenljive (varijable)
===============
Da bi mogli da radimo obradu podataka, potrebne su nam promenljive koje će da čuvaju vrednosti kojima baratamo, a to su u stvari lokacije u RAM memoriji. Da bi mogli da ih koristimo moramo na početku programa da ih definišemo, tj. da im damo imena i odredimo tip podatka koji će da čuvaju, ne moramo da brinemo o tome koje konkretne RAM lokacije zauzimaju jer o tome vodi računa sam PBP.

PBP poznaje 4 tipa promenljivih, a to su: BIT, BYTE, WORD i LONG, s tim da poslednja može da se koristi samo kod PIC18 serije. Za BIT, BYTE i WORD ne postoji mogućnost rada sa negativnim i decimalnim brojevima, mada se to uz pomoć odredjenih tehnika može izvesti, dok je LONG u formi drugog komplementa što znači da može da čuva i negativne cele brojeve. Svaki od ovih tipova promenljivih može da se definiše kao skalar ili kao niz.

Definisanje skalara
-----------------------
Sintaksa za kreiranje skalarnih promenljivih je:

Ime_promenljive VAR tip {.modifikator}

Ime_promenljive mora da bude jedinstveno i ne može da bude rezervisana reč (kompletan spisak rezervisanih reči možete da nadjete u uputstvu za PBP, poglavlje 8.8.)

Lekciju o veličinama ovih tipova, tj. koliko bitova odn. bajtova zauzimaju smo već obradili pa pogledajte da se podsetite koje su moguće vrednosti jer je jako bitno da definišete odgovarajući tip podatka kako ne bi imali pogrešne rezultate.

Modifikator može da se upotrebi da malo bolje definiše promenljivu, a može da bude:

- adresa; omogućava odredjivanje tačne adrese RAM lokacije na kojoj se nalazi promenljiva.
- BANKX; omogućava da se promenljiva smesti u željenu banku.
- SYSTEM; podrazumevano ponašanje PBP-a je da interno doda donju crtu ispred naziva promenljive pri kreiranju asemblerskog koda (to je jedna od faza kompajliranja PBP programa). Ovaj modifikator sprečava to dodavanje tako da je promenljiva istog naziva i u PBP i u asmeblerskom kodu.

Primeri kreiranja skalarnih promenljivih:
Code:

moj_flag        var bit  ; promenljiva tipa bit
minuti          var byte ; promenljiva tipa bajt
sekunde         var word ; promenljiva tipa vord
stotinke        var byte bank0  ; promenljiva tipa bajt u banci 0
desetinke       var byte system ; promenljiva tipa bajt bez ubacivanja donje crte ispred imena
sekunda         var byte bank0 system ; kombinovano kao dve prethodne
karakter1       var byte $70  ; promenljiva tipa bajt koja se nalazi na adresi 0x70 (heksadekadno)


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


[Ovu poruku je menjao rsinisa dana 12.02.2013. u 21:46 GMT+1]
 
Odgovor na temu

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

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

Postavi temu Odgovori

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