Blame | Last modification | View Log | Download
#include "laserus.h"#define SERVO PIN_B5 // Vystup pro rizeni serva#define LASER PIN_B4 // Vstup pro cteni laseru#define MOT_DIR_L PIN_C0 // Rizeni smeru otaceni motoru#define MOT_DIR_R PIN_C3// kroutitka#define CERVENA 0 // AN0#define CERNA 1 // AN1//#define ZELENA 3 // AN3//#define MODRA 4 // AN4#byte INTCON = 0x0B // Interrupt configuration register#bit GIE = INTCON.7#bit PEIE = INTCON.6#bit TMR0IE = INTCON.5#bit INT0IE = INTCON.4#bit RBIE = INTCON.3#bit TMR0IF = INTCON.2#bit INT0IF = INTCON.1#bit RBIF = INTCON.0boolean edge;int8 uhel, olduhel;int16 uhel16;#int_EXTEXT_isr(){int n, t1, t2, t;set_timer0(0); // Vynulovani casovace pro 2msoutput_high(SERVO);while(get_timer0()<(1000/256)); // Ceka 1msfor(n=uhel; n>0; n--) delay_us(3); // Sirka impulzu podle uhluoutput_low(SERVO);while(get_timer0()<(3000/256)); // Ceka do 3ms, nez zacne scanovatset_timer0(0); // Vynulovani casovace pro zjisteni polohy caryif(edge) // Zrcatko prejizdelo tam nebo zpet?{edge=false;ext_int_edge(H_TO_L); // Pristi inerrupt bude od opacne hranyINT0IF=0; // Povoleni dalsiho prerusenienable_interrupts(INT_EXT);enable_interrupts(GLOBAL);// do{while(0==input(LASER)); // Ceka na detekci cary// output_high(SERVO);t1=get_timer0(); // Poznamena cas nabezne hranywhile(1==input(LASER)); // Ceka az zkonci cara// output_low(SERVO);t2=get_timer0(); // Poznamena cas sestupne hranyt=t2-t1;} while((t<3) || (t>20)); // Cara je detekovana, kdyz trva mezi xx ms// if ((t>3) && (t<20)) uhel=(160-(read_adc()>>2))-t1;// if (abs(olduhel-uhel)<40){uhel=(160-(read_adc()>>2))-t1;olduhel=uhel;};// uhel16=uhel;// set_pwm1_duty(250-(uhel16<<2)); // Elektronicky diferencial// set_pwm2_duty((uhel16));set_adc_channel(CERNA);}else{edge=true;ext_int_edge(L_TO_H); // Pristi inerrupt bude od opacne hranyINT0IF=0; // Povoleni dalsiho prerusenienable_interrupts(INT_EXT);enable_interrupts(GLOBAL);// do{while(0==input(LASER)); // Ceka na detekci caryt1=get_timer0(); // Poznamena cas nabezne hranywhile(1==input(LASER)); // Ceka az zkonci carat2=get_timer0(); // Poznamena cas sestupne hranyt=t2-t1;} while((t<3) || (t>20)); // Cara je detekovana, kdyz trva mezi xx msif (abs(olduhel-uhel)<40){// uhel=((read_adc()>>2)+32)+t1;// olduhel=uhel;};set_adc_channel(CERVENA);}while(true);}void main(){setup_adc_ports(ALL_ANALOG); // Analogove vstupy pro cteni trimrusetup_adc(ADC_CLOCK_INTERNAL);setup_spi(FALSE);setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256); // Casovac pro cteni laserusetup_timer_1(T1_DISABLED);setup_timer_2(T2_DIV_BY_4,255,1); // Casovac pro PWM cca 900Hzsetup_ccp1(CCP_PWM); // Nastaveni PWM pro diferencial RC1, RC2setup_ccp2(CCP_PWM);set_pwm1_duty(90); // Zastaveni PWMset_pwm2_duty(90);delay_ms(100);set_adc_channel(CERVENA);Delay_ms(1);ext_int_edge(L_TO_H);edge=true;uhel=((read_adc()>>2)+32)+30;olduhel=uhel;enable_interrupts(INT_EXT);enable_interrupts(GLOBAL);delay_ms(1000);output_high(MOT_DIR_L); // Oba motory vpredoutput_high(MOT_DIR_R);while(true);}