Immer gleicher Wert am ADC (ATMEGA8)

Gast #3005422
Lesenswert?

Guten Abend alle zusammen,
ich habe folgendes Problem mit meinem ADC:
Das ADC-Werte Register bleibt irgendwie immer beim ersten gelesenen Wert 
"hängen", es ändert sich also nicht mehr.
1
#include <avr/io.h>
2
#include <avr/delay.h>
3
#include <avr/interrupt.h>
4

5
uint16_t wert;
6
ISR(ADC_vect)
7
{
8
  wert = ADCL;       
9
  wert += (ADCH<<8);
10
  if(wert < (uint16_t)500)  PORTC |= (1<<PC5);
11
  else if(wert > (uint16_t)524)  PORTC &= ~(1<<PC5);
12
}
13

14
void ADC_Init(void) {
15

16

17
  // interne Referenzspannung als Refernz für den ADC wählen:
18
  ADMUX = (1<<REFS0);
19

20
  ADCSRA = (1<<ADPS1) | (1<<ADPS2)| (1<<ADPS0);     // Frequenzvorteiler
21
  ADCSRA |= (1<<ADEN) | (1<<ADFR) | (1<<ADIE);
22
  ADCSRA |= (1<<ADSC);
23
  _delay_ms(100);
24
  wert = ADCL;       
25
  wert += (ADCH<<8);
26
  ADCSRA |= (1<<ADSC);
27

28
   // ADC aktivieren
29

30
}
31

32

33

34
int main()
35
{
36
  DDRC |= (1<<PC5);
37
  PORTC &= ~(1<<PC5);
38
  sei();
39
  ADC_Init();
40

41
}
Der erste eingelesene Wert (siehe Interrupt) scheint sich nicht mehr zu 
ändern und, denn der Port bleibt etwa HIGH oder LOW, egal, was für eine 
Spannung ich am ADC-Eingang anlege.
Ich hab schon wie doof das Datenblatt studiert und überlegt, ob ich 
irgendwas falsch gemacht habe, aber ich wüsste nicht was.

Hat jemand ne Idee?
LG
#3005556
Lesenswert?

Es macht auch keinen Sinn den ADC bei jedem Durchlauf neu zu 
initialisieren. Initialisieren genügt einmal im main, Start und Abfrage 
dann in der Endlosschleife.
Das delay ist auch nicht sehr sinnvoll, besser wäre ein
1
while (!(ADCSRA & (1<<ADIF)))
da wird nicht länger gewartet als notwendig. Noch besser wäre die 
zugehörige ISR.

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