Un exemple d'intégration d'un capteur de température a déjà été présenté sur ce site pour un microcontrôleur de la famille 8051. La théorie du Bus Onewire a déjà été explicitée dans cette page. Nous allons donc, en ce bassant sur cette théorie, connecter ce capteur à un pic 18F4525. La transition entre les deux familles de microcontrôleur est assez facile vu l'utilisation du language C pour la programmation.
Pour la gestion du bus Onewire, la création d'un libraire ou fichier #include est utile pour des raison de clarté dans le programme ou pour des raisons de réemploi dans des programmes futurs.
Pour débuter, on définit la Pin du microcontrôleur par laquelle on va communiquer avec le capteur. Puis on ammorce la détection de présence et le reset hardware du capteur.
|
#define DQ porta.F5 // définition de la pin RA5 unsigned char ow_reset_g(void) { unsigned char presence; DQ = 0; //le maître met le bus bas delay_us(480); // on temporise 480µsec DQ = 1; // on relache le bus delay_us(70); // on attend le reveil du capteur presence = DQ; // on regarde si on a une présence delay_us(230); // on attend la fin du temps possible return(presence); // on retourne le signal de présence } // 0=presence, 1 = pas de capteur |
|||
Il nous faut maintenant les routines permettant au maître de lire et écrire sur le bus. Deux fonctions sont utilisées pour l'émission/réception d'un bit. Ces deux fonctions étant utilisées pour l'écriture/lecture des octets.
|
///////////////////////////////////////////////////////////////// //READ_BIT ////////////////////////////////////////////////////////////////// unsigned char read_bit(void) { // Lecture d'un bit DQ = 0; // On met DQ bas pour démarrer la séquence DQ = 1; // retour niveau haut delay_us(15); // delai de 15us depuis le début de la séquence return(DQ); // On renvoie la valeur de DQ } ////////////////////////////////////////////////////////////////// //WRITE_BIT ////////////////////////////////////////////////////////////////// void write_bit(char bitval) { //Ecriture d'un bit DQ = 0; //On met DQ bas pour démarrer la séquence if(bitval==1) DQ =1; // On met DQ au niveau Haut si la valeur à écrire est 1 delay_us(120); // On garde la valeur pour le reste de la séquence DQ = 1; } ////////////////////////////////////////////////////////////////////////////// // READ_BYTE - Lit un Octet sur le bus ////////////////////////////////////////////////////////////////////////////// unsigned char read_byte_g(void) { unsigned char i; unsigned char value = 0; for (i=0;i<8;i++) { if(read_bit()) value|=0x01<<i; // On lit un bit à la fois puis on shifte le tout à gauche delay_us(140); // on attend pour le reste de la séquence } return(value); } ////////////////////////////////////////////////////////////////////////////// // WRITE_BYTE - Ecrit un octet sur le bus. ////////////////////////////////////////////////////////////////////////////// void write_byte_g(char val) { unsigned char i; unsigned char temp; for (i=0; i<8; i++) // Ecrit un octet, un bit à la fois { temp = val<>i; // on shifte val i fois vers la droite temp &= 0x01; // on copie le bit lsb dans temp write_bit(temp); // on envoie ce bit sur le bus } delay_us(120);//on attend pour le reste de la séquence } |
|||