PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Getrc5 dauert zu lange -> Empfang über externen Interrupt



Dane
16.03.2006, 21:16
Hallo,

ich habe bei meinem µC das Problem, dass der Befehl Getrc5 zu lange dauert, auch wenn nichts empfangen wird.
Deshalb habe ich den TSOP an INT0 angeschlossen. Getrc5 soll nur ausgeführt werden, wenn eine fallende Flanke kommt, also ein Signal empfangen wird.
Er liest zwar address und command ein und sendet sie zum PC, er übernimmt sie aber nicht ins Hauptprogramm.
Woran könnte das liegen?

noch eine Frage:
Ich habe zu Testzwecken ein Lauflicht aus drei LEDs gemacht, die mit Timer1 jeweils 20ms lang leuchten. Solange kein RC5-Signal kommt, funktioniert das auch, wenn ich aber eine Taste drücke, bleibt das Lauflicht ungefähr für 5s (!) stehen. Er ist doch nicht solange in der INT0-Routine?
Warum tut er das?

Hier meine Interrupt-Routine:

Int0_irq:
Disable Int0
Enable Interrupts
Getrc5(address , Command) 'IR-Empfänger abfragen
Print Address ; " " ; Command
Enable Int0
Return

Gruß, Dane

PS: mein ganzes Programm ist mehrere Seiten lang, das wollte ich euch nicht antun.

Dane
16.03.2006, 21:21
Mir ist gerade aufgefallen, wenn ich eine Taste drücke, kommt oft für comand ein falscher Wert an.
Wenn ich Taste 1 drücke, sollte ja command 1 sein, ist aber oft 129.

Dane

hrei
16.03.2006, 21:34
Mir ist gerade aufgefallen, wenn ich eine Taste drücke, kommt oft für comand ein falscher Wert an.
Wenn ich Taste 1 drücke, sollte ja command 1 sein, ist aber oft 129.

Dane

Bit 7 von Command ist das Togglebit. Also wird, wenn Du es nicht zurücksetzt, jedes 2. mal Tastendruck 128 zum Command addiert. Steht auch in der Hilfe.

GETRC5() nutzt auch timer0 als Default sowie dessen Timerinterrupt. das wird sich evtl. ins gehege kommen. Auch das steht in der Hilfe. Es wäre einen Versuch wert, mal Timer2 in der Configuration für RC5 anzugeben. Wie? Auch das steht in der Hilfe :-).

Viele Grüße
Henrik

-tomas-
16.03.2006, 22:32
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.


$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

Gifr = Gifr Or &H80 'clear Flag Int1
siehe Datenblatt...

Dane
17.03.2006, 06:11
Hallo,

erst mal danke für die Antworten.
@-tomas-: Ich bin Noob und kenne mich noch nicht sonderlich gut aus.
Was ist ein Flag und was hat es sich mit dem Befehl auf sich?
Könntest Du mir das erklären?

MfG, Dane

-tomas-
17.03.2006, 11:57
Was ist ein Flag und was hat es sich mit dem Befehl auf sich?
uups...das führt etwas weit.
Ein Flag ist praktisch eine 1-Bit-Variable.
Der Begriff Gifr taucht im 300-Seiten-Atmega32-Manual nur ca. 4x auf:
http://www.atmel.com/dyn/resources/prod_documents/doc2503.pdf
einfach mal nachlesen...