Commit 1f570b8bfe09d60caad8de65c936cb6ae5b33abd

Authored by Geoffrey PREUD'HOMME
1 parent e931eb2b

Modification des transitions dûes à la réorganisation du CR

Showing 1 changed file with 41 additions and 52 deletions   Show diff stats
@@ -12,26 +12,39 @@ Enfin, afin de vérifier la validité de notre algorithme et de nos configuratio @@ -12,26 +12,39 @@ Enfin, afin de vérifier la validité de notre algorithme et de nos configuratio
12 12
13 # Architecture matérielle 13 # Architecture matérielle
14 14
  15 +Voici à quoi ressemble la simulation du système que nous avons recréée :
  16 +
15 ![Schéma de la modélisation](montage.svg) 17 ![Schéma de la modélisation](montage.svg)
16 18
  19 +Voyons en détails ses composants :
  20 +
17 ## Entrées 21 ## Entrées
18 22
19 -On utilisera 4 boutons pour pouvoir modifier les paramètres : pour valider, revenir en arrière, incrémenter et décrémenter. Ils sont branchés sur les ports d'interruption INT0 à INT3 respectivement pour éviter une scrutation afin d'économiser de l'énergie. <!-- TODO Pourquoi résistances et capa --> 23 +On utilisera 4 boutons pour pouvoir modifier les paramètres : pour valider, revenir en arrière, incrémenter et décrémenter.
20 24
21 -Le capteur de température est connecté sur le convertisseur analogique-numérique numéro 0 (`ADC0`).  
22 -Pour la simulation, nous avons utilisé un potentiomètre afin de régler la température d'entrée du thermostat. 25 +TODO Pourquoi résistances et capa
  26 +
  27 +Afin de lire la température réelle pour pouvoir faire un asservissement, on utilisera un capteur de température analogique, qui peut lire de 5,0°C à 30,6°C (correspondant à une plage de 0 à 5 V). Pour la simulation, nous avons utilisé un potentiomètre, ce qui nous permet de simuler plus facilement les différents cas.
23 28
24 ## Sorties 29 ## Sorties
25 30
26 -En sortie, nous avons utilisés 4 afficheurs 7-segments, lesquels permetront l'affichage de l'heure, de la température, et du mode de fonctionnement. Les afficheurs devront aussi permettre à l'utilisateur de régler le thermostat en faisant défiler les options de réglages (heure, date, réglage de la température en fonction de l'heure de la journée). Pour la simulation, nous avons utilisé un quadruple affichage 7-segments (et point) de 12 broches, que nous avons branché sur les ports parallèles A (pour la représentation) et C (pour la sélection de l'affichage). 31 +En sortie, nous avons utilisés 4 afficheurs 7-segments, lesquels permetront l'affichage de l'heure, de la température, et du mode de fonctionnement. Les afficheurs permettent aussi à l'utilisateur de régler le thermostat en faisant défiler les options de réglages (heure, date, réglage de la température en fonction de l'heure de la journée). Pour la simulation, nous avons utilisé un quadruple affichage 7-segments (et point) de 12 broches : 8 pour la selection des segments, et 4 pour la selection de l'afficheur.
27 32
28 -Enfin, le signal de contrôle de la chaudière est branchée sur un port parallèle, un non utilisé par l'afficheur 7 segments pour simplifier éviter de faire des opérations d'entrée/sortie avec des masques. Pour la simulation, nous avons utilisé une LED branchée sur le port G (`PG0`). 33 +Enfin, le système ne serait rien sans la chaudière, qui se commande simplement par un signal logique (allumé ou éteint). On la simule avec une simple LED.
29 34
30 # Étude du fonctionnement 35 # Étude du fonctionnement
31 36
  37 +Avant de configurer les interfaces et d'écrire un algorithme, nous devons définir plus en détails comment notre système devra se comporter.
  38 +
  39 +## Contrôle de la température
  40 +
  41 +Concernant la régulation de la température, il a été prévu que celle-ci se fasse chaque 10 secondes (soit en même temps que l'état de veille est censé changer, pour simplifier l'algorithme), car la température n'est pas un paramètre qui change très rapidement. Puisque l'allumage de la chaudière est asservi en température, notre dispositif utilise un capteur de température, lequel fournit une tension variant de 0 à 5V, pour une plage de température allant de 5 à 30.6°C. Pour une précision de 0.1°C, cette plage peut se coder sur 8bits car elle contient 257 valeurs (on fera abstraction de la dernière valeur).
  42 +
  43 +La température mesurée est comparée aux valeurs $\text{température de référence} - 0.5\degree C$ et $\text{température de référence} + 0.5\degree C$ afin de savoir si il faut activer la chaudière ou non. Pour éviter un dépassement de capacité lors de la comparaison, on oblige l'utilisateur à choisir une température entre 5.5°C et 30.0°C.
  44 +
32 ## Menu 45 ## Menu
33 46
34 -Pour pouvoir afficher et modifier les différentes valeurs dont l'utilisateur a accès, on a créé un menu, dont voici la hiérarchie : 47 +Pour pouvoir afficher et modifier les différentes valeurs que l'utilisateur a accès, on créé un menu, dont voici la hiérarchie :
35 48
36 - Veille 49 - Veille
37 - Association mode ↔ heure de la semaine 50 - Association mode ↔ heure de la semaine
@@ -51,13 +64,6 @@ Pour pouvoir afficher et modifier les différentes valeurs dont l&#39;utilisateur a @@ -51,13 +64,6 @@ Pour pouvoir afficher et modifier les différentes valeurs dont l&#39;utilisateur a
51 64
52 On peut passer d'un menu à son menu hiérarchiquement supérieur (parent) avec le bouton Retour. On passe d'un menu à un autre de niveau identique mais de même parent (frère) avec les boutons Incrémenter et Décrémenter. Lorsque l'on appuie sur le bouton Valider, deux choses peuvent se produire : si le menu possède des sous-menus (enfants), il passe au premier enfant, sinon, il permettra l'édition d'une valeur que l'on poura incrémenter ou décrémenter avec les boutons du même nom, et qui seront sauvegardées à l'aide du bouton retour. Même si ce menu peut sembler simple à en voir sa vue d'ensemble, il est beaucoup plus difficile à comprendre lorsqu'il est réduit à 4 afficheurs 7 segments. On oubliera pas de mettre ce genre d'information dans un guide si jamais ce système doit être utilisé par quelqu'un d'autre. 65 On peut passer d'un menu à son menu hiérarchiquement supérieur (parent) avec le bouton Retour. On passe d'un menu à un autre de niveau identique mais de même parent (frère) avec les boutons Incrémenter et Décrémenter. Lorsque l'on appuie sur le bouton Valider, deux choses peuvent se produire : si le menu possède des sous-menus (enfants), il passe au premier enfant, sinon, il permettra l'édition d'une valeur que l'on poura incrémenter ou décrémenter avec les boutons du même nom, et qui seront sauvegardées à l'aide du bouton retour. Même si ce menu peut sembler simple à en voir sa vue d'ensemble, il est beaucoup plus difficile à comprendre lorsqu'il est réduit à 4 afficheurs 7 segments. On oubliera pas de mettre ce genre d'information dans un guide si jamais ce système doit être utilisé par quelqu'un d'autre.
53 66
54 -  
55 -## Contrôle de la température  
56 -  
57 -Concernant la régulation de la température, il a été prévu que celle-ci se fasse chaque 10 secondes, car la température n'est pas un paramètre qui change très rapidement. Puisque l'allumage de la chaudière est asservi en température, notre dispositif utilise un capteur de température, lequel fournit une tension variant de 0 à 5V, pour une plage de température allant de 5 à 30.6°C. Pour une précision de 0.1°C, cette plage peut se coder sur 8bits car elle contient 257 valeurs (on fera abstraction de la dernière valeur).  
58 -  
59 -La température mesurée (et convertie via le convertisseur ADC), est comparée aux valeurs $\text{température de référence} - 0.5\degree C$ et $\text{température de référence} + 0.5\degree C$ afin de savoir si il faut activer la chaudière ou non. Pour éviter un dépassement de capacité lors de la comparaison, on oblige l'utilisateur à choisir une température entre 5.5°C et 30.0°C.  
60 -  
61 ## Stockage des données 67 ## Stockage des données
62 68
63 Les accès à la RAM nécessitant plus d'instructions et donc étant plus gourmands en énergie, on stockera le maximum d'informations dans les registres, de préférences les données étant lues/écrites les plus fréquemment. On y utilisera donc : 69 Les accès à la RAM nécessitant plus d'instructions et donc étant plus gourmands en énergie, on stockera le maximum d'informations dans les registres, de préférences les données étant lues/écrites les plus fréquemment. On y utilisera donc :
@@ -73,19 +79,29 @@ Les associations de chaque heure de la semaine à son mode (jour/nuit) seront st @@ -73,19 +79,29 @@ Les associations de chaque heure de la semaine à son mode (jour/nuit) seront st
73 79
74 Enfin, on stockera les températures des deux modes dans la RAM également, car on y accède que toutes les heures (ou lors de leur modification), le registre `reference` agissant comme intermédiaire. 80 Enfin, on stockera les températures des deux modes dans la RAM également, car on y accède que toutes les heures (ou lors de leur modification), le registre `reference` agissant comme intermédiaire.
75 81
  82 +## Économies d'énergie
  83 +
  84 +On s'est donné comme objectif d'économiser un maximum d'énergie. Pour cela, on préfèrera utiliser des interruptions plutôt que des scrutations, et ne déclencher les lectures que lorsque nécessaire. On n'activera aucune interface si on en a pas besoin.
  85 +
76 # Configuration des interfaces 86 # Configuration des interfaces
77 87
78 ## Interruptions externes 88 ## Interruptions externes
79 89
80 -Nos boutons sont branchés sur les ports d'interruptions `INT0` à `INT3`. On active donc les interruption au niveau du micro-contrôleur avec la directive `SEI` (qui servira aussi pour les autres interfaces mais on ne le rappelera pas). Ensuite, on active les interruptions sur front montant 90 +Pour éviter des scrutations, nos boutons sont branchés sur les ports d'interruptions `INT0` à `INT3`. On active donc les interruption au niveau du micro-contrôleur avec la directive `SEI` (qui servira aussi pour les autres interfaces mais on ne le rappelera pas). Ensuite, on active les interruptions sur front montant
  91 +
  92 +## Ports parallèles
  93 +
  94 +TODO sur quoi qu'on branche les 7 segments
81 95
82 -TODO Blabla rebond etc. 96 +↓↓↓ TODO réintégrer
  97 +
  98 +Enfin, le signal de contrôle de la chaudière est branchée sur un port parallèle, un non utilisé par l'afficheur 7 segments pour simplifier éviter de faire des opérations d'entrée/sortie avec des masques. Pour la simulation, nous avons utilisé une LED branchée sur le port G (`PG0`).
83 99
84 ## Analogic to Digital Converter (ADC) 100 ## Analogic to Digital Converter (ADC)
85 101
86 Le thermostat est branché sur l'entrée analgique `ADC0`. Pour éviter d'utiliser de l'énergie inutilement, on désactivera les autres convertisseur analogique-numérique avec les directives `DIR0` et `DIR2`. 102 Le thermostat est branché sur l'entrée analgique `ADC0`. Pour éviter d'utiliser de l'énergie inutilement, on désactivera les autres convertisseur analogique-numérique avec les directives `DIR0` et `DIR2`.
87 103
88 -On configurera les registres concernant l'ADC de manière à mettre les 8 bits de points forts sur un seul registre (`ADCH`). En effet, les valeurs de témpératures allant de 5,0° à 30,6°, en choisissant une précision de 0,1° on obient 256 valeurs possibles, ce qui peut se stocker sur un seul régistre. Une précision supplémentaire ne semble pas nécessaire. 104 +On configurera les registres concernant l'ADC de manière à mettre les 8 bits de points forts sur un seul registre (`ADCH`). En effet, les valeurs de témpératures allant de 5,0° à 30,6°, en choisissant une précision de 0,1° on obient 256 valeurs possibles, ce qui peut se stocker sur un seul régistre. Une précision supplémentaire ne semble pas nécessaire et de plus compliquée à gérer.
89 105
90 Il sera configuré pour s'activer sur demande, ici toutes les dix secondes. En effet, la température étant un paramètre variant très lentemenent, il n'est pas nécessaire et de plus énergivore de la lire continuellement. Enfin, il sera de plus configuré pour déclencher une interruption dès que la conversion est terminée afin d'éviter toute scrutation. 106 Il sera configuré pour s'activer sur demande, ici toutes les dix secondes. En effet, la température étant un paramètre variant très lentemenent, il n'est pas nécessaire et de plus énergivore de la lire continuellement. Enfin, il sera de plus configuré pour déclencher une interruption dès que la conversion est terminée afin d'éviter toute scrutation.
91 107
@@ -97,7 +113,6 @@ TODO toutes les deux secondes, déclenche une interruption, nécessite d&#39;être u @@ -97,7 +113,6 @@ TODO toutes les deux secondes, déclenche une interruption, nécessite d&#39;être u
97 113
98 On s'est rendu compte que la fréquence d'appel était ~100× plus élevé que ce qui devrait être. N'ayant pas réussi à corriger ce comportement (que l'on a pu aussi constater en TP), nous avons dû trouver un autre moyen de procéder. 114 On s'est rendu compte que la fréquence d'appel était ~100× plus élevé que ce qui devrait être. N'ayant pas réussi à corriger ce comportement (que l'on a pu aussi constater en TP), nous avons dû trouver un autre moyen de procéder.
99 115
100 -  
101 ## Timer 116 ## Timer
102 117
103 TODO 4 ms (détailler le calcul, copier ce qu'il y a dans la partie algo), pas trop long pour que l'oeil puisse distinguer (persistence rétinienne, tout ça) ni trop court pour pas consommer d'énergie. 118 TODO 4 ms (détailler le calcul, copier ce qu'il y a dans la partie algo), pas trop long pour que l'oeil puisse distinguer (persistence rétinienne, tout ça) ni trop court pour pas consommer d'énergie.
@@ -118,7 +133,7 @@ L&#39;algorithme étant assez lourd et redondant, on ne présentera que les principe @@ -118,7 +133,7 @@ L&#39;algorithme étant assez lourd et redondant, on ne présentera que les principe
118 133
119 ## Interruptions 134 ## Interruptions
120 135
121 -Les fonctions que nous avons vues jusqu'à lors sont appelées uniquement par les interruptions, étant donné qu'il n'y a pas de programme principal. Voici les différentes interruptions qui sont déclenchées. 136 +Voici les différentes fonctions qui sont appelées par le micro-contrôleur lui-même, et une vue d'ensemble de ce qu'elles sont censées faire.
122 137
123 ### Timer 138 ### Timer
124 139
@@ -144,11 +159,11 @@ timer: @@ -144,11 +159,11 @@ timer:
144 159
145 ### Watchdog 160 ### Watchdog
146 161
147 -Le watchdog ne fonctionnant pas, nous avons utilisé le timer, et un registre supplémentaire, `tt`, qui est incrémenté à chacune de ses interruptions. Le timer ayant une fréquence exacte de $\frac{16 MHz}{256^2}=244.140625 Hz$, dès que `tt` a depassé `244` on appelle donc `agir1s`. 162 +Le watchdog ne fonctionnant pas, nous avons donc étendu l'interruption du timer pour pouvoir compter les secondes. Pour cela, un utilise un registre supplémentaire, `tt`, qui est incrémenté à chacune des interruptions du timer. Sa fréquence exacte étant de de $\frac{16 MHz}{256^2}=244.140625 Hz$, dès que `tt` a depassé `244` on appelle donc la fonction qui était censée être appelée par le watchdog, `agir1s` qui gère les éxecute les fonctions dépendant du temps.
148 163
149 D'un point de vue énergétique, cette approche est beacoup moins efficace car elle rajoute des instructions supplémentaires à l'interruption du timer, qui est la fonction « critique » du système car appelée 244 fois par seconde. 164 D'un point de vue énergétique, cette approche est beacoup moins efficace car elle rajoute des instructions supplémentaires à l'interruption du timer, qui est la fonction « critique » du système car appelée 244 fois par seconde.
150 165
151 -### ADC 166 +### Convertisseur analogique→numérique
152 167
153 Cette interruption est déclenchée à chaque fois qu'une conversion analogique→numérique est terminée. Elle est donc déclenchée à peu près toutes les 10 secondes car les conversions ne sont demandées que depuis la fonction `agir10s`. Elle s'occupe d'activer ou de désactiver la chaudière en fonction de la température récupérée lors de la conversion, en se basant sur le registre `reference`. Par exemple, la chaudière est éteinte si la température dépasse de plus de 0,5 degrés la température de référence. Dans le code, on vérifiera si `ADCH > reference + 5`, car 0,1°C correspond à une unité. On remarque que l'on peut obtenir un dépassement si jamais `reference > 250`, ce qui n'est pas censé arriver car on ne propose à l'utilisateur que de choisir une température entre 5,5 et 30,0°C, `reference` est donc compris entre 5 et 250. Si jamais la température est comprise dans l'intervalle, le port G conserve l'état de la chaudière actuel. 168 Cette interruption est déclenchée à chaque fois qu'une conversion analogique→numérique est terminée. Elle est donc déclenchée à peu près toutes les 10 secondes car les conversions ne sont demandées que depuis la fonction `agir10s`. Elle s'occupe d'activer ou de désactiver la chaudière en fonction de la température récupérée lors de la conversion, en se basant sur le registre `reference`. Par exemple, la chaudière est éteinte si la température dépasse de plus de 0,5 degrés la température de référence. Dans le code, on vérifiera si `ADCH > reference + 5`, car 0,1°C correspond à une unité. On remarque que l'on peut obtenir un dépassement si jamais `reference > 250`, ce qui n'est pas censé arriver car on ne propose à l'utilisateur que de choisir une température entre 5,5 et 30,0°C, `reference` est donc compris entre 5 et 250. Si jamais la température est comprise dans l'intervalle, le port G conserve l'état de la chaudière actuel.
154 169
@@ -156,42 +171,17 @@ Cette interruption est déclenchée à chaque fois qu&#39;une conversion analogiqueâ @@ -156,42 +171,17 @@ Cette interruption est déclenchée à chaque fois qu&#39;une conversion analogiqueâ
156 171
157 ### Boutons 172 ### Boutons
158 173
159 -À chaque bouton est associé une interruption, et chacun d'entre elle appelle une fonction d'état selon la valeur actuelle de compteur. Par exemple, si l'état actuel est `veilleHeure` et que le bouton Valider est pressé, la fonction `etatMenuAssoc` est appelée. Pour les boutons Incrémenter et Décrémenter, le registre `compteur` est incrémenté ou décrémenté respectivement avant d'appeler la fonction d'état.  
160 -  
161 -Voici par exemple la fonction appelée par le bouton Incrémenter :  
162 -  
163 -```avrasmplus  
164 -incrementer:  
165 - inc compteur  
166 - si etat = 0 saut etatVeilleTemp  
167 - si etat = 1 saut etatVeilleHeur  
168 - si etat = 2 saut etatMenuTJour  
169 - si etat <= 9 saut etatMenuJoursC  
170 - si etat <= 16 saut etatParaJoursC  
171 - si etat = 17 saut etatMenuTNuit  
172 - si etat = 18 saut etatParaTJourC  
173 - si etat = 19 saut etatMenuHorloge  
174 - si etat = 20 saut etatParaTNuitC  
175 - si etat = 21 saut etatMenuAssoc  
176 - si etat = 22 saut etatMenuHHeur  
177 - si etat = 23 saut etatMenuHMinu  
178 - si etat = 24 saut etatMenuHJour  
179 - si etat = 25 saut etatParaHJourC  
180 - si etat = 26 saut etatParaHHeurC  
181 - si etat = 27 saut etatParaHMinuC  
182 - reti ; Ne devrait pas arriver, mais permet d'éviter les dégâts  
183 -``` 174 +À chaque bouton est associé une interruption, et chacune modifie l'affichage, les registres `etat` et/ou `compteur`, et éventuellement les valeurs de fonctionnement du système (heure actuelle, température des modes...), et ce en fonction des registres `etat` et `compteur` précédents.
184 175
185 ## Fonction d'agissement 176 ## Fonction d'agissement
186 177
187 -Ces fonctions permettent de réaliser des actions en fonction du temps. 178 +Certaines actions sont prises selon une base horaire. Elles sont déclenchées par l'interruption du timer (normalement celle du watchdog), lorsque leur intervalle de temps coïncide.
188 179
189 -- `agir1s` : déclenchée toutes les secondes, elle met à jour les registres de temps, et appelle les fonctions `agir10s` et `agirHeure` 180 +- `agir1s` : déclenchée toutes les secondes, elle met à jour les registres de temps, et appelle les fonctions `agir10s` et `agirHeure` si besoin
190 - `agir10s` : déclenchée toutes les dix secondes, elle change l'état de veille (affichage de l'heure ou température) si l'appareil est en veille. Dans tous les cas, elle déclenche une conversion analogique numérique pour lire le capteur de température. 181 - `agir10s` : déclenchée toutes les dix secondes, elle change l'état de veille (affichage de l'heure ou température) si l'appareil est en veille. Dans tous les cas, elle déclenche une conversion analogique numérique pour lire le capteur de température.
191 - `agirHeure` : elle recharge depuis la RAM le mode actuel, et met à jour le registre `reference` contenant la température à utiliser. 182 - `agirHeure` : elle recharge depuis la RAM le mode actuel, et met à jour le registre `reference` contenant la température à utiliser.
192 183
193 -*Note : On a laissé la possibilité à l'utilisateur de changer de mode de veille avec les boutons Incrémenter / Décrémenter, mais `agir10s` ne prend pas en compte ce changement. Il est donc possible que l'utilisateur change d'état de veille et que le système revienne juste après à l'état précédent.*  
194 - 184 +*Note : On a laissé la possibilité à l'utilisateur de changer de mode de veille avec les boutons Incrémenter / Décrémenter, mais `agir10s` ne prend pas en compte les modifications de l'utilisateur. Il est donc possible que l'utilisateur change d'état de veille et que le système revienne juste après à l'état précédent.*
195 185
196 ## Gestion des états 186 ## Gestion des états
197 187
@@ -254,7 +244,7 @@ etatParaTJourC: @@ -254,7 +244,7 @@ etatParaTJourC:
254 244
255 ## Fonctions usuelles 245 ## Fonctions usuelles
256 246
257 -Pour clarifier le code et pouvoir le réutiliser, on définit un certain nombre de fonctions. Généralement, elles utilisent la valeur de compteur dans son contexte, et la modifie si besoin. 247 +Pour clarifier le code et pouvoir le réutiliser, on définit un certain nombre de fonctions usuelles. Généralement, elles utilisent la valeur de compteur dans son contexte, et la modifie si besoin.
258 248
259 On y trouve les fonctions d'affichage, qui considèrent `compteur` comme une certaine donnée (un jour, une température, une minute) et l'affiche dans un format approprié. Par exemple, voici la fonction `afficherTemperature`, utiliser dans l'état de veille et pour paramétrer les températures des deux modes : 249 On y trouve les fonctions d'affichage, qui considèrent `compteur` comme une certaine donnée (un jour, une température, une minute) et l'affiche dans un format approprié. Par exemple, voici la fonction `afficherTemperature`, utiliser dans l'état de veille et pour paramétrer les températures des deux modes :
260 250
@@ -279,8 +269,7 @@ boundHeur: @@ -279,8 +269,7 @@ boundHeur:
279 ret 269 ret
280 ``` 270 ```
281 271
282 -On utilise le fait qu'une décrémentation depuis la valeur 0 effectue un dépassement et remet le registre à 255. On aurait pas pu utiliser le flag indiquant qu'un dépassement a eu lieu car l'incrémentation / la décrémentation de compteur s'effectue beaucoup plus tôt que la remise en borne. Pour faciliter la vie de l'utilisateur, lorsque l'on dépasse une des deux bornes, la valeur prend la borne opposée.  
283 - 272 +On utilise le fait qu'une décrémentation depuis la valeur 0 effectue un dépassement et remet le registre à 255. Nous ne pouvons pas utiliser le flag indiquant qu'un dépassement a eu lieu car l'incrémentation / la décrémentation de compteur s'effectue beaucoup plus tôt que la remise en borne. Pour faciliter la vie de l'utilisateur, lorsque l'on dépasse une des deux bornes, la valeur prend la borne opposée.
284 273
285 # Conclusion 274 # Conclusion
286 275