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,6 +42,7 @@ On peut passer d'un menu à son menu hiérarchiquement supérieur (parent) avec
42 ## Contrôle de la température 42 ## Contrôle de la température
43 43
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. 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 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 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 ## États 48 ## États
@@ -64,7 +65,7 @@ Les accès à la RAM nécessitant plus d'instructions et donc étant plus gourma @@ -64,7 +65,7 @@ Les accès à la RAM nécessitant plus d'instructions et donc étant plus gourma
64 65
65 - **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 - **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 - **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 - **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 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 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
@@ -5,7 +5,7 @@ default: CR.pdf @@ -5,7 +5,7 @@ default: CR.pdf
5 5
6 # COMPTE-RENDU 6 # COMPTE-RENDU
7 7
8 -SOURCES=$(wildcard *.asm) $(wildcard *.txt) 8 +SOURCES=$(wildcard *.txt)
9 9
10 %.pdf: %.html 10 %.pdf: %.html
11 scripts/html2pdf -i "$<" -o "$@" -t "Tutorat de microprocesseurs S6 - TD1 Sujet 8" 11 scripts/html2pdf -i "$<" -o "$@" -t "Tutorat de microprocesseurs S6 - TD1 Sujet 8"
@@ -98,154 +98,301 @@ boucle: @@ -98,154 +98,301 @@ boucle:
98 jmp boucle 98 jmp boucle
99 99
100 ; Fonctions 100 ; Fonctions
101 -afficherHeure: 101 +
  102 +; Affichages
  103 +afficherHorloge:
102 ; Affiche l'heure actuelle 104 ; Affiche l'heure actuelle
103 - temp <- 105 + ; TODO
104 ret 106 ret
105 107
106 -  
107 afficherTemperature: 108 afficherTemperature:
108 ; Considère le registre compteur comme une température et l'affiche 109 ; Considère le registre compteur comme une température et l'affiche
109 d0 <- afficheurLettre[26] ; Sigle ° 110 d0 <- afficheurLettre[26] ; Sigle °
110 d1 <- afficheur[compteur%10] 111 d1 <- afficheur[compteur%10]
111 temp <- compteur + 50 112 temp <- compteur + 50
112 - d2 <- afficheur[(temp/10)%10] 113 + d2 <- afficheur[(temp/10)%10] | 0b10000000
113 d3 <- afficheur[temp/100] 114 d3 <- afficheur[temp/100]
114 ret 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 agir10s: 139 agir10s:
117 ; Initialise une lecture ADC 140 ; Initialise une lecture ADC
118 ; Met à jour l'état de veille (si on est en état veille) 141 ; Met à jour l'état de veille (si on est en état veille)
119 ret 142 ret
120 143
121 -agirHeure: 144 +agirHeur:
122 ; Recharge la température de référence 145 ; Recharge la température de référence
123 ret 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 reti 178 reti
140 179
141 -decrementer:  
142 - si etat <= 1 saut reti 180 +etatVeilleTemp:
  181 + etat <- 0
  182 + compteur <- ADCH
  183 + call afficherTemperature
143 reti 184 reti
144 185
145 etatMenuAssoc: 186 etatMenuAssoc:
146 etat <- 2 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 reti 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 reti 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 etat <- etat + 7 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 reti 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 reti 227 reti
193 -validerTJour: 228 +
  229 +etatParaTJour:
194 etat <- 18 230 etat <- 18
  231 + compteur <- 0 ; TODO Récupérer la température
  232 +etatParaTJourU:
  233 + call afficherTemperature
195 reti 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 reti 244 reti
200 -validerTNuit: 245 +
  246 +etatParaTNuit:
201 etat <- 20 247 etat <- 20
  248 + compteur <- 0 ; TODO Récupérer la température
  249 +etatParaTNuitU:
  250 + call afficherTemperature
202 reti 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 reti 261 reti
207 -validerHorloge: 262 +
  263 +etatMenuHJour:
208 etat <- 22 264 etat <- 22
  265 + d <- "JOUR"
209 reti 266 reti
210 -validerMenuHorloge:  
211 - etat <- etat + 3 267 +
  268 +etatMenuHHeur:
  269 + etat <- 23
  270 + d <- "HEUR"
212 reti 271 reti
213 -validerParaHorloge:  
214 - etat <- etat - 3 272 +
  273 +etatMenuHMinu:
  274 + etat <- 24
  275 + d <- "MINU"
215 reti 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 reti 282 reti
227 -retourVeille:  
228 - etat <- 0 283 +
  284 +etatParaHJourC:
  285 + call boundJour
  286 + ; TODO Sauvegarde
  287 + call afficherJour
229 reti 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 reti 294 reti
233 -retourMenuJAssoc:  
234 - etat <- etat - 7 295 +
  296 +etatParaHHeurC:
  297 + call boundHeur
  298 + ; TODO Sauvegarde
  299 + call afficherHeur
235 reti 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 reti 306 reti
239 -retourMenuHorloge:  
240 - etat <- 21 307 +
  308 +etatParaHMinuC:
  309 + call boundMinu
  310 + ; TODO Sauvegarde
  311 + call afficherMinu
241 reti 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 reti 391 reti
245 392
246 ; Interruption Watchdog 393 ; Interruption Watchdog
247 watchdog: 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 reti 396 reti
250 397
251 ; Interruption ADC 398 ; Interruption ADC