-         

Ergebnis 1 bis 3 von 3

Thema: Frage zu GetRC5()

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.01.2004
    Beiträge
    317

    Frage zu GetRC5()

    Anzeige

    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

    Code:
    $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
    mfG Henry

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    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:
    Code:
    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

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.01.2004
    Beiträge
    317
    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ß
    mfG Henry

Berechtigungen

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