RC5-Code einlesen mit XC886 Problem

OP #3679153
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
OP #3679195
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
  }

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren