Vous êtes sur la page 1sur 6

Informatique Industrielle

TP 5 – Microcontrôleur

Capteur de Température DS1820

Thomas Quiniou et Albert Ranaivosoloarimanana

Licence SPI-2

Année 2014

1
1. Objectifs
Mettre en œuvre le capteur de T° DS1820 et afficher la valeur sur les afficheurs 7
segments.

2. Le capteur de température DS1820

Le capteur DS1820 est un capteur numérique qui


permet la mesure de la température sur la plage de -
55 à +125°C avec un pas de 0.5°C. Il se place
directement sur la platine de test Easypic7 selon le
schéma ci-contre :

Configuration :

1. positionner le capteur de T° sur l’emprunte TS1 (attention au sens)


2. vérifier que le jumper J11 est placé en position RE2, le déplacer si nécessaire.
3. valider les 4 afficheurs 7-segments (switch SW4)

Le capteur de température DS1820 s'appuie sur le protocole one-wire pour


communiquer avec le microcontrôleur et transmettre sa mesure. Comme son nom
l'indique, un seul fil est nécessaire (même si plusieurs périphériques sont utilisés).

La fiche technique du capteur décrit ses caractéristiques et son mode de


fonctionnement. Vous pouvez la télécharger à l’adresse http://pages.univ-nc.nc/~quiniou.
En raison de la simplicité d’utilisation et du large déploiement de ce capteur, les
commandes pour le faire fonctionner et le contrôler ont été implémentées dans la
librairie One_Wire de MikroC. Il y a au total 3 fonctions :

• Ow_Reset permet d'initialiser le capteur – OW_Reset(@1 du port, n° broche)


• Ow_Read permet la réception des données - OW_Read(@ du port, n° broche)
• Ow_Write permet d’envoyer des commandes au capteur – OW_Write(@ du port,
n° broche, code commande)

Communication
Le protocole de communication One_Wire permet d’utiliser plusieurs capteurs sur un
même fil. Chaque capteur est alors identifié par un code sur 64-bits (ROM code). Etant
donné que nous n’utilisons qu’un seul capteur ici, la procédure est simplifiée.

1
@ signifie adresse

2
Pour lire une température et l’afficher, il faut suivre les étapes suivantes :
a) Envoi de la commande CONVERT_T (code Ox44) au capteur (mesure de la
température)
b) Envoi de la commande READ_SCRATCHPAD (code 0xBE) au capteur (placement
de la température dans le buffer - ou mémoire tampon - du capteur)
c) Lecture du buffer
d) Affichage
Remarque : avant de transmettre les commandes CONVERT_T et READ_ SCRATCHPAD,
il faudra au préalable envoyer au capteur un pulse de reset (OW_Reset) puis la
commande SKIP ROM (code 0xCC) pour adresser tous les capteurs sans avoir recours au
code ROM d’identification (opération coûteuse).
Décodage de la température
A la lecture, le code renvoyé par le capteur est un code binaire sur 16 bits (les 8
premiers marquent le signe) :

Avant d’afficher la température, il est donc indispensable de décoder la suite binaire.


Pour cela, nous utilisons la relation donnée dans la fiche technique du capteur :

Après lecture du code binaire, la variable de lecture contient donc une suite de 16 bits.
Les 8 premiers (MSB) –mais 1 seul suffit- nous permettent de savoir si la température
est positive ou négative. Si elle est négative, il faudra déterminer le complément à 2 des
8 derniers bits (LSB). Ceci étant fait, vous remarquerez que le dernier bit permet de
déterminer la partie décimale. La résolution étant de 0.5°C, s’il est égal à 1, alors le
10ième de °C est égal à 5 et s’il est égal à 0, alors le 10ième de °C est égal à 0. Les 7 bits
restants correspondent à la partie entière.

3
3. Afficheur 7-segments (fichier Display_utils.h)

Nous allons afficher la température sur les 4 afficheurs 7-segments. Elle se mettra
sous la forme [Centaine] [Dizaine] [Unité] . [Dixième]. Pour cela, nous ferons toujours
appel à la procédure mask pour les afficheurs DIS0, 2 et 3, mais nous devons réécrire
une procédure maskDP pour l'afficheur DIS1 car il nous faut afficher le point décimal
(DP). En vous aidant de l'utilitaire "Seven Segment Editor" de mikroC, compléter le
fichier d'en-tête suivant :

// Fichier Display_utils.h
unsigned short mask(unsigned short num) {
switch (num) {
case 0 : return 0x …;
case 1 : return 0x …;
case 2 : return 0x …;
case 3 : return 0x …;
case 4 : return 0x …;
case 5 : return 0x …;
case 6 : return 0x …;
case 7 : return 0x…;
case 8 : return 0x…;
case 9 : return 0x…;
}
}

unsigned short maskDP(unsigned short num) {


switch (num) {
case 0 : return 0x…;
case 1 : return 0x…;
case 2 : return 0x…;
case 3 : return 0x…;
case 4 : return 0x…;
case 5 : return 0x…;
case 6 : return 0x…;
case 7 : return 0x…;
case 8 : return 0x…;
case 9 : return 0x…;
}
}

4
4. Le programme principal Temperature.c

Vous prendrez pour base le programme écrit lors de la séance précédente, DIS0123.c.
La différence ici réside dans le fait que le nombre à afficher n'est plus un compteur,
mais la valeur de T° issue du capteur ds1820.

Compléter le programme suivant (en vous aidant de la documentation) :

#include "Display_utils.h"

// Déclaration des variables


// temp : température sur 16 bits
// tempe : partie entière
// tempd : partie décimale
// decalage : valeur du décalage permettant de récupérer uniquement la partie entière

unsigned short shifter, portd_index, portd_array[4];


unsigned int digit, temp, tempe, tempd;
const unsigned short decalage = 1;

// Déclaration de l'interruption void interrupt(), cf. TP précédent


// Reprendre code correspondant dans DIS0123.c

// Programme principal
void main(){
ANSELE = 0; // Configure PORTE pins as digital (capteur ds1820)
TRISE.B2 = 1; // Configure RE2 pin as input (capteur ds1820)
// + declaration des variables et registres (portA, portD, Timer0 etc.)

while(1) {
// Step a) Lecture de la valeur de la T°
// Pensez à interdire l'interruption du Timer0
Ow_Reset(&PORTE, 2);
Ow_Write(&PORTE, 2 , 0xCC); // On s'adresse à tous les périphériques one_wire
Ow_Write(&PORTE, 2, 0x44); // Envoi de la commande CONVERT_T
Delay_us(120); // attente mesure
// Step b)
Ow_Reset(&PORTE, 2);
Ow_Write(&PORTE, 2, 0xCC); // On s'adresse à tous les périphériques one_wire
Ow_Write(&PORTE, 2, 0xBE); // Envoi de la commande READ_SCRATCHPAD
// Step c)
temp = Ow_Read(&PORTE, 2); // Lecture des 8 bits de poids faibles
temp = (Ow_Read(&PORTE, 2) << 8) + temp; // Lecture des 8 bits de poids forts
// Pensez à autoriser l'interruption du Timer0
// Step d)
// Mise en forme des données avant affichage lors de l'interruption

5
delay_ms(100);
}
}

En gras, les parties que vous devez compléter. En particulier, l'algorithme


correspondant au Step d) est donné ci-après :

- Dans un premier temps, il faut déterminer le signe de la température (positif ou


négatif) : test sur l'un des bits de poids fort de la variable temp
- Si la température est négative, calculer le complément à 2 des 8 bits de poids
faible
- Récupérer dans la variable tempd le bit de poids faible (il correspond au 10ième de
°C, 0 → .0°C, 1 → .5°C)
- Récupérer dans la variable tempe la valeur entière (décalage sur la droite de la
valeur decalage)
- Assigner les valeurs portd_array[0], portd_array[1], portd_array[2],
portd_array[3].
- Afficher la valeur obtenue sur le LCD.

Vous aimerez peut-être aussi