1: #include 2: #include "biosdem.h" 3: /*mot de configuration pour 4: rendre le programme autonome*/ 5: __CONFIG (0x3D39); 6: 7: 8: void serial_puts (const char s[]); 9: void serial_putchar (char c); 10: void serial_init (void); 11: int a=0; 12: char x ; 13: 14: /*commande est le mot qui va etre recu du PIC de la carte des capteurs, 15: ce mot de 8bits va permettre de donner les informations sur les capteurs, 16: c'est-à-dire de savoir quel capteur(s) capte la piste. Ce mot sera traité 17: par la suite pour donner l'ordre aux moteurs de ralentir ou d'accélerer*/ 18: char commande=0x00; 19: 20: void main (void) 21: { 22: DelayMs(10); 23: serial_init(); //initialisation de la liaison série 24: ADCON1=0x06; 25: PR2=239; /*réglage de la période du signal de commande moteur 26: à 240us*/ 27: TRISC1=0; 28: TRISC2=0; 29: CCP2CON=0x0C; 30: CCP1CON=0x0C; 31: TRISE2=0; 32: TRISD1=0; 33: TRISD2=0; 34: TRISD3=0; 35: TRISE0=0; 36: TRISB0=1; 37: TRIS0=1; 38: TRISA2=0; 39: TRISE1=0; 40: TMR2ON=1; 41: TRISB4=0; 42: RD1=0; 43: RD2=0; 44: RD3=1; 45: RB4=1; 46: /*configuration des interruptions*/ 47: PEIE=0; 48: RCIE=0; 49: GIE=0; 50: 51: 52: 53: for(;;) 54: { 55: 56: /*RE2=1; 57: RA2=1;*/ 58: if(OERR) //erreur 59: { 60: 61: CREN=0; 62: RE0=1; 63: CREN=1; 64: } 65: else 66: { 67: RE0=0; 68: } 69: /* RE1=0; 70: RE0=0; 71: RA5=0; 72: RA4=0;*/ 73: 74: /* la partie qui suit traite la réception du 75: mot commande venant du PIC situé sur la 76: carte des capteurs.*/ 77: if (RCIF==1) 78: { 79: if ( !FERR ) //erreur 80: { 81: RE1=1; 82: commande=RCREG; 83: } 84: 85: else 86: { x = RCSTA ; 87: x=RCREG; 88: commande=RCREG; 89: RE1=0; 90: } 91: 92: 93: } 94: 95: while(RD0==0); 96: 97: if(RB0==1) 98: { 99: for(;;) 100: { 101: 102: CCPR2L=0; 103: CCPR1L=0; 104: } 105: } 106: 107: /*ce switch/case va permettre de traiter le mot commande 108: qui a été recu précédemment,en fonction du mot recu, 109: la vitesse des moteurs*/ 110: switch (commande) 111: { 112: /* case 0x00: //perte de la piste 113: CCPR2L=0; 114: CCPR1L=0; 115: break;*/ 116: 117: 118: 119: case 0x08: //piste au milieu 120: CCPR2L=226; RE2=0;RA2=0; 121: CCPR1L=239; 122: break; 123: 124: /*suit la partie au cas ou le robot part vers la 125: gauche et donc les moteurs doivent 126: etre corrigés de telle façon à ce que le robot 127: repart plus ou moins vers la droite*/ 128: 129: case 0x10: //robot part léger gauche 130: CCPR1L=200; RE2=0;RA2=0; //210 131: CCPR2L=239; //230 132: break; 133: case 0x20: //robot part moyen gauche 134: CCPR1L=150; RE2=0;RA2=0; //170 135: CCPR2L=239; //230 136: break; 137: case 0x40: //robot part extreme gauche 138: CCPR1L=0; RE2=0;RA2=1; //130 139: CCPR2L=239; //170 140: break; 141: 142: 143: /*suit la partie au cas ou le robot part vers 144: la droite et donc les moteurs doivent 145: etre corrigés de telle façon à ce que le robot 146: repart plus ou moins vers la gauche*/ 147: 148: case 0x04: //robot part leger droite 149: CCPR2L=200; RE2=0;RA2=0; //170 150: CCPR1L=239; //230 151: break; 152: case 0x02: //robot part moyen droite 153: CCPR2L=150; RE2=0;RA2=0; //130 154: CCPR1L=239; //170 155: break; 156: case 0x01: //robot part extrême droite 157: CCPR2L=0; RE2=1;RA2=0; //0 158: CCPR1L=239; //239 159: break; 160: 161: default : 162: 163: break; 164: } 165: 166: RB4=!RB4; /*cette broche nous a servi à sa voir si 167: le programme tournait bien, 168: car lors d'une panne nous avions émis 169: l'hypothèse que le programme ne 170: tournait pas*/ 171: if(a==1) 172: { 173: a=0; 174: } 175: } 176: } 177: 178: 179: /*cette fonction permet d'initialiser 180: la liaison série entre les deux PIC*/ 181: void serial_init (void) 182: { 183: BRGH=1; 184: SPBRG=25; 185: SYNC=0; 186: SPEN=1; 187: TXEN=1; 188: CREN=1; 189: } 190: 191: /*cette fonction permet d'emettre un caractère 192: à l'aide de la liaison série*/ 193: void serial_putchar (char c) 194: { 195: while (TRMT==0) 196: ; 197: TXREG=c; 198: } 199: 200: /*cette fonction permet d'emettre une suite 201: de caractère à l'aide de la liaison série*/ 202: void serial_puts (const char s[]) 203: { 204: char i=0; 205: while (s[i]!='\0') 206: { 207: serial_putchar(s[i]); 208: i++; 209: } 210: } 211: 212: //cette partie du programme sert à traiter l'interruption 213: interrupt void isr (void) 214: { 215: if (RCIF==1) 216: { 217: commande=RCREG; 218: a=1; 219: } 220: }