
Dudas con interrupciones timer msp430G2553
Publicado por Luis (1 intervención) el 26/02/2013 17:24:29
Hola, estoy programando un MSP430G2553 (con la launchpad) en C. Quiero que mi programa me genere una interrupción cada 1 segundo que me apague y me encienda el led1 (pin p1.0).
Utilizo como fuente de reloj la ACLK = 32768 Hz.
Según mis cálculos y unos apuntes que tengo de una asignatura que cursé en la carrera, el cálculo de TACCR0 es el siguiente:
(TACCR0+1)(1/(frecuencia_del_reloj))=1 segundo (ya que quiero que cuando el Timer llegue a TACCR0 me genere una interrupción cada segundo) -> TACCR0 = frecuencia_del_reloj -1;
Nota: frecuencia_del_reloj es en este caso la ((frecuencia de ACLK) / ID_3 )=32768/8 = 4096.
Por lo que nos queda una TACCR0 = (32768/8)-1=4095;
Pues bien, este valor es el que le meto a TACCR0 (habilitando la interrupción por TACCR0) y no me genera una interrupción cada segundo, más bien diría que cada 2 segundos aproximadamente.
Os copio el código de mi programa:
#include <msp430g2553.h>
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P1DIR |= 0x01; // P1.0 como salida (para el led 1)
CCTL0 = CCIE; //habilito la interrupcion por CCR0
CCR0 = 4095; //para que me genere una interrupción cada segundo.
TACTL = TASSEL_1 + MC_1 + ID_3; //fuente de reloj ACLK=32768Hz, modo up y el divisor de //de frecuencia ID_3=8 de modo que la frecuencia real es 4096Hz.
_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
}
// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
P1OUT ^= 0x01; // Toggle P1.0
}
Alguien sabe en qué me estoy equivocando, o como saber exactamente el período de cuenta?
Un saludo y gracias.
Utilizo como fuente de reloj la ACLK = 32768 Hz.
Según mis cálculos y unos apuntes que tengo de una asignatura que cursé en la carrera, el cálculo de TACCR0 es el siguiente:
(TACCR0+1)(1/(frecuencia_del_reloj))=1 segundo (ya que quiero que cuando el Timer llegue a TACCR0 me genere una interrupción cada segundo) -> TACCR0 = frecuencia_del_reloj -1;
Nota: frecuencia_del_reloj es en este caso la ((frecuencia de ACLK) / ID_3 )=32768/8 = 4096.
Por lo que nos queda una TACCR0 = (32768/8)-1=4095;
Pues bien, este valor es el que le meto a TACCR0 (habilitando la interrupción por TACCR0) y no me genera una interrupción cada segundo, más bien diría que cada 2 segundos aproximadamente.
Os copio el código de mi programa:
#include <msp430g2553.h>
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P1DIR |= 0x01; // P1.0 como salida (para el led 1)
CCTL0 = CCIE; //habilito la interrupcion por CCR0
CCR0 = 4095; //para que me genere una interrupción cada segundo.
TACTL = TASSEL_1 + MC_1 + ID_3; //fuente de reloj ACLK=32768Hz, modo up y el divisor de //de frecuencia ID_3=8 de modo que la frecuencia real es 4096Hz.
_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
}
// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
P1OUT ^= 0x01; // Toggle P1.0
}
Alguien sabe en qué me estoy equivocando, o como saber exactamente el período de cuenta?
Un saludo y gracias.
Valora esta pregunta


0