So ich hab nun alle möglichkeiten durchgetestet und im Code dokumentiert, ich würde mich sehr freuen wenn du mir anhand dieser Information Näheres sagen könntest:
Code:#if (RC5_INT == RC5_INT0) ISR(INT0_vect) #elif (RC5_INT == RC5_INT1) ISR(INT1_vect) #endif /* RC5_INT */ { // Hier impuls sync mit tastendruck code_t _code = code; uint8_t _nint = nint; uint8_t tcnt0 = TCNT0; TCNT0 = 0; if (0 == _nint) { // Hier impulse mit erster fallender Flanke /* INTx on both edges */ #if (RC5_INT == RC5_INT0) // Hier impulse mit erster fallender Flanke MCUCR = (MCUCR | (1 << ISC00)) & ~ (1 << ISC01); #elif (RC5_INT == RC5_INT1) //Hier geht er nicht rein, wegen nutzung von INT0 MCUCR = (MCUCR | (1 << ISC10)) & ~ (1 << ISC11); #endif /* RC5_INT */ TIFR = (1 << TOV0); TIMSK |= (1 << TOIE0); _code.w = 0; // Hier impulse mit erster fallender Flanke } else { // Hier impulse mit erster steigender Flanke /* Number of bits of the just elapsed period */ uint8_t n = 1; /* Bits received so far */ uint8_t _nbits = nbits; /* is TCNT0 close to RC5_TICKS or RC5_TICKS/2 ? */ if (tcnt0 > RC5_TICKS + RC5_DELTA) goto invalid; else if (tcnt0 < RC5_TICKS/2 - RC5_DELTA){ // Hier impulse mit erster steigender Flanke goto invalid;} else if (tcnt0 > RC5_TICKS - RC5_DELTA){ // Hier geht er nicht rein!! n = 2;} else if (tcnt0 > RC5_TICKS/2 + RC5_DELTA){ // Hier geht er nicht rein!! goto invalid;} /* store the just received 1 or 2 bits */ do { // Hier geht er nicht rein!!! _nbits++; if (_nbits & 1) { _code.w <<= 1; _code.b[0] |= _nint & 1; } } while (--n); if (0) { // Hier geht er nicht rein!! invalid: /* disable INTx, run into Overflow0 */ #if (RC5_INT == RC5_INT0) // Hier geht er mit erster steigenden Flanke rein GICR &= ~(1 << INT0); #elif (RC5_INT == RC5_INT1) GICR &= ~(1 << INT1); #endif /* RC5_INT */ // Hier geht er mit erster steigenden Flanke rein _nbits = 0; } // Hier geht er mit erster steigenden Flanke rein nbits = _nbits; } // Hier geht er mit erster fallenden Flanke rein code = _code; nint = 1+_nint; }







Zitieren
Lesezeichen