1: 2: 3: #include 4: #include "biosdem.h" 5: /*mot de configuration pour 6: rendre le programme autonome*/ 7: __CONFIG (0x3D39); 8: 9: 10: void serial_puts (const char s[]); 11: void serial_putchar (char c); 12: void serial_init (void); 13: int a=0; 14: char x ; 15: char fin; 16: /*commande est le mot qui va etre recu du PIC de la carte des capteurs, 17: ce mot de 8bits va permettre de donner les informations sur les capteurs, 18: c'est-à-dire de savoir quel capteur(s) capte la piste. Ce mot sera traité 19: par la suite pour donner l'ordre aux moteurs de ralentir ou d'accélerer*/ 20: char commande=0x00; 21: 22: void main (void) 23: { 24: DelayMs(10); 25: serial_init(); //initialisation de la liaison série 26: ADCON1=0x06; 27: PR2=239; /*réglage de la période du signal de commande moteur 28: à 240us*/ 29: TRISC1=0; 30: TRISC2=0; 31: CCP2CON=0x0C; 32: CCP1CON=0x0C; 33: TRISE2=0; 34: TRISD1=0; 35: TRISD2=0; 36: TRISD3=0; 37: TRISE0=0; 38: TRISB0=1; 39: TRISD0=1; 40: TRISA2=0; 41: TRISE1=0; 42: TMR2ON=1; 43: TRISB4=0; 44: RD1=0; 45: RD2=0; 46: RD3=1; 47: RB4=1; 48: /*configuration des interruptions*/ 49: PEIE=0; 50: RCIE=0; 51: GIE=0; 52: 53: while(RD0==0) 54: 55: { 56: 57: CCPR2L=0; 58: CCPR1L=0; 59: 60: 61: } 62: 63: CCPR2L=190; 64: CCPR1L=200; 65: 66: 67: for(;;) 68: { 69: 70: /*RE2=1; 71: RA2=1;*/ 72: if(OERR) //erreur 73: { 74: 75: CREN=0; 76: RE0=1; 77: CREN=1; 78: } 79: else 80: { 81: RE0=0; 82: } 83: /* RE1=0; 84: RE0=0; 85: RA5=0; 86: RA4=0;*/ 87: 88: /* la partie qui suit traite la réception du 89: mot commande venant du PIC situé sur la 90: carte des capteurs.*/ 91: if (RCIF==1) 92: { 93: if ( !FERR ) //erreur 94: { 95: RE1=1; 96: commande=RCREG; 97: } 98: 99: else 100: { x = RCSTA ; 101: x=RCREG; 102: commande=RCREG; 103: RE1=0; 104: } 105: 106: 107: } 108: 109: 110: 111: if(RB0==1) // fin de course ; 112: { 113: fin++; 114: if ( fin==10) 115: { for(;;) 116: { 117: 118: CCPR2L=0; 119: CCPR1L=0; 120: } 121: } 122: } 123: else 124: { 125: fin=0; 126: } 127: /*ce switch/case va permettre de traiter le mot commande 128: qui a été recu précédemment,en fonction du mot recu, 129: la vitesse des moteurs*/ 130: switch (commande) 131: { 132: /* case 0x00: //perte de la piste 133: CCPR2L=0; 134: CCPR1L=0; 135: break;*/ 136: 137: 138: 139: case 0x08: //piste au milieu 140: CCPR2L=190; RE2=0;RA2=0; //138 141: CCPR1L=200; //150 142: break; 143: 144: /*suit la partie au cas ou le robot part vers la 145: gauche et donc les moteurs doivent 146: etre corrigés de telle façon à ce que le robot 147: repart plus ou moins vers la droite*/ 148: 149: case 0x10: //robot part léger gauche 150: CCPR1L=140; RE2=0;RA2=0; //120 151: CCPR2L=200; //150 152: break; 153: case 0x20: //robot part moyen gauche 154: CCPR1L=100; RE2=0;RA2=0; //80 155: CCPR2L=200; //150 156: break; 157: case 0x40: //robot part extreme gauche 158: CCPR1L=0; RE2=0;RA2=1; //0 159: CCPR2L=150; //150 160: break; 161: 162: 163: /*suit la partie au cas ou le robot part vers 164: la droite et donc les moteurs doivent 165: etre corrigés de telle façon à ce que le robot 166: repart plus ou moins vers la gauche*/ 167: 168: case 0x04: //robot part leger droite 169: CCPR2L=140; RE2=0;RA2=0; //120 170: CCPR1L=200; //150 171: break; 172: case 0x02: //robot part moyen droite 173: CCPR2L=100; RE2=0;RA2=0; //80 174: CCPR1L=200; //150 175: break; 176: case 0x01: //robot part extrême droite 177: CCPR2L=0; RE2=1;RA2=0; //0 178: CCPR1L=150; //150 179: break; 180: 181: 182: 183: 184: } 185: 186: RB4=!RB4; /*cette broche nous a servi à sa voir si 187: le programme tournait bien, 188: car lors d'une panne nous avions émis 189: l'hypothèse que le programme ne 190: tournait pas*/ 191: if(a==1) 192: { 193: a=0; 194: } 195: } 196: } 197: 198: 199: /*cette fonction permet d'initialiser 200: la liaison série entre les deux PIC*/ 201: void serial_init (void) 202: { 203: BRGH=1; 204: SPBRG=25; 205: SYNC=0; 206: SPEN=1; 207: TXEN=1; 208: CREN=1; 209: } 210: 211: /*cette fonction permet d'emettre un caractère 212: à l'aide de la liaison série*/ 213: void serial_putchar (char c) 214: { 215: while (TRMT==0) 216: ; 217: TXREG=c; 218: } 219: 220: /*cette fonction permet d'emettre une suite 221: de caractère à l'aide de la liaison série*/ 222: void serial_puts (const char s[]) 223: { 224: char i=0; 225: while (s[i]!='\0') 226: { 227: serial_putchar(s[i]); 228: i++; 229: } 230: } 231: 232: //cette partie du programme sert à traiter l'interruption 233: interrupt void isr (void) 234: { 235: if (RCIF==1) 236: { 237: commande=RCREG; 238: a=1; 239: } 240: } 241: 242: