skraceni kurs ucenja picbasica

Rasprava o PIC mikrokontrolerima, PIC projekti i drugo vezano za PIC-eve...

Moderators: pedja089, stojke369, [eDo], trax

Post Reply
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7876
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Post by pedja089 »

sema:
Image
ovo je sedmo segmentni displej sa dekoderom. kao sto se vidi na semi prednost ovako nacina vezivanja displeja je u tome sto je za 1 displej potrebno manje pinova. tj potrebna su 4 pina...
koriscenje je manje vise jako prosto. dovoljno je poslati broj od 0-16 i na displeju ce se pojaviti broj od 0-9, a za vece brojeve uglavnom se pojavljuju brljotine na displeju.
a neki dekoderi podrzavaju i heksa decimalne brojeve pa za brojeve vece od 10 prikazace se odgovarajuca slova od A-F.
sledeci nacin je da se koriste 2 dekodera
sema:
Image

sada je situacija nesto slozenija. ker imamo 2 broja od 0-16 koja treba sloziti u jedan bajt.
za prikazivanje na displeju ciji je dekoder prikopcan na rb0-rb3, je ista prica kao od malopre. znaci treba poslati broj od 0 do 16.
a da bi smo nesto prikazali na displeju ciji je dekoder prikopcan 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 sledecem 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 zeleli.
pomeranje bita GGGG mozemo izvesti na 2 nacina.
jedan je koriscenjem matematickog operatora za siftovanje bita.
mat operator se koristi na sledeci nacin
promenljiva << broj za koliko se bita pomera sadrzaj u levo.
isti je slucaj i kod siftovanja u desno.
evo konkretan primer:

Code: Select all

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 nacin pomeranja u levu stranu je mnozenje sa brojem 16(ako je potrebno 4 mesta)

Code: Select all

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
sada dolaze na red displeji u multipleksu.
sema:
Image
ovde su svi displeji paralelno spojeni. ali postoje tranzistori pomocu kojih ukljucujemo samo odredjeni displej.
ovde se sve svodi na to da se pali prvi drugi pa treci displej...
znaci ako hocemo da upalimo skroz levi displej koji nam pokazuje stotine onda cemo postaviti rb7 na 1.
evo konkretno kako se upravlja displejima.
prvo je potrebno na portb poslati broj koji zelimo da se vidi na odredjenom displeju, zatim, je potrebno ukljuciti taj displej(postaviti odgovarajuci pin na 1) drzatiga ukljucenog neko vreme, zatim ga iskljuciti , pa isto to ponoviti za sledeci displej. i ako ovo dovoljno brzo ponavljamo dobicemo utisak da displeji stalno svetle.
evo jedan kratak program koji bi trebao ispisati trocifreni broj:

Code: Select all

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 moguce i bez dekodera. stim sto se onda brojevi na portb salju kao kada je prikljucen samo 1 displej(najlakse koriscenjem lookup naredbe).
ovo je bilo lako jer imamo rastavljene cifre.
ali npr ako imamo neki rezultat u bajtu, tada ga je potrebno rastaviti na stotine desetice i jedinice...
za to cemo koristiti naredbu DIG. ova naredba izdvaja odredjenu cifru iz nekog broja.
evo primer
BROJ1= 123 DIG 1 ' ovo ce u promenljivu broj1 staviti vrednost cifre koja se nalazi na drugom mestu kada brojima 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:

Code: Select all

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
e sada ovo bi mogli iskoristiti za izradu nekog konkretnog uredjaja...
npr obrtomera(broj obrtaja u sekundi) ili mozemo ga iskoristiti kao frekfenciometar.
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:

Code: Select all

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
sema:
http://www.elektronika.ba/forum/uploadz ... rtomer.GIF

ako je sve jasno moglo bi se reci da smo zavrsili sa sedmosegmentnim displejima....
sada bi mogli malo preci na lcd displej.
za pocetak mozete koristiti i proteus.
User avatar
Dariolo
Odlično uznapredovao
Odlično uznapredovao
Posts: 822
Joined: 24-08-2006, 23:29
Location: Žepče (BiH), Zagreb (HR)

Post by Dariolo »

Pošto je pedja trenutno loš sa pristupom interneta, pokušat ću ja nešto da napišem za LCD!

Mada sam i ja još u dubokoj fazi učenja pokušat ću napisati da svi početnici (kao i ja) shvate i razumiju!

http://img.alibaba.com/photo/11413948/1 ... odules.jpg
to bi bio primjer jednog paralelnog 16x2 LCD-a, još postoje i serijski al oni su kompliciranij i skuplji pa njih odmah zaboravimo :D

za PBP koriste se LCD-ei koji u sebi koriste HD44780 kontoler, mada ima i drugih koji se mogu koristit (jedan takav je u mene)

http://home.iae.nl/users/pouweha/lcd/lc ... assignment

tu imamo raspored pinova na jednom takvom LCD-u

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:

Image

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!

Code: Select all

 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.

Code: Select all

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

Code: Select all

 LCDOUT $FE, $C0  ;početak druge linije
onda se podatci upisuju u 2. red.

neki od načina slanja podataka na LCD:

Code: Select all

 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
http://www.elektronika.ba/forum/uploadz ... ika.ba.JPG

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

Code: Select all

 LCDOUT $FE, $80+5, "elektro" 
http://www.elektronika.ba/forum/uploadz ... lektro.JPG
da bi vrijednosti neke konstante ili promjenjive na LCD-u predstavili u binearnom obliku koristi se naredba LCDOUT $FE, BIN i
odnosdno da bi bila u heksadekadnom ili dekadnom obliku umjesto BIN koristit će se HEX ili DEC.


ako oćemo npravi ti 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)

Code: Select all

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
http://www.elektronika.ba/forum/uploadz ... _count.JPG

evo i ja sam se nešto potrudio da doprinesem u učenju pbp-a, ako netko vidi neku grešku u ovome napisanome neka rekne pošto sam još uvjke početnik ko što sam već reko!
a i pedja je reko nadopuniti pa eto vjerujem da će on ako bude kakvi greški il slično ispraviti i nadopuniti tekst!

stavit ću još koji program za LCD čim uhvatim još malo vremena!

i još jednom da pohvalim pedju na trudu, tek sam sada vidio šta znači pisat sav ovaj tekst!!
Attachments
PIC-LCD.gif
(10.03 KiB) Downloaded 1 time
Last edited by Dariolo on 21-10-2008, 17:21, edited 1 time in total.
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7876
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Post by pedja089 »

super odradjeno. ja cu samo jos dodati kako se koristi define za lcd, tako da se moze spojiti na bilo koji port, cim malo uhvatim vremena....
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7876
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Post by pedja089 »

kod koriscenja define upotreba naredbi lcdout se ne menja. define samo definise kako je spojen lcd sa picem. i dodaje se na sam pocetak 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 zakaceni data biti(d4-d7)
DEFINE LCD_DBIT 0 'pocetni 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 zakacena linija RS
DEFINE LCD_RSBIT 4 'bit porta na kome je zakacena linija RS. u ovom slucaju je zakacena na RB4
DEFINE LCD_EREG PORTB 'port na kome je zakacena E linija displeja
DEFINE LCD_EBIT 3 'bit porta na kome je zakacena E linija.
DEFINE LCD_RWREG PORTE 'podesavanje 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 'kasnjenje komande u ms. po meni je ne potrebno posebno definisati, jer je vec definisano u pbp
DEFINE LCD_DATAUS 50 'kasnjenje podataka u ms.
jos par napomena. umesto potenciometra moze se ubaciti otpornik(2k2) izmedju 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 ulasnim pinovima.
kada se radi simulacija u proteusu, tada pull up mora ici...
evo jedan primer spajanja lcd-a na portb.

Code: Select all

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
sema:
Attachments
untitled.GIF
Sema
(36.4 KiB) Downloaded 1 time
User avatar
DaTi
Odlično uznapredovao
Odlično uznapredovao
Posts: 730
Joined: 10-06-2007, 13:24
Location: Novi Sad - Srbija
Contact:

Post by DaTi »

Imama problem sa lcd.. uzeo sam od mikroelektronike njihov sa plavim osvetlenjem i sve sam uradio po pedjinoj semi jos sam doceo na pin1 gnd, spojio sa pic16f84 u ubacio ovaj pedjin probram i nedaje znake zivota samo svetli osvetlenje i na ekranu nista nepise.... nez do cega moze bit problem :? jel neko imao takav problem :?:
User avatar
Elektronicar
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 467
Joined: 19-01-2008, 17:05
Location: Balkan

Post by Elektronicar »

Nisi pravilno inicijalizovao display ili imas gresku u programu. Takodje proveri kontrast.
koska182
Posts: 11
Joined: 09-06-2007, 01:00

Post by koska182 »

jesi na lcd-u spojio r/w pin (pin 5) na masu?
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7876
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Post by pedja089 »

spoj kao na semi. onda izbacis define, i samo pises

Code: Select all

trisa=0
trisb=0
pause 100
lcdout $fe,1,"pozdrav"
end
http://www.elektronika.ba/forum/uploadz ... 14_sch.GIF
Last edited by pedja089 on 20-10-2008, 20:50, edited 2 times in total.
User avatar
DaTi
Odlično uznapredovao
Odlično uznapredovao
Posts: 730
Joined: 10-06-2007, 13:24
Location: Novi Sad - Srbija
Contact:

Post by DaTi »

PRoradio mi je bilo... i onda smao odjednom opet je zakazalo i sad u prvom redu imam jednu takicu i nista vise.... do cega je to :?: :evil:
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7876
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Post by pedja089 »

do protoborda. i meni se to desavalo. napravi neku malu test plocicu sa lcd-om i ostale pinove samo izvuci do kraja plocice....
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7876
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Post by pedja089 »

evo ja sam sad probaop program sa define i radi bez problema...
User avatar
Dariolo
Odlično uznapredovao
Odlično uznapredovao
Posts: 822
Joined: 24-08-2006, 23:29
Location: Žepče (BiH), Zagreb (HR)

Post by Dariolo »

Jel može tko da pojasni kod drugih tipova PIC-a (npr. 16f627/628) kako se vrši npr. odabir int/ext oscilatora, odabir dali je pin RA5 MCLR ili I port, ili kako se to zove korištenje njegovih specijalnih registara!

gledao sam po datasheetu od 627 al teško da se snađem, vidim koji se registar koristi za što al neznam kako se to definira u pbp-u.

Jer sam prešao sa 84 na 627, pošto mi je onaj izgorio :twisted: :lol:
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7876
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Post by pedja089 »

to su se postavke u programatoru...
bar ih ja sve imam u ovom od mikroelektronike sto ide uz easy pic. a u ic prog imas sa desneza mcle kao strane da biras 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. jer u tom slucaju mora prvo da se dovede vpp pa vcc na pic, a to ne podrzavaju svi programatori....
User avatar
Dariolo
Odlično uznapredovao
Odlično uznapredovao
Posts: 822
Joined: 24-08-2006, 23:29
Location: Žepče (BiH), Zagreb (HR)

Post by Dariolo »

znam da ima u programatoru tako sam do sad i postavljo, al kad radim nešto u proteusu onda se javlja problem :?
koska182
Posts: 11
Joined: 09-06-2007, 01:00

Post by koska182 »

ja koristim samo ove za 16f62x

Code: Select all

 	
@ 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
i mala napomena: trebaš ugasit komparatore (ako ih neces koristit)
s naredbom

Code: Select all

CMCON = 7
User avatar
DaTi
Odlično uznapredovao
Odlično uznapredovao
Posts: 730
Joined: 10-06-2007, 13:24
Location: Novi Sad - Srbija
Contact:

Post by DaTi »

Jel neko moze da opise sta znaci sta kod fjuzova 12f629.. skontao sam sve samo ne kontam oscilatore :roll: jel moze neko?
shorty
Penjem se :)
Penjem se :)
Posts: 74
Joined: 03-05-2007, 20:10

Post by shorty »

Mene zanima o tom pbp-u ,odakle vama taj program da li je besplatan i gde se moze skinuti?
Pozdrav.
Branez
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 457
Joined: 22-04-2008, 16:27
Location: Maribor(SLO) Koprivnica(HR)
Contact:

Post by Branez »

Da si pročitao iz početka......
pedja089 wrote:http://rapidshare(dot)com/files/142404491/s ... u.rar.html
e ovako. u raru postoje 2 instalacije setup(instalira microcode studio) i pbp 2.44(to je kompajler). ne bitno kojim redom cete instalirati. samo nakon sto oboje instalirate preostaje vam povezati mcs sa kompajlerom.
uputstvo je na slici. znaci samo pokrenite mcs(micro code studio) i pratite uputstva sa slike

http://www.elektronika.ba/forum/uploadz ... titled.GIF

evo jednostavnog napajanja
http://www.elektronika.ba/forum/uploadz ... 088_01.gif
a evo jos jednostavnijeg
http://www.elektronika.ba/forum/uploadz ... titled.GIF
Real Radios Glow in the Dark!
shorty
Penjem se :)
Penjem se :)
Posts: 74
Joined: 03-05-2007, 20:10

Post by shorty »

Ok, vidim izvinjavam se,a je li to full verzija ili neka krekovana,mislim ima li ogranicenja,ako nema onda bih mogao preci sa mickrobasica na taj pbp?
Hvala unapred.
User avatar
Smjesko
Stariji član
Stariji član
Posts: 4012
Joined: 26-12-2005, 17:12

Post by Smjesko »

Skini, instaliraj pa vidi :!:
Post Reply