tmr0 kesmesi

Başlatan ulker_29, 31 Aralık 2011, 23:33:02

ulker_29

arkadaşlar merhaba,
bir pic 16f628a programı yazdım. tmr0 kesmesiyle bir saniye aralıklarla saniyeleri artırıp bunu 7 seg displayda göstericek. fakat tmr0 file registerine müdahale edemiyorum. program aşağıda ben detaylı incelememe rağmen bir hata bulamadım. bir hata bulan varsa yardımcı olursa sevinirim.

;===========DENEY-4.ASM==========26/12/2011=============BY TAHA ÜLKER=============
      LIST   P=16F628A
      INCLUDE   "P16F628A.INC"
;-----PROGRAMI BAŞLAMAYA HAZIRLA--------------------------------------------------
BIRLER   EQU      H'20'         ;birler basamağı h'20' adresinde
S_10MS   EQU      H'21'         ;10 ms sayıcı h'21 adresinde
      ORG      H'000'
      GOTO   PROG_BASLA
      ORG      H'004'
      GOTO   KESME_ALT_PROG
;---------------------------------------------------------------------------------
PROG_BASLA
      CLRF   BIRLER         ;birler bas temizle
      CLRF   PORTB         ;portb'yi temizle
      BSF    STATUS,5               ;bank1'e git
      CLRF   TRISB         ;port'nin tüm uçlarını çıkış yap
      MOVLW   B'00000111'      ;W=b?00000111? 1/256
      MOVWF    OPTION_REG      ;OPTION_REG=W
      BCF    STATUS,5                      ;bank0'a git
      MOVLW    B'10100000'
      MOVWF    INTCON
      MOVLW   H'D9'                        ;tmr0 ı burda kuruyorum ama nedense kurulmuyor!! movwf tmr0 ı da denedim.
      MOVWF   H'01'
;---------------------------------------------------------------------------------
DISP_GOSTER
      MOVF   BIRLER,0
      ANDLW   B'00001111'
      MOVWF   PORTB
      GOTO   DISP_GOSTER
;---------------------------------------------------------------------------------
KESME_ALT_PROG
      BCF      INTCON,2
      MOVWF   H'D9'
      MOVWF   H'01'
      INCF   S_10MS,F      ;10 ms'leri tutan sayıcıyı 1 arttır
      MOVLW   H'64'         ;w=d'100'
      SUBWF   S_10MS,W      ;w=s_10ms-w
      BTFSS   STATUS,Z      ;s_10ms 100 oldu mu
      GOTO   KESME_SONU      ;hayır ana programa git
      CLRF   S_10MS         ;evet, 10 ms'leri tutan sayıcıyı sıfırla
      INCF   BIRLER,F      ;birler basamağını 1 arttır
KESME_SONU
      RETFIE               ;ana programa dön
;---------------------------------------------------------------------------------
      END

-Hasan-

#1
MOVWF   H'D9'
MOVWF   H'01'


Burada TMR0 ' a 0xD9 yüklemek istiyorsunuz galiba; ama bu yanlış. Aşağıdaki gibi olması lazım:

MOVLW   H'D9'
MOVWF   H'01'


Bir de kesme programında W ' yi ve STATUS ' u yedekleseniz iyi olur:

_W EQU 0xXX ; W Registerinin Kopyalanacağı Değişken
_STATUS EQU 0xXX ; STATUS  Registerinin Kopyalanacağı Değişken

...
...
...
KESME_ALT_PROG
MOVWF _W          ; STATUS ve W Değişkenleri Kopyalandı
MOVF STATUS,W
MOVWF _STATUS
...
...
...
MOVF _STATUS,W   ; STATUS ve W Değişkenlerinin Eski Değerleri Yüklendi
MOVWF STATUS
MOVF _W,W
RETFIE

bigbey

Kesmeyi sonlandırmadan önce TMR0 yeniden kurulmalıdır.

KESME_SONU
      MOVLW   H'D9'                        ;tmr0 ı burda yeniden kur
      MOVWF   TMR0
      RETFIE               ;ana programa dön
TA6R

ulker_29

teşekkürler arkadaşlar..