Forum: Mikrocontroller und Digitale Elektronik Probleme beim Analogeingang einlesen Atmega32


von stephan b. (stu)


Lesenswert?

Hallo nochmal,
ich bräuchte nochmal hilfe bei meinem Projekt.
Ich möchte mit einem Atmega32 an einem Spannungsteiler eine Spannung 
0-5V messen. Eigentlich sollte das ganze an einem LCD-Diplay angezeigt 
werden aber mir reicht erstmal irgendeine anzeige. Leider bekomme ich es 
nicht mal hin, mir den umgewandelten Wert an einer LED Reihe anzeigen zu 
lassen.
1
#include <avr/io.h>
2
#include <avr/lcd-pollin-jumper.h> //Bitte lib in ordner kopieren!
3
#define F_CPU 16000000UL
4
#include <util/delay.h> //Standardverzögerungs Lib
5
#define F_CPU 16000000UL
6
7
uint16_t result;
8
9
void ADC_init(void)
10
{
11
12
13
ADMUX = (1<<REFS1) | (1<<REFS1); //int. Referenzspannung
14
ADCSRA = (1<<ADPS1) | (1<<ADPS0); //Vorteiler setzen
15
ADCSRA |= (1<<ADEN); //ADC aktivieren
16
17
ADCSRA |= (1<<ADSC); //einmal auslösen
18
while(ADCSRA & (1<<ADSC)){} //warte bis fertig
19
result = ADCW; //Ergebnis
20
}
21
22
uint16_t ADC_Read (uint8_t channel)
23
{
24
ADMUX = (ADMUX & ~(0x1f)) | (channel & 0x1f);
25
ADCSRA |= (1<<ADSC); 
26
while (ADCSRA & (1<<ADSC)){} //warte bis fertig
27
return ADCW; //ADC ausgeben und zurückgeben
28
}
29
30
int main(void)
31
{
32
DDRA = 0b00000000;
33
DDRB = 0b11111111;
34
DDRC = 0b11111111;
35
DDRD = 0b11111111;
36
37
while(1)  
38
{
39
  ADC_init;
40
        PORTD = ADC_Read (0);
41
42
}
43
}

ich habe es auch schon mit dieser version probiert:
1
while(1)  
2
{
3
  ADC_init;
4
        ADC_Read (0);
5
        PORTD = result;
6
}

oder mit dieser:
1
while(1)  
2
{
3
  ADC_init;
4
        ADC_Read (0);
5
        PORTD = ADCW;
6
}
aber egal wie groß die Spannung am Eingang ist, die LEDS an Port D 
bleiben dunkel.

von Frank L. (franklink)


Lesenswert?

Hallo Stefan,
schau Dir mal im Datenblatt vom Mega32 die Seite 214 die Tabelle "ADC 
Multiplexing Selection Register - ADMUX" an und vergleiche mit Deinen 
Daten, ich denke, dann fällt Dir Dein Fehler direkt auf.

Ein Tipp, der Fehler liegt in dieser Zeile:
1
ADMUX = (ADMUX & ~(0x1f)) | (channel & 0x1f);

Gruß
Frank

von stephan b. (stu)


Lesenswert?

Mein Fehler lag in dieser Zeile:
1
ADMUX = (1<<REFS1) | (1<<REFS1); //int. Referenzspannung
es müsste aber:
1
ADMUX = (1<<REFS1) | (1<<REFS0); //int. Referenzspannung
heißen.
Die Referenzspannung ist zu klein das habe ich mittlerweile auch 
gemerkt. Aber das bekomme ich durch änderung des Spannungsteilers in den 
Griff. Danke trotzdem für die Mühe

von Frank L. (franklink)


Lesenswert?

Hallo Stefan,
stimmt und ich hatte gerade ein boolsches Brett vor dem Kopf...

Gruß
Frank

von Karl H. (kbuchegg)


Lesenswert?

Mag alles sein. Allerdings ist das alles nicht der Hauptfehler.

Der Hauptfehler ist, dass hier
1
while(1)  
2
{
3
  ADC_init;
4
        PORTD = ADC_Read (0);
5
6
}

kein Funktionsaufruf der Funktion ADC_init steht. C ist nicht Pascal. 
Die Funktionsaufrufklammern fehlen.

Und btw. Es macht nicht viel Sinn, innerhalb der Schleife den ADC 
ständig neu zu initialisieren. Initialisierungen macht man nur einmal:
1
  ...
2
3
  ADC_init();
4
5
  while(1)  
6
  {
7
    PORTD = ADC_Read (0);
8
  }
9
}

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.