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