www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR ATMEGA48 A/D Wandlung geht immer nur an einen Eingang


Autor: B. Bremer (bib)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich versuche mich momentan daran mit einem ATMEGA48 auf mehreren A/D 
Ports ne Wandlung durchzuführen. Der jeweils erste A/D Port geht auch 
ohne Probleme - sobald ich aber einmal mit ADMUX umschalte kommt nix 
dolles mehr raus. (Wohlgemerkt - vertausche ich die Reihenfolge geht der 
andere Port) Hier mal mein Code - würde mich freuen wenn mir jemand 
helfen könnte:

Die Definitions
//definitions for AD
#define Vcc (0 << MUX3) | (0 << MUX2) | (0 << MUX1) | (1 << MUX0)
//definition for OPV
#define mess_opv (0 << MUX3) | (0 << MUX2) | (0 << MUX1) | (0 << MUX0)



Init des A/D Wandlers:

// AD Init     //
  DIDR0 |= (1 << ADC5D) | (1 << ADC4D) | (1 << ADC3D) | (1 << ADC2D) | (0 << ADC1D) | (0 << ADC0D); //diable not needed AD Ports
  ADCSRA |= (0 << ADEN) | (0 << ADATE) | (1 << ADIF) | (0 << ADIE) |(1 << ADPS2) | (0 << ADPS1) | (0 << ADPS0); //Leave AD disabled & prescale factor 16
  ADMUX |= (1 << REFS1) | (1 << REFS0);  //Internal reference with external capacitor


und hier die beiden A/D Funktionen:

uint16_t AD_START(void)
{
  uint16_t ret;  //for the return value

  ADCSRA |= (1 << ADEN);  // Enable the AD

  ADCSRA |= (1<<ADSC);  //start conversion

  //wait for end
  while (ADCSRA & (1<<ADSC))
  {
  }

  ret = ADCL;
  ret += (ADCH << 8);


  ADCSRA |= (1 << ADIF); // clear the interrupt
  ADCSRA |= (0 << ADEN);  // Disable the AD (Saves power)
  return ret;
}

void MeasureAD(void)
{


  PORTD = (1 << DDD4);  //Enable OPV (nur für eine externe Beschaltung)


  ADMUX |= Vcc;
  printf("Vcc: %i\n", AD_START());  //diese geht noch

  _delay_ms(500);

  ADMUX |= mess_opv;
  printf("OPV: %i\n", AD_START()); // diese nicht mehr


  _delay_ms(500);

  ADMUX |= Vcc;
  printf("Vcc: %i\n", AD_START()); //diese auch nicht

}

Aus dem Hauptprogramm wird MeasureAD gerufen. Die Wartezeiten sind 
aufgrund des Debuggens drinnen. Nach meinen Verständnis sollte es auch 
ohne gehen. Währe super wenn jemand helfen könnte.

Gruss Birk

Autor: Stefan Wimmer (wswbln)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...hab' jetzt nicht in's Datenblatt geschaut und Deinen Code auch nur 
kurz überflogen, aber Du oderst da mehrere Werte auf das ADMUX-Register 
(um Bits zu setzen) - wann setzt Du die wieder zurück?

Autor: B. Bremer (bib)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok - vielen Dank - das wars!

Immer diese DAUs... :-)

Gruss & Gute Nacht....

Birk

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.