Ovaj primer mozes da nadjes svuda, ali evo cisto da vidis kako izgleda
Code:
#include <P16F870.INC>
BROJAC equ 0x1F ;
org 00h ;
Pocetak
movlw 0 ;
movwf TRISB ;
clrf BROJAC ;
Petlja
btfss PORTA,0 ;
goto Inkrementovanje ;
btfss PORTA,1 ;
goto Reset
KrajPetlje
goto Petlja ;
Inkrementovanje
incf BROJAC,1 ;
movf BROJAC,W ;
movwf PORTB ;
Otpustanje_tastera
btfss PORTA,0 ;
goto Otpustanje_tastera ;
btfss PORTA,1 ;
goto Otpustanje_tastera ;
Otpustanje_tastera_kraj
goto Otpustanje_tastera
Reset
clrf BROJAC ;
movf BROJAC,W ;
movwf PORTB
goto Otpustanje_tastera ;
org 0x01FF
goto Pocetak
end
Epa ajde da pocnemo. Znaci imamo mikrokontroler koji ima 8 pina koji su definisani kao izlazni, a tih osma pina cine PORTB.Recimo da na PORTB imamo 8 LED dioda.
Nas program pocinje sa #include i tu ukljucujemo set instrukcija za PIC16F870,
zatim definisemo promenljivu (registar, promenljiva je velika samo 1 bajt) na nekoj lokaciji u sustini nije bitno na kojoj samo treba da pazis da se ta lokacija ne poklopi sa lokacijom nekog vec postojeceg registra. Nas program pocinje na lokaciji 00h. Instrukcija
movlw 0
movlw - move littreal to work register
ova instrukcija vrednost 0 smsta w registar. Inace work registar ti je regitar kroz koji uglavnom sve prolazi i pomocu njega se vrse sve operacije.Naredna instukcija
movwf TRISB ; move w register to file
smesta sadrzaj w registra u registar TRISB. TRISB registar je pomocu kog se definise PORTB ako se u w registar upise 0 svi pinovi su izlazni, ako se u njega upise b'11111111' sto znaci b - binarni broj, gde su svi bitovi 1 onda su sva 8 pina ulazna. Odnosno ako bi se u TRISB upisalo b'00011111' prva tri pina bi bila izlazna, a druga 5 ulazna...
clrf BROJAC; clear file
ona radi isto sto i ove dve prethodno zajedno znaci brise jedan registar (u ovom slucaju brojac i postavlja ga na 0, normalno svi bitovi su 0)
btfss PORTA,0 ;bit test in file skip if set
s obzirom da se bitovi broje od 0 do 7 ova instrukcija testira da li je 0-ti bit PORTA jedinica (svuda gde je set to znaci postavljanje na 1, a gde je clear postavljanje na 0) i ako jeste jedinica onda se preskace naredna instrukcija, a je 0 instrukcija se ne preskace. PORTA je definisan kao ulazni ( tj. svi portovi su na pocetku tako definisani ako ih ne definises drugacije) i na njegovom prvom i drugom pinu su dva tastera (jedan na PORTA,0 i drugi PORTA,1) ako je recimo vrednost prvog tastera 0 koji je na PORTA,0 onda je taj taster pritisnut a ako je 0 nije isto vazi za PORTA,1.
Pa znaci ako je taster pritisnut program ce otici na funkciju Inkrementovanje, a ako nije preskoci ce je i otici na btfss PORTA,1 sto znaci da ispituje sada da li je drugi taster pritisnut ako jeste ide na funkciju Reset, ako nije pritisnut preskace instrukciju i ide na kraj petlje i zatim se vrti u petlji sve dok neki taster ne bude pritisnut.
Naredna instrukcija je incf BROJAC,1 ; incerment file
ova funkcija inkrementuje registar BROJAC za jedan ali ova jednica ne znaci to nego ona predstavlja parametar koji oznacava ce rezultat nakon inkrementovanja biti smesten u registar BROJAC u slucaju da je 0 rezultat ce biti smesten u w
registar
nakon toga prebacujemo sadrzaj registra brojac u w registar(movf BROJAC; move file - uvek prebacuje sadrzaj nekog registra u w registar)
a zatim sadrzaj w registra prebacujemo u registar PORTB (movwf PORTB) sto zanci kada smo smestili vrednost u PORTB oni bitovi koji su 1 tu ce LED diode na koje zakacene na te pinove biti upaljene
b '1 0 1 0 0 0 1 1'
* 0 * 0 0 0 * * --- LED (*-upaljena, 0-ugasena)
Sada opet ispitujemo da li je taster pritisnut ili je otpusten ako je pritisnut onda vrti petlja sve dok nebe otpusten, jer u slucaju da ne ispitamo da li je otpusten ili ne moze da se desi registar BROJAC nekontrolisano inkrementuje, dok ovako znamo jedan pritisak tastera je jedan inkrement.
To se isto radi i za taster koji se nalazi na PORTA,1
Sada nam dolazi funkcija reset koja ima zadatak da izbrise registar BROJAC tj. postavi ga na nulu, a zatim taj sadrzaj posalje na PORTB tj. na LED diode. Reset se znaci poziva pritiskom tastera koji se nalazi na PORTA,1
clrf BROJAC ; postavljamo brojac na 0
movf BROJAC,W ; prebacujemo sadrzaj registra BROJAC u w registar
movwf PORTB ; prebacujemo sadrzaj w registra u PORTB
goto Otpustanje_tastera ; idemo na petlju Otpustanje_tastera
nakon zavrse ne reset funkcije nas program se vrti u petlju za otpustanje tastera i kada je taster otpusten on ide na glavnu petlju gde ceka da neki od tastera bude pritisnut
nas progrma se zavrsava na lokaciji 01FFh iako nije zauzeo toliko memorije kolika je razlika izmedju lokacija na kojoj pocinje i na kojoj se zavrsava
a zatim se vraca na pocetak. end oznacava kraj programa
do poslednjih tri linija koda program kad se izvrsava u principu nikad i ne dodje do njih jer se ili vrtu u glavnoj petlji ili u petlji za otpustanje tastera
Nadam se da ce ti ovo nesto razjasniti trudio sam se da sve bude detaljno objasnjeno.