#include "biosdem.h" #include #include #include #include /*mot de configuration pour rendre le programme autonome*/ __CONFIG (0x3D39); //#define MODE_PC /*on définit si on travaille sur le PC ou si l'on travaille directement sur le robot: si cette ligne est mise en commentaire, on travaille sur le robot, sinon on travaille sur le PC*/ void serial_init(void); void serial_putchar(unsigned char x); void serial_puts(const char s[]); /* ce tableau va servir à définir les seuils des capteurs*/ const char tabseuil[8]={100,100,100,100,100,100,100,100}; //de droite a gauche /*commande est le mot qui va etre émis par ce PIC, ce mot de 8bits va permettre de donner les informations sur les capteurs, c'est-à-dire de savoir quel capteur(s) capte la piste. Ce mot sera traité par la suite dans le PIC de la carte principale pour donner l'ordre aux moteurs de ralentir ou d'accélerer*/ unsigned char commande=0,resultat=0; void main (void) { for( ; ; ) { char x=1,n=0; #ifdef MODE_PC char j; #endif char tab[10]; char i=0; tab[9]='\0'; tab[8]='\r'; /*cette partie du programme permet de maintenir un niveau 1 en direction de l'autre PIC afin de ne pas mettre la liason série en erreur*/ TRISC6=0; RC6=1; DelayMs(100); /*configuration du module de conversion analogique/numérique*/ ADCON1= 0x00; ADCS1=0; ADCS0=1; ADON=1; TRISD=0; /*initialisation de la liaison série*/ serial_init(); for(;;) {//DelayMs(255); ADCON0= ADCON0 & 0xC7; ADCON0= ADCON0 | (n<<3); PORTD=x; DelayUs(300); //Attente entre éclairage Led et Acquisition ADGO=1; while(ADGO==1); // cette partie du programme va lire la tension sur la voie n // et la comparer à tabseuil[n], en fonction du résultat, // supérieur ou inférieur au seuil // le PIC fabrique un mot binaire de 8 bit qui sera envoyé // au PIC de la carte principale resultat=ADRESH; if(tabseuil[n]>resultat) {commande=commande|x;} resultat=0; if(x!=0x80) { x=x<<1; n = n + 1 ; } else { x=1; n = 0 ; #ifdef MODE_PC j=8; i=1; while (j>=0) { if((commande & i)!=0) { tab[i]='1'; } else { tab[j]='0'; } i=i>>1; j=j-1; } serial_puts(tab); #else // le mot de 8 bits est transmis sur la liaison série // et il est réinitialiser à 0 DelayUs(50); serial_putchar(commande); #endif commande=0; } i=0; } } } /*cette fonction permet d'initialiser la liaison série entre les deux PIC*/ void serial_init(void) { BRGH=1; SPBRG=25; SYNC=0; SPEN=1; TXEN=1; CREN=1; } /*cette fonction permet d'emettre un caractère à l'aide de la liaison série*/ void serial_putchar(unsigned char x) { while(TRMT==0) ; TXREG=x; } /*cette fonction permet d'emettre une suite de caractère à l'aide de la liaison série*/ void serial_puts(const char s[]) { char i=0; while(s[i]!='\0') {serial_putchar(s[i]); i=i+1; } }