PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tachosignal ohne Timer



BoGe-Ro
06.09.2010, 08:29
Hallo Forum,

ich habe hier einen Lüfter, welcher ein drehzahlabhängiges TTL-Signal ausgibt.
Je höher die Drehzahl, umso höher die Frequenz des Tachosignals.

Da ich im ATMEGA 128 die Timer 0-3 bereits verwende, möchte ich die Drehzahl über den INT5-Interrupt ermitteln.


folgenden Codeauszug wollte ich dazu verwenden:



Onint5:
Toggle Flanke 'INT5 - Interruptroutine
Toggle Testpin
Return


Function Tacho() As Long
'bei Lüfter-PWM-Wert=40 ergeben sich ca. 27ms
Local Periodendauer As Long
Periodendauer = 0
If Ocr0 >= 100 Then
Flanke = 0
Bitwait Flanke , Set 'auf 1. Flanke warten
Print "weiter geht's"
'Do : Incr Periodendauer : Loop Until Flanke = 0
End If
Reset Testpin
Disable Int5
Tacho = Periodendauer
End Function



das enable INT5 erfolgt 30ms vorher, da mir auffiel, wenn ich es erst in o. a. Function ausführe, ich keine Signale am Testpin erhalte.

Am Oszilloskop sehe ich, dass bei erlaubtem INT5-Interrupt der Testpin toggelt.
Wird OCR0 (Lüfter-PWM) nun > 100 wartet sich die Bitwait-Anweisung zu tode und mein Controller steht still.
Nichtmal die INT5-Serviceroutine wird noch ausgeführt.

Warum wird die Bitwait-Schleife nie beendet? Ein Ersatz gegen ein
Do : Loop until Flanke = 1 ändert ebenfalls nichts an dem Problem.
Gebe ich testhalber den Wert von Flanke in der Serviceroutine aus, erhalte ich ebenfalls nullen und einsen.

Wo ist der Haken?


mfG BoGe-Ro

PicNick
06.09.2010, 09:28
Wenn du "Bitwait" verwendest, ist ein Interrupt eigentlich sinnlos.
das Toggeln im Interrupt und das Flanke=0 in der SUB sind ja nicht synchronisiert.
Frag' doch das INT5-Bit selbst ab oder mit "PULSEIN" (--> type "help" for help)

BoGe-Ro
06.09.2010, 09:40
Hallo,

das Flanke=0 soll ja der Synchronisation - ich warte auf eine Flanke, da die Funktion ja unsynchron zur auszuwertenden Periode beginnt, setze Flanke auf 0 und beginne danach die Ausmessung der folgenden Periode. So zumindest mein Plan :-)

Den Fehler hab ich mitlerweile auch gefunden - das direkte Abfragen von OCR0 führte zum Absturz.
Umladen während SREG.7=0 in eine Variable, anschließende Auswertung dieser Variable führte dann zum Erfolg.

Ich werd aber deinen Vorschlag mal testen und es mit PULSEIN versuchen - und danach mal die Ergebnisse gegenüberstellen