Gast
#945367
Hallo zusammen.
Ich bastle schon lange an einer Routine zum einlesen von NEC IR
Protokoll.
Verwendet wird ein TSOP1738 entsprechend entstört direkt am INT1 eingang
eines Atmega8. (Signal invertiert).
Nun zu meinem Problem.
Via dem Interrupt INT1 wird auf die entsprechenden Flanken getriggert
(ISR).
Immer nach einer steigenden Flanke deaktiviere ich den Interrupt Int1
und aktiviere den Interrupt Zählerüberlauf vom Zähler 2. Der läuft nach
814us ab und tastet mir das Signal am Eingang INT1 ab. Nach Abtastung
deaktiviere ich den Interrupt Zählerüberlauf lösche das Flag vom Int1
und aktiviere den Interrupt INT1 wieder und warte auf die nächste
Flanke.
Den Sync erkenne ich.
Aber die Bit's kann ich nicht einlesen. Bzw. immer ein HIGH am Eingang.
Zeiten:
Interrupt steigende Flanke bis Zählerüberlauf aktiviert 13us
Bis Abtastung 814us
Abtastung und Interrupt flanke aktiviert 18us
Sonst habe ich alle sonstigen Interrupts deaktiviert. (UART,Timer1)
Anbei der Code:
SIGNAL (SIG_INTERRUPT1) //Interruptroutine Interrupt1
{
if(IR_sperr) //Sperrconter damit Zeit zum auslesen des Codes
{
IR_sperr--;
}
else
{
GIFR |= 0x80; //Flag rücksetzen
switch (Sync)
{
case 0: //Wenn noch nicht Sync erkannt
TCNT2 = 0;
MCUCR |= 0x04; // on rising edge
Sync = 1;
break;
case 1: //Wenn Sync erkannt 9ms Puls
if (((TCNT2 >0x00)) && ((TCNT2 <= 0x08))) //4Tick Toleranz
//Wenn 16T langer Sync !!!//!Achtung Zähler überläuft funktioiert
//nur mit 8Bit Zähler 9000us / 34.7us = 258!
{
MCUCR &= ~0x04; // on faling edge
TCNT2 = 0;
Sync = 2;
}
else
{
MCUCR &= ~0x04; // on faling edge
Sync = 0;
shiftreg(0,1); //Lösche Schieberegister
}
break;
case 2: //Wenn 4ms erkannt
if (((TCNT2 >0x36)) && ((TCNT2 <= 0x44))) //4Tick Toleranz
//Wenn 4T langer Sync !!!//
{
MCUCR |= 0x04; // on rising edge
Sync = 3;
}
else
{
MCUCR &= ~0x04; // on faling edge
Sync = 0;
shiftreg(0,1); //Lösche Schieberegister
}
break;
case 3: //Im Decodiermodus
if(!(MCUCR & 0x04))//Wenn falling Edge
{
MCUCR |= 0x04; // on rising edge
}
else
{
TCNT2 = -24; // in 840us ein Zählerüberlauf
TIMSK |= 0x40; //Setze Timer Overflow Interrupt
GICR &= ~0x80; // ext. Int1 disable
}
break;
}
}
GIFR |= 0x80; //Flag rücksetzen
}
*********************************************************************
SIGNAL (SIG_OVERFLOW2) //Interruptroutine Zählerüberlauf
{
static unsigned char In_Port,stat;
In_Port = IR_PP1; //Lese Wert von Port ein
if(In_Port == 1) //Wenn Input High
{
//Setze Bit auf 1
TIMSK &= ~0x40; //Lösche Timer Overflow Interrupt
GICR |= 0x80; // ext. Int1 enable
MCUCR &= ~0x04; // on falling edge
}
else
{
//Setze Bit auf 0
TIMSK &= ~0x40; //Lösche Timer Overflow Interrupt
GICR |= 0x80; // ext. Int1 enable
MCUCR |= 0x04; // on rising edge
}
stat = shiftreg(In_Port,0);
if(stat == 1 ||stat == 2 )
{
Sync = 0;
shiftreg(0,1); //Lösche Schieberegister
MCUCR &= ~0x04; // on faling edge
GICR |= 0x80; // ext. Int1 enable
}
GIFR |= 0x80; // clear Int0-Flag
}
****************************************************
in .h File
#define IR_PP1 ((PIND & 0x8) >> 3)
********************************************************
//Init des Zählers bzw. vorteiler
TCCR2 = 0x06; // 0x6 == 1/256 Timer2 auf 28.8kHz --> 34.7us (
bei 7.3728Mhz Osz.)
*************************************************************
Was mache ich falsch?
Danke im voraus
Grüsse Michael