TMR0 çalışması

Başlatan blacklogic, 21 Şubat 2013, 22:45:40

blacklogic

Merhaba arkadaşlar pic ile yeni yeni haşır neşir oluyorum ve tmr0'ın çalışma mantığını oturtamadım.
static void interrupt isim(void) // Kesme fonksiyon
{
char i; 
if(TMR0IF) 
{
GIE=0;
i++;
if(i>0 & i<10)
{
RD0=1;
}
if(10<i && i<20)
{
RD0=0;
}
else if(i>20)
i=0;


TMR0IF=0;
GIE=1; 
}
}


burada tmr0 255 e kadar yasıyor sayma işlemi bittiğinde TMR0IF=0; set işlemini yapıyor. her palsde i bir artıyor. peki i 20yi geçtiğinde neden başa dönmüyor. Programı çalıştırdığımda 255e kadar sayma işlemi bitip o şekilde çıkıyor program. Yani tmr0 16 saniyede işlemini yapıyor 2 saniye led (RD0 daki led) yanıyor ve 14 saniye bekliyor bu neden ? kodun tamamı şu şekilde.

#include "pic.h"



void main(void) // 
{

TRISC=0b11111000;
TRISD=0x00;
PORTD=0x00;
PORTB=0x00;
PORTC=0x00;

GIE=1 ; // Genel kesme izin biti



T0CS=0 ; //Timer0 sinyal seçim biti (0: Dahili, 1: Harici)
T0SE=1 ; //Timer0 kenar seçim biti (0: Düşen kenar, 1: Yükselen kenar)
PSA=0 ; //Frekans bölücü seçim biti (0: Prescaler Timer0 için, 1: Prescaler WDT için)
			//PS2, PS1, PS0 : Bölüm oranını belirleyen bitler, bu değerler şekil-18'den görülebilir
PS0=1 ;
PS1=1 ;
PS2=1 ;
TMR0IE=1 ; //Timer0 kesme izin biti
//TMR0IF Timer0 kesme bayrak biti



for(;;); // Sonsuz döngüye
}

static void interrupt isim(void) // Kesme fonksiyon
{
char i; 
if(TMR0IF) 
{
GIE=0;
i++;
if(i>0 & i<10)
{
RD0=1;
}
if(10<i && i<20)
{
RD0=0;
}
else if(i>20)
i=0;


TMR0IF=0;
GIE=1; 
}
}


RaMu

Hangi pic için yazıyorsunuz önemli. Mesela 16f877 için tmr0 00h-FFh sayar eğer FFh olduktan sonra bir tane daha sayarsa 00h a döner ve bu esnada tmr0if set olur zaten bunu sende gözlemlemişsin, şimdi birde tmr0 registerı vardır bu register okunabilir ve yazılabilirdir yani programın istediğin anında bu register ı okuyup tmr0 kaç olmuş öğrenebilirsin ve birde senin için ne kadar sayıp kesme vermesini istiyorsan örneğin 20 demişsin (FFh = 255) 256-20 = 236 decimal sayısını tmr0 a sayma başlangıcında yüklersin bu sayede 20 saydığında FFh dan 00h a geçmiş olur ve tmr0 if kesme bayrağını set eder, ayrıca her kesmeden sonra tmr0if sıfırlanmalıdır (yazdığın dilde bunu kendimi yapıyor bilmiyorum ben asm de yazıyorum herşey manuel) bu ve benzeri bilgiler kullandığın denetleyicinin datasheetinde ayrıntılı olarak anlatılır program yazabilmek için datasheet okuyabilmek şarttır.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html