So, mittlerweile bekomme ich zumindest sowohl 1 als auch 0 in rc5.code geschrieben, allerdings stimmen die Codes meistens nicht, oft kommt bei mehreren Tasten der selbe Code etc.
Vom Timing her müsste es stimmen, das hab ich mittlerweile oft nachgerechnet. Kann es sein, dass die Zeit, die bei der Abarbeitung des Codes verloren geht, meine Rechnung stört?
Code://**********************************************************USART-ENDE******************** SIGNAL(SIG_OVERFLOW0) { bitnummer++; TCNT0 = 145; //Timer soll nach 1.778ms Overflow haben if(bitnummer == 12) { TIMSK &= ~(1<<TOIE0); //Wenn die 11 Bits davor erfasst wurden, TimerIRQ deaktivieren rc5.rdy = 1; bitnummer = 13; } if(bitnummer<6) //Wenn i<6, werden die ausgelesenen Bits zu Addresse hinzugefügr { if((PIND & (1<<3)) != 0) { rc5.addresse |= (1<<(5-bitnummer)); } else { rc5.addresse &= ~(1<<(5-bitnummer)); } } if((bitnummer>=6 && bitnummer<=11)) //6 - 11 werden zu rc5.code hinzugefügt { if((PIND & (1<<3)) != 0) { rc5.code &= ~(1<<(11-bitnummer)); } else { rc5.code |= (1<<(11-bitnummer)); } } } SIGNAL(SIG_INTERRUPT1) { if(rc5.s_bit<3) { rc5.s_bit++; } if(rc5.s_bit == 3) { TIMSK |= (1<<TOIE0); // Timer0 Interrupts enablen TCNT0 = 228; //Timer so vorladen, dass er zur Mitte des 2. Halbbits den ersten Timeroverflow hat GICR &= ~(1<<INT1); //Int1 disablen } } 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(rc5.code,result,10); char hello2[15] = "RC5-Code: "; send_string(hello2); send_string(result); rc5.rdy = 0; rc5.s_bit = 0; GICR |= (1<<INT1); // ext. Interrupt wieder aktivieren bitnummer = 0; // bitnummer zurücksetzten rc5.addresse = 0; rc5.code = 0; } } }







Zitieren

Lesezeichen