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(int1* datovy, int8* data)
35
{
36
   int8 i;
37
   int8 d;
38
int1 tmp;
39
 
40
   d=0;
41
 
42
   // Cekam na dlouhou nulu
43
   for (i=4; i>0; i--)
44
   {
45
      if (input(PRIJIMAC)) i=4;
46
      delay_us(IMPULS/2);
47
   }
48
 
49
   // Cekam na jednicku (start ramce)
50
   for (; !input(PRIJIMAC); )
51
   {
52
      delay_us(IMPULS/8);
53
   }
54
 
55
//   delay_us(IMPULS/2);
56
   delay_us(2*IMPULS+IMPULS/2);
57
   *datovy=input(PRIJIMAC);
58
 
59
   // Prenasim bity
60
   for (i=0; i<4; i++)
61
   {
62
      delay_us(2*IMPULS);
63
      d >>= 1;
64
      if (input(PRIJIMAC)) d +=0b1000;
65
output_bit(PIN_A4,tmp);
66
tmp=!tmp;
67
   }
68
//   delay_us(2*IMPULS);           // cas posledniho datoveho bitu
69
 
70
   *data = d;
71
   return TRUE;
72
}
73
 
74
 
75
int8     x,y;
76
int8     xc,yc;          // pocitadla aktualizace x a y
77
int      e1,e2,e3,e4;    // pocitadla chyb - ladici
78
 
79
void main()
80
{
81
   lcd_init();                  // zinicializuj LCD display
82
   delay_ms(5);
83
   printf(lcd_putc,"Ahoj...");
84
   delay_ms(300);
85
 
86
   x = 0;
87
   y = 0;
88
   xc=0;
89
   yc=0;
90
   e1=0;
91
   e2=0;
92
   e3=0;
93
   e4=0;
94
 
95
   while (true)
96
   {
97
   int8     kanal, data, suma;
98
   int1 tmp;
99
   int8 datovy;
100
 
101
decoder:
102
//output_high(PIN_A1);
103
 
104
//      do                                           // vyhledej synchronizacni jednicky
105
//      {
106
//         if (!prijmout(&bit)) goto decoder;      // prijmi bit; pri chybe zacni znovu
107
//         if (1==bit) counter++; else goto decoder;  // kdyz je bit 1, tak zvys citac; jinak zacni znovu
108
//      } while(counter<4);                          // pockej na 4 jednicky
109
///output_bit(PIN_A1,tmp);
110
///tmp=!tmp;
111
 if (!read_nibble(&datovy,&kanal)) goto decoder;
112
 if (datovy) goto decoder;
113
// output_low(PIN_A1);
114
//output_low(PIN_A1);
115
 
116
// if (kanal!=15) {e1++; goto decoder;};
117
      if (!read_nibble(&datovy, &kanal)) goto decoder;   // nacti identifikator osy
118
 
119
      if (!read_nibble(&datovy, &data)) goto decoder;   // nacti 1. nibble; pri chybe zacni znovu
120
      if (!read_nibble(&datovy, &suma)) goto decoder;  // nacti 2. nibble; pri chybe zacni znovu
121
      if (((kanal+data) & 0b1111) != suma) {e1++; goto decoder;}           // zacni znovu, pokud jsou ruzne nibble
122
 
123
 
124
      switch (kanal)            // rozeskoc se podle adresy osy
125
      {
126
      case OSA_X:
127
         {
128
            x=data;
129
            xc++;
130
            break;
131
         };
132
      case OSA_Y:
133
         {
134
            y=data;
135
            yc++;
136
            break;
137
         };
138
      case TLs:
139
         {
140
            e4++;
141
            break;
142
         };
143
      };
144
 
145
      // ladici vypisy
146
      lcd_gotoxy(1,1);                       // vytiskni X a Y
147
      printf(lcd_putc,"X%2U %3U%3U%3U  ", x, xc, e1, e2);
148
      lcd_gotoxy(1,2);
149
      printf(lcd_putc,"Y%2U %3U%3U%3U  ", y, yc, e3, data);
150
 
151
      // ovladani serv
152
      output_high(SERVO_X);
153
      delay_ms(1);
154
      for (data=x; data--; data>0)
155
         delay_us(65);
156
      output_low(SERVO_X);
157
 
158
      output_high(SERVO_Y);
159
      delay_ms(1);
160
      for (data=y; data--; data>0)
161
         delay_us(65);
162
      output_low(SERVO_Y);
163
 
164
      for (data=30-x-y; data--; data>0)
165
         delay_us(65);
166
 
167
    }
168
}
169
 
170