hi, hat sich erledigt habe was über google codeseacrh funktionierendes gefunden. hier :
http://homepage.hispeed.ch/peterfleu...-examples.zip/
Code:/****************************************************************************** Title: Philips RC-5 Remote Control Decoder Author: Peter Fleury <pfleury@gmx.ch> http://jump.to/fleury Date: December 2002 Purpose: Decodes RC5-commands Software: AVR-GCC 3.3 Hardware: AT90S8515 at 4 Mhz, IR-Receiver SFH506-36 RC5 data format: SB1 SB2 TB AB5 AB4 AB3 AB2 AB1 AB0 CB5 CB5 CB4 CB3 CB2 CB1 CB0 SB = Start bit, TB = Toggle bit, AB = address bits, CB = command bits Program description: The IR-Receiver SFH506-36 receives and demodulates the IR-signal from the remote control into an active-low signal, which is feed into port PD3. The rc5decode function first measures the length of the first start bit. If the start bit is recognized as a valid RC5 bi-phase code, the routine synchronizes into the middle of the first half of the second bit. Then the state is stored into variable rc5data. The function uses the edge in the middle of every bit to synchronize the timing. 3/4 bit length after this edge, the state is sampled. This is repeated for the following bits. The function returns the decoded RC5-command or zero if valid RC5-code not recognized. Timer0 is used as a time base. The timer0 overflow interrupt sets the global variable timerflag to 1. See also Atmel AVR Application Note AVR410 *******************************************************************************/ #include <inttypes.h> #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> /* this should be in <avr/io8515.h> !! */ #define TMC8_STOP 0 #define TMC8_CK8 _BV(CS01) /* ** Macros and constants */ #define RC5BitHigh() (bit_is_set(PINA,PA7)) #define RC5BitLow() (bit_is_clear(PINA,PA7)) #define WAITFORTIMER() { while ( timerflag == 0); timerflag = 0; } #define TIMER_0_CNT 0xCA // 111us with CLK/8 prescale #define RC5BITREF1 6 #define RC5BITREF2 11 #define RC5BITREF3 14 /* ** function prototypes */ unsigned int rc5decode( void ); /* ** module global variables */ static volatile uint8_t timerflag; //must be volatile because modified by interrupt handler SIGNAL(SIG_OVERFLOW0) /* ** signal handler for timer0 overflow interrupt */ { timerflag = 1; // set global variable TCNT0 = TIMER_0_CNT; // reset counter to get this interrupt again } unsigned int rc5decode( void ) /* ** decoded RC5 data is returned, or 0x0000 if RC5 data not recognized */ { unsigned int rc5data; unsigned char timer, i; // init timer/Counter0 TCCR0 = TMC8_CK8; // use CLK/8 prescale TCNT0 = TIMER_0_CNT; // set timer T/16 = 111us TIMSK = _BV(TOIE0); // enable TCNT0 overflow interrupt // measure startbit timerflag = 0; timer = 0; while ( RC5BitLow() && (timer < RC5BITREF2) ) { WAITFORTIMER(); timer++; } if ( (timer > RC5BITREF1) && (timer < RC5BITREF2) ) { // startbit ok, decode // wait T/4: synchronize in the middle of first half of second bit while ( timer < RC5BITREF3 ) { WAITFORTIMER(); timer++; } // read the remaining bits rc5data = 1; for (i=0; i<13; i++) { rc5data <<= 1; if ( RC5BitHigh() ) { rc5data |= 0x0001; // wait max T/2 for H->L transition (middle of next bit) timer = 0; while ( RC5BitHigh() && (timer < 16) ) { WAITFORTIMER(); timer++; } }else{ rc5data &= ~0x00001; // wait max T/2 for L->H transition (middle of next bit) timer = 0; while ( RC5BitLow() && (timer < 16) ) { WAITFORTIMER(); timer++; } } if ( timer == 16 ) { rc5data = 0x0000; // error, next bit not found break; } // wait 3/4 T: await next bit for ( timer=0; timer < 12 ; timer++) WAITFORTIMER(); } }else { rc5data = 0x0000; // error, invalid RC-5 code } TCCR0 = TMC8_STOP; // stop timer0 return (rc5data); }//rc5decode int main(void) { unsigned int rc5data; DDRB = 0xff; // use all pins on port B for output PORTB = 0xff; DDRA = 0x00; // use all pins on port D for input PORTA = 0xff; // enable internal pull-up resistors sei(); // enable interrupts for(;;) // loop forever { PORTB=~2; while ( RC5BitHigh() ); // wait until RC5 code received PORTB=~4; rc5data = rc5decode(); if ( rc5data & 0x2000 ) { PORTB = ~(rc5data & 0x003f); // output command bits of RC5 command } } }






Zitieren

Lesezeichen