Forum: Compiler & IDEs Problem mit RC5


von Max M. (mrmustermann)


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.
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <math.h>
4
5
6
7
struct rc5_parts
8
 {
9
    volatile char s_bit;
10
  volatile int8_t addresse;
11
  volatile int8_t code;
12
  volatile char rdy;
13
 } rc5;
14
15
char mid;
16
volatile uint8_t bitnummer = 0;
17
18
void init_rc5()
19
{
20
 MCUCR |= (1<<ISC11) | (1<<ISC10);
21
 GICR |= (1<<INT1);
22
 TCCR0 |= (1<<CS02);
23
}
24
25
//****************************************************USART******************************
26
27
void init_usart(void) 
28
{ 
29
 UBRRL |= 0b01100111; 
30
 UCSRB = (1<<TXEN) | (1<<RXEN); 
31
 UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0); 
32
} 
33
34
void send_char(unsigned char s) 
35
{ 
36
 while (!(UCSRA & (1<<UDRE))); 
37
 UDR = s; 
38
} 
39
40
void send_string(char *s) 
41
{ 
42
 while(*s != '\0') 
43
  { 
44
   send_char(*s); 
45
   s++; 
46
  } 
47
} 
48
49
//**********************************************************USART-ENDE********************
50
51
SIGNAL(SIG_OVERFLOW0)
52
{
53
 bitnummer++;
54
 TCNT0 = 145;      //Timer soll nach 1.778ms Overflow haben
55
  
56
 if(bitnummer == 12)      
57
  {
58
   TIMSK &= ~(1<<TOIE0);
59
   rc5.rdy = 1;
60
   rc5.s_bit = 0;
61
   bitnummer = 13;
62
  }
63
 
64
 if(bitnummer<6)             //Wenn i<6, werden die ausgelesenen Bits
65
zu Addresse hinzugefügr
66
  {
67
    if((PORTD & (1<<3)) == 1)
68
     {
69
      rc5.addresse |= (1<<(-1)*(bitnummer-6));
70
     }
71
    else
72
     {
73
      rc5.addresse &= ~(1<<(-1)*(bitnummer-6));
74
     }
75
    }
76
  
77
 if((bitnummer>=6)&(bitnummer<=11))    //6 - 11 werden zu rc5.code
78
hinzugefügt
79
  {
80
    
81
    if((PORTD & (1<<3)) == 1)
82
     {
83
      rc5.code |= (1<<(-1)*(bitnummer-7));
84
     }
85
    else
86
     {
87
      rc5.code &= ~(1<<(-1)*(bitnummer-7));
88
     }
89
  }
90
}
91
92
SIGNAL(SIG_INTERRUPT1)
93
{
94
95
 
96
 if(rc5.s_bit<4)
97
  {
98
   rc5.s_bit++;
99
  }
100
 if(rc5.s_bit == 4)
101
  {    
102
   TIMSK |= (1<<TOIE0);  // Timer0 Interrupts enablen
103
   TCNT0 |= 200;         //Timer so vorladen, dass er zur Mitte des 2.
104
Halbbits den ersten Timeroverflow hat      
105
 
106
   GICR &= ~(1<<INT1);  //Int1 disablen
107
  }
108
}
109
   
110
int main(void)
111
{
112
 init_usart();
113
 init_rc5();
114
 char i = 1;
115
 sei();
116
 char result[10];
117
 char hello[15] = "Hallo Martin";
118
 send_string(hello);
119
 for(;;)
120
  {
121
   if(rc5.rdy == 1)
122
    {
123
     itoa(rc5.code,result,10);
124
   char hello2[15] = "RC5-Code: ";
125
     send_string(hello2);
126
     send_string(result);
127
   rc5.rdy = 0;
128
   GICR |= (1<<INT1);
129
  }
130
  }
131
}

Wisst ihr, wo da mein Fehler ist?

Gruß
Martin

von Max M. (mrmustermann)


Lesenswert?

Hab vergessen zu sagen:
ATMega8@16MHZ, TSOP1736 an PORTD.4

von Xenu (Gast)


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";

von Max M. (mrmustermann)


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.
1
void init_rc5()
2
{
3
 MCUCR |= (1<<ISC11);
4
 GICR |= (1<<INT1);
5
 TCCR0 |= (1<<CS02);
6
}
7
8
//****************************************************USART******************************
9
10
void init_usart(void) 
11
{ 
12
 UBRRL |= 0b01100111; 
13
 UCSRB = (1<<TXEN) | (1<<RXEN); 
14
 UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0); 
15
} 
16
17
void send_char(unsigned char s) 
18
{ 
19
 while (!(UCSRA & (1<<UDRE))); 
20
 UDR = s; 
21
} 
22
23
void send_string(char *s) 
24
{ 
25
 while(*s != '\0') 
26
  { 
27
   send_char(*s); 
28
   s++; 
29
  } 
30
} 
31
32
//**********************************************************USART-ENDE********************
33
34
SIGNAL(SIG_OVERFLOW0)
35
{
36
 bitnummer++;
37
 TCNT0 = 145;      //Timer soll nach 1.778ms Overflow haben
38
  
39
 if(bitnummer == 12)      
40
  {
41
   TIMSK &= ~(1<<TOIE0);    //Wenn die 11 Bits davor erfasst wurden,
42
TimerIRQ deaktivieren
43
   rc5.rdy = 1;
44
   rc5.s_bit = 0;
45
   bitnummer = 13;
46
  }
47
 
48
 if(bitnummer<6)             //Wenn i<6, werden die ausgelesenen Bits
49
zu Addresse hinzugefügr
50
  {
51
    if((PIND & (1<<3)) != 0)
52
     {
53
      rc5.addresse |= (1<<(-1)*(bitnummer-6));
54
     }
55
    else
56
     {
57
      rc5.addresse &= ~(1<<(-1)*(bitnummer-6));
58
     }
59
    }
60
  
61
 if((bitnummer>=6 && bitnummer<=11))    //6 - 11 werden zu rc5.code
62
hinzugefügt
63
  {
64
    
65
    if((PIND & (1<<3)) != 1)
66
     {
67
      rc5.code |= (1<<5);
68
    char hello[15] = "CODE-EINS"; //Nur das per RS232 empfangen
69
 send_string(hello);
70
     }
71
    else
72
     {
73
      rc5.code &= ~(1<<3); //dieser zweig nie
74
    char hello[15] = "CODE-NULL";  
75
 send_string(hello);
76
     }
77
  }
78
}
79
80
SIGNAL(SIG_INTERRUPT1)
81
{
82
83
 
84
 if(rc5.s_bit<3)
85
  {
86
   rc5.s_bit++;
87
  }
88
 if(rc5.s_bit == 3)
89
  {    
90
   TIMSK |= (1<<TOIE0);  // Timer0 Interrupts enablen
91
   TCNT0 = 228;         //Timer so vorladen, dass er zur Mitte des 2.
92
Halbbits den ersten Timeroverflow hat      
93
 
94
   GICR &= ~(1<<INT1);  //Int1 disablen
95
  }
96
}
97
   
98
int main(void)
99
{
100
 init_usart();
101
 init_rc5();
102
 char i = 1;
103
 sei();
104
 char result[10];
105
 char hello[15] = "Hallo Martin";
106
 send_string(hello);
107
 for(;;)
108
  {
109
   if(rc5.rdy == 1)
110
    {
111
     itoa(rc5.code,result,10);
112
   char hello2[15] = "RC5-Code: ";
113
     send_string(hello2);
114
     send_string(result);
115
   rc5.rdy = 0;
116
   GICR |= (1<<INT1);          //    ext. Interrupt wieder aktivieren
117
   bitnummer = 0;              // bitnummer zurücksetzten
118
  }
119
  }
120
}

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.