1 | #include "main.h"
|
2 | #define an(port,b) (port) |= (1<<(b))
|
3 | #define aus(port,b) (port) &= ~(1<<(b))
|
4 |
|
5 | #define RC5TIME 1.778e-3 // 1.778msec
|
6 | #define PULSE_MIN (uchar)(XTAL / 512 * RC5TIME * 0.4 + 0.5)
|
7 | #define PULSE_1_2 (uchar)(XTAL / 512 * RC5TIME * 0.8 + 0.5)
|
8 | #define PULSE_MAX (uchar)(XTAL / 512 * RC5TIME * 1.2 + 0.5)
|
9 |
|
10 |
|
11 | uchar rc5_bit; // bit value
|
12 | uchar rc5_time; // count bit time
|
13 | uint rc5_tmp; // shift bits in
|
14 | uint rc5_data; // store result
|
15 |
|
16 |
|
17 | SIGNAL (SIG_OVERFLOW0)
|
18 | {
|
19 | uint tmp = rc5_tmp; // for faster access
|
20 |
|
21 | TCNT0 = -2; // 2 * 256 = 512 cycle
|
22 |
|
23 | if( ++rc5_time > PULSE_MAX ){ // count pulse time
|
24 | if( !(tmp & 0x4000) && tmp & 0x2000 ) // only if 14 bits received
|
25 | rc5_data = tmp;
|
26 | tmp = 0;
|
27 | }
|
28 |
|
29 | if( (rc5_bit ^ xRC5_IN) & 1<<xRC5 ){ // change detect
|
30 | rc5_bit = ~rc5_bit; // 0x00 -> 0xFF -> 0x00
|
31 |
|
32 | if( rc5_time < PULSE_MIN ) // to short
|
33 | tmp = 0;
|
34 |
|
35 | if( !tmp || rc5_time > PULSE_1_2 ){ // start or long pulse time
|
36 | if( !(tmp & 0x4000) ) // not to many bits
|
37 | tmp <<= 1; // shift
|
38 | if( !(rc5_bit & 1<<xRC5) ) // inverted bit
|
39 | tmp |= 1; // insert new bit
|
40 | rc5_time = 0; // count next pulse time
|
41 | }
|
42 | }
|
43 |
|
44 | rc5_tmp = tmp;
|
45 | }
|
46 |
|
47 |
|
48 | void putchar( char c )
|
49 | {
|
50 | while( (UCSRA & 1<<UDRE) == 0 );
|
51 | UDR = c;
|
52 | }
|
53 |
|
54 |
|
55 | void puts( char *s )
|
56 | {
|
57 | while( *s )
|
58 | putchar( *s++ );
|
59 | }
|
60 |
|
61 |
|
62 | int main( void )
|
63 | {
|
64 | DDRB = 0xFF; //Port B als Ausgang
|
65 | DDRD = 0x7F; //PD7 Eingang
|
66 | uint i;
|
67 | char s[30];
|
68 |
|
69 | TCCR0 = 1<<CS02; //divide by 256
|
70 | TIMSK = 1<<TOIE0; //enable timer interrupt
|
71 |
|
72 | UBRRL = bauddivider; //set baud rate
|
73 | UBRRH = bauddivider >> 8;
|
74 | UCSRA = 0; //no U2X, MPCM
|
75 | UCSRC = 1<<URSEL^1<<UCSZ1^1<<UCSZ0; //8 Bit
|
76 | UCSRB = 1<<RXEN^1<<TXEN; //enable RX, TX
|
77 |
|
78 | sei();
|
79 | puts( "RC5-Dekoder:\n\r" );
|
80 | for(;;){ // main loop
|
81 | cli();
|
82 | i = rc5_data; // read two bytes from interrupt !
|
83 | rc5_data = 0;
|
84 | sei();
|
85 | if( i ){
|
86 | DDRB = i; // LED output
|
87 | putchar(( i >> 11 & 1) + '0'); // Toggle Bit
|
88 | putchar(' ');
|
89 | itoa( i >> 6 & 0x1F, s, 10); // Device address
|
90 | puts( s );
|
91 | putchar(' ');
|
92 | itoa((i & 0x3F) | (~i >> 7 & 0x40), s, 10); // Key Code
|
93 | puts( s );
|
94 | puts( "\n\r" );
|
95 | }
|
96 | }
|
97 | }
|