Ich nehme an, weil für den GetRC5 Befehl schon intern der Timer0 Interrupt verwendet wird, ( siehe Bascom Hilfe ) funktioniert es nicht.
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.
Ich hoffe ihr könnt mir helfen, Danke schon mal im vorraus.Code:'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 nehme an, weil für den GetRC5 Befehl schon intern der Timer0 Interrupt verwendet wird, ( siehe Bascom Hilfe ) funktioniert es nicht.
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:
allerdings muss ich auf den zweiten gesendeten code warten, da er sonst den ersten nicht 100%ig erkenntCode:'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
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?
Lesezeichen