pıc16f877 ile butonlu 0-99 sayıcı assembly buton programı sorunu

Başlatan emredogan90, 04 Mayıs 2015, 21:25:58

emredogan90

merhaba arkadaşlar pic16f877 de başlat durdur butonlu 0-99 sayıcı yapmak istiyorum. Öncelikle buton eklemeden sayıcı programını yazdım ve 0-99 arası sayıp başa dönüyor. Buraya kadar sorun yok. Buton eklemek istedim fakat bir türlü başaramadım. Kesmelerle falan yapılıyormuş araştırdım fakat kesmeleri de pek anlayamadım. Buton ekleme olayını nasıl yapabilirim. Butona bastığžımda sayma başlayacak atıyorum 11 de durdur butonuna bastığžımızda sayma duracak. Başlat butonuna tekrar bastığžımızda ise 11 den itibaren saymaya devam edecek. gerekli buton kodlarını ekleyip düzeltirseniz çok memnun olurum ilginiz için çok teşekkür ederim.
LIST P=16F877A 
INCLUDE "P16F877A.INC" 

SAYAC1 EQU H'20' 
SAYAC2 EQU H'21' 

ORG 0x00 
Goto ANA 
ANA 
BSF STATUS,5 
MOVLW b'11111111' 
MOVWF TRISB 
CLRF TRISD 
CLRF TRISC 
BCF STATUS,5 
CLRF PORTD 
CLRF PORTC 

MOVLW H'FC' ;7SEGMENT = 0 
MOVWF PORTC 

CALL SAYMA 
MOVLW H'60' ;7SEGMENT = 1 
MOVWF PORTC 

CALL SAYMA 
MOVLW H'DA' ;7SEGMENT = 2 
MOVWF PORTC 

CALL SAYMA 
MOVLW H'F2' ;7SEGMENT = 3 
MOVWF PORTC 

CALL SAYMA 
MOVLW H'66' ;7SEGMENT = 4 
MOVWF PORTC 

CALL SAYMA 
MOVLW H'B6' ;7SEGMENT = 5 
MOVWF PORTC 

CALL SAYMA 
MOVLW H'BE' ;7SEGMENT = 6 
MOVWF PORTC 

CALL SAYMA 
MOVLW H'E0' ;7SEGMENT = 7 
MOVWF PORTC 

CALL SAYMA 
MOVLW H'FE' ;7SEGMENT = 8 
MOVWF PORTC 

CALL SAYMA 
MOVLW H'F6' ;7SEGMENT = 9 
MOVWF PORTC 
CALL SAYMA 
CLRF PORTD 
CLRF PORTC 
GOTO ANA 

SAYMA ;PORTD'YI SAYAN ALT PROGRAM 
MOVLW H'FC' ;7SEGMENT = 0 
MOVWF PORTD 
CALL GECIKME 

MOVLW H'60' ;7SEGMENT = 1 
MOVWF PORTD 
CALL GECIKME 

MOVLW H'DA' ;7SEGMENT = 2 
MOVWF PORTD 
CALL GECIKME 

MOVLW H'F2' ;7SEGMENT = 3 
MOVWF PORTD 
CALL GECIKME 

MOVLW H'66' ;7SEGMENT = 4 
MOVWF PORTD 
CALL GECIKME 

MOVLW H'B6' ;7SEGMENT = 5 
MOVWF PORTD 
CALL GECIKME 

MOVLW H'BE' ;7SEGMENT = 6 
MOVWF PORTD 
CALL GECIKME 

MOVLW H'E0' ;7SEGMENT = 7 
MOVWF PORTD 
CALL GECIKME 

MOVLW H'FE' ;7SEGMENT = 8 
MOVWF PORTD 
CALL GECIKME 

MOVLW H'F6' ;7SEGMENT = 9 
MOVWF PORTD 
CALL GECIKME 
RETURN 

GECIKME 
MOVLW H'FF' 
MOVWF SAYAC1 
DONGU1 
MOVLW H'FF' 
MOVWF SAYAC2 
DONGU2 
DECFSZ SAYAC2,F 
GOTO DONGU2 
DECFSZ SAYAC1,F 
GOTO DONGU1 
RETURN 

END



RaMu

Öncelikle böyle program yazılmaz
ben buna amele stili diyorum.

Yapabileceğin ya kesme ile buton kontrolü evet veya
daha basit seviyede
bekleme döngüsü içerisinde buton kontrolü yapmak.

Programını şöylede yazabilirdin
buda 00-99 sayar:

;RaMu ucanel@outlook.com
;2015 MAYIS
;16f877a ile 7447 kullanmadan 00-ff veya 00-99 vs. 
;saydırma portb low segment, portc high segment çıkışları
;ortak 

ERRORLEVEL -203,-205,-302
INCLUDE "P16F877A.INC"
LIST P=16F877A
__CONFIG _CP_OFF&_WDT_OFF&_XT_OSC &_PWRTE_ON&_BODEN_OFF&_DEBUG_OFF &_LVP_OFF
SAYACL EQU 21H
SAYACH EQU 22H
SAYAC1  EQU  23H
SAYAC2  EQU  24H

ORG 0000H
CLRF  PORTB
CLRF  PORTC
BCF  STATUS,5
CLRF  TRISB     ;PORTB  ÇIKIŞ
CLRF  TRISC
BSF  STATUS,5

MOVLW   40H     ;BAŞLANGIÇTA PORTC DE 0 GÖRÜLSÜN
MOVWF   PORTC
MOVLW   01H
MOVWF   SAYACH
GOTO    BASLAL

BASLAH  CLRF  SAYACH
BASLAL  CLRF  SAYACL
		incf  SAYACL,f ;trick ;) 

TEKRARL MOVF  SAYACL,W
        CALL  TABLO
        MOVWF PORTB
        CALL  BEKLE
        INCF  SAYACL,F
        MOVLW 0AH       ;F sayması için 10H ile subwf
        SUBWF SAYACL,W
        BTFSS STATUS,Z
        GOTO  TEKRARL

TEKRARH MOVLW   40H     ;PORTB sıfır gözükmeli
		MOVWF   PORTB
		MOVF  SAYACH,W
        CALL  TABLO
        MOVWF PORTC
        CALL  BEKLE
        INCF  SAYACH,F
        MOVLW 0AH       ;F sayması için 10H ile subwf
        SUBWF SAYACH,W
        BTFSS STATUS,Z
        GOTO  BASLAL
        GOTO  BASLAH

TABLO   ADDWF  PCL,F
        RETLW  40H      ;0
        RETLW  79H      ;1
        RETLW  24H      ;2
        RETLW  30H      ;3
        RETLW  99H      ;4
        RETLW  12H      ;5
        RETLW  02H      ;6
        RETLW  0F8H     ;7
        RETLW  00H      ;8
        RETLW  10H      ;9
        RETLW  08H      ;A
        RETLW  03H      ;B
        RETLW  46H      ;C
        RETLW  21H      ;D
        RETLW  06H      ;E
        RETLW  0EH      ;F

BEKLE  MOVLW   0FFH
       MOVWF   SAYAC1
DONGU2 MOVLW   0FFH
       MOVWF   SAYAC2
DONGU1 NOP
       DECFSZ  SAYAC2,F
       GOTO    DONGU1
       DECFSZ  SAYAC1,F
       GOTO    DONGU2
RETURN
END



Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

emredogan90

İlgin için teşekkür ederim RaMu arkadaşım. pic assemblyde daha yeni ve acemi olduğum için fazla kompleks bir program yazamadım o yüzden dediğin gibi amele işi oldu program. yazdığın program da çok güzel olmuş teşekkür ederim :) kesmelerle şuan için uğraşmak istemiyorum  fakat daha basit seviyede bekleme döngüsü derken tam olarak anlayamadım nasıl bir yol izlemem gerekir yani yardım edebilirsen çok mutlu olurum.

RaMu

Bekleme derken senin programında gecikme diye yazdığım kısmı kastediyorum,
bu kısımda bekleme esnasında buton kontrolü yapılacak.

Sen birşeyler dene, olmazsa buraya yaz kodları,
yardımcı olmaya çalışırım.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

emredogan90

merhaba ben gecıkme kısmında buton kontrolu yapmaya çalıştım fakat şöyle bir problemle karşılaşıyorum başlat butonuna basıyorum saymaya başlıyor durdur butonuna bastığımda sayma duruyor. buraya kadar sıkıntı yok fakat başlat butonuna bastığımda saymaya devam etmiyor hiçbir tekpi vermeden o sayıda duruyor nerede hata yapıyorum sizce
LIST P=16F877A 
INCLUDE "P16F877A.INC" 

SAYAC1 EQU H'20' 
SAYAC2 EQU H'21' 
ONES EQU H'22' 
TENS EQU H'23' 

ORG 0x00 
nop 
Goto ANA 



ANA 
BSF STATUS,RP0 
MOVLW b'11111111' 
MOVWF TRISB 
CLRF TRISD 
CLRF TRISC 
BCF STATUS,RP0 
CLRF PORTD 
CLRF PORTC 

start 
MOVLW H'FC' ;7SEGMENT = 0 
MOVWF PORTC 
MOVWF TENS 

CALL SAYMA 
MOVLW H'60' ;7SEGMENT = 1 
MOVWF PORTC 
MOVWF TENS 

CALL SAYMA 
MOVLW H'DA' ;7SEGMENT = 2 
MOVWF PORTC 
MOVWF TENS 

CALL SAYMA 
MOVLW H'F2' ;7SEGMENT = 3 
MOVWF PORTC 
MOVWF TENS 

CALL SAYMA 
MOVLW H'66' ;7SEGMENT = 4 
MOVWF PORTC 
MOVWF TENS 

CALL SAYMA 
MOVLW H'B6' ;7SEGMENT = 5 
MOVWF PORTC 
MOVWF TENS 

CALL SAYMA 
MOVLW H'BE' ;7SEGMENT = 6 
MOVWF PORTC 

CALL SAYMA 
MOVLW H'E0' ;7SEGMENT = 7 
MOVWF PORTC 
MOVWF TENS 

CALL SAYMA 
MOVLW H'FE' ;7SEGMENT = 8 
MOVWF PORTC 
MOVWF TENS 

CALL SAYMA 
MOVLW H'F6' ;7SEGMENT = 9 
MOVWF PORTC 
MOVWF TENS 
CALL SAYMA 
CLRF PORTD 
CLRF PORTC 
GOTO ANA 

SAYMA ;PORTD'YI SAYAN ALT PROGRAM 
MOVLW H'FC' ;7SEGMENT = 0 
MOVWF PORTD 
MOVWF ONES 
CALL GECIKME 

MOVLW H'60' ;7SEGMENT = 1 
MOVWF PORTD 
MOVWF ONES 
CALL GECIKME 

MOVLW H'DA' ;7SEGMENT = 2 
MOVWF PORTD 
CALL GECIKME 

MOVLW H'F2' ;7SEGMENT = 3 
MOVWF PORTD 
MOVWF ONES 
CALL GECIKME 

MOVLW H'66' ;7SEGMENT = 4 
MOVWF PORTD 
MOVWF ONES 
CALL GECIKME 

MOVLW H'B6' ;7SEGMENT = 5 
MOVWF PORTD 
MOVWF ONES 
CALL GECIKME 

MOVLW H'BE' ;7SEGMENT = 6 
MOVWF PORTD 
MOVWF ONES 
CALL GECIKME 

MOVLW H'E0' ;7SEGMENT = 7 
MOVWF PORTD 
MOVWF ONES 
CALL GECIKME 

MOVLW H'FE' ;7SEGMENT = 8 
MOVWF PORTD 
MOVWF ONES 
CALL GECIKME 

MOVLW H'F6' ;7SEGMENT = 9 
MOVWF PORTD 
MOVWF ONES 
CALL GECIKME 
RETURN 

GECIKME

CLRF PORTB

BTFSS PORTB,0 ; BASLAT BUTON KONTROLU
GOTO GECIKME

BTFSC PORTB,1 ; DURDUR BUTON KONTROLU
GOTO GECIKME

MOVLW H'FF' 
MOVWF SAYAC1 
DONGU1 
MOVLW H'FF' 
MOVWF SAYAC2 
DONGU2 
DECFSZ SAYAC2,F 
GOTO DONGU2 
DECFSZ SAYAC1,F 
GOTO DONGU1 
RETURN

END




emredogan90

hallettim kardeşim mantık hatam varmış şuan isis de simüle ettim sıkıntısız çalışıyor kodlar ve isis şu şekilde: bir sorum daha var ben bu butonların gücünü pic in 1. bacağı enerji bacağına bağlayabilirmiyim sıkıntı çıkarmı yoksa ayrı bir 5v luk adaptör bağlamammı gerekir.
ERRORLEVEL -203,-205,-302
INCLUDE "P16F877A.INC"
LIST P=16F877A
__CONFIG _CP_OFF&_WDT_OFF&_XT_OSC &_PWRTE_ON&_BODEN_OFF&_DEBUG_OFF &_LVP_OFF

SAYAC1 EQU H'20' 
SAYAC2 EQU H'21' 
SAYAC3 EQU H'24' 
ONES EQU H'22' 
TENS EQU H'23' 

ORG 0x00 
Goto ANA 



ANA 
BSF STATUS,RP0 
MOVLW b'11111111' 
MOVWF TRISB 
CLRF TRISD 
CLRF TRISC 
BCF STATUS,RP0 
CLRF PORTD 
CLRF PORTC 
CLRF SAYAC3

start 
MOVLW H'FC' ;7SEGMENT = 0 
MOVWF PORTC 
MOVWF TENS 

CALL SAYMA 
MOVLW H'60' ;7SEGMENT = 1 
MOVWF PORTC 
MOVWF TENS 

CALL SAYMA 
MOVLW H'DA' ;7SEGMENT = 2 
MOVWF PORTC 
MOVWF TENS 

CALL SAYMA 
MOVLW H'F2' ;7SEGMENT = 3 
MOVWF PORTC 
MOVWF TENS 

CALL SAYMA 
MOVLW H'66' ;7SEGMENT = 4 
MOVWF PORTC 
MOVWF TENS 

CALL SAYMA 
MOVLW H'B6' ;7SEGMENT = 5 
MOVWF PORTC 
MOVWF TENS 

CALL SAYMA 
MOVLW H'BE' ;7SEGMENT = 6 
MOVWF PORTC 

CALL SAYMA 
MOVLW H'E0' ;7SEGMENT = 7 
MOVWF PORTC 
MOVWF TENS 

CALL SAYMA 
MOVLW H'FE' ;7SEGMENT = 8 
MOVWF PORTC 
MOVWF TENS 

CALL SAYMA 
MOVLW H'F6' ;7SEGMENT = 9 
MOVWF PORTC 
MOVWF TENS 
CALL SAYMA 
CLRF PORTD 
CLRF PORTC 
GOTO ANA 

SAYMA ;PORTD'YI SAYAN ALT PROGRAM 
MOVLW H'FC' ;7SEGMENT = 0 
MOVWF PORTD 
MOVWF ONES 
CALL GECIKME 

MOVLW H'60' ;7SEGMENT = 1 
MOVWF PORTD 
MOVWF ONES 
CALL GECIKME 

MOVLW H'DA' ;7SEGMENT = 2 
MOVWF PORTD 
CALL GECIKME 

MOVLW H'F2' ;7SEGMENT = 3 
MOVWF PORTD 
MOVWF ONES 
CALL GECIKME 

MOVLW H'66' ;7SEGMENT = 4 
MOVWF PORTD 
MOVWF ONES 
CALL GECIKME 

MOVLW H'B6' ;7SEGMENT = 5 
MOVWF PORTD 
MOVWF ONES 
CALL GECIKME 

MOVLW H'BE' ;7SEGMENT = 6 
MOVWF PORTD 
MOVWF ONES 
CALL GECIKME 

MOVLW H'E0' ;7SEGMENT = 7 
MOVWF PORTD 
MOVWF ONES 
CALL GECIKME 

MOVLW H'FE' ;7SEGMENT = 8 
MOVWF PORTD 
MOVWF ONES 
CALL GECIKME 

MOVLW H'F6' ;7SEGMENT = 9 
MOVWF PORTD 
MOVWF ONES 
CALL GECIKME 
RETURN 

GECIKME
CLRF PORTB

BTFSS PORTB,0 ; BASLAT BUTON KONTROLU
GOTO GECIKME1
GECIKME3
BTFSS PORTB,1 ; DURDUR BUTON KONTROLU
GOTO GECIKME2
BTFSS SAYAC3,0
GOTO GECIKME
MOVLW H'FF' 
MOVWF SAYAC1 
DONGU1 
MOVLW H'FF' 
MOVWF SAYAC2 
DONGU2 
DECFSZ SAYAC2,F 
GOTO DONGU2 
DECFSZ SAYAC1,F 
GOTO DONGU1 
RETURN

GECIKME1
MOVLW b'00000001'
MOVWF SAYAC3
GOTO GECIKME3

GECIKME2
DECFSZ SAYAC3,F
GOTO GECIKME2
GOTO GECIKME

END




RaMu

Alıntı yapılan: emredogan90 - 08 Mayıs 2015, 00:26:32...
bu butonların gücünü pic in 1. bacağı enerji bacağına bağlayabilirmiyim sıkıntı çıkarmı yoksa ayrı bir 5v luk adaptör bağlamammı gerekir.

Buton bağlantılarını son mesajında verdiğin şemadaki gibi yapabilirsin,
ayrı bir kaynağa bağlamak gibi bir durum söz konusu değil.

Tek dikkat etmen gereken,
buton bağlı olan pinleri
eğer çıkış yapıp, high 1 durumunan getirirsen ve
butona basarsan (ki pek olacak bir durum değil ama)
çıkış ve high durumunda olan bu pin, butona basıldığında direk toprağa bağlandığından
pice zarar verebilir.
Ama giriş olarak kurulan bir pin,
yüksek empedans (yani çok yüksek direnç gösterir)
durumunda olduğundan
pin giriş olarak kurulduğu müddetçe hiçbir problem olmaz.

Yani son mesajındaki bağlantı
genel olarak kullanılan doğru bir buton bağlantısıdır.
Birde button debounce - buton arkı denen bir konu var.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Mualla_I

Peki bunu 3 basamaklı yapmak istesek nasıl yaparız ben şöyle birşey denedim ama olmadı nerde hata yapıyorum?



SAYACL EQU 21H
SAYACH EQU 22H
SAYACM EQU 23H
SAYAC1  EQU  23H
SAYAC2  EQU  24H
SAYAC3 EQU 25H

ORG 0000H
CLRF  PORTB
CLRF  PORTC
CLRF PORTD
BCF  STATUS,5
CLRF  TRISB     ;PORTB  ÇIKIŞ
CLRF  TRISC
CLRF TRISD
BSF  STATUS,5

MOVLW   40H     ;BAŞLANGIÇTA PORTC DE 0 GÖRÜLSÜN
MOVWF   PORTC
MOVLW   01H
MOVWF   SAYACH
MOVLW   40H     ;BAŞLANGIÇTA PORTD DE 0 GÖRÜLSÜN
MOVWF   PORTD
MOVLW   01H
MOVWF   SAYACM
GOTO    BASLAL

BASLAM CLRF SAYACM
BASLAH  CLRF  SAYACH
BASLAL  CLRF  SAYACL
		incf  SAYACL,f ;trick  


TEKRARL MOVF  SAYACL,W
        CALL  TABLO
        MOVWF PORTB
        CALL  BEKLE
        INCF  SAYACL,F
        MOVLW 0AH       ;F sayması için 10H ile subwf
        SUBWF SAYACL,W
        BTFSS STATUS,Z
        GOTO  TEKRARL

TEKRARH MOVLW   40H     ;PORTB sıfır gözükmeli
		MOVWF   PORTB
		MOVF  SAYACH,W
        CALL  TABLO
        MOVWF PORTC
        CALL  BEKLE
        INCF  SAYACH,F
        MOVLW 0AH       ;F sayması için 10H ile subwf
        SUBWF SAYACH,W
        BTFSS STATUS,Z
        GOTO  BASLAL
        GOTO  BASLAH

TEKRARM MOVLW 40H  ; PORTC sıfır gözükmeli
        MOVWF PORTC
        MOVLW 40H 
        MOVWF PORTB
        MOVF  SAYACM,W
        CALL  TABLO
        MOVWF PORTD
        CALL  BEKLE
        INCF  SAYACM,F
        MOVLW 0AH       ;F sayması için 10H ile subwf
        SUBWF SAYACM,W
        BTFSS STATUS,Z
        GOTO  BASLAL
        GOTO  BASLAM
        ;MOVLW   40H     ;PORTB sıfır gözükmeli
		;MOVWF   PORTB
		;MOVF  SAYACH,W
        ;CALL  TABLO
        ;MOVWF PORTC
        ;CALL  BEKLE
        ;INCF  SAYACH,F
        ;MOVLW 0AH       ;F sayması için 10H ile subwf
        ;SUBWF SAYACH,W
        ;BTFSS STATUS,Z
        ;GOTO  BASLAL
       ; GOTO  BASLAH


TABLO   ADDWF  PCL,F
        RETLW  40H      ;0
        RETLW  79H      ;1
        RETLW  24H      ;2
        RETLW  30H      ;3
        RETLW  99H      ;4
        RETLW  12H      ;5
        RETLW  02H      ;6
        RETLW  0F8H     ;7
        RETLW  00H      ;8
        RETLW  10H      ;9
        RETLW  08H      ;A
        RETLW  03H      ;B
        RETLW  46H      ;C
        RETLW  21H      ;D
        RETLW  06H      ;E
        RETLW  0EH      ;F

BEKLE  MOVLW   0FFH
       MOVWF   SAYAC1
DONGU2 MOVLW   0FFH
       MOVWF   SAYAC2
DONGU3  MOVLW   0FFH
       MOVWF   SAYAC3

DONGU1 NOP
       DECFSZ SAYAC3 ,F
        GOTO DONGU1
       DECFSZ  SAYAC2,F
       NOP
       DECFSZ  SAYAC1,F
       GOTO    DONGU2

;BEKLE  MOVLW   0FFH
 ;      MOVWF   SAYAC1
;DONGU2 MOVLW   0FFH
 ;      MOVWF   SAYAC2
;DONGU1 NOP
       ;DECFSZ  SAYAC2,F
      ; GOTO    DONGU1
       ;DECFSZ  SAYAC1,F
     ;  GOTO    DONGU2



RETURN
END