- Labornetzteil AliExpress         
Ergebnis 1 bis 6 von 6

Thema: Getrc5 dauert zu lange -> Empfang über externen Interrupt

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    18.07.2005
    Beiträge
    49

    Getrc5 dauert zu lange -> Empfang über externen Interrupt

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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:
    Code:
    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.

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    18.07.2005
    Beiträge
    49
    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

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.12.2004
    Alter
    71
    Beiträge
    277
    Zitat Zitat von Dane
    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

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    28.03.2004
    Beiträge
    185
    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...

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    18.07.2005
    Beiträge
    49
    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

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    28.03.2004
    Beiträge
    185
    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/p...ts/doc2503.pdf
    einfach mal nachlesen...

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress