TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: jfmateos2 en 13 de Enero de 2008, 14:54:52

Título: Duda con interrupción de TIMER_0
Publicado por: jfmateos2 en 13 de Enero de 2008, 14:54:52
Estoy usando un 18F2455 con un cristal de 20MHZ y clock=48000000.

He configurado el timer0 así: setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);

Esto debería provocar 48000000/4/1/256=46875 interrupciones por segundo ¿no es así? Pues en la práctica parece que no proque se producen muchas menos interrupciones por segundo.

¿Alguien podría explicarme cómo se calcula el número de interrupciones por segundo?

Gracias.
Título: Re: Duda con interrupción de TIMER_0
Publicado por: c4_esp_VR en 13 de Enero de 2008, 15:19:33
t(us) = (4*prescaler*(get_timer1-init_timer)) / (clock(MHz))

En tu caso es:

get_timer son 2^8 ya que timer0 es de 8 bits e init_timer es donde queremos que empiece a contar, por defecto es cero.

t(us)= (4*1*255)/48 = 1020 / 48 = 21.25 us

Por tanto tendrás una interrupción cada 21.25 us.

Un saludete.
Título: Re: Duda con interrupción de TIMER_0
Publicado por: jfmateos2 en 13 de Enero de 2008, 16:39:56
Muchas gracias C4 por confirmar que mis cálculos eran correctos.

Ya he descubierto el porqué de la diferencia de tiempo teórico y empírico.

Resulta que el timer0 de los PIC18xxx utiliza, por defecto, un int de 16bits, es decir, no desborda hasta alcanzar 65.000 ciclos.

Para configurarlo en 8 bits hay que hacerlo así:

setup_timer_0(RTCC_8_BIT|RTCC_DIV_1);
Título: Re: Duda con interrupción de TIMER_0
Publicado por: stk500 en 13 de Enero de 2008, 16:48:40
Frequently Asked Questions
How is the TIMER0 interrupt used to perform an event at some rate?

The following is generic code used to issue a quick pulse at a fixed rate:

#include <16Cxx.H>
#use Delay(clock=15000000)
#define HIGH_START 114
byte seconds, high_count;
#INT_RTCC

clock_isr() {
   if(--high_count==0) {
      output_high(PIN_B0);
      delay_us(5);
      output_low(PIN_B0);
      high_count=HIGH_START;
   }
}

main() {
   high_count=HIGH_START;
   set_rtcc(0);
   setup_counters(RTCC_INTERNAL, RTCC_DIV_128);
   enable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);

   while(TRUE);
}

In this program, the pulse will happen about once a second. The math is as follows:

    The timer is incremented at (CLOCK/4)/RTCC_DIV.

In this example, the timer is incremented (15000000/4)/128 or 29297 times a second (34us).

The interrupt happens every 256 increments. In this example, the interrupt happens 29297/256 or 114 times a second.

The interrupt function decrements a counter (HIGH_START times) until it is zero, then issues the pulse and resets the counter. In this example, HIGH_START is 114 so the pulse happens once a second. If HIGH_START were 57, the pulse would be about twice a second.
Título: Re: Duda con interrupción de TIMER_0
Publicado por: jfmateos2 en 13 de Enero de 2008, 16:52:04
Muchas gracias stk, precisamente llevaba ya una hora estudiando el ejemplo que has publicado, pero como es para un PIC16, no indicaba en ningún sitio que el timer0 pudiera ser de 16bits en los 18F en lugar de 8bits.

Todo se aclaró cuando consulté el datasheet.