Zwei ADC Messungen gleiches Ergebnis ATMega1280

OP #2289029
Lesenswert?

Hallo zusammen,

Ich möchte mit meinem ATMEGA1280 zwei Spannungen an zwei verschiedenen 
ADC-Eingängen messen. Ich erhalte aber immer das gleiche Ergebnis. Immer 
die Spannung des ersten.
Als erstes Initialisiere ich den ADC:
1
void adcinit(void)
2
{
3
  uint16_t result;
4
  
5
  ADMUX |= (1<<REFS0);                // AVCC als Referenzspannung nutzen
6
  ADCSRA = (1<<ADPS1) | (1<<ADPS2);         // Frequenzvorteiler 64
7
  ADCSRA |= (1<<ADEN);                    // ADC aktivieren
8
  
9
  ADCSRA |= (1<<ADSC);                     // eine ADC-Wandlung 
10
  while (ADCSRA & (1<<ADSC) ) {}           // auf Abschluss der Konvertierung warten
11
  
12
  result = ADCW;                // ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten Wandlung nicht übernommen.
13

14
}

Dann lese ich die zwei Spannungen hintereinander in einer Funktion ein:
1
void spgmessungakkus(void)
2
{
3
  float umrechnung = 0;
4
   
5
  //Akkuspg Hauptplatine
6
  ADMUX |= (1<<MUX0) | (1<<MUX1) | (1<<MUX2);   // Kanal wählen; hier: ADC7
7
  ADCSRA |= (1<<ADSC);                      // eine Wandlung "single conversion"
8
  while (ADCSRA & (1<<ADSC) ) {}            // auf Abschluss der Konvertierung warten
9
  
10
  umrechnung = ADCW;                         // ADC auslesen und speichern
11
  
12
  umrechnung = umrechnung*3300/1024;
13
  reg1[0] = umrechnung * 2;
14
  sprintf(spgakkuplatine, "%d.%02d", (reg1[0]/1000), (reg1[0] % 1000)/10);
15
  
16
  //Akkuspg Heizung
17
  ADMUX |= (1<<MUX1) | (1<<MUX2);           // Kanal wählen; hier: ADC6
18
  ADCSRA |= (1<<ADSC);                      // eine Wandlung "single conversion"
19
  while (ADCSRA & (1<<ADSC) ) {}            // auf Abschluss der Konvertierung warten
20
  
21
  umrechnung = ADCW;                         // ADC auslesen und speichern
22
  
23
  umrechnung = umrechnung*3300/1024;
24
  reg1[1] = umrechnung*2;
25
  sprintf(spgheizung, "%d.%02d", (reg1[1]/1000), (reg1[1] % 1000)/10);
26
}

Es liegen zur Zeit 0V an ADC6 an, trotzdem wird aber die Spannung vom 
ADC7 angezeigt!
Vielen Dank für eure Hilfe.
OP #2289034
Lesenswert?

hdd schrieb:
> ADMUX |= (1<<MUX1) | (1<<MUX2);           // Kanal wählen; hier: ADC6
> Damit löschst du nicht MUX0, mach mal aus dem |= nur ein =

Lösche ich damit nicht auch meine Einstellungen zur Referenzspannung?
Ich habs jetzt mal mit den Zusatz ADMUX &= ~(1<<MUX0); gelöst.
Jetzt funktioniert es! Danke. Da hätte ich ja auch selber drauf kommen 
können...
#2289043
Lesenswert?

Hi Bene Jan,
ich verstehe zwar nix von deinem C Quelltext , biete dir aber
folgendes an:



ADMUX = REFS1  REFS0  ADLAR  MUX4  MUX3  MUX2  MUX1 / MUX 0

gewünscht ist Ref = AVCC .. entspricht 01xxxxxx

Zudem gewünscht ist Kanal 6 = xx000110
und alternativ kanal 7      = xx000111

Die Grundeinstellung für ref = Avcc und kanal 0 ist also:
ADMUXBASIS = &b01000000


Wenn jetzt Kanalnummer in var "Kanal" gespeichert ist kannst du den 
Kanal (5Bit)
ja schonmal so isolieren : Kanal = Kanal and &B00011111

.. nun sind nur noch 5Bit aktiv.

admux = admuxbasis or Kanal setzt dir dann den Kanal.

Ich hoffe es hilft.

Gruss Klaus

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