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: 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: 39: TRISA2=0; 40: TRISE1=0; 41: TMR2ON=1; 42: TRISB4=0; 43: RD1=0; 44: RD2=0; 45: RD3=1; 46: RB4=1; 47: /*configuration des interruptions*/ 48: PEIE=0; 49: RCIE=0; 50: GIE=0; 51: 52: // CCPR2L=0; 53: // CCPR1L=0; 54: 55: for(;;) 56: { 57: 58: /*RE2=1; 59: RA2=1;*/ 60: if(OERR) //erreur 61: { 62: 63: CREN=0; 64: RE0=1; 65: CREN=1; 66: } 67: else 68: { 69: RE0=0; 70: } 71: /* RE1=0; 72: RE0=0; 73: RA5=0; 74: RA4=0;*/ 75: 76: /* la partie qui suit traite la réception du 77: mot commande venant du PIC situé sur la 78: carte des capteurs.*/ 79: if (RCIF==1) 80: { 81: if ( !FERR ) //erreur 82: { 83: RE1=1; 84: commande=RCREG; 85: } 86: 87: else 88: { x = RCSTA ; 89: x = RCREG ; 90: commande=RCREG; 91: RE1=0; 92: } 93: 94: 95: } 96: /*ce switch/case va permettre de traiter le mot commande 97: qui a été recu précédemment,en fonction du mot recu, 98: la vitesse des moteurs*/ 99: switch (commande) 100: { 101: /* case 0x00: //perte de la piste 102: CCPR2L=0; 103: CCPR1L=0; 104: break;*/ 105: 106: case 0x18: //piste au milieu 107: CCPR2L=239; RE2=0;RA2=0; 108: CCPR1L=234; 109: break; 110: 111: /*suit la partie au cas ou le robot part vers la 112: gauche et donc les moteurs doivent 113: etre corrigés de telle façon à ce que le robot 114: repart plus ou moins vers la droite*/ 115: case 0x38: 116: CCPR1L=220; RE2=0;RA2=0; 117: CCPR2L=239; 118: break; 119: 120: case 0x30: //robot part léger gauche 121: CCPR1L=210; RE2=0;RA2=0; //210 122: CCPR2L=230; //230 123: break; 124: case 0x70: 125: CCPR1L=190; RE2=0;RA2=0; 126: CCPR2L=230; 127: break; 128: case 0x60: //robot part moyen gauche 129: CCPR1L=180; RE2=0;RA2=0; //170 130: CCPR2L=210; //230 131: break; 132: case 0xE0: 133: CCPR1L=145; RE2=0;RA2=0; 134: CCPR2L=175; 135: break; 136: case 0xC0: //robot part beaucoup gauche 137: CCPR1L=100; RE2=1;RA2=0; //130 138: CCPR2L=170; //170 139: break; 140: case 0x80: //robot part extrême gauche 141: CCPR1L=0; RA2=1;RE2=0; //0 142: CCPR2L=239; //239 143: break; 144: 145: /*suit la partie au cas ou le robot part vers 146: la droite et donc les moteurs doivent 147: etre corrigés de telle façon à ce que le robot 148: repart plus ou moins vers la gauche*/ 149: case 0x1C: 150: CCPR2L=220; RE2=0;RA2=0; 151: CCPR1L=239; 152: break; 153: 154: case 0x0C: //robot part léger droite 155: CCPR2L=210; RE2=0;RA2=0; //210 156: CCPR1L=230; //230 157: break; 158: case 0x0E: 159: CCPR2L=180; RE2=0;RA2=0; 160: CCPR1L=210; 161: break; 162: case 0x06: //robot part moyen droite 163: CCPR2L=160; RE2=0;RA2=0; //170 164: CCPR1L=200; //230 165: break; 166: case 0x07: 167: CCPR2L=145; RE2=0;RA2=0; 168: CCPR1L=175; 169: break; 170: case 0x03: //robot part beaucoup droite 171: CCPR2L=100; RE2=0;RA2=0; //130 172: CCPR1L=170; //170 173: break; 174: case 0x01: //robot part extrême droite 175: CCPR2L=0; RE2=0;RA2=0; //0 176: CCPR1L=239; //239 177: break; 178: 179: } 180: 181: RB4=!RB4; /*cette broche nous a servi à sa voir si 182: le programme tournait bien, 183: car lors d'une panne nous avions émis 184: l'hypothèse que le programme ne 185: tournait pas*/ 186: if(a==1) 187: { 188: a=0; 189: } 190: } 191: } 192: 193: 194: /*cette fonction permet d'initialiser 195: la liaison série entre les deux PIC*/ 196: void serial_init (void) 197: { 198: BRGH=1; 199: SPBRG=25; 200: SYNC=0; 201: SPEN=1; 202: TXEN=1; 203: CREN=1; 204: } 205: 206: /*cette fonction permet d'emettre un caractère 207: à l'aide de la liaison série*/ 208: void serial_putchar (char c) 209: { 210: while (TRMT==0) 211: ; 212: TXREG=c; 213: } 214: 215: /*cette fonction permet d'emettre une suite 216: de caractère à l'aide de la liaison série*/ 217: void serial_puts (const char s[]) 218: { 219: char i=0; 220: while (s[i]!='\0') 221: { 222: serial_putchar(s[i]); 223: i++; 224: } 225: } 226: 227: //cette partie du programme sert à traiter l'interruption 228: interrupt void isr (void) 229: { 230: if (RCIF==1) 231: { 232: commande=RCREG; 233: a=1; 234: } 235: }