TODOPIC

Microcontroladores PIC => dsPIC => Mensaje iniciado por: kaos_XIII en 19 de Diciembre de 2012, 08:25:15

Título: dsPIC30F4011 Timer1
Publicado por: kaos_XIII en 19 de Diciembre de 2012, 08:25:15
Buenas,

Tengo un problema al configurar el TMR1 para que tenga una interrupción cada 1ms.

Tengo el dsPIC30F4011, un cristal de 4MHz y configuro el Timer de la siguiente manera.

#define FCY 8000000

_FOSC(CSW_FSCM_OFF & XT_PLL8);
_FWDT(WDT_OFF);                  
_FGS(CODE_PROT_OFF);

T1CON = 0x0000;       // Reset del TIMER1.
T1CONbits.TCKPS = 1;       // Prescaler: 1:1 (00), 1:8 (01), 1:64 (10) o 1:256 (11).
TMR1 = 131;          // Registro TMR1.
PR1 = 1000;
IFS0bits.T1IF = 0;       // Reset del Flag del TIMER1.
IEC0bits.T1IE = 1;       // Habilitar la RSI Timer1.
T1CONbits.TON = 1;       // Habilitar el Timer1.

Las formulas que he usado son:

Periodo = (256-TMR) * (4/Fosc)*(PRESCALER)
Tiempo = (PR1*PRESCALER) / FCY
FCY = (Fosc*PLL)/ 4

Siendo:

Periodo = Tiempo = 1ms = 0,001s.
Fosc = 4MHz = 4000000Hz
Prescaler = 8;
FCY = 8000000;

Si alguien me puede ayudar, Gracias.
Título: Re: dsPIC30F4011 Timer1
Publicado por: willynovi en 19 de Diciembre de 2012, 14:00:24
No estoy muy familiarizado con los dsPIC, pero según los dato que has pasado hice las siguientes cuentas:

XT = 4Mhz
XT_PLL = 8
focs = 4 x 8 = 32Mhz
si cada instrucción se lleva 4 ciclos de reloj, el micro corre a 8 millones de instrucciones por segundo, lo que nos da
TCY = 0,125 useg

es decir que el si no tienes prescaler, T1CONbits.TCKPS = 1, el Timer1 se incrementará cada 0,125 useg.

Tendrias que cargar el valor del TMR1 con 8000 para lograr la interupción de 1mseg.
O usar el prescaler en 64 si usaras el TMR1 en 8 bit y lo cargas con el valor 125.
Título: Re: dsPIC30F4011 Timer1
Publicado por: KALLITOS en 19 de Diciembre de 2012, 14:14:34
Esto es lo que uso normlamente.


Código: C
  1. #define    MIPS      8.000
  2. #define    PRESC     256
  3. ///selecciona correctamente el prescaler
  4. ///la unidad de tiempo en el calculo esta en us
  5. PR1 = MIPS/PRESC*5000;         ////5 ms de tiempo del timer1

saludos.