Commit f629950c75277afc3dd87ce6a196c5412b84f8b9

Authored by Geoffrey PREUD'HOMME
1 parent 39080e62

Réorganisation de la navigation dans le menu

Showing 3 changed files with 245 additions and 97 deletions   Show diff stats
... ... @@ -42,6 +42,7 @@ On peut passer d'un menu à son menu hiérarchiquement supérieur (parent) avec
42 42 ## Contrôle de la température
43 43  
44 44 Concernant la régulation de la température, il a été prévu que celle-ci se fasse chaque 10 secondes. Puisque l'allumage de la chaudière est asservit 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 correspond peut se coder sur 8bits en 256 valeurs.
  45 +
45 46 La température mesurée (et convertie via le convertisseur ADC), ne doit pas dépasser un intervalle de plus ou moins 0.5°C par rapport à la température de référence. Il s'agit donc d'incémenter et de décrémenter de 5 octets la valeur de référence pour la comparer à la température mesurée. Pour éviter un dépassement lors de l'incrémentation ou de la décrémentation, on oblige l'utilisateur à choisir une température entre 5.5°C et 30.1°C.
46 47  
47 48 ## États
... ... @@ -64,7 +65,7 @@ Les accès à la RAM nécessitant plus d'instructions et donc étant plus gourma
64 65  
65 66 - **4 registres** : les 4 digits de l'afficheur 7 segments en cours d'affichage. Ces informations devant être récupérées 4 fois toutes les quelques millisecondes, on ne calculera leur représentation que lors de leur changement et on les stockera dans ces registres.
66 67 - **1 registre (dont 6 bits inutilisés)** : afficheur 7 segment actuellement en cours d'affichage. Cela permet d'alterner les 4 dans l'ordre. <!-- TODO Voir si c'est pas possible d'utiliser le timer pour stocker ces infos -->
67   -- **3 registres** : Stockage du temps. Le compteur de temps le plus grand mais à la fois diviseur de la période de changement de mode veille et d'une heure sur l'Atmega 2560 est deux secondes. On comptera le temps de la semaine avec cette période de deux secondes. Il y a alors $\frac{7 \times 24 \times 60 \times 60 }{ 2 }$ $=302400$ valeurs possibles pour ce compteur de temps. On a donc besoin de 3 registres $\left( 2^{8 \times 2} = 65536 < 302400 < 16777216 = 2^{8 \times 3} \right)$ pour stocker cette valeur. Afin de simplifier, sur le premier registre on utilisera 3 bits pour stocker le jour de la semaine, 5 bits pour l'heure du jour, on utilisera le deuxième registre pour stocker la minute de l'heure, et le troisième registre pour stocker le
  68 +- **3 registres** : Stockage du temps. Le compteur de temps le plus grand mais à la fois diviseur de la période de changement de mode veille et d'une heure sur l'Atmega 2560 est deux secondes. On comptera le temps de la semaine avec cette période de deux secondes. Il y a alors $\frac{7 \times 24 \times 60 \times 60 }{ 2 }$ $=302400$ valeurs possibles pour ce compteur de temps. On a donc besoin de 3 registres $\left( 2^{8 \times 2} = 65536 < 302400 < 16777216 = 2^{8 \times 3} \right)$ pour stocker cette valeur. Afin de simplifier, sur le premier registre on utilisera 3 bits pour stocker le jour de la semaine, 5 bits pour l'heure du jour, on utilisera le deuxième registre pour stocker la minute de l'heure, et le troisième registre pour stocker le <!-- TODO -->
68 69  
69 70 Les associations de chaque heure de la semaine à son mode (jour/nuit) seront stockées dans la RAM. Bien qu'en théorie nous n'avons besoin que de $\frac{ \text{nb jours/semaine} \times \text{nb heures/jour} \times \text{nb bits pour stocker le mode} }{ \text{nb bits stockables sur une adresse} }$ $=\frac{7 \times 24 \times 1 }{ 8 }$ $=\frac{168}{8}$ $=21$ adresses pour stocker ces informations, on préfèrera utiliser une adresse par heure de la semaine, soit $168$ adresses. Bien que l'on perd en espace mémoire disponible, on garde en rapidité d'éxecution (et donc en énergie), en effet il n'est pas nécessaire d'utiliser des masques pour récupérer la valeur des bits individuels. Dans notre cas le microprocesseur n'abritera aucun autre programme avec qui il devra partager la RAM, et la consommation énergétique ne change pas selon le nombre d'adresses utilisées, il n'y a donc que des avantages à utiliser cette technique.
70 71  
... ...
Makefile
... ... @@ -5,7 +5,7 @@ default: CR.pdf
5 5  
6 6 # COMPTE-RENDU
7 7  
8   -SOURCES=$(wildcard *.asm) $(wildcard *.txt)
  8 +SOURCES=$(wildcard *.txt)
9 9  
10 10 %.pdf: %.html
11 11 scripts/html2pdf -i "$<" -o "$@" -t "Tutorat de microprocesseurs S6 - TD1 Sujet 8"
... ...
principal.txt
... ... @@ -98,154 +98,301 @@ boucle:
98 98 jmp boucle
99 99  
100 100 ; Fonctions
101   -afficherHeure:
  101 +
  102 +; Affichages
  103 +afficherHorloge:
102 104 ; Affiche l'heure actuelle
103   - temp <-
  105 + ; TODO
104 106 ret
105 107  
106   -
107 108 afficherTemperature:
108 109 ; Considère le registre compteur comme une température et l'affiche
109 110 d0 <- afficheurLettre[26] ; Sigle °
110 111 d1 <- afficheur[compteur%10]
111 112 temp <- compteur + 50
112   - d2 <- afficheur[(temp/10)%10]
  113 + d2 <- afficheur[(temp/10)%10] | 0b10000000
113 114 d3 <- afficheur[temp/100]
114 115 ret
115 116  
  117 +afficherHeur:
  118 + ; Considère le registre compteur comme une heure et l'affiche
  119 + d3 <- afficheur[compteur/10]
  120 + d2 <- afficheur[compteur%10] | 0b100000000
  121 + d1 <- 0x00
  122 + d0 <- 0x00
  123 + ret
  124 +
  125 +afficherMinu:
  126 + ; Considère le registre compteur comme une minute et l'affiche
  127 + d3 <- 0x00
  128 + d2 <- 0b10000000
  129 + d1 <- afficheur[compteur/10]
  130 + d0 <- afficheur[compteur%10]
  131 + ret
  132 +
  133 +afficherJour:
  134 + ; Considère le regustre compteur comme un jour et l'affiche
  135 + ; TODO
  136 + ret
  137 +
  138 +; Logique
116 139 agir10s:
117 140 ; Initialise une lecture ADC
118 141 ; Met à jour l'état de veille (si on est en état veille)
119 142 ret
120 143  
121   -agirHeure:
  144 +agirHeur:
122 145 ; Recharge la température de référence
123 146 ret
124 147  
125   -; Interruption boutons
  148 +; Recadrage
  149 +boundHeur:
  150 + si compteur = 255 alors compteur <- 23
  151 + si compteur >= 24 alors compteur <- 0
  152 + ret
126 153  
127   -incrementer:
128   - si etat <= 1 saut reti
129   - si etat = 2 saut etatMenuJour
130   - si etat < 9 saut etatPlusUn
131   - si etat = 9 saut etatLundi
132   - si etat = 17 saut etatMenuNuit
133   - si etat = 18 saut TODO
134   - si etat = 19 saut etatMenuHorloge
135   - si etat = 20 saut TODO
136   - si etat = 21 saut etatMenuAssoc
137   - si etat < 24 saut etatPlusUn
138   - si etat = 24 saut etatMenuHorlogeJour
  154 +boundMinu:
  155 + si compteur = 255 alors compteur <- 59
  156 + si compteur >= 60 alors compteur <- 0
  157 + ret
  158 +
  159 +boundJour:
  160 + si compteur = 255 alors compteur <- 6
  161 + si compteur >= 7 alors compteur <- 0
  162 + ret
  163 +
  164 +boundTemperature:
  165 + si compteur < 5 alors compteur <- 5
  166 + si compteur > 200 alors compteur <- 200
  167 + ret
  168 +
  169 +; États
  170 +; × : Arrivée à l'état par un niveau supérieur
  171 +; R : Arrivée à l'état par un niveau inférieur
  172 +; U : Mise à jour de l'affichage
  173 +; C : Changement de l'état
  174 +
  175 +etatVeilleHeur:
  176 + etat <- 0
  177 + call afficherHorloge
139 178 reti
140 179  
141   -decrementer:
142   - si etat <= 1 saut reti
  180 +etatVeilleTemp:
  181 + etat <- 0
  182 + compteur <- ADCH
  183 + call afficherTemperature
143 184 reti
144 185  
145 186 etatMenuAssoc:
146 187 etat <- 2
147   - reti
148   -etatMenuJour:
149   - etat <- 17
150   - reti
151   -etatMenuNuit:
152   - etat <- 19
153   - reti
154   -etatMenuHorloge
155   - etat <- 21
156   - reti
157   -etatPlusUn:
158   - etat <- etat + 1
159   - reti
160   -etatLundi:
161   - etat <- 3
162   - reti
163   -etatMenuHorlogeJour:
164   - etat <- 22
165   - reti
166   -reti:
  188 + d <- "ASSO"
167 189 reti
168 190  
169   -valider:
170   - si etat <= 1 saut validerVeille
171   - si etat = 2 saut validerAssoc
172   - si etat <= 9 saut validerAJour
173   - si etat <= 16 saut validerParaAJour
174   - si etat = 17 saut validerTJour
175   - si etat = 18 saut validerParaTJour
176   - si etat = 19 saut validerTNuit
177   - si etat = 20 saut validerParaTNuit
178   - si etat = 21 saut validerHorloge
179   - si etat <= 24 saut validerMenuHorloge
180   - si etat <= 27 saut validerParaHorloge
  191 +etatMenuJours:
  192 + compteur <- 0
  193 +etatMenuJoursU:
  194 + etat <- 3 + compteur
  195 + call afficherJour
181 196 reti
182   - ; TODO Affichages
183   -validerVeille:
184   - etat <- 2
185   -validerAssoc:
186   - etat <- 3
187   -validerAJour:
  197 +
  198 +etatMenuJoursR:
  199 + compteur <- etat - 7 - 3
  200 + jmp etatMenuJoursU
  201 +
  202 +etatMenuJoursC:
  203 + call boundJour
  204 + jmp etatMenuJoursU
  205 +
  206 +etatParaJours:
188 207 etat <- etat + 7
  208 + compteur <- 12
  209 +etatParaJoursU:
  210 + d3 <- afficheur[compteur/10]
  211 + d2 <- afficheur[compteur%10]
  212 + d1 <- 0x00
  213 + d0 <- 0xFF ; TODO Récupérer le mode
189 214 reti
190   -validerParaAJour:
191   - ; TODO
  215 +
  216 +etatParaJoursC:
  217 + call boundHeur
  218 + jmp etatParaJoursU
  219 +
  220 +etatParaJoursS: ; Switch
  221 + ; TODO Sauvegarde
  222 + jmp etatParaJoursU
  223 +
  224 +etatMenuTJour:
  225 + etat <- 17
  226 + d <- "JOUR"
192 227 reti
193   -validerTJour:
  228 +
  229 +etatParaTJour:
194 230 etat <- 18
  231 + compteur <- 0 ; TODO Récupérer la température
  232 +etatParaTJourU:
  233 + call afficherTemperature
195 234 reti
196   -validerParaTJour:
197   - ; TODO
198   - etat <- 17
  235 +
  236 +etatParaTJourC:
  237 + call boundTemperature
  238 + ; TODO Sauvegarde
  239 + jmp etatParaTJourU
  240 +
  241 +etatMenuTNuit:
  242 + etat <- 19
  243 + d <- "NUIT"
199 244 reti
200   -validerTNuit:
  245 +
  246 +etatParaTNuit:
201 247 etat <- 20
  248 + compteur <- 0 ; TODO Récupérer la température
  249 +etatParaTNuitU:
  250 + call afficherTemperature
202 251 reti
203   -validerParaTNuit:
204   - ; TODO
205   - etat <- 19
  252 +
  253 +etatParaTNuitC:
  254 + call boundTemperature
  255 + ; TODO Sauvegarde
  256 + jmp etatParaTNuitU
  257 +
  258 +etatMenuHorloge:
  259 + etat <- 21
  260 + d <- "HORL"
206 261 reti
207   -validerHorloge:
  262 +
  263 +etatMenuHJour:
208 264 etat <- 22
  265 + d <- "JOUR"
209 266 reti
210   -validerMenuHorloge:
211   - etat <- etat + 3
  267 +
  268 +etatMenuHHeur:
  269 + etat <- 23
  270 + d <- "HEUR"
212 271 reti
213   -validerParaHorloge:
214   - etat <- etat - 3
  272 +
  273 +etatMenuHMinu:
  274 + etat <- 24
  275 + d <- "MINU"
215 276 reti
216 277  
217   -retour:
218   - si etat <= 1 saut retourRien
219   - si (etat = 2 ou etat = 17 ou etat = 19 ou etat = 21) saut retourVeille
220   - si etat <= 9 saut retourMenuAssoc
221   - si etat <= 16 saut retourMenuJAssoc
222   - si etat <= 21 saut retourMoinsUn
223   - si etat <= 24 saut retourMenuHorloge
224   - si etat <= 27 saut retourMenuMenuHorloge
225   -retourRien:
  278 +etatParaHJour:
  279 + etat <- 25
  280 + compteur <- 0 ; TODO Récupérer le jour
  281 + call afficherJour
226 282 reti
227   -retourVeille:
228   - etat <- 0
  283 +
  284 +etatParaHJourC:
  285 + call boundJour
  286 + ; TODO Sauvegarde
  287 + call afficherJour
229 288 reti
230   -retourMenuAssoc:
231   - etat <- 2
  289 +
  290 +etatParaHHeur:
  291 + etat <- 26
  292 + compteur <- 0 ; TODO Récupérer l'heure
  293 + call afficherHeur
232 294 reti
233   -retourMenuJAssoc:
234   - etat <- etat - 7
  295 +
  296 +etatParaHHeurC:
  297 + call boundHeur
  298 + ; TODO Sauvegarde
  299 + call afficherHeur
235 300 reti
236   -retourMoinsUn:
237   - etat <- etat - 1
  301 +
  302 +etatParaHMinu:
  303 + etat <- 27
  304 + compteur <- 0 ; TODO Récupérer la minute
  305 + call afficherMinu
238 306 reti
239   -retourMenuHorloge:
240   - etat <- 21
  307 +
  308 +etatParaHMinuC:
  309 + call boundMinu
  310 + ; TODO Sauvegarde
  311 + call afficherMinu
241 312 reti
242   -retourMenuMenuHorloge:
243   - etat <- etat - 3
  313 +
  314 +; Interruption boutons
  315 +
  316 +incrementer:
  317 + inc compteur
  318 + si etat = 0 saut etatVeilleHeur
  319 + si etat = 1 saut etatVeilleTemp
  320 + si etat = 2 saut etatMenuTJour
  321 + si etat <= 9 saut etatMenuJoursC
  322 + si etat <= 16 saut etatParaJoursC
  323 + si etat = 17 saut etatMenuTNuit
  324 + si etat = 18 saut etatParaTJourC
  325 + si etat = 19 saut etatMenuHorloge
  326 + si etat = 20 saut etatParaTNuitC
  327 + si etat = 21 saut etatMenuAssoc
  328 + si etat = 22 saut etatMenuHHeur
  329 + si etat = 23 saut etatMenuHMinu
  330 + si etat = 24 saut etatMenuHJour
  331 + si etat = 25 saut etatParaHJourC
  332 + si etat = 26 saut etatParaHHeurC
  333 + si etat = 27 saut etatParaHMinuC
  334 + reti ; Ne devrait pas arriver, mais permet d'éviter les dégâts
  335 +
  336 +decrementer:
  337 + dec compteur
  338 + si etat = 0 saut etatVeilleHeur
  339 + si etat = 1 saut etatVeilleTemp
  340 + si etat = 2 saut etatMenuHorloge
  341 + si etat <= 9 saut etatMenuJoursC
  342 + si etat <= 16 saut etatParaJoursC
  343 + si etat = 17 saut etatMenuAssoc
  344 + si etat = 18 saut etatParaTJourC
  345 + si etat = 19 saut etatMenuTJour
  346 + si etat = 20 saut etatParaTNuitC
  347 + si etat = 21 saut etatMenuTNuit
  348 + si etat = 22 saut etatMenuHMinu
  349 + si etat = 23 saut etatMenuHJour
  350 + si etat = 24 saut etatMenuHHeur
  351 + si etat = 25 saut etatParaHJourC
  352 + si etat = 26 saut etatParaHHeurC
  353 + si etat = 27 saut etatParaHMinuC
  354 + reti ; Ne devrait pas arriver, mais permet d'éviter les dégâts
  355 +
  356 +valider:
  357 + si etat <= 1 saut etatMenuAssoc
  358 + si etat = 2 saut etatMenuJours
  359 + si etat <= 9 saut etatParaJours
  360 + si etat <= 16 saut etatMenuJoursS
  361 + si etat = 17 saut etatParaTJour
  362 + si etat = 18 saut etatMenuTJour
  363 + si etat = 19 saut etatParaTNuit
  364 + si etat = 20 saut etatMenuTNuit
  365 + si etat = 21 saut etatMenuHJour
  366 + si etat = 22 saut etatParaHJour
  367 + si etat = 23 saut etatMenuHJour
  368 + si etat = 24 saut etatParaHHeur
  369 + si etat = 25 saut etatMenuHHeur
  370 + si etat = 26 saut etatParaHMinu
  371 + si etat = 27 saut etatMenuHMinu
  372 + reti ; Ne devrait pas arriver, mais permet d'éviter les dégâts
  373 +
  374 +retour:
  375 + si etat <= 1 saut rien
  376 + si etat = 2 saut etatVeilleHeur
  377 + si etat <= 9 saut etatMenuAssoc
  378 + si etat <= 16 saut etatMenuJoursR
  379 + si etat = 17 saut etatVeilleHeur
  380 + si etat = 18 saut etatMenuTJour
  381 + si etat = 19 saut etatVeilleHeur
  382 + si etat = 20 saut etatMenuTNuit
  383 + si etat = 21 saut etatVeilleHeur
  384 + si etat <= 24 saut etatMenuHorloge
  385 + si etat = 25 saut etatMenuHJour
  386 + si etat = 26 saut etatMenuHHeur
  387 + si etat = 27 saut etatMenuHMinu
  388 + reti ; Ne devrait pas arriver, mais permet d'éviter les dégâts
  389 +
  390 +rien:
244 391 reti
245 392  
246 393 ; Interruption Watchdog
247 394 watchdog:
248   - ; Met à jour les registres de temps, active agir10s ou agirHeure si nécessaire
  395 + ; Met à jour les registres de temps, active agir10s ou agirHeur si nécessaire
249 396 reti
250 397  
251 398 ; Interruption ADC
... ...