Hallo zusammen,
ich versuche gerade einen 10 Kanal Schalter für ein RC Signal zu programmieren. Leider funktioniert es noch nicht so, wie es soll. Einen 4 Kanal Schalter mit Memory Funktion habe ich schon mal programmiert. Dort habe ich die PPM Abfrage auch auf diesem Weg gemacht. Das funktioniert auch so.
Meine Idee:
Es wird Abfragt, ob der Hebel nach oben ausgelenkt ist. Wenn ja, soll er so lange warten, bis der Hebel wieder in Mittelstellung ist. Ist er in Mittelstellung, so wird eine Variable ( Zaehler_oben ) um 1 erhöht. Danach wird wieder gefragt, ob der Hebel oben oder in Mittelstellung ist. Ist er in Mittelstellung, wird in ein Unterprogramm gesprungen ( Select Case ), wo dann entsprechend von 1 - 5 ein Ausgang geschaltet wird. Dann wird 2 Sekunden gewartet und es wieder erneut abgefragt. Sollte der Hebel bei der 2. Abfrage nicht in der Mittelstellung sein, sondern wieder oben, so wird die Variable wieder um 1 erhöht.
So die Theorie. In der Praxis funktioniert das leider nicht. Der Einfachheit halber habe ich das ganze erstmal mit den Kanälen 1 - 5 gemacht. Also nur eine Richtung am Sender. Wenn es hier funktioniert, kann ich die 2. Richtung ja noch hinzufügen.
Habt ihr eine Idee, was es sein könnte ? Habe es mal versucht so gut wie möglich zu kommentieren.
Hier nun der Code:
Alles anzeigen
ich versuche gerade einen 10 Kanal Schalter für ein RC Signal zu programmieren. Leider funktioniert es noch nicht so, wie es soll. Einen 4 Kanal Schalter mit Memory Funktion habe ich schon mal programmiert. Dort habe ich die PPM Abfrage auch auf diesem Weg gemacht. Das funktioniert auch so.
Meine Idee:
Es wird Abfragt, ob der Hebel nach oben ausgelenkt ist. Wenn ja, soll er so lange warten, bis der Hebel wieder in Mittelstellung ist. Ist er in Mittelstellung, so wird eine Variable ( Zaehler_oben ) um 1 erhöht. Danach wird wieder gefragt, ob der Hebel oben oder in Mittelstellung ist. Ist er in Mittelstellung, wird in ein Unterprogramm gesprungen ( Select Case ), wo dann entsprechend von 1 - 5 ein Ausgang geschaltet wird. Dann wird 2 Sekunden gewartet und es wieder erneut abgefragt. Sollte der Hebel bei der 2. Abfrage nicht in der Mittelstellung sein, sondern wieder oben, so wird die Variable wieder um 1 erhöht.
So die Theorie. In der Praxis funktioniert das leider nicht. Der Einfachheit halber habe ich das ganze erstmal mit den Kanälen 1 - 5 gemacht. Also nur eine Richtung am Sender. Wenn es hier funktioniert, kann ich die 2. Richtung ja noch hinzufügen.
Habt ihr eine Idee, was es sein könnte ? Habe es mal versucht so gut wie möglich zu kommentieren.
Hier nun der Code:
BASCOM-Quellcode
- '*************************************************************************************************
- '* *
- '* 10 Kanalschalter mit Tiny2313 *
- '* *
- '* 10 Kanal Schalter mit memoy Funktion. 5 x nach oben oder 5 x nach unten *
- '* *
- '*************************************************************************************************
- $regfile = "attiny2313.dat"
- $crystal = 8000000
- $hwstack = 16
- $swstack = 8
- $framesize = 24
- ' Die Portbelegung ist wie folgt:
- ' Kanal1 = PB0
- ' Kanal2 = PB1
- ' Kanal3 = PB2
- ' Kanal4 = PB3
- ' Kanal5 = PB4
- ' später noch K6 - 10
- ' RC Signal an PD4
- 'Alias festlegen:
- K1 Alias Portb.0
- K2 Alias Portb.1
- K3 Alias Portb.2
- K4 Alias Portb.3
- K5 Alias Portb.4
- ' Ein/Ausgänge konfigurieren
- Config Portb = Output
- Config Pind.4 = Input
- 'Variabeln festlegen:
- Dim Ppm As Byte
- Dim Mittelpunkt As Byte
- Dim Oberer_nullpunkt As Byte
- Dim Unterer_nullpunkt As Byte
- Dim Zaehler_oben As Byte
- Dim Zaehler_unten As Byte
- Zaehler_oben = 0 ' Zahler_oben auf 0 setzen
- ' Erstmal alle Ausgänge ausschalten ( 0 = EIN, 1 = Aus ):
- K1 = 1
- K2 = 1
- K3 = 1
- K4 = 1
- K5 = 1
- ' Warten, bis ein ordentliches Signal vom Empfänger kommt:
- Do
- Ppm_abfrage:
- Pulsein Ppm , Pind , 4 , 1 ' Signal an PIND4 messen
- If Ppm < 10 Then ' ist der Wert kleiner als 10 Than
- nop ' mache nichts
- Else ' Ansonsten
- Goto Los ' Gehen zu los
- End If
- Loop
- ' Jetzt beginnt das Hauptprogramm:
- Los:
- Wait 2 ' Warte 2 Sekunden
- Pulsein Mittelpunkt , Pind , 4 , 1 ' Signal an PIND4 messen
- Oberer_nullpunkt = Mittelpunkt + 2 ' Oberer Nullpunkt ist Mittelpunkt + 2
- Unterer_nullpunkt = Mittelpunkt - 2 ' unterer Nullpunkt ist Mittelpunkt - 2
- Do
- Pulsein Ppm , Pind , 4 , 1 ' Sigmal an PIND4 messen und als PPm speichern
- If Ppm > Oberer_nullpunkt Then ' Ist PPM größer als Oberer Nullpunkt ( Knüppel hoch ) ? Wenn ja ...
- Incr Zaehler_oben ' Variable Zähler_oben um 1 erhöhen
- End If ' Ende der If Abfrage
- Do
- Loop Until Ppm < Oberer_nullpunkt And Ppm > Unterer_nullpunkt ' Warte solange, bis Knüppel wieder in Mittelstellung ist
- Wait 1 ' Warte 1 Sekunde
- If Ppm > Oberer_nullpunkt Then ' Ist Knüppel immer noch nach oben ? Wenn ja ...
- Incr Zaehler_oben ' Variable Zähler_oben um 1 erhöhen
- Do
- Loop Until Ppm < Oberer_nullpunkt And Ppm > Unterer_nullpunkt ' Warte bis Knüppel wieder in Mittelstellung ist
- Else ' Ansonsten
- Gosub Zaehler_oben_abfrage ' Gehe zu Zähler_oben_Abfrage
- End If
- Loop ' Spriinge wieder zurück
- ' Hier werden nun die Zähler abgefragt und entschieden, was passiert.
- Zaehler_oben_abfrage:
- Select Case Zaehler_oben
- Case 1 : Toggle K1 ' Ist Zähler_oben = 1, dann Toggle K1
- Case 2 : Toggle K2 ' Ist Zähler_oben = 1, dann Toggle K1
- Case 3 : Toggle K3 ' Ist Zähler_oben = 1, dann Toggle K1
- Case 4 : Toggle K4 ' Ist Zähler_oben = 1, dann Toggle K1
- Case 5 : Toggle K5 ' Ist Zähler_oben = 1, dann Toggle K1
- Case 6 To 255 : Zaehler_oben = 0 ' Ist Zähler_oben zwischen 6 und 255 setze Zähler_oben auf 0
- Wait 2 ' Warte 2 Sekunden
- End Select ' Ende der Auswahl.
- Return ' springe aus dem Unterprogramm zurück.