RC5-Steuerung für ein Motorpoti    


Elektronik-Labor   Projekte   AVR  Tiny85



Das Franzis Lernpaket Mikrocontroller

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