[ 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