Subversion Repositories svnkaklik

Rev

Details | Last modification | View Log

Rev Author Line No. Line
6 kaklik 1
#include "main.h"
2
#include "..\common.h"
3
 
4
#DEFINE  LCD_RS          PIN_B1      // rizeni registru LCD displeje
5
#DEFINE  LCD_E           PIN_B0      // enable LCD displeje
6
#DEFINE  LCD_DATA_LSB    PIN_B2      // pripojeni LSB bitu datoveho portu LCD displeje (celkem 4 bity vzestupne za sebou)
7
#INCLUDE "MYLCD.C"
8
 
9
#DEFINE  PRIJIMAC        PIN_A3      // pin na ktery je pripojen prijimac
10
#DEFINE  SERVO_X         PIN_A0      // pin na ktery je pripojeno servo
11
#DEFINE  SERVO_Y         PIN_A1
12
 
13
 
14
int8 prijmout(int8* bit)
15
{
16
// ||    |
17
// |--|_____   1
18
//       |
19
// |-|__|-|_   0
20
 
21
   while (!input(PRIJIMAC)) ;                // cekej na jednicku
22
   delay_us(IMPULS/4);                       // presvec se, jestli je stale 1 po 1/4 impulsu
23
   if (!input(PRIJIMAC)) return false;          // vrat chybu, kdyz neni stale 1
24
   delay_us(3*IMPULS);                       // pockej na rozhodovaci misto
25
   if (input(PRIJIMAC)) *bit=0; else *bit=1; // dekoduj 1 nebo 0
26
   delay_us(IMPULS);                         // pockej na konec znaku
27
 
28
   return true;                                // vrat, ze se cteni povedlo
29
}
30
 
31
int8 read_nibble(int8* value)
32
{
33
   int8 n;     // citac
34
   int8 bit;   // pomocna promenna
35
 
36
   *value=0;
37
   for (n=1; n<=4; n++)                      // prijmi 4 bity
38
   {
39
      *value >>= 1;                          // posun jiz prectene do leva
40
      if (0==prijmout(&bit)) return(false);      // prijmi bit; pri chybe cteni vrat chybu
41
      *value |= bit << 3;                    // pridej bit do nibblu
42
   };
43
   return(true);                                // vrat 1, jako ,ze je vse O.K.
44
}
45
 
46
 
47
int8     bit,x,y;
48
 
49
void main()
50
{
51
   lcd_init();                  // zinicializuj LCD display
52
 
53
   while (true)
54
   {
55
   int8 osa, hodnota, kontrola;
56
   int      counter;                      // pocitadlo 1 a 0 v detektoru
57
 
58
   counter=4;
59
 
60
decoder:
61
 
62
      counter=0;                                   // vynuluj citac
63
      do                                           // vyhledej synchronizacni jednicky
64
      {
65
         if (!prijmout(&bit)) goto decoder;      // prijmi bit; pri chybe zacni znovu
66
         if (1==bit) counter++; else goto decoder;  // kdyz je bit 1, tak zvys citac; jinak zacni znovu
67
      } while(counter<4);                          // pockej na 4 jednicky
68
 
69
      if (!read_nibble(&osa)) goto decoder;   // nacti identifikator osy
70
 
71
      if (!read_nibble(&hodnota)) goto decoder;   // nacti 1. nibble; pri chybe zacni znovu
72
      if (!read_nibble(&kontrola)) goto decoder;  // nacti 2. nibble; pri chybe zacni znovu
73
      if (hodnota != kontrola) goto decoder;               // zacni znovu, pokud jsou ruzne nibble
74
 
75
      switch (osa)            // rozeskoc se podle adresy osy
76
      {
77
      case OSA_X:
78
         {
79
            x=hodnota;
80
            break;
81
         };
82
      case OSA_Y:
83
         {
84
            y=hodnota;
85
            break;
86
         };
87
      case TLs:
88
         {
89
            break;
90
         };
91
      };
92
 
93
      // ladici vypisy 
94
      lcd_gotoxy(1,1);                       // vytiskni X a Y
95
      printf(lcd_putc,"X: %U      ", x);
96
      lcd_gotoxy(1,2);
97
      printf(lcd_putc,"Y: %U      ", y);
98
 
99
      // ovladani serv  
100
      output_high(SERVO_X);
101
      delay_ms(1);
102
      for (osa=x; osa--; osa>0)
103
         delay_us(65);
104
      output_low(SERVO_X);
105
 
106
      output_high(SERVO_Y);
107
      delay_ms(1);
108
      for (osa=y; osa--; osa>0)
109
         delay_us(65);
110
      output_low(SERVO_Y);
111
 
112
      for (osa=30-x-y; osa--; osa>0)
113
         delay_us(65);
114
 
115
    }
116
}
117
 
118