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)
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
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)
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
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
Lesezeichen