#include #include "biosdem.h" /*mot de configuration pour rendre le programme autonome*/ __CONFIG (0x3d39); #define MotD CCPR1L #define MotG CCPR2L #define Vmax 70 //100 #define VTmoy 45 //80 #define Vmoy 30 //80 #define Vmin 20 //45 #define Vnul 10 #define VSnul 0 void serial_init (void); int i=0; char x ; /*commande est le mot qui va etre recu du PIC de la carte des capteurs, ce mot de 8bits va permettre de donner les informations sur les capteurs, c'est-à-dire de savoir quel capteur(s) capte la piste. Ce mot sera traité par la suite pour donner l'ordre aux moteurs de ralentir ou d'accélerer*/ char commande=0x00; void main (void) { DelayMs(10); serial_init(); //initialisation de la liaison série ADCON1=0x06; PR2=99; /*réglage de la période du signal de commande moteur à 240us*/ TRISC1=0; TRISC2=0; CCP2CON=0x0C; CCP1CON=0x0C; TRISE2=0; TRISD1=0; TRISD2=0; TRISD3=0; TRISE0=0; TRISB0=1; TRISD0=1; TRISA2=0; TRISE1=0; TMR2ON=1; TRISB4=0; RD1=0; RD2=0; RD3=1; RB4=1; /*configuration des interruptions*/ PEIE=0; RCIE=0; GIE=0; while(RD0==0) { MotG=VSnul; MotD=VSnul; } MotG=VTmoy; MotD=VTmoy; // DelayMs(10); for(;;) { /*RE2=1; RA2=1;*/ if(OERR) //erreur { CREN=0; RE0=1; CREN=1; } else { RE0=0; } /* RE1=0; RE0=0; RA5=0; RA4=0;*/ /* la partie qui suit traite la réception du mot commande venant du PIC situé sur la carte des capteurs.*/ if (RCIF==1) { i++; if (1) {i=0; if ( !FERR ) //erreur { RE1=!RE1; commande=RCREG; } else { x = RCSTA ; x=RCREG; commande=RCREG; } } else {x = RCSTA ; x=RCREG; } } RE0=0; if(RB0==1) { for(;;) { RE0=1; MotG=VSnul; MotD=VSnul; } } /*ce switch/case va permettre de traiter le mot commande qui a été recu précédemment,en fonction du mot recu, la vitesse des moteurs*/ switch (commande) { case 0x88: //piste au milieu MotG=Vmax; RE2=0;RA2=0; //137 MotD=Vmax; //150 break; /*suit la partie au cas ou le robot part vers la gauche et donc les moteurs doivent etre corrigés de telle façon à ce que le robot repart plus ou moins vers la droite*/ case 0x10: //robot part léger gauche MotD=VTmoy; RE2=0;RA2=0; //120 MotG=Vmax; //150 break; case 0x20: //robot part moyen gauche MotD=Vmin; RE2=0;RA2=0; //80 MotG=Vmax; //150 break; case 0x40: //robot part extreme gauche MotD=VSnul; RE2=0;RA2=1; //0 MotG=VTmoy; //150 break; /*suit la partie au cas ou le robot part vers la droite et donc les moteurs doivent etre corrigés de telle façon à ce que le robot repart plus ou moins vers la gauche*/ case 0x04: //robot part leger droite MotG=VTmoy; RE2=0;RA2=0; //120 MotD=Vmax; //150 break; case 0x02: //robot part moyen droite MotG=Vmin; RE2=0;RA2=0; //80 MotD=Vmax; //150 break; case 0x01: //robot part extrême droite MotG=VSnul; RE2=1;RA2=0; //0 MotD=VTmoy; //150 break; //Modifs PIGNOL case 0x18: //robot part léger centre gauche MotD=VTmoy; RE2=0;RA2=0; //120 MotG=Vmax; //150 break; case 0x30: //robot part leger moyen gauche MotD=Vnul; RE2=0;RA2=0; //80 MotG=Vmax; //150 break; case 0x60: //robot part moyen extreme gauche MotD=VSnul; RE2=0;RA2=1; //0 MotG=Vmax; //150 break; case 0x0c: //robot part leger droite centre MotG=VTmoy; RE2=0;RA2=0; //120 MotD=Vmax; //150 break; case 0x06: //robot part leger moyen droite MotG=Vnul; RE2=0;RA2=0; //80 MotD=Vmax; //150 break; case 0x03: //robot part moyen extrême droite MotG=VSnul; RE2=1;RA2=0; //0 MotD=Vmax; //150 break; case 0x1c: //3 capteurs du centre MotG=VTmoy; RE2=1;RA2=0; //0 MotD=VTmoy; //150 break; } } } /*cette fonction permet d'initialiser la liaison série entre les deux PIC*/ void serial_init (void) { BRGH=1; SPBRG=25; SYNC=0; SPEN=1; TXEN=1; CREN=1; }