Für den Drehgeber sollte man die Portwerte nur jeweils einmal in der ISR abfragen. Das kann man zusammen als Byte für einen Port, oder etwas langsamer als Bitwerte machen. Wirklich groß ist da der Unterschied nicht, das geht beides schnell.
Für den Drehgeber sollte man die Portwerte nur jeweils einmal in der ISR abfragen. Das kann man zusammen als Byte für einen Port, oder etwas langsamer als Bitwerte machen. Wirklich groß ist da der Unterschied nicht, das geht beides schnell.
So Besserwessi, die Abfrage der Sensoren funktioniert jetzt tadellos!!! Ich danke Dir vielmals für die Mühe und Deine Zeit! Mein Projekt kann jetzt gleich in die nächsten Probleme weitergehen)) Die ISR sieht jetzt so aus:
Irq_hallsensoren:
Timer1 = Timervorgabe ' Timervorgabe für die Frequenz
Zustandhallsensor1 = Pine.4
Zustandhallsensor2 = Pine.6
If Zustandhallsensor2alt <> Zustandhallsensor2 Then
If Zustandhallsensor1 = 0 Then
'Wechsel 00 auf 01 oder 10 auf 00
If Zustandhallsensor2 = 1 Then
Durchgang2 = 1
Zustandhallsensor2alt = 1
Else
If Durchgang1 = 1 Then
Umdrehungen = Umdrehungen + 1
Durchgang1 = 0
Print #4 , Umdrehungen ; " - " ; Zustandhallsensor1 ; " - " ; Zustandhallsensor2 ' DEBUG
Print #4 , "D2"
Else
End If
Durchgang2 = 0
Zustandhallsensor2alt = 0
End If
End If
End If
If Zustandhallsensor1alt <> Zustandhallsensor1 Then
If Zustandhallsensor2 = 0 Then
'Wechsel 00 auf 10 oder 01 auf 00
If Zustandhallsensor1 = 1 Then
Durchgang1 = 1
Zustandhallsensor1alt = 1
Else
If Durchgang2 = 1 Then
Umdrehungen = Umdrehungen - 1
Durchgang2 = 0
Print #4 , Umdrehungen ; " - " ; Zustandhallsensor1 ; " - " ; Zustandhallsensor2 ' DEBUG
Print #4 , "D1"
End If
Durchgang1 = 0
Zustandhallsensor1alt = 0
End If
End If
End If
Return
Der Code ist noch reichlich unübersichtlich, und auch noch nicht ganz Fehlerfrei. Bis jetzt geht es mit dem Umschalten von Sensor 2 vor und beim Umschalten von Sensor1 nur zurück. Das kann Fehler geben, wenn das Rad etwas vor und zurück geht, um den einen Übergang.
Es muss also bei einer Änderung von Sensor1 entweder vor oder zurück gehen, abhängig davon ob die beiden Sensoren 1 und 2 gleich sind oder nicht. So ähnlich dann auch mit einer Änderung an Sensor2 (wobei das ggf. optional ist wenn weniger Auflösung reicht).
Das speichern der alten Zustände kann man direkt durch Zuweisung machen, also etwas als
Zustandhallsensor1alt = Zustandhallsensor1 am Ende der ISR.
Timer 1 erlaubt auch eine variable Interruptsfrequenz ohne nachladen von Hand.
Ja, da hatte ich mich zu früh gefreut, der Code lief bis auf eine Kleinigkeit, die dann natürlich zum größeren Ärgernis wurde: nested If-Then-If then Else funktionieren nicht ,) Danke für den Timerhinweis - wieder eine Zeile gespart ,)
Die Drehung erfasse ich über Durchgang1 und Durchgang2 - nur wenn vorher die "andere" Seite durchlaufen ist, kommt es zu einer Zählung (so ist zumindest der Plan)... so jetzt Suche ich mal nach einer anderen Schreibweise für meine If thens.....
- - - Aktualisiert - - -
ES GEHT
Das mit der variablen Interruptsfrequenz habe ich nicht gefunden - nur viel über CTC Modi - ich werde also einfach weiter per Hand nachladen
Für alle Interessierten - hier der funktionierende Code....
'#################### Hallsensoren Interruptbehandlung #########################
Irq_hallsensoren:
Timer1 = 51647 ' Timer1 nachladen für ca. 18 Hz
Zustandhallsensor1 = Pine.4
Zustandhallsensor2 = Pine.6
If Zustandhallsensor1alt <> Zustandhallsensor1 Then
If Zustandhallsensor2 = 0 And Zustandhallsensor1 = 1 Then
Durchgang1 = 1
Elseif Zustandhallsensor2 = 0 And Zustandhallsensor1 = 0 And Durchgang2 = 1 Then
Umdrehungen = Umdrehungen - 1
Durchgang2 = 0
'Print #4 , Umdrehungen ; " - " ; Zustandhallsensor1 ; " - " ; Zustandhallsensor2 ' DEBUG
'Print #4 , "D1"
Elseif Zustandhallsensor2 = 0 And Zustandhallsensor1 = 0 And Durchgang2 = 0 Then
Durchgang1 = 0
End If
End If
If Zustandhallsensor2alt <> Zustandhallsensor2 Then
If Zustandhallsensor1 = 0 And Zustandhallsensor2 = 1 Then
Durchgang2 = 1
Elseif Zustandhallsensor1 = 0 And Zustandhallsensor2 = 0 And Durchgang1 = 1 Then
Umdrehungen = Umdrehungen + 1
Durchgang1 = 0
'Print #4 , Umdrehungen ; " - " ; Zustandhallsensor1 ; " - " ; Zustandhallsensor2 ' DEBUG
'Print #4 , "D2"
Elseif Zustandhallsensor1 = 0 And Zustandhallsensor2 = 0 And Durchgang1 = 0 Then
Durchgang2 = 0
End If
End If
Zustandhallsensor1alt = Zustandhallsensor1
Zustandhallsensor2alt = Zustandhallsensor2
Return
Lesezeichen