#include #include "biosdem.h" /*mot de configuration pour rendre le programme autonome*/ __CONFIG (0x3D39); void serial_puts (const char s[]); void serial_putchar (char c); void serial_init (void); int a=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=239; /*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; 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; // CCPR2L=0; // CCPR1L=0; 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) { if ( !FERR ) //erreur { RE1=1; commande=RCREG; } else { x = RCSTA ; x = RCREG ; commande=RCREG; RE1=0; } } /*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 0x00: //perte de la piste CCPR2L=0; CCPR1L=0; break;*/ case 0x18: //piste au milieu CCPR2L=239; RE2=0;RA2=0; CCPR1L=234; 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 0x38: CCPR1L=220; RE2=0;RA2=0; CCPR2L=239; break; case 0x30: //robot part léger gauche CCPR1L=210; RE2=0;RA2=0; //210 CCPR2L=230; //230 break; case 0x70: CCPR1L=190; RE2=0;RA2=0; CCPR2L=230; break; case 0x60: //robot part moyen gauche CCPR1L=180; RE2=0;RA2=0; //170 CCPR2L=210; //230 break; case 0xE0: CCPR1L=145; RE2=0;RA2=0; CCPR2L=175; break; case 0xC0: //robot part beaucoup gauche CCPR1L=100; RE2=1;RA2=0; //130 CCPR2L=170; //170 break; case 0x80: //robot part extrême gauche CCPR1L=0; RA2=1;RE2=0; //0 CCPR2L=239; //239 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 0x1C: CCPR2L=220; RE2=0;RA2=0; CCPR1L=239; break; case 0x0C: //robot part léger droite CCPR2L=210; RE2=0;RA2=0; //210 CCPR1L=230; //230 break; case 0x0E: CCPR2L=180; RE2=0;RA2=0; CCPR1L=210; break; case 0x06: //robot part moyen droite CCPR2L=160; RE2=0;RA2=0; //170 CCPR1L=200; //230 break; case 0x07: CCPR2L=145; RE2=0;RA2=0; CCPR1L=175; break; case 0x03: //robot part beaucoup droite CCPR2L=100; RE2=0;RA2=0; //130 CCPR1L=170; //170 break; case 0x01: //robot part extrême droite CCPR2L=0; RE2=0;RA2=0; //0 CCPR1L=239; //239 break; } RB4=!RB4; /*cette broche nous a servi à sa voir si le programme tournait bien, car lors d'une panne nous avions émis l'hypothèse que le programme ne tournait pas*/ if(a==1) { a=0; } } } /*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; } /*cette fonction permet d'emettre un caractère à l'aide de la liaison série*/ void serial_putchar (char c) { while (TRMT==0) ; TXREG=c; } /*cette fonction permet d'emettre une suite de caractère à l'aide de la liaison série*/ void serial_puts (const char s[]) { char i=0; while (s[i]!='\0') { serial_putchar(s[i]); i++; } } //cette partie du programme sert à traiter l'interruption interrupt void isr (void) { if (RCIF==1) { commande=RCREG; a=1; } }