Estoy intentando activar una conversión de ADC a través de TA0 CCTL1 en mi MSP430, pero no sucede nada

3

Estoy haciendo un proyecto simple con MSP430FR6989 , donde estoy convirtiendo una señal analógica a una digital, cuando finaliza la conversión, saltará a un ISR e incrementará un entero.

Podemos configurar el ADC12_B (módulo ADC para el microcontrolador) para iniciar el muestreo y la conversión configurando el bit ADC12SC desde el registro ADC12CTL0, o mediante varios disparadores específicos del dispositivo.

( Guía del usuario pág. 867/1021)

( Hoja de datos pág. 91/183)

Estoy configurando mi MSP430 para comenzar a convertir utilizando el disparador de salida TA0 CCR1 ( ADC12SHSx = 001 )

Con la información que tengo, me di cuenta de que si el registro CCIF de TA0CCTL1 se establecía, se activaría una conversión ADC, y cuando la conversión haya finalizado y almacenados 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.

¿Puede alguien ayudarme con ese problema?

Esta es una muestra del código que he escrito: dentro de la función main() :

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;
}

EDIT_0

dentro de la función init_ADC ()

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);
}

Función init_Timer () interna

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

    
pregunta Forat

2 respuestas

1

La tabla 6-12 en la hoja de datos también muestra cómo la entrada del disparador ADC está conectada al temporizador:

Yestodejaclaroquela"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í, pero tiene que configurar el modo de salida para generar un flanco ascendente en el momento deseado. El modo de salida predeterminado (0) nunca cambia la salida; quieres algo como "Toggle" o "Set / Reset", dependiendo de la frecuencia:

    
respondido por el CL.
0

Podría intentar habilitar la interrupción del temporizador y verificar que el CCR1IF esté alto y que SAMPCON esté configurado después. Además, también puede consultar los registros de ADC para determinar su estado, por ejemplo. ADCBUSY poco. Es una buena idea usar switch-case en ADC12IV y habilitar las interrupciones relacionadas con errores para depurar.

Por favor, hazme saber cómo va.

    
respondido por el gustavovelascoh

Lea otras preguntas en las etiquetas