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 kod chyby
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
   if (((*kanal+*data) & 0b1111) != suma) return 3;     // chyba kontrolniho souctu
96
 
97
   return 0;
98
}
99
 
100
 
101
 
102
int8     x,y;
103
int8     xc,yc;          // pocitadla aktualizace x a y
104
int      e1,e2,e3,e4;    // pocitadla chyb - ladici
105
 
106
void main()
107
{
108
   lcd_init();                  // zinicializuj LCD display
109
   delay_ms(5);
110
   printf(lcd_putc,"Ahoj...");
111
   delay_ms(300);
112
 
113
   x  = 0;
114
   y  = 0;
115
   xc = 0;
116
   yc = 0;
117
   e1 = 0;
118
   e2 = 0;
119
   e3 = 0;
120
   e4 = 0;
121
 
122
 while (true)
123
 {
124
   int8 kanal, data;
125
 
126
   if (prijmi_ramec(&kanal,&data))
127
   e1++;
128
   else
129
   {
130
      switch (kanal)            // rozeskoc se podle adresy osy
131
      {
132
      case OSA_X:
133
         {
134
            x=data;
135
            xc++;
136
            break;
137
         };
138
      case OSA_Y:
139
         {
140
            y=data;
141
            yc++;
142
            break;
143
         };
144
      case TLs:
145
         {
146
            e4++;
147
            break;
148
         };
149
      };
150
 
151
      // ladici vypisy
152
      lcd_gotoxy(1,1);                       // vytiskni X a Y
153
      printf(lcd_putc,"X%2U %3U%3U%3U  ", x, xc, e1, e2);
154
      lcd_gotoxy(1,2);
155
      printf(lcd_putc,"Y%2U %3U%3U%3U  ", y, yc, e3, e4);
156
 
157
      // ovladani serv
158
      output_high(SERVO_X);
159
      delay_ms(1);
160
      for (data=x; data--; data>0)
161
         delay_us(65);
162
      output_low(SERVO_X);
163
 
164
      output_high(SERVO_Y);
165
      delay_ms(1);
166
      for (data=y; data--; data>0)
167
         delay_us(65);
168
      output_low(SERVO_Y);
169
 
170
      for (data=30-x-y; data--; data>0)
171
         delay_us(65);
172
 
173
    }
174
 }
175
}
176
 
177