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