Forum: Mikrocontroller und Digitale Elektronik Atmega8 mehrere ADC Kanäle auslesen


von Asd J. (digim)


Lesenswert?

Hey Leute
Ich möchte gerne mit einem Atmega8 zwei Akkus mittels ADC auslesen und 
den jeweiligen Wert auf einem Display anzeigen lassen.

ich hab folgendes Problem:
-ADC funktioniert nur an Pin-PC0 und zeigt diesen Wert als adc(0) und 
adc(1) an ( also auf zwei Zeilen gleizeitig )
-ADC1 zeigt den Wert 0 dauerhaft an an wenn ich einen Akku an PC1 klemme


das ist der Code:
1
#include <stdlib.h>
2
#include <stdio.h>        
3
#include <avr/io.h>
4
#include <avr/pgmspace.h>
5
#include <stdint.h>
6
#define F_CPU 3686400UL
7
#include <util/delay.h>
8
9
#include "lcd_162.h"
10
11
12
uint16_t adc(uint8_t mux)
13
{
14
     uint16_t result;
15
 
16
    ADMUX |= (mux & 0b00000111);   // Kanal waehlen
17
 
18
  ADMUX = (0<<REFS1)|(1<<REFS0);
19
  
20
21
  //Frequenzvorteiler setzen und ADC aktivieren
22
  ADCSRA = (1<<ADPS1)|(1<<ADPS0);            //Frequenzvorteiler
23
  ADCSRA |= (1<<ADEN)|(1<<ADIE);            //ADC aktivieren
24
      
25
    // Dummy-readout
26
    ADCSRA |= (1<<ADSC);                // eine ADC-Wandlung 
27
    while ( ADCSRA & (1<<ADSC) )
28
    {  ;             // auf Abschluss der Konvertierung warten 
29
    }
30
  
31
  result = ADCW;    
32
    
33
  ADCSRA &= ~(1<<ADEN);       // ADC deaktivieren
34
   ADMUX &= ~0b00000111; // alten Kanal loeschen
35
  return result;
36
}
37
38
39
40
41
int main(void)
42
{  
43
  char buffer[20];            
44
  DDRB=0xFF;                   //Port B als Ausgänge definieren
45
  DDRC=0x00;                    //Port C als Eingänge definieren
46
  lcd_init();
47
48
  uint16_t akku1;
49
  uint16_t akku2;
50
while(1)
51
{    akku1=adc(0);
52
    akku2=adc(1);
53
  lcd_write_zeile(itoa(akku1, buffer,10),1); // Adc Wert von PC0 in Zeile 1 anzeigen 
54
  lcd_write_zeile(itoa(akku2, buffer,10),2); // Adc Wert von PC1 in Zeile 2 anzeigen 
55
56
  _delay_ms(50);
57
}
58
}

von Fritz G. (fritzg)


Lesenswert?

Du setzt den Kanal und löscht ihn in der nächsten Zeile.

von Asd J. (digim)


Lesenswert?

wo meinst du genau ?

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Fritz Ganter schrieb:
> Du setzt den Kanal und löscht ihn in der nächsten Zeile.

Asd Jul schrieb:
> wo meinst du genau ?

Asd Jul schrieb:
1
ADMUX |= (mux & 0b00000111);   // Kanal waehlen
2
ADMUX = (0<<REFS1)|(1<<REFS0);

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

@Asd Jul:
Bitte 1. keine Doppelpostings
und 2. Fragen nicht NICHT im Projekte&Code Forum. Dort steht klar und 
leserlich:
1
Hier könnt ihr eure Projekte, Schaltungen oder Codeschnipsel 
2
vorstellen und diskutieren. Bitte hier keine Fragen posten!
Zudem hat dein Problem mit dem GCC an sich nichts zu tun. Du hast kein 
Problem mit dem Compiler, sondern mit dessen Anwendung...

EDIT: und um den Quelltext herum kannst du die pasenden Tokens machen:
1
[c]
2
  C-Quelltext
3
[/c]

von Asd J. (digim)


Lesenswert?

cool danke für den Hinweis :-)
Die mageren Infos bringen mich leider nicht weiter.

Kann man das auch noch ein bisschen mit Leben füllen :-) ?

von schwach (Gast)


Lesenswert?

Magnus M. schrieb:
> Asd Jul schrieb:
>
1
> ADMUX |= (mux & 0b00000111);   // Kanal waehlen
2
> ADMUX = (0<<REFS1)|(1<<REFS0);
3
>

@Asd Jul: Weißt du nicht was die beiden Anweisungen machen? und welche 
Bits danach im ADMUX stehen?

von Dietrich L. (dietrichl)


Lesenswert?

Asd Jul schrieb:
> Die mageren Infos bringen mich leider nicht weiter.
>
> Kann man das auch noch ein bisschen mit Leben füllen :-) ?

Mit der Zuweisung
1
ADMUX =
werden alle Bits des Registers überschrieben, also auch die in der 
Zeile vorher eingestellten Bits des Kanals.
Wenn Du nicht alle Bits ändern willst, brauchst Bitmanipulation: 
https://www.mikrocontroller.net/articles/Bitmanipulation

Gruß Dietrich

von Asd J. (digim)


Lesenswert?

Anscheinend nicht richtig :D

Also ich dachte das ich in der ersten Zeile die Kanäle abwähle und in 
der zweiten die Referenz für den Adc

Aber klär mich auf :-)

von schwach (Gast)


Lesenswert?

schwach schrieb:
> ... und welche Bits danach im ADMUX stehen?

@Asd Jul: Ich kläre Denkfaule nicht auf. Da gibt es genug Schriften 
drüber.

von Asd J. (digim)


Lesenswert?

@schwach
Also so Kommentare kannst du dir auch echt sparen. Sowas macht mich 
sauer. Da kommt man ma nicht direkt auf die Lösung und hat Vll auch noch 
Wissesnlücken und wird dann als Denkfaul bezeichnet.
Das is echt das letzte.Dann musste auch nix in Foren kommentieren.

@Dietrich
Danke für den Tipp. Ich werde ihn gleich mal ausprobieren

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.