
RC5-Steuerung für ein Motorpoti
Elektronik-Labor Projekte AVR Tiny85
Zähler-Eingang am Timer0
Schon
öfter habe ich mit Bascom und RC5-Signalen gearbeitet, aber bisher
immer nach dem Schema Kommando-Schaltausgang. Dann wartet man einfach,
bis ein gültiges Kommando gelesen wird und schaltet dann einen Ausgang.
Aber jetzt war die Aufgabe anders. Ein Motor soll so lange konstant
weiter laufen, wie man auf die Lauter- oder Leiser-Taste drückt. Der
Unterschied wird deutlich, wenn zwischendurch Kommandos falsch gelesen
werden, denn dann stottert der Motor. Und genau das ist auch passiert.
Der
entscheidende Unterschied liegt am Wait-Parameter, den ich bisher nie
beachtet hatte. Man muss die Timeout-Zeit deutlich hoch setzen:
Config
Rc5 = Pinb.0 , Wait =
2000
'Wait-Parameter verbessert Empfang
Das erkläre ich mir so: Wenn
das Programm auf diesen Befehl trifft, startet der Versuch, ein
Kommando zu empfangen. Wenn aber die Fernbedienung schon mit dem Senden
begonnen hat, wird der Anfang verpasst. Je kleiner die Wait-Zeit, desto
wahrscheinlicher passiert das. Mit Wait = 2000 wurden fast immer
gültige Kommandos empfangen. Wenn einmal der Anfang gefunden ist, ist
das nächste Zeichen nach ca. 100 ms kein Problem mehr, weil es in die
Timeout-Zeit fällt.
'RC5_1.bas Test RC5 Empfang mit serieller Ausgabe
$regfile = "attiny85.dat"
$crystal = 80000000
hwstack = 8
$swstack = 4
$framesize = 4
Open "comb.1:9600,8,n,1" For Output As #1
Config Rc5 = Pinb.0 , Wait = 2000 'Wait-Parameter verbessert Empfang
Enable Interrupts
Ddrb = &B0001_1010
Portb = &B0000_0000
Do
Getrc5(rc5_address , Rc5_command)
' Put #1, Rc5_address
' If Rc5_address = Address Then
If Rc5_address < 255 Then
Put#1 , Rc5_command
'Waitms 100
End If
Loop
End
Das
erste Testprogramm mit dem IR-Empfängersendet empfangene
Kommandos an das Terminal. Man sieht dann bei einem Dauerdruck auf eine
Taste eine Folge gleicher Kommandos. Mit einer zu kurzen Wait-Zeit
kommen zwischendurch falsche Ergebnisse.

Da noch ein Port frei war, wurde eine weitere Zusatzfunktion
eingebaut, die für eine Eingangskanal-Umschaltung vorgesehen wurde. Zum Test
wurden einfach drei LEDs mit einem gemeinsamen Vorwiderstand angeschlossen. Fernbedienungen für Audio-Geräte verwenden die
Adresse 16. Der Test wurde aber mit einer ganz anderen Fernbedienung mit der Adresse
5 und anderen Tastenkommandos durchgeführt.
'RC5_2.bas Test RC5 Empfang mit serieller Ausgabe
'Up = B.2, Down = B.3, "1" = B.4
$regfile = "attiny85.dat"
$crystal = 8000000
$hwstack = 16
$swstack = 16
$framesize = 16
Open "comb.1:9600,8,n,1" For Output As #1
Config Rc5 = Pinb.0 , Wait = 1000 'Wait-Parameter verbessert Empfang, kann bis 2000 getestet werden.
Enable Interrupts
Ddrb = &B0001_1110 'Nur B.0 ist Eingang, alle andern Pinne Ausgänge
Portb = &B0000_0000
Dim Rc5_command As Byte
Dim Rc5_address As Byte
Dim Togglebit As Byte
Dim Impuls As Word
'Const Address = 16 'Einstellungen für die endgültige Fernbedienung
'Const Up = 16
'Const Down = 17
'Const Kanal = 1
'Test
Const Address = 5 'Test mit alternativer Fernbedienung
Const Up = 32
Const Down = 33
Const Kanal = 1
Const Nachlauf = 2 'Impulsverlängerung nach letztem erkannten Kommando, 1...3 kann sinnvoll sein
Do
Getrc5(rc5_address , Rc5_command)
If Rc5_address = Address Then
Togglebit = Rc5_command / 128
Rc5_command = Rc5_command And 127 'ohne Togglebit
If Rc5_command = Up Then
Portb.2 = 1 'einschalten
Impuls = 0 'Impulszeit auf Null setzen
End If
If Rc5_command = Down Then
Portb.3 = 1
Impuls = 0
End If
If Rc5_command = Kanal Then
Portb.4 = 1
Impuls = 0
End If
Put#1 , Rc5_command '
End If
Impuls = Impuls + 1
If Impuls > Nachlauf Then Portb = 0 'Impulszeit abgelaufen
Loop
End

Elektronik-Labor Projekte AVR Tiny85