Blame | Last modification | View Log | Download
//#DEFINE DEBUG PIN_A4 // ladici pomocne synchronizacni impulzy
// Prijme datovy nibble vcetne zasynchronizovani
// Chybi dodelat timeout
int8 prijmi_nibble(int8* datovy, int8* data)
{
int8 i;
#IFDEF DEBUG
int1 tmp;
#ENDIF
*data=0;
// Cekam na dlouhou nulu
for (i=6; i>0; i--)
{
delay_us(IMPULS/2);
if (input(PRIJIMAC)) i=4;
}
// Cekam na jednicku (start ramce)
while (!input(PRIJIMAC));
// Ctu typ nibblu
delay_us(2*IMPULS+2*IMPULS/3);
*datovy=input(PRIJIMAC);
// Prenasim bity
for (i=0; i<4; i++)
{
delay_us(2*IMPULS);
*data >>= 1;
if (input(PRIJIMAC)) *data +=0b1000;
#IFDEF DEBUG
output_bit(DEBUG,tmp);
tmp=!tmp;
#ELSE
delay_us(20);
#ENDIF
}
return FALSE;
}
// Prijme datovy ramec
// Pokud nastane chyba vraci kod chyby
int8 prijmi_ramec(int8* kanal, int8* data)
{
int8 i;
int8 datovy;
int8 suma;
// Cekej na uvodni ticho
for (i=4; i>0; i--)
{
delay_us(IMPULS/4);
if (input(PRIJIMAC)) i=4;
}
// Cekej na startovaci 1
while (!input(PRIJIMAC));
// Posun na cteni prvniho datoveho bitu
delay_us(2*IMPULS+2*IMPULS/3);
do
{
if (prijmi_nibble(&datovy, data)) return 1; // chyba timout
}
while(datovy);
// Zkontroluj magickou hodnotu
if (*data != SYNC_NIBBLE) return 2; // chyba magickeho kodu ramce
// Prijmi cislo kanalu
if (prijmi_nibble(&datovy, kanal)) return 1; // chyba timeout
if (!datovy) return 3; // chyba typu nibblu
// Prijmi data
if (prijmi_nibble(&datovy, data)) return 1; // chyba timeout
if (!datovy) return 3; // chyba typu nibblu
// Prijmi zabezpeceni
if (prijmi_nibble(&datovy, &suma)) return 1; // chyba timeout
if (!datovy) return 3; // chyba typu nibblu
// Zkontroluj kontrolni soucet
if (((*kanal+*data) & 0b1111) != suma) return 3; // chyba kontrolniho souctu
return 0;
}