0,0 → 1,182 |
// Prijimac |
|
#DEFINE DEBUG PIN_A2 // ladici pomocne synchronizacni impulzy |
|
#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 |
|
|
// Prijme datovy nibble vcetne zasynchronizovani |
// Chybi dodelat timeout |
int8 prijmi_nibble(int8* datovy, int8* data) |
{ |
int8 i; |
|
#IFDEF DEBUG |
int1 tmp; |
#ENDIF |
|
*data=0; |
|
// Cekam na dlouhou nulu |
for (i=4; i>0; i--) |
{ |
if (input(PRIJIMAC)) i=4; |
delay_us(IMPULS/2); |
} |
|
// Cekam na jednicku (start ramce) |
for (; !input(PRIJIMAC); ) |
{ |
} |
|
// Ctu typ nibblu |
delay_us(2*IMPULS+2*IMPULS/3); |
*datovy=input(PRIJIMAC); |
|
// Prenasim bity |
for (i=0; i<4; i++) |
{ |
delay_us(2*IMPULS); |
*data >>= 1; |
if (input(PRIJIMAC)) *data +=0b1000; |
|
#IFDEF DEBUG |
output_bit(DEBUG,tmp); |
tmp=!tmp; |
#ELSE |
delay_us(20); |
#ENDIF |
} |
|
return FALSE; |
} |
|
|
// Prijme datovy ramec |
// Pokud nastane chyba vraci TRUE |
int8 prijmi_ramec(int8* kanal, int8* data) |
{ |
int8 datovy; |
int8 suma; |
|
// Cekej na synchronizacni nibble |
do |
{ |
if (prijmi_nibble(&datovy, data)) return 1; // chyba timout |
} |
while(datovy); |
|
// Zkontroluj magickou hodnotu |
if (*data != SYNC_NIBBLE) return 2; // chyba magickeho kodu ramce |
|
// Prijmi cislo kanalu |
if (prijmi_nibble(&datovy, kanal)) return 1; // chyba timeout |
if (!datovy) return 3; // chyba typu nibblu |
|
// Prijmi data |
if (prijmi_nibble(&datovy, data)) return 1; // chyba timeout |
if (!datovy) return 3; // chyba typu nibblu |
|
// Prijmi zabezpeceni |
if (prijmi_nibble(&datovy, &suma)) return 1; // chyba timeout |
if (!datovy) return 3; // chyba typu nibblu |
|
// Zkontroluj kontrolni soucet |
|
|
//lcd_gotoxy(1,1); |
//printf(lcd_putc,"R:%3U %3U %3U ",*kanal,*data,suma); |
//delay_ms(1000); |
|
|
if (((*kanal+*data) & 0b1111) != suma) return 3; // chyba kontrolniho souctu |
|
return 0; |
} |
|
|
|
int8 x,y; |
int8 xc,yc; // pocitadla aktualizace x a y |
int e1,e2,e3,e4; // pocitadla chyb - ladici |
|
void main() |
{ |
lcd_init(); // zinicializuj LCD display |
delay_ms(5); |
printf(lcd_putc,"Ahoj..."); |
delay_ms(300); |
|
x = 0; |
y = 0; |
xc=0; |
yc=0; |
e1=0; |
e2=0; |
e3=0; |
e4=0; |
|
while (true) |
{ |
int8 kanal, data; |
|
if (prijmi_ramec(&kanal,&data)) |
{ |
switch (kanal) // rozeskoc se podle adresy osy |
{ |
case OSA_X: |
{ |
x=data; |
xc++; |
break; |
}; |
case OSA_Y: |
{ |
y=data; |
yc++; |
break; |
}; |
case TLs: |
{ |
e4++; |
break; |
}; |
}; |
|
// ladici vypisy |
lcd_gotoxy(1,1); // vytiskni X a Y |
printf(lcd_putc,"X%2U %3U%3U%3U ", x, xc, e1, e2); |
lcd_gotoxy(1,2); |
printf(lcd_putc,"Y%2U %3U%3U%3U ", y, yc, e3, e4); |
|
// ovladani serv |
output_high(SERVO_X); |
delay_ms(1); |
for (data=x; data--; data>0) |
delay_us(65); |
output_low(SERVO_X); |
|
output_high(SERVO_Y); |
delay_ms(1); |
for (data=y; data--; data>0) |
delay_us(65); |
output_low(SERVO_Y); |
|
for (data=30-x-y; data--; data>0) |
delay_us(65); |
|
} |
} |
} |
|
|