Saat: 09:49:48 Gösterim: 536
Bu derste de PIC'e ait Timer modülünü kullanarak 1 saniyelik gecikme oluşturacağız. Konumuz 1 saniye aralıklarla yanıp sönen 2 led olsun. Bu ledler de PORTB'nin 0. ve 1. pinlerine bağlanmış olsun.
Bunlar için öncelikle Timer modülüne ait bazı register'ları gözden geçirmek gerekir. Eğer hala indirmemişseniz www.microchip.com adresinden 16F628A nın kullanım klavuzunu(datasheet) indirin.
Timer modülü sayfa 48 de anlatılıyor. Anlaşılmayacak bir yer de göremedim açıkcası. Şimdi programımıza geçelim. Satır satır açıkladım zaten ben ayrıca programın kodları ile Proteus Design dosyasını da projects.harmankaya.org adresine koydum. [DOWNLOAD] Aşağıdaki program da örnek olsun diye 500ms oluşturduk. Eğer etiketi iki kez döndürürseniz 1 saniyeyi elde edersiniz:

;====500milisaniye_ile_yan_son===2.02.2008======
;=======================================
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
;==================================
ORG h'00' ; Burdan yazmaya başla
GOTO START
START:
CLRF PORTB ; PORT B'nin bütün uçlarını temizle
BANKSEL TRISA ; BANK1'e geç
MOVLW h'FF' ; Akü'ye FF koy
MOVWF TRISA ; Akü'nün içini TRISA'ya koy / A'nın bütün bitleri 1 yapıldı.-Giriş
CLRF TRISB ; B'nin bütün bitlerini 0 la- Çıkış yapıldı
BANKSEL PORTA ; BANK0'a geç
; Program başında timer1'in prescale'lasını ayarla ve timer1 osc'yi ON yap
; TMR1 enable yapıp yapmamak sana kalmış, istediğin zamanda enable
; yapabilirsin
MOVLW 38H
MOVWF T1CON ; 1/8 Prescale, T1 osc enable ama TMR1 off
CALL START_500MS ; 500ms saymaya başlar
SIFIRYAK: ; PORTB'nin 0 numaralı pinine bağlı ledi yak
BSF PORTB,0
BCF PORTB,1
BTFSS PIR1,TMR1IF ; 500ms olmuş mu?
GOTO SIFIRYAK ; hayır, yakmaya devam et
BCF PIR1,TMR1IF ; evet, Birinici ledi yakmaya git
BIRYAK: ; PORTB'nin 1. numaralı pinine bağlı ledi yak,bayrağı indir
BSF PORTB,1
BCF PORTB,0
BTFSS PIR1,TMR1IF ; 500ms olmuş mu?
GOTO BIRYAK ; hayır, BİRİ yakmaya devam et
BCF PIR1,TMR1IF ; evet zaman dolmuş, flag'i sil
GOTO SIFIRYAK ; SIRIFI YAKmaya git
START_500MS: ; 525msn'de bir overflow (25MS İPTAL ETTİK)
BANKSEL TMR1H ; ilgili banka geç
CLRF TMR1H ; registerleri clear et
CLRF TMR1L
BCF PIR1,TMR1IF ; overflow flag'i clear et
BSF T1CON,TMR1ON ; Timer1 saymaya başlasın
RETURN
END








