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ß
Ich würde das alles ausserhalb des Interrupts erledigen. Der Interrupt setzt dann lediglich Flags welche im Hauptprogramm weiterverarbeitet werden.
In einem Interrupt macht man fast nichts ausser dem Hauptprogramm zu zeigen dass was ansteht.
>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.
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.
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)
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.
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.
?? schrieb: > In einem Interrupt macht man fast nichts ausser dem Hauptprogramm zu > zeigen dass was ansteht. Immer der gleiche, unreflektiert nachgebetete Stuss :-/
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ß
Gast schrieb:
> Liegt es daran, daß die beiden Timer den gleichen Vorteiler (64) haben?
Nein.
Es liegt daran, dass du einen Programmfehler hast.
>>?? 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.