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_A1int8 bit,x,y;int counter; // pocitadlo 1 a 0 v detektoruint 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// |// |-|__|-|_ 0while (!input(PRIJIMAC)) ; // cekej na jednickudelay_us(IMPULS/4); // presvec se, jestli je stale 1 po 1/4 impulsuif (!input(PRIJIMAC)) return(false); // vrat chybu, kdyz neni stale 1delay_us(3*IMPULS); // pockej na rozhodovaci mistoif (input(PRIJIMAC)) *bit=0; else *bit=1; // dekoduj 1 nebo 0delay_us(IMPULS); // pockej na konec znakuoutput_bit(PIN_A0, *bit); // kontrolni vystupreturn(true); // vrat, ze se cteni povedlo}int8 read_nibble(int8* value){int8 n; // citacint8 bit; // pomocna promenna*value=0;for (n=1; n<=4; n++) // prijmi 4 bity{*value >>= 1; // posun jiz prectene do levaif (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 citacdo // vyhledej synchronizacni jednicky{if (!prijmout(&bit)) goto decoder; // prijmi bit; pri chybe zacni znovuif (1==bit) counter++; else goto decoder; // kdyz je bit 1, tak zvys citac; jinak zacni znovu} while(counter<4); // pockej na 4 jednickyif (!read_nibble(&osa)) goto decoder; // nacti identifikator osyif (!read_nibble(&hodnota)) goto decoder; // nacti 1. nibble; pri chybe zacni znovuif (!read_nibble(&kontrola)) goto decoder; // nacti 2. nibble; pri chybe zacni znovuif (hodnota != kontrola) goto decoder; // zacni znovu, pokud jsou ruzne nibbleswitch (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 displaywhile (true){int8 osa, hodnota, kontrola;counter=4;decoder:servo(x_old,SERVO_X);servo(y_old,SERVO_Y);counter=0; // vynuluj citacdo // vyhledej synchronizacni jednicky{if (!prijmout(&bit)) goto decoder; // prijmi bit; pri chybe zacni znovuif (1==bit) counter++; else goto decoder; // kdyz je bit 1, tak zvys citac; jinak zacni znovu} while(counter<4); // pockej na 4 jednickyif (!read_nibble(&osa)) goto decoder; // nacti identifikator osyif (!read_nibble(&hodnota)) goto decoder; // nacti 1. nibble; pri chybe zacni znovuif (!read_nibble(&kontrola)) goto decoder; // nacti 2. nibble; pri chybe zacni znovuif (hodnota != kontrola) goto decoder; // zacni znovu, pokud jsou ruzne nibbleswitch (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 Yprintf(lcd_putc,"X: %U ", x);lcd_gotoxy(1,2);printf(lcd_putc,"Y: %U ", y);}}