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
#include "main.h"
4
#include "..\common.h"
5
 
6
#DEFINE  LCD_RS          PIN_B1      // rizeni registru LCD displeje
7
#DEFINE  LCD_E           PIN_B0      // enable LCD displeje
8
#DEFINE  LCD_DATA_LSB    PIN_B2      // pripojeni LSB bitu datoveho portu LCD displeje (celkem 4 bity vzestupne za sebou)
9
#INCLUDE "MYLCD.C"
10
 
11
#DEFINE  PRIJIMAC        PIN_A3      // pin na ktery je pripojen prijimac
12
#DEFINE  SERVO_X         PIN_A0      // pin na ktery je pripojeno servo
13
#DEFINE  SERVO_Y         PIN_A1
14
 
15
 
16
int8 prijmout(int8* bit)
17
{
18
// ||    |
19
// |--|_____   1
20
//       |
21
// |-|__|-|_   0
22
 
23
   while (!input(PRIJIMAC)) ;                // cekej na jednicku
24
   delay_us(IMPULS/4);                       // presvec se, jestli je stale 1 po 1/4 impulsu
25
   if (!input(PRIJIMAC)) return false;       // vrat chybu, kdyz neni stale 1
26
   delay_us(3*IMPULS);                       // pockej na rozhodovaci misto
27
///   if (input(PRIJIMAC)) *bit=0; else *bit=1; // dekoduj 1 nebo 0
28
   *bit=!input(PRIJIMAC);                    // dekoduj 1 nebo 0
29
   delay_us(IMPULS);                         // pockej na konec znaku
30
 
31
   return true;                                // vrat, ze se cteni povedlo
32
}
33
 
34
int8 read_nibble(int8* data)
35
{
36
   int8 i;
37
   int8 d;
38
 
39
   d=0;
40
 
41
   // Cekam na dlouhou nulu
42
   for (i=8; i>0; i--)
43
   {
44
      if (input(PRIJIMAC)) i=8;
45
      delay_us(IMPULS/2);
46
   }
47
 
48
   // Cekam na jednicku (start ramce)
49
   for (; !input(PRIJIMAC); )
50
   {
51
      delay_us(IMPULS/2);
52
   }
53
 
54
   delay_us(IMPULS/2);
55
 
56
   // Prenasim bity
57
   for (i=0; i<4; i++)
58
   {
59
      delay_us(2*IMPULS);
60
      d >>= 1;
61
      if (!input(PRIJIMAC)) d +=8;
62
   }
63
   *data = d;
64
   return TRUE;
65
}
66
 
67
int8 read_nibble2(int8* value)
68
{
69
   int8 n;     // citac
70
   int8 bit;   // pomocna promenna
71
 
72
   *value=0;
73
   for (n=1; n<=4; n++)                      // prijmi 4 bity
74
   {
75
      *value >>= 1;                          // posun jiz prectene do leva
76
      if (0==prijmout(&bit)) return(false);      // prijmi bit; pri chybe cteni vrat chybu
77
      *value |= bit << 3;                    // pridej bit do nibblu
78
   };
79
   return(true);                                // vrat 1, jako ,ze je vse O.K.
80
}
81
 
82
 
83
int8     bit,x,y;
84
int8 xc,yc;          // pocitadla aktualizace x a y
85
 
86
void main()
87
{
88
   lcd_init();                  // zinicializuj LCD display
89
   delay_ms(5);
90
   printf(lcd_putc,"Ahoj...");
91
   delay_ms(1000);
92
 
93
//while(TRUE)
94
//{
95
//   read_nibble(&x);
96
//   lcd_gotoxy(1,1);                       // vytiskni X a Y
97
//   printf(lcd_putc,"O:%d    ",x);
98
//}
99
 
100
   x = 0;
101
   y = 0;
102
xc=0;
103
yc=0;
104
 
105
   while (true)
106
   {
107
   int8     osa, hodnota, kontrola;
108
   int      counter;                      // pocitadlo 1 a 0 v detektoru
109
   int      e1,e2;                        // pocitadla chyb - ladici
110
 
111
   e1=0;
112
   e2=0;
113
 
114
   counter=4;
115
 
116
decoder:
117
 
118
      counter=0;                                   // vynuluj citac
119
//      do                                           // vyhledej synchronizacni jednicky
120
//      {
121
//         if (!prijmout(&bit)) goto decoder;      // prijmi bit; pri chybe zacni znovu
122
//         if (1==bit) counter++; else goto decoder;  // kdyz je bit 1, tak zvys citac; jinak zacni znovu
123
//      } while(counter<4);                          // pockej na 4 jednicky
124
 if (!read_nibble(&osa)) goto decoder;
125
 if (osa!=15) {e1++; goto decoder;};
126
      if (!read_nibble(&osa)) goto decoder;   // nacti identifikator osy
127
 
128
      if (!read_nibble(&hodnota)) goto decoder;   // nacti 1. nibble; pri chybe zacni znovu
129
      if (!read_nibble(&kontrola)) goto decoder;  // nacti 2. nibble; pri chybe zacni znovu
130
      if (hodnota != kontrola) {e2++; goto decoder;}           // zacni znovu, pokud jsou ruzne nibble
131
 
132
 
133
      switch (osa)            // rozeskoc se podle adresy osy
134
      {
135
      case OSA_X:
136
         {
137
            x=hodnota;
138
            xc++;
139
            break;
140
         };
141
      case OSA_Y:
142
         {
143
            y=hodnota;
144
            yc++;
145
            break;
146
         };
147
      case TLs:
148
         {
149
            e1++;
150
            break;
151
         };
152
      };
153
 
154
      // ladici vypisy
155
      lcd_gotoxy(1,1);                       // vytiskni X a Y
156
      printf(lcd_putc,"X: %U %u %U     ", x, xc, e1);
157
      lcd_gotoxy(1,2);
158
      printf(lcd_putc,"Y: %U %U %U     ", y, yc, e2);
159
 
160
      // ovladani serv
161
      output_high(SERVO_X);
162
      delay_ms(1);
163
      for (osa=x; osa--; osa>0)
164
         delay_us(65);
165
      output_low(SERVO_X);
166
 
167
      output_high(SERVO_Y);
168
      delay_ms(1);
169
      for (osa=y; osa--; osa>0)
170
         delay_us(65);
171
      output_low(SERVO_Y);
172
 
173
      for (osa=30-x-y; osa--; osa>0)
174
         delay_us(65);
175
 
176
    }
177
}
178
 
179