Estoy haciendo un proyecto simple con MSP430FR6989 , donde estoy convirtiendo una señal analógica a una digital, cuando termine la conversión, saltará a un ISR e incrementará un número entero.
Podemos configurar el ADC12_B (módulo ADC para el microcontrolador) para comenzar a muestrear y convertir configurando el bit ADC12SC del registro ADC12CTL0, o a través de varios disparadores específicos del dispositivo.
( Guía del usuario pág. 867/1021)
( Ficha técnica pág. 91/183)
Estoy configurando mi MSP430 para comenzar a convertir usando el activador de salida TA0 CCR1 ( ADC12SHSx = 001 )
Con la información que tengo, pensé que si se configuraba el bit CCIF del registro TA0CCTL1 , se activaría una conversión ADC, y cuando la conversión finalice y se almacene en el búfer ADC, se activará una rutina de servicio de interrupción.
Escribí mi código de acuerdo con la información que tengo, construí el proyecto y lo depuré, pero durante mi sesión de depuración, mi MSP430 nunca salta a mi rutina ISR.
alguien me puede ayudar con ese tema
Esta es una muestra del código que he escrito: dentro de la main()
función:
int main (void)
{
//code
init_Timer ();
//configures TA0 CCR1 to 50 ms
init_ADC ();
//ADC12SHSx = 001 (Trigger is TA0 CCR1)
//ADC12IER0 = ADC12IE0; enables ADC12 Interrupt
ADC12CTL0 = ADC12CTL0 | ADC12ENC; //enable Conversion
_BIS_SR(GIE);//enable global interrupt
//rest of code
}
dentro de la función ISR
#pragma vector = ADC12_VECTOR
__interrupt void ADC12_ISR (void)
{
static int x = 0;
++x;
}
EDITAR_0
dentro de la init_ADC ()
función
void init_ADC (void)
{
ADC12CTL0 = ADC12ON | ADC12SHT0_2;
//ADC ON, 16 ADC12CLK
ADC12CTL1 = ADC12SHS_1 | ADC12SHP | ADC12SSEL_1;
//TA0 CCR1 Output, SAMPCON from Sample Timer, ACLK
ADC12CTL2 = ADC12RES__12BIT;//12 bit resolution
ADC12MCTL0 = ADC12INCH_10;//A10 P9.2
ADC12IER0 = ADC12IE0;//enable MEM0 interrupt (if it's value changed)
ADC12IFGR0 = ADC12IFGR0 & (~ADC12IFG0);
}
init_Timer ()
Función interior
void init_Timer (void)
{
TA0CTL = MC__UP | TASSEL__ACLK;//counts to TA0CCR0, and source from ACLK
TA0CCR0 = 1667;//50 ms count = 50/.03 (Tperiod of ACLK = .03)
TA0CCR1 = 1667;// 50 ms
}
FIN de EDIT_0
La Tabla 6-12 en la hoja de datos también muestra cómo se conecta la entrada del disparador ADC al temporizador:
Y esto deja en claro que la "salida del temporizador" es la misma señal que se enviaría a un pin GPIO. En otras palabras, esto no tiene nada que ver con la interrupción en sí, sino que debe configurar el modo de salida para generar un flanco ascendente en el momento deseado. El modo de salida predeterminado (0) nunca cambia la salida; desea algo como "Alternar" o "Establecer/Reiniciar", dependiendo de la frecuencia:
Puede intentar habilitar la interrupción del temporizador y verificar que CCR1IF esté en nivel alto y que SAMPCON se configure después. Además, también puede comprobar los registros ADC para determinar su estado, por ejemplo, el bit ADCBUSY. Es una buena idea usar switch-case en ADC12IV y habilitar las interrupciones relacionadas con errores para depurar.
Por favor, hágame saber cómo va.
ADC12CTL0 = ADC12CTL0 | ADC12ENC; //enable Conversion
. Está asignando al registro ADC12CTL0
su valor de dirección, pero creo que solo desea establecer el ADC12ENC
bit sin afectar su valor actual, por lo que debe usar ADC12CTL0 |= ADC12ENC;
en su lugarADC12ENC
, es una macro y está bien usarla para establecer el bit correspondiente, pero en ese punto, ¿cuál es el contenido de ADC12CTL0
?TA0CCR1
, porque necesita generar ambos bordes (para muestrear y convertir).
gustavovelascoh
Embedded_Dude
scott seidman
Embedded_Dude