MSP430 Temporizador A los indicadores de interrupción están locos

0

Intentando configurar un temporizador en mi MSP430F5529 que debería interrumpirse después de aprox. 2 segundos.

Mi configuración inicial se ve así:

TA1CTL      = (TASSEL_SMCLK | ID_DIV8 | MC_UP |TACLR | TAIE | TAIFG);
TA1EX0      = (TAIDEX_DIV4);
TA1CCR0     = 0xFFFF;
TA1CCTL1    = (CM_NONE | CCIS_A | CAP_0 | CCIE_1 | OUT_1 | COV_0 | CCIFG_0);

Por lo que sé, esto debería configurar el temporizador A para interrumpir aprox. cada 2 segundos.

Frecuencia SMCLK = 1 MHz

TA1CTL está dividido por 8 con ID_DIV8, y nuevamente por 4 con TAIDEX_DIV4, por lo que en total está dividido por 32. Esto significa que TA1R recibe un tick cada 32us. Cuenta hasta que alcanza TA1CCR0, que está en 65,536. 65,536 * 32us = 2.09715 segundos.

La interrupción es exitosa, sin embargo, establece varias marcas de manera incorrecta.

Establece CCIFG en TA1CCTL0, TA1CCTL1 y TA1CCTL2. No solo TA1CCTL1, como esperaba.

Otra pregunta que tengo es la siguiente: ¿por qué me veo obligado a usar TA1CCR0 para especificar qué valor se cuenta, cuando estoy usando TA1CCTL1? intenté especificar un valor en TA1CCR1 inicialmente, pero el contador nunca incrementado. Esto no tiene ningún sentido para mí.

Entonces, si alguien por ahí está bastante familiarizado con el MSP430 y podría ayudar, se lo agradecería enormemente.

    
pregunta krb686

1 respuesta

5

CCR0 contiene el valor máximo que el temporizador cuenta hasta. Cuando el temporizador alcanza este valor, se restablece a cero. Solo CCR0 hace esto. CCR1 y CCR2 pueden desencadenar una interrupción cuando coinciden con el recuento actual, pero el temporizador continuará superándolos. Ya que CCR0 establece el período del temporizador, es la opción obvia para generar la interrupción periódica (usted podría usar CCR1 o CCR2 , pero entonces solo tendrá más registros para configurar, y pueden tener otros usos).

Si CCR1 y CCR2 están configurados en menos de CCR0 , entonces el temporizador los igualará antes alcanzando su conteo máximo, por lo que cuando ocurra la interrupción CCR0 verá que los indicadores de interrupción CCR1 y CCR2 ya se han establecido. Puede habilitar solo la interrupción CCR0 e ignorar las otras banderas, ya que no causarán ningún daño.

TA1CCTL1 contiene varios bits que se utilizan para configurar CCR1 . Esto no tiene relación con TA1CCR0 ; aún así, debe establecerlo en el recuento máximo que necesita. Si TA1CCR0 se deja en cero, ¡el temporizador no contará!

    
respondido por el Bruce Abbott

Lea otras preguntas en las etiquetas