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;
}
}
}
Lesezeichen