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 12  
13 13 # Architecture matérielle
14 14  
  15 +Voici à quoi ressemble la simulation du système que nous avons recréée :
  16 +
15 17 ![Schéma de la modélisation](montage.svg)
16 18  
  19 +Voyons en détails ses composants :
  20 +
17 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 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 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 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 49 - Veille
37 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 64  
52 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 67 ## Stockage des données
62 68  
63 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 79  
74 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 86 # Configuration des interfaces
77 87  
78 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 100 ## Analogic to Digital Converter (ADC)
85 101  
86 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 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 113  
98 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 116 ## Timer
102 117  
103 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 133  
119 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 138 ### Timer
124 139  
... ... @@ -144,11 +159,11 @@ timer:
144 159  
145 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 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 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 171  
157 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 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 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 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 186 ## Gestion des états
197 187  
... ... @@ -254,7 +244,7 @@ etatParaTJourC:
254 244  
255 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 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 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 274 # Conclusion
286 275  
... ...