Difference between revisions of "Avr rc5 remote control"
m (Changed category) |
m (Syntaxhighlighting) |
||
Line 20: | Line 20: | ||
==The Code== | ==The Code== | ||
The stripped down C code: | The stripped down C code: | ||
− | < | + | <syntaxhighlight lang="c"> |
#include <avr/interrupt.h> | #include <avr/interrupt.h> | ||
#include <avr/io.h> | #include <avr/io.h> | ||
Line 83: | Line 83: | ||
return 0; | return 0; | ||
} | } | ||
− | </ | + | </syntaxhighlight> |
==External Links== | ==External Links== | ||
*[http://www.atmel.com/dyn/resources/prod_documents/doc1473.pdf Application Note AVR410: RC5 IR Remote Control Reciever] | *[http://www.atmel.com/dyn/resources/prod_documents/doc1473.pdf Application Note AVR410: RC5 IR Remote Control Reciever] |
Revision as of 05:40, 3 February 2011
Introduction
Interfacing a standard Philips RC5 protocol remote control to an Atmel AVR should be easy. It shouldn't have to take neither much hardware nor code to do so. I've found that there is an official application note from Atmel describing how to do this. Atmels example is done in assembler and is fault tolerant, but it's difficult to understand. By doing it in C it becomes very simple and understandable.
The RC5 protocol
I'm not going to provide you with my own version of how it works.
I suggest you read this: http://www.sbprojects.com/knowledge/ir/rc5.htm
That link also has a list of the command and address codes that you'll need.
The Code
The stripped down C code: <syntaxhighlight lang="c">
- include <avr/interrupt.h>
- include <avr/io.h>
- include <util/delay.h>
typedef union { uint16_t raw; struct { unsigned cmd : 6; // LSB unsigned addr : 5; unsigned toggle : 1; unsigned start : 2; unsigned : 2; // MSB }; } rc5data;
static volatile int flag = 0; static volatile rc5data data;
void init_int0() { // Interrupt on INT0 pin going low MCUCR = (1 << ISC01);
// Turn on INT0! GICR |= (1 << INT0); }
SIGNAL (INT0_vect) { int pos = 0;
if (!flag) { data.raw = 0;
// triggers on falling edge of start bit 1. _delay_ms(0.2);
while (pos < 14) { data.raw = (data.raw << 1) | ((~PIND & 0x04) >> 2); _delay_ms(1.8); pos++; }
flag = 1; } }
int main() { init_int0(); sei(); // Enable interrupts
while(1) {
while(!flag);
// Do with data from the remote control here what you like. flag = 0; }
return 0; } </syntaxhighlight>