PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RC5 Empfang per Int2 mit Mega16



Josch
24.01.2005, 18:04
Hallo,

also ich probiere schon die ganze Zeit an diesem Programm rum:
Es soll im Endeffekt dann ein LED Controller werden, mit Ausgang an PortA und PortC. Mein Problem ist, dass wenn ich den getrc5 Befehl in die Interruptroutine reinpacke, er in dem Interrupt hängenbleibt. Wenn ich in der Hauptschleife den RC5 Code empfange, alles tadellos funktioniert, aber sobald es per Int seinen soll net mehr.


'LED Controller
'--------------------------------------------------------------
$regfile = "m16def.dat"
$crystal = 16000000

Mcucsr.4 = 1
Mcucsr.4 = 1
Config Porta = 255
Config Portc = 255
Config Portd = 0&11111111
Config Portb = 0&00011001

Config Rc5 = Pinb.2
Config Int2 = Falling
On Int2 Interrupt
Enable Int2

Config Lcdmode = Port
Config Lcdbus = 4
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , Rs = Portb.0 , E = Portb.3
Config Lcd = 16 * 2
Initlcd

Dim Address As Byte , Command As Byte
Dim Onoff As Bit
Dim Rc As Bit

Porta = 255 'LEDs an
Portc = 255

Cls
Cursor Off Noblink
Lcd " LED Controller "
Lowerline
Lcd " Testversion"


Enable Interrupts

Mainloop:
Lowerline
Lcd "Warte auf RC5.."
Do
If Address < 255 Then
Lowerline
Lcd ; "Adr: " ; Address ; " Cmd: " ; Command ; " "
If Address = 8 Then
Select Case Command
Case 1 : Toggle Porta.0
Case 2 : Toggle Porta.1
Case 3 : Toggle Porta.2
Case 4 : Toggle Porta.3
Case 5 : Toggle Porta.4
Case 6 : Toggle Porta.5
Case 7 : Toggle Porta.6
Case 8 : Toggle Porta.7
End Select
End If
End If
Loop

Interrupt:
Getrc5(address , Command)
Command = Command And &B01111111
Return



Ich hoffe ihr könnt mir helfen, Danke schon mal im vorraus.

albundy
25.01.2005, 09:27
Ich nehme an, weil für den GetRC5 Befehl schon intern der Timer0 Interrupt verwendet wird, ( siehe Bascom Hilfe ) funktioniert es nicht.

Josch
25.01.2005, 12:22
hmm, aber ich benutze ja gar keine timer, sondern nur nen stinknormalen externen interrupt, oder geht dass vllt net, weil er dann ne falsche rücksprungaddresse hat?
oder funzt des net mit int2
hmm, ich habs glaubich schon mal per interrupt gesehn, ich such dann mal wo...


edit:

also jetzt funzts:

'LED Controller
'--------------------------------------------------------------
$regfile = "m16def.dat"
$crystal = 16000000

Mcucsr.4 = 1
Mcucsr.4 = 1
Config Porta = 255
Config Portc = 255
Config Portd = 0&11111111
Config Portb = 0&00011001

Config Rc5 = Pinb.2
Config Int2 = Falling
On Int2 Interrupt
Enable Int2

'Config Lcdmode = Port
'Config Lcdbus = 4
'Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , Rs = Portb.0 , E = Portb.3
'Config Lcd = 16 * 2
'Initlcd

Dim Address As Byte , Command As Byte
Dim Onoff As Bit

Porta = 255 'LEDs an
Portc = 255


'Cls
'Cursor Off Noblink
'Lcd " LED Controller "
'Lowerline
'Lcd " Testversion"


Enable Interrupts
Mainloop2:
'Lowerline
'Lcd "Warte auf RC5.."
Do
Loop

Interrupt:
Disable Int2
Waitms 100 'auf zweiten gesendeten Code warten (Code wird alle 113ms wiederholt)
Enable Interrupts
Getrc5(address , Command)
Command = Command And &B01111111
If Address < 255 Then
'Lowerline
'Lcd ; "Adr: " ; Address ; " Cmd: " ; Command ; " "
If Address = 8 Then
Select Case Command
Case 1 : Toggle Porta.0
Case 2 : Toggle Porta.1
Case 3 : Toggle Porta.2
Case 4 : Toggle Porta.3
Case 5 : Toggle Porta.4
Case 6 : Toggle Porta.5
Case 7 : Toggle Porta.6
Case 8 : Toggle Porta.7
Case 9 : Toggle Portc.7
Case 49 : Toggle Portc.6
Case 0 : Toggle Portc.5
Case 41 : Toggle Portc.4
Case 35 : Toggle Portc.3
Case 15 : Toggle Portc.2
Case 63 : Toggle Portc.1
Case 26 : Toggle Portc.0
Case 12 :
If Onoff = 0 Then
Portc = 255
Porta = 255
Onoff = 1
Elseif Onoff = 1 Then
Portc = 0
Porta = 0
Onoff = 0
End If
End Select
End If
End If

Enable Int2

Return


allerdings muss ich auf den zweiten gesendeten code warten, da er sonst den ersten nicht 100%ig erkennt

Josch
26.01.2005, 18:46
hmmm,

wie stell ich des am besten an wenn ich nach dem interrupt nicht mehr durch nen return befehl zurückgehen will? also z.b. halt in ne bestimmte schleife rein.

in assembler habich des halt immer so gemacht:

pop temp1
rjmp loop

also so, dass halt die rücksprungaddresse weg vom Stack war und dann einfach weiter, aber kann man des auch mit Bascom?