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

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.

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí

( 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

¿Podría proporcionar el código de inicialización del temporizador y ADC, por favor?
@GVelascoh Seguro que lo haré ahora mismo en la edición ( EDIT_0 )
Personalmente, me gusta hacer las cosas de otra manera. Use una interrupción del temporizador para dar servicio a los datos, cuando sepa que está listo, y luego active la lectura,
Estoy aprendiendo sobre el módulo ADC12_B, por lo que me gustaría explorar todas las funciones que tiene. Aunque eventualmente me gustaría poner mi uC en un modo de bajo consumo, y si tengo un temporizador ISR que activa una conversión que va a un ADC ISR, estas 2 instancias despertarían el uC de su suspensión, si solo uso un ADC ISR y deje que se active con la "Salida TA0 CCR1". Siento que ahorraría algo de consumo de energía, ya que se activará una vez por cada ciclo

Respuestas (2)

La Tabla 6-12 en la hoja de datos también muestra cómo se conecta la entrada del disparador ADC al temporizador:

MSP430FR6989 Salida TA0

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:

Modos de salida del temporizador MSP430

La interrupción de ADC no tiene nada que ver con el inicio/desencadenamiento de la conversión, la interrupción es para cuando cambia el valor en ADC12MEM0 y se produce ISR. Esto es lo que pensé, si no es el CCIFG de TA0CCTL1 entonces, es la salida de TA0.1, cambié el modo de salida del módulo CCR1, al modo de salida 4: Alternar, donde lo configuré para alternar cada 50 EM. Esto es lo que me confunde, en la tabla 6-12 menciona que para hacer una conexión de señal a ADC12, la señal de entrada del dispositivo y la señal de entrada del módulo deben ser DVss y GND, o DVcc y Vcc respectivamente.
Las entradas y salidas del temporizador son completamente independientes y se configuran por separado.
Lo siento, no entiendo muy bien, ¿cómo puedo hacer que el módulo CCR1 active el ADC12. Fui a la página de la Guía del usuario... Figura 25-1, allí verá el módulo CCRx con entradas de CCIA, CCIB, GND, Vcc, todo configurado a través de los bits CCIS del registro TA0CCTL1, cambié mi código en consecuencia (CCIS = GND y CCIS = Vcc), y todavía no hay cambio
Nuevamente: las entradas del temporizador no importan . No está utilizando el modo de captura sino el modo de comparación.

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.

Estoy aprendiendo sobre el módulo ADC12_B, así que quiero saber cómo activarlo usando "Salida TA0 CCR1". Mi ISR ​​original era más complejo y tenía una declaración de cambio para el registro ADC12IV (todavía enfrentaba el mismo problema), luego, para verificar qué estaba mal con mi ADC, hice el código más simple que publiqué aquí. Intenté depurar, configurando el bit CCIF del registro TA0CCTL1, eso no hizo nada, lo intentaré nuevamente y lo actualizaré.
Hola, acabo de revisar esta línea ADC12CTL0 = ADC12CTL0 | ADC12ENC; //enable Conversion. Está asignando al registro ADC12CTL0su valor de dirección, pero creo que solo desea establecer el ADC12ENCbit sin afectar su valor actual, por lo que debe usar ADC12CTL0 |= ADC12ENC;en su lugar
No, no creo que este sea el caso, ADC12ENC es una macro definida en la biblioteca msp430fr6989.h y estoy haciendo una operación OR bit a bit entre el registro ADC12CTL0 y ADC12ENC para que el bit ADC12ENC en el registro ADC12CTL0 se establezca sin cambiar el valores de los bits originales en el registro
Entiendo lo que quieres hacer. De hecho ADC12ENC, es una macro y está bien usarla para establecer el bit correspondiente, pero en ese punto, ¿cuál es el contenido de ADC12CTL0?
Además, podría intentar usar el modo 7 en lugar del modo 4 y establecer un valor pequeño en TA0CCR1, porque necesita generar ambos bordes (para muestrear y convertir).