Forum: Mikrocontroller und Digitale Elektronik Immer gleicher Wert am ADC (ATMEGA8)


von Dennis (Gast)


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

von Stefan E. (sternst)


Lesenswert?

Dennis schrieb:
> Hat jemand ne Idee?

Deine main-Funktion endet. Nach main() kommt eine Endlosschleife bei 
ausgeschalteten Interrupts.

von cppler (Gast)


Lesenswert?

Dennis schrieb:
> int main()
> {
>   DDRC |= (1<<PC5);
>   PORTC &= ~(1<<PC5);
>   sei();
>   ADC_Init();
>
> }

Wie schon erwähnt fehlt die Endlosschleife:
1
int main()
2
{
3
  DDRC |= (1<<PC5);
4
  PORTC &= ~(1<<PC5);
5
  sei();
6
  ADC_Init();
7
  while(1);
8
}

von Hubert G. (hubertg)


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.

von Malte S. (maltest)


Lesenswert?

Nebenbei:

> wert = ADCL;
>   wert += (ADCH<<8);

GCC kann das doch alleine...
wert = ADC;

von Dennis (Gast)


Lesenswert?

Die while Schleife... Wie peinlich...
Aber danke, vor lauter Stress übersieht man diese triviales... 
funktioniert alles, danke euch ;)

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.