collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: [Ajuda] Atmega8 - Erro código ADC  (Lida 1996 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
[Ajuda] Atmega8 - Erro código ADC
« em: 06 de Março de 2011, 03:57 »
Olá, estou com um erro no código que estou a desenvolver e tudo indica que tenha a ver com as interrupções do ADC, se ao código que acrescentei em baixo acrescentar a rotina de inicialização da porta série, ente funciona tudo direitinho mas se tirar o adc parece-me que está sempre a 0. Conclusão algo não está muito certo ao iniciar o ADC.
Alguma sugestão?


Código: [Seleccione]
#include <avr/io.h>
#include <avr/interrupt.h>

#define F_CPU 8000000UL
#include <util/delay.h>

#include "bit_tools.h"

uint16_t adcread=0;

void adc_init(void){
  ADMUX |= (1 << REFS0) | (0<<ADLAR);
  ADCSRA = (1 << ADEN) | (1<<ADSC) | (1<<ADFR) | (1 << ADIE)| (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);     
}

ISR(ADC_vect){
  adcread=ADCL;
  adcread|=ADCH<<8;
}

int map(int x, int in_min, int in_max, int out_min, int out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

int main(void) { 
  float adcGravadoDez=0,adcGravadoVinte=0,adcGravadoTrinta=0;
  int adcGravado=0,adcDif=0,nivel=0;
  uint8_t estado=0,btn=0,i=0;
 
  adcGravado=1020;
  adcGravadoDez=adcGravado*0.1;
  adcGravadoVinte=adcGravado*0.2;
  adcGravadoTrinta=adcGravado*0.3;
 
  DDRB=0xff;
  DDRD=0xff;
  DDRC|=(0<<PC3);
  DDRC|=(1<<PC2);
 
  PORTB=0xff;
  PORTD=0xff;
  bit_clear(PORTC,2);
 
  adc_init();
  sei();
 
  while(1){
 
    btn = (PINC & (1<<PC3))>>PC3;
    if (btn == 1) {
      adcGravado=adcread;
      adcGravadoDez=adcGravado*0.1;
      adcGravadoVinte=adcGravado*0.2;
      adcGravadoTrinta=adcGravado*0.3;
      estado=1;
    }
   
    if(estado==1){
      adcDif=adcread-adcGravado;
      if(adcDif<0)
adcDif=adcGravado-adcread;
     
      if((adcDif>adcGravadoDez)||(adcDif<(-adcGravadoDez))){
if((adcDif>adcGravadoVinte)||(adcDif<(-adcGravadoVinte))){
  nivel=map(adcDif,adcGravadoVinte,adcGravadoTrinta,12,15);
  if(nivel>15){
      nivel=15;
  }
}else{
  nivel=map(adcDif,adcGravadoDez,adcGravadoVinte,8,12);
}
      }else{
nivel=map(adcDif,0,adcGravadoDez,0,7);
      }

      for(i=0;i<16;i++){
if(i<8 && i<=nivel){
  bit_set(PORTD,i);
}else if(i<8){
  bit_clear(PORTD,i);
}else if(i<=nivel){
  bit_set(PORTB,i-8);
}else{
  bit_clear(PORTB,i-8);
}
      }
     
      _delay_ms(100); 
    }
  }
  return 0;
}

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: [Ajuda] Atmega8 - Erro código ADC
« Responder #1 em: 06 de Março de 2011, 20:35 »
Variáveis partilhadas por funções/main e interrupções tem de ser declaradas como volatile, no teu caso:
volatile uint16_t adcread=0;

E para leres o adc de 10 bits basta fazeres ADCW que o compilador trata do resto ;)

E como estas a fazer a inicializaçao, isto:
  ADMUX |= (1 << REFS0) | (0<<ADLAR);

Devia ser:
  ADMUX = (1 << REFS0);

Porque o 0 nao faz nada junto com o OR.
Avr fanboy