mikrocontroller.net

Forum: Compiler & IDEs Problem mit RC5


Autor: Max Mustermann (mrmustermann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich versuche gerade, mir selbst ein Programm für den Empfang von
RC5-Code zu stricken, bekomme aber leider immer "0" als Ergebnis für
rc5.code.
Die Fernbedienung sendet RC5 und der TSOP1736 funktioniert auch, das
habe ich mit einem Basicprogramm überprüft.
#include <avr/io.h>
#include <avr/interrupt.h>
#include <math.h>



struct rc5_parts
 {
    volatile char s_bit;
  volatile int8_t addresse;
  volatile int8_t code;
  volatile char rdy;
 } rc5;

char mid;
volatile uint8_t bitnummer = 0;

void init_rc5()
{
 MCUCR |= (1<<ISC11) | (1<<ISC10);
 GICR |= (1<<INT1);
 TCCR0 |= (1<<CS02);
}

//****************************************************USART******************************

void init_usart(void) 
{ 
 UBRRL |= 0b01100111; 
 UCSRB = (1<<TXEN) | (1<<RXEN); 
 UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0); 
} 

void send_char(unsigned char s) 
{ 
 while (!(UCSRA & (1<<UDRE))); 
 UDR = s; 
} 

void send_string(char *s) 
{ 
 while(*s != '\0') 
  { 
   send_char(*s); 
   s++; 
  } 
} 

//**********************************************************USART-ENDE********************

SIGNAL(SIG_OVERFLOW0)
{
 bitnummer++;
 TCNT0 = 145;      //Timer soll nach 1.778ms Overflow haben
  
 if(bitnummer == 12)      
  {
   TIMSK &= ~(1<<TOIE0);
   rc5.rdy = 1;
   rc5.s_bit = 0;
   bitnummer = 13;
  }
 
 if(bitnummer<6)             //Wenn i<6, werden die ausgelesenen Bits
zu Addresse hinzugefügr
  {
    if((PORTD & (1<<3)) == 1)
     {
      rc5.addresse |= (1<<(-1)*(bitnummer-6));
     }
    else
     {
      rc5.addresse &= ~(1<<(-1)*(bitnummer-6));
     }
    }
  
 if((bitnummer>=6)&(bitnummer<=11))    //6 - 11 werden zu rc5.code
hinzugefügt
  {
    
    if((PORTD & (1<<3)) == 1)
     {
      rc5.code |= (1<<(-1)*(bitnummer-7));
     }
    else
     {
      rc5.code &= ~(1<<(-1)*(bitnummer-7));
     }
  }
}

SIGNAL(SIG_INTERRUPT1)
{

 
 if(rc5.s_bit<4)
  {
   rc5.s_bit++;
  }
 if(rc5.s_bit == 4)
  {    
   TIMSK |= (1<<TOIE0);  // Timer0 Interrupts enablen
   TCNT0 |= 200;         //Timer so vorladen, dass er zur Mitte des 2.
Halbbits den ersten Timeroverflow hat      
 
   GICR &= ~(1<<INT1);  //Int1 disablen
  }
}
   
int main(void)
{
 init_usart();
 init_rc5();
 char i = 1;
 sei();
 char result[10];
 char hello[15] = "Hallo Martin";
 send_string(hello);
 for(;;)
  {
   if(rc5.rdy == 1)
    {
     itoa(rc5.code,result,10);
   char hello2[15] = "RC5-Code: ";
     send_string(hello2);
     send_string(result);
   rc5.rdy = 0;
   GICR |= (1<<INT1);
  }
  }
}

Wisst ihr, wo da mein Fehler ist?

Gruß
Martin

Autor: Max Mustermann (mrmustermann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab vergessen zu sagen:
ATMega8@16MHZ, TSOP1736 an PORTD.4

Autor: Xenu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du solltest mal PIND anstatt PORTD schreiben.

Und nebenbei: Bei konstanten Zeichenketten kannst Du Dir die
Größenangabe sparen.

Anstatt:   char hello[15] = "Hallo Martin";
einfacher: const char hello[] = "Hallo Martin";

Autor: Max Mustermann (mrmustermann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
das mit PIND anstatt PORTD habe ich geändert, allerdings krieg ich
immer nur 6mal CODE-EINS ans HYperterminal gesendet. Irgendwas stimmt
da immer noch nicht. Die Invertierung des SIgnals durch den TSOP meine
ich berücksichtigt zu haben.
void init_rc5()
{
 MCUCR |= (1<<ISC11);
 GICR |= (1<<INT1);
 TCCR0 |= (1<<CS02);
}

//****************************************************USART******************************

void init_usart(void) 
{ 
 UBRRL |= 0b01100111; 
 UCSRB = (1<<TXEN) | (1<<RXEN); 
 UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0); 
} 

void send_char(unsigned char s) 
{ 
 while (!(UCSRA & (1<<UDRE))); 
 UDR = s; 
} 

void send_string(char *s) 
{ 
 while(*s != '\0') 
  { 
   send_char(*s); 
   s++; 
  } 
} 

//**********************************************************USART-ENDE********************

SIGNAL(SIG_OVERFLOW0)
{
 bitnummer++;
 TCNT0 = 145;      //Timer soll nach 1.778ms Overflow haben
  
 if(bitnummer == 12)      
  {
   TIMSK &= ~(1<<TOIE0);    //Wenn die 11 Bits davor erfasst wurden,
TimerIRQ deaktivieren
   rc5.rdy = 1;
   rc5.s_bit = 0;
   bitnummer = 13;
  }
 
 if(bitnummer<6)             //Wenn i<6, werden die ausgelesenen Bits
zu Addresse hinzugefügr
  {
    if((PIND & (1<<3)) != 0)
     {
      rc5.addresse |= (1<<(-1)*(bitnummer-6));
     }
    else
     {
      rc5.addresse &= ~(1<<(-1)*(bitnummer-6));
     }
    }
  
 if((bitnummer>=6 && bitnummer<=11))    //6 - 11 werden zu rc5.code
hinzugefügt
  {
    
    if((PIND & (1<<3)) != 1)
     {
      rc5.code |= (1<<5);
    char hello[15] = "CODE-EINS"; //Nur das per RS232 empfangen
 send_string(hello);
     }
    else
     {
      rc5.code &= ~(1<<3); //dieser zweig nie
    char hello[15] = "CODE-NULL";  
 send_string(hello);
     }
  }
}

SIGNAL(SIG_INTERRUPT1)
{

 
 if(rc5.s_bit<3)
  {
   rc5.s_bit++;
  }
 if(rc5.s_bit == 3)
  {    
   TIMSK |= (1<<TOIE0);  // Timer0 Interrupts enablen
   TCNT0 = 228;         //Timer so vorladen, dass er zur Mitte des 2.
Halbbits den ersten Timeroverflow hat      
 
   GICR &= ~(1<<INT1);  //Int1 disablen
  }
}
   
int main(void)
{
 init_usart();
 init_rc5();
 char i = 1;
 sei();
 char result[10];
 char hello[15] = "Hallo Martin";
 send_string(hello);
 for(;;)
  {
   if(rc5.rdy == 1)
    {
     itoa(rc5.code,result,10);
   char hello2[15] = "RC5-Code: ";
     send_string(hello2);
     send_string(result);
   rc5.rdy = 0;
   GICR |= (1<<INT1);          //    ext. Interrupt wieder aktivieren
   bitnummer = 0;              // bitnummer zurücksetzten
  }
  }
}

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.