Rapport

Transcription

Rapport
2004
SARGOS Mathilde
ZANCAN Adrien
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)
La LED ......................................................................................................................... 5
I.B)
Le bouton-poussoir ....................................................................................................... 5
I.C)
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
LE PROGRAMME PRINCIPAL................................................................................................. 10
II.A)
La première version .................................................................................................... 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
LE MATERIEL _____
_____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
PIC 16F877
RD0 à
RD7
RB5
(2x16)
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
_____ LE LOGICIEL _____
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 "pic_init()", 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'initialisation
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
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
COMPANY PART NO.
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