Forum: Mikrocontroller und Digitale Elektronik ADC ATMEGA328P


von Frank W. (frankydaniels)


Lesenswert?

Hallo zusammen,

ich sehe momentan wohl den Wald vor lauter Bäumen nicht. Darum poste ich 
es hier und hoffe, dass jemand den Fehler gleich erkennt.

Ich versuche eine ADC-Wandlung im Freerunningmode zu starten. Nach einer 
Wandlung eines Wertes soll ein Interrupt aufgerufen werden, der den Wert 
in einem Array speichert. Nach 200 Werten soll dann mit dem Array 
gerechnet werden.

Mein Problem ist nun, dass die AD-Wandlung nicht stattfindet, oder 
zumindest der Interrupt nie aufgerufen wird. Eigentlich kann das ja nur 
an der Initialisierung liegen oder?

Hier ist die Initialisierung:
1
//ADC Init
2
  ADMUX = (1 << REFS0);//interne Referenz = Betriebsspannung
3
  
4
  ADCSRA = (1<<ADATE) | (1 << ADEN) | (1 << ADIE) | (1 << ADPS2) | (1 << ADPS1);
5
  //Free Running mode, ADC=Ein, ADC Interrupt enable, Prescaler 64 = 125kHz bei F_CPU = 8Mhz
6
    
7
  sei();                            // Set the I-bit in SREG
8
9
  ADCSRA= (1<<ADSC); //AD-Wandler starten (Free Running Mode)

Meine ISR habe ich nun auf das Einschalten einer einzigen LED 
komprimiert:
1
ISR(ADC_vect)
2
{
3
  PORTC |= (1<<PORTC3);
4
}

Diese LED leuchtet aber nie (sie funktioniert, habe sie im Hauptprogramm 
schon öfters zum Debuggen benutzt)

Ich sehe den Fehler leider nicht. Oder funktioniert mein Vorhaben von 
Grund auf nicht?

Vielen Dank schon mal im Vorraus

Mfg Franky :)

von Dietrich L. (dietrichl)


Lesenswert?

Frank Waller schrieb:
1
ADCSRA = (1<<ADATE) | (1 << ADEN) | (1 << ADIE) | (1 << ADPS2) | (1 << ADPS1);
2
...
3
ADCSRA= (1<<ADSC); //AD-Wandler starten (Free Running Mode)
In der unteren Zeile überschreibst Du alle vorher gesetzten Bits.
Es muss also heißen:
1
ADCSRA |= (1<<ADSC); //AD-Wandler starten (Free Running Mode)

Gruß Dietrich

von Frank W. (frankydaniels)


Lesenswert?

Dietrich L. schrieb:
> Frank Waller schrieb:
> ADCSRA = (1<<ADATE) | (1 << ADEN) | (1 << ADIE) | (1 << ADPS2) | (1 <<
> ADPS1);
> ...
> ADCSRA= (1<<ADSC); //AD-Wandler starten (Free Running Mode)
> In der unteren Zeile überschreibst Du alle vorher gesetzten Bits.
> Es muss also heißen:ADCSRA |= (1<<ADSC); //AD-Wandler starten (Free
> Running Mode)
>
> Gruß Dietrich

Oh danke wie blöd von mir^^ Eigentlich hatte ich noch daran gedacht aber 
es dann wohl doch nicht gemacht.

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.