Subversion Repositories svnkaklik

Rev

Go to most recent revision | Blame | Last modification | View Log | Download

#include "main.h"
#include "..\common.h"

#DEFINE LCD_RS          PIN_B1      // rizeni registru LCD displeje
#DEFINE LCD_E           PIN_B0      // enable LCD displeje
#DEFINE LCD_DATA_LSB    PIN_B2      // pripojeni LSB bitu datoveho portu LCD displeje (celkem 4 bity vzestupne za sebou)
#INCLUDE "MYLCD.C"
#DEFINE PRIJIMAC        PIN_A3      // pin na ktery je pripojen prijimac
#DEFINE  SERVO_X         PIN_A0        // pin na ktery je pripojeno servo
#DEFINE  SERVO_Y         PIN_A1

int8     bit,x,y;
int      counter;                      // pocitadlo 1 a 0 v detektoru
int      x_old=0,y_old;

void servo(int uhel, int souradnice)
{
    
    
      if (X==souradnice) output_high(SERVO_X); else output_high(SERVO_Y);

      delay_us(62.5*uhel);

      if (SERVO_X==souradnice) output_low(SERVO_X); else output_low(SERVO_Y);
    //  delay_ms(10);
    
  
}

int8 prijmout(int8* bit)
{
// ||    |
// |--|_____   1
//       |
// |-|__|-|_   0

   while (!input(PRIJIMAC)) ;                // cekej na jednicku
   delay_us(IMPULS/4);                       // presvec se, jestli je stale 1 po 1/4 impulsu
   if (!input(PRIJIMAC)) return(false);          // vrat chybu, kdyz neni stale 1
   delay_us(3*IMPULS);                       // pockej na rozhodovaci misto
   if (input(PRIJIMAC)) *bit=0; else *bit=1; // dekoduj 1 nebo 0
   delay_us(IMPULS);                         // pockej na konec znaku

   output_bit(PIN_A0, *bit);  // kontrolni vystup

   return(true);                                // vrat, ze se cteni povedlo
}

int8 read_nibble(int8* value)
{
   int8 n;     // citac
   int8 bit;   // pomocna promenna

   *value=0;
   for (n=1; n<=4; n++)                      // prijmi 4 bity
   {
      *value >>= 1;                          // posun jiz prectene do leva
      if (0==prijmout(&bit)) return(false);      // prijmi bit; pri chybe cteni vrat chybu
      *value |= bit << 3;                    // pridej bit do nibblu
   };
   return(true);                                // vrat 1, jako ,ze je vse O.K.
}

/*void dekodovat(void)
{
   int8 osa, hodnota, kontrola;

   counter=4;

decoder:

      counter=0;                                   // vynuluj citac
      do                                           // vyhledej synchronizacni jednicky
      {
         if (!prijmout(&bit)) goto decoder;      // prijmi bit; pri chybe zacni znovu
         if (1==bit) counter++; else goto decoder;  // kdyz je bit 1, tak zvys citac; jinak zacni znovu
      } while(counter<4);                          // pockej na 4 jednicky

      if (!read_nibble(&osa)) goto decoder;   // nacti identifikator osy

      if (!read_nibble(&hodnota)) goto decoder;   // nacti 1. nibble; pri chybe zacni znovu
      if (!read_nibble(&kontrola)) goto decoder;  // nacti 2. nibble; pri chybe zacni znovu
      if (hodnota != kontrola) goto decoder;               // zacni znovu, pokud jsou ruzne nibble

      switch (osa)            // rozeskoc se podle adresy osy
      {
      case OSA_X:
         {
            x=hodnota;
            break;
         };
      case OSA_Y:
         {
            y=hodnota;
            break;
         };
      case TLs:
         {
            break;
         };
      };
}
*/
void main()
{
   lcd_init();                  // zinicializuj LCD display

   while (true)
   {
   int8 osa, hodnota, kontrola;

   counter=4;

decoder:

      servo(x_old,SERVO_X);
      
      servo(y_old,SERVO_Y);

      counter=0;                                   // vynuluj citac
      do                                           // vyhledej synchronizacni jednicky
      {
         if (!prijmout(&bit)) goto decoder;      // prijmi bit; pri chybe zacni znovu
         if (1==bit) counter++; else goto decoder;  // kdyz je bit 1, tak zvys citac; jinak zacni znovu
      } while(counter<4);                          // pockej na 4 jednicky

      if (!read_nibble(&osa)) goto decoder;   // nacti identifikator osy

      if (!read_nibble(&hodnota)) goto decoder;   // nacti 1. nibble; pri chybe zacni znovu
      if (!read_nibble(&kontrola)) goto decoder;  // nacti 2. nibble; pri chybe zacni znovu
      if (hodnota != kontrola) goto decoder;               // zacni znovu, pokud jsou ruzne nibble

      switch (osa)            // rozeskoc se podle adresy osy
      {
      case OSA_X:
         {
    
            x=hodnota;
            x_old=x;
            
            break;
         };
      case OSA_Y:
         {
            y=hodnota;
            y_old=y
            break;
         };
      case TLs:
         {
            break;
         };
      };


      lcd_gotoxy(1,1);                       // vytiskni X a Y
      printf(lcd_putc,"X: %U      ", x);
      lcd_gotoxy(1,2);
      printf(lcd_putc,"Y: %U      ", y);
    }
}