pic 16f877 buton kontrol yapılamıyor

Başlatan pascaltx, 14 Mayıs 2012, 17:58:18

pascaltx

s.a arkadaşlar...yarın teslim etmem gereken bir proje var...projede butona  basınca mod1 bir daha basınca mod2 bir daha basınca mod3 ve bir daha basınca mod1 dönecek böyle tekrar olcak..16f877 ile yaptım ama sadece buton kontrolu yapamıyorum...yardımınızı bekliyorum arkadaşlar..şimdiden teşekkürler...

;******************************************************************************
   list p=16F877A
   include <p16F877A.inc>
__FUSES (_CP_OFF & _WDT_OFF & _XT_OSC & _PWRTE_ON & _LVP_OFF)
;******************************************************************************
status   equ   03    ;16F877'de port yazmaçlarına ulaşabilmek için
rp0   equ   05   ;kullanılmaktadır.5. bitin  durumuna göre 0. veya 1. RAM
portc equ 07
trisc equ 87h
portb   equ   06   ;sayfası kullanılmaktadır.
trisb   equ   86h
porta   equ   05
trisa   equ   85h
sayı   equ   20h   ;bekle döngüsü için kullandığımız
sayı0   equ   21h   ;kayıtçılar
sayac equ 22h
sola   equ   22h
saga   equ   23h
;**************************** Reset VECTOR ************************************
   org   00   ;Reset vektörü
        movlw   00      ;PCLATH = 0
        movwf   PCLATH
   goto   basla   ;Programın başlangıç pozisyonu
;******************************************************************************
;****************************** Program Alanı ********************************
   org       05h
;************************** Bekle altyordamı *********************************
bekle
    movlw    .100   ;500 msn'lik gecikme
    movwf    sayı   ;altyordamı
bekle1
    movlw    .100
    movwf    sayı0
bekle2
    nop            ;işlem yapma
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    decfsz sayı0,f ;sayacı eksilt, sıfırsa sonraki komutu atla
    goto    bekle2
    decfsz sayı,f  ;sayacı eksilt, sıfırsa sonraki komutu atla
    goto    bekle1
    return

;*************************** Programın başlangıcı *****************************
basla
    bsf    status,rp0      ;1. yazmaç bankasına geç
    movlw  00h
    movwf    trisb         ;B portunu  çıkış yap
     movlw    b'11111111'
    movwf  trisc
     bcf    status,rp0      ;0. yazmaç sayfasına dön.
buton ;===Şu kısmı yapamadım arkadaşlar...kontrolu yapamıyorum...
     ;btfss portc,4
     ;goto buton
     ;call geri
     ;call mod2
geri
    movlw b'00000001'   ;bilgiyi al aküye taşı
    movwf portb      ;aküdeki bilgiyi portb ye taşı
    call bekle      ;bekle döngüsünü çağır.
sol
    rlf portb,f      ;portb kaydedicisindeki bilgiyi bir bit sola kaydır.
    call bekle      ;bekle döngüsünü çağır
     goto sol      ;sol etiketine git.
mod2
     movlw b'10000001'   ;bilgiyi al aküye taşı
    movwf portb      ;aküdeki bilgiyi portb ye taşı
    call bekle      ;bekle döngüsünü çağır.
     movlw b'11000011'   ;bilgiyi al aküye taşı
    movwf portb
     call bekle
     movlw b'11100111'   ;bilgiyi al aküye taşı
    movwf portb
     call bekle
     movlw b'11111111'   ;bilgiyi al aküye taşı
    movwf portb
     call bekle
     movlw b'11100111'   ;bilgiyi al aküye taşı
    movwf portb
     call bekle
     movlw b'11000011'   ;bilgiyi al aküye taşı
    movwf portb
     call bekle
     movlw b'10000001'   ;bilgiyi al aküye taşı
    movwf portb
     call bekle
     movlw b'00000000'   ;bilgiyi al aküye taşı
    movwf portb
     call bekle
mod3
    movlw b'00000001'   ;bilgiyi al aküye taşı
    movwf portb      ;aküdeki bilgiyi portb ye taşı
    call bekle      ;bekle döngüsünü çağır.
     movlw b'00000011'   ;bilgiyi al aküye taşı
    movwf portb
     call bekle
     movlw b'00000111'   ;bilgiyi al aküye taşı
    movwf portb
     call bekle
     movlw b'00001110'   ;bilgiyi al aküye taşı
    movwf portb
     call bekle
     movlw b'00011100'   ;bilgiyi al aküye taşı
    movwf portb
     call bekle
     movlw b'00111000'   ;bilgiyi al aküye taşı
    movwf portb
     call bekle
     movlw b'01110000'   ;bilgiyi al aküye taşı
    movwf portb
     call bekle
     movlw b'11100000'   ;bilgiyi al aküye taşı
    movwf portb
     call bekle
     end

kudretuzuner

Merhaba
Her modda 6 olasılık söz konusu.Eğer siz mod 1 işlenirken butona basıldığı zaman mod değiştirmek isterseniz her olasılık arasında buton kontrolu koymanız gerekecektir.Modlardan birinin bitimi sonunda kontrol isterseniz o zaman da her mod bitiminde buton kontrolu yapmanız gerekecektir.Programınıza göre PORTC leri giriş yapmışsınız şemada da bir PORTC,0 butonunu  şaseye çektiğinizİ düşünerek BTFSC PORTC,0 Komutu ile butonun şaseye çekilip çekilmediğini ve de buna göre dallanmayı yapmanız gerekir.Kolay gelsin.
Amatör

pascaltx

merhaba cevap için teşekkürler...anladım zaten bende bu kontrolu sağlayamıyorum...btfss ya da btfsc ile yapıyorum  ama işte kod kısmı nasıl olacak..ilkçalışanda mod1 da açılıyor sonra butona basınca mod2 ye geçsin istiyorum ama işte olmuyor..sayac da lazım galiba diye düşünüyorum...yarın vermem lazım Arkadaşlar yardım istiyorum...

kudretuzuner

Yazılımda bir eksiklik de CALL ile çağırdığınız(yani gönderdiğiniz )rutinden RETURN ile dönmeniz gerekir.
Amatör

pascaltx

Abi ya haklısın biliyom onu...senden ricam buton programını yazsan...ben baya denedim ondan return yazmayı unutmuşum yani onuda denedim...btfss portc,4
goto buton
goto geri...burası nasıl ocak..sayac subwf incfsz ya da decfsz gereklimi yani nasıl olcak ?
teşekkürler abi cevapların için...

Pyrodigy

#5
Alıntı yapılan: kudretuzuner - 14 Mayıs 2012, 22:38:37
Yazılımda bir eksiklik de CALL ile çağırdığınız(yani gönderdiğiniz )rutinden RETURN ile dönmeniz gerekir.
buton ;===Şu kısmı yapamadım arkadaşlar...kontrolu yapamıyorum...
     ;btfss portc,4
     ;goto buton
     ;call geri
     ;call mod2

Buradaki kontrolde
call geri
call mod2
altprogramlarından geri dönemiyor. Tavsiyem burada ki karar mekanizmasını önceden tanımladığın flag bitleri kullanarak tekrar gözden geçirmen olacaktır.
Mesela;
Flag
isminde bir değişken tanıma;
geri_git         equ  0
mod2ye_git  equ 1

...
şeklinde oabilir.Daha sonra karar mekanizmasında
btfsc   Flag,geri_git
goto geri git
btfsc   Flag,mod2ye_git
goto mod2

olabilir.
Persistance is the name of the game in this business....

pascaltx

denedim ama  şöyle bir kullanım   (btfsc   Flag,geri_git)   yokmuş yani hata veriyor...

Pyrodigy

#7
Alıntı yapılan: pascaltx - 14 Mayıs 2012, 23:07:41
denedim ama  şöyle bir kullanım   (btfsc   Flag,geri_git)   yokmuş yani hata veriyor...
Olmadığını biliyorum.Çünkü ben uydurdum o değişkenleri ;). Sen düzenlerken böyle birşey yap diye örnek vermek istedim sadece.
Sana tavsiyem; Orhan altınbaşağın PIC programlama isminde bir kitabı var.Onu al en az 3 defa oku sonra tekrar programı elden geçir hatalarını rahatlıkla görebilirsin.
Persistance is the name of the game in this business....