www.mikrocontroller.net

Forum: Compiler & IDEs ADC-Wandlung und Timer0


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Gast (Gast)
Datum:

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

Autor: ?? (Gast)
Datum:

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

Autor: Hannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: P. S. (Gast)
Datum:

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

Immer der gleiche, unreflektiert nachgebetete Stuss :-/

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gast schrieb:

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

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

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.