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