- LiFePO4 Speicher Test         
Ergebnis 1 bis 4 von 4

Thema: Infrarot RC5 Empfangsroutine per Zeitmessung im Interrupt

  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.702
    Blog-Einträge
    133

    Infrarot RC5 Empfangsroutine per Zeitmessung im Interrupt

    Anzeige

    Powerstation Test
    Hallo,

    angeregt durch Empfangsroutine für RC5 Infrarot Fernbedienungssignale in diesem thread, habe ich auch versucht eine Routine auf ATTiny2313 zu schreiben.

    Da es viele Beschreibungen zu Routinen mit Pollen des Input Pins vom TSOP gibt; es dazu sogar eine Appnote von Microchip gibt, suchte ich nach einer anderen Methode.

    Am Ende stand ein Programm, das den Input-Pin nicht pollt, sondern über den Pin Change Interrupt die Zeit von einer Input Flanke zur nächsten mißt. Da das Startbit "1" ist und im RC5 Manchester Code in der Mitte eines Bitfensters der logische Zustand wechseln MUSS, kann sequentiell über den zeitlichen Abstand der Flanken auf das übertragene Bit geschlossen werden; wird hier also nicht über Zustandsabfrage des Input Pins bestimmt. Für die Zeitmessung wird innerhalb der PCINT ISR ein Timer ausgelesen, der mit 125kHz läuft. Der Overflow Interrupt des gleichen Timers wird auch zur Fehlererkennung und Abmessung der Ruhephase genutzt.

    Bei jeder Flanke des RC5 Signals kann der Empfänger sozusagen neu synchronisiert werden und man kann in ziemlich weiten Bereichen auf kurze (889µs) und lange Zeitabschnitte (1778µs) entscheiden. Nützlich, wenn zB bei selbstgebauten FB-Sendern ohne Quarz der Takt des Senders nicht so ganz stimmt

    Sobald der TSOP eine Zustandsänderung zum µC gibt, erfolgt ein Pin Change Interrupt.
    Ablauf in der PCINT Isr in etwa:

    1. Nachdem 4ms kein PCINT auftrat -> bereit zum Empfang vom RC5-Startbit.

    2. Low Flanke von Startbit trifft ein. Startbit ist bekannt, wird als "1" abgespeichert und der Variablen RC5_Bit zugewiesen. Zeitmessung bis zur nächsten Flanke starten.

    3. Nächste Flanke trifft ein. Zeitnahme und Zeitmessung für folgende Flanke starten.
    a. Aktuelle Zeitnahme ergibt kurze (889µs) Zeitspanne. RC5_Bit wird getoggelt. RC5_Bit wird nur dem RC5 Telegramm hinzugefügt, wenn zuvor empfangenes Bit nicht gespeichert wurde. Ob gespeichert wurde oder nicht, wird über "Gespeichert"-Flag abgefragt und auch gekennzeichnet.
    b. Aktuelle Zeitnahme ergibt lange (1778µs) Zeitspanne. RC5_Bit wird getoggelt und dem RC5 Telegramm hinzugefügt. "Gespeichert"-Flag wird gesetzt.

    4. Weiter bei 3. bis alle 14 Bits empfangen wurden.

    5. 4ms Ruhephase einleiten

    Mechanismen zur Fehlererkennung:
    Kurze oder lange Zeitspannen liegen außerhalb der einstellbaren Toleranzen.
    8-Bit Timer0 mit 125kHz wird zu Beginn jeder Messung auf 0 gesetzt. Findet ein Timeroverflow während eines Telegrammempfangs nach 2048µs statt -> Fehler, da der max. gültige Abstand zweier Flanken 1778µs (+-) ist.
    Findet in der 4ms Ruhephase ein PCINT statt, wird eine weitere 4ms Ruhephase ab diesem PCINT angehangen.
    Wird während des Empfangs eines Telegramms ein Fehler festgestellt (zB Störung mit einer anderen FB) , wird der bisherige Empfang verworfen und über die 4ms Ruhephase auf das nächste Startbit gewartet.

    Eigentlich wollte ich die Routine in meinen ferngesteuerten Vehikeln einsetzen, da ich dort eine selbstgebaute IR-FB einsetze, die Telegramme im Abstand von 6ms verschicken kann. Bisher nutze ich den GETRC5 Bascom Befehl, die zumindest zu Beginn meiner Fernsteuerversuche anno dazumal mein ganzes Hauptprogramm aufhielt bzw. durcheinander brachte - meine ich mich jedenfalls zu erinnern. Habe deshalb damals den Empfänger auf einem eigenem µC ausgelagert.

    Ein Überprüfung ergab nun ein gleiches Zeitverhalten dieses Programms (in Bascom geschrieben) und des Bascom GETRC5 und die Verwendung des GETRC5 spart auch noch etwa 600 Byte Programmspeicher Muß ich das jetzt auch noch in Assembler machen? Ich glaub fast nicht, daß ich das besser als Bascom GETRC5 hinbekomme. Aber mich würd interessieren, nach welcher Methode die Bascom Entwickler das gemacht haben

    Ich weiß nicht ob diese Methode Vorteile gegenüber anderen hat Bild hier  

    Gruß
    Searcher
    Geändert von Searcher (07.07.2020 um 22:34 Uhr)
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.187
    Ich hab das für eine andere Anwendung mal anders gemacht.

    Ich hab dafür einen INTx verwendet und dann während der Interrupt Routine das Interrupt Sensing von steigende auf fallende Flanke umgestellt und umgekehrt.
    Dann wird ein Timer ausgelesen der ein Maß für die Impulslänge / Impulspause hergibt ( vorheriger Wert des Timers wird vom aktuellen abgezogen ).
    Der Vorteil ist, das man eigentlich immer auf eine bestimmte Aktion wartet ( fallende oder steigende Flanke ) und das es auch mit Controllern funktioniert die kein Pin Change können.

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.651
    .. Empfangsroutine für RC5 Infrarot Fernbedienungssignale .. auf ATTiny2313 ..
    Hi Searcher,
    das freut mich ja, dass mein Bericht nen Interessenten gefunden hat, der sich auch damit beschäftigt. Ich mache das ja ebenfalls mit nem PCINT (weil der sowieso auf jede Flanke anspringt). Nur die Zeitmessung ist bei mir etwas anders : ich habe einen 50 µs-Timer (bei 20 MHz Quarz sind das tausend clock cycles), der eine Variable bis 20000 zählt, den sekundenlangen Heartbeat und noch ein, zwei Timer (Downcounter) für allerlei Anwendungen schafft. Nicht zuletzt für den "ich lebe noch"/Heartbeat - ein Blinkie mit 0,5 Hz. Seine Zeitscheiben heißen tupsi (timer unit per sensor interrupt). Die benutze ich auch fürs RC-5-Lesen und prüfe deren Gültigkeit im Fenster {26 .. 50 tupsi}. Dazu gibts natürlich noch ne UART-Testroutine (meist inaktiv) mit der ich das im ersten Post meines Threads gezeigte 0-1-Bitmuster per UART-Ausgabe kontrollieren kann. Mit diesem Muster konnte ich auch die einzelnen Tastencodes meiner Fernsteuerung auslesen - sehr praktisch für die Anwendung.
    Wenn Du meinst, dass Dir mein Code was nützen könnte (wirklich recht mühevolles C) kann ich den gern posten.
    Viel Erfolg weiterhin.
    Geändert von oberallgeier (08.07.2020 um 09:50 Uhr) Grund: Rechtschreibung+Satzbau
    Ciao sagt der JoeamBerg

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.702
    Blog-Einträge
    133
    Zitat Zitat von wkrug Beitrag anzeigen
    Ich hab dafür einen INTx verwendet und dann während der Interrupt Routine das Interrupt Sensing von steigende auf fallende Flanke umgestellt und umgekehrt.
    Ich war auch mal nahe dran die Input Capture Unit zu verwenden, die man ja auch auf fallende bzw steigende Flanke umschalten kann. Dann war mir aber die Funktion und auch der 16Bit Timer, auf dem sie implementiert ist, zu schade. RC5 braucht ja keine so genaue Zeitmessung.


    Zitat Zitat von oberallgeier Beitrag anzeigen
    Wenn Du meinst, dass Dir mein Code was nützen könnte (wirklich recht mühevolles C) kann ich den gern posten. Viel Erfolg weiterhin.
    Vielen Dank! Ist im Augenblick nicht notwendig. Ich denke, Deinen Algorithmus habe ich verstanden. Hatte schon kurz versucht, mich durch den RC5-Dekodier-C-Code auf RN-Wissen durchzufinden. Aber ehrlich gesagt aufgegeben, da mir das als Nicht-C-ler zu umständlich wurde. Der knappen Beschreibung nach, könnte meines aber so ähnlich arbeiten: Interrupts aber ohne Abfrage des Portpinzustandes.


    Bisher habe ich bei meinen kleinen Basteleien noch keinen Heartbeat eingeführt. Wenn mir die Ressourcen mal auf meinen bewußt klein gehaltenen µCs ausgehen, komme ich wahrscheinlich darauf zurück.

    Beim Schreiben meines Programm hatte ich schon einiges zu kämpfen, um es so gut und fehlerfrei wie den GETRC5 Befehl in Bascom zu bekommen. Da ich schon etwas vertraut mit AVR Assembler bin, werde ich mal versuchen herauszubekommen, nach welcher Methode dort dekodiert wird. Laut Befehlsbeschreibung kann dort sogar der verwendete Timer0 mit leichten Einschränkungen gleichzeitig auch für andere Zwecke eingesetzt werden.

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

Ähnliche Themen

  1. Zeitmessung
    Von hansebanger im Forum Asuro
    Antworten: 2
    Letzter Beitrag: 16.06.2009, 20:18
  2. RC-Car Zeitmessung
    Von Bluesmash im Forum Vorstellung+Bilder+Ideen zu geplanten eigenen Projekten/Bots
    Antworten: 17
    Letzter Beitrag: 14.09.2008, 22:34
  3. Zeitmessung mittels Timer und Interrupt
    Von MAN im Forum PIC Controller
    Antworten: 2
    Letzter Beitrag: 01.07.2005, 09:55
  4. zeitmessung
    Von pebisoft im Forum AVR Hardwarethemen
    Antworten: 1
    Letzter Beitrag: 15.02.2005, 21:32
  5. Zeitmessung
    Von Sahra im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 12.10.2004, 17:33

Berechtigungen

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

LiTime Speicher und Akkus