|
[ Marko1991 @ 06.07.2011. 19:09 ] @
| Interesuje me da li je ispravno da iz glavnog programa pozovem potprogram u kome su instrukcije za paljenje i gasenje led (Napisao sam kod ali ne radi bas najbolje pa zato pitam dal' moze iz PP da se manipulise portovima).
Konkretno, u glavnom programu testiram pin RA0, ako je prekidac na njemu pritisnut, pozovi potprogram koji ce upaliti jednu LED i instrukcijom rlf upaliti sledecu a ugasiti prethodnu.
Radim u MPLAB-u i radim na ploci EasyPic6, a kontroler je 16f84.
Unapred hvala.
|
[ bogdan.kecman @ 06.07.2011. 19:39 ] @
ne znam sta je PP ali mozes da manipulises bilo kojim hardwerom na pic-u iz bilo kog dela ...
mplab je IDE koji podrzava jedno 30tak programskih jezika, bilo bi korisno da napises koji koristis, asembler, basic, c ..
isto tako ako ti ne radi kod, ubacis ga ovde u poruku pa neko pogleda i pomogne ti, ova napamet .. odgovor je "moze, nemam pojma sta pitas"
[ shpiki @ 06.07.2011. 19:44 ] @
Cini mi se da on misli na pozivanje funkcija, tipa
Code:
if (PORTA.A0) {
PaliLed();
...
...
}
a u PaliLed() je stavio nesto tipa
Code:
void PaliLed(){
PORTB=255;
delay_ms(1000);
PORTB=0;
}
naravno, primer sam nasepetao, samo me interesuje jel to ideja tih "potprograma"?
Pozdrav.
[ bogdan.kecman @ 06.07.2011. 19:56 ] @
zasto bi mi gledali u pasulj sta je on mislio .. neka napise ...
poprilicno sam siguran da ne pise u c-u (niti bi postavljao takvo pitanje niti bi to zvao potprogramom) tako da je garant ili neki basic ili neki assembler .. a problem mu je najverovatnije sa bankama .. no kao sto rekoh .. suljpa, prstenje, kosti i ostale sisteme za gledanje u tudju glavu ne koristim jos uvek
[ Marko1991 @ 06.07.2011. 20:07 ] @
Radim u asembleru. Inace pitao sam da li je ispravno (da li moze da radi bez problema) kada se portovima manipulise u potprogramu.(PP-potprogram)
Ideja je da se svakim pritiskom dugmeta RA0 upali sledeca LED na PORTB a pritiskom dugmeta RA1 da se upali prethodna led(koristio sam instrukciju za rotaciju bitova)
Evo i koda
Code:
;******Inicijalizacija asemblera********
list p=16f84 ;Definise upotrebljeni kontroler
#include <p16f84.inc> ;Ubacuje nazive registara u program
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
SPORTB equ 0x0C ;Definise shaddow reg.
;********Podesavanje porta************
org 0X00 ;Definise start programa
bsf STATUS,RP0 ;Prebacuje se u banku 1
movlw b'00000011' ;Postavlja RA0 i RA1 kao ulazni
movwf TRISA ;Upis vrednosti u registar porta A
clrf TRISB ;Port b je izlazni
bcf STATUS,RP0 ;Prebacuje se u banku 0
movlw b'00000001'
movwf SPORTB
;*********Glavni program*******
Poc btfsc PORTA,0 ;Testiraj RB0, ako nije pritisnut preskoci instrukciju
call Pet ; a ako jeste upali LED
btfsc PORTA,1 ;Testiraj RB1, ako nije pritisnut preskoci instrukciju
call Pet1 ; a ako jeste ugasi LED
;*******povratak na pocetak programa***
goto Poc ;Povratak na pocetak
;******PP za paljenje i gasenje LED******
Pet rlf SPORTB,F ; Rotacija u SHADDOW registru
movf SPORTB,W ; Kopiranje iz SHADDOW u W
movwf PORTB ; Kopiranje iz W u PORTB.
return ;Povratak iz PP
Pet1 rrf SPORTB,F ; Rotacija u SHADDOW registru
movf SPORTB,W ; Kopiranje iz SHADDOW u W
movwf PORTB ; Kopiranje iz W u PORTB.
return ;Povratak iz PP
;********Kraj programa********
end ;Ktaj
[ rsinisa @ 07.07.2011. 08:23 ] @
Da, može ovako bez problema. Nisi napisao šta je tačno problem, rekao si samo da ne radi baš najbolje što me navodi na to da radi, ali ne kako si ti zamislio. Uzrok tome je skakutanje, treperenje kontakata tastera (bouncing) pa se program ne ponaša kako treba tj. za 1 pritisak na taster tebi se ne pali sledeća LED već neka proizvoljna. Zato se radi softverski ili hardverski "debouncing", odn. eliminacija poskakivanja kontakata tastera.
Ako ne radi uopšte, onda možda nisi dobro povezao ulazni deo - na osnovu toga kako si napisao program treba ti tzv. pull-down otpornik, odn. otpornik koji sa ulaznog pina ide ka masi, a taster ide na plus. U svakom slučaju, nedostaje ti eliminacija poskakivanja kontakata tastera u programu (ako je nisi rešio hardverski).
Da ne bi dalje nagadjali daj sve detalje, a to bi trebalo da radiš i ubuduće jer ćeš samo tako moći da dobiješ savet na brz i efikasan način.
Pozdrav.
Sinisha
P.S. Sad se setih... RLF i RRF rade "kroz" carry bit pa će da se desi, kada središ sve probleme, da u jednom momentu ne vidiš ni jednu LED da svetli, tj. kada bit "izadje" iz registra pa bi i o tome trebalo da povedeš računa u programu.
[ Marko1991 @ 07.07.2011. 22:01 ] @
Ja se izvinjavam zbog propusta, trudicu se da se ne ponavlja.
E ovako problem je sledeci, kad se ucita program u pic upali se prva LED na PORTB(tako i treba) e sad kad pritisnem dugme upale se i ostalih 7(ovako ne treba).
Ideja je bila da kad pritisnem dugme RA0 da se upali sledeca LED a kad pritisnem RA1 da se upali prethodna. (rotacija napred i nazad za 1 korak pritiskom na dugme)
(Pocetnik sam pa malo vezbam ali slabo napredujem  )
Da dodam da LED RB0 sija stalno a ostalih 7 zasija u trenutku kad pritisnem dugme RA0 i iskljuce se kad pustim dugme (istoi se desava i kad pritisnem RA1)
[ rsinisa @ 07.07.2011. 23:59 ] @
Da, to ponašanje je u skladu sa programom. Tvoj program, ako je pritisnut taster, traje 12 ciklusa (ako nisam pogrešio, a nije ni bitno trenutno) što je pri 4 MHz tačno 12 mikrosekundi, tako da se tebi smenjivanje upaljene diode menja frekvencom od oko 83 kHz, a pošto ideš sa rotacijom, menjaš ukupno 9 bitova tako da je frekvenca osvežavanja svih LED oko 9,2 kHz što prozrokuje da ti vidiš kao da su sve LED upaljene istovremeno. To što svetle slabije je sasvim logično jer svetle 1/9 intenziteta. Nadam se da si stavio redni otpornik na svaku LED. Kada otpustiš taster ostaće upaljena jedna nasumična LED, ili nijedna ako je u tom momentu rotacijom setovan carry fleg.
Kako to rešiti? Treba napraviti program koji će da detektuje kada je taster pritisnut i uraditi samo jedno rotiranje sve dok je taster pritisnut, što znači da treba detektovati i kad je taster otpušten. Za sada ću da te ostavim da to sam osmisliš, a ako ne bude išlo daću ti potprogram koji ja veoma često koristim baš za tu situaciju.
Medjutim, time posao nije završen. Zašto? Zbog poskakivanja kontakata tastera. Kao što sam već rekao, kada se pritisne taster vrlo često se ne ostvari samo 1 kontakt već se zbog malo pre navedenog desi da se pojavi nekoliko spajanja i odspajanja kontakata tasera. Koliko će to da bude zavisi od samog tastera. Dodavanjem debaunsera, softverskog ili hardverskog, rešavaš još jedan problem, a to je impuls nastao smetnjom zbog čega program može da "pomisli" da si pritisnuo taster i odradi rutinu. Uglavnom je dovoljno da vreme debaunsinga bude izmedju 10 i 20 ms.
Eto, nadam se da sam malo pomogao, a ako zapneš dobićeš gotovu i kratku rutinu koja radi obe stvari koje su tebi potrebne.
Za početak možeš da napraviš pauzu od npr. 300 ms nakon detekcije pritisnutog tastera što će ti biti dovoljno da vidiš kako se menja jedna po jedna dioda čak i ako držiš taster stalno pritisnut. Tu pauzu možeš da staviš i na kraj rutine za rotaciju, a pošto je rutina za pauzu ista za obe rotacije, napravi je kao poseban potprogram pa ga pozovi posle rotacije.
Pozdrav.
Sinisha
[ Marko1991 @ 08.07.2011. 16:52 ] @
I dalje nece, probao sam da kombinujem vise uzastopnih provera, da li je taster pritisnut pa ako jeste idi na pocetak i proveri ponovo i posle toga pozovi pauzu, ali najbolje sto sam dobio je da rotacija ide napred LED po LED, e sad to bi bilo dobro da sam ja stistako dugme ali ne, on je sam rotirao korak po korak bez da ja ista stisnem.
[ rsinisa @ 08.07.2011. 20:57 ] @
Daj šemu da vidimo kako si to povezao, i taj novi program, pa ćemo dalje.
Pozdrav.
Sinisha
[ Marko1991 @ 09.07.2011. 03:38 ] @
Cackao sam program jos malo ali o5 nista, sad samo 2 LED svetle (odjednom) a kad stisnem dugme za restart upali se samo 1 i tako stoji bez obzira na pritiskanje dugmica.
Inace semu nemam posto radim na mikroelektronikinom easypic6 ( http://www.mikroe.com/eng/prod...7/easypic6-development-system/) a evo koda:
Code:
;******Inicijalizacija asemblera********
list p=16f84 ;Definise upotrebljeni kontroler
#include <p16f84.inc> ;Ubacuje nazive registara u program
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
cblock 0X0C ;Pocetak slobodnih registara
BROJAC1 ;Prvi brojac za praznu petlju.Inicijalno 0XFF
BROJAC2 ;Drugi brojac za praznu petlju.Inicijalno 0XFF
SPORTB ;shaddow registar
endc ;Kraj bloka registara
;********Podesavanje porta************
org 0X00 ;Definise start programa
bsf STATUS,RP0 ;Prebacuje se u banku 1
movlw b'00000011' ;Postavlja RA0 i RA1 kao ulazni
movwf TRISA ;Upis vrednosti u registar porta A
clrf TRISB ;Port b je izlazni
bcf STATUS,RP0 ;Prebacuje se u banku 0
movlw b'00000001'
movwf SPORTB
;*********Ukljuci led*******
Poc btfsc PORTA,0 ;Testiraj RB0, ako nije pritisnut preskoci instrukciju
call Poc ; a ako jeste vrati se na pocetak
call Pau
btfsc PORTA,0
call Pet
Poc1 btfsc PORTA,1 ;Testiraj RB1, ako nije pritisnut preskoci instrukciju
call Poc1 ; a ako jeste vrati se na pocetak
call Pau
btfsc PORTA,1
call Pet1
;*******povratak na pocetak programa***
goto Poc ;Povratak na pocetak
;******PP za paljenje i gasenje LED******
Pet rlf SPORTB,F ; Rotacija u SHADDOW registru
movf SPORTB,W ; Kopiranje iz SHADDOW u W
movwf PORTB ; Kopiranje iz W u PORTB.
call Pau
return ;Povratak iz PP
Pet1 rrf SPORTB,F ; Rotacija u SHADDOW registru
movf SPORTB,W ; Kopiranje iz SHADDOW u W
movwf PORTB ; Kopiranje iz W u PORTB.
call Pau
return ;Povratak iz PP
;******PP za kasnjenje******
Pau decfsz BROJAC1,F ;Smanji brojac1
goto Pet ;Ukoliko je brojac1=0 nastavi dalje
decfsz BROJAC2,F ;Smanji brojac2
goto Pet ;Ukoliko je brojac2=0 nastavi dalje u suprotnom vrati se na pocetak petlje
return ;Povratak iz PP-a
;********Kraj programa********
end ;Ktaj
[ rsinisa @ 09.07.2011. 17:09 ] @
Imaš tu dosta stvari koje nisu kako treba, neću sad da ulazim u detalje da ne dangubimo, napisaću ti program koji će da radi na vreme, pa ga analiziraj i vidi gde si pogrešio.
Za sada ću samo da se osvrnem na ovo:
Citat: Marko1991:
BROJAC1;Prvi brojac za praznu petlju.Inicijalno 0XFF
BROJAC2;Drugi brojac za praznu petlju.Inicijalno 0XFF
Ne vidim da si igde postavio vrednost na FF pa se pitam otkud ti ova tvrdnja?
Za par minuta ti šaljem program, samo da napišem i testiram.
Pozdrav.
Sinisha
[ rsinisa @ 09.07.2011. 17:49 ] @
Evo ti program, testiraj ga, analiziraj i kao prvi zadatak izračunaj koliko tačno traje pauza.
Za drugi zadatak odradi to da se ne ugasi LED kada predje skroz levo ili skroz desno.
Code:
;******Inicijalizacija asemblera********
list p=16f84 ;Definise upotrebljeni kontroler
#include <p16f84.inc> ;Ubacuje nazive registara u program
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
cblock 0X0C ; Pocetak slobodnih registara
BROJAC1 ; Prvi brojac za praznu petlju.
BROJAC2 ; Drugi brojac za praznu petlju.
SPORTB ; shaddow registar
endc ; Kraj bloka registara
;********Podesavanje porta************
org 0X00 ; Definise start programa
bsf STATUS,RP0 ; Prebacuje se u banku 1
movlw b'00000011' ; Postavlja RA0 i RA1 kao ulazni
movwf TRISA ; Upis vrednosti u registar porta A
clrf TRISB ; Port b je izlazni
bcf STATUS,RP0 ; Prebacuje se u banku 0
movlw b'00000001'
movwf SPORTB
movwf PORTB
;*********Ukljuci led*******
pocetak
btfsc PORTA, 0 ; Testiraj RA0, ako nije pritisnut preskoci instrukciju
call rot_levo ; ako jeste,rotiraj ulevo
btfsc PORTA, 1
call rot_desno
goto pocetak ; Povratak na pocetak
;******PP za paljenje i gasenje LED******
rot_levo
rlf SPORTB, F ; Rotacija u SHADDOW registru
movf SPORTB, W ; Kopiranje iz SHADDOW u W
movwf PORTB ; Kopiranje iz W u PORTB.
call pauza
return ; Povratak iz PP
rot_desno
rrf SPORTB, F ; Rotacija u SHADDOW registru
movf SPORTB, W ; Kopiranje iz SHADDOW u W
movwf PORTB ; Kopiranje iz W u PORTB.
call pauza
return ; Povratak iz PP
;******PP za kasnjenje******
pauza
clrf BROJAC2
petlja2
clrf BROJAC1
petlja1
nop
nop
nop
decfsz BROJAC1, F
goto petlja1
decfsz BROJAC2, F
goto petlja2
return
;********Kraj programa********
end ; Kraj
Tu može da se napravi još par modifikacija, ali to sada nije bitno.
Pozdrav.
Sinisha
P.S. Nisam izdržao, evo ti dodatna tema za razmišljanje:
rutina za pauzu može i ovako, ali to nije školski primer, to važi samo u ovom slučaju, a ti razmisli zašto može i ovako:
Code:
pauza
nop
nop
nop
decfsz BROJAC1, F
goto pauza
decfsz BROJAC2, F
goto pauza
return
[Ovu poruku je menjao rsinisa dana 09.07.2011. u 19:09 GMT+1]
[ Marko1991 @ 10.07.2011. 02:46 ] @
1)Trajanje pauze: Ako sam dobro izracunao traje oko 0.3 sekunde, a evo kako sam racunao:
Obrazac za broj instrukcija u vremenskom intervalu (imam oscilator od 8MHz):1(8000000Hz/4)=500nS po instrukciji. Zna se da goto i return instrukcija trosi 2 ciklusa, kad se sve sabere dobije se 10 ciklusa i petlja broji 256 puta do 256, znaci 10*500nS*256*256=~0.3S.
2)Da ne bi kopirao ceo kod evo samo podprograma (crveno je ono sto sam dodao), uspeo sam da dobijem da preskoci carry bit, sto znaci da uvek sija 1 LED, nadam se da je to ok a ne budzenje samo da bi proradilo.
Code:
rot_levo
[red]
btfsc SPORTB,7 ; Tesiraj bit 7 SPORTB registra
rlf SPORTB, F ; Ako nije setovan preskoci ovo a ako jeste rotiraj
[/red]
rlf SPORTB, F ; Rotacija u SHADDOW registru
movf SPORTB, W ; Kopiranje iz SHADDOW u W
movwf PORTB ; Kopiranje iz W u PORTB.
call pauza
return ; Povratak iz PP
rot_desno
[red]
btfsc SPORTB,0 ; Tesiraj bit 7 SPORTB registra
rrf SPORTB, F ; Ako nije setovan preskoci ovo a ako jeste rotiraj
[/red]
rrf SPORTB, F ; Rotacija u SHADDOW registru
movf SPORTB, W ; Kopiranje iz SHADDOW u W
movwf PORTB ; Kopiranje iz W u PORTB.
call pauza
return ; Povratak iz PP
3)Rutina za pauzu:Brojac se sam resetuje kad dodje na nulu, posto bi mu sledeci korak bio -1 a toga nema on se vrati na 256, trebalo bi da je tako.
I evo objasnjenja za pre postavljeno pitnje otkud mi to da brojac ima vrednost FF (citat je iz neke skripte koju sam nasao na netu pre jedno pola godine ako ne i vise):
Citat: Ukoliko imenu BROJAC pridružite, na primer adresu 0x0C, ona će ukazivati na adresu registra opšte namene (RAM memoriju koju možete slobodno koristiti).
Prilikom dobijanja napona napajanja, svi neiskorišćeni registri u mikrokontroleru (osim registara specijalne namene) postavljaju se na vrednost 0xFF. Zato će BROJAC imati vrednost 0xFF.
[ rsinisa @ 10.07.2011. 23:26 ] @
Citat: Marko1991: 1)Trajanje pauze: Ako sam dobro izracunao traje oko 0.3 sekunde, a evo kako sam racunao:
Obrazac za broj instrukcija u vremenskom intervalu (imam oscilator od 8MHz):1(8000000Hz/4)=500nS po instrukciji. Zna se da goto i return instrukcija trosi 2 ciklusa, kad se sve sabere dobije se 10 ciklusa i petlja broji 256 puta do 256, znaci 10*500nS*256*256=~0.3S.
Pa nije baš tako. Ako bolje pogledaš, tu su 2 petlje, jedna unutar druge. Unutrašnja traje 6 ciklusa, a spoljna još 3 više. Unutrašnja se izvršava 256*256 puta, a spoljašnja 256 * 3 puta tako da ukupno vreme iznosi 0,196992 sekundi.
Citat: 2)Da ne bi kopirao ceo kod evo samo podprograma (crveno je ono sto sam dodao), uspeo sam da dobijem da preskoci carry bit, sto znaci da uvek sija 1 LED, nadam se da je to ok a ne budzenje samo da bi proradilo.
Ja bih to uradio posle rotiranja, ali ovo tvoje nije greška, samo drugačiji pristup, i to je sasvim u redu.
Citat: 3)Rutina za pauzu:Brojac se sam resetuje kad dodje na nulu, posto bi mu sledeci korak bio -1 a toga nema on se vrati na 256, trebalo bi da je tako.
Da. Samo, ne postoji broj 256, već se vraća na 0, što si ti i pomenuo u prvom delu rečenice.
Citat: I evo objasnjenja za pre postavljeno pitnje otkud mi to da brojac ima vrednost FF (citat je iz neke skripte koju sam nasao na netu pre jedno pola godine ako ne i vise):
Netačno. RAM memorija pri uključenju zauzima proizvoljno stanje (zbog prinicpa rada, tj. izrade) tako da je potrebno inicijalizovati konkretnom vrednošću svaku promenljivu koja to zahteva. Video si da u drugom primeru za pauzu nema inicijalizacije za BROJAC1 i BROJAC2. Zašto i šta će da se desi? Prva pauza će, u stvari, da traje nepoznato vreme jer ne znamo koja je početna vrednost tih registara, ali će svaka sledeća da traje tačno koliko smo izračunali jer će na kraju svake pauze obe vrednosti biti 0.
U svakom slučaju, dokazao si da umeš i hoćeš da razmišljaš, samo ti fali još iskustva. Samo radi, to će doći vremenom.
Pozdrav.
Sinisha
P.S. Kasnije u toku popodneva daću ti obećanu rutinu iliti potprogram.
Pozdrav.
Sinisha
[ Marko1991 @ 11.07.2011. 01:09 ] @
Ok, hvala 
[ rsinisa @ 11.07.2011. 17:24 ] @
Evo ti kompletan program, testiraj ga i analiziraj, ako nešto nije jasno pitaj slobodno.
Za sada samo da ti napomenem da C bit STATUS registra koristim kao indikaciju da li je taster upravo pritisnut ili ne. Ja sam tako prvi put uradio kad sam napisao ovu rutinu jer sam bio kratak sa RAM-om pa je tako ostalo, tako koristim i dan-danas, ali može da se upotrebi bilo koji drugi registar opšte namene. Zbog toga što je C setovan kod detektovanja pritiska, morao sam da ga resetujem u rutini za rotiranje. Izmeni to za probu, upotrebi neki drugi registar, npr. možeš da upotrebiš bit 7 registra FTASTERI.
Suština je u tome da je c bit setovan samo ako je taster upravo pritisnut, tako da koliko god dugo ga držiš pritisnutim, detektovaće samo 1 pritisak.
I izračunaj koliko traje ispitivanje tastera u rutini ako je taster pritisnut sve vreme.
Code:
;******Inicijalizacija asemblera********
list p=16f84 ;Definise upotrebljeni kontroler
; #include <p16f84.inc> ;Ubacuje nazive registara u program
include "reg84.asm"
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
cblock 0X0C ; Pocetak slobodnih registara
SPORTB ; shaddow registar
djnzt ; brojac za unutrasnju petlju
djnzt2 ; brojac za spoljasnju petlju
ftasteri ; Flegovi za tastere
endc ; Kraj bloka registara
;********Podesavanje porta************
org 0X00 ; Definise start programa
bsf STATUS, RP0 ; Prebacuje se u banku 1
movlw b'00000011' ; Postavlja RA0 i RA1 kao ulazni
movwf TRISA ; Upis vrednosti u registar porta A
clrf TRISB ; Port b je izlazni
bcf STATUS, RP0 ; Prebacuje se u banku 0
movlw b'00000001'
movwf SPORTB
movwf PORTB
clrf ftasteri
;*********Ukljuci led*******
pocetak
call taster0 ; Proveri taster na RA0
btfsc STATUS, c ; preskoci ako nije upravo sada pritisnut
call rot_levo ; ako jeste,rotiraj ulevo
call taster1 ; Proveri taster na RA1
btfsc STATUS, c ; preskoci ako nije upravo sada pritisnut
call rot_desno ; ako jeste, rotiraj udesno
goto pocetak ; Povratak na pocetak
;******** Ispitaj taster na RA0 ********
taster0
bcf STATUS, c ; resetuj carry bit
movlw .30 ; pocetna vrednost spoljasnje petlje
movwf djnzt2
loopt0s
movlw .250 ; pocetna vrednost unutrasnje petlje
movwf djnzt
loopt0u
btfss porta, 0 ; da li je pritisnut taster na RA0
goto neprit0 ; ako nije, idi na labelu neprit0
decfsz djnzt, F ; ako jeste, umanji brojac unutrasnje petlje
goto loopt0u ; ako nije 0 idi na labelu loopt0u
decfsz djnzt2, F ; umanji brojac spoljasnje petlje
goto loopt0s ; ako nije 0 idi na labelu loopt0s
btfss ftasteri, 0; da li je setovan fleg za tasterr0, tj. da li je
; taster na RA0 pritisnut od prethodne provere?
bsf STATUS, c ; ako nije bio pritisnut, setuj carry bit
bsf ftasteri, 0 ; setuj fleg da je taster na RA0 pritisnut u ovom ispitivanju
return ; vrati se
neprit0
bcf ftasteri, 0 ; resetuj fleg za taster, tj. obelezi da taster na RA0
; nije pritisnut u ovom ispitivanju
return ; vrati se
;******** Ispitaj taster na RA1 ********
taster1
bcf STATUS, c
movlw .30
movwf djnzt2
loopt1s
movlw .250
movwf djnzt
loopt1u
btfss porta, 1
goto neprit1
decfsz djnzt, F
goto loopt1u
decfsz djnzt2, F
goto loopt1s
btfss ftasteri, 1
bsf STATUS, c
bsf ftasteri, 1
return
neprit1
bcf ftasteri, 1
return
;******PP za paljenje i gasenje LED******
rot_levo
bcf STATUS, c
rlf SPORTB, F ; Rotacija u SHADDOW registru
btfsc STATUS, c
rlf SPORTB, F
movf SPORTB, W ; Kopiranje iz SHADDOW u W
movwf PORTB ; Kopiranje iz W u PORTB.
return ; Povratak iz PP
rot_desno
bcf STATUS, c
rrf SPORTB, F ; Rotacija u SHADDOW registru
btfsc STATUS, c
rrf SPORTB, F
movf SPORTB, W ; Kopiranje iz SHADDOW u W
movwf PORTB ; Kopiranje iz W u PORTB.
return ; Povratak iz PP
;********Kraj programa********
end ; Kraj
Pozdrav.
Sinisha
[ rsinisa @ 12.07.2011. 05:05 ] @
Sad se setih...
Izbrisi liniju
include "reg84.asm"
to je moj fajl sa definicijama registara, a skini komentar za liniju
#include <p16f84.inc>
Pozdrav.
Sinisha
[ Marko1991 @ 12.07.2011. 21:06 ] @
Znam, uvideo sam  . Program radi bas kako sam zamislio, prostudirao sam kod i ok je sve, ali nije mi bas 100% jasno zasto se za detekciju koristi carry bit, da li je mogla neka pomocna promenljiva da se upotrebi?(Nisam bas nesto narucito naucio registre pa mi mozda zato nije jasno sta sve moze da se radi sa njima).
[ rsinisa @ 12.07.2011. 21:39 ] @
Napisah gore zašto sam tako radio i da može bilo koji drugi registar. Slobodno promeni, eksperimentiši, probaj ovako, probaj onako ... I pitaj šta ti nije jasno.
Pozdrav.
Sinisha
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|