Rev 410 | Blame | Compare with Previous | Last modification | View Log | Download
#include ".\camerus.h"#USE FAST_IO (C) // Brana C je ve FAST_IO modu, aby slo rychle cteni z kamery// kroutitka#define CERVENA 3 // AN3/RA3#define CERNA 2 // AN2/RA2#define ZELENA 1 // AN1/RA0#define MODRA 0 // AN0/RA1// I/O#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 MOT_L PIN_B5 // Smer otaceni leveho motoru; druhy pol je RC2#define MOT_R PIN_B6 // Smer otaceni praveho motoru; druhy pol je RC1void main(){int8 cas; // Cas hrany bila/cerna v radceint8 offset; // Promena pro ulozeni ovsetuint8 rr; // Promenna na ulozeni Rozumne rychlostint8 r1; // Rychlost motoru 1int8 r2; // Rychlost motoru 2int16 ble; // Prodleva do rozjezdusetup_adc_ports(ALL_ANALOG); // Zapnuti A/D prevodniku pro cteni kroutiteksetup_adc(ADC_CLOCK_INTERNAL);setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); // Casovac pro mereni casu hrany W/B v radcesetup_timer_1(T1_DISABLED);setup_timer_2(T2_DIV_BY_16,255,1); // Casovac PWM motorusetup_ccp1(CCP_PWM); // RC1 // PWM pro motorysetup_ccp2(CCP_PWM); // RC2setup_comparator(NC_NC_NC_NC);setup_vref(FALSE);set_tris_c(0b11111000); // Nastaveni vstup/vystup pro branu C, protoze se nedela automatickyset_pwm1_duty(0); // Zastav motoryset_pwm2_duty(0);output_low(MOT_L);output_low(MOT_R);output_high(LED); // Budeme blikat LED, aby se poznalo, ze byl RESETdelay_ms(200); // Musi se pockat, nez se rozjede kamera, nez se do ni zacnou posilat prikazy//... Nastaveni kamery ...i2c_start(); // Soft RESET kameryi2c_write(0xC0); // Pro single slave musi mit vsechny zapisy adresu C0hi2c_write(0x12); // Adresa registru COMHi2c_write(0x80 | 0x24); // Zapis ridiciho slovai2c_stop();i2c_start(); // BWi2c_write(0xC0);i2c_write(0x28);i2c_write(0b01000001);i2c_stop();i2c_start(); // Contrasti2c_write(0xC0);i2c_write(0x05);i2c_write(0xA0);i2c_stop();/*i2c_start(); // Brightnessi2c_write(0xC0);i2c_write(0x06);i2c_write(0x80);i2c_stop();i2c_start(); // Band Filteri2c_write(0xC0);i2c_write(0x2D);i2c_write(0x04 | 0x03);i2c_stop();*/i2c_start(); // VSTRTi2c_write(0xC0);i2c_write(0x19);i2c_write(45);i2c_stop();i2c_start(); // VENDi2c_write(0xC0);i2c_write(0x1A);i2c_write(45);i2c_stop();output_low(LED); // Blikani LEDdelay_ms(200);output_high(LED); // Blikani LEDdelay_ms(200);output_low(LED);cas=128; // Inicializace promenych, aby neslo servo za roh a aby se to rozjelo jeste dneskable=0;// ... Hlavni smycka ...while(true){while(!input(HREF)); // Cekej nez se zacnou posilat pixely z radkyset_timer0(0); // Vynuluj pocitadlo casuwhile(input(HREF)) // Po dobu vysilani radky cekej na hranu W/B{if(!input(PIX)) // Pokud se dvakrat za sebou precetla CERNAif(!input(PIX)){cas=get_timer0(); // Precti cas z citace casu hranycas=255-cas; // Vlevo je vpravobreak;};};set_adc_channel(MODRA); // Kroutitko na vystredeni predniho koleckaDelay_ms(1);offset=read_adc();output_high(SERVO); // Odvysilani impuzu 1 az 2ms pro servodelay_us(1000);delay_us(offset);delay_us(offset);delay_us(cas);delay_us(cas);output_low(SERVO);ble++; // Casovac pro odlozeni rozjezdu po zapnuti napajeniset_adc_channel(ZELENA); // Kroutitka pro vykon motoru (!!! to bude chtit jeste predelat !!!)Delay_ms(1);offset=read_adc();set_adc_channel(CERNA);Delay_ms(1);rr=read_adc();r1=cas>>1; // Elektronicky diferencialr2=255-offset-(cas>>1);if (ble==99) // Rozjezd na Rozumnou rychlost{set_pwm1_duty(rr);set_pwm2_duty(rr);};if ((ble>100)&&(ble<60000)) // Jizda{if (r1<=rr) set_pwm1_duty(r1);if (r2<=rr) set_pwm2_duty(r2);}else{set_pwm1_duty(0); // Zastaveniset_pwm2_duty(0);}};}