PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : rc5 at90S8515



STK500begin
25.04.2007, 22:43
Hallo,

das soll hier kein Doppelpost sein.
Ganz einfache Frage:
Hat vielleicht jemand von euch auf einem ATMEL AT90S8515 eine RC5-Routine zum Laufen bekommen? Ich will nur wissen ob dies möglich ist.

Gruß

STK500begin
25.04.2007, 23:26
hi, hat sich erledigt habe was über google codeseacrh funktionierendes gefunden. hier :
http://homepage.hispeed.ch/peterfleury/avrgcc-examples.zip/



/************************************************** ****************************
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
}
}
}