AVR ATMEGA48 A/D Wandlung geht immer nur an einen Eingang

OP #1061409
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren