
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...
Lesezeichen