Forum: Compiler & IDEs ADC-Wandlung und Timer0


von Gast (Gast)


Lesenswert?

Hallo liebe Forum-Mitglieder!

Ich bin seit Tagen am Herumexperimentieren mit einem Atmega32 und bin 
dabei
auf folgendes Problem gestossen...

Ich möchte innerhalb der Routine einen ADC-Kanal (also eine Spannung) 
abtasten.
Bei Änderung des ADC-Wertes möchte ich dann eine Funktion aufrufen.
Im Prinzip so:

ISR(TIMER0_OVF_vect)
{

//ADC-Messung

//if(ADC_alter_wert!=ADC_aktueller_wert)
//{
//funktionaufruf();
//}

}


Nun möchte ich Euch fragen ob es sinnvoll ist, bzw ob es überhaupt 
machbar ist.

Für einen Tip wäre ich sehr dankbar.

Gruß

von Gast (Gast)


Lesenswert?

Ich würde das alles ausserhalb des Interrupts erledigen.
Der Interrupt setzt dann lediglich Flags welche im Hauptprogramm 
weiterverarbeitet werden.

von ?? (Gast)


Lesenswert?

In einem Interrupt macht man fast nichts ausser dem Hauptprogramm zu 
zeigen dass was ansteht.

von Hannes (Gast)


Lesenswert?

>if(ADC_alter_wert!=ADC_aktueller_wert)

das wird nicht zuverlässig funktionieren. Der ADC-Wert kann immer 1..2 
Digits wandern, auch wenn der eigentliche Messwert konstant ist.

Das solltest Du schon berücksichtigen.

von Gast (Gast)


Lesenswert?

Du kannst es schon machen: Und zwar benötigst du eine globale Variable.
In deiner ISR startest du nun eine ADC Wandlung (Bit zum starten des ADC 
setzen). Das Ergebnis der Wandlung kannst du mit dem alten Wert denn du 
in der gloabalen Variable zuvor gespeichert hast vergleichen und dann 
ggf. deine Unterfunktion aufrufen.

Bedenke aber das der ADC Wert immer (wie oben bereits genannt) um 1-2 
Digits schwankt. Auch bei Konstanter Eingangsspannung.

von Gast (Gast)


Lesenswert?

Vielen Dank für Eure Vorschläge.

Ich werde zuerst den Vorschlag von:
Autor: Gast (Gast)
Datum: 02.08.2009 12:53

ausprobieren...

Ich melde mich wieder, um über die Ergebnisse zu berichten!

Danke :o)

von MWS (Gast)


Lesenswert?

Du brauchst dafür keinen Timer opfern, wenn Du das nicht explizit über 
den Timer machen musst.

Schalte den ADC so, daß er fortwährend sampelt und lass' ihn einen ADC 
Conversion Complete Interrupt ausführen, Samplerate kann über den ADC 
Prescaler eingestellt werden.

In dieser Interrupt Routine hast Du dann bereits ein gültiges ADC 
Ergebnis und musst nicht erst drauf warten.

von STK500-Besitzer (Gast)


Lesenswert?

Und wenn man den alten ADC-Wert ausserhalb der ADC-Routine nicht 
braucht, kann man auch einfach eine statische Variable innerhalb der 
Routine vereinbaren. Muss man aber nicht.

von P. S. (Gast)


Lesenswert?

?? schrieb:
> In einem Interrupt macht man fast nichts ausser dem Hauptprogramm zu
> zeigen dass was ansteht.

Immer der gleiche, unreflektiert nachgebetete Stuss :-/

von Gast (Gast)


Lesenswert?

Morgen!

Danke nachmal für Eure Antworten...

----------------
@Peter Stegemann.
Immer der gleiche, unreflektiert nachgebetete Stuss :-/
Meinst du mich???
----------------

Ich habe das Problem wie folgt gelöst:

in der main() initialisiere ich den Timer und aktiviere den Interrupt.

ISR(TIMER2_OVF_vect)
{

//ADC-Messung

//if(ADC_alter_wert!=ADC_aktueller_wert)
//{
//funktionaufruf();
//}

}

in der Funktion funktionaufruf(); berechne ich den Spannungswert.
Soweit (als Test) läuft es ganz gut. Aber:

PROBLEM:

Ich habe noch einen Timer0 zu laufen und irgendwie vertragen sich die 
beiden nicht miteinander. (Timer0 + Timer2 = Absturz) WARUM ???

Liegt es daran, daß die beiden Timer den gleichen Vorteiler (64) haben?


Gruß

von Karl H. (kbuchegg)


Lesenswert?

Gast schrieb:

> Liegt es daran, daß die beiden Timer den gleichen Vorteiler (64) haben?

Nein.
Es liegt daran, dass du einen Programmfehler hast.

von STK500-Besitzer (Gast)


Lesenswert?

>>?? schrieb:
>> In einem Interrupt macht man fast nichts ausser dem Hauptprogramm zu
>> zeigen dass was ansteht.

>Immer der gleiche, unreflektiert nachgebetete Stuss :-/

Hat aber seine Berechtigung, wenn man in der ISR mit Floats rechnet und 
die dann auch noch auf einem LCD ausgeben lässt...

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.