Probleme beim Analogeingang einlesen Atmega32

#2427530
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.
#2427578
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
#2427590
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
#2427661
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
}

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