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
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