|
[ BaCkSpAcE @ 14.07.2005. 02:13 ] @
| Napravio sam jedan mali uredjajcic koji seta 4 led diode od prve do poslednje i tako se isto vraca unazad. Medjutim, sada hocu da tu ubacim i prekidac. Program treba da radi tako sto led diode se konstantno pale i gase u jednom smeru, sve dok se ne pritisne na taster kada one pocnu da se krecu u drugom smeru. Ako je npr. ostala 3. led dioda upaljena, onda od trece krece polako unazad. Evo mog sorsa, koji nazalost ne radi bas kao sto sam zamislio :(
Code:
LIST P=16F84A
;
PORTB EQU 6
TRISB EQU 86H
OPTREG EQU 81H
STATUS EQU 3
CARRY EQU 0
RP0 EQU 5
RBPU EQU 7
LIMIT EQU 3 ;Pozicija najdalje led diode
;
BSF STATUS,RP0 ;Pristupam visokoj memoriji
MOVLW 0DH
MOVWF OPTREG^80H ;Podesi preskaler na (1:32) ka WDT
MOVLW b'11110000' ;RB0-3 izlazni, RB4-7 ulazni
MOVWF TRISB
BCF OPTREG, RBPU ;Ukljuci pullup otpornike na RB ulazima
BCF STATUS, RP0 ;Vrati se na nisku memoriju
CLRF PORTB ;Postavi sve pinove PORTB na nulu
BCF STATUS, CARRY ;Ocisti bit prenosa (ako ga ima)
BSF PORTB, 0
LEFT SLEEP ;Sacekaj WDT timeout
BTFSS PORTB, 4 ;Ako nije pritisnut, idi dalje
GOTO RIGHT
RLF PORTB, F ;Setaj led diode ulevo
BTFSS PORTB, LIMIT ;Ako je dosao do kraja, kreni ponovo
GOTO LEFT
CLRF PORTB
BSF PORTB, 0
GOTO LEFT
RIGHT SLEEP
BTFSS PORTB, 4 ;Ako nije pritisnut, idi dalje
GOTO LEFT
RRF PORTB, F ;Setaj led diode udesno
BTFSS PORTB, 0
GOTO RIGHT
CLRF PORTB
BSF PORTB, 3
GOTO RIGHT ;Pocni ponovo
END
Kada ovo ubacim u moj mikrokontroler, on pali 1, 2, 3 led diodu, dok 4. nece da upali, a pritom i ne gasi one prethodno upaljene led diode. Znaci paljenje ide ovako: 1, 12, 123, pa se ponovo vraca na 1, 12, 123... Posle pritiska na taster, onda pocinje 4, 43, 432, i opet ponovo s tim sto opet nikad ne dodje do 1. led diode, i ne gasi prethodne.
Moje je pitanje u cemu je ovde problem i sta je resenje... Nemojte mi samo davati savete tipa uradi preko TMR0, ili interapta i sl... znaci interesuje me neko resenje na ovaj nacin.
|
[ obranko @ 15.07.2005. 16:01 ] @
pozdrav,
odmah se vidi da nemas osciloskop.
1. led 4 (vezana za portb.3) se pali, ali u sledecoj instrukciji je gasis.
BTFSS PORTB, LIMIT ;*** - dosao si do kraja
GOTO LEFT
CLRF PORTB ;*** - odmah je gasis tako da je led bila upaljena svega nekoliko mikrosekundi (nedovoljno da bi se videlo)
2.
BTFSS PORTB, 4 ;Ako nije pritisnut, idi dalje
GOTO LEFT
RRF PORTB, F ;Setaj led diode udesno - u ovom momentu pin 4 porta B je na visokom nivo, zanci kada uradis shift right visoki nivo sa pina 4 preci ce na pin 3 pa ce led biti updaljena.
isti je problem kada radis pomeraj u levo.
[ BaCkSpAcE @ 15.07.2005. 19:38 ] @
Hvala ti mnogo... Imam osciloskop, ali sam pocetnik u programiranju sa pic-om pa mi treba malo vremena da proucim ovaj asm za pic-ove, pa cu onda krenuti sa necim ozbiljnijim gde je neizbezan osciloskop... Ali stvarno nema sanse da bih se mogao ovako setiti da je problem u tome... Evo ako nekog interesuje moj finalni kod koji lepo odradjuje ovo sto sam i zamislio:
Code:
LIST P=16F84A
;
PORTA EQU 05H
PORTB EQU 06H
TRISA EQU 85H
TRISB EQU 86H
OPTREG EQU 81H
STATUS EQU 03H
CARRY EQU 0
RP0 EQU 5
LIMIT EQU 3 ;Pozicija najdalje led diode
;
BSF STATUS,RP0 ;Pristupam visokoj memoriji
BSF TRISA, 0 ;Setuj RA0 kao ulazni
CLRF TRISB ;Postavi RBx na izlaz
MOVLW 0DH
MOVWF OPTREG^80H ;Podesi preskaler na (1:32) ka WDT
BCF STATUS, RP0 ;Vrati se na nisku memoriju
CLRF PORTB ;Postavi sve pinove PORTB na nulu
BCF STATUS, CARRY ;Ocisti bit prenosa (ako ga ima)
BSF PORTB, 0
LEFT SLEEP ;Sacekaj WDT timeout
BTFSS PORTA, 0 ;Ako nije pritisnut, idi dalje
GOTO RIGHT
RLF PORTB, 1 ;Setaj led diode ulevo
BTFSS PORTB, LIMIT ;Ako je dosao do kraja, kreni ponovo
GOTO LEFT
SLEEP ;Ovo je ono sto me zezalo
CLRF PORTB
BSF PORTB, 0
GOTO LEFT
RIGHT SLEEP
BTFSS PORTA, 0 ;Ako nije pritisnut, idi dalje
GOTO LEFT
RRF PORTB, 1 ;Setaj led diode udesno
BTFSS PORTB, 0
GOTO RIGHT
SLEEP
CLRF PORTB
BSF PORTB, LIMIT
GOTO RIGHT ;Pocni ponovo
END
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|