NazajElektronika.ba

www.elektronika.ba/forum/

autor: pedja089 napisao je u postu:

Odlučio sam pokušati da napravimo neki kratak kurs o picevima, tj konkretno o njihovom programiranju u pbp-u, tj picbasicu pro.


Iz toga ubrzanoga kursa je na tom mestu kratak sažetak radova, koje su tekom učenja napisali učesnici. Sve je preneseno sa foruma tako kako tamo stoji i zato se izvinjavam za eventualne greške u programima. O svemu je moguće prodiskutirati na forumu sa učesnicima.

Pali gasi LED
int_63.gif (3721 bytes)
autor: pedja089

 

OUTPUT PORTB.7  'proglasavamo portb izlaznim

pocetak:              ' ovo je labela sa nazivom pocetak
HIGH PORTB.7      ' ovim smo postavili rb7 na logicku 1(5V)
PAUSE 1000          'sada cekamo jednu sekundu
LOW PORTB.7       'sada postavimo rb7 na 0 tj na 0V
PAUSE 1000          'opet cekamo
GOTO POCETAK     'ovom naredbom kazemo da se program vrati na pocetak i da se tako vrti u krog do beskonacnosti
END                       'stavljamo na kraj programa, nije obbavezan
SYMBOL LED = PORTB.7

OUTPUT LED 
pocetak:             
HIGH LED     
PAUSE 1000       
LOW LED       
PAUSE 1000       
GOTO POCETAK     
END

Nizmenično pali gasi obe LED
int_64.gif (3686 bytes)
autor: RIDIK

OUTPUT PORTB.7
OUTPUT PORTB.6
pocetok:
       High PORTB.7
       LOW PORTB.6
       PAUSE 1000
       LOW PORTB.7
       HIGH PORTB.6
       PAUSE 1000
       GOTO pocetok
       End 

Mali semafor
semafor.gif (3797 bytes)
autor: RIDIK

SYMBOL CRVENALED = PORTB.7

 SYMBOL ZOLTALED = PORTB.6
 SYMBOL ZELENALED = PORTB.5
 output CRVENALED
 OUTPUT ZOLTALED
 OUTPUT ZELENALED
 PORTB=0 ' gi isklucuva site led
 
pocetok:
       High CRVENALED ' se vklucuva crvenata led
       LOW ZELENALED  ' se isklucuva zelenata led
       PAUSE 1000         ' pauza od 1 sekundi
       LOW CRVENALED  ' se isklucuva crvenata led
       HIGH ZOLTALED  ' se vklucuva zoltata led
       PAUSE 3000     ' pauza od 3 sekundi
       LOW ZOLTALED   ' se isklucuva zoltata led
       High ZELENALED ' se vklucuva zelenata led
       PAUSE 5000     ' pauza od 5 sekunda
       GOTO pocetok   ' vrati se na pocetok
       End

Sedmosegmentni displej

Klikni za veću sliku

autor: pedja089

U principu on se sastoji od 8dioda. Sedam dioda su segmenti i osma dioda je tačka.
Znači ako hoćemo da napravimo da se na displeju menjaju redom brojevi samo je potrebno da palimo određjene diode. Isti je slučaj kod displeja sa zajedničkom anodom i katodom, naravno samo je potrebnno izmeniti ono što se šalje na port. Za početak napisaćemo program da ispiše broj 1 na displeju.
Pošto je ovo displej sa zajedničkom anodom, segmenti se pale kada se na njih dovede 0. Da bi se pokazao broj 1 na displeju potrebno je uključiti segmente b i c. To ćemo uraditi tako što ćemo poslati broj  %1111 1001
Evo ptimera:
trisb=0 'port je izlazni
portb=%1111 1001 'uključili smo jedan
ili možemo napisati i portb = 249' to je isti broj kao gore samo u decimalnom obliku
ili možemo napisati broj u heksadecimalnom obliku portb=$F9
kada se piše broj u heksadecimalnom obliku onda se ispred broja stavlja znak $
Broj Segment Hex Dec
0  %1100 0000 $C0 192
1  %1111 1001 $F9 249
2  %1010 0100 $A4 164
3  %1011 0000 $B0 176
4  %1001 1001 $99 153
5  %1001 0010 $92 146
6  %1000 0010 $82 130
7  %1111 1000 $F8 248
8  %1000 0000 $80 128
9  %1001 1000 $98 152

Klikni za veću sliku
autor: pedja089

Ovo je sedmo segmentni displej sa dekoderom. Kao što se vidi na šemi prednost ovakvog načina vezivanja displeja je u tome što je za 1 displej potrebno manje pinova, tj potrebna su 4 pina...
Koriščenje je manje više jako prosto. Dovoljno je poslati broj od 0-16 i na displeju će se pojaviti broj od 0-9, a za veće brojeve uglavnom se pojavljuju brljotine na displeju.
Neki dekoderi podrzavaju i heksa decimalne brojeve, pa za brojeve veće od 10 prikazaće se odgovarajuća slova od A-F.

 

 

 

Sledeći naćin je da se koriste 2 dekodera:

Klikni za veću sliku
autor: pedja089

Sada je situacija nešto složenija jer imamo 2 broja od 0-16 koja treba složiti u jedan bajt. Za prikazivanje na displeju čiji je dekoder prikopčan na rb0-rb3, je ista priča kao od malopre. Znaći treba poslati broj od 0 do 16, a da bi smo nešto prikazali na displeju čiji je dekoder prikopčan na rb4-rb7 moramo nekako pomeriti broj za 4 bina na gore. Ovako bi trebao da izgleda broj poslat na portb u binarnom obliku:
GGGG DDDD
D-biti donjeg displeja
G-biti gornjega displeja.
a mi imamo 2 broja u sledećem obliku
0000 DDDD
0000 GGGG
---------------
da bismo dobili oblik kao gore najjednostavnije je pomeriti bite GGGG u levo da se dobije
GGGG 0000
kada imamo broj u tom obliku onda ga je dovoljno sabrati sa drugim brojem
0000 DDDD
+GGGG 0000
-----------------
GGGG DDDD
i dobili smo oblik koji smo želeli.
Pomeranje bita GGGG možemo izvesti na 2 načina.
Jedan je koriščenjem matematičkog operatora za šiftovanje bita.
Matematički operator se koristi na sledeći način:
promenljiva << broj za koliko se bita pomera sadržaj u levo.
Isti je slučaj i kod šiftovanja u desno.
Evo konkretan primer:
TRISB=0
BROJ1 VAR BYTE 
BROJ2 VAR BYTE

BROJ1=5  ' donji displej treba da prikaze 5
BROJ2=2  ' gornji displej treba da prikaze 2

BROJ2=BROJ2<<4 ' ovde pomeramo donja 4 bita, u levo da donju na mesto gornja 4 bita, sada samo treba sabrati brojeve i upisati ih u portb
PORTB=BROJ1+BROJ2

Drugi način pomeranja u levu stranu je množenje sa brojem 16(ako je potrebno 4 mesta)

TRISB=0
BROJ1 VAR BYTE 
BROJ2 VAR BYTE

BROJ1=5  ' donji displej treba da prikaze 5
BROJ2=2  ' gornji displej treba da prikaze 2

BROJ2=BROJ2*16 ' ovde pomeramo donja 4 bita, u levo da donju na mesto gornja 4 bita, sada samo treba sabrati brojeve i upisati ih u portb
PORTB=BROJ1+BROJ2

LED displeji u multipleksu

Klikni za veću sliku
autor: pedja089

Ovde su svi displeji paralelno spojeni. ali postoje tranzistori pomoću kojih uključujemo samo odredjeni displej.
Ovde se sve svodi na to da se pali prvi drugi pa treći displej...
Znaći ako hočemo da upalimo skroz levi displej koji nam pokazuje stotine onda čemo postaviti rb7 na 1.
Evo konkretno kako se upravlja displejima:
prvo je potrebno na portb poslati broj koji želimo da se vidi na određenom displeju, zatim je potrebno uključiti taj displej (postaviti odgovarajuci pin na 1) držati ga uključenog neko vreme, zatim ga isključiti , pa isto to ponoviti za sledeći displej. Ako ovo dovoljno brzo ponavljamo dobićemo utisak da displeji stalno svetle.
Jedan kratak program koji bi trebao ispisati trocifreni broj:

TRISB=0
BROJ1 VAR BYTE 
BROJ2 VAR BYTE
BROJ3 VAR BYTE
BROJ1=5
BROJ2=2
BROJ2=6
POCETAK:
PORTB=BROJ1  'postavljanje prve vrednosti na port b
HIGH PORTB.7  'ukljucivanje displeja
PAUSE 5           ' zadrzavanje prikaza
LOW PORTB.7   'iskljucivanje displeja
PORTB=BROJ2  'postavljanje druge vrednosti....
HIGH PORTB.6
PAUSE 5
LOW PORTB.6 
PORTB=BROJ3
HIGH PORTB.5
PAUSE 5
LOW PORTB.5 
GOTO POCETAK

Isto je ovo moguće i bez dekodera. Stim što se onda brojevi na portb šalju kao kada je priključen samo 1 displej (najlakše koriščenjem lookup naredbe).
Ovo je bilo lako jer imamo rastavljene cifre.
Ako imamo neki rezultat u bajtu, tada ga je potrebno rastaviti na stotine desetice i jedinice...
Za to ćemo koristiti naredbu DIG. Ova naredba izdvaja određenu cifru iz nekog broja.
Evo primer:
BROJ1= 123 DIG 1 ' ovo će u promenljivu broj1 staviti vrednost cifre koja se nalazi na drugom mestu kada brojimo sa desna na levo.
Broj posle DIG govori koja se cifra izdvaja iz broja koji je ispred naveden. Ako stoji dig 0 onda se izdvaja krajnja desna cifra, tj jedinice, ako stoji dig 4 onda se izdvaja krajnja leva cifra...
Evo primera:

TRISB=0
BROJ VAR BYTE
BROJ1 VAR BYTE 
BROJ2 VAR BYTE
BROJ3 VAR BYTE
BROJ=123
POCETAK:
BROJ1 = BROJ DIG 2' izdvajamo stotine
BROJ2 = BROJ DIG 1'desetice
BROJ3 = BROJ DIG 0'jedinice
PORTB=BROJ1
HIGH PORTB.7
PAUSE 5
LOW PORTB.7
PORTB=BROJ2
HIGH PORTB.6
PAUSE 5
LOW PORTB.6 
PORTB=BROJ3
HIGH PORTB.5
PAUSE 5
LOW PORTB.5 
GOTO POCETAK

Obrtomer

Klikni za veću sliku
autor: pedja089

Sada ovo bi mogli iskoristiti za izradu nekog konkretnog uređaja...
npr obrtomera (broj obrtaja u sekundi) ili možemo ga iskoristiti kao frekvencmetar.
Sada nam preostaje jedna nqaredba sa kojom bi prebrojali impulse.
a to je naredba COUNT
sintaksa:
COUNT Pin, Period, BrojImpulsa
Pin je pin na kontroleru na kojem se broje impulsi
Period je vreme za koje se broje impulsi
BrojImpulsa je promenljiva u koju se smesta broj izbrojanih impulsa.
evo primera:
TRISB=0
TRISA=255
BROJ VAR WORD
BROJ1 VAR BYTE 
BROJ2 VAR BYTE
BROJ3 VAR BYTE
BROJ4 VAR BYTE
I VAR BYTE

POCETAK:
COUNT PORTA.0,1000,BROJ ' broji impulse na pinu RA0, u periodu od 1S i rezultat   smesta u "BROJ"
BROJ1 = BROJ DIG 3 'izdvajamo hiljde
BROJ2 = BROJ DIG 2' izdvajamo stotine
BROJ3 = BROJ DIG 1'desetice
BROJ4 = BROJ DIG 0'jedinice
FOR I = 1 TO 100  ' u ovom slucaju stavili smo da se ispis na displeju ponovi 100 puta, sto znaci da ce vreme prikazivanja broja na displeju biti oko 2 sekunde
PORTB=BROJ1
HIGH PORTB.7
PAUSE 5
LOW PORTB.7

PORTB=BROJ2
HIGH PORTB.6
PAUSE 5
LOW PORTB.6 

PORTB=BROJ3
HIGH PORTB.5
PAUSE 5
LOW PORTB.5

PORTB=BROJ4
HIGH PORTB.4
PAUSE 5
LOW PORTB.4
NEXT I
GOTO POCETAK

LCD moduli

LCD.gif (23183 bytes)

Pin number Symbol  Level   I/O Function
1 Vss - - Power supply (GND)
2 Vcc - - Power supply (+5V)
3 Vee - - Contrast adjust
4 RS 0/1 I 0 = Instruction input
1 = Data input
5 R/W 0/1 I 0 = Write to LCD module
1 = Read from LCD module
6 E 1, 1->0 I Enable signal
7 DB0 0/1 I/O Data bus line 0 (LSB)
8 DB1 0/1 I/O Data bus line 1
9 DB2 0/1 I/O Data bus line 2
10 DB3 0/1 I/O Data bus line 3
11 DB4 0/1 I/O Data bus line 4
12 DB5 0/1 I/O Data bus line 5
13 DB6 0/1 I/O Data bus line 6
14 DB7 0/1 I/O Data bus line 7 (MSB)


autor: Dariolo

 

   Za PBP koriste se LCD-ei koji u sebi koriste HD44780 kontoler, mada ima i drugih koji se mogu koristiti. Kod spajanja LCD-a sa PIC-om, ako koristimo pbp trebamo koristiti odgovarajuće pinove. Na slici je prikazano spajanje LCD-a i PIC-a. No spajanje na ovaj način nije nužno mogu se koristiti i drugi pinovi PIC-a ali se onda se moraju definirati pinovi koji se koriste To bi bilo malo od hardware-skog dijela sada da pređemo na pisanja programa.

Za slanje podtaka na LCD koristi se jednostavna naredba LCDOUT. Ispod imamo tabelu komandi koje se koriste uz naredbu LCDOUT.

KOMANDA OPERACIJA NA DISPLAY-u
$FE,1 obriši displej
$FE,2 vrati se na početak prve linije
$FE,$0C isključi kursor
$FE,$0E uključi underline kursor
$FE,$0F uključi blinkajući kursor
$FE,$10 pomeri kursor u levo za 1 mesto
$FE,$14 pomeri kursor u desno za 1 mesto
$FE,$80 vrati kursor na početak prve linije
$FE,$C0 vrati kursor na početak druge linije
$FE,$94 vrati kursor na početak treće linije (za one displaye koji imaju 3 linije)
$FE,$D4 vrati kursor na početak četvrte linije (za one displaye koji imaju 4 linije)

Ove komande pišu se iz LCDOUT:

LCDOUT $FE, 1 ;briše sve sa LCD-a

Kod pisanja programa na početku potrebno je napraviti pausu od 0.5sek da se LCD inicializira.

pause 500
LCDOUT $FE, 1 ;briše sve sa LCD-a i inicijelizira ga

ako uzmemo

LCDOUT $FE, $C0  ;početak druge linije

onda se podatci upisuju u 2. red.

Neki od načina slanja podataka na LCD:

LCDOUT $FE, 1, "elektronika.ba"  ; ispisuje u prvu liniju elektronika.ba
LCDOUT $FE, $C0, "elktrophreak ; u drugu liniju ispisuje elektrophreak
LCDOUT $FE, i ; ispisuje neku vrijednost koju smo dodjelili i

ako npr. želimo da podatak bude zapisan od pete pozicije u prvom redu koristit ćemo sljedeće:

LCDOUT $FE, $80+5, "elektro"

Da bi vrijednosti neke konstante ili promjenjive na LCD-u predstavili u binearnom obliku koristi se naredba LCDOUT $FE, BIN i
odnosno da bi bila u heksadekadnom ili dekadnom obliku umjesto BIN koristit će se HEX ili DEC.

ako oćemo napraviti niz nekog znaka određeni broj puta koristit ćemo REP,
npr. ako želimo da na LCD-u imamo ispisano ***** , naredba bi izgledala LCDOUT $FE, REP "*"\5
znači gdje je "*" upisuje se znak koji se želi ponavaljati i MORA biti pod novodnicima, a 5 predstavlja broj ponvaljanja.

Ovo su bile neke osnovne naznake kod pisanja naredbih za LCD, prilično su jednostavno tako da nebi trebali imati problema sa njima!

Sada ćemo samo pokazati primjer jednog jednostavnog programa koji mjeri frekvenciju na koju dovedemo na željeni ulaz (RB1)

TRISB.1=1
TRISA=0
BROJ VAR WORD
pause 500       
lcdout $FE, 1
POCETAK:
COUNT PORTB.1,1000,BROJ ' broji impulse na pinu RB1, u periodu od 1S i rezultat   smesta u "BROJ"
lcdout $FE, $80, "COUNT=", dec broj ; ispisuje na LCD-u COUNT= i broj prikazuje kao decimalnu veličinu
pause 10     
GOTO POCETAK


.


autor: pedja089

Kod koriščenja define upotreba naredbi lcdout se ne menja. Define samo definise kako je spojen lcd sa picem. i dodaje se na sam početak programa.

DEFINE LCD_BITS 4 'bira se da li lcd radi u 4 bitnom ili 8 bitnom modu
DEFINE LCD_DREG PORTB 'bira se port na koji su zakačeni data biti(d4-d7)
DEFINE LCD_DBIT 0 'početni bit data porta. 0 ili 4. ako je postavljen na 0 onda se d4 spaja na rb0,d5-rb1, d6-rb2, d7-rb3,
a ako je postavljen na 4 d4 se spaja na rb4 itd..
DEFINE LCD_RSREG PORTB 'port na koji je zakačena linija RS
DEFINE LCD_RSBIT 4 'bit porta na kome je zakačena linija RS. u ovom slučaju je zakačena na RB4
DEFINE LCD_EREG PORTB 'port na kome je zakačena E linija displeja
DEFINE LCD_EBIT 3 'bit porta na kome je zakačena E linija.
DEFINE LCD_RWREG PORTE 'podešavanje sa RW liniju. mada ovo se ne ubacuje jer se RW vezuje na masu. i time je odabran upis podataka u displej.
DEFINE LCD_RWBIT 2 'RW bit
DEFINE LCD_LINES 2 'broj linija displeja. 1,2,4
DEFINE LCD_COMMANDUS 2000 'kašnjenje komande u ms. po meni je nepotrebno posebno definisati, jer je vec definisano u pbp
DEFINE LCD_DATAUS 50 'kašnjenje podataka u ms.
Još par napomena. Umesto potenciometra može se ubaciti otpornik (2k2) između mase i pina 3, a ako se koristi ra4 sa lcd-om pull up otpornik uglavnom nije potreban, jer lcd ima pull up na svim ulaznim pinovima.

Evo jedan primer spajanja lcd-a na portb.
DEFINE LCD_BITS 4
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 5
DEFINE LCD_LINES 2
pause 100 'cekanje inicijalizacije displeja
lcdout $fe,1, "pozdrav svima"
end
Mali programčić za prikaz koje simbole može prikazivati određeni displej.
'PIC16F628A
@ DEVICE XT_OSC,WDT_OFF,PWRT_ON,PROTECT_OFF

DEFINE OSC 4 'Oscillator speed in MHz
CMCON = 7 ' Set PORTA to digital
INCLUDE "bs2defs.bas"
DEFINE LCD_BITS 4 'izbira ali lcd dela v 4 bitnem ali 8 bitnem modu
DEFINE LCD_DREG PORTA 'izbira se port na kateri so priključeni data biti(d4-d7)
DEFINE LCD_DBIT 0 'začetni bit data porta. 0 ali 4. Če je postavljen na 0
'se d4 spaja na RA0, d5-RA1, d6-rb2, d7-rb3,a če je postavljen na 4
'd4 se spaja na rb4 itd..
DEFINE LCD_RSREG PORTA 'port na kateri je priključena linija RS
DEFINE LCD_RSBIT 4 'bit porta na katerem je priključena linija RS. V tem slučaju
'je priključena na RA4
DEFINE LCD_EREG PORTB 'port na kateri je priključena E linija displeja
DEFINE LCD_EBIT 0 'bit porta na katerem je priključena E linija.
DEFINE LCD_RWBIT 2 'RW bit
DEFINE LCD_LINES 2 'število linij displeja. 1,2,4
DEFINE LCD_DATAUS 50 'zakasnitev podatkov v ms.

INPUT PORTB.7
INPUT PORTB.6
INPUT PORTB.5
output PORTB.1
output PORTB.2
output PORTB.3
output PORTB.4
SYMBOL enter = PORTB.7 'tipka
SYMBOL plus = PORTB.6 'tipka
SYMBOL minus = PORTB.5 'tipka

broj var word
broj = 1
start:
pause 100 'inicijalizacija displeja
lcdout $FE,1 'obriši displaj
lcdout $fe,1,DEC broj," ",broj 'izpiše v prvo linijo
if plus = 0 then broj = broj + 1 'naslednji znak
if minus = 0 then broj = broj - 1 'prejšnji znak
if enter = 0 then broj = 1 'potrdi
pause 100
goto start
end


Priključenje grafičkog LCD


Odabir int/ext oscilatora, odabir dali je pin RA5 MCLR ili I port, ili korištenje njegovih specijalnih registara
(PIC 16F627/628)

pedja089: to su se postavke u programatoru...
Bar ih ja sve imam u ovom od mikroelektronike što ide uz easy pic. A u IC-prog imaš sa desne za mcle kao strane da biraš xt, hs, int osc i mislim da je i tu za mclr. Mada malo je nezgodno posle isprogramirati ako se mcle koristi kao io pin. U tom slučaju mora prvo da se dovede vpp pa vcc na pic, a to ne podržavaju svi programatori....
koska182: ja koristim samo ove za 16f62x :

   @ DEVICE INTRC_OSC_NOCLKOUT     ' System Clock Options   
   @ DEVICE WDT_ON                                    ' Watchdog Timer
   @ DEVICE PWRT_ON                                  ' Power-On Timer
   @ DEVICE MCLR_OFF                                ' Master Clear Options (Internal)
   @ DEVICE BOD_ON                                     ' Brown-Out Detect
   @ DEVICE LVP_OFF                                    ' Low-Voltage Programming
   @ DEVICE CPD_OFF                                    ' Data Memory Code Protect
   @ DEVICE PROTECT_OFF                          ' Program Code Protection

Branez: Moji programatori

...Serial-PIC programmer

Serial-PIC programmer

Serial-PIC programmer

USB-PIC programmer

Serial-PIC programmer

RS232 proširenje

Klikni za veću sliku
autor: UssSiscia shema i pločica u PDF

Izgled gotovoga uređaja

Podešavanja programa MCS

Pošto ima uvijek problema sa podešavanjem MCS programa evo jednog "printscreena". Slika govori više od sto rečiju. To treba poštelati prije početka rada sa programom.

Forum elektronike

free hit counters

smjesko.gif (1070 bytes)EKSPERIMENTALNA PLOČA ZA PIC-MIKROKONTROLERENaprej