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