|
Прерывание вызывается таймером с частотой 2(3,4)*битовую скорость.
В прерывании крутится конечный автомат (состояние автомата - в регистре, переход на обработчик по таблице). Для 8 каналов и 2 самплов на бит в таблице должно быть 8*8*2 = 128 указателей на обработчики приемника. Поскольку дуплекс - еще 8*8 для передачи (обработчик передатчика вызывается только 1 раз за бит).
А обработчики примерно так (пример на с для одного канала):
case CheckStart:
if(!(PINB & (1<<0)))
RxState = RxBit0; //start detected
break;
case RxBit0: case RxBit1:
case RxBit2: case RxBit3:
case RxBit4: case RxBit5:
case RxBit6: case RxBit7:
RxShiftBuffer >>= 1;
if(PINB & (1<<0)) RxShiftBuffer |= (1<<7);
RxState++;
break;
case RxCheckStop:
if((PINB & (1<<0))) // stop bit detected
{
unsigned char Tmp = RxHead;
if((unsigned char)(Tmp - RxTail) < (unsigned char) RxBufferSize)
{
RxBuffer[ Tmp++ & (RxBufferSize - 1) ] = RxShiftBuffer;
RxHead = Tmp;
}
}
RxState = Reset;
}
E-mail: info@telesys.ru