Subversion Repositories svnkaklik

Compare Revisions

Ignore whitespace Rev 187 → Rev 188

/roboti/istrobot/camerus/SW/876/camerus.c
1,9 → 1,9
#include ".\camerus.h"
 
#USE FAST_IO (C) // Brana C je ve FAST_IO modu, aby slo rychle cteni z kamery
#USE FAST_IO (C) // Brana C je ve FAST_IO modu, aby slo rychle cist z kamery
 
// A/D vstupy
#define DALKOMER 4 // AN4/RA5 - dalkomer na cihlu
#define DALKOMER 4 // AN4/RA5 - proximity sensor na ruku startera
#define CERNA 3 // AN3/RA3
#define CERVENA 2 // AN2/RA2 - cervene kroutitko
#define ZELENA 1 // AN1/RA0 - zelene kroutitko
18,8 → 18,8
#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 CIHLA PIN_B0 // Vstup INT, generuje preruseni pri prekazce
#define IRLED PIN_C0 // Modulovani vysilaci IR LED na detekci prekazky
#define IRRX PIN_B0 // Vstup INT, generuje preruseni pri prekazce
#define IRTX PIN_C0 // Modulovani vysilaci IR LED na detekci prekazky
 
#define CASMIN 6 // Rozsah radku snimace
#define CASMAX 192
64,6 → 64,18
#int_EXT
EXT_isr() // Preruseni od prekazky
{
// Ujistime se, ze prijaty signal je z naseho IR vysilace
output_high(IRTX); // Vypni LED na detekci prekazky
set_pwm1_duty(0); // Vypni motory
set_pwm2_duty(0);
output_low(MOT_L);
output_low(MOT_R);
delay_ms(2);
if (!input(IRRX)) return;
output_low(IRTX); // Zapni LED na detekci prekazky
delay_ms(10);
if (input(IRRX)) return;
 
set_pwm1_duty(0); // reverz (zabrzdi)
set_pwm2_duty(0);
output_high(MOT_L);
75,7 → 87,7
if(stav==jizda)
{
int n;
 
/*
SetServo(CASAVR-CASMIN);
set_pwm1_duty(40); // pomalu couvej
set_pwm2_duty(40);
98,6 → 110,7
set_pwm2_duty(0);
output_low(MOT_L);
output_low(MOT_R);
*/
delay_ms(1000);
 
SetServo((CASAVR-CASMIN)-20); // doleva
182,7 → 195,7
while(input(ODO));
while(!input(ODO));
n++;
if(n==10) break;
if(n==12) break;
}
set_pwm1_duty(0); // Zastav
set_pwm2_duty(0);
265,8 → 278,8
output_low(MOT_L);
output_low(MOT_R);
 
output_low(IRLED); // Zapni LED na detekci prekazky
output_low(IRTX); // Zapni LED na detekci prekazky
 
NightRider(1); // Aby se poznalo, ze byl RESET
// Musi se pockat, nez se rozjede kamera, nez se do ni zacnou posilat prikazy
 
284,20 → 297,14
i2c_stop();
 
/*
i2c_start(); // Contrast
i2c_start(); // Contrast (nema podstatny vliv na obraz)
i2c_write(0xC0);
i2c_write(0x05);
i2c_write(0xA0); // 48h
i2c_stop();
 
i2c_start(); // Brightness
i2c_start(); // Band Filter (pokud by byl problem se zarivkama 50Hz)
i2c_write(0xC0);
i2c_write(0x06);
i2c_write(0x0); // 80h //9Ah
i2c_stop();
 
i2c_start(); // Band Filter
i2c_write(0xC0);
i2c_write(0x2D);
i2c_write(0x04 | 0x03);
i2c_stop();
323,39 → 330,61
 
NightRider(1); // Musi se dat cas kamere na AGC a AEC
 
{ // Kalibrace kamery
int8 t1,t2;
 
for(offset=0;offset<=255;offset+=0x04) // Cita porad dokola
{
i2c_start(); // Brightness
{ // Mereni expozice
int8 t1,t2;
i2c_start(); // Brightness, zacni od uplne tmy
i2c_write(0xC0);
i2c_write(0x06);
i2c_write(offset); // 80h default
i2c_write(0); // 80h default
i2c_stop();
disp(offset);
delay_ms(50);
 
t1=0;
t2=0;
while(!input(HREF)); // Cekej nez se zacnou posilat pixely z radky
delay_ms(5);
while(!input(HREF)); // Cekej nez se zacnou posilat pixely z radky
set_timer0(0); // Vynuluj pocitadlo casu
if(!input(PIX)) continue;
while(input(PIX));
t1=get_timer0(); // Precti cas z citace casu hrany
set_timer0(0); // Vynuluj pocitadlo casu
while(!input(PIX));
t2=get_timer0();
 
if((t1>60) && (t1<140) && (t2>5) && (t2<=10)) break;
 
delay_ms(2);
for(offset=0x60;offset<=254;offset+=0x04) // Zacni od jasu 60h
{
i2c_start(); // Brightness
i2c_write(0xC0);
i2c_write(0x06);
i2c_write(offset); // 80h default
i2c_stop();
disp(offset);
delay_ms(50);
t1=0;
t2=0;
while(!input(HREF)); // Cekej nez se zacnou posilat pixely z radky
delay_ms(5);
while(!input(HREF)); // Cekej nez se zacnou posilat pixely z radky
set_timer0(0); // Vynuluj pocitadlo casu
if(!input(PIX)) continue;
while(input(PIX));
t1=get_timer0(); // Precti cas z citace casu hrany
set_timer0(0); // Vynuluj pocitadlo casu
while(!input(PIX));
t2=get_timer0();
if((t1>60) && (t1<140) && (t2>5) && (t2<=10)) break; // Vidis, co mas?
delay_ms(2); // Preskoc druhou radku z kamery
};
delay_ms(1000); // Nech chvili na displayi zmerenou hodnotu
}
}
 
delay_ms(1000);
set_adc_channel(CERVENA); // --- Kroutitko pro jas ---
delay_ms(1);
offset=read_adc()>>1; // 0-127
offset &= 0b11111100; // Dva nejnizsi bity ignoruj
disp(offset);
i2c_start(); // Brightness
i2c_write(0xC0);
i2c_write(0x06);
i2c_write(offset+0x70); // 80h default
i2c_stop();
delay_ms(1000); // Nech hodnotu chvili na displayi
set_adc_channel(ZELENA); // --- Kroutitko pro vykon motoru ---
delay_ms(1);
rr=read_adc()>>2; // 0-31 // Pokud by se zvetsil rozsah, tak zkontrolovat jakonasobeni !!!
 
cas=CASAVR-CASMIN; // Inicializace promenych, aby neslo servo za roh a aby se to rozjelo jeste dneska
stav=start;
372,8 → 401,8
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
if(!input(PIX)) // Pokud se Xx za sebou precetla CERNA
// !!!!Dodelat rozpoznani cerne cary napric pro zastaveni ?
if(!input(PIX)) // Pokud se X-krat za sebou precetla CERNA
if(!input(PIX))
// if(!input(PIX))
{
400,10 → 429,6
delay_us(cas);
output_low(SERVO);
 
set_adc_channel(ZELENA); // Kroutitko pro vykon motoru
Delay_ms(1);
rr=read_adc()>>2; //!!! // 0-31
 
// Elektronicky diferencial
if(cas<CASAVR) {r1=cas-CASMIN; r2=CASAVR-CASMIN;}; // Normovani vystupni hodnoty radkoveho snimace
if(cas==CASAVR) {r1=cas-CASMIN; r2=cas-CASMIN;}; // pro rizeni rychlosti motoru
438,24 → 463,20
enable_interrupts(GLOBAL);
};
 
if(stav==start)
if(stav==start) // Snimkuje, toci servem a ceka na start
if(read_adc()<128)
{
disp(0x55);
disp(0x80);
while(read_adc()<128); // Cekej, dokud starter neda ruku pryc
set_pwm1_duty(255);
set_pwm1_duty(255); // Rychly rozjezd !!! Zkontrolovat na oscyloskopu
set_pwm2_duty(255);
disp(0xAA);
delay_ms(200);
disp(0x1);
delay_ms(200);
stav=jizda;
}
 
pom=0x80;
for(n=CASMAX/8; n<cas; n+=CASMAX/8)
{
pom>>=1;
}
pom=0x80; // Zobrazeni pozice cary na displayi
for(n=CASMAX/8; n<cas; n+=CASMAX/8) pom>>=1;
disp(pom);
 
};
}