Blame | Last modification | View Log | Download
#include "tank.h"#define TXo PIN_B1 // To the transmitter modulator#include "AX25.c" // podprogram pro prenos telemetrie//motory //Napred vypnout potom zapnout!#define FR output_low(PIN_B5); output_high(PIN_B4) // Vpred#define FL output_low(PIN_B7); output_high(PIN_B6)#define BR output_low(PIN_B4); output_high(PIN_B5) // Vzad#define BL output_low(PIN_B6); output_high(PIN_B7)#define STOPR output_low(PIN_B4);output_low(PIN_B5)#define STOPL output_low(PIN_B6);output_low(PIN_B7)#define L 0b10 // left#define R 0b01 // right#define S 0b11 // straight#define COUVANI 1600 // couvnuti po zjisteni diry#define MEZERA 5400 // za jak dlouho bude ztracena cara#define PRES_DIRU 1000 // velikost mezery v care#define BRZDENI 5000 // doba ptrebna k zastaveni jednoho motoru//cidla#define RSENSOR C2OUT // Senzory na caru#define LSENSOR C1OUT#define BUMPER PIN_A4 // sensor na cihlu#define DIAG_SERVO PIN_B2 // Propojka pro diagnosticky mod#define DIAG_SENSORS PIN_B3 // Propojka pro diagnosticky mod#DEFINE SOUND_HI PIN_A7#DEFINE SOUND_LO PIN_A6char AXstring[40]; // Buffer pro prenos telemetrie#define GO(motor, direction, power) if(get_timer0()<=power) \{direction##motor;} \else \{stop##motor;}int movement; // smer minuleho pohybuint line; // na ktere strane byla detekovana caraunsigned int16 dira; // pocitadlo pro nalezeni preruseni caryint speed,speedL,speedR;// Primitivni Pipanivoid beep(unsigned int16 period, unsigned int16 length){unsigned int16 nn;for(nn=length; nn>0; nn--){output_high(SOUND_HI);output_low(SOUND_LO);delay_us(period);output_high(SOUND_LO);output_low(SOUND_HI);delay_us(period);}}#int_TIMER2void TIMER2_isr(){switch(line) // upravime smer{case S: //obe cidla na careif(speedL<200)speedL++;if(speedR<200)speedR++;break; // vrat se zpet na cteni cidelcase L: // cara je pod levym cidlem, trochu zatocimeif (speedL>100)speedL -- ;if (speedR<200)speedR ++ ;break;case R: // cara pod pravym cidlemif (speedR>100)speedR -- ;if (speedL<200)speedL ++ ;break;default:}}// Diagnostika pohonu, hejbne vsema motorama ve vsech smerechvoid diagnostika(){unsigned int16 n;while (input(DIAG_SERVO)) // Propojka, ktera spousti diagnostiku{for (n=500; n<800; n+=100){beep(n,n); //beep UP};Delay_ms(1000);//zastav vseSTOPL; STOPR;//pravy pasFR; Delay_ms(1000); STOPR; Delay_ms(1000);BR; Delay_ms(1000); STOPR; Delay_ms(1000);Beep(880,100); Delay_ms(1000);//levy pasFL; Delay_ms(1000); STOPL; Delay_ms(1000);BL; Delay_ms(1000); STOPL; Delay_ms(1000);Beep(880,100); Delay_ms(1000);//oba pasyFL; FR; Delay_ms(1000); STOPL; STOPR; Delay_ms(1000);BL; BR; Delay_ms(1000); STOPL; STOPR; Delay_ms(1000);};while (input(DIAG_SENSORS)){int ls, rs;while(!input(BUMPER)){beep(1100,100); Delay_ms(50);}set_adc_channel(RSENSOR);Delay_us(20);rs=read_adc();set_adc_channel(LSENSOR);Delay_us(20);ls=read_adc();sprintf(AXstring,"L: %U R: %U\0", ls, rs); // Convert DATA to String.SendPacket(&AXstring[0]);delay_ms(1000);};}void cikcak(){int n;switch(movement) // podivej se na jednu stranu{case L:FL;BR;movement=R;break;case R:FR;BL;movement=L;break;case S:FR;BL;movement=L;break;}while (0==(RSENSOR|LSENSOR)){if (n==50) // asi bude na druhe strane{STOPR;STOPL;n=0;switch(movement){case L:FL;BR;movement=R;break;case R:FR;BL;movement=L;break;}}Delay_ms(5);n++;}STOPL;STOPR; // nasli jsme caruline=S;}void objizdka(){BL;BR;Delay_ms(300);STOPR;STOPL;beep(1000,1000);Delay_ms(500);beep(1000,1000);Delay_ms(1000);}void pozordira(){beep(800,500);Delay_ms(50);beep(800,500);switch (movement) //vrat se zpet na caru{case L:STOPL;STOPR;BR;Delay_ms(COUVANI);STOPR;break;case R:STOPL;STOPR;BL;Delay_ms(COUVANI);STOPL;break;case S:BL; BR; Delay_ms(COUVANI);STOPL; STOPR;break;}FR;FL; Delay_ms(PRES_DIRU); // popojedem dopredu mozna tam bude caraSTOPL; STOPR; movement=S;cikcak(); // najdi carudira=0;}void main(){unsigned int16 rovinka;int last;STOPL; STOPR;setup_oscillator(OSC_4MHZ|OSC_INTRC); // 4 MHz interni RC oscilatorport_b_pullups(true);setup_adc_ports(NO_ANALOGS|VSS_VDD);setup_adc(ADC_OFF);setup_spi(FALSE);setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); // Casovac pro PWMsetup_timer_1(T1_DISABLED); // Casovac pro regulacisetup_timer_2(T2_DIV_BY_16,50,16);setup_ccp1(CCP_OFF);setup_comparator(A0_VR_A1_VR);setup_vref(VREF_HIGH|15);enable_interrupts(INT_TIMER2);enable_interrupts(GLOBAL);diagnostika();Beep(1000,200); //double beepDelay_ms(50);Beep(1000,200);Delay_ms(1000); // 1s// FL; FR;movement=S;line=S;dira=0;last=0;rovinka=0;speed=speedL=speedR=200;while(true){line = RSENSOR; // precteni cidelline |= LSENSOR << 1; // sestav informaci o careif(line!=0){GO(L, F, speedL); GO(R,F, speedR);}else{STOPR; STOPL;}//sem:/* switch(line) // upravime smer{case S: //obe cidla na care// if (speedL<speedR) speedL=speedR;// else speedR=speedL;GO(L,F,speedL); GO(R,F,speedR) // jedeme rovne// if(rovinka<BRZDENI) rovinka++; //cara je rovne// dira=0; // videli jsme caru, proto neni diracontinue; // vrat se zpet na cteni cidelcase L: // cara je pod levym cidlem, trochu zatocimeGO(L, F, speedL); GO(R,F, speedR);// if(rovinka<BRZDENI) rovinka++; //cara je celkem rovne// dira=0;continue;case R: // cara pod pravym cidlemGO(R, F, speedR); GO(L, F, speedL);// if(rovinka<BRZDENI) rovinka++;// dira=0;continue;default: // cara neni pod zadnym cidlem}*//*switch (last) // zatacka{case L: // do levaBL;STOPR; //zabrzdeni leveho motorufor(;rovinka>0;rovinka--) //chvili pockej{line = RSENSOR; // precteni cidelline |= LSENSOR << 1; // sestav informaci o careif(line!=0) goto sem; //kdyz najdes caru, zastav}STOPL; FR; // pokracuj v zataceniwhile(line==0){line = RSENSOR; // precteni cidelline |= LSENSOR << 1; // sestav informaci o care}movement=L;rovinka=0; //zataceli jsme, uz neni rovna carabreak;case R:BR; STOPL; // zabrzdeni praveho motorufor(;rovinka>0;rovinka--){line = RSENSOR; // precteni cidelline |= LSENSOR << 1; // sestav informaci o careif(line!=0) goto sem;}STOPR; FL;while(line==0){line = RSENSOR; // precteni cidelline |= LSENSOR << 1; // sestav informaci o care}movement=R;rovinka=0; //zataceli jsme, uz neni rovna carabreak;}*/} // while(true)}