Subversion Repositories svnkaklik

Compare Revisions

Ignore whitespace Rev 5 → Rev 6

/schemata/prenos/letadlo/SW/prijimac/ostra_bez_ladicich_impulsu/main.c
0,0 → 1,115
// Prijimac
#include "main.h"
#include "..\..\common.h"
 
#DEFINE PRIJIMAC PIN_A3 // pin na ktery je pripojen prijimac
#DEFINE SERVO_X PIN_A2 // piny na ktere jsou pripojena serva
#DEFINE SERVO_Y PIN_B0
#DEFINE DILEK 20 // jeden krok serva v mikrosekundach
 
#bit T0IF = 0xB.2 // int. flag od Timer0
 
static int8 x = 16; // poloha serv
static int8 y = 16;
int8 trim_x = 2;
int8 trim_y = 2;
 
boolean flag; // priznak, ze doslo k preruseni prijmu ovladanim serv
 
#int_TIMER0
TIMER0_isr()
{
int8 n;
 
flag = true; // doslo k preruseni prijmu
// x = 15;
// y = 15;
 
output_high(SERVO_X); // uvodni impuls 1ms
delay_ms(1);
for (n=trim_x; n>0; n--);
for (n=x; n>0; n--) Delay_us(DILEK);
output_low(SERVO_X);
 
output_high(SERVO_Y);
delay_ms(1);
for (n=trim_y; n>0; n--);
for (n=y; n>0; n--) Delay_us(DILEK);
output_low(SERVO_Y);
}
 
// output_high(PIN_B1); // debug pin
 
void main()
{
int i;
int8 osa, data, check, suma;
 
setup_counters(RTCC_INTERNAL,RTCC_DIV_64); // Preruseni po 16,3ms
enable_interrupts(INT_TIMER0);
enable_interrupts(global);
 
loop:
flag = false;
 
// Cekej na uvodni ticho
for (i=SYNC; i>0; i--)
{
delay_us(IMPULS/4);
if (flag) goto loop;
if (!input(PRIJIMAC)) i=SYNC;
}
 
// Cekej na startovaci 1
while (input(PRIJIMAC)) if (flag) goto loop;
 
if (flag) goto loop;
 
// Posun na cteni prvniho datoveho bitu
delay_us(2*IMPULS+2*IMPULS/3);
 
// Cteme bity
for (i=8; i>0; i--)
{
data <<= 1;
if (input(PRIJIMAC)) data |= 1;
if (flag) goto loop;
output_high(PIN_B1); // debug pin
delay_us(2*IMPULS+15);
output_low(PIN_B1); // debug pin
}
 
// Cteme checksum
check = 0;
for (i=4; i>0; i--)
{
check <<= 1;
if (input(PRIJIMAC)) check |= 1;
if (flag) goto loop;
output_high(PIN_B1); // debug pin
delay_us(2*IMPULS+15);
output_low(PIN_B1); // debug pin
}
 
swap(data); // kontrola kontrolniho souctu
suma = data & 0xF;
swap(data);
suma += data & 0xF;
suma++;
suma &= 0xF;
if (suma != check) goto loop;
 
osa = data >> 5; // extrahuj z ramce cislo osy a hodnotu
data &= 0x1F;
switch(osa)
{
case OSA_X:
x=data;
break;
case OSA_y:
y=data;
break;
}
 
goto loop;
}