PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zu GetRC5()



Henry
18.03.2009, 19:10
Hallo,

ich habe ein Programm zur Ansteuerung eines mit LEDs bestückten Schildes für einen Mega8 erstellt.
In diesem Programm zähle ich mit einem Timerüberlauf eine Variable hoch, mit der ich dann über Select Case verschiedene Muster ansteuere (Lauflicht usw.)
Zur Zeit ändere ich die Lichtmuster mit einem BCD-Codierschalter und möchte nun auf die Bedienung mit einer IR-Fernbedienung mit RC5 Code umstellen.

Das Problem ist nun, das mir der Befehl Getrc5 natürlich das Programm extrem ausbremst und die Abfolge der LED Ansteuerung unansehnlich macht.

Meine Frage ist nun, ob es eine Möglichkeit gibt Getrc5 einzubinden unohne das des Programm ausgebremst wird?
Ich habe es schon versucht mit dem Int0 Interrupt (an dem auch der IR-Sensor angeschlossen ist), leider ohne Erfolg.

Code mit dem Versuch habe ich mal angehängt. Unabhängig von meinem Code bin ich natürlich auch an anderen Lösungsansätzen interessiert.


Danke schon einmal für eure Hilfe



$regfile = "m8def.dat"
$crystal = 8000000


Config POrtB.1 = Output
Config PORTB.2 = Output
Config portb.3 = Output
Config portb.4 = Output
Config portb.5 = Output
Config portC.0 = Output
Config portC.1 = Output

Config PORTD.5 = Input 'BCD 1
Config PORTD.6 = Input 'BCD 2
Config PORTD.7 = Input 'BCD 4
Config PORTB.0 = Input 'BCD 8
Config PORTD.2 = Input 'Eingang Int0 für RC5 Auswertng

PortD.2 = 1 'PullUp einschalten



Config Timer2 = TIMER , PRESCALE = 1024 'Timer2 zur erzeugung der Blink- und Blitzsteuerwelle
Config RC5 = PinD.2
Config INT0 = CHANGE

On Int0 Int0_isr
On OvF2 Tim2_isr

Enable Interrupts
Enable Timer2
Enable INT0

Dim dbzaehler as word 'Zähler für Blitzer
Dim Ausgangsbyte1 as byte 'Zusammenfassung der Ausgänge
Dim BCDstellung as Byte 'Byte für Stellund ses BCD Schalters
Dim Fernbedienung as Bit 'Merker für eingegangenes Fernbedienungssignal
Dim Adresse as Byte 'Adresswariable von Fernbedienung
Dim Komando as Byte 'Komandovariable von Fernbedienung
Dim SteuerZeichen as Byte 'Variable für empfangendes Fernbedienungszeichen


Const Timerwert = 177 'Konstante für Voreinstellung Timerregister Timer0

Timer2 = Timerwert 'Timerregister voreinstellen

'Vergabe von Aliasnamen
Ring1 Alias PortB.1
Ring1A Alias PortB.2
Ring2 Alias PortB.3
Ring2A Alias PortB.4
Ring3 Alias PortB.5
Ring3A Alias portC.0
Ring4 Alias portC.1

BCD1 Alias PIND.5
BCD2 Alias PIND.6
BCD4 Alias PIND.7
BCD8 Alias PINB.0

'Voreinstellen von Variablen
dbZaehler = 0
Fernbedienung = 0
Ausgangsbyte1 = &B00000000

Do

If Fernbedienung = 1 then
GetRC5(Adresse , Komando)
If Adresse = 30 then
SteuerZeichen = Komando and &B01111111
Fernbedienung = 0
Enable INT0
End IF
End IF

BCDstellung.0 = BCD1
BCDstellung.1 = BCD2
BCDstellung.2 = BCD4
BCDstellung.3 = BCD8

If BCDstellung = 0 then
Ausgangsbyte1 = 0
End IF

'************************************************* *****************************
If BCDstellung = 1 or Steuerzeichen = 1 then
'Lauflicht bis alle Ringe an, dann 2x alle blinken und wieder von vorne
Select Case dbzaehler
Case 30 : Ausgangsbyte1 = &B00000011
Case 60 : Ausgangsbyte1 = &B00001111
Case 90 : Ausgangsbyte1 = &B00111111
Case 120 : Ausgangsbyte1 = &B01111111
Case 150 : Ausgangsbyte1 = &B00000000
Case 180 : Ausgangsbyte1 = &B01111111
Case 210 : Ausgangsbyte1 = &B00000000
Case 240 : Ausgangsbyte1 = &B01111111
Case 270 : Ausgangsbyte1 = &B00000000
End SELECT

'Rücksetzbedingung für den DB-Timer
If dbzaehler => 300 then
dbzaehler = 0
End If

End IF
'************************************************* *****************************
'************************************************* *****************************

If BCDstellung = 2 then
'Alle Ringe blinken
Select Case dbzaehler
Case 30 : Ausgangsbyte1 = &B01111111
Case 90 : Ausgangsbyte1 = &B00000000
End SELECT

'Rücksetzbedingung für den DB-Timer
If dbzaehler => 120 then
dbzaehler = 0
End If
End IF


'Ausgangssignale ansteuern
Ring1 = Ausgangsbyte1.0
Ring1A = Ausgangsbyte1.1
Ring2 = Ausgangsbyte1.2
Ring2A = Ausgangsbyte1.3
Ring3 = Ausgangsbyte1.4
Ring3A = Ausgangsbyte1.5
Ring4 = Ausgangsbyte1.6

Loop

'Interruptrotiene Timer2 Overflow
Tim2_isr:
Timer2 = Timerwert 'Timerregister voreinstellen
incr dbzaehler
Return

Int0_isr:
Disable Int0
Fernbedienung = 1
Return

End

Dirk
18.03.2009, 21:30
Hallo Henry,

hier mal ein Code-Ausschnitt, mit dem man zumindest nur dann zum Lesen des RC5-Codes gezwungen wird, wenn da wirklich ein Signal anliegt. Sonst wird Getrc5 nicht angesprungen. Das bringt Zeit im Hauptprogramm für andere Dinge:

Dim I As Byte
Dim Address As Byte
Dim Command As Byte
Dim Rc5_flag As Bit

'IR-Empfänger an Pind.2 initialisieren:
Config Rc5 = Pind.2
On Int0 Rc5_receive
Enable Int0
Config Int0 = Falling
Enable Interrupts

'Hauptprogramm:
Reset Rc5_flag
Do
For I = 1 To 4
Locate I , 1
Lcd "Warte auf IR ..."
If Rc5_flag = 1 Then
Reset Rc5_flag
Gosub Rc5_display
End If
Wait 1
Next I
Cls
Loop

'RC5 auf LCD anzeigen:
Rc5_display:
If Address <> 255 Then
Command = Command And &B01111111
Cls
Locate 2 , 1
Lcd "Addr: Cmd:"
Locate 3 , 1
Lcd Address ; " "
Locate 3 , 9
Lcd Command ; " "
Wait 1
Cls
End If
Return

'RC5 einlesen:
Rc5_receive:
Disable Int0
Enable Interrupts
Getrc5(address , Command)
Set Rc5_flag
Gifr = Gifr Or &B01000000 'Clear Flag Int0
Enable Int0
Return
Gruß Dirk

Henry
18.03.2009, 22:18
Hallo Dirk,

das hat mir genau den richtigen Weg gezeigt. Musste zwar noch einige Dinge an mein Programm anpassen, aber nun scheint es zu funktionieren. Die Zuverlässigkeit muss ich noch im Betrieb testen, aber es sieht gut aus.

Danke für den Denkanstoß