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 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 znakureturn 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.}int8 bit,x,y;void main(){lcd_init(); // zinicializuj LCD displaywhile (true){int8 osa, hodnota, kontrola;int counter; // pocitadlo 1 a 0 v detektorucounter=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;};};// ladici vypisylcd_gotoxy(1,1); // vytiskni X a Yprintf(lcd_putc,"X: %U ", x);lcd_gotoxy(1,2);printf(lcd_putc,"Y: %U ", y);// ovladani servoutput_high(SERVO_X);delay_ms(1);for (osa=x; osa--; osa>0)delay_us(65);output_low(SERVO_X);output_high(SERVO_Y);delay_ms(1);for (osa=y; osa--; osa>0)delay_us(65);output_low(SERVO_Y);for (osa=30-x-y; osa--; osa>0)delay_us(65);}}