Subversion Repositories svnkaklik

Rev

Details | Last modification | View Log

Rev Author Line No. Line
6 kaklik 1
// Prijimac
2
 
3
#DEFINE  DEBUG          PIN_A2      // 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
 
18
// Prijme datovy nibble vcetne zasynchronizovani
19
// Chybi dodelat timeout
20
int8 prijmi_nibble(int8* datovy, int8* data)
21
{
22
   int8 i;
23
 
24
   #IFDEF DEBUG
25
   int1 tmp;
26
   #ENDIF
27
 
28
   *data=0;
29
 
30
   // Cekam na dlouhou nulu
31
   for (i=4; i>0; i--)
32
   {
33
      if (input(PRIJIMAC)) i=4;
34
      delay_us(IMPULS/2);
35
   }
36
 
37
   // Cekam na jednicku (start ramce)
38
   for (; !input(PRIJIMAC); )
39
   {
40
   }
41
 
42
   // Ctu typ nibblu
43
   delay_us(2*IMPULS+2*IMPULS/3);
44
   *datovy=input(PRIJIMAC);
45
 
46
   // Prenasim bity
47
   for (i=0; i<4; i++)
48
   {
49
      delay_us(2*IMPULS);
50
      *data >>= 1;
51
      if (input(PRIJIMAC)) *data +=0b1000;
52
 
53
      #IFDEF DEBUG
54
      output_bit(DEBUG,tmp);
55
      tmp=!tmp;
56
      #ELSE
57
      delay_us(20);
58
      #ENDIF
59
   }
60
 
61
   return FALSE;
62
}
63
 
64
 
65
// Prijme datovy ramec
66
// Pokud nastane chyba vraci TRUE
67
int8 prijmi_ramec(int8* kanal, int8* data)
68
{
69
   int8 datovy;
70
   int8 suma;
71
 
72
   // Cekej na synchronizacni nibble
73
   do
74
   {
75
      if (prijmi_nibble(&datovy, data)) return 1;     // chyba timout
76
   }
77
   while(datovy);
78
 
79
   // Zkontroluj magickou hodnotu
80
   if (*data != SYNC_NIBBLE) return 2;                // chyba magickeho kodu ramce
81
 
82
   // Prijmi cislo kanalu
83
   if (prijmi_nibble(&datovy, kanal)) return 1;      // chyba timeout
84
   if (!datovy) return 3;                             // chyba typu nibblu
85
 
86
   // Prijmi data
87
   if (prijmi_nibble(&datovy, data)) return 1;       // chyba timeout
88
   if (!datovy) return 3;                             // chyba typu nibblu
89
 
90
   // Prijmi zabezpeceni
91
   if (prijmi_nibble(&datovy, &suma)) return 1;       // chyba timeout
92
   if (!datovy) return 3;                             // chyba typu nibblu
93
 
94
   // Zkontroluj kontrolni soucet
95
 
96
 
97
//lcd_gotoxy(1,1);
98
//printf(lcd_putc,"R:%3U %3U %3U  ",*kanal,*data,suma);
99
//delay_ms(1000);
100
 
101
 
102
   if (((*kanal+*data) & 0b1111) != suma) return 3;     // chyba kontrolniho souctu
103
 
104
   return 0;
105
}
106
 
107
 
108
 
109
int8     x,y;
110
int8     xc,yc;          // pocitadla aktualizace x a y
111
int      e1,e2,e3,e4;    // pocitadla chyb - ladici
112
 
113
void main()
114
{
115
   lcd_init();                  // zinicializuj LCD display
116
   delay_ms(5);
117
   printf(lcd_putc,"Ahoj...");
118
   delay_ms(300);
119
 
120
   x = 0;
121
   y = 0;
122
   xc=0;
123
   yc=0;
124
   e1=0;
125
   e2=0;
126
   e3=0;
127
   e4=0;
128
 
129
   while (true)
130
   {
131
int8 kanal, data, e;
132
/*   int8     kanal, data, suma;
133
   int1 tmp;
134
   int8 datovy;
135
 
136
decoder:
137
 
138
 if (prijmi_nibble(&datovy,&kanal)) goto decoder;
139
 if (datovy) goto decoder;
140
 
141
// if (kanal!=15) {e1++; goto decoder;};
142
      if (prijmi_nibble(&datovy, &kanal)) goto decoder;   // nacti identifikator osy
143
 
144
      if (prijmi_nibble(&datovy, &data)) goto decoder;   // nacti 1. nibble; pri chybe zacni znovu
145
      if (prijmi_nibble(&datovy, &suma)) goto decoder;  // nacti 2. nibble; pri chybe zacni znovu
146
      if (((kanal+data) & 0b1111) != suma) {e1++; goto decoder;}           // zacni znovu, pokud jsou ruzne nibble
147
 
148
*/
149
e = prijmi_ramec(&kanal,&data);
150
//lcd_gotoxy(1,1);
151
//printf(lcd_putc,"Q:%3U %3U %3U  ",kanal,data,e);
152
//delay_ms(1000);
153
if (!e)
154
      switch (kanal)            // rozeskoc se podle adresy osy
155
      {
156
      case OSA_X:
157
         {
158
            x=data;
159
            xc++;
160
            break;
161
         };
162
      case OSA_Y:
163
         {
164
            y=data;
165
            yc++;
166
            break;
167
         };
168
      case TLs:
169
         {
170
            e4++;
171
            break;
172
         };
173
      };
174
 
175
      // ladici vypisy
176
      lcd_gotoxy(1,1);                       // vytiskni X a Y
177
      printf(lcd_putc,"X%2U %3U%3U%3U  ", x, xc, e1, e);
178
      lcd_gotoxy(1,2);
179
      printf(lcd_putc,"Y%2U %3U%3U%3U  ", y, yc, e3, data);
180
 
181
      // ovladani serv
182
      output_high(SERVO_X);
183
      delay_ms(1);
184
      for (data=x; data--; data>0)
185
         delay_us(65);
186
      output_low(SERVO_X);
187
 
188
      output_high(SERVO_Y);
189
      delay_ms(1);
190
      for (data=y; data--; data>0)
191
         delay_us(65);
192
      output_low(SERVO_Y);
193
 
194
      for (data=30-x-y; data--; data>0)
195
         delay_us(65);
196
 
197
    }
198
}
199
 
200