Spurius
26.07.2008, 14: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
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