2004
SARG SA RGOS OS
Math Ma thil ilde de
ZANC ZA NCAN AN
Adri Ad rien en
ENSEIRB
Projet système numérique
SOMMAIRE INTRODUCTION........................................................................................................3 LE MATÉRIEL ...........................................................................................................4 I II
SYNOPTIQUE DE LA CARTE .....................................................................................................4 SCHÉMA ET RÉALISATION DE LA CARTE ................................................................................4
LE LOGICIEL.............................................................................................................5 I
LES BIBLIOTHÈQUES C...........................................................................................................5 I.A) I.B) I.C)
La LED ......................................................................................................................... 5 Le bouton-poussoir ....................................................................................................... 5 L'afficheur LCD 2*16 ............. ..................................................................................... 5
I.C.1) I.C.2) I.C.3) I.C.4) I.C.5) I.C.6) I.C.7) I.C.8) I.C.9) I.C.10) I.C.11)
I.D)
Le capteur LM35 .......................................................................................................... 7
I.D.1) I.D.2) I.D.3)
I.E)
L’initialisation générale pour le capteur analogique .....................................................................7 La lecture de la température ...........................................................................................................8 Le programme test ..........................................................................................................................8
Le capteur DS 1620 ............... ....................................................................................... 8
I.E.1) I.E.2) I.E.3) I.E.4) I.E.5) I.E.6)
II
L'écriture d'un octet dans le LCD...................................................................................................5 L'écriture d'une instruction LCD....................................................................................................5 L'écriture d'un caractère vers le LCD.............................................................................................5 L'écriture d'une chaîne de caractères vers le LCD.........................................................................6 Le retour chariot..............................................................................................................................6 L'effacement de l'écran...................................................................................................................6 Le positionnement du curseur en ligne et colonne ........................................................................6 Les temporisations ..........................................................................................................................6 L'attente pour l'instruction suivante ...............................................................................................6 L’initialisation générale du LCD en mode 8 bits...........................................................................7 Le programme test ..........................................................................................................................7
La lecture d’un mot.........................................................................................................................8 L’écriture d’un mot.........................................................................................................................9 L’initialisation générale du capteur numérique .............................................................................9 Le lancement d’une mesure............................................................................................................9 La lecture de la température ...........................................................................................................9 Le programme test ..........................................................................................................................9
I.F)
La bibliothèque additionnelle ..................................................................................... 10
II.A)
La première version.................................................................................................... 10
LE PROGRAMME PRINCIPAL.................................................................................................10 II.A.1) II.A.2) II.A.3) II.A.4) II.A.5) II.A.6) II.A.7) II.A.8)
II.B)
Point d'entrée "main()"..................................................................................................................10 Initialisation des interruptions "irq_init()"...................................................................................10 Initialisation du microcontrôleur " pic_init()"...............................................................................10 Conversion ASCII "temp_to_string( temp )"...............................................................................10 Enregistrements des températures maxi et mini "min_max()" ....................................................10 Remise à zéro des températures maxi et mini "raz_min_max()".................................................11 Traitement et affichage des températures "traitement()".............................................................11 Le programme d'interruption "interrupt isr()".............................................................................12
La version multi-tâches ............ .................................................................................. 13
II.B.1) II.B.2) II.B.3)
Généralités.....................................................................................................................................13 Les différentes tâches....................................................................................................................13 Point d'entrée "main()"..................................................................................................................14
CONCLUSION ..........................................................................................................15 ANNEXES ..................................................................................................................16
Sargos - Zancan
2/16
ENSEIRB
Projet système numérique
____ INTRODUCTION ____ 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, les températures intérieure et extérieure provenant de deux capteurs seront affichées. Lors d'un changement, on affichera les nouvelles valeurs courantes de température. Les valeurs maximales et minimales des températures seront affichées lors d'appuis successifs sur un bouton-poussoir. Si l'appui dépasse quelques secondes alors une initialisation des valeurs maximales et minimales sera effectuée. De plus une LED clignotera régulièrement, il s'agit d'un témoin de bon fonctionnement de l'ensemble.
Sargos - Zancan
3/16
ENSEIRB
Projet système numérique
MATERIEL _____ LE M _____L I
Synoptique de la carte La carte électronique est composée d'un microcontrôleur PIC 16F877, auquel sont associés divers périphériques. Un capteur de température de type analogique LM35 permet de mesurer la température extérieure, un capteur de température de type numérique DS1620 à interface série synchrone est utilisé pour la température intérieure. Un afficheur LCD permet la visualisation des températures et autres informations utiles. Un bouton-poussoir permet, quant à lui, de sélectionner les différentes informations à afficher (températures courantes, températures maxi, températures mini, remise à zéro). Enfin, une LED clignote pour indiquer l'état de fonctionnement du circuit. LM35
DS1620
Vout
RB0
BP sél
/RST
RA1
RB1
RA1
CLK
RA2
RB2
RA1
DQ
RA3
RB4
RA1 LCD
(2x16)
PIC 16F877
RD0 à RD7
RB5
DB0 à DB7
LED
II Schéma et réalisation de la carte La 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 fournis respectivement en Annexe 1 , Annexe 2.1 , Annexe 2.2 , Annexe 3.1, Annexe 3.2 et Annexe 4.
Sargos - Zancan
4/16
ENSEIRB
Projet système numérique
LOGICIEL _____ _____ LE L I
Les bibliothèques C I.A)
La LED
On 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 de configurer le port B correctement, le bit RB5 qui correspond à la commande de la LED doit être configuré en sortie. Si le bit RB5 est à l’état '1' alors la LED s'allumera sinon elle sera éteinte.
I.B)
Le bouton-poussoir
On souhaite faire changer l'état de la LED à chaque appui sur le boutonpoussoir. 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 le bouton-poussoir de sélection qui se trouve sur la broche RB0 du PIC.
I.C)
L'afficheur LCD 2*16
L'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 sur l'écran. On décompose cette fonction principale en sous-programmes pour obtenir une programmation plus claire et réutilisable.
I.C.1) L'écriture d'un octet dans le LCD La 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 de l'afficheur doit être configuré en sortie (PORTDATA). Le port D contient l'octet à transmettre à l'afficheur, octet transmis quand le bit ‘Enable’ du LCD qui correspond à la broche RB4 du PIC passe de l'état '0' à l'état '1' (LCD_STROBE).
I.C.2) L'écriture d'une instruction LCD L'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' instruction sera faite uniquement si le LCD est libre de lire l'instruction, si le LCD est occupé il faut donc attendre et cette attente est effectuée par la fonction lcd_busy() expliquée un peu plus loin.
I.C.3) L'écriture d'un caractère vers le LCD L'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’ du LCD qui correspond à la broche RB2 du PIC doit être à l'état '0' pour pouvoir
Sargos - Zancan
5/16
ENSEIRB
Projet système numérique
écrire dans la RAM. L'écriture de la donnée d'un caractère en code ASCII sera faite aussi uniquement si le LCD est libre.
I.C.4) L'écriture d'une chaîne de caractères vers le LCD On parcourt la chaîne de caractères et tant que le caractère est différent du 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, cette configuration est définie lors de l'initialisation générale du LCD.
I.C.5) Le retour chariot Il s'agit de l'écriture de l'instruction LCD ‘0x02’.
I.C.6) L'effacement de l'écran L'effacement de l'écran correspond à l'instruction LCD ‘0x01’, le temps d'exécution de cette instruction prenant au moins 1.53 ms, une temporisation de 2ms est nécessaire avant l'instruction suivante qui sera ici le retour chariot.
I.C.7) Le positionnement du curseur en ligne et colonne Pour 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 bits correspond à l'adresse de la mémoire à une position donnée sur l'écran. Dans le cas de l'afficheur utilisé, il y a uniquement 2 lignes par 16 caractères qui peuvent ê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 est soit 0 ou 1 et la colonne va de 0 à 15.
I.C.8) Les temporisations La 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ée d'un cycle d'horloge correspond à quatre fois la période du quartz soit 1 µs et l'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. La constante '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 la temporisation de 250 µ s et celle de x seconde est réalisée en faisant x*4 la temporisation de 250 ms.
I.C.9) L'attente pour l'instruction suivante On 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 être exécutée quand l'indicateur est à '0'. L'indicateur est en sortie sur le bit DB7 de l’afficheur et donc en entrée sur le port D du PIC quand le bit 'RS' est à '0' et le bit 'RW' est à '1'. A la fin de cette fonction il faudra donc remettre le bit 'RW' à '0' et le port D du PIC en sortie. Ainsi tant que le bit qui correspond au 'busy flag' est à l’état '1' on
Sargos - Zancan
6/16
ENSEIRB
Projet système numérique
attend, attention il faut refaire un ‘LCD_STROBE’ chaque fois que l'on souhaite lire l'indicateur.
I.C.10) L’initialisation générale du LCD en mode 8 bits La 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 est né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’ peut maintenant être utilisé. L’initialisation du mode d’affichage peut alors commencer. La première instruction ‘0x38’ permet de définir le nombre de lignes, ici 2, et la résolution des caractères, ici 5*7 points. La deuxième instruction ‘0x08’ permet de définir le contrôle de l’affichage, ici l’affichage est 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 les curseurs n’apparaissent pas avec l’instruction ‘0x0C’.Et enfin l’instruction ‘0x06’ permet que le curseur se décale à droite automatiquement et que l’adresse de la mémoire RAM interne s’incrémente de 1.
I.C.11) Le programme test On 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é le curseur sur l’écran et écrit une chaîne de caractères et on a aussi effectué un effacement de l’écran. Ce programme de test fonctionnait correctement, la bibliothèque de l’afficheur est donc validée.
I.D)
Le capteur LM35
Le capteur LM35 est un capteur de température où la tension de sortie est linéairement proportionnelle à la température en Celsius centigrade. Ce capteur ne nécessite pas de calibrage externe pour fournir une précision de ± _°C sur une gamme de température de –55°C à +150°C. Son coefficient est de 10mV/°C et dans notre cas le capteur est alimenté en 0-5V, on ne peut mesurer par conséquent que des températures positives.
I.D.1) L’initialisation générale pour le capteur analogique Le capteur étant analogique un convertisseur analogique - numérique est nécessaire pour traiter et afficher la température. Le convertisseur CAN du PIC doit donc être configuré. La sortie du capteur se trouve à la broche RA0 du PIC qui est donc configurée en entrée analogique. De plus le résultat de la conversion est sur 10 bits (les registres ADRESH et ADRESL) le bit de poids faible se trouvant au bit 0 du registre ADRESL (résultat justifié à droite). Une fréquence d’échantillonnage doit être aussi choisie, elle est égale ici à la fréquence du quartz divisée par 32. On ne souhaite pas non plus utiliser le convertisseur CAN en interruption (‘ADIE’=’0’). Le convertisseur est mis en service quand le bit ‘ADON’ est à l’état ‘1’. Après une temporisation de 250µs, une conversion peut être lancée en mettant à l’état ‘1’ le bit ‘ADGO’. Sargos - Zancan
7/16
ENSEIRB
Projet système numérique
I.D.2) La lecture de la température Afin de lire une température correcte issue du capteur analogique, l’attente de la fin de la conversion du CAN est indispensable. Une conversion est finie quand le bit ‘ADGO’ est repassé à l’état ‘0’. Après la lecture des registres ADRESH et ADREHL, une nouvelle conversion peut alors être lancée. La variable ‘temp’ est un entier qui correspond à la température en 0.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 en compte la limitation du capteur, la tension 5V correspond à une température de 5/(10mV/°C) = 5000 en 0.1°C. Donc pour une valeur x du résultat de la conversion, 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 capteur LM35 une tension de 10mV correspond à une température de 1°C. Par conséquence la précision de la mesure de température est d’environ 0.5°C.
I.D.3) Le programme test On 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 la température issue du capteur. Une fonction supplémentaire est nécessaire pour passer d’un entier qui correspond à la température à une chaîne de caractères pour l’affichage, il s’agit de la fonction « void temp_to_string ( unsigned short temp ) ». Cette fonction transforme un entier en chaîne de caractères ASCII et arrondie le dixième de la température soit à 0 soit à 5. Ce programme de test fonctionnait correctement, la bibliothèque du capteur LM35 est donc validée.
I.E)
Le capteur DS 1620
Le 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 capteur fonctionne avec une interface de trois fils : un signal d’horloge ‘CLK’, un signal de reset ‘RST’ et un signal de donnée ‘DQ’. La transmission des données et des instructions se fait par liaison synchrone série avec le bit de poids faible en premier. Ce capteur peut nous permettre d’avoir une mesure de température environ toutes les secondes.
I.E.1) La lecture d’un mot Une 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 est donc configurée en entrée par rapport au PIC. Une transmission de données doit ê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 x cycles d’horloge. Un cycle d’horloge correspond à un front descendant de l’horloge ‘CLK’ suivi d’un front montant. Quand une transmission entre le capteur et le PIC est terminée le bit ‘RST’ doit repasser à l’état ‘0’. Dans le cas d’une lecture, la broche ‘DQ’ du capteur est en sortie, et la donnée sur cette broche est modifiée lors d’un front descendant de l’horloge et reste valide Sargos - Zancan
8/16
ENSEIRB
Projet système numérique
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ée finale.
I.E.2) L’écriture d’un mot L’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 est donc configurée en sortie par rapport au PIC. Le principe de transmission de lecture 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 valide durant 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 la valeur de ce bit.
I.E.3) L’initialisation générale du capteur numérique Les 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 de configuration 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 8 prochains bits correspondront à la nouvelle valeur du registre de configuration. On écrit donc ensuite dans ce registre ‘0x03’, le capteur est par conséquent dans le mode ‘One-shot’, une nouvelle conversion se fait uniquement si l’é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 transmission expliqué plus haut.
I.E.4) Le lancement d’une mesure Le lancement d’une mesure s’effectue en écrivant sur le capteur l’instruction de 8 bits ‘0xEE’ qui correspond à un début de conversion de température.
I.E.5) La lecture de la température Pour 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 la dernière conversion sur le registre température. La variable ‘temp’ est un entier qui correspond à la température en 0.1°C.
I.E.6) Le programme test On 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 la température issue du capteur numérique. On utilise la même fonction du capteur analogique qui transforme un entier en chaîne de caractères ASCII. Ce programme de test fonctionnait correctement, la bibliothèque du capteur DS1620 est donc validée.
Sargos - Zancan
9/16
ENSEIRB
I.F)
Projet système numérique
La bibliothèque additionnelle
Cette 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 se retrouver à la fois dans le programme d’interruption et dans le programme principal. On a donc recopié les fonctions qui posaient un problème sous un autre nom.
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 " pi c_in it () ", le microcontrôleur entre dans une boucle infinie. Dans cette boucle, le PIC effectue seulement l'appel de la fonction " traitement() " qui est chargée de la gestion 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 le bouton-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'initi alisation des 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ères résultante contient : le chiffre des dizaines de °C , le chiffre des unités, le caractè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 la tempé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 minimale enregistrée précédemment, cette dernière est mise à jour. De même lorsque la température courante est supérieure à la température maximale enregistrée
Sargos - Zancan
10/16
ENSEIRB
Projet système numérique
précédemment, cette dernière est mise à jour. Cet enregistrement s’effectue pour 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 aux valeurs 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 le nombre d'appui sur le bouton-poussoir et donc, l'information que doit afficher l'écran. Ainsi, suivant l'état de " select ", l'écran sera dans les états suivants : Si select = 0 affichage des températures courantes Si select = 1 affichage des températures maximales Si select = 2 affichage des températures minimales Si select = 3 affichage de l'écran "RAZ max, RAZ min" De façon à éviter un clignotement de l'écran, les températures courantes ne sont affichées que si elles ont changé. Toutefois l'écran des températures courantes doit être affiché si un autre écran à été affiché auparavant. La variable 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 ) faire Si ( (température ! température_précédente) ou flag_select_different ) alors flag_select_different = 0 min_max() Modification des max et min température_précédente = température afficher l'écran des températures courantes Fin si si ( 1 ) faire afficher l'écran des températures maximales si ( 2 ) faire afficher l'écran des températures minimales si ( 3 ) faire raz_min_max() afficher l'écran de RAZ des températures Fin selon
Sargos - Zancan
11/16
ENSEIRB
Projet système numérique
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 le bouton-poussoir. Ces deux interruptions exécutent le même programme d'interruption, il convient donc de tester chaque "flag" d'interruption pour dé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 en premier. A chaque interruption timer, les deux températures sont lues et enregistrées dans les variables globales " tempINT" et "tempEXT". Mais l'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'est le cas, un compteur " appui_long" est incrémenté, si ce compteur dépasse la valeur 3, cela veut dire que le bouton-poussoir est resté appuyé pendant 3 secondes, la variable " select " doit donc être mise à 3 pour indiquer à la fonction 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 petite tempo anti-rebond, la variable " select " est incrémentée, elle passera successivement (à chaque appui) à 1, 2 puis reviendra à 0. Voici l'algorithme de la fonction " interrupt isr()" Interruption timer Si ( flag_timer ) alors RAZ flag_timer LED = non LED Si ( BP_appuyé ) alors RAZ flag_BP Si ( appui_long > 3 ) alors Appui > 3 s select = 3 RAZ min max sinon L'utilisateur est en train d'appuyer mais appui < 3 secondes incrémenter appui_long Fin si sinon appui_long = 0 Si ( select = 3 ) alors un RAZ vient d'être effectué select = 0 retour à l'affichage courant flag_select_different = TRUE Fin si Lecture des températures tempINT = lireDS1620 tempEXT = lireLM35 Fin si Fin si Interruption bouton-poussoir Si ( flag_BP ) alors Attendre 12ms tempo anti-rebond Si ( BP_appuyé ) alors Si ( select < 2 ) alors
Sargos - Zancan
12/16
ENSEIRB
Projet système numérique incrémenter select passer à l'affichage suivant sinon select = 0 retour à l'affichage courant L'affichage précédent n'était pas l'affichage des températures courantes flag_select_different = TRUE Fin si RAZ flag_BP Fin si
II.B) La version multi-tâches
II.B.1) Généralités Toutes les librairies utilisées restent bien sûr identiques, les fonctions utilisées dans le programme principal sont aussi identiques. Les changements se situent dans le " main()" et le programme d'interruption. Dans cette version du programme, le bouton-poussoir ne fonctionne pas en interruption, par contre, l'interruption due au débordement du timer1 sera beaucoup plus rapide (1ms) pour permettre une scrutation de l'état du boutonpoussoir. Quatre tâches distinctes ont été définies. A chaque tâche est associés un compteur " task_x_counter " et une constante "TASK_X_COUNTER_MAX ". A chaque interruption (toutes les 1ms), le compteur de chaque tâche est incrémenté ; lorsque le compteur de la tâche " x " atteint la constante "TASK_x_COUNTER_MAX ", la tâche " x" est effectué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 boutonpoussoir 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 un relâ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 en compte comme une multitude d'appuis. " task_sw" permet aussi d'autoriser l'exécution de la tâche " task_raz " lorsqu'il y a eu appui sur le boutonpoussoir.
"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 la fonction "traitement()" (cette dernière est détaillée en II.A.7). Comme cette tâ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()".
Sargos - Zancan
13/16
ENSEIRB
Projet système numérique
"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 de tempé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 est aussi mis à 0 en même temps que " task_raz" est autorisée), elle s'effectuera alors au bout de 2 secondes. Sa seule fonction est de mettre la variable "select " à 3, permettant ainsi d'autoriser l'effacement des températures maxi et 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. Dans cette 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 les variables globales " tempINT" et "tempEXT" (toutes les 1s) et l'appel de la fonction "traitement() " qui est chargée de la gestion de l'affichage (toutes les 250ms).
Sargos - Zancan
14/16
ENSEIRB
Projet système numérique
____ CONCLUSION _____ Ce projet nous a tout d'abord permis de concevoir un système numérique du début à la fin, de la conception électronique jusqu'au logiciel. L'utilisation d'un microcontrôleur de type PIC simplifie grandement l'élaboration d'un tel montage, et notre logiciel répond au cahier des charges. La programmation du logiciel associé était intéressante et nous avons pu nous rendre compte de tout l'intérêt que peut prendre la création de bibliothèques. Les programmes sont ainsi simplifiés et plus lisibles mais surtout, les bibliothèques peuvent être réutilisées très simplement. La version multi-tâches a été en fait très rapide à faire, elle permet d'avoir une approche plus systématique dans la conception du programme et on comprend tout l'intérêt qu'elle apporte lorsque l'on veut ajouter une tâche au microcontrôleur. En effet, il suffit de définir une tâche supplémentaire et de l'implémenter dans l'interruption exactement comme les autres, l'amélioration d'un système devient ainsi très simple et les performances ne sont pas dégradées.
Sargos - Zancan
15/16
ENSEIRB
Projet système numérique
______ ANNEXES ______ 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
Sargos - Zancan
16/16
# Board Station BOM file # date : Friday April 16, 2004; 11:23:47
REFERENCE C1 C2 C3 Cds1 Clcd1 Cpic1 D1 Jds_CLK1 Jds_dq1 Jds_rst1 Jgnd1 Jgnd2 Jgnd3 Jlcd_E1 Jlcd_RS1 Jlcd_RW1 Jlm1 Jvcc1 K1 K2 P1 R1 R2 R3 R4 R5 U1 U2 U3 U4 U5
ITEM_NUMBER
COMPANY PART NO.
12 12 12 12 12 13 9 4 4 4 4 4 5 4 4 4 4 5 3 3 11 10 10 10 10 10 2 1 7 6 8
pn-m-cap_01_2u pn-m-cap_01_2u pn-m-cap_01_2u pn-m-cap_01_2u pn-m-cap_01_2u pn-m-chim_tantale_2u pn-k-led_3.5mm pn-g-cosse_poignard pn-g-cosse_poignard pn-g-cosse_poignard pn-g-cosse_poignard pn-g-cosse_poignard pn-g-douille_4mm_ci pn-g-cosse_poignard pn-g-cosse_poignard pn-g-cosse_poignard pn-g-cosse_poignard pn-g-douille_4mm_ci pn-f-rond_d6_itt pn-f-rond_d6_itt pn-l-trim_vert pn-l-res_01_4u_1/4W pn-l-res_01_4u_1/4W pn-l-res_01_4u_1/4W pn-l-res_01_4u_1/4W pn-l-res_01_4u_1/4W pn-c-lm35 pn-b-ds1620 pn-j-pic16f877 pn-i-quartz_2u pn-k-lcd2x16
GEOMETRY CK05 CK05 CK05 CK05 CK05 c_chim_1 LED_3X5.5MM cnk1x200 cnk1x200 cnk1x200 cnk1x200 cnk1x200 plk1x400 cnk1x200 cnk1x200 cnk1x200 cnk1x200 plk1x400 sw_bp12mm sw_bp12mm trim_v RC05 RC05 RC05 RC05 RC05 to920 DIP8_P DIP40_P hc18 lcd84x43mm
DESCRIPTION CAPACITOR, 0.1u CAPACITOR, 22p CAPACITOR, 22p CAPACITOR, 0.1u CAPACITOR, 0.1u POL_CAPACITOR, 1u LED, RBG1000 conn1 conn1 conn1 conn1 conn1 plot conn1 conn1 conn1 conn1 plot poussoir poussoir pot, POT RESISTOR, 1K RESISTOR, 100K RESISTOR, 10K RESISTOR, 10K RESISTOR, 470 LM35 DS1620 16F877 quartz, 4MHz LCD2x16