[ 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