P16F877A ile Timer0 Kesmesi


timer0 8 bitlik sayıcıdır.
timer0 zaman hesaplaması = timercounter*(256 -TMR0(baslangıc degeri))*Prescalerdegeri*(4/fosc)
Tımer0 kesmesinde  kullanılan registarlar OPTION_REG,INTCON registerlarıdır.
Sayacsız maksimum kesmenın gelmesi için gecen zaman = (256-0)*256*(4/4)=65.536 µs 

ben burada timer0 baslangıc degerinı 6,sayacımı 50,frekansım 8Mhz
formulu kullanırsak = 50*(256-6)*64*(4/8)=400000 µs =400 ms =0,4 sn 
programın kodlamasıda su sekildir :

list p = 16F877A
#include <P16F877A.inc>
__CONFIG H'3F31'
timercounter EQU 0X21
org 0X00
goto Start
org 0X04
interrupt
BCF INTCON,TMR0IF ;timer0 kesmesinin tasma oldugunu gösteren bitini sifirla
MOVLW D'6' ;timer0'a (256-250)=6 degerini ver.250 saysin
MOVWF TMR0

DECF timercounter,1 ;(SAYACI 1 AZALTIP TMR0SAYACI NA YAZAR)

BTFSS STATUS,Z ;timer0 sayaci 0'lanmis mi?
RETFIE

MOVLW D'50' ;timer0 sayaci 0'lanmissa 50 degerini yeniden yükle
MOVWF timercounter
GOTO LED          ;led yaniyor mu?sönük mü? kontrol etmek için alt programa git


LED
comf PORTD,1;PortD icerigini 1 ile XOR la
RETFIE
 Start
bsf STATUS,RP0
movlw b'10100000';tüm kesmeleri ve timer0 kesmesini aktif et
movwf INTCON
movlw b'01010101'
movwf OPTION_REG;yukselen kenar kesmesi,1:64 prescaler timerodahili komutcevrimi
movlw b'11111110'
movwf TRISD
bcf STATUS,RP0
movlw d'6'
movwf TMR0;TMRO baslangic degeri
movlw d'50'
movwf timercounter ;tmrocounter baslangic degeri
clrf PORTD
 DON
 goto DON
end

Yorumlar

Bu blogdaki popüler yayınlar

DevExpress TreeList Kullanımı

Devexpress GridControl SimpleButon Ekleme

DevExpress LookupEdit Veri Gösterimi