Pali gasi LED
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
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
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
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 |
|
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: |
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
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
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
|
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
|
|
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 |
...
|
RS232 proširenje
autor: UssSiscia
shema i pločica u PDF
|
|