Цитата(fantasy @ May 6 2007, 21:02)

Код
//Приём с линии DMX512
if(RCIF)
{
if(!OERR)
{
if(RX9D&&(!FERR))
{//принят байт без ошибок
tempISRhi = RCREG;
if(dmx__wasBREAK!=false)
{
if(dmx__wasSCode!=false)
{
if(dmx__curAdr >= dmx_baseAdr)
{
DMX_Array[dmx__chNum] = tempISRhi;
dmx__chNum++;
if(dmx__chNum>=maxChNum)
{
dmx__wasBREAK=false;
dmx_syncBREAK=true;
};
}
else dmx__curAdr++;
}
else
{//проверяем на стартовый код
if(tempISRhi==0x00)
{
dmx__wasSCode = true;
dmx_error = false;
dmx_tmrDMX = 0;
}
else dmx__wasBREAK=false;
};
};
}
else
{//детектирование сигнала BREAK (ошибка кадра или отсутствие стопового бита)
dmx__curAdr = 0;
dmx__chNum = 0;
if(dmx__wasBREAK==true)dmx_syncBREAK=true;
dmx__wasBREAK = true;
dmx__wasSCode = false;
tempISRhi = RCREG;
};
}
else
{//переполнение аппаратного буфера
dmx_error = true;
dmx__wasBREAK = false;
slaveStart = false;
CREN = 0;
CREN = 1;
while(RCIF)tempISRhi = RCREG;
};
};
...
//таймер ошибки DMX (~1,2 сек.)
dmx_tmrDMX++;
if(dmx_tmrDMX==75)
{
dmx_error = true;
dmx_tmrDMX--;
};
Вот полностью рабочий и неоднакратно проверенный жизнью код. Кстати, если-бы Вы не поленились и глянули на сайт
www.microchip.com то нашли-бы искомое:
http://www.microchip.com/stellent/idcplg?I...ppnote=en5278251. А что такое dmx_syncBREAK? И зачем ему два раза TRUE присваивают?
2. На сайте MICROCHIP'а не догадался в поисковике набрать DMX512... Искал через Source Codes на свой камень.
3. Камень, кстати, как я уже писал раньше: 16F876 (уже перехожу на 16F73). Говорят, что под эти ПИКи лучше писать на ассемблере...
4. Данные надо было не только принимать, но и отправлять выборочно (об этом я не говорил правда)
5. Спасибо за все, но у меня уже и так все работает...

P.S. Просто это был мой первый опыт с микроконтроллерами...
P.P.S. "Спасибо" относится ко всем ответившим...