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 |
415,5 → 423,15 |
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; |
}; |
} |
} |