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