skraceni kurs ucenja picbasica

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

Moderators: stojke369, pedja089, [eDo], trax

Postby pedja089 » 04-09-2008, 23:06

ako imas flopi rasturi ga i unutara imas rezonator. krajnje dve idu na pic, srenjs na masu. u principu moze bilo koja vrsta oscilatora samo onda tako moras podesiti i u programatoru.
posto vidim da su svi glasovi za dalje i nema potrebe za zadrzavanjem, hajde da krenemo.
prvi program neka bude prgram za obicnu ledicu koja treperi.
sema:
Image
milsim da je sema prosta tako da nema potrebe posebno je komentarisati
prvo sto treba da uradite e da izaberete 16F84A
kao sto je na slici
Image
kada ste izabrali pic vreme je da se krene sa pisanjem :)
prvo sto treba uraditi je postaviti portb.7 kao izlaz.
to se moze raditi na vise nacina, jedan od nacina je pomocu tris registra.
evo kako bi to izgledalo
TRISB=%01111111(u pbp kada se stavi znak % to znaci da sledi broj ubinarnom zapisu)
ovako su svi pinovi postavljeni kao ulazni sem najviseg bita. kao sto se vidi iz primera rb7 je prvi bit, pa za njim dolazi rb6 itd sve do rb0 koji je najnizi tj krajnji desni bit.
drugi nacin za postavljanje pina kao izlaznog je koriscenje naredbe OUTPUT
ova naredba se koristi tako sto se posle nje napise pin koji zelimo proglasiti izlazom, ili cak ceo port.
npr ako napisemo OUTPUT PORTB tada cemo ceo portb proglasiti izlaznim
a ako napisemo OUTPUT PORTB.7 tada cemo samo rb7 proglasiti izlazom a ostali pinovi ce ostati nepromenjeni.
naredba za postavljanje pina kao ulazni je INPUT i sa njom cemo se pozabaviti kasnije...
sledeca naredba koja ce nam trebati je PAUSE
mislim da se ovde nema sta posebno reci sem da je maksimalna vrednost pauze 65,535 ms
pauza se koristi tako sto se napise PAUSE 50, to znaci da ce pic apraviti pauzu od 50ms. slicna naredba je PAUSEUS. na isti nacin se koristi, samo je za odabir duzine potrebno pogledati tabelu koja se nalazi u help fajlu.
naredbe HIGH i LOW su nam potrebne da bi menjali stanje na odredjenom pinu ili portu.
koriste se tako sto se napise HIGH pa pin ili port
u nasem slucaju HIGH PORTB.7
na isti nacin se koristi i naredba LOW
drugi nacin za menjanje stanja na portu je da napisemo PORTB.7=1 ili PORTB.7=0 ovo je ekvivalentno naredbama HIGH i LOW
e sada nam ostaje sve ovo sloziti u program
i sada nam je ostala jos jedna naredba GOSUB
ona se koristi da bi program skocio na neku labelu.
najlakse cete razumeti na primeru :wink:
i ostaje nam jos SYMBOL
ova naredba nije potrebna ali je zgodna.
sa njom mozemo dati ime nekom pinu.
npr ako napisemo SYMBOL LED=PORTB.7
u daljem programu necemo morati pisati portb.7 nego je dovoljno napisati led.
napomene: u toku pisanja programa kada zelimo da komentarisemo neki red stavi se znak ' i posle tog znaka u redu je komentar i on ne ulazi u program.
postoji jedna dosta zgodna stvar koja dosta olaksava posao.
a to je kada u toku pisanja programa ne mozemo necega da se setimo dovoljno je postaviti kursor na naredbu i stisnuti F1, tada se otvara help i odmah prikazuje pomoc oko te naredbe.
npr ako napisemo LOW i stavimo kursor na njega dobicemo opis te naredbe
evo kako bi izgledao program:

Code: Select all
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

kada smo ovo napisali potrebno je sacuvati program pa kompajlirati. u koliko nista sacuvali program a stisnuli dugme za kompajliranje mcs ce sam ponuditi da sacuvate program.
kompajliranje se moze izvesti na 3 nacina,pritiskom na taster 'F9' ili kao sto je pokazano na slici:
http://www.elektronika.ba/forum/uploadz ... titled.GIF
a sad evo isti program samo kada se koristi SYMBOL

Code: Select all
SYMBOL LED= PORTB.7
OUTPUT LED 
pocetak:             
HIGH LED     
PAUSE 1000       
LOW LED       
PAUSE 1000       
GOTO POCETAK     
END


sada jos samo ostaje ubaciti hex faj u pic. hex fajl se nalazi u istom folderu gde ste sacuvali i program.
i sada kada to sklopite i upisete program u pic imate ledicu koja treperi :wink:
sad bih voleo da se vi potrudite pa napravite da se dve ledice naizmenicno pale i gas, kao svetla na rampama :) znaci vi crtate semu i vi pisete program.
pa ko prvi uradi to, i isproba neka uslika, po mogucnosti i snimi pa da vidimo svi kako mu to radi. e sad majstori lemilice u ruke i na posao :!: :)
naravno ako ima pitanja pitajte.
e sad vidoh da nisam prokomentarisa tipku reset. o njoj ne treba nista posebno reci. kada se tipka stisne pic se resetuje i program krece ispocetka. tj kada je na pinu mclr logicka nula tada je reset aktivan. kada je logicka jedinica tada pic normalno radi
Last edited by pedja089 on 06-09-2008, 21:29, edited 3 times in total.
User avatar
pedja089
 
Posts: 7612
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re:


Postby pedja089 » 05-09-2008, 11:18

evo sad sam se setio jos jedne komande koju bi bilo zgodno pomenuti.
a to je TOGGLE. ova komanda menja stanje na pinu, ako je na pinu bila 1 on taj pin postavlja na 0, a ako je bila 0 onda se menja u jedan.
evo jos jedan primer
Code: Select all
SYMBOL  LED=PORTB.7
OUTPUT LED
pocetak:             
TOGGLE LED 'prvi put kada program naidje na naredbu toggle on ce pin postaviti na 1, sledecim nailaskom ce ga vratiti na 0 i tako u krug. i dobili ste ledicu koja blinka.
PAUSE 1000         
GOTO POCETAK     
END
Last edited by pedja089 on 06-09-2008, 19:53, edited 2 times in total.
User avatar
pedja089
 
Posts: 7612
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Postby ShOkRe » 05-09-2008, 12:54

ispravi na PORTB.7... jer nemozes toglati bajt nego bit
nisam skuzio dali radis sa PBP-om ako da, npr,ja uvjek stavim :
LED VAR PORTB.7
User avatar
ShOkRe
 
Posts: 467
Joined: 10-01-2007, 20:55
Location: Pula

Postby Cojder » 05-09-2008, 14:06

Nznam kako vama ali meni ovo postaje interesantno.
Cojder
 
Posts: 16
Joined: 15-07-2007, 11:05

Postby pedja089 » 05-09-2008, 16:03

ShOkRe wrote:ispravi na PORTB.7... jer nemozes toglati bajt nego bit
nisam skuzio dali radis sa PBP-om ako da, npr,ja uvjek stavim :
LED VAR PORTB.7

@ShOkRe ja i toglam bit.
u zurbi sam zaboravio napisati portb.7
a mislim da led uopste nije potrebno definisati kao promenljivu...
dovoljno je sa symbolom naznaciti da led predstavlja portb.7
jeli je iko ista uspeo napraviti :?:
kome je to proradilo ako nije tajna :D
User avatar
pedja089
 
Posts: 7612
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Postby RIDIK » 05-09-2008, 20:23

ova e kodot za so dve led diodi koj se gasat i palat najizmenicno
Code: Select all
 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 


http://www.elektronika.ba/forum/uploadz ... int_63.GIF
User avatar
RIDIK
 
Posts: 125
Joined: 07-05-2008, 18:11

Postby pedja089 » 05-09-2008, 20:30

evo ga napokon neko nesto da je uradio. odlicno za 5.
evo sada bi mogli pokazati kako se koristi pin kao ulazni...
Image
evo seme. potrebno je samo na prethodnu semu dodati jedan taster i otpornik. otpornik nije kritican mose od 2k2, pa sve do 10K...
ako nemate taster pri ruci dovoljno je i komad zice zalemiti na pin.
zadatak:
kada je taster stisnut ledica treba da treperi, kada se taster pusti ledica treba da bude ugasena.
kao prvo treba na prethodni program dodati jedan ulaz i dati ime ulaznom pinu
za ovo ce nam biti potrebna naredba INPUT koja je vec objasnjena.
jos jedna od naredbi koja ce nam trebati je IF... THEN...
ova nareba sluzi za ispitivanje tacnosti izraza i ako je izraz tacan izvrsava se naredba koja se nalazi iza then.
prvi i najjednostavniji oblik je kada se sve nalazi u istom redu i za to postoji sledeca sintaksa.
IF izraz THEN naredba.
izraz moze da pretstavlja bilo koju jednakost ili nejednakost.
npr u nasem slucaju
IF TASTER=0 THEN ... sada smo ispitai da li je ulaz jednak nuli. a ulaz ce biti jednak nuli kada je taster stisnut.
naredba moze biti bilo koja iz PBP-a
postoji jos i slucaj kada postoji vise izraza koji se mogu povezati sa OR ili AND.
npr: IF TASTER1=0 AND TASTER2=0 THEN... u ovom slucaju oba uslova moraju biti jednaka da bi se izvrsila naredba posle THEN
drugi slucaj je kada se koristi OR
npr: IF TASTER1=0 OR TASTER2=0 THEN... u ovom slucaju ce se naredba izvrsiti kada je ispunjen bilo koji od ta dva uslova...
sledeci slucaj je slucaj kada posle THEN treba da se izvrsi skup naredbi a ne samo jedna.
sintaksa za to je sledeca
IF TASTER=0 THEN
naredba1
naredba2
.
.
.
naredba n
ENDIF
ukoliko je izraz tacan tada ce se preci na izvrsavanje naredbi redom kako su pisane.
i u ovom slucaju se mogu koristiti i OR ili AND.
i jos jedan oblik naredba IF je kada se koristi ELSE.
sintaksa je slicna kao iz proslog primera samo sto sada postoji deo posle ELSE koji se izvrsava ukoliko izraz nije tacan
IF TASTER=0 THEN
naredba1
naredba2
.
.
naredba n
ELSE
naredba1
naredba2
.
.
naredba n
ENDIF
toliko IF...
sada da pokazemo na primerima


Code: Select all
SYMBOL  TASTER= PORTB.0
SYMBOL  LED=PORTB.7
OUTPUT LED
INPUT TASTER                   ' sada smo taster proglasili ulazom
pocetak:             
IF TASTER=0 THEN TOGGLE LED  ' sada se ispituje dali je taster stisnut, ukoliko je stisnut promenice se stanje na led, posle svakog ispitivanja pravi se pauza od 1s
PAUSE 1000         
GOTO pocetak   ' program se vraca na pocetak
END


sada primer za drugi slucaj koriscenja naredbe
Code: Select all
SYMBOL TASTER= PORTB.0
SYMBOL  LED=PORTB.7
OUTPUT LED
INPUT TASTER
pocetak:     
IF TASTER=0 THEN       'u ovom slucaju ukoliko je taster stisnut izvrsavace se blok narebi
HIGH LED     
PAUSE 1000       
LOW LED       
PAUSE 1000       
ENDIF
GOTO POCETAK    'posle izvrsenog bloka naredbi program se vraca na pocetak i ponovo se ispituje stanje TASTER-a     
END


sledeci tip je if...then....else
Code: Select all
SYMBOL TASTER= PORTB.0
SYMBOL  LED=PORTB.7
OUTPUT LED
INPUT TASTER
pocetak:     
IF TASTER=0 THEN     
HIGH LED     'ako je uslov ispunjen izvrsava se ovaj blok naredbi(moze da stoji i jedna naredba)
PAUSE 1000 
ELSE
LOW LED     'ukoliko uslov nije ispunjen izvrsava se ovajh blok naredbi (ili naredba)
PAUSE 1000     
ENDIF
GOTO POCETAK    'posle izvrsenog bloka naredbi program se vraca na pocetak i ponovo se ispituje stanje TASTER-a     
END


e sada da se vratimo na sedmi bit OPTION REGISTRA :wink:
da bi se izbegla upotreba pullup otpornika na portub dovoljno je samo postaviti sedmi bit OPTION_REG na 0.
sada je potrebno samo ubaciti na sam vrh programa LOW OPTION_REG.7 i tada vam vise nije potreban pullu otpornik... NAPMENA ovo vazi samo za portb
evo i jedan primer sa upotrebom OPTION REGISTRA
Code: Select all
LOW OPTION_REG.7
SYMBOL TASTER= PORTB.0  'dali smo ime pinu portb.0
SYMBOL  LED=PORTB.7
OUTPUT LED
INPUT TASTER                   ' sada smo taster proglasili ulazom
pocetak:             
IF TASTER=0 THEN TOGGLE LED  ' sada se ispituje dali je taster stisnut, ukoliko je stisnut promenice se stanje na led, posle svakog ispitivanja pravi se pauza od 1s
PAUSE 1000         
GOTO pocetak   ' program se vraca na pocetak
END

EDIT:
sad sam video da sam i ja pravio jednu glupu gresku, ali verujete nije lako pisati ovoliki tekst posle napornog dana.
stavljao sam SYMBOL PORTB.=LED A TREBA SYMBOL LED=PORTB.7
Last edited by pedja089 on 06-09-2008, 21:28, edited 10 times in total.
User avatar
pedja089
 
Posts: 7612
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Postby Smjesko » 05-09-2008, 20:48

Kao sto sam i obecao da cu hardverski podrzati Pedjinu zamisao, ....

http://www.elektronika.ba/forum/viewtop ... 3593#43593
User avatar
Smjesko
 
Posts: 4012
Joined: 26-12-2005, 17:12

Postby Dariolo » 05-09-2008, 21:35

Evo uradih gotovo isto!
Koristio SYMBOL i primjetio sam da si (namjerno il nenamjerno) napravio grešku!?

SYMBOL LED1 = PORTB.7
SYMBOL LED2 = PORTB.6
OUTPUT LED1
OUTPUT LED2

pocetak:
HIGH LED1
PAUSE 1000
LOW LED1
HIGH LED2
PAUSE 1000
LOW LED2
GOTO POCETAK
END


idemo dalje :lol: :lol:
User avatar
Dariolo
 
Posts: 822
Joined: 24-08-2006, 23:29
Location: Žepče (BiH), Zagreb (HR)

Postby pedja089 » 05-09-2008, 21:50

uf greske se slucajno podvuku. malo je naporno pisati toliki text.
a i tvoj program je za svaku pohvalu. samo jedan mali savet. posto se zna desiti da se i posle iskljucenja pica zapamti stanje u nekom registru, i npr ako ostne ukljucena led2 tebi ce ujednom trenutku sijati obe ledice. zato je bolje da ovo LOW LED2 prebacis na sam pocetak programa
User avatar
pedja089
 
Posts: 7612
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re:


Postby RIDIK » 05-09-2008, 21:55

razlikata dali portb.6 e gore kako vo mojot slucaj ili dole kako ti sto si pisal e vo toa sto koga ke go upalis picot neznaci deka portb.6 e off...
User avatar
RIDIK
 
Posts: 125
Joined: 07-05-2008, 18:11

Postby pedja089 » 05-09-2008, 23:22

evo dok ne apsolviramo ledice na portovima i if else, mogli bi se polako pripremati za ovo

http://www.elektronika.ba/forum/uploadz ... disp_l.gif
znaci ko nema displej neka ga pribavi. moze i sa zajednickom katodom i anodom. nije bitno koji je bitno da ga imate :wink:
a evo da ne bude da se samo kontrolisu ledice sa picem evo par primera izlaza i ulaza

http://www.elektronika.ba/forum/uploadz ... 531_12.gif

http://www.elektronika.ba/forum/uploadz ... 645_14.gif

http://www.elektronika.ba/forum/uploadz ... 671_16.gif
Last edited by pedja089 on 06-09-2008, 18:55, edited 2 times in total.
User avatar
pedja089
 
Posts: 7612
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Postby pedja089 » 06-09-2008, 19:40

e sada bi mogli uvesti promenljive i uciniti stvari mal okomplikovanijim i zanimljivijim...
promenljive su mesto gde se podaci privremeno cuvaju. podacima u njuma se moze pristupiti bilo kada u toku izvrsavanja programa. i one su uobicajno rezultat necega, neke funkcije, ili cak stanja na portu ili samo na pojedinom bitu ili pinu...
kada kazem privremeno mislim na to da se one gube po nestanku napajanja.
stoga ako neke promenljive treba da imaju neku pocetnu vrednost onda se na pocetku programa uvek posle definisanja promenljivih dodeljuje i njihova vrednost.
preporucljivo je staviti i da je promenljiva jednaka nuli ako ona ne treba da sadrzi nista, jer nekada se desi da pic zapamti nesto na toj lokaciji.
sintaksa za definisanje promenljivih"
ime promenljive VAR velicina
ime promenljive je obavezno jedna rec. i nije dozvoljeno koristiti znakove kao sto su tacka ili zarez. uostalom ako napisete pogresno ime kompajler ce javiti gresku i zacrvenece se red u kojem je greska...
postoje 3 velicine promenljivih a to su BIT, BYTE i WORD
promenljiva BIT je velicine bita :D sto znaci da se u njoj moze zapamtiti samo 0 ili 1.
promenljiva BYTE je velicine 8biti. tju nju se moze sacuvati broj od 0 do 255
promenljiva WORD je velivine 2 bajta tj 16bita.
i u nju se moze sacuvati broj od 0 do 65535
evo par primara:
Pin VAR BIT ' ovim smo definisali promenljivu pin i ona moze biti samo 1 ili 0
Broj VAR BYTE ' ovim smo definisali promenljivu broj i u nju mozemo smestiti broj do 255
VelikiBroaj VAR WORD ' promenljiva je veliki broj i u nju se moze smestiti broj do 65535
sada da se to primeni na prakticnom primetu.
Zadatak:
treba napraviti program koji ce po pritisku tastera upaliti led zadrzati je upaljenju pola sekunde, zatim je ugasiti i ako je taster i dalje stisnut ledica ne treba ponovo da se pali. znaci ledica treba da se upali tek kada se taster pusti pa ponovo stisne.
a to cemo uraditi na sledeci nacin.
Code: Select all
SYMBOL LED=PORTB.7
SYMBOL TASTER=PORTB.0
OUTPUT LED
INPUT TASTER
NovoStanje var bit
StaroStanje var bit
starostanje = taster ' ovde se uzima pocetno stanje, tj stanje kada je taster pusten 
Pocetak:     
novostanje = taster        'OVDE SE UZIMA TRENUTNO STANJE NA TASTERU
if novostanje<starostanje then ' OVDE SE UPOREDJUJU STANJA. AKO JE TASTER STISNUT TADA JE NOVO STANJE JEDNAKO 0 I SAMIM TIM JE MANJE OD STAROG STANJA
HIGH led                 'PALI LED
PAUSE 500                'PAUZA POLA SEKUNDE
LOW LED                  'GASI LED
ENDIF
STAROSTANJE=NOVOSTANJE   'OVAJ RED JE POTREBAN IZ RAZLOGA DA PRI PONOVNOM NAILASKU NA IF PROMENLJIVA NNOVO STANJE NE BI BILA MANJA OD STAROG STANJA. U OVOM SLUCAJU SE IZJEDNACAVAJU. I TAK KADA SE PROMENI STANJE SA 1 NA 0 ONDA CE SE LEDICA UPALITI
GOTO POCETAK   
END

ako ima nekih nejasnoca pitaj te
User avatar
pedja089
 
Posts: 7612
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Postby pedja089 » 07-09-2008, 20:06

evo sada je na red dosao i sedmo segmentni displej.
http://www.elektronika.ba/forum/uploadz ... disp_l.gif
u principu on se sastoji od 8dioda. sedam dioda su segmenti i osma dioda je tacka.
znaci ako hocemo da napravio da se na displeju menjaju redom brojevi samo je potrebno da palimo odredjene diode. isti je slucaj kod displeja sa zajednickom anodom i katodom.
naravno samo je potrebnno izmeniti ono sto se salje na port.
za pocrtak napisacemo program da ispise broj 1 na displeju.
posto je ovo displej sa zajednickom anodom segmenti se pale kada se na njih dovede 0.
da bi se pokazao broj 1 na displeju potrebno je ukljuciti segmente b i c.
a tocemo uraditi tako sto cemo poslati broj %1111 1001
evo ptimera.
trisb=0 'port je izlazni
portb=%1111 1001 'ukljucili smo jedan
ili mozemo napisati i portb=249' to je isti broj kao gore samo u decimalnom obliku
ili mozemo napisati broj u heksadecimalnom obliku portb=$F9
kada se pise 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
evo ga. a na vama je sada da napisete da broji sekunde od 0 do 9, i na kraju displej treba da se ugasi. znaci da ne svetli ni jedan segment na njemu
Last edited by pedja089 on 08-09-2008, 22:54, edited 1 time in total.
User avatar
pedja089
 
Posts: 7612
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Postby pedja089 » 08-09-2008, 22:54

e sada da nastavimo...
evo i jedne ciklusne naredbe

FOR Index=Start TO End {STEP {-} Inc}
{naredbe}
NEXT {Index}
indeks je promenljiva tipa byte ili word
Start - je početna vrednost promenljive Index.
End - je krajnja vrednost promenljive Index sa čijim se dostizanjem završava FOR ciklus.
Inc - je vrednost sa kojom se u svakom prolazu povecava ili smanjuje promenljiva Index. Ako nije navedenao {STEP {-} Inc} podrazumeva se da je 1.
npr jedan primer
Code: Select all
i VAR BYTE
SIMBOL LED=PORTB.1
OUTPUT LED
FOR i=1 TO 10             'broj prolaza 10
TOGGLE LED                 
NEXT i

ovaj programcic ce 10 puta promeniti stanje na ledici.
ovo je zgodno kada nesto treba da se ponovi odredjeni broj puta...
e sada da pogledamo jednu naredbu koja je jako korisna kod 7 segmetnog displeja.
npr kada bi hteli da napravimo program koji bi broio od 0 do 9 koristeci for.
to bi izgledalo
FOR i=0 TO 9
if i=0 then portb= 192
.
.
.
.
if i=9 then portb= 152
NEXT i
mao naporno zar ne...
ajde sad da pogledamo drugi nacin
koristeci select case
prvo nesto da kazemo o toj naredbi

SELECT CASE promenljiva
CASE izraz1,izraz..
naredba
CASE izraz2 ,izraz
naredba
{CASE ELSE naredba}
END SELECT
promenljiva moze biti bilo kog tipa, mada ako je promenljiva bit onda ova naredba bas i nema smisla.
izraz je ono sa cime se uporedjuje promenljiva, i ako je tacna onda se izvrsava naredba ispod.
CASE ELSE naredba - ovaj red je opcioni.
znaci moze da se stavi a i nemora.
a naredba koja stoji iza case else ce se izvrsiti ukoliko promenljiva nije bila jednaka sa bilo kojim izrazom navedenom posle case.
evo jedan primer iz help fajla.
SELECT CASE x
CASE 1
y = 10
CASE 2, 3
y = 20
CASE IS > 5
y = 100
CASE ELSE
y = 0
END SELECT
mislim da ga nema potrebe nesto posebno objasnjavati.
i ovo smo mogli iskoristiti za ispis brojeva na displeju ali nista puno nam ne skracuje posao u odnosu na naredbu if...
sto se mene tice case slobodno zaboravite. najcesce se koristi if i sledeca naredba.
a to je LOOKUP
sintaksa:
LOOKUP Indeks,[Konstanta,Konstanta...],Promenljiva
indeks predstavlja broj od nule, pa se moze menjati do onog broja koliko imamo konstanti u zagradi
promenljiva je mesto gde se smesta konstanta.
Ova naredbe koristi se za čitanje vrednosti iz tabele konstani na osnovu zadatog Indeksa. Kada je 0 to je indeks prvog člana tabele. Vrednost člana sa datim Indeksom se smešta u promenljivu. kada je indeks 1 onda se uzima vrednost druge konstante i smesta se u promenljivu.
U slučaju ako je vrednost Indeksa veća ili jednaka broju članova tabele promenljiva Var zadržava prethodnu vrednost.
ista je stvar i sa lookup2 samo sto kod te naredbe konstante mogu biti velicine word
evo primera:
Lookup i, [192,249, 164,176,153, 146, 130, 248, 128, 152], portb
u ovom slucaju ce poslati odgovarajuci broj na portb.
ako obratite paznu videcete da su to brojevi iz tabele za 7 seg. displej.
pa program za brojenje bi izgledao ovako

Code: Select all
i VAR BYTE
OUTPUT PORTB
FOR i=0 TO 9           
Lookup i, [192,249, 164,176,153, 146, 130, 248, 128, 152], portb
PAUSE 500           
NEXT i

ovo je mnogo jednostavnije od bilo cega navedenog, zar ne?
sto se tice 7 seg displeja ostale su jos 2 stvari da objasnim. a to je multipleksiranje displeja, i koriscenje dekodera.
sto se tice multipleksiranja mozda bi bilo najbolje da svi instalirate proteus da nemorate plocice praviti. samo jedna napomena kod proteusa ne rade sve naredbe. npr kada se napise output portb, proteus nece prepozndati da je portb izlazni. nego se mora koristi trisb registar. to sam tek sada primetio.
posle toga dolazi lcd displej, za koji se isto moze koristiti proteus. ali ja bi vam preporucio da nabavite displej da bi mogli videti prenos podataka sa racunara na pic. i time bi se polako priveli kraju...
pa ako imate pitanja u vezi ovoga pitajte
a evo malo domaceg :D
voleo bi sad da neko napravi program koji ce brojati pritiske tastera, i kada izbroji do 9, pa se ponovo taster stisne treba da se vrati na 0 i da sve ide ispocetka
ne bi trebalo da vam predstavlja problem :wink:
EDIT:
Evo jos jednog nacina za koriscenje sedmosegmentnog displeja
Code: Select all
Cifra var byte[10]
i var byte
Cifra[0] = %11000000
Cifra[1] = %1111 1001
Cifra[2] = %1010 0100
Cifra[3] = %1011 0000
Cifra[4] = %1001 1001
Cifra[5] = %1001 0010
Cifra[6] = %1000 0010
Cifra[7] = %1111 1000
Cifra[8] = %1000 0000
Cifra[9] = %1001 1000
i=0' U i stavimo cifru koju hocemo na displeju.
portb=cifra[i]

Ovo mi do sad nije palo na pamet. Video sam od @TomicIgor. Hvala puno.
User avatar
pedja089
 
Posts: 7612
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Postby pedja089 » 10-09-2008, 22:59

jel imate lcd il da samo objasnim jos ove dve stvari pa da kazem da je kraj :?:
User avatar
pedja089
 
Posts: 7612
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Postby koska182 » 11-09-2008, 15:14

Iako je ovo moj prvi post, aktivno pratim kurs.
Nisam nabavio lcd, ali bi htio nauciti kako se s njim upravlja. koristit cu proteus za simuliranje dok ne nabavim pravi lcd.
Kurs je odlican i htio bi da se što vise naredbi i funkcija obradi.
Svaka cast na trudu!
koska182
 
Posts: 11
Joined: 09-06-2007, 01:00

Postby alexa_pg » 12-09-2008, 20:51

Sta je sa casovima? Idemo dalje...
alexa_pg
 
Posts: 1202
Joined: 11-03-2005, 22:21
Location: Podgorica

Postby Dariolo » 12-09-2008, 20:52

kurs je u izredi ponovo dobrom pedjinom voljom, tako malo strpljena :wink: :wink:
User avatar
Dariolo
 
Posts: 822
Joined: 24-08-2006, 23:29
Location: Žepče (BiH), Zagreb (HR)

Postby pedja089 » 12-09-2008, 23:23

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
pedja089
 
Posts: 7612
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

PreviousNext

Return to Mikrokontroleri - PIC

Who is online

Users browsing this forum: No registered users and 1 guest

GOOGLE