Subversion Repositories svnkaklik

Rev

Details | Last modification | View Log

Rev Author Line No. Line
6 kaklik 1
// Prijimac
2
 
3
#DEFINE  DEBUG          PIN_A4      // ladici pomocne synchronizacni impulzy
4
 
5
#include "main.h"
6
#include "..\common.h"
7
 
8
#DEFINE  LCD_RS         PIN_B1      // rizeni registru LCD displeje
9
#DEFINE  LCD_E          PIN_B0      // enable LCD displeje
10
#DEFINE  LCD_DATA_LSB   PIN_B2      // pripojeni LSB bitu datoveho portu LCD displeje (celkem 4 bity vzestupne za sebou)
11
#INCLUDE "MYLCD.C"
12
 
13
#DEFINE  PRIJIMAC       PIN_A3      // pin na ktery je pripojen prijimac
14
#DEFINE  SERVO_X        PIN_A0      // pin na ktery je pripojeno servo
15
#DEFINE  SERVO_Y        PIN_A1
16
 
17
// Prijme datovy nibble vcetne zasynchronizovani
18
// Chybi dodelat timeout
19
int8 prijmi_nibble(int8* datovy, int8* data)
20
{
21
   int8 i;
22
 
23
   #IFDEF DEBUG
24
   int1 tmp;
25
   #ENDIF
26
 
27
   *data=0;
28
 
29
   // Cekam na dlouhou nulu
30
   for (i=4; i>0; i--)
31
   {
32
      if (input(PRIJIMAC)) i=4;
33
      delay_us(IMPULS/2);
34
   }
35
 
36
   // Cekam na jednicku (start ramce)
37
   for (; !input(PRIJIMAC); )
38
   {
39
   }
40
 
41
   // Ctu typ nibblu
42
   delay_us(2*IMPULS+2*IMPULS/3);
43
   *datovy=input(PRIJIMAC);
44
 
45
   // Prenasim bity
46
   for (i=0; i<4; i++)
47
   {
48
      delay_us(2*IMPULS);
49
      *data >>= 1;
50
      if (input(PRIJIMAC)) *data +=0b1000;
51
 
52
      #IFDEF DEBUG
53
      output_bit(DEBUG,tmp);
54
      tmp=!tmp;
55
      #ELSE
56
      delay_us(20);
57
      #ENDIF
58
   }
59
 
60
   return FALSE;
61
}
62
 
63
 
64
// Prijme datovy ramec
65
// Pokud nastane chyba vraci kod chyby
66
int8 prijmi_ramec(int8* kanal, int8* data)
67
{
68
   int8 datovy;
69
   int8 suma;
70
 
71
   // Cekej na synchronizacni nibble
72
   do
73
   {
74
      if (prijmi_nibble(&datovy, data)) return 1;     // chyba timout
75
   }
76
   while(datovy);
77
 
78
   // Zkontroluj magickou hodnotu
79
   if (*data != SYNC_NIBBLE) return 2;                // chyba magickeho kodu ramce
80
 
81
   // Prijmi cislo kanalu
82
   if (prijmi_nibble(&datovy, kanal)) return 1;      // chyba timeout
83
   if (!datovy) return 3;                             // chyba typu nibblu
84
 
85
   // Prijmi data
86
   if (prijmi_nibble(&datovy, data)) return 1;       // chyba timeout
87
   if (!datovy) return 3;                             // chyba typu nibblu
88
 
89
   // Prijmi zabezpeceni
90
   if (prijmi_nibble(&datovy, &suma)) return 1;       // chyba timeout
91
   if (!datovy) return 3;                             // chyba typu nibblu
92
 
93
   // Zkontroluj kontrolni soucet
94
   if (((*kanal+*data) & 0b1111) != suma) return 3;     // chyba kontrolniho souctu
95
 
96
   return 0;
97
}
98
 
99
 
100
 
101
int8     x,y,tlacitka;
102
int8     xc,yc;          // pocitadla aktualizace x a y
103
int      e1,e2,e3,e4;    // pocitadla chyb - ladici
104
 
105
void main()
106
{
107
   lcd_init();                  // zinicializuj LCD display
108
   delay_ms(5);
109
   printf(lcd_putc,"Ahoj...");
110
   delay_ms(300);
111
 
112
   x  = 0;
113
   y  = 0;
114
   xc = 0;
115
   yc = 0;
116
   e1 = 0;
117
   e2 = 0;
118
   e3 = 0;
119
   e4 = 0;
120
 
121
 while (true)
122
 {
123
   int8 kanal, data;
124
 
125
   if (prijmi_ramec(&kanal,&data))
126
   e1++;
127
   else
128
   {
129
      switch (kanal)            // rozeskoc se podle adresy osy
130
      {
131
      case OSA_X:
132
         {
133
            x=data;
134
            xc++;
135
            break;
136
         };
137
      case OSA_Y:
138
         {
139
            y=data;
140
            yc++;
141
            break;
142
         };
143
      case TLs:
144
         {
145
            tlacitka=data;
146
            break;
147
         };
148
      };
149
 
150
   if (true==bit_test(tlacitka,1))
151
   {
152
   output_high(pin_A2);
153
 
154
   }
155
   else output_low(pin_A2);
156
 
157
 
158
      // ladici vypisy
159
 
160
      lcd_gotoxy(1,1);                       // vytiskni X a Y
161
      printf(lcd_putc,"X%2U %3U%3U%3U  ", x, xc, e1, e2);
162
      lcd_gotoxy(1,2);
163
      printf(lcd_putc,"Y%2U %3U%3U%3U  ", y, yc, e3, tlacitka);
164
 
165
      // ovladani serv
166
      output_high(SERVO_X);
167
      delay_ms(1);
168
      for (data=x; data--; data>0)
169
         delay_us(65);
170
      output_low(SERVO_X);
171
 
172
      output_high(SERVO_Y);
173
      delay_ms(1);
174
      for (data=y; data--; data>0)
175
         delay_us(65);
176
      output_low(SERVO_Y);
177
 
178
      for (data=30-x-y; data--; data>0)
179
         delay_us(65);
180
 
181
    }
182
 }
183
}
184
 
185