image

Ana içeriğe git
Konu: pic16f628a assemblyde sublw, subwf,btfss ve status saklayıcısı hakkında soru (97 Kez okunmuş)

pic16f628a assemblyde sublw, subwf,btfss ve status saklayıcısı hakkında soru

iyi günler assembly diliyle pic programlama çalışıyorum.Kafama takılan bazı noktalar var aşağıda verdiğim kodlar üzerinden yardımcı olursanız sevinirim.
Aşağıdaki kodlara göre 1 sn aralıklarla 10 defa ledleri yakan ve son yanışta ledler devamlı yanmaya devam edecek.

Kod: [Seç]
LIST P=16F628A
 INCLUDE "P16F628A.INC"
 __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _BODEN_OFF & _LVP_OFF & _CPD_OFF & _CP_OFF
;----------------------------------------------------------
SAYAC EQU h'20' ;SAYAC saklayıcısını tanımla
SAYAC1 EQU h'21' ;SAYAC saklayıcısını tanımla
SAYAC2 EQU h'22' ;SAYAC saklayıcısını tanımla
 BANKSEL TRISB ;BANK1'e geç
 CLRF TRISB ;PORTB uçları çıkış
 BANKSEL PORTB ;BANK0'a geç
 CLRF PORTB ;PortB'deki LED'leri söndür.
BASLA
 CLRF PORTB ;portB'yi sil
 CLRF SAYAC ;SAYAC'ı sil
TEKRAR
 CALL GECIKME
 COMF PORTB,F ;W saklayıcıyı PortB'ye gönder
 CALL GECIKME
 MOVF SAYAC, W ;SAYAC'ı W'ye yükle(sıfırla)
 INCF SAYAC, F ;SAYAC <-- SAYAC+1
 MOVLW h'13' ;W saklayıcıya h'13' (desimal 19) yükle.
 SUBWF SAYAC, W ;W <-- SAYAC-W
 BTFSS STATUS, 2 ;STATUS bit2=1 mi? (Zero flag)
 GOTO TEKRAR ;Hayır, TEKRAR'a git
DONGU
 GOTO DONGU

GECIKME ;Alt program başlangıcı
 MOVLW h'FF'  ;Dış döngü (M sayısı)
 MOVWF SAYAC1
DONGU1
 MOVLW h'FF'  ;İç döngü (Nsayısı)
 MOVWF SAYAC2
DONGU2
 DECFSZ SAYAC2, F
 GOTO DONGU2
 DECFSZ SAYAC1, F
 GOTO DONGU1
 RETURN

Yukardaki kodların işleyişinde basamakları ilerlettiğimde ben 20 defa yanıp sönmesi gerektiğini anlıyorum.Ama programı derleyip çalıştırdığımda program 10 defa yanıp sönüyor. Nedenini açıklarsanız sevinirim. Ayrıca tekrar etiketinin altında çalışan SUBWF SAYAC,W basamağında sonuç W=h'01'- h'13'= -h'12' bu sonuca göre -h'12'<h'01' den olacak ve status bayrağı durumundan dolayı tekrar etiketine dönecek buradan birer azalarak döngü devam etmeyecek mi?