Subversion Repositories svnkaklik

Rev

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
 
85
void main()
86
{
87
   lcd_init();                  // zinicializuj LCD display
88
   delay_ms(5);
89
   printf(lcd_putc,"Ahoj...");
90
   delay_ms(1000);
91
 
92
//while(TRUE)
93
//{
94
//   read_nibble(&x);
95
//   lcd_gotoxy(1,1);                       // vytiskni X a Y
96
//   printf(lcd_putc,"O:%d    ",x);
97
//}
98
 
99
   x = 0;
100
   y = 0;
101
 
102
   while (true)
103
   {
104
   int8     osa, hodnota, kontrola;
105
   int      counter;                      // pocitadlo 1 a 0 v detektoru
106
   int      e1,e2;                        // pocitadla chyb - ladici
107
 
108
   e1=0;
109
   e2=0;
110
 
111
   counter=4;
112
 
113
decoder:
114
 
115
      counter=0;                                   // vynuluj citac
116
//      do                                           // vyhledej synchronizacni jednicky
117
//      {
118
//         if (!prijmout(&bit)) goto decoder;      // prijmi bit; pri chybe zacni znovu
119
//         if (1==bit) counter++; else goto decoder;  // kdyz je bit 1, tak zvys citac; jinak zacni znovu
120
//      } while(counter<4);                          // pockej na 4 jednicky
121
 if (!read_nibble(&osa)) goto decoder;
122
 if (osa!=15) {e1++; goto decoder;};
123
      if (!read_nibble(&osa)) goto decoder;   // nacti identifikator osy
124
 
125
      if (!read_nibble(&hodnota)) goto decoder;   // nacti 1. nibble; pri chybe zacni znovu
126
      if (!read_nibble(&kontrola)) goto decoder;  // nacti 2. nibble; pri chybe zacni znovu
127
      if (hodnota != kontrola) {e2++; goto decoder;}           // zacni znovu, pokud jsou ruzne nibble
128
 
129
 
130
      switch (osa)            // rozeskoc se podle adresy osy
131
      {
132
      case OSA_X:
133
         {
134
            x=hodnota;
135
            break;
136
         };
137
      case OSA_Y:
138
         {
139
            y=hodnota;
140
            break;
141
         };
142
      case TLs:
143
         {
144
            e1++;
145
            break;
146
         };
147
      };
148
 
149
      // ladici vypisy
150
      lcd_gotoxy(1,1);                       // vytiskni X a Y
151
      printf(lcd_putc,"X: %U      ", x);
152
      lcd_gotoxy(1,2);
153
      printf(lcd_putc,"Y: %U      ", y);
154
 
155
      // ovladani serv
156
      output_high(SERVO_X);
157
      delay_ms(1);
158
      for (osa=x; osa--; osa>0)
159
         delay_us(65);
160
      output_low(SERVO_X);
161
 
162
      output_high(SERVO_Y);
163
      delay_ms(1);
164
      for (osa=y; osa--; osa>0)
165
         delay_us(65);
166
      output_low(SERVO_Y);
167
 
168
      for (osa=30-x-y; osa--; osa>0)
169
         delay_us(65);
170
 
171
    }
172
}
173
 
174