Transcript
Page 1: e2 Proj Num Thermometre Rapport

2004

SARGOS MathildeZANCAN Adrien

Page 2: e2 Proj Num Thermometre Rapport
Page 3: e2 Proj Num Thermometre Rapport

ENSEIRB Projet système numérique

Sargos - Zancan 2/16

SSSOOOMMMMMMAAAIIIRRREEEINTRODUCTION........................................................................................................3

LE MATÉRIEL ...........................................................................................................4I SYNOPTIQUE DE LA CARTE.....................................................................................................4II SCHÉMA ET RÉALISATION DE LA CARTE ................................................................................4

LE LOGICIEL .............................................................................................................5I LES BIBLIOTHÈQUES C...........................................................................................................5

I.A) La LED.........................................................................................................................5I.B) Le bouton-poussoir .......................................................................................................5I.C) L'afficheur LCD 2*16 ..................................................................................................5

I.C.1) L'écriture d'un octet dans le LCD...................................................................................................5I.C.2) L'écriture d'une instruction LCD....................................................................................................5I.C.3) L'écriture d'un caractère vers le LCD.............................................................................................5I.C.4) L'écriture d'une chaîne de caractères vers le LCD.........................................................................6I.C.5) Le retour chariot..............................................................................................................................6I.C.6) L'effacement de l'écran ...................................................................................................................6I.C.7) Le positionnement du curseur en ligne et colonne ........................................................................6I.C.8) Les temporisations ..........................................................................................................................6I.C.9) L'attente pour l'instruction suivante ...............................................................................................6I.C.10) L’initialisation générale du LCD en mode 8 bits...........................................................................7I.C.11) Le programme test ..........................................................................................................................7

I.D) Le capteur LM35 ..........................................................................................................7I.D.1) L’initialisation générale pour le capteur analogique .....................................................................7I.D.2) La lecture de la température ...........................................................................................................8I.D.3) Le programme test ..........................................................................................................................8

I.E) Le capteur DS 1620 ......................................................................................................8I.E.1) La lecture d’un mot.........................................................................................................................8I.E.2) L’écriture d’un mot.........................................................................................................................9I.E.3) L’initialisation générale du capteur numérique .............................................................................9I.E.4) Le lancement d’une mesure............................................................................................................9I.E.5) La lecture de la température ...........................................................................................................9I.E.6) Le programme test ..........................................................................................................................9

I.F) La bibliothèque additionnelle ..................................................................................... 10II LE PROGRAMME PRINCIPAL................................................................................................. 10

II.A) La première version .................................................................................................... 10II.A.1) Point d'entrée "main()"..................................................................................................................10II.A.2) Initialisation des interruptions "irq_init()"...................................................................................10II.A.3) Initialisation du microcontrôleur "pic_init()"...............................................................................10II.A.4) Conversion ASCII "temp_to_string( temp )"...............................................................................10II.A.5) Enregistrements des températures maxi et mini "min_max()" ....................................................10II.A.6) Remise à zéro des températures maxi et mini "raz_min_max()".................................................11II.A.7) Traitement et affichage des températures "traitement()".............................................................11II.A.8) Le programme d'interruption "interrupt isr()".............................................................................12

II.B) La version multi-tâches .............................................................................................. 13II.B.1) Généralités.....................................................................................................................................13II.B.2) Les différentes tâches....................................................................................................................13II.B.3) Point d'entrée "main()"..................................................................................................................14

CONCLUSION ..........................................................................................................15

ANNEXES ..................................................................................................................16

Page 4: e2 Proj Num Thermometre Rapport

ENSEIRB Projet système numérique

Sargos - Zancan 3/16

____ IIINNNTTTRRROOODDDUUUCCCTTTIIIOOONNN ____Notre projet consiste en la réalisation d’un thermomètre à affichage digital à

base d’un microcontrôleur Microchip PIC 16F877. Sur un afficheur LCD, lestempératures intérieure et extérieure provenant de deux capteurs seront affichées.

Lors d'un changement, on affichera les nouvelles valeurs courantes detempérature. Les valeurs maximales et minimales des températures seront affichéeslors d'appuis successifs sur un bouton-poussoir. Si l'appui dépasse quelques secondesalors une initialisation des valeurs maximales et minimales sera effectuée. De plus uneLED clignotera régulièrement, il s'agit d'un témoin de bon fonctionnement del'ensemble.

Page 5: e2 Proj Num Thermometre Rapport

ENSEIRB Projet système numérique

Sargos - Zancan 4/16

_____LLLEEE MMMAAATTTEEERRRIIIEEELLL_____I Synoptique de la carte

La carte électronique est composée d'un microcontrôleur PIC 16F877, auquelsont associés divers périphériques. Un capteur de température de type analogiqueLM35 permet de mesurer la température extérieure, un capteur de température detype numérique DS1620 à interface série synchrone est utilisé pour la températureintérieure. Un afficheur LCD permet la visualisation des températures et autresinformations utiles. Un bouton-poussoir permet, quant à lui, de sélectionner lesdifférentes informations à afficher (températures courantes, températures maxi,températures mini, remise à zéro). Enfin, une LED clignote pour indiquer l'état defonctionnement du circuit.

II Schéma et réalisation de la carteLa réalisation du circuit imprimé a été faite avec le logiciel Mentor Graphics.Le schéma électrique du montage, les typons côté composants et côté cuivre,

les schémas d'implantation et la nomenclature des composants sont fournisrespectivement en Annexe 1, Annexe 2.1, Annexe 2.2, Annexe 3.1, Annexe 3.2 etAnnexe 4.

LM35

DS1620

PIC 16F877

Vout

DQ

CLK

/RST

RA2

RA1

RA3

BP sél

LCD(2x16)

LED

RB4

RB2

RB1

RB5

DB0 àDB7

RA1

RA1

RA1

RD0 àRD7

RB0

Page 6: e2 Proj Num Thermometre Rapport

ENSEIRB Projet système numérique

Sargos - Zancan 5/16

_____ LLLEEE LLLOOOGGGIIICCCIIIEEELLL _____I Les bibliothèques C

I.A) La LEDOn souhaite simplement ici allumer la LED afin de vérifier l'état général de

notre carte électrique et le fonctionnement global du PIC. Il suffit donc deconfigurer le port B correctement, le bit RB5 qui correspond à la commande de laLED doit être configuré en sortie. Si le bit RB5 est à l’état '1' alors la LEDs'allumera sinon elle sera éteinte.

I.B) Le bouton-poussoirOn souhaite faire changer l'état de la LED à chaque appui sur le bouton-

poussoir. Ce changement sera effectué dans le programme d'interruption appelélors de l'appui sur le bouton-poussoir. Il a donc fallu initialiser en interruption lebouton-poussoir de sélection qui se trouve sur la broche RB0 du PIC.

I.C) L'afficheur LCD 2*16L'afficheur LCD doit permettre de lire les températures, on souhaite donc

afficher une chaîne de caractères en code ASCII à partir d'une position définie surl'écran. On décompose cette fonction principale en sous-programmes pour obtenirune programmation plus claire et réutilisable.

I.C.1) L'écriture d'un octet dans le LCDLa fonction de base est l'écriture d'un octet dans l'afficheur que ce soit

une instruction ou une donnée. Le port D du PIC qui est relié au port DB del'afficheur doit être configuré en sortie (PORTDATA). Le port D contientl'octet à transmettre à l'afficheur, octet transmis quand le bit ‘Enable’ du LCDqui correspond à la broche RB4 du PIC passe de l'état '0' à l'état '1'(LCD_STROBE).

I.C.2) L'écriture d'une instruction LCDL'octet reçu par le LCD est pris comme instruction si le bit ‘RS’ du LCD

qui correspond à la broche RB1 du PIC est à l'état '0'. L'écriture de l'instructionsera faite uniquement si le LCD est libre de lire l'instruction, si le LCD estoccupé il faut donc attendre et cette attente est effectuée par la fonctionlcd_busy() expliquée un peu plus loin.

I.C.3) L'écriture d'un caractère vers le LCDL'octet reçu par le LCD est pris comme une donnée à mettre dans la

mémoire RAM interne si le bit ‘RS’ du LCD est à l'état '1'. Le bit ‘RW’ duLCD qui correspond à la broche RB2 du PIC doit être à l'état '0' pour pouvoir

Page 7: e2 Proj Num Thermometre Rapport

ENSEIRB Projet système numérique

Sargos - Zancan 6/16

écrire dans la RAM. L'écriture de la donnée d'un caractère en code ASCII serafaite aussi uniquement si le LCD est libre.

I.C.4) L'écriture d'une chaîne de caractères vers leLCD

On parcourt la chaîne de caractères et tant que le caractère est différentdu caractère '\0', caractère de fin de chaîne, on écrit le caractère vers le LCD.La position sur l'écran du caractère suivant est décalée automatiquement, cetteconfiguration est définie lors de l'initialisation générale du LCD.

I.C.5) Le retour chariotIl s'agit de l'écriture de l'instruction LCD ‘0x02’.

I.C.6) L'effacement de l'écranL'effacement de l'écran correspond à l'instruction LCD ‘0x01’, le temps

d'exécution de cette instruction prenant au moins 1.53 ms, une temporisationde 2ms est nécessaire avant l'instruction suivante qui sera ici le retour chariot.

I.C.7) Le positionnement du curseur en ligne et colonnePour situer le curseur sur l'écran, il faut écrire une instruction LCD.

Cette instruction est un octet où le bit DB7 est à l'état '1' et le reste des bitscorrespond à l'adresse de la mémoire à une position donnée sur l'écran. Dans lecas de l'afficheur utilisé, il y a uniquement 2 lignes par 16 caractères quipeuvent être affichés alors que l'on peut mémoriser 2 lignes par 40 caractères.L'adresse peut être définie comme suit : colonne + ligne * 0x40 où la ligne estsoit 0 ou 1 et la colonne va de 0 à 15.

I.C.8) Les temporisationsLa temporisation de 250 µs est réalisée par une boucle ‘while (dcnt--)’

qui décrémente la constante 'dcnt' à chaque passage dans la boucle. La duréed'un cycle d'horloge correspond à quatre fois la période du quartz soit 1µs etl'instruction ‘while (dcnt--)’ prend trois cycles d'horloge. Donc si la constante'dcnt' vaut 250/3 alors la durée de la boucle sera d'environ 250 µs. Laconstante 'dcnt' est en effet égale à 250/3 car XTAL_FREQ = 4 (MHz) d'où250/(12/4)=250/3. La temporisation de x ms est réalisée en faisant x*4 latemporisation de 250 µs et celle de x seconde est réalisée en faisant x*4 latemporisation de 250 ms.

I.C.9) L'attente pour l'instruction suivanteOn doit attendre que le LCD soit libre pour effectuer l'écriture de

l'instruction suivante. On a sur le port DB du LCD un indicateur 'Busy Flag'qui reste à l'état '1' tant que le LCD est occupé; l'instruction suivante peut êtreexécutée quand l'indicateur est à '0'.

L'indicateur est en sortie sur le bit DB7 de l’afficheur et donc en entréesur le port D du PIC quand le bit 'RS' est à '0' et le bit 'RW' est à '1'. A la fin decette fonction il faudra donc remettre le bit 'RW' à '0' et le port D du PIC ensortie. Ainsi tant que le bit qui correspond au 'busy flag' est à l’état '1' on

Page 8: e2 Proj Num Thermometre Rapport

ENSEIRB Projet système numérique

Sargos - Zancan 7/16

attend, attention il faut refaire un ‘LCD_STROBE’ chaque fois que l'onsouhaite lire l'indicateur.

I.C.10) L’initialisation générale du LCD en mode 8 bitsLa procédure d’initialisation est donnée dans la data-sheet de l’afficheur.

Tout d’abord, le port D du PIC doit être configuré en sortie ainsi que les bits‘RS’, ‘RW’ et ‘Enable’ à l’état ‘0’. Un première temporisation de 25 ms estnécessaire pour assurer une alimentation correcte. L’instruction ‘0x30’ doitêtre ensuite écrite par deux fois avec une temporisation après chaque écriture,l’afficheur est ainsi initialisé en mode 8 bits et l’indicateur ‘busy flag’ peutmaintenant être utilisé. L’initialisation du mode d’affichage peut alorscommencer. La première instruction ‘0x38’ permet de définir le nombre delignes, ici 2, et la résolution des caractères, ici 5*7 points. La deuxièmeinstruction ‘0x08’ permet de définir le contrôle de l’affichage, ici l’affichageest invisible. On effectue ensuite un effacement de l’écran par l’instruction‘0x01’ suivie par une temporisation de 2 ms. L’affichage est permis mais lescurseurs n’apparaissent pas avec l’instruction ‘0x0C’.Et enfin l’instruction‘0x06’ permet que le curseur se décale à droite automatiquement et quel’adresse de la mémoire RAM interne s’incrémente de 1.

I.C.11) Le programme testOn souhaite ici vérifier les fonctions de la bibliothèque ‘liblcd’. On a

donc tout d’abord initialisé l’afficheur , puis écrit un caractère, positionné lecurseur sur l’écran et écrit une chaîne de caractères et on a aussi effectué uneffacement de l’écran. Ce programme de test fonctionnait correctement, labibliothèque de l’afficheur est donc validée.

I.D) Le capteur LM35Le capteur LM35 est un capteur de température où la tension de sortie est

linéairement proportionnelle à la température en Celsius centigrade. Ce capteurne nécessite pas de calibrage externe pour fournir une précision de ± _°C sur unegamme de température de –55°C à +150°C. Son coefficient est de 10mV/°C etdans notre cas le capteur est alimenté en 0-5V, on ne peut mesurer par conséquentque des températures positives.

I.D.1) L’initialisation générale pour le capteuranalogique

Le capteur étant analogique un convertisseur analogique - numérique estnécessaire pour traiter et afficher la température. Le convertisseur CAN duPIC doit donc être configuré. La sortie du capteur se trouve à la broche RA0du PIC qui est donc configurée en entrée analogique. De plus le résultat de laconversion est sur 10 bits (les registres ADRESH et ADRESL) le bit de poidsfaible se trouvant au bit 0 du registre ADRESL (résultat justifié à droite). Unefréquence d’échantillonnage doit être aussi choisie, elle est égale ici à lafréquence du quartz divisée par 32. On ne souhaite pas non plus utiliser leconvertisseur CAN en interruption (‘ADIE’=’0’). Le convertisseur est mis enservice quand le bit ‘ADON’ est à l’état ‘1’. Après une temporisation de250µs, une conversion peut être lancée en mettant à l’état ‘1’ le bit ‘ADGO’.

Page 9: e2 Proj Num Thermometre Rapport

ENSEIRB Projet système numérique

Sargos - Zancan 8/16

I.D.2) La lecture de la températureAfin de lire une température correcte issue du capteur analogique,

l’attente de la fin de la conversion du CAN est indispensable. Une conversionest finie quand le bit ‘ADGO’ est repassé à l’état ‘0’. Après la lecture desregistres ADRESH et ADREHL, une nouvelle conversion peut alors êtrelancée.

La variable ‘temp’ est un entier qui correspond à la température en0.1°C. La pleine échelle du convertisseur correspond pour une tension de 5V àla valeur ‘0x3FF’ car le résultat est sur 10 bits. Or si on ne prend pas encompte la limitation du capteur, la tension 5V correspond à une température de5/(10mV/°C) = 5000 en 0.1°C. Donc pour une valeur x du résultat de laconversion, la température en 0.1°C est égale à x*5000/0x3FF.

L’erreur commise par un convertisseur CAN est de l’ordre de ± _ LSB,ce qui correspond ici à une tension de 5V/‘0x3FF’=4.9mV, or pour le capteurLM35 une tension de 10mV correspond à une température de 1°C. Parconséquence la précision de la mesure de température est d’environ 0.5°C.

I.D.3) Le programme testOn souhaite ici vérifier les fonctions de la bibliothèque ‘liblm25’. Après

l’initialisation de l’afficheur et du capteur LM35, on affiche en continu latempérature issue du capteur. Une fonction supplémentaire est nécessaire pourpasser d’un entier qui correspond à la température à une chaîne de caractèrespour l’affichage, il s’agit de la fonction « void temp_to_string ( unsigned shorttemp ) ». Cette fonction transforme un entier en chaîne de caractères ASCII etarrondie le dixième de la température soit à 0 soit à 5. Ce programme de testfonctionnait correctement, la bibliothèque du capteur LM35 est donc validée.

I.E) Le capteur DS 1620Le capteur DS1620 est un capteur numérique de température avec une

gamme de mesure de –55°C à +125°C et de précision 0.5°C. Ce capteurfonctionne avec une interface de trois fils : un signal d’horloge ‘CLK’, un signalde reset ‘RST’ et un signal de donnée ‘DQ’. La transmission des données et desinstructions se fait par liaison synchrone série avec le bit de poids faible enpremier. Ce capteur peut nous permettre d’avoir une mesure de températureenviron toutes les secondes.

I.E.1) La lecture d’un motUne des fonctions de base est la lecture par le PIC d’une donnée du

capteur. La broche ‘DQ’ du capteur reliée à la broche ‘RA3’ du port A estdonc configurée en entrée par rapport au PIC. Une transmission de donnéesdoit être initialisée en mettant la broche ‘RST’ du capteur à l’état ‘1’. Si le motà transmettre est composé de x bits alors cette transmission sera réalisée avec xcycles d’horloge. Un cycle d’horloge correspond à un front descendant del’horloge ‘CLK’ suivi d’un front montant. Quand une transmission entre lecapteur et le PIC est terminée le bit ‘RST’ doit repasser à l’état ‘0’. Dans le casd’une lecture, la broche ‘DQ’ du capteur est en sortie, et la donnée sur cettebroche est modifiée lors d’un front descendant de l’horloge et reste valide

Page 10: e2 Proj Num Thermometre Rapport

ENSEIRB Projet système numérique

Sargos - Zancan 9/16

jusqu’à un front montant de l’horloge. Ainsi entre ‘CLK’=’0’ et ‘CLK’=’1’,suivant l’état de la broche ‘DQ’ on modifie le bit correspondant de la donnéefinale.

I.E.2) L’écriture d’un motL’autre fonction de base est l’écriture par le PIC d’une instruction du

capteur. La broche ‘DQ’ du capteur reliée à la broche ‘RA3’ du port A estdonc configurée en sortie par rapport au PIC. Le principe de transmission delecture reste le même pour l’écriture. Mais dans le cas d’une écriture, la broche‘DQ’ du capteur est en entrée, et la donnée sur cette broche doit être validedurant le front montant de l’horloge. Ainsi entre ‘CLK’=’0’ et ‘CLK’=’1’,suivant le bit correspondant de la donnée à transmettre la broche ‘DQ’ prend lavaleur de ce bit.

I.E.3) L’initialisation générale du capteur numériqueLes broches du capteur étant reliées sur les broches RA1 à RA3 du port

A du PIC, ces broches sont configurées en entrées numériques. Le registre deconfiguration du capteur doit être initialisé et pour cela il faut tout d’abordécrire l’instruction de 8 bits ‘0x0C’ qui permet au capteur de savoir que les 8prochains bits correspondront à la nouvelle valeur du registre de configuration.On écrit donc ensuite dans ce registre ‘0x03’, le capteur est par conséquentdans le mode ‘One-shot’, une nouvelle conversion se fait uniquement sil’écriture de l’instruction ‘Start Convert T’ (lancement de conversion) a étéeffectuée, de plus le bit ‘CPU’ à l’état ‘1’ correspond au mode de transmissionexpliqué plus haut.

I.E.4) Le lancement d’une mesureLe lancement d’une mesure s’effectue en écrivant sur le capteur

l’instruction de 8 bits ‘0xEE’ qui correspond à un début de conversion detempérature.

I.E.5) La lecture de la températurePour lire la température du capteur qui se trouve sous la forme d’un mot

de 9 bits, il faut tout d’abord envoyer sur le capteur l’instruction de 8 bits‘0xAA’. Cette instruction permet au capteur de savoir que l’on souhaite lire ladernière conversion sur le registre température. La variable ‘temp’ est unentier qui correspond à la température en 0.1°C.

I.E.6) Le programme testOn souhaite ici vérifier les fonctions de la bibliothèque ‘lib1620’. Après

l’initialisation de l’afficheur et du capteur DS1620, on affiche en continu latempérature issue du capteur numérique. On utilise la même fonction ducapteur analogique qui transforme un entier en chaîne de caractères ASCII. Ceprogramme de test fonctionnait correctement, la bibliothèque du capteurDS1620 est donc validée.

Page 11: e2 Proj Num Thermometre Rapport

ENSEIRB Projet système numérique

Sargos - Zancan 10/16

I.F) La bibliothèque additionnelleCette bibliothèque est présente en raison du compilateur qui n’accepte pas

les réentrances dans les fonctions. Les mêmes fonctions ne doivent donc pas seretrouver à la fois dans le programme d’interruption et dans le programmeprincipal. On a donc recopié les fonctions qui posaient un problème sous un autrenom.

II Le programme principal

II.A) La première version

II.A.1) Point d'entrée "main()"Après avoir appelé la fonction d'initialisation "pic_init()", le

microcontrôleur entre dans une boucle infinie. Dans cette boucle, le PICeffectue seulement l'appel de la fonction "traitement()" qui est chargée de lagestion de l'affichage.

II.A.2) Initialisation des interruptions "irq_init()"Cette fonction permet tout d'abord d'initialiser le Timer pour qu'il

effectue une interruption toutes les secondes. Elle permet aussi d'autoriser lebouton-poussoir à fonctionner en interruption.

II.A.3) Initialisation du microcontrôleur "pic_init()"Cette fonction permet d’initialiser les ports du microcontrôleur,

d’appeler les fonctions d'initialisation de chaque périphérique et d'initialisationdes interruptions.

II.A.4) Conversion ASCII "temp_to_string( temp )"Cette fonction permet de convertir un entier image de la température en

une chaîne de caractères prête à être affichée sur l'écran LCD.La variable "temp" est un octet non signé, c'est une température en

0.1°C. Chaque digit est converti en code ASCII, la chaîne de caractèresrésultante contient : le chiffre des dizaines de °C , le chiffre des unités, lecaractère '.' , le chiffre des dixièmes et enfin le caractère '\0' .

Le capteur LM35 associé au CAN du microcontrôleur n'étant précis qu'à0.5 °C près, il plus judicieux de n'afficher que des valeurs arrondies de latempérature. Aussi, une adaptation est réalisée dans la fonction"temp_to_string" pour arrondir les dixièmes de degrès.

II.A.5) Enregistrements des températures maxi et mini"min_max()"

Lorsque la température courante est inférieure à la température minimaleenregistrée précédemment, cette dernière est mise à jour. De même lorsque latempérature courante est supérieure à la température maximale enregistrée

Page 12: e2 Proj Num Thermometre Rapport

ENSEIRB Projet système numérique

Sargos - Zancan 11/16

précédemment, cette dernière est mise à jour. Cet enregistrement s’effectuepour les deux températures (intérieure et extérieure).

II.A.6) Initialisation des températures maxi et mini"raz_min_max()"

Les températures minimale et maximale enregistrées sont remises auxvaleurs des températures courantes (intérieure et extérieure).

II.A.7) Traitement et affichage des températures"traitement()"

Cette fonction est entièrement articulée autour de la variable "select"grâce à un switch – case. La variable "select" représente en quelque sorte lenombre d'appui sur le bouton-poussoir et donc, l'information que doit afficherl'écran. Ainsi, suivant l'état de "select", l'écran sera dans les états suivants :

Si select = 0affichage des températures courantes

Si select = 1affichage des températures maximales

Si select = 2affichage des températures minimales

Si select = 3affichage de l'écran "RAZ max, RAZ min"

De façon à éviter un clignotement de l'écran, les températures courantesne sont affichées que si elles ont changé. Toutefois l'écran des températurescourantes doit être affiché si un autre écran à été affiché auparavant. Lavariable booléenne "flag_select_different" a pour rôle de détecter si un autreécran vient d'être affiché.

Voici l'algorithme de la fonction "traitement()"Selon ( select )

si ( 0 ) faireSi ( (température ≠ température_précédente)

ou flag_select_different ) alorsflag_select_different = 0min_max() Modification des max et mintempérature_précédente = températureafficher l'écran des températures courantes

Fin sisi ( 1 ) faire

afficher l'écran des températures maximalessi ( 2 ) faire

afficher l'écran des températures minimalessi ( 3 ) faire

raz_min_max()afficher l'écran de RAZ des températures

Fin selon

Page 13: e2 Proj Num Thermometre Rapport

ENSEIRB Projet système numérique

Sargos - Zancan 12/16

II.A.8) Le programme d'interruption "interrupt isr()"Il y a deux interruptions activées : une par le débordement du timer1 qui

survient régulièrement toutes les secondes, et une lors d'un appui sur lebouton-poussoir. Ces deux interruptions exécutent le même programmed'interruption, il convient donc de tester chaque "flag" d'interruption pourdéterminer quelle est celle qui vient de survenir. L'ordre de scrutation des"flags" détermine la priorité des interruptions respectives. Nous avons décidéde donner la priorité maximale à l'interruption timer, elle est donc scrutée enpremier.

A chaque interruption timer, les deux températures sont lues etenregistrées dans les variables globales "tempINT" et "tempEXT". Maisl'interruption timer sert aussi à détecter un appui long sur le bouton-poussoir.Ainsi, un test est effectué pour savoir si le bouton-poussoir est appuyé, si c'estle cas, un compteur "appui_long" est incrémenté, si ce compteur dépasse lavaleur 3, cela veut dire que le bouton-poussoir est resté appuyé pendant 3secondes, la variable "select" doit donc être mise à 3 pour indiquer à lafonction traitement d'effectuer la remise à zéro des températures maxi et mini.

A chaque interruption générée par le bouton-poussoir, et après une petitetempo anti-rebond, la variable "select" est incrémentée, elle passerasuccessivement (à chaque appui) à 1, 2 puis reviendra à 0.

Voici l'algorithme de la fonction "interrupt isr()"Interruption timerSi ( flag_timer ) alors

RAZ flag_timerLED = non LEDSi ( BP_appuyé ) alors

RAZ flag_BPSi ( appui_long > 3 ) alors Appui > 3 s

select = 3 RAZ min maxsinon L'utilisateur est en train d'appuyer mais

appui < 3 secondesincrémenter appui_long

Fin sisinon

appui_long = 0Si ( select = 3 ) alors un RAZ vient d'être effectué

select = 0 retour à l'affichage courantflag_select_different = TRUE

Fin siLecture des températurestempINT = lireDS1620tempEXT = lireLM35

Fin siFin siInterruption bouton-poussoirSi ( flag_BP ) alors

Attendre 12ms tempo anti-rebondSi ( BP_appuyé ) alors

Si ( select < 2 ) alors

Page 14: e2 Proj Num Thermometre Rapport

ENSEIRB Projet système numérique

Sargos - Zancan 13/16

incrémenter select passer à l'affichage suivantsinon

select = 0 retour à l'affichage courantL'affichage précédent n'était pas l'affichage destempératures courantesflag_select_different = TRUE

Fin siRAZ flag_BP

Fin si

II.B) La version multi-tâches

II.B.1) GénéralitésToutes les librairies utilisées restent bien sûr identiques, les fonctions

utilisées dans le programme principal sont aussi identiques. Les changementsse situent dans le "main()" et le programme d'interruption.

Dans cette version du programme, le bouton-poussoir ne fonctionne pasen interruption, par contre, l'interruption due au débordement du timer1 serabeaucoup plus rapide (1ms) pour permettre une scrutation de l'état du bouton-poussoir. Quatre tâches distinctes ont été définies.

A chaque tâche est associés un compteur "task_x_counter" et uneconstante "TASK_X_COUNTER_MAX". A chaque interruption (toutes les1ms), le compteur de chaque tâche est incrémenté ; lorsque le compteur de latâche "x" atteint la constante "TASK_x_COUNTER_MAX", la tâche "x" esteffectuée.

II.B.2) Les différentes tâches

"task_sw"C'est la tâche la plus fréquemment exécutée, car elle est exécutée à

chaque interruption (toutes les 1ms). Elle sert à scruter l'état du bouton-poussoir et à modifier la variable "select" pour choisir les informations àafficher. Le booléen "task_sw_push" permet de détecter lorsqu'il y a eu unrelâchement de l'interrupteur pour éviter qu'un appui d'une durée supérieureà 1ms (ce qui est toujours le cas si l'utilisateur est humain ) ne soit pris encompte comme une multitude d'appuis. "task_sw" permet aussi d'autoriserl'exécution de la tâche "task_raz" lorsqu'il y a eu appui sur le bouton-poussoir.

"task_display"C'est une tâche de fréquence moyenne (toutes les 250ms) et de faible

priorité. Elle permet le traitement et l'affichage des données par l'appel de lafonction "traitement()" (cette dernière est détaillée en II.A.7). Comme cettetâche peut durer plus de 1ms, dans l'interruption, seul un "flag" et mis à 1,l'exécution de la tâche se fait dans la boucle infinie du "main()".

Page 15: e2 Proj Num Thermometre Rapport

ENSEIRB Projet système numérique

Sargos - Zancan 14/16

"task_read"C'est une tâche de faible fréquence (toutes les 1s) et de faible priorité.

C'est dans cette tâche qu'est effectuée la lecture des valeurs des capteurs detempérature et les re-lancements de conversion. Elle réalise aussi le retour àl'affichage "températures courantes" si l'écran "températures maxi" ou"températures mini" est affiché depuis 3 à 4 secondes. Comme pour"task_display", la tâche durant plus de 1ms, elle est exécutée dans le"main()" grâce à un "flag" mis à 1 dans l'interruption.

"task_raz"Cette tâche n'est autorisée que si l'utilisateur vient d'appuyer sur le

bouton-poussoir (dans "task_sw", le compteur "task_raz_counter" y estaussi mis à 0 en même temps que "task_raz" est autorisée), elle s'effectueraalors au bout de 2 secondes. Sa seule fonction est de mettre la variable"select" à 3, permettant ainsi d'autoriser l'effacement des températures maxiet mini.

II.B.3) Point d'entrée "main()"Après avoir appelé la fonction d'initialisation des périphériques

"pic_init()" et l'initialisation du timer1 pour le fonctionnement multi-tâches"setup_multitasking()", le microcontrôleur entre dans une boucle infinie. Danscette boucle, le PIC effectue, suivant l'état des "flags" de "task_read" et"task_display", la lecture et l'enregistrement des deux températures dans lesvariables globales "tempINT" et "tempEXT" (toutes les 1s) et l'appel de lafonction "traitement()" qui est chargée de la gestion de l'affichage (toutes les250ms).

Page 16: e2 Proj Num Thermometre Rapport

ENSEIRB Projet système numérique

Sargos - Zancan 15/16

____ CCCOOONNNCCCLLLUUUSSSIIIOOONNN_____

Ce projet nous a tout d'abord permis de concevoir un système numérique dudébut à la fin, de la conception électronique jusqu'au logiciel. L'utilisation d'unmicrocontrôleur de type PIC simplifie grandement l'élaboration d'un tel montage, etnotre logiciel répond au cahier des charges.

La programmation du logiciel associé était intéressante et nous avons pu nousrendre compte de tout l'intérêt que peut prendre la création de bibliothèques. Lesprogrammes sont ainsi simplifiés et plus lisibles mais surtout, les bibliothèquespeuvent être réutilisées très simplement. La version multi-tâches a été en fait trèsrapide à faire, elle permet d'avoir une approche plus systématique dans la conceptiondu programme et on comprend tout l'intérêt qu'elle apporte lorsque l'on veut ajouterune tâche au microcontrôleur. En effet, il suffit de définir une tâche supplémentaire etde l'implémenter dans l'interruption exactement comme les autres, l'amélioration d'unsystème devient ainsi très simple et les performances ne sont pas dégradées.

Page 17: e2 Proj Num Thermometre Rapport

ENSEIRB Projet système numérique

Sargos - Zancan 16/16

______ AAANNNNNNEEEXXXEEESSS ______Schéma électrique du montage Annexe 1

Typon côté composants Annexe 2.1

Typon côté cuivre Annexe 2.2

Schéma d'implantation des composants 1 Annexe 3.1

Schéma d'implantation des composants 2 Annexe 3.2

Nomenclature des composants Annexe 4

Code source du programme test de la LED Annexe 5

Code source du programme test du Bouton-poussoir Annexe 6

Définition de la bibliothèque de l’afficheur Annexe 7.1

Code source de la bibliothèque de l’afficheur Annexe 7.2

Code source du programme test de l’afficheur Annexe 7.3

Définition de la bibliothèque du capteur LM35 Annexe 8.1

Code source de la bibliothèque du capteur LM35 Annexe 8.2

Code source du programme test du capteur LM35 Annexe 8.3

Définition de la bibliothèque du capteur DS1620 Annexe 9.1

Code source de la bibliothèque du capteur DS1620 Annexe 9.2

Code source du programme test du capteur DS1620 Annexe 9.3

Définition de la bibliothèque additionnelle Annexe 10.1

Code source de la bibliothèque additionnelle Annexe 10.2

Code source du programme principal, 1ère version Annexe 11

Code source du programme principal, version multi-tâches Annexe 12

Page 18: e2 Proj Num Thermometre Rapport
Page 19: e2 Proj Num Thermometre Rapport

# Board Station BOM file # date : Friday April 16, 2004; 11:23:47

REFERENCE ITEM_NUMBER COMPANY PART NO. GEOMETRY DESCRIPTION

C1 12 pn-m-cap_01_2u CK05 CAPACITOR, 0.1u C2 12 pn-m-cap_01_2u CK05 CAPACITOR, 22p C3 12 pn-m-cap_01_2u CK05 CAPACITOR, 22p Cds1 12 pn-m-cap_01_2u CK05 CAPACITOR, 0.1u Clcd1 12 pn-m-cap_01_2u CK05 CAPACITOR, 0.1u Cpic1 13 pn-m-chim_tantale_2u c_chim_1 POL_CAPACITOR, 1u D1 9 pn-k-led_3.5mm LED_3X5.5MM LED, RBG1000 Jds_CLK1 4 pn-g-cosse_poignard cnk1x200 conn1 Jds_dq1 4 pn-g-cosse_poignard cnk1x200 conn1 Jds_rst1 4 pn-g-cosse_poignard cnk1x200 conn1 Jgnd1 4 pn-g-cosse_poignard cnk1x200 conn1 Jgnd2 4 pn-g-cosse_poignard cnk1x200 conn1 Jgnd3 5 pn-g-douille_4mm_ci plk1x400 plot Jlcd_E1 4 pn-g-cosse_poignard cnk1x200 conn1 Jlcd_RS1 4 pn-g-cosse_poignard cnk1x200 conn1 Jlcd_RW1 4 pn-g-cosse_poignard cnk1x200 conn1 Jlm1 4 pn-g-cosse_poignard cnk1x200 conn1 Jvcc1 5 pn-g-douille_4mm_ci plk1x400 plot K1 3 pn-f-rond_d6_itt sw_bp12mm poussoir K2 3 pn-f-rond_d6_itt sw_bp12mm poussoir P1 11 pn-l-trim_vert trim_v pot, POT R1 10 pn-l-res_01_4u_1/4W RC05 RESISTOR, 1K R2 10 pn-l-res_01_4u_1/4W RC05 RESISTOR, 100K R3 10 pn-l-res_01_4u_1/4W RC05 RESISTOR, 10K R4 10 pn-l-res_01_4u_1/4W RC05 RESISTOR, 10K R5 10 pn-l-res_01_4u_1/4W RC05 RESISTOR, 470 U1 2 pn-c-lm35 to920 LM35 U2 1 pn-b-ds1620 DIP8_P DS1620 U3 7 pn-j-pic16f877 DIP40_P 16F877 U4 6 pn-i-quartz_2u hc18 quartz, 4MHz U5 8 pn-k-lcd2x16 lcd84x43mm LCD2x16