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=6; i>0; i--)
18
   {
19
      delay_us(IMPULS/2);
20
      if (input(PRIJIMAC)) i=4;
21
   }
22
 
23
   // Cekam na jednicku (start ramce)
24
   while (!input(PRIJIMAC));
25
   // Ctu typ nibblu
26
   delay_us(2*IMPULS+2*IMPULS/3);
27
   *datovy=input(PRIJIMAC);
28
 
29
   // Prenasim bity
30
   for (i=0; i<4; i++)
31
   {
32
      delay_us(2*IMPULS);
33
      *data >>= 1;
34
      if (input(PRIJIMAC)) *data +=0b1000;
35
 
36
      #IFDEF DEBUG
37
      output_bit(DEBUG,tmp);
38
      tmp=!tmp;
39
      #ELSE
40
      delay_us(20);
41
      #ENDIF
42
   }
43
 
44
   return FALSE;
45
}
46
 
47
 
48
// Prijme datovy ramec
49
// Pokud nastane chyba vraci kod chyby
50
int8 prijmi_ramec(int8* kanal, int8* data)
51
{
52
   int8  i;
53
   int8 datovy;
54
   int8 suma;
55
 
56
   // Cekej na uvodni ticho
57
   for (i=4; i>0; i--)
58
   {
59
      delay_us(IMPULS/4);
60
      if (input(PRIJIMAC)) i=4;
61
   }
62
 
63
   // Cekej na startovaci 1
64
   while (!input(PRIJIMAC));
65
 
66
   // Posun na cteni prvniho datoveho bitu
67
   delay_us(2*IMPULS+2*IMPULS/3);
68
 
69
 
70
   do
71
   {
72
      if (prijmi_nibble(&datovy, data)) return 1;     // chyba timout
73
   }
74
   while(datovy);
75
 
76
   // Zkontroluj magickou hodnotu
77
   if (*data != SYNC_NIBBLE) return 2;                // chyba magickeho kodu ramce
78
 
79
   // Prijmi cislo kanalu
80
   if (prijmi_nibble(&datovy, kanal)) return 1;      // chyba timeout
81
   if (!datovy) return 3;                               // chyba typu nibblu
82
 
83
   // Prijmi data
84
   if (prijmi_nibble(&datovy, data)) return 1;       // chyba timeout
85
   if (!datovy) return 3;                             // chyba typu nibblu
86
 
87
   // Prijmi zabezpeceni
88
   if (prijmi_nibble(&datovy, &suma)) return 1;       // chyba timeout
89
   if (!datovy) return 3;                             // chyba typu nibblu
90
 
91
   // Zkontroluj kontrolni soucet
92
   if (((*kanal+*data) & 0b1111) != suma) return 3;     // chyba kontrolniho souctu
93
 
94
   return 0;
95
}
96