Atmega8 mehrere ADC Kanäle auslesen

OP #4140621
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
}
Moderator (Firma: Titel) Persönliche Seite #4140677
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]
#4140701
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
OP #4140734
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

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.