16f877a Timer1 sorunu

solkirans

Üye
Katılım
10 Kas 2008
Mesajlar
31
Puanları
1
Yaş
39
Merhaba,

EasyPic5 Deneme kartı üstünde çalışıyorum, osilatörün 4MHZ yapmaya çalıştığım şey 0.2 ms de bir pic i interrupta sokmak ve counter değişkenimi 1 arttırmak, daha sonra counter değişkeni 5000 e eşit olunca, yani 1 saniye geçince Ledleri yakmak, ya da söndürmek, ama şuan yaklaşık 100 ms lik bir gecikme oluyor programın genelinde, bu neden olur? bir türlü çözemedim. Kaynak kodum aşağıda.

Teşekkürler



long int counter = 0;
void interrupt()
{

// Timer1 Interrupt - Freq = 100000.00 Hz - Period = 0.000010 seconds
if (PIR1.TMR1IF == 1) // timer 1 interrupt flag
{
counter++; // Toggle PORTB bit1 LED
PIR1.TMR1IF = 0; // interrupt must be cleared by software
PIE1.TMR1IE = 1; // reenable the interrupt
TMR1H = 255; // preset for timer1 MSB register
TMR1L = 56; // preset for timer1 LSB register
}

}



// code starts here...
void main()
{

// setup portd to show the interrupts by blibking LEDs
TRISD = 0x00; // PORT is all output...to show the interrupts
PORTD = 0; // start with all outputs low

//Timer1 Registers Prescaler= 1 - TMR1 Preset = 65486 - Freq = 100000.00 Hz - Period = 0.000010 seconds
T1CON.T1CKPS1 = 0; // bits 5-4 Prescaler Rate Select bits
T1CON.T1CKPS0 = 0; // bit 4
T1CON.T1OSCEN = 1; // bit 3 Timer1 Oscillator Enable Control bit 1 = on
T1CON.T1SYNC = 1; // bit 2 Timer1 External Clock Input Synchronization Control bit...1 = Do not synchronize external clock input
T1CON.TMR1CS = 0; // bit 1 Timer1 Clock Source Select bit...0 = Internal clock (FOSC/4)
T1CON.TMR1ON = 1; // bit 0 enables timer
TMR1H = 255; // preset for timer1 MSB register
TMR1L = 56; // preset for timer1 LSB register


// Interrupt Registers
INTCON = 0; // clear the interrpt control register
INTCON.TMR0IE = 0; // bit5 TMR0 Overflow Interrupt Enable bit...0 = Disables the TMR0 interrupt
PIR1.TMR1IF = 0; // clear timer1 interupt flag TMR1IF
PIE1.TMR1IE = 1; // enable Timer1 interrupts
INTCON.TMR0IF = 0; // bit2 clear timer 0 interrupt flag
INTCON.GIE = 1; // bit7 global interrupt enable
INTCON.PEIE = 1; // bit6 Peripheral Interrupt Enable bit...1 = Enables all unmasked peripheral interrupts


while(1) //endless loop
{
if (counter == 5000)
{
PORTD = ~PORTD;
counter= 0;
}
}
}
 
hata kartta mı yoksa simulasyonda mı? Eğer proteusta simulasyon yapıyorsan gecikme normal.

eğer kartta deneme yapıyorsan bir tahminde bulunacam; 5000 kere kesmeye giriyorsun. her kesmede bayrağı temizlediğin andan tekrar enable yapana kadar bir gecikme oluyor. bunu 5000 kere yapıyorsun. hesaplamadım ama bu gecikme belki 100 ms oluyordur. Sana tavsiyem kesmeye bu kadar çok gireceğine timer1'i daha yüksek bir süreye ayarlayıp öyle deneme yapman. örneğin aşağıdaki gibi yaparsan 0.2 sn ye ayarlar.counter'ı 5 e ayarlarsın.

T1CON.T1CKPS1 = 1;
T1CON.T1CKPS0 = 0;
TMR1H = -50000/256;
TMR1L = -50000%256;
 
Dediğiniz gibi yaptım sorun çözüldü, çok teşekkür ederim, hata kesmeye çok girmemden kaynaklanıyormuş.
 

Forum istatistikleri

Konular
128,198
Mesajlar
915,779
Kullanıcılar
449,981
Son üye
Muhammeddt

Yeni konular

Geri
Üst