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:
Code:
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
Lesezeichen