PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RC5 Decoder



Spurius
26.07.2008, 13:54
Hallo,
nachdem ich vor einiger Zeit schonmal daran gescheitert war, einen RC5-Empfänger zu programmieren, wollte ich das jetzt im Zuge eines anderen Projects nochmal angehen und scheitere leider wieder, mein Coder ist hier:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <math.h>
#include <inttypes.h>
#include <compat/deprecated.h>

volatile char s_bit;
volatile uint8_t addresse;
volatile uint8_t code;
volatile char rdy;
volatile uint16_t gesamt[14];

volatile uint8_t bitnummer = 1;
volatile char ergebnis[20] = "RC5 fertig!";

void init_rc5()
{
MCUCR |= (1<<ISC01) | (1<<ISC00);; //wait rising edge
GICR |= (1<<INT0); //enable INT0
TCCR0 |= (1<<CS02); //Prescaler 256
cbi(DDRD,PD2);
}

//************************************************** **USART******************************

void init_usart(void)
{
UBRRL |= 0b01100111;
UCSRB = (1<<TXEN) | (1<<RXEN);
UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0);
}

void send_char(unsigned char s)
{
while (!(UCSRA & (1<<UDRE)));
UDR = s;
}

void send_string(char *s)
{
while(*s != '\0')
{
send_char(*s);
s++;
}
}

//************************************************** ********USART-ENDE********************


SIGNAL(SIG_INTERRUPT0)
{
TIMSK |= (1<<TOIE0);
char last_bit = 1;
char test[3];
uint8_t i;
if(TCNT0<139 && bitnummer <= 14 && last_bit == 1) {
gesamt[bitnummer] = 1;
last_bit = 1;
TCNT0 = 0;
bitnummer++;
}
if(TCNT0>139 && TCNT0<194 && bitnummer <= 14 && last_bit == 1) {
gesamt[bitnummer] = 0;
last_bit = 0;
TCNT0 = 0;
bitnummer++;
}
if(TCNT0<139 && bitnummer <= 14 && last_bit == 0) {
gesamt[bitnummer] = 0;
last_bit = 0;
TCNT0 = 0;
bitnummer++;
}
if(TCNT0>139 && TCNT0<194 && bitnummer <= 14 && last_bit == 0) {
gesamt[bitnummer] = 1;
last_bit = 1;
TCNT0 = 0;
bitnummer++;
}
if(bitnummer == 14) {
gesamt[1] = 1;
send_string(ergebnis);
last_bit = 1;
bitnummer = 1;
TIMSK &= ~(1<<TOIE0);
TCNT0 = 0;
rdy = 1;
}
}


int main(void)
{
init_usart();
init_rc5();
sei();
uint8_t i;
char test[3];
char wert[10] = "RC5:";
for(;;)
{
if(rdy==1) {
send_string(wert);
for(i=4;i<=8;i++) {
itoa(ergebnis[i],test,10);
send_string(test);
}
rdy = 0;
}

};
}


Das Signal vom TSOP ist invertiert, CPU ist ein M8@16Mhz.
Der Ansatz ist, die erste steigende Flanke zu erkennen und dann jeweils zu schauen, nach welcher Zeit die nächste steigende Flanke kommt, dann weiss ich ja, ob ich HIGH oder LOW bin, wobei natürlich auch das vorherige Bit eine Rolle spielt, deswegen die 4 IF-Abfragen. Wenn mir da jemand weiterhelfen könnte, wäre das super, ich sitze da mittlerweile seit Tagen dran und komme nicht weiter.
Danke
Spurius

sternst
26.07.2008, 14:52
http://www.mikrocontroller.net/topic/106567#937713

Spurius
26.07.2008, 15:12
edit......................

sternst
26.07.2008, 15:15
Gibt auch LEute hier, die dort nicht lesen...

Ja, und genau deshalb habe ich den Link gepostet. Damit hier niemand seine Zeit damit verschwendet, auf etwas hinzuweisen, was ich dort schon geschrieben habe.

Spurius
26.07.2008, 15:23
Sorry, hatte nicht gesehen dass du dort gepostet hattest! Habe dor mittlerweile geantwortet, hier der aktualisierte Code, der aber leider immer noch nicht funktioniert:



#include <avr/io.h>
#include <avr/interrupt.h>
#include <math.h>
#include <inttypes.h>
#include <compat/deprecated.h>

volatile char s_bit;
volatile uint8_t addresse;
volatile uint8_t code;
volatile char rdy;
volatile uint16_t gesamt[16];
volatile char last_bit = 1;

volatile uint8_t bitnummer = 1;
volatile char ergebnis[20] = "RC5 fertig!";

void init_rc5()
{
MCUCR |= (1<<ISC01) | (1<<ISC00);; //wait rising edge
GICR |= (1<<INT0); //enable INT0
TCCR0 |= (1<<CS02); //Prescaler 256
cbi(DDRD,PD2);
}

//************************************************** **USART******************************

void init_usart(void)
{
UBRRL |= 0b01100111;
UCSRB = (1<<TXEN) | (1<<RXEN);
UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0);
}

void send_char(unsigned char s)
{
while (!(UCSRA & (1<<UDRE)));
UDR = s;
}

void send_string(char *s)
{
while(*s != '\0')
{
send_char(*s);
s++;
}
}

//************************************************** ********USART-ENDE********************


SIGNAL(SIG_INTERRUPT0)
{
char test[3];
uint8_t i;
if(last_bit == 1) {
if(TCNT0<139 && bitnummer <= 14) {
gesamt[bitnummer] = 1;
last_bit = 1;
TCNT0 = 0;
bitnummer++;
}
if(TCNT0>139 && TCNT0<194 && bitnummer <= 14) {
gesamt[bitnummer] = 0;
last_bit = 0;
TCNT0 = 0;
bitnummer++;
}
}
if(last_bit == 0) {
if(TCNT0<139 && bitnummer <= 14) {
gesamt[bitnummer] = 0;
last_bit = 0;
TCNT0 = 0;
bitnummer++;
}
if(TCNT0>139 && TCNT0<194 && bitnummer <= 14) {
gesamt[bitnummer] = 1;
last_bit = 1;
TCNT0 = 0;
bitnummer++;
}
}
if(bitnummer == 14) {
gesamt[1] = 1;
last_bit = 1;
bitnummer = 1;
TCNT0 = 0;
rdy = 1;
}
}


int main(void)
{
init_usart();
init_rc5();
sei();
uint8_t i;
char test[10];
char wert[10] = "RC5:";
for(;;)
{
if(rdy==1) {
send_string(wert);
for(i=9;i<=14;i++) { // datenbits auslesen
itoa(gesamt[i],test,2);
send_string(test);
}
rdy = 0;
}

};
}