Micro C de tek timer değil daha fazla timerin bir arada kullanımı nasıldır??

Başlatan Ali Çetinkaya, 07 Şubat 2013, 15:40:55

Ali Çetinkaya

Selamlar. Çalışmalarınız çok güzel devamını diliyorum. Benim bir sorum olacaktı. Ben microc de timerlerin bir arada olduğu bir program yazmaya çalışıyorum. kullandığım entegre 18f252. timer 0 ile sorunsuzca program işliyor. ve programın o süreçteki while döngüsü içindeki işlemleri yapabiliyorum. Timer1 de başka bir olayı kontrol etmeye çalıştığımda timer 0 çalışıyor ve while döngüsü bu süreçte kilitleniyor. doğal olarak timer1 de çalışmıyor. Benim sormak istediğim. iki timeri veya 18f252 nin içinde bulunan 4 timeri bir arada kullanmak istediğim zaman ne yapmalıyım. veya nasıl bir yol izleyerek timerler birbiri ile çakışmadan sonuç alabilirim. Şimdiden teşekkür ediyorum. iyi günler. 

Programın kodu;

#define BUTON PORTA.F4
#define PROB PORTC.F0
#define MOTOR PORTC.F4
#define LED PORTC.F7

void interrupt(){
if (INTCON.T0IF){
MOTOR=~MOTOR;
INTCON.T0IF=0; // TİMER 0 KESMESİNİ SIFIRLADIK.
}
if (PIR1.TMR1IE){
PROB=~PROB;
PIR1.TMR1IF=0; // TİMER 1 KESMESİNİ SIFIRLADIK.
}


}

void main(){

ADCON1 |=0x07;   // analoğ dijital pinleri dijital olarak seçtim.

kontrol=0; // kontrol değişkenine sıfır değerini attım.

TRISC=0x00; // C portunun girişlerini ve çıkış pinlerini ayarladım.
PORTC=0x00; // C PORTUNA İLK ZAMAN TÜM PİNLERİNİ SIFIRLADIM.
TRISA=0xff;
PORTA=0x00;

// Timer0 Registers:// 16-Bit Mode; Prescaler=1:256; TMRH Preset=67; TMRL Preset=69; Freq=1,99997Hz; Period=500,0064 ms
T0CON.TMR0ON = 1;// Timer0 On/Off Control bit:1=Enables Timer0 / 0=Stops Timer0
T0CON.T08BIT = 0;// Timer0 8-bit/16-bit Control bit: 1=8-bit timer/counter / 0=16-bit timer/counter
T0CON.T0CS   = 0;// TMR0 Clock Source Select bit: 0=Internal Clock (CLKO) / 1=Transition on T0CKI pin
T0CON.T0SE   = 0;// TMR0 Source Edge Select bit: 0=low/high / 1=high/low
T0CON.PSA    = 0;// Prescaler Assignment bit: 0=Prescaler is assigned; 1=NOT assigned/bypassed
T0CON.T0PS2  = 1;// bits 2-0  PS2:PS0: Prescaler Select bits
T0CON.T0PS1  = 1;
T0CON.T0PS0  = 1;
TMR0H = 0x67;    // preset for Timer0 MSB register
TMR0L = 0x69;    // preset for Timer0 LSB register
INTCON.T0IF=0; // TİMER 0 KESMESİNİ SIFIRLADIK.
INTCON.T0IE=1; // TİMER 0 KESMESİNİ AKTİF ETTİK.
INTCON.GIE=1;  // TÜM KESMELERE İZİN VER.

// Timer1 Registers:
// Prescaler=1:4; TMR1 Preset=15536; Freq=100,00Hz; Period=10,00 ms
T1CON.T1CKPS1 = 1;// bits 5-4  Prescaler Rate Select bits
T1CON.T1CKPS0 = 0;//
T1CON.T1OSCEN = 1;// bit 3 Timer1 Oscillator Enable Control: bit 1=on
T1CON.NOT_T1SYNC=0;// bit 2 Timer1 External Clock Input Synchronization Control bit: 1=Do not synchronize external clock input
T1CON.TMR1CS  = 1;// bit 1 Timer1 Clock Source Select bit: 0=Internal clock (FOSC/4) / 1 = External clock from pin T13CKI (on the rising edge)
T1CON.TMR1ON  = 1;// bit 0 enables timer
TMR1H = 0x3C;     // preset for timer1 MSB register
TMR1L = 0xB0;     // preset for timer1 LSB register
PIR1.TMR1IF=0;
PIE1.TMR1IE=1; // TİMER 1 KESMESİNİ AKTİF ETTİK.
INTCON.PEIE=1; //Çevresel kesmeler aktif.
INTCON.GIE=1;  // TÜM KESMELERE İZİN VER.

while(1){
if(BUTON) PROB=1;
else PROB=0;

}
}




Ali Çetinkaya

Problemin büyük çoğunluğu Timerlerin ne olarak kullanacağımı bilemediğimden kaynaklandı. Çalışmamı sonlandırdım. Ben Özellikle timer kesmelerinin içindede for işlemleri yaptırdığımdan dolayı çakışıyor ve internetten çalışamarını takip ettiğim bir mucidin ilk tespitiniz olan timerlerin ön değerlerinin yüklemediğimden dolayı imiş. Programı yazarken onun çalışmaları çok yardımcı oldu. İletime bakan bakmayan herkese teşekkür ederim. Herkese iyi günler.

Mr.Java

İletinizi yeni gördüm ve ;

- timer kesmelerinin içinde de for işlemleri yaptırdığımdan dolayı çakışıyor.
sorunun tek çözümü budur kanımca.Öndeğer belirlemen timer karmaşasına yol açmasa gerek.Çünkü vereceğin öndeğer sadece kesme süreni belirliyor.


Ali Çetinkaya

Evet aynen dediğimiz gibi oldu timer içi karışıklık. Yorumunuz için teşekkür ederim. iyi günler.