3 votos

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

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

Podemos configurar el ADC12_B (módulo ADC para el microcontrolador) para que empiece a muestrear y convertir fijando el bit ADC12SC del registro ADC12CTL0, o a través de varios disparadores específicos del dispositivo.

enter image description here

( Guía del usuario pg 867/1021)

enter image description here

( Ficha técnica pg 91/183)

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

Con la información que tengo, me imaginé que si el CCIF un poco de TA0CCTL1 se activará una conversión del ADC, y cuando la conversión esté terminada y almacenada en el buffer del ADC, se activará una rutina de servicio de interrupción

He escrito mi código según la información que tengo, he construido el proyecto y lo he depurado, pero durante mi sesión de depuración mi MSP430 nunca salta a mi rutina ISR.

¿Puede alguien ayudarme con este asunto?

Este es un ejemplo del código que he escrito: dentro del 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;
}

EDIT_0

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

Dentro de init_Timer () función

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

1voto

Chenghua Yang Puntos 51

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

MSP430FR6989 TA0 output

Y esto deja claro que la "salida del temporizador" es la misma señal que saldría a un pin GPIO. En otras palabras, esto no tiene nada que ver con la interrupción en sí, sino que tienes que configurar el modo de salida para generar un flanco ascendente en el momento deseado. El modo de salida por defecto (0) nunca cambia la salida; quieres algo como "Toggle" o "Set/Reset", dependiendo de la frecuencia:

MSP430 timer output modes

0voto

Elfudge Puntos 141

Podrías intentar habilitar la interrupción del temporizador y comprobar que CCR1IF se pone a nivel alto y que SAMPCON se pone a continuación. También puedes comprobar los registros del ADC para determinar su estado, por ejemplo el bit ADCBUSY. Es una buena idea usar switch-case en el ADC12IV y habilitar las interrupciones relacionadas con el error para depurar.

Por favor, infórmame de cómo va todo.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X