Subversion Repositories svnkaklik

Compare Revisions

Ignore whitespace Rev 199 → Rev 200

/roboti/istrobot/camerus/SW/876/camerus.c
7,8 → 7,8
#USE FAST_IO (C) // Brana C je ve FAST_IO modu, aby slo rychle cist z kamery
 
// A/D vstupy
#define LMAX 4 // AN4/RA5 - leve cidlo na vyjeti z cary
#define RMAX 3 // AN3/RA3 - prave cidlo na vyjeti z cary
#define RMAX 4 // AN4/RA5 - leve cidlo na vyjeti z cary
#define LMAX 3 // AN3/RA3 - prave cidlo na vyjeti z cary
#define CERVENA 2 // AN2/RA2 - cervene kroutitko
#define ZELENA 1 // AN1/RA0 - zelene kroutitko
#define MODRA 0 // AN0/RA1 - modre kroutitko
23,7 → 23,7
#define MOT_2 PIN_C2 //
#define DATA PIN_B2 // K modulu LEDbar data
#define CP PIN_B1 // K modulu LEDbar hodiny
#define ODO PIN_A4 // Ze snimace z odometrie z praveho kola
//#define ODO PIN_A4 // Ze snimace z odometrie z praveho kola / nove je to na RC0 na TIMER1
#define IRRX PIN_B0 // Vstup INT, generuje preruseni pri prekazce
#define IRTX PIN_B3 // Modulovani vysilaci IR LED na detekci prekazky
#define PROXIMITY PIN_C7 // Cidlo kratkeho dosahu na cihlu
48,8 → 48,51
int8 stred; // Vystredeni kolecka
int16 odocounter; // Zaznamenani aktualniho stavu pocitadla odometrie
 
inline void brzda()
// Zobrazeni jednoho byte na modulu LEDbar
void disp(int8 x)
{
int n;
 
x=~x;
for(n=0;n<=7;n++)
{
if (x & 1 == 1) output_high(DATA); else output_low(DATA);
output_high(CP);
x>>=1;
output_low(CP);
}
}
 
// Blikani LEDbarem ve stilu Night Rider
void NightRider(int8 x)
{
int n,i,j;
 
for(j=0;j<x;j++)
{
i=0x01;
for(n=0;n<7;n++)
{
disp(i);
rotate_left(&i, 1);
delay_ms(40);
}
for(n=0;n<7;n++)
{
disp(i);
rotate_right(&i, 1);
delay_ms(40);
}
}
disp(i);
delay_ms(40);
i=0;
disp(i);
}
 
// Brzdeni motorama stridou 1:1
void brzda()
{
int8 n,i;
 
set_pwm1_duty(0); // vypni PWM
126,10 → 169,12
output_low(MOT_R);
 
odocounter=get_timer1(); // Poznamenej aktualni stav odometrie
//!!! while(true) {disp(MAKE8(get_timer1(),0)); delay_ms(10);};
 
while(true)
{
if(!input(PROXIMITY)) break; // Je cihla blizko?
if(get_timer1()>=odocounter+7) return; // nedojeli jsme k cihle, jed dal
if(get_timer1()>(odocounter+7)) return; // nedojeli jsme k cihle, jed dal
};
set_pwm1_duty(0); // reverz (zabrzdi)
set_pwm2_duty(0);
146,49 → 191,7
}
}
 
// Zobrazeni jednoho byte na modulu LEDbar
void disp(int8 x)
{
int n;
 
x=~x;
for(n=0;n<=7;n++)
{
if (x & 1 == 1) output_high(DATA); else output_low(DATA);
output_high(CP);
x>>=1;
output_low(CP);
}
}
 
// Blikani LEDbarem ve stilu Night Rider
void NightRider(int8 x)
{
int n,i,j;
 
for(j=0;j<x;j++)
{
i=0x01;
for(n=0;n<7;n++)
{
disp(i);
rotate_left(&i, 1);
delay_ms(40);
}
for(n=0;n<7;n++)
{
disp(i);
rotate_right(&i, 1);
delay_ms(40);
}
}
disp(i);
delay_ms(40);
i=0;
disp(i);
}
 
 
//---------------------------------- MAIN --------------------------------------
void main()
{
327,15 → 330,19
cas=CASAVR-CASMIN; // Inicializace promenych, aby neslo servo za roh a aby se to rozjelo jeste dneska
stav=start;
trasa=0;
set_timer1(0); // Vynuluj citac odometrie
 
// ......... Hlavni smycka .........
// ........................... Hlavni smycka ................................
while(true)
{
int8 pom;
int8 n;
 
next_snap:
 
pom=0;
while(!input(HREF)); // Cekej nez se zacnou posilat pixely z radky
while(input(HREF)); // Preskoc 1. radku
while(!input(HREF)); // Cekej nez se zacnou posilat pixely z 2. radky
set_timer0(0); // Vynuluj pocitadlo casu
while(input(HREF)) // Po dobu vysilani radky cekej na hranu W/B
{
386,6 → 393,7
set_pwm2_duty(0);
}
 
//!!! trasu zrusit a predelat to na odometrii
if((stav==jizda)&&(trasa>50)) // musi to alespon 1s jet
{
ext_int_edge(H_TO_L); // Nastav podminky preruseni od cihly
411,9 → 419,19
stav=jizda;
};
}
 
pom=0x80; // Zobrazeni pozice cary na displayi
for(n=CASMAX/8; n<cas; n+=CASMAX/8) pom>>=1;
disp(pom);
};
 
while(true)
{
set_adc_channel(LMAX); // Levy UV sensor
for(n=0;n<20;n++) if(input(HREF)) goto next_snap;
if(read_adc()<128) cas=CASMIN;
set_adc_channel(RMAX); // Pravy UV sensor
for(n=0;n<20;n++) if(input(HREF)) goto next_snap;
if(read_adc()<128) cas=CASMAX;
};
}
}