Subversion Repositories svnkaklik

Rev

Go to most recent revision | 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;
132
 
133
   if (prijmi_ramec(&kanal,&data))
134
   {
135
      switch (kanal)            // rozeskoc se podle adresy osy
136
      {
137
      case OSA_X:
138
         {
139
            x=data;
140
            xc++;
141
            break;
142
         };
143
      case OSA_Y:
144
         {
145
            y=data;
146
            yc++;
147
            break;
148
         };
149
      case TLs:
150
         {
151
            e4++;
152
            break;
153
         };
154
      };
155
 
156
      // ladici vypisy
157
      lcd_gotoxy(1,1);                       // vytiskni X a Y
158
      printf(lcd_putc,"X%2U %3U%3U%3U  ", x, xc, e1, e2);
159
      lcd_gotoxy(1,2);
160
      printf(lcd_putc,"Y%2U %3U%3U%3U  ", y, yc, e3, e4);
161
 
162
      // ovladani serv
163
      output_high(SERVO_X);
164
      delay_ms(1);
165
      for (data=x; data--; data>0)
166
         delay_us(65);
167
      output_low(SERVO_X);
168
 
169
      output_high(SERVO_Y);
170
      delay_ms(1);
171
      for (data=y; data--; data>0)
172
         delay_us(65);
173
      output_low(SERVO_Y);
174
 
175
      for (data=30-x-y; data--; data>0)
176
         delay_us(65);
177
 
178
    }
179
 }
180
}
181
 
182