12,10 → 12,53 |
#define LED PIN_C0 // LED signalizujici start programu |
#define HREF PIN_C5 // Signal HREF z kamery (v H po celou dobu radku) |
#define PIX PIN_C6 // Vstup pro body z kamery (za trivstupim hradlem OR (dig. komparator)) |
#define SERVO PIN_B7 // Vystup na servo (1 az 2ms po cca 20ms (synchronizovano snimkovym kmitoctem)) |
#define SERVO PIN_B4 // Vystup na servo (1 az 2ms po cca 20ms (synchronizovano snimkovym kmitoctem)) |
#define MOT_L PIN_B5 // Smer otaceni leveho motoru; druhy pol je RC2 |
#define MOT_R PIN_B6 // Smer otaceni praveho motoru; druhy pol je RC1 |
|
#define DATA PIN_B2 |
#define CP PIN_B1 |
|
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); |
} |
} |
|
void NightRider(int 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(100); |
} |
for(n=0;n<7;n++) |
{ |
disp(i); |
rotate_right(&i, 1); |
delay_ms(100); |
} |
} |
disp(i); |
delay_ms(100); |
i=0; |
disp(i); |
} |
|
void main() |
{ |
int8 cas; // Cas hrany bila/cerna v radce |
33,21 → 76,20 |
setup_timer_2(T2_DIV_BY_16,255,1); // Casovac PWM motoru |
setup_ccp1(CCP_PWM); // RC1 // PWM pro motory |
setup_ccp2(CCP_PWM); // RC2 |
setup_comparator(NC_NC_NC_NC); |
setup_comparator(NC_NC_NC_NC); |
setup_vref(FALSE); |
|
set_tris_c(0b11111000); // Nastaveni vstup/vystup pro branu C, protoze se nedela automaticky |
|
|
set_pwm1_duty(0); // Zastav motory |
set_pwm2_duty(0); |
output_low(MOT_L); |
output_low(MOT_R); |
|
output_high(LED); // Budeme blikat LED, aby se poznalo, ze byl RESET |
NightRider(1); // Aby se poznalo, ze byl RESET |
// Musi se pockat, nez se rozjede kamera, nez se do ni zacnou posilat prikazy |
|
delay_ms(200); // Musi se pockat, nez se rozjede kamera, nez se do ni zacnou posilat prikazy |
|
//... Nastaveni kamery ... |
//... Nastaveni kamery ... |
i2c_start(); // Soft RESET kamery |
i2c_write(0xC0); // Pro single slave musi mit vsechny zapisy adresu C0h |
i2c_write(0x12); // Adresa registru COMH |
60,19 → 102,20 |
i2c_write(0b01000001); |
i2c_stop(); |
|
|
/* |
i2c_start(); // Contrast |
i2c_write(0xC0); |
i2c_write(0x05); |
i2c_write(0xA0); |
i2c_write(0xA0); // 48h |
i2c_stop(); |
/* |
*/ |
i2c_start(); // Brightness |
i2c_write(0xC0); |
i2c_write(0x06); |
i2c_write(0x80); |
i2c_write(0x90); // 80h |
i2c_stop(); |
|
/* |
i2c_start(); // Band Filter |
i2c_write(0xC0); |
i2c_write(0x2D); |
91,16 → 134,25 |
i2c_write(45); |
i2c_stop(); |
|
output_low(LED); // Blikani LED |
delay_ms(200); |
NightRider(1); // Aby se poznalo, ze byl RESET |
|
output_high(LED); // Blikani LED |
delay_ms(200); |
output_low(LED); |
|
cas=128; // Inicializace promenych, aby neslo servo za roh a aby se to rozjelo jeste dneska |
ble=0; |
|
/* |
while(true) |
{ |
disp(ble); |
i2c_start(); |
i2c_write(0xC0); |
i2c_write(0x06); |
i2c_write(ble); |
i2c_stop(); |
delay_ms(1000); |
ble+=0x10; |
}; |
*/ |
|
// ... Hlavni smycka ... |
while(true) |
{ |
108,11 → 160,17 |
set_timer0(0); // Vynuluj pocitadlo casu |
while(input(HREF)) // Po dobu vysilani radky cekej na hranu W/B |
{ |
// Dodelat rozpoznani cerne cary napric pro zastaveni |
// Pockat na shozeni signalu HREF |
if(!input(PIX)) // Pokud se dvakrat za sebou precetla CERNA |
if(!input(PIX)) |
if(!input(PIX)) |
{ |
cas=get_timer0(); // Precti cas z citace casu hrany |
cas=255-cas; // Vlevo je vpravo |
int8 pom; |
|
pom=get_timer0(); // Precti cas z citace casu hrany |
// cas=255-cas; // Vlevo je vpravo |
if(pom<0b11000000) cas=pom; |
break; |
}; |
}; |
120,7 → 178,7 |
set_adc_channel(MODRA); // Kroutitko na vystredeni predniho kolecka |
Delay_ms(1); |
offset=read_adc(); |
|
|
output_high(SERVO); // Odvysilani impuzu 1 az 2ms pro servo |
delay_us(1000); |
delay_us(offset); |
136,7 → 194,9 |
set_adc_channel(CERNA); |
Delay_ms(1); |
rr=read_adc(); |
|
|
disp(cas); |
|
r1=cas>>1; // Elektronicky diferencial |
r2=255-offset-(cas>>1); |
|