Цитата(d7d1cd @ Dec 21 2013, 19:28)

Но тема не закрыта.
У кого как. В связи с появлением люминесцентных ламп, излучающих в ИК диапазоне я тему закрыл.
Выкладываю исходник "как есть".
Там какие-то мои макросы управления портами, спросите если будет интересно.
Да, одна неприятная особенность этого всего - необходимость работы вложенных прерываний, поэтому прочитайте про новые лампы еще раз и хорошенько подумайте..
Код
#define MaxBoudrate 115200
#define Boudrate 38400
#define IrdaPeriod (XT2CLK/Boudrate) //32
#define MinIrdaPeriod (XT2CLK/MaxBoudrate) //32
#define IrdaPulse (MinIrdaPeriod*3/16) //6
unsigned int irda_rx_mask=1;
unsigned int irda_tx_mask=1;
unsigned int irda_rx_data;
unsigned int irda_tx_data;
#define LastRxMask 0x200
#define LastTxMask 0x400
char irda_rx_byte;
char irda_rx_flag;
void SendByteViaIrda(char B)
{ OffFunction(IrdaRxInterrupt);
irda_tx_data = (((unsigned int)B)<<2)|0xFC01;
TACTL = TASSEL_2 + TACLR + MC_0; // Timer A counts SMCLK clocks continuos Stop
TACCR2= IrdaPeriod-IrdaPulse-1; // TA2 active
irda_tx_mask=1;
TACCTL1 = 0; // disable interrupt for receiving
TACCTL0 = CCIE+CCIFG; // enable interrupt for transmittion
TACCTL2 = OUTMOD_3;
TACTL |= MC_1; // timer start to "UP" mode
for (;;)
{ if (irda_tx_mask>LastTxMask)
{ TACCTL0=0;
InitIrdaReceiveMode();
return;
}
}
}
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA_modul0(void)
{ if (irda_tx_mask<=LastTxMask)
irda_tx_mask=irda_tx_mask<<1;
else TACCTL0=0; // no more interrupts
if (irda_tx_data & irda_tx_mask) OffFunction(CCTL2);
else OnFunction(CCTL2);
}
void TimerAConfiguration(void)
{ __bic_SR_register OSCOFF;
TACTL = TASSEL_2 + TACLR + MC_0; // Timer A counts SMCLK clocks
TACCTL0 = 0; // module 0 configuration, enable interrupt later
TACCR0 = IrdaPeriod; // period of timer overflow
TACTL |= MC_1; // timer start to "UP" mode
}
void InitIrdaReceiveMode(void)
{ P2IFG=0;
P2IES=0x80;
P2IE=0x80;
TACCR0=IrdaPeriod-1; // period
TACCR1=IrdaPeriod/2; // change mask
TACCR2=IrdaPeriod+2; // never happens
irda_rx_data=0xffff;
irda_rx_mask=0x0001;
TACTL = TASSEL_2 + TACLR + MC_0;
TACCTL1=CCIE;
irda_rx_byte=0;
P2IFG=0;
P2IE=0x80;
}
#pragma vector=TIMERA1_VECTOR
__interrupt void TimerA_modul2(void)
{ irda_rx_mask=irda_rx_mask<<1;
if (irda_rx_mask==LastRxMask)
{ irda_rx_byte=(char)(irda_rx_data>>1);
TACTL = TASSEL_2 + TACLR + MC_0;
irda_rx_data=0xffff;
irda_rx_mask=0x0001;
irda_rx_flag=1;
}
TACCTL1 &= ~(unsigned int)CCIFG;
}
#pragma vector=PORT2_VECTOR
__interrupt void IrdaRxPulse(void)
{ irda_rx_data&=~irda_rx_mask;
TACTL|= MC_1;
P2IFG=0;
}
Уходя, оставьте свет...