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
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:
Gruß, DaneCode:Int0_irq: Disable Int0 Enable Interrupts Getrc5(address , Command) 'IR-Empfänger abfragen Print Address ; " " ; Command Enable Int0 Return
PS: mein ganzes Programm ist mehrere Seiten lang, das wollte ich euch nicht antun.
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.Zitat von Dane
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
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.Zitat von Dane
Tip: Halte die ISR kurz!
Anbei meine Lösung.
Hinweis: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
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
siehe Datenblatt...Code:Gifr = Gifr Or &H80 'clear Flag Int1
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
uups...das führt etwas weit.Was ist ein Flag und was hat es sich mit dem Befehl auf sich?
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/p...ts/doc2503.pdf
einfach mal nachlesen...
Lesezeichen