Subversion Repositories svnkaklik

Rev

Details | Last modification | View Log

Rev Author Line No. Line
6 kaklik 1
 
2
//#DEFINE  DEBUG          PIN_A4      // ladici pomocne synchronizacni impulzy
3
 
4
// Prijme datovy nibble vcetne zasynchronizovani
5
// Chybi dodelat timeout
6
int8 prijmi_nibble(int8* datovy, int8* data)
7
{
8
   int8 i;
9
 
10
   #IFDEF DEBUG
11
   int1 tmp;
12
   #ENDIF
13
 
14
   *data=0;
15
 
16
   // Cekam na dlouhou nulu
17
   for (i=4; i>0; i--)
18
   {
19
      if (input(PRIJIMAC)) i=4;
20
      delay_us(IMPULS/2);
21
   }
22
 
23
   // Cekam na jednicku (start ramce)
24
   for (; !input(PRIJIMAC); )
25
   {
26
   }
27
 
28
   // Ctu typ nibblu
29
   delay_us(2*IMPULS+2*IMPULS/3);
30
   *datovy=input(PRIJIMAC);
31
 
32
   // Prenasim bity
33
   for (i=0; i<4; i++)
34
   {
35
      delay_us(2*IMPULS);
36
      *data >>= 1;
37
      if (input(PRIJIMAC)) *data +=0b1000;
38
 
39
      #IFDEF DEBUG
40
      output_bit(DEBUG,tmp);
41
      tmp=!tmp;
42
      #ELSE
43
      delay_us(20);
44
      #ENDIF
45
   }
46
 
47
   return FALSE;
48
}
49
 
50
 
51
// Prijme datovy ramec
52
// Pokud nastane chyba vraci kod chyby
53
int8 prijmi_ramec(int8* kanal, int8* data)
54
{
55
   int8 datovy;
56
   int8 suma;
57
 
58
   // Cekej na synchronizacni nibble
59
   do
60
   {
61
      if (prijmi_nibble(&datovy, data)) return 1;     // chyba timout
62
   }
63
   while(datovy);
64
 
65
   // Zkontroluj magickou hodnotu
66
   if (*data != SYNC_NIBBLE) return 2;                // chyba magickeho kodu ramce
67
 
68
   // Prijmi cislo kanalu
69
   if (prijmi_nibble(&datovy, kanal)) return 1;      // chyba timeout
70
   if (!datovy) return 3;                             // chyba typu nibblu
71
 
72
   // Prijmi data
73
   if (prijmi_nibble(&datovy, data)) return 1;       // chyba timeout
74
   if (!datovy) return 3;                             // chyba typu nibblu
75
 
76
   // Prijmi zabezpeceni
77
   if (prijmi_nibble(&datovy, &suma)) return 1;       // chyba timeout
78
   if (!datovy) return 3;                             // chyba typu nibblu
79
 
80
   // Zkontroluj kontrolni soucet
81
   if (((*kanal+*data) & 0b1111) != suma) return 3;     // chyba kontrolniho souctu
82
 
83
   return 0;
84
}
85