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