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


von B. B. (bib)


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
1
//definitions for AD
2
#define Vcc (0 << MUX3) | (0 << MUX2) | (0 << MUX1) | (1 << MUX0)
3
//definition for OPV
4
#define mess_opv (0 << MUX3) | (0 << MUX2) | (0 << MUX1) | (0 << MUX0)


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


und hier die beiden A/D Funktionen:
1
uint16_t AD_START(void)
2
{
3
  uint16_t ret;  //for the return value
4
5
  ADCSRA |= (1 << ADEN);  // Enable the AD
6
7
  ADCSRA |= (1<<ADSC);  //start conversion
8
9
  //wait for end
10
  while (ADCSRA & (1<<ADSC))
11
  {
12
  }
13
14
  ret = ADCL;
15
  ret += (ADCH << 8);
16
17
18
  ADCSRA |= (1 << ADIF); // clear the interrupt
19
  ADCSRA |= (0 << ADEN);  // Disable the AD (Saves power)
20
  return ret;
21
}
22
23
void MeasureAD(void)
24
{
25
26
27
  PORTD = (1 << DDD4);  //Enable OPV (nur für eine externe Beschaltung)
28
29
30
  ADMUX |= Vcc;
31
  printf("Vcc: %i\n", AD_START());  //diese geht noch
32
33
  _delay_ms(500);
34
35
  ADMUX |= mess_opv;
36
  printf("OPV: %i\n", AD_START()); // diese nicht mehr
37
38
39
  _delay_ms(500);
40
41
  ADMUX |= Vcc;
42
  printf("Vcc: %i\n", AD_START()); //diese auch nicht
43
44
}

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

von Stefan W. (wswbln)


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?

von B. B. (bib)


Lesenswert?

Ok - vielen Dank - das wars!

Immer diese DAUs... :-)

Gruss & Gute Nacht....

Birk

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.