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