#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; 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) { CCPR2L=0; CCPR1L=0; } CCPR2L=190; CCPR1L=200; 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; } } if(RB0==1) { for(;;) { CCPR2L=0; CCPR1L=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 0x08: //piste au milieu CCPR2L=226; RE2=0;RA2=0; //226 CCPR1L=239; //239 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 CCPR1L=75; RE2=0;RA2=0; //200 CCPR2L=100; //239 break; case 0x20: //robot part moyen gauche CCPR1L=50; RE2=0;RA2=0; //150 CCPR2L=100; //239 break; case 0x40: //robot part extreme gauche CCPR1L=0; RE2=0;RA2=1; //0 CCPR2L=100; //329 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 CCPR2L=75; RE2=0;RA2=0; //200 CCPR1L=100; //239 break; case 0x02: //robot part moyen droite CCPR2L=50; RE2=0;RA2=0; //150 CCPR1L=100; //239 break; case 0x01: //robot part extrême droite CCPR2L=0; RE2=1;RA2=0; //0 CCPR1L=100; //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; } }