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=x; 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: 107: 108: case 0x18: //piste au milieu 109: CCPR2L=239; RE2=0;RA2=0; 110: CCPR1L=239; 111: break; 112: 113: /*suit la partie au cas ou le robot part vers la 114: gauche et donc les moteurs doivent 115: etre corrigés de telle façon à ce que le robot 116: repart plus ou moins vers la droite*/ 117: 118: case 0x30: //robot part léger gauche 119: CCPR1L=200; RE2=0;RA2=0; //210 120: CCPR2L=230; //230 121: break; 122: case 0x60: //robot part moyen gauche 123: CCPR1L=150; RE2=0;RA2=0; //170 124: CCPR2L=230; //230 125: break; 126: case 0xC0: //robot part beaucoup gauche 127: CCPR1L=100; RE2=1;RA2=0; //130 128: CCPR2L=170; //170 129: break; 130: case 0x80: //robot part extrême gauche 131: CCPR1L=0; RA2=1;RE2=0; //0 132: CCPR2L=230; //239 133: break; 134: 135: /*suit la partie au cas ou le robot part vers 136: la droite et donc les moteurs doivent 137: etre corrigés de telle façon à ce que le robot 138: repart plus ou moins vers la gauche*/ 139: 140: case 0x0C: //robot part léger droite 141: CCPR2L=200; RE2=0;RA2=0; //210 142: CCPR1L=230; //230 143: break; 144: case 0x06: //robot part moyen droite 145: CCPR2L=150; RE2=0;RA2=0; //170 146: CCPR1L=230; //230 147: break; 148: case 0x03: //robot part beaucoup droite 149: CCPR2L=100; RE2=0;RA2=0; //130 150: CCPR1L=170; //170 151: break; 152: case 0x01: //robot part extrême droite 153: CCPR2L=0; RE2=0;RA2=0; //0 154: CCPR1L=200; //239 155: break; 156: } 157: 158: RB4=!RB4; /*cette broche nous a servi à sa voir si 159: le programme tournait bien, 160: car lors d'une panne nous avions émis 161: l'hypothèse que le programme ne 162: tournait pas*/ 163: if(a==1) 164: { 165: a=0; 166: } 167: } 168: } 169: 170: 171: /*cette fonction permet d'initialiser 172: la liaison série entre les deux PIC*/ 173: void serial_init (void) 174: { 175: BRGH=1; 176: SPBRG=25; 177: SYNC=0; 178: SPEN=1; 179: TXEN=1; 180: CREN=1; 181: } 182: 183: /*cette fonction permet d'emettre un caractère 184: à l'aide de la liaison série*/ 185: void serial_putchar (char c) 186: { 187: while (TRMT==0) 188: ; 189: TXREG=c; 190: } 191: 192: /*cette fonction permet d'emettre une suite 193: de caractère à l'aide de la liaison série*/ 194: void serial_puts (const char s[]) 195: { 196: char i=0; 197: while (s[i]!='\0') 198: { 199: serial_putchar(s[i]); 200: i++; 201: } 202: } 203: 204: //cette partie du programme sert à traiter l'interruption 205: interrupt void isr (void) 206: { 207: if (RCIF==1) 208: { 209: commande=RCREG; 210: a=1; 211: } 212: }