Hallo,
ich habe versucht ein Programm zu schreiben, mit dem ich RC5 Code empfangen und an die serielle Schnittstelle weitergeben kann. Mit einem Basic-Programm funktioniert dass, mit meinem C-Programm leider nicht.
Es wird zwar "Hallo Martin" ausgegeben, aber sonst nix.
Seht ihr irgendwelche Fehler, die ich übersehen habe? Vom Prinzip her zählt das Programm mit jedem Interrupt an PD4 eine Variable hoch und sobald die größer 3 ist, springt der Timer an. Bei diesen 3 Interrupts sollen die 2 Startbits und das Togglebit erkannt werden.Code:#include <avr/io.h> #include <avr/interrupt.h> struct rc5_parts { volatile char s_bit; uint8_t addresse; uint8_t code; volatile char rdy; } rc5; volatile char start_rx = 0; char mid; void init_rc5() { MCUCR |= (1<<ISC11) | (1<<ISC10); GICR |= (1<<INT1); TCCR0 |= (1<<CS02); TCNT0 = 145; } //****************************************************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_OVERFLOW0) { uint8_t i,j; i++; TCNT0 = 145; //Timer soll nach 1.778ms Overflow haben if(i == 12) { TIMSK &= ~(1<<TOIE0); rc5.rdy = 1; i = 0; } if(i<6) //Wenn i<6, werden die ausgelesenen Bits zu Addresse hinzugefügr { if(PORTD & (1<<4)) { rc5.addresse |= (1<<(i-1)); } else { rc5.addresse &= ~(1<<(i-1)); } } if((i>=6)&(i<12)) //6 - 11 werden zu rc5.code hinzugefügt { if(PORTD & (1<<4)) { rc5.code |= (1<<(i-6)); } else { rc5.code &= ~(1<<(i-6)); } } } SIGNAL(SIG_INTERRUPT1) { if(rc5.s_bit<4) { rc5.s_bit++; } else { start_rx = 1; TIMSK |= (1<<TOIE0); TCNT0 |= 228; rc5.s_bit = 0; } } int main(void) { init_usart(); init_rc5(); char i = 1; sei(); char result[10]; char hello[15] = "Hallo Martin"; send_string(hello); for(;;) { if(rc5.rdy == 1) { itoa(0110,result,10); send_string(result); rc5.rdy = 0; } } }
Gruß
Martin







Zitieren

Lesezeichen