1: #include "biosdem.h" 2: #include 3: #include 4: #include 5: #include 6: 7: /*mot de configuration pour 8: rendre le programme autonome*/ 9: __CONFIG (0x3D39); 10: 11: //#define MODE_PC 12: /*on définit si on travaille sur le PC 13: ou si l'on travaille directement sur le robot: 14: si cette ligne est mise en commentaire, on travaille sur 15: le robot, sinon on travaille sur le PC*/ 16: void serial_init(void); 17: void serial_putchar(unsigned char x); 18: void serial_puts(const char s[]); 19: 20: /* ce tableau va servir à définir les seuils des capteurs*/ 21: const char tabseuil[8]={115,72,72,72,72,72,72,72}; //de droite a gauche 22: 23: /*commande est le mot qui va etre émis par ce PIC, ce mot de 8bits va 24: permettre de donner les informations sur les capteurs, 25: c'est-à-dire de savoir quel capteur(s) capte la piste. Ce mot sera traité 26: par la suite dans le PIC de la carte principale pour donner 27: l'ordre aux moteurs de ralentir ou d'accélerer*/ 28: unsigned char commande=0,resultat=0; 29: 30: 31: void main (void) 32: { 33: /* for( ; ; ) 34: {*/ 35: char x=1,n=0; 36: #ifdef MODE_PC 37: char j; 38: #endif 39: char tab[10]; 40: char i=0; 41: tab[9]='\0'; 42: tab[8]='\r'; 43: 44: /*cette partie du programme permet de maintenir 45: un niveau 1 en direction de l'autre PIC afin de ne pas 46: mettre la liason série en erreur*/ 47: TRISC6=0; 48: RC6=1; 49: DelayMs(100); 50: 51: /*configuration du module de conversion analogique/numérique*/ 52: ADCON1= 0x00; 53: ADCS1=0; 54: ADCS0=1; 55: ADON=1; 56: TRISD=0; 57: 58: /*initialisation de la liaison série*/ 59: serial_init(); 60: for(;;) 61: {//DelayMs(255); 62: 63: ADCON0= ADCON0 & 0xC7; 64: 65: ADCON0= ADCON0 | (n<<3); 66: PORTD=x; 67: DelayUs(300); //Attente entre éclairage Led et Acquisition 68: ADGO=1; 69: while(ADGO==1); 70: 71: // cette partie du programme va lire la tension sur la voie n 72: // et la comparer à tabseuil[n], en fonction du résultat, 73: // supérieur ou inférieur au seuil 74: // le PIC fabrique un mot binaire de 8 bit qui sera envoyé 75: // au PIC de la carte principale 76: resultat=ADRESH; 77: if(tabseuil[n]>resultat) 78: {commande=commande|x;} 79: resultat=0; 80: if(x!=0x80) 81: { 82: x=x<<1; 83: n = n + 1 ; 84: } 85: else 86: { 87: x=1; 88: n = 0 ; 89: 90: #ifdef MODE_PC 91: j=8; 92: i=1; 93: while (j>=0) 94: { 95: if((commande & i)!=0) 96: { 97: tab[i]='1'; 98: } 99: else 100: { 101: tab[j]='0'; 102: } 103: i=i>>1; 104: j=j-1; 105: } 106: 107: serial_puts(tab); 108: #else 109: // le mot de 8 bits est transmis sur la liaison série 110: // et il est réinitialiser à 0 111: DelayUs(50); 112: serial_putchar(commande); 113: #endif 114: commande=0; 115: } 116: 117: i=0; 118: 119: } 120: } 121: //} 122: 123: /*cette fonction permet d'initialiser 124: la liaison série entre les deux PIC*/ 125: void serial_init(void) 126: { 127: BRGH=1; 128: SPBRG=25; 129: SYNC=0; 130: SPEN=1; 131: TXEN=1; 132: CREN=1; 133: } 134: 135: /*cette fonction permet d'emettre un caractère 136: à l'aide de la liaison série*/ 137: void serial_putchar(unsigned char x) 138: { 139: while(TRMT==0) 140: ; 141: TXREG=x; 142: } 143: 144: /*cette fonction permet d'emettre une suite 145: de caractère à l'aide de la liaison série*/ 146: void serial_puts(const char s[]) 147: { 148: char i=0; 149: while(s[i]!='\0') 150: {serial_putchar(s[i]); 151: i=i+1; 152: } 153: 154: } 155: 156: