Zitat Zitat von Dane
Mir ist gerade aufgefallen, wenn ich eine Taste drücke, kommt oft für comand ein falscher Wert an.
Ich kenne das Problem. GetRC5 legt bei LOW-Pegel sofort los. Da es aber die erste fallende Flanke nicht genau mitbekommt, ist der gelesene Code wegen des Timings oft fehlerhaft und muss herausgefiltert werden. Die Fernsteuerung wiederholt die Codes.

Tip: Halte die ISR kurz!

Anbei meine Lösung.

Code:
 $regfile = "m32def.dat"                                    'Die Anweisung bestimmt Controllertyp, hier AVR Mega 32
 $framesize = 32                                            'Stackanweisungen, die eigentlich nur bei größeren Programmen
 $swstack = 32                                              'wirklich nötig werden
 $hwstack = 32
 $crystal = 8000000                                         'Die Frequenz des verwendeten Quarzes

 $baud = 9600                                               'Die Baudrate für RS232 Ausgabe.

 'RC5 benötigt Timer0 Interrupt !
 Config Rc5 = Pind.3
 On Int1 Int1_int                                           'Nosave würde 52 Takte = 6,5uS sparen
 Enable Int1
 Config Int1 = Falling
 Enable Interrupts

 Dim Address_rc5 As Byte , Command_rc5 As Byte , Rc5_flag As Bit

 'main
 Reset Rc5_flag
 Do
   If Rc5_flag = 1 Then
      If Address_rc5 <> 255 Then
        Reset Rc5_flag
        Command_rc5 = Command_rc5 And &B01111111
        Print "Adresse" ; Address_rc5 ; "Code" ; Command_rc5
      End If
   End If
 Loop
End

'Lesen der RC5 Codes
Int1_int:                                                   'Interrupt Handler For Int1
   Disable Int1
   Enable Interrupts
   Getrc5(address_rc5 , Command_rc5)
   Set Rc5_flag                                             'Flag für RC5 Daten
   Gifr = Gifr Or &H80                                      'clear Flag Int1
   Enable Int1
Return
Hinweis:
Bei einigen Atmels wird der Intx mit fallender Flanke auch in der ISR mitgetriggert. D.h. tritt in der ISR das Ereignis auf, wird ein Flag gesetzt und die ISR nach dem IRET sofort wieder aufgerufen. Wenn dann aber Getrc5 keine LOW-Impulse findet, wird im Nachlauf immer Mist der Art 255 / 127 gelesen.
Deshalb am Ende der ISR das Flag löschen durch setzen von High
Beim ATMEGA32 ist das
Code:
Gifr = Gifr Or &H80      'clear Flag Int1
siehe Datenblatt...