-         

Ergebnis 1 bis 4 von 4

Thema: RC5 Empfang per Int2 mit Mega16

  1. #1

    RC5 Empfang per Int2 mit Mega16

    Anzeige

    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.
    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 hoffe ihr könnt mir helfen, Danke schon mal im vorraus.

  2. #2
    Erfahrener Benutzer Begeisterter Techniker Avatar von albundy
    Registriert seit
    16.10.2004
    Beiträge
    282
    Ich nehme an, weil für den GetRC5 Befehl schon intern der Timer0 Interrupt verwendet wird, ( siehe Bascom Hilfe ) funktioniert es nicht.

  3. #3
    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:
    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
    
    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

  4. #4
    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?

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •