Interrupção do Adc no str711fr2

Software e Hardware para linha ARM

Moderadores: 51, guest2003, Renie, gpenga

Interrupção do Adc no str711fr2

Mensagempor stauer » 17 Set 2008 20:29

Olá galera,

Seguinte, estou tentando usar o ADC do str711fr2, porém não estou conseguindo fazer a interrupção funcionar. Estou usando a biblioteca da st 4.0 com compilador gcc.
O código é este:
Código: Selecionar todos
void ADC_Init(void)
{
   ADC12_Init();
   //Configure all ADC inputs to High impedance Analog inputs
   GPIO_Config (GPIO1, 0x0F, GPIO_HI_AIN_TRI);// p1.2 e p1.3
   //configure the mode
   ADC12_ModeConfig(ADC12_SINGLE);
   //select the channel 0 to be converted
   ADC12_ChannelSelect(ADC12_CHANNEL0);
   //configure the prescaler 500Hz
   ADC12_PrescalerConfig(10); //apb2_clk/(adc12_clk*512*8)
   // enable interrupt
   ADC12_ITConfig(ENABLE);
   EIC_IRQChannelConfig( ADC_IRQChannel, ENABLE );
   // start the conversion
   ADC12_ConversionStart();
}
//código na int

void ADC12_IRQHandler(void)
{
  u16 Conv_Res;
  uart_send_p("Entrou na bagaça \r\n");
  Conv_Res = ADC12_ConversionValue(ADC12_CHANNEL0);
  uart_send_p( "Lendo AD0... %d\r\n", Conv_Res );
}

int main(void)
{
   /* Configuracao do PLL com cristal de 16Mhz para os clocks Core:48Mhz APB1:24Mhz APB2:24Mhz ------------*/
    // clk / 2
   RCCU_Div2Config( ENABLE );
   // APB1
   RCCU_PCLK1Config ( RCCU_RCLK_2 );
   // APB2
   RCCU_PCLK2Config ( RCCU_RCLK_2 );
   // Configurar MCLK, RCCU_DEFAULT = RCLK /1
   RCCU_MCLKConfig ( RCCU_DEFAULT );
   // Configurar PLL1 ( * 12 , / 2 )
   RCCU_PLL1Config ( RCCU_PLL1_Mul_12, RCCU_Div_2 );
   // Aguarda PLL ativar (lock)
   while( RCCU_FlagStatus( RCCU_PLL1_LOCK ) == RESET ) ;
   // Seleciona PLL1 como fonte de clock para RCLK
   RCCU_RCLKSourceConfig (RCCU_PLL1_Output);
   /* Enable ADC12 and GPIO0 clocks on APB2 */
   APB_ClockConfig (APB2, ENABLE, ADC12_Periph | GPIO0_Periph | GPIO1_Periph);
   /* Enable I2C0 clock on APB1 */
   APB_ClockConfig (APB1, ENABLE, I2C0_Periph | UART0_Periph );

   uart_init();
   // AD
   ADC_Init();
   /* Infinite loop */
   while (1);
}



Na serial não sai nada :(. Eu omiti a parte da uart pois este não tem problemas.
O código é bem simples, não consigo achar o problema, alguém sabe o que pode ser?

Desde já agradeço.

[]'s
stauer
Bit
 
Mensagens: 9
Registrado em: 23 Jul 2007 17:24
Localização: Blumenau

Mensagempor Monk » 17 Set 2008 23:48

Enviar algo pela serial é um código muito extenso para ser usado dentro de uma interrupção. Interrupções devem ser curtas.
Tenta fazer assim:
Salva o valor do adc numa varialvel global e seta um flag.
No loop do main vc fica testando o flag, se tiver sido setado, vc envia

while()
{
if(flag==1)
{
uart_send_p( "Lendo AD0... %d\r\n", Conv_Res );
flag=0;
}
}
Monk
Bit
 
Mensagens: 32
Registrado em: 26 Set 2007 17:14
Localização: Salvador, BA

Mensagempor MarcusPonce » 18 Set 2008 08:23

Parece que será necessário adicionar na main():

/* Enable IRQ interrupts*/
EIC_IRQConfig(ENABLE);
MarcusPonce
Byte
 
Mensagens: 166
Registrado em: 12 Fev 2007 13:58
Localização: Campinas - SP

Mensagempor stauer » 18 Set 2008 19:38

Olá,

Marcus, acabei esquecendo de colocar o EIC_IRQConfig no código aqui, mas no código original que é bem maior ele está sendo ativado :/
Monk, já fiz dessa forma, declarei Conv_Res como global e dei um print no main, mas não obtive sucesso, de qualquer forma, já enviei msgs pra debug pela serial em outras interrupções e funcionaram.

Alguma outra idéia/sugestão?

[]'s
stauer
Bit
 
Mensagens: 9
Registrado em: 23 Jul 2007 17:24
Localização: Blumenau

Mensagempor MarcusPonce » 19 Set 2008 08:49

No momento, parece que ainda não sabemos qual dos dois problemas está acontecendo:

a) O conversor A/D está convertendo e gerando valores ou está parado ?
b) se (a) acima está ok, então porque a interrupção não dispara ?

Sugiro que dentro do while(1) da main() (na versão atual só fica em um loop eterno) você coloque umas linhas para ler o resultado do conversor A/D direto dele e mandar pela serial, sem parar. E você colocar algum sinal variando no pino de entrada do A/D.

Então, no caso do A/D estar funcionando ok você vai ver números (leituras) diferentes saindo pela serial e saberá que o problema é que a interrupção não está disparando. Porém, se os números saindo pela serial forem todos iguais então o A/D nem mesmo está convertendo.
MarcusPonce
Byte
 
Mensagens: 166
Registrado em: 12 Fev 2007 13:58
Localização: Campinas - SP

Mensagempor Monk » 19 Set 2008 11:46

Eu sugiro na interrupçao vc ativar um pino do mcu, de preferencia o led.
Se ele entrar na interrupção pelo menos uma vez, o led vai ficar acesso.
Monk
Bit
 
Mensagens: 32
Registrado em: 26 Set 2007 17:14
Localização: Salvador, BA

Mensagempor Djalma Toledo Rodrigues » 19 Set 2008 13:04

Monk escreveu:Eu sugiro na interrupçao vc ativar um pino do mcu, de preferencia o led.Se ele entrar na interrupção pelo menos uma vez, o led vai ficar acesso.

Liga LED
Da um tempo ~100 mseg
Desliga LED
Da um tempo ~100 mseg


Vai monitorar quantas vezes interromper.

Abraço e desculpe a "inté_erupção" :lol:
.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor stauer » 19 Set 2008 21:40

Sempre os problemas que se leva mais tempo são as coisas mais simples.
Estava faltando definir a prioridade do EIC.
Código: Selecionar todos
EIC_IRQChannelPriorityConfig( ADC_IRQChannel, 1 );


Ta funcionando que é uma beleza :D

Obrigado pela ajuda.

[]'s
stauer
Bit
 
Mensagens: 9
Registrado em: 23 Jul 2007 17:24
Localização: Blumenau


Voltar para ARM

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x