wechseln des ADC channels

Gast #40876
Lesenswert?
• ▲
▼
hallo

kann mir jemand sagen, wie ich den channel des ADC's eines ATmega8535
wechseln kann, ich hab's probiert, jedoch funktioniert das nicht so
recht. er wechselt zwar einmal von channel 0 zu channel 1, aber wenn
ich dnn wieder channel 0 auslesen will, dann bleibt er imemr noch bei
channel 1.

hier mein code

void init_adc(void)
{
  sbi (ADCSRA, ADEN);   //Enable ADC
  //Teilung: 16 von CPU_FREQ
  sbi (ADCSRA, ADPS2);  //Teilung 3.Bit
  cbi (ADCSRA, ADPS1);  //Teilung 2.Bit
  cbi (ADCSRA, ADPS0);  //Teilung 1.Bit

  cbi (ADCSRA, ADIF);  //Interrupt Flag
  cbi (ADCSRA, ADATE);  //ADC auto trigger enble
  cbi (ADCSRA, ADIE);  //Interrupt Enable

  //ADMUX|=0xC0; //0xC0 use internal 2,56V redference

}

void read_adc(unsigned char channel, unsigned int Vref, unsigned int
gain, unsigned int *p_adc)
{
  while (bit_is_set (ADCSRA, ADSC)); //Wait until ADSC is 0

  while (bit_is_set (ADCSRA, ADIF)); //Wait until ADIF is 0

  ADMUX|=channel;    //select channel

  sbi (ADCSRA, ADSC);   //Start Conversation

  p_adc[0]=0;

  p_adc[1]=inp(ADCL);
  p_adc[1]|=(inp(ADCH)<<8);
  p_adc[1]*=Vref*gain/1.024;
  p_adc[2]=p_adc[1];

  while(p_adc[1] >= 1000){
    p_adc[1]-=1000;
    p_adc[0]++;
  }
}

danke für eure hilfe
Gast #40877
Lesenswert?
• ▲
▼
achja....

das main sieht so aus:


int main(void)
{
  unsigned int i,adc[5];

  lcd_init(LCD_DISP_ON);

  for(;;){
    for(i=0;i<10;i++){
      read_adc(0x00, 5, 1, adc); // reacd channel 0
      display_voltage(adc);
      delay(200);
    }

          for(i=0;i<10;i++){
      read_adc(0x01, 5, 1, adc); // reacd channel 1
      display_voltage(adc);
      delay(200);
    }
  }
}
Gast #40878
Lesenswert?
• ▲
▼
er wechselt zwar einmal von channel 0 zu channel 1, aber wenn
ich dnn wieder channel 0 auslesen will, dann bleibt er imemr noch bei
channel 1.

...

  ADMUX|=channel;    //select channel

Ja klar.

channel == 1:  ADMUX |= 1;  alles OK

channel == 0;  ADMUX |= 0; => das ist ein (teurer) NOP, ADMUX ändert
sich nicht.

Du willst wohl eher:

  ADMUX = (ADMUX & ~ADC_CHANNEL_MASK) | channel;

haben (wobei der exakte Wert von ADC_CHANNEL_MASK vom konkreten
Controller abhängt).

  sbi (ADCSRA, ADSC);   //Start Conversation

Hmm, wenn Du oben schon die Bitnotation schreibst, kannst Du sie
hier auch gleich benutzen:

  ADCSRA |= _BV(ADSC);

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 23 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.