Forum: Mikrocontroller und Digitale Elektronik RC5-Code einlesen mit XC886 Problem


von Andreas B. (sunris)


Lesenswert?

Hallo ich stehe vor einem Riesen Problem,

Ich muss einen RC5-Code mit Hilfe des XC886 von Infineon einlesen.
Habe mir auch schon edliche Beiträge hierzu angeschaut aber ich bekomme 
einfach keine "Übersetzung" für meinen Controller hin...

bin langsam am verzweifeln.

Benutze hierfür zum Programmieren µVision4 und den TSOP 31236 als 
Empfänger

Ich verwedende den Timer2 mit seiner Autoreload Funktion um alle 1778µs 
einen Interrupt zu erzeugen welcher ein Startbit setzt.

Mit diesem Startbit wird ein Unterprogramm aufgerufen was erst 8x prüft 
ob am Eingang eine 1 anliegt, ist dies der Fall wird das STARTFLANKE bit 
gesetzt mit diesem wird dann gewartet bis eine 0 am Eingang vorhanden 
ist.

Wenn die 0 kommt wird 14x der Eingang in einem Array erfasst.

So sollte es doch normalerweise funktionieren oder?

Ich hoffe Ihr könnt mir helfen.

Gruß Andreas

: Bearbeitet durch User
von Bernd N (Gast)


Lesenswert?


von Andreas B. (sunris)


Lesenswert?

Hallo danke für die schnelle Antwort,

aber leider verstehe ich von dem Coding nicht viel wir benutzen in der 
Schule nur den XC886 deswegen fällt mir das ganze recht schwer.

von Andreas B. (sunris)


Lesenswert?

Hier mal mein bisheriges Programm


#include <XC886CLM.H>
//#include <../../_libs/i2c.c>
//#include <../../_libs/EA_eDIP.c>


bit Timer=0;
xdata unsigned char RC5_CODE[14];
xdata unsigned char RC5_CODE0[8];
xdata unsigned char RC5_STATUS[6];
xdata unsigned char RC5_START;
xdata unsigned char RC5_FLANKE;
xdata unsigned char RC5_ZAEHL;

sbit Empf = P3_DATA^1;



void init (void)
{
  P3_DIR  =  0x01;        //Alles Eingang bis auf P3.0
  P3_DATA  =  0x00;       //Alles auf 0 Setzen
 }

void init_timer2(void)
{
  T2_T2MOD = 0x96;        // Teiler 8 für 0,33333µs
  T2_RC2L = 0x29;         //Erster Durchlauf 65535-5334 = 0xEB29 für 
1778µs
  T2_RC2H = 0xEB;
  T2_T2L = 0x29;          //Nachladewert 65535-5334 = 0xEB29 für 1778µs
  T2_T2H = 0xEB;          //Um ein ganzes Bit zu warten
  T2_T2CON = 0;
  ET2 = 1;                //Freigabe Interrupt Timer 2
  EA = 1;                 //Allgemeine Interruptfreigabe
  TR2 = 0;                //
  TF2 = 1;                //Timer2 Starten
 }

void timer2_int (void) interrupt 5
{
  Timer = 1;
  TF2 = 0;
 }

void RC5_ROUTINE(void)
{
 if (RC5_START == 1)       //Warten bis Eingang 8x auf frei geprüft
 {
  if  (RC5_FLANKE ==1)     //Warten bis Flanke vorhanden
   {
    RC5_CODE[0] = Empf;                 //RC5-Code einlesen
    RC5_CODE[1] = RC5_CODE[0];
    RC5_CODE[2] = RC5_CODE[1];
    RC5_CODE[3] = RC5_CODE[2];
    RC5_CODE[4] = RC5_CODE[3];
    RC5_CODE[5] = RC5_CODE[4];
    RC5_CODE[6] = RC5_CODE[5];
    RC5_CODE[7] = RC5_CODE[6];
    RC5_CODE[8] = RC5_CODE[7];
    RC5_CODE[9] = RC5_CODE[8];
    RC5_CODE[10] = RC5_CODE[9];
    RC5_CODE[11] = RC5_CODE[10];
    RC5_CODE[12] = RC5_CODE[11];
    RC5_CODE[13] = RC5_CODE[12];

  RC5_ZAEHL--;             //14x Einlesen

  if (RC5_ZAEHL == 0)      //Wenn 14x eingelesen
  {
   RC5_START=0;            //
   RC5_STATUS[0]=1;        //STATUSBIT für nächsten Schritt setzen
  }
  else
  {
   if (Empf == 0)          //Warten bis Signal am Eingang
   {
    RC5_FLANKE=1;            //Flankenbit setzen
    RC5_ZAEHL = 13;          //Für 14x Zählen vorbereiten
    }
   }
  }
 }

 else
 {
  RC5_CODE0[0] = Empf;           //Überprüfung ob Eingang frei
  RC5_CODE0[1] = RC5_CODE0[0];
  RC5_CODE0[2] = RC5_CODE0[1];
  RC5_CODE0[3] = RC5_CODE0[2];
  RC5_CODE0[4] = RC5_CODE0[3];
  RC5_CODE0[5] = RC5_CODE0[4];
  RC5_CODE0[6] = RC5_CODE0[5];
  RC5_CODE0[7] = RC5_CODE0[6];

  if (RC5_CODE0[0] == 1 && RC5_CODE0[1] ==1  && RC5_CODE0[2] ==1 &&
      RC5_CODE0[3] ==1 && RC5_CODE0[4] ==1 && RC5_CODE0[5] ==1 &&
      RC5_CODE0[6] ==1 && RC5_CODE0[7] ==1)
  {
    RC5_START = 1;            //Wenn frei START auf 1 setzen
    RC5_FLANKE = 0;           //Auf Flanke Warten

    RC5_CODE0[0]= 0;          //Prüfung auf 0 Setzen
    RC5_CODE0[1]= 0;
    RC5_CODE0[2]= 0;
    RC5_CODE0[3]= 0;
    RC5_CODE0[4]= 0;
    RC5_CODE0[5]= 0;
    RC5_CODE0[6]= 0;
    RC5_CODE0[7]= 0;
   }
   }
}




Main()
{
 init();
 init_timer2();               //Timer2 init


 if (Timer == 1)              //Wenn Interrupt von Timer2
 {
  Timer = 0;                  //Interruptbit zurücksetzem
  RC5_ROUTINE();              //Routine starten
  }

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.