Ладно, не дуйся, смотри:
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Сергей Борщ 14 апреля 2005 г. 20:27
В ответ на: ну посчитаем отправлено ы 14 апреля 2005 г. 20:12

Прерывание вызывается таймером с частотой 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;
}

Только каждый такой case обрабатывает сразу все каналы - например есть обработчик "считать бит 2 со вход канала 1, считать бит 0 со входа канала 4, для канала 3 ничего не делать (граница битов), для канала 2 проверить, не старт ли".

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru