P16 RA0 a 15 defa bastiktan sonra portb nin ilk 4 ledini yakan program yardim

Başlatan mabool, 23 Aralık 2010, 23:36:36

mabool

sorudaki programi yapmak icin bir cok varyasyon denedim fakat tek bir ledi dahi yakamadim :) en son asadaki yazdigim gibi program hata nerede yardimci olursaniz sevinirim.

LIST         P=16F628A
INCLUDE         "P16F628A.INC"
__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _BODEN_OFF & _LVP_OFF & _DATA_CP_OFF & _CP_OFF
   SAYAC1      EQU      H'20'
   SAYAC2      EQU      H'21'
   SAYAC3      EQU      H'22'
   ORG               H'00'
   CLRF            PORTB
   BANKSEL            TRISB
   CLRF            TRISB
   MOVLW            H'FF'
   MOVWF            TRISA
   BANKSEL            PORTB
   MOVLW            H'07'
   MOVWF            CMCON
GECIKME
   MOVLW            H'A'
   MOVWF            SAYAC1
BASLA
   BTFSC            PORTA,2
   GOTO            BASLA
   NOP
   NOP
   NOP
TEKRAR   
   DECFSZ            SAYAC1,F
   GOTO            TEKRAR
ARTIR         
   INCF            SAYAC2,F
   MOVLW            H'F'
   SUBWF            SAYAC2,W
   BTFSC            STATUS,2
   GOTO            BASLA
YAK
   MOVLW            B'00001111'
   MOVWF            PORTB
   END   

FEHMİ_ASM

LIST         P=16F628A
INCLUDE         "P16F628A.INC"
__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _BODEN_OFF & _LVP_OFF & _DATA_CP_OFF & _CP_OFF
   SAYAC1      EQU      H'20'
   SAYAC2      EQU      H'21'
   SAYAC3      EQU      H'22'
   ORG               H'00'
   GOTO START
   ORG H'04'

START
    CLRF            PORTB
   BANKSEL            TRISB
   CLRF            TRISB
   MOVLW            H'FF'
   MOVWF            TRISA
   BANKSEL            PORTB
   MOVLW            H'07'
   MOVWF            CMCON
GECIKME
   MOVLW            H'0F'
   MOVWF            SAYAC1
BASLA
   BTFSC            PORTA,2
   GOTO            BASLA
   NOP
   NOP
   NOP
TEKRAR   
   DECFSZ            SAYAC1,F
   GOTO            TEKRAR
ARTIR         
   INCF            SAYAC2,F
   MOVLW            H'F'
   SUBWF            SAYAC2,W
   BTFSC            STATUS,2
   GOTO            BASLA
YAK
   MOVLW            B'00001111'
   MOVWF            PORTB
   GOTO YAK     ;Programı END komutuna sürüklememelisin

    END   

mabool

yardimin icin tesekur ederim arkdasim kodlara bakinca uygun gozukuyor fakat bu programda ise yaramadi ledler yanmiyor malesef :(

PARSIC

İSTEDİĞİN DURUMU TIMER KESMESİ VEYA RB0 KESMESİ İLE ÇOK RAHAT YAPABİLİRSİN BENCE
********************************************************************HI-TECH*******************************************************************

mabool

programin en son hali fakat ra0 butonu 15 kez basilmayi beklemyior tek tikta yakiyor ledleri sorun hangi kod lerda?

LIST         P=16F628A
INCLUDE         "P16F628A.INC"
__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _BODEN_OFF & _LVP_OFF & _DATA_CP_OFF & _CP_OFF
   SAYAC1      EQU      H'20'
   SAYAC2      EQU      H'21'
   SAYAC3      EQU      H'22'
   ORG               H'00'
   CLRF            PORTB
   BANKSEL            TRISB
   CLRF            TRISB
   MOVLW            H'FF'
   MOVWF            TRISA
   BANKSEL            PORTB
   MOVLW            H'07'
   MOVWF            CMCON
BASLA
   BTFSC            PORTA,0
   GOTO            BASLA
GECIKME
   MOVLW            H'FF'
   MOVWF            SAYAC1
DONGU1
   MOVLW            H'FF'
   MOVWF            SAYAC2
TEKRAR
   DECFSZ            SAYAC2,F
   GOTO            TEKRAR
   DECFSZ            SAYAC1,F
   GOTO            DONGU1
ARTIR         
   INCF            SAYAC3,F
   MOVLW            H'0F'
   SUBWF            SAYAC3,W
   BTFSC            STATUS,2
   GOTO            BASLA
YAK
   MOVLW            B'00001111'
   MOVWF            PORTB
   GOTO            YAK
   END   


PARSIC

timer0 kesmesini biliyorsan bunu çok kolay yapacaksın..timer0  RA4/T0CKI pininden tetikleyerek bunu yapabilirsin mesela timer0 bölme oranını 16 yap timer0 ı 255 den başlat böylece ra4 e 16 kez tetikleme sinyali geldiğinde timer0 bayrağı 1 olacak bu duruma göre programda istediğin dallanmaları,durumları....vs yapabilirsin kolay gelsin...
********************************************************************HI-TECH*******************************************************************

Tagli

SAYAC1'e h'A' yüklemenin istediğin gecikmeyi sağlayacağını düşünmüyorum, ki gecikme "button debounce" olarak bilinen sorun için gerekli. Ayrıca bu atamayı sadece bir kez yapıp diğer dönüşlerde yapmıyorsun, sonrakilerde sayaç 256'dan başlıyor. Ancak bunun yerine kodun altına bir yere daha önce bahsetmiş olduğum hesap makinesi ile biraz daha uzun bir gecikme koyup bunu da ana döngünde call ile çağırırsan kodun okunabilirliğini de arttırmış olursun.

SAYAC2'nin programın başında sıfırlanması lazım. Bunu göremedim.

Arka arkaya yazılan 3 adet NOP'un ne işe yaradığını çözemedim.



Ayrıca son karşılaştırma "BTFSS  STATUS,2" şeklinde olmalı. Şu durumda düğmeye ilk basışında LED'lerin yandığını görmelisin. Neden hiç yanmadıklarını çözemedim, herhalde gözümden kaçan birşeyler var.



Ayrıca, FEHMİ_ASM'nin dediği gibi, program bir döngüde kalmalı. En sona "goto $" diyerek bunu yapabilirsin. Aksi takdirde program arka arkaya "FF" komutunu işleyip (ne olduğunu hatırlamıyorum ama bir toplama işlemiydi galiba) program hafızası bitiminde başa dönebilir (gerçi bu konuda da çok emin değilim).

Ekleme: Ben bu mesajı yazarken sen de yeni mesaj yazmışsın, onu henüz incelemedim ama yukarıdaki tahminim tutmuş gibi. Şimdi tekrar gözden geçireceğim.
Gökçe Tağlıoğlu

mabool

PROGRAMIN SON HALSORUN HALLEDILDI (TAGLI ARKADASIN YARDIMLARIYLA)
TAGLI:
PIC'e ilk elektrik verildiğinde register'ların değerleri belirsizdir (istisnaları var), yani içlerinde herhangi bir değer olabilir. Mesela SAYAC3'ü sıfırlamadın ve şansına ilk değeri 100 oldu. O zaman düğmeye her basışında artacak, 156 basıştan sonra 0'lanacak ve üstüne bir 15 defa daha basman gerekecek ki LED'ler yansın.

SAYAC1 ve 2'ye sen zaten FF değeri veriyorsun, bu yüzden tekrar sıfırlamana gerek yok. Ama bu değerleri vermesen de program çalışırdı. Çünkü içindeki başlangıç değeri zaten decfsz döngüsünün ilk işleyişinden sonra olacak, sonraki döngülerde 0'dan (bir başka deyişle 256'dan) başlayacaktı. Yani sadece zamanlamada ufak bir belirsizlik olurdu.

LIST         P=16F628A
INCLUDE         "P16F628A.INC"
__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _BODEN_OFF & _LVP_OFF & _DATA_CP_OFF & _CP_OFF
   SAYAC1      EQU      H'20'
   SAYAC2      EQU      H'21'
   SAYAC3      EQU      H'22'
   ORG               H'00'
   CLRF            PORTB
   CLRF            SAYAC3
   BANKSEL            TRISB
   CLRF            TRISB
   MOVLW            H'FF'
   MOVWF            TRISA
   BANKSEL            PORTB
   MOVLW            H'07'
   MOVWF            CMCON
BASLA
   BTFSC            PORTA,0
   GOTO            BASLA
GECIKME
   MOVLW            H'FF'
   MOVWF            SAYAC1
DONGU1
   MOVLW            H'FF'
   MOVWF            SAYAC2
TEKRAR
   DECFSZ            SAYAC2,F
   GOTO            TEKRAR
   DECFSZ            SAYAC1,F
   GOTO            DONGU1
ARTIR         
   INCF            SAYAC3,F
   MOVLW            H'0F'
   SUBWF            SAYAC3,W
   BTFSS            STATUS,2
   GOTO            BASLA
YAK
   MOVLW            B'00001111'
   MOVWF            PORTB
   GOTO            YAK
   END