www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Dekodierung des RC5 Codes ohne Timer?


Autor: Unwissender (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich hab mir ein bisschen das RC5 Protokoll im Internet angesehen.
Öfters habe ich zu der RC% Dokumentation auch ein paar zugehörige 
Beispielprogramme zur Dekodierung eines RC5 Signals gesehen(sowohl 
Assembler als auch C).
Bei diesen Programmen wurde eigentlich immer ein Timer eingesetzt,der 
alle paar µs überläuft und einen Interrupt auslöst.
Ich bin jetzt nicht wirklich gut im Umgang mit µC,aber ginge das nicht 
auch ohne einen Timer?

Was ich bisher verstanden hab(oder ich hoffe zumindest das ich das das 
korrekt verstanden habe):

Wenn ich eine Taste auf der Fernbedienung drücke dann werden ja immer 14 
bit gesendet( 2Starbits + 1 Toggle Bit + 5 Adressbits + 6 Kommandobits).
Eigentlich muss ich ja (zumindest hab ich das aus der RC5 Dokumentation 
so verstanden) nur die einzelnen Bits auf "0" oder "1" überprüfen. Wie 
lange so ein High bzw Low dauert ist ja eigentlich egal,oder?

Meine Überlegungen zum Programm:

Ich warte im Hauptprogramm so lange bis auf der Portleitung das erste 
Mal ein High auftritt,damit weiß ich dann das die Übertragung gestartet 
wird.
Nach dem Startbit kommen ja noch 13bit,das heißt ich müsste so lange 
warten bis ich alle 14bits beisammen hätte. Da ich nicht so wirklich gut 
im Erklären bin,noch ein kurzer Programmcode wie ich mir das vorgestellt 
hätte:

//----Include-Files----
#include<stdio.h>
#include<stdlib.h>

sbit at P0^1 IR //P0.1 ist der Pin wo der IR Dekoder angeschlossen ist

char string[15]; //Variable in der die Bitkombination später stehen soll
int zaehler;
int go = 0; //Hilfsvariable

void main(void)
{

if(IR == 1) //die Fernbedienung sendet einen Code
{
  zaehler = 0; 
  string[zaehler] = 0x01; //Starbit speichern
  while(IR == 1); //solange der Pin noch High ist
  while(IR == 0); //danach kommt ein Low
  
  zaehler ++;
  while(zaehler = ! 13)
  
  {
   if(IR == 1)
   {
     string[zaehler] = 0x01;
     while(IR == 1);
     while(IR == 0);
     go = 1; //wird gesetzt,damit er nicht mehr in die andere Schleife geht
   }
   
   if(go == 0)
   {
   if(IR == 0)
   {
     string[zaehler] = 0x00;
     while(IR == 0);
     while(IR == 1);
    }

    }
    go = 0;
    zaehler ++ ;
  
   }

}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.