Configuração do ADC no msp430f149

Olá a todos do fórum,
estou trabalhando à algum tempo com o msp430f149 e estou gostando bastante dele.
Tenho que configurar dois canais PWM (já estão funcionando certinho) e um canal AD (estou com dificuldades).Estou usando o IAR como compilador e programando em C.
Meu programinha:
#include "io430.h"
#include <io430x14x.h>
#include <intrinsics.h>
unsigned int i,delay;
unsigned int pwm1,pwm2;
float tempo_ativo1,tempo_ativo2; // porcentagem do pwm
#pragma vector = TIMERA0_VECTOR
__interrupt void trata_ccp0(void)
{
TACCR1= pwm1; //joga o valor do PWM1 no registrador de comparação 1
TACCR2= pwm2; //joga o valor do PWM2 no registrador de comparação 2
}
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; //desabilita o watchdog
P1DIR_bit.P1DIR_0 = 1; //configura o pino P1.0 como saída
P1DIR_bit.P1DIR_2 = 1; //configura o pino P1.2 como saída
P1DIR_bit.P1DIR_3 = 1; //configura o pino P1.3 como saída
P4DIR = 0xff; //configura os pinos do port 4 como saida
//****************************************configuração dos canais de PWM*********************************************************
P1SEL_bit.P1SEL_2 = 1; //habilita a função alternativa para a saida P1.2
P1SEL_bit.P1SEL_3 = 1; //habilita a função alternativa para a saida P1.3
TACTL = TASSEL_2 + MC_1; //configura o timer A para clock secundário com contagem progressiva com módulo(0 até o valor de TACCR0)
TACCR0 = 11000; //configura a frequência do PWM para 71Hz
TACCR2 = pwm2; //configura a percentagem de ciclo ativo do canal 2 do pwm
TACCR1 = pwm1; //configura a percentagem do ciclo ativo do canal 1 do PWM
TACCTL1 = OUTMOD_7; //configura o canal 1 do PWM para saída ser apagada na comparação e setada ao atingir o valor do TACCR0
TACCTL2 = OUTMOD_7; //configura o canal 2 do PWM para saída ser apagada na comparação e setada ao atingir o valor do TACCR0
TACCTL0 = CCIE; //habilita a interrupção de captura/comparação do sinal
__enable_interrupt(); //habilita as interrupções
tempo_ativo1=50; //percentagem do tempo ativo do pwm 1
tempo_ativo2=25; //percentagem do tempo ativo do pwm 2
delay = 30000;
//*******************************************************************************************************************************
//*************************************configuração do conversor AD******************************************************************************************************************
P6DIR_bit.P6DIR_0 = 0; //habilita o pino P6.0 (A0) como entrada
P6SEL_bit.P6SEL_0 = 1; //habilita a função especial para a entrada P6.0 (A0)
ADC12CTL1 = CONSEQ_0 + CSTARTADD_0 + SHP; //um canal de conversão + salvar na memoria ADC12MEM0 + modo temporizado
ADC12CTL1 = SHS_0 + ADC12SSEL_0 + ADC12DIV_0; //disparo por software + clock ADC12OSC + divisor do clock por 1
ADC12CTL0 = REFON + REF2_5V + SHT0_0; //referencia interna ligada + referencia interna de 2V5 + tempo de amostragem = 4
ADC12MCTL0 = INCH_0; //AD com entrada no canal 0
ADC12CTL0 = ADC12ON + ENC + ADC12SC; //liga o ADC + habilita a conversão + inicia a conversão
//************************************************************************************************************************************************************************************
while(1)
{
pwm1 = (tempo_ativo1/100)*11000; //calcula o valor da percentagem para jogar no comparador 1
pwm2 = (tempo_ativo2/100)*11000; //calcula o valor da percentagem para jogar no comparador 2
P1OUT = 0x01;
for(i=0; i<= delay; i++)
{
}
P1OUT = 0x00;
for(i=0; i<= delay; i++)
{
}
ADC12MEM0 = P4OUT;
}
}
Na parte do AD estou lendo uma entrada (A0) e quero mostrar o valor dessa entrada na porta P4.
Mas a porta P4 fica apenas mostrando um valor estranho que nunca muda, creio que meu hardware esteja certo...Alimentei o AVcc e aterrei o AVss para funcionamento do modulo AD.
Gostaria que os senhores me dessem uma ajudinha para configurar o conversor AD certinho e/ou me indicar algum erro que eu tenha cometido no meu programa.
Muito obrigado a todos,
Denis.
estou trabalhando à algum tempo com o msp430f149 e estou gostando bastante dele.
Tenho que configurar dois canais PWM (já estão funcionando certinho) e um canal AD (estou com dificuldades).Estou usando o IAR como compilador e programando em C.
Meu programinha:
#include "io430.h"
#include <io430x14x.h>
#include <intrinsics.h>
unsigned int i,delay;
unsigned int pwm1,pwm2;
float tempo_ativo1,tempo_ativo2; // porcentagem do pwm
#pragma vector = TIMERA0_VECTOR
__interrupt void trata_ccp0(void)
{
TACCR1= pwm1; //joga o valor do PWM1 no registrador de comparação 1
TACCR2= pwm2; //joga o valor do PWM2 no registrador de comparação 2
}
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; //desabilita o watchdog
P1DIR_bit.P1DIR_0 = 1; //configura o pino P1.0 como saída
P1DIR_bit.P1DIR_2 = 1; //configura o pino P1.2 como saída
P1DIR_bit.P1DIR_3 = 1; //configura o pino P1.3 como saída
P4DIR = 0xff; //configura os pinos do port 4 como saida
//****************************************configuração dos canais de PWM*********************************************************
P1SEL_bit.P1SEL_2 = 1; //habilita a função alternativa para a saida P1.2
P1SEL_bit.P1SEL_3 = 1; //habilita a função alternativa para a saida P1.3
TACTL = TASSEL_2 + MC_1; //configura o timer A para clock secundário com contagem progressiva com módulo(0 até o valor de TACCR0)
TACCR0 = 11000; //configura a frequência do PWM para 71Hz
TACCR2 = pwm2; //configura a percentagem de ciclo ativo do canal 2 do pwm
TACCR1 = pwm1; //configura a percentagem do ciclo ativo do canal 1 do PWM
TACCTL1 = OUTMOD_7; //configura o canal 1 do PWM para saída ser apagada na comparação e setada ao atingir o valor do TACCR0
TACCTL2 = OUTMOD_7; //configura o canal 2 do PWM para saída ser apagada na comparação e setada ao atingir o valor do TACCR0
TACCTL0 = CCIE; //habilita a interrupção de captura/comparação do sinal
__enable_interrupt(); //habilita as interrupções
tempo_ativo1=50; //percentagem do tempo ativo do pwm 1
tempo_ativo2=25; //percentagem do tempo ativo do pwm 2
delay = 30000;
//*******************************************************************************************************************************
//*************************************configuração do conversor AD******************************************************************************************************************
P6DIR_bit.P6DIR_0 = 0; //habilita o pino P6.0 (A0) como entrada
P6SEL_bit.P6SEL_0 = 1; //habilita a função especial para a entrada P6.0 (A0)
ADC12CTL1 = CONSEQ_0 + CSTARTADD_0 + SHP; //um canal de conversão + salvar na memoria ADC12MEM0 + modo temporizado
ADC12CTL1 = SHS_0 + ADC12SSEL_0 + ADC12DIV_0; //disparo por software + clock ADC12OSC + divisor do clock por 1
ADC12CTL0 = REFON + REF2_5V + SHT0_0; //referencia interna ligada + referencia interna de 2V5 + tempo de amostragem = 4
ADC12MCTL0 = INCH_0; //AD com entrada no canal 0
ADC12CTL0 = ADC12ON + ENC + ADC12SC; //liga o ADC + habilita a conversão + inicia a conversão
//************************************************************************************************************************************************************************************
while(1)
{
pwm1 = (tempo_ativo1/100)*11000; //calcula o valor da percentagem para jogar no comparador 1
pwm2 = (tempo_ativo2/100)*11000; //calcula o valor da percentagem para jogar no comparador 2
P1OUT = 0x01;
for(i=0; i<= delay; i++)
{
}
P1OUT = 0x00;
for(i=0; i<= delay; i++)
{
}
ADC12MEM0 = P4OUT;
}
}
Na parte do AD estou lendo uma entrada (A0) e quero mostrar o valor dessa entrada na porta P4.
Mas a porta P4 fica apenas mostrando um valor estranho que nunca muda, creio que meu hardware esteja certo...Alimentei o AVcc e aterrei o AVss para funcionamento do modulo AD.
Gostaria que os senhores me dessem uma ajudinha para configurar o conversor AD certinho e/ou me indicar algum erro que eu tenha cometido no meu programa.
Muito obrigado a todos,
Denis.