martin02
14.09.2010, 12:25
Hallo zusammen,
ich habe diesen http://www.rn-wissen.de/index.php/RC5-Decoder_f%C3%BCr_ATMega Dekoder in einen ATmega8 programmiert.
TSOP1838 hängt am INT0
F_CPU ist 7372800
Prescaler ist 1024
In "rc5.c" habe ich unten stehendes Programm angehängt.
UART läuft. Aber das Ding empfängt nur Nullen. Habe 3 Fernbedienungen ausprobiert, alle gehen, aber es kommt immer Adresse und Code = 0 raus.
Was kann ich tun? Habe ich was falsch gemacht?
Grüße
Martin
int uart_putc (char c)
{
while (!(UCSRA & (1<<UDRE))); // warten bis Senden moeglich
UDR = c; // sende Zeichen
return 0;
}
void uart_puts (char *s)
{
while (*s)
{ // so lange *s != '\0' also ungleich dem "String-Endezeichen"
uart_putc(*s);
s++;
}
}
int main (void)
{
uint8_t Hunderter;
uint8_t Zener;
uint8_t Einer;
UCSRB = (1<<RXEN)|(1<<TXEN); // rx INT, rx/tx en
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // 8 Bit
UBRRL = 47; // 9.600 Baud
DDRB = (1<<PB1)|(1<<PB2);
/* der ensprechende INT-Port muss INPUT sein */
/* RC5 initialisieren, alle Adressen zulassen */
rc5_init (RC5_ALL);
/* Interrupts zulassen */
sei();
while(1)
{
while (rc5.flip == -1);
uint8_t code = rc5.code;
uint8_t addr = rc5.addr;
Hunderter = 0;
Zener = 0;
Einer = addr;
while(Einer >= 100)
{
Einer = Einer - 100;
Hunderter = Hunderter + 1;
}
while(Einer >= 10)
{
Einer = Einer - 10;
Zener = Zener + 1;
}
uart_puts("Adresse:");
uart_putc(48+Hunderter);
uart_putc(48+Zener);
uart_putc(48+Einer);
uart_putc(10);
uart_putc(13);
Hunderter = 0;
Zener = 0;
Einer = code;
while(Einer >= 100)
{
Einer = Einer - 100;
Hunderter = Hunderter + 1;
}
while(Einer >= 10)
{
Einer = Einer - 10;
Zener = Zener + 1;
}
uart_puts("Code:");
uart_putc(48+Hunderter);
uart_putc(48+Zener);
uart_putc(48+Einer);
uart_putc(10);
uart_putc(13);
rc5.flip = -1;
}
}
ich habe diesen http://www.rn-wissen.de/index.php/RC5-Decoder_f%C3%BCr_ATMega Dekoder in einen ATmega8 programmiert.
TSOP1838 hängt am INT0
F_CPU ist 7372800
Prescaler ist 1024
In "rc5.c" habe ich unten stehendes Programm angehängt.
UART läuft. Aber das Ding empfängt nur Nullen. Habe 3 Fernbedienungen ausprobiert, alle gehen, aber es kommt immer Adresse und Code = 0 raus.
Was kann ich tun? Habe ich was falsch gemacht?
Grüße
Martin
int uart_putc (char c)
{
while (!(UCSRA & (1<<UDRE))); // warten bis Senden moeglich
UDR = c; // sende Zeichen
return 0;
}
void uart_puts (char *s)
{
while (*s)
{ // so lange *s != '\0' also ungleich dem "String-Endezeichen"
uart_putc(*s);
s++;
}
}
int main (void)
{
uint8_t Hunderter;
uint8_t Zener;
uint8_t Einer;
UCSRB = (1<<RXEN)|(1<<TXEN); // rx INT, rx/tx en
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // 8 Bit
UBRRL = 47; // 9.600 Baud
DDRB = (1<<PB1)|(1<<PB2);
/* der ensprechende INT-Port muss INPUT sein */
/* RC5 initialisieren, alle Adressen zulassen */
rc5_init (RC5_ALL);
/* Interrupts zulassen */
sei();
while(1)
{
while (rc5.flip == -1);
uint8_t code = rc5.code;
uint8_t addr = rc5.addr;
Hunderter = 0;
Zener = 0;
Einer = addr;
while(Einer >= 100)
{
Einer = Einer - 100;
Hunderter = Hunderter + 1;
}
while(Einer >= 10)
{
Einer = Einer - 10;
Zener = Zener + 1;
}
uart_puts("Adresse:");
uart_putc(48+Hunderter);
uart_putc(48+Zener);
uart_putc(48+Einer);
uart_putc(10);
uart_putc(13);
Hunderter = 0;
Zener = 0;
Einer = code;
while(Einer >= 100)
{
Einer = Einer - 100;
Hunderter = Hunderter + 1;
}
while(Einer >= 10)
{
Einer = Einer - 10;
Zener = Zener + 1;
}
uart_puts("Code:");
uart_putc(48+Hunderter);
uart_putc(48+Zener);
uart_putc(48+Einer);
uart_putc(10);
uart_putc(13);
rc5.flip = -1;
}
}