Forum: Mikrocontroller und Digitale Elektronik Atmega 8 RGB Controller


von Flitzii (Gast)


Lesenswert?

Hey Leute,

Ich wollte mir diesen RGB Controller bauen:
http://www.ledstyles.de/ftopic11821.html

Der Controller lässt sich über RC5 steuern.


Mein Problem:

Die RC5 Fernbedienung muss auf "TV" stehen.
Habe aber einen Philips Fernseher ._.

Was muss ich Quelltext ändern, damit ich den Controller auf CD betreiben 
kann?

Ich muss doch quasi nur die Adresse von 0 auf 20 ändern oder?

http://www.opendcc.de/info/rc5/rc5.html

LG

von Flitzii (Gast)


Lesenswert?

Mir schein es als würde die Adresse in der rc5.c eingestellt.
Nur wo?
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
// F¸r alte avr-gcc Versionen
5
#ifndef SIGNAL
6
#include <avr/signal.h>
7
#endif // SIGNAL
8
9
#include "rc5.h"
10
11
#ifndef RC5_INT
12
#define RC5_INT      RC5_INT0
13
#endif  /* RC5_INT */
14
  
15
#ifndef RC5_PRESCALE
16
#define RC5_PRESCALE 1024
17
#endif  /* RC5_PRESCALE */
18
19
/* ******************************************************************************** */
20
21
rc5_t rc5;
22
23
/* ******************************************************************************** */
24
25
#ifndef F_CPU
26
#error Please define F_CPU
27
#endif /* !F_CPU */
28
29
/* µs for a whole bit of RC5 (first & second part) */
30
#define RC5_BIT_US   (64*27)
31
32
#define RC5_TICKS \
33
        ((uint8_t) ((uint32_t) (F_CPU / 1000 * RC5_BIT_US / 1000 / RC5_PRESCALE)))
34
        
35
#define RC5_DELTA \
36
        (RC5_TICKS / 6)
37
        
38
typedef union 
39
{
40
        uint16_t w;
41
        uint8_t  b[2];
42
} code_t;
43
44
static code_t code;
45
static uint8_t rc5_addr;
46
47
/* Number of Bits received so far */
48
/* Number of Interrupts occured so far */
49
static uint8_t nbits;
50
static uint8_t nint;
51
52
/* ******************************************************************************** */
53
        
54
void rc5_init (uint8_t addr)
55
{
56
        nint  = 0;
57
        nbits = 0;
58
        rc5.flip = -1;
59
        
60
        rc5_addr = addr;
61
        
62
#if (RC5_PRESCALE==1024)
63
        TCCR0 = (1 << CS02) | (1 << CS00);
64
#elif   (RC5_PRESCALE==256)
65
        TCCR0 = (1 << CS02);
66
#elif   (RC5_PRESCALE==64)
67
        TCCR0 = (1 << CS01) | (1 << CS00);
68
#else
69
#error This RC5_PRESCALE is not supported
70
#endif /* RC5_PRESCALE */
71
        
72
        /* INTx on falling edge */
73
        /* clear pending INTx */
74
        /* enable INTx interrupt */
75
#if (RC5_INT == RC5_INT0)               
76
        MCUCR = (MCUCR | (1 << ISC01)) & ~ (1 << ISC00);
77
        GIFR = (1 << INTF0);
78
        GICR |= (1 << INT0);
79
#elif (RC5_INT == RC5_INT1)             
80
        MCUCR = (MCUCR | (1 << ISC11)) & ~ (1 << ISC10);
81
        GIFR = (1 << INTF1);
82
        GICR |= (1 << INT1);
83
#else
84
#error please define RC5_INT
85
#endif /* RC5_INT */
86
}
87
88
/* ******************************************************************************** */
89
90
SIGNAL (SIG_OVERFLOW0)
91
{
92
        TIMSK &= ~(1 << TOIE0);
93
        
94
        uint8_t _nbits = nbits;
95
        code_t _code = code;
96
        
97
        if (26 == _nbits)
98
        {
99
                _nbits++;
100
                _code.w <<= 1;
101
        }
102
        
103
        if (27 == _nbits 
104
                && _code.b[1] >= 0x30 /* AGC == 3 */
105
                && 0 > rc5.flip)
106
        {
107
                uint8_t _rc5_code;
108
                uint8_t _rc5_addr;
109
                /* we do the bit manipulation stuff by hand, because of code size */
110
                _rc5_code = _code.b[0] & 0x3f; /* 0b00111111 : #0..#5 */
111
                _code.w <<= 2;
112
                _rc5_addr = _code.b[1] & 0x1f; /* 0b00011111 : #6..#10 */
113
                
114
                if (rc5_addr & 0x80
115
                        || rc5_addr == _rc5_addr)
116
                {
117
                        rc5.code = _rc5_code;
118
                        rc5.addr = _rc5_addr;
119
                        signed char flip = 0;
120
                        if (_code.b[1] & 0x20) /* 0b00100000 : #11 */
121
                                flip = 1;
122
                        rc5.flip = flip;
123
                }
124
        }
125
        
126
        nint = 0;
127
        nbits = 0;
128
        
129
        /* INTx on falling edge */
130
        /* clear pending INTx */
131
        /* enable INTx interrupt */
132
#if (RC5_INT == RC5_INT0)               
133
        MCUCR = (MCUCR | (1 << ISC01)) & ~ (1 << ISC00);
134
        GIFR = (1 << INTF0);
135
        GICR |= (1 << INT0);
136
#elif (RC5_INT == RC5_INT1)             
137
        MCUCR = (MCUCR | (1 << ISC11)) & ~ (1 << ISC10);
138
        GIFR = (1 << INTF1);
139
        GICR |= (1 << INT1);
140
#endif
141
}
142
143
/* ******************************************************************************** */
144
145
#if (RC5_INT == RC5_INT0)               
146
SIGNAL (SIG_INTERRUPT0)
147
#elif (RC5_INT == RC5_INT1)             
148
SIGNAL (SIG_INTERRUPT1)
149
#endif /* RC5_INT */
150
{
151
        code_t _code = code;
152
        uint8_t _nint = nint;
153
        
154
        uint8_t tcnt0 = TCNT0;
155
        TCNT0 = 0;
156
        
157
        if (0 == _nint)
158
        {
159
                /* INTx on both edges */
160
#if (RC5_INT == RC5_INT0)               
161
                MCUCR = (MCUCR | (1 << ISC00)) & ~ (1 << ISC01);
162
#elif (RC5_INT == RC5_INT1)             
163
                MCUCR = (MCUCR | (1 << ISC10)) & ~ (1 << ISC11);
164
#endif /* RC5_INT */
165
        
166
                TIFR = (1 << TOV0);
167
                TIMSK |= (1 << TOIE0);
168
                _code.w = 0;
169
        }
170
        else
171
        {
172
                /* Number of bits of the just elapsed period */
173
                uint8_t n = 1;
174
         
175
                /* Bits received so far */
176
                uint8_t _nbits = nbits;
177
        
178
                /* is TCNT0 close to RC5_TICKS or RC5_TICKS/2 ? */
179
                if (tcnt0 > RC5_TICKS + RC5_DELTA)
180
                        goto invalid;
181
                else if (tcnt0 < RC5_TICKS/2 - RC5_DELTA)
182
                        goto invalid;
183
                else if (tcnt0 > RC5_TICKS - RC5_DELTA)
184
                        n = 2;
185
                else if (tcnt0 > RC5_TICKS/2 + RC5_DELTA)
186
                        goto invalid;
187
                
188
                /* store the just received 1 or 2 bits */
189
                do
190
                {
191
                        _nbits++;
192
                        if (_nbits & 1)
193
                        {
194
                                _code.w <<= 1;
195
                                _code.b[0] |= _nint & 1;
196
                        }
197
                } 
198
                while (--n);
199
                
200
                if (0)
201
                {
202
                        invalid:
203
                        
204
                        /* disable INTx, run into Overflow0 */
205
#if (RC5_INT == RC5_INT0)               
206
                        GICR &= ~(1 << INT0);
207
#elif (RC5_INT == RC5_INT1)             
208
                        GICR &= ~(1 << INT1);
209
#endif /* RC5_INT */
210
211
                        _nbits = 0;
212
                }
213
                
214
                nbits = _nbits;
215
        }
216
217
        code = _code;
218
        nint = 1+_nint;
219
}

von Karl H. (kbuchegg)


Lesenswert?

Flitzii schrieb:
> Mir schein es als würde die Adresse in der rc5.c eingestellt.

Eher nicht.
Wenn man allgemeine RC5 Funktionen baut, dann wird man diese Information 
nicht in die Routinen direkt einbauen, sondern es dem aufrufenden Code 
überlassen, zu entscheiden, auf welcher Adresse er lauschen will.

> Nur wo?

Ich würde mal ganz grob schätzen, dass dieser Funktion
>
> void rc5_init (uint8_t addr)
> {

beim Hochfahren des Systems mitgeteilt wird, auf welcher RC5 Adresse sie 
lauschen soll.

Also: Aufruf in main() rausgesucht, und wenn da tatsächlich steht

    rc5_init( 0 );

dann würde ich einfach mal probieren, ob diese 0 das sind was vermutet 
wird und was passiert, wenn du da deine 20 angibst :-)


Alles IMHO und geschätzt ohne die weitere Doku oder den Code studiert zu 
haben. Ich kann also auch komplett falsch liegen.

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.