PIC, Onewire et DS18S20

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
}

Réalisation : LaboElectronique.be