Commit e44a58afff89c28c0c1093b785e193070bcdfd2c

Authored by thubert
2 parents a7b6498c e18f6847

Merge branch 'master' of archives.plil.fr:gbontoux/s6-mp-tutorat

Il est important de faire ce commit parce que c'est comme ça
Showing 4 changed files with 304 additions and 118 deletions   Show diff stats
... ... @@ -37,34 +37,22 @@ Voici la hiérarchie du menu qui sera utilisée pour configurer le thermostat :
37 37 - Heures
38 38 - Minutes
39 39  
40   -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.
  40 +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.
41 41  
42   -## Contrôle de la température
43 42  
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   -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.
  43 +## Contrôle de la température
46 44  
47   -## États
  45 +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 peut se coder sur 8bits car elle contient 256 valeurs.
48 46  
49   -- 0→1 : Veille (Heure, Température)
50   -- 2 : Menu Association mode ↔ Heure de la semaine
51   -- 3→9 : Menu jours (Lundi - Dimanche)
52   -- 10→16 : Paramétrage des jours (Lundi - Dimanche)
53   -- 17 : Menu température du mode jour
54   -- 18 : Paramétrage température du mode jour
55   -- 19 : Menu température du mode nuit
56   -- 20 : Paramétrage température du mode nuit
57   -- 21 : Menu réglage de la date et heure
58   -- 22→24 : Menu réglage du jour / heure / minute
59   -- 25→27 : Paramétrage du jour / heure / minute
  47 +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.
60 48  
61 49 ## Stockage des données
62 50  
63 51 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 stockera donc :
64 52  
65 53 - **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   -- **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
  54 +- **1 registre (dont 4 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 -->
  55 +- **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 nombres de fois qu'il y a eu 2 secondes dans la minute actuelle. Cela permet de simplifier les calculs et d'éviter de faire des opérations sur des entiers de 24 bits.
68 56  
69 57 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 58  
... ... @@ -78,5 +66,31 @@ Il sera de plus configuré pour s&#39;activer sur demande et activera une interrupti
78 66  
79 67 # Algorithme
80 68  
  69 +## Menu
  70 +
  71 +Ce fonctionnement peut être implémenté de deux manières différentes. La première, étant que à chaque élément du menu correspond un emplacement dans le code assembleur, et le programme passe le plus clair de son temps à scruter les boutons. La deuxième, étant que le programme reste sur une instruction sleep, et que les boutons provoquent des interruptions qui gèrent modifient l'affichage et les valeurs nécessaires en fonction du bouton qui a été appuyé et de l'état précédent du menu. D'un point de vue énergétique, la deuxième solution est clairement gagnante. Il faut alors stocker dans quel état est le menu en mémoire. On utilisera pour cela un registre d'état, qui prendra les valeurs suivantes :
  72 +
  73 +- 0→1 : Veille (Heure / Température)
  74 +- 2 : Menu Association mode ↔ Heure de la semaine
  75 +- 3→9 : Menu jours (Lundi - Dimanche)
  76 +- 10→16 : Paramétrage des jours (Lundi - Dimanche)
  77 +- 17 : Menu température du mode jour
  78 +- 18 : Paramétrage température du mode jour
  79 +- 19 : Menu température du mode nuit
  80 +- 20 : Paramétrage température du mode nuit
  81 +- 21 : Menu réglage de la date et heure
  82 +- 22→24 : Menu réglage du jour / heure / minute
  83 +- 25→27 : Paramétrage du jour / heure / minute
  84 +
  85 +On parle de menu quand l'écran affiche le nom de l'élément que l'utilisateur s'apprête à modifier, et de paramétrage lorsque l'utilisateur voit la valeur qu'il est en train de modifier. Pour les paramètrages, un registre nommé `compteur` accompagne le registre `etat`, et permet de stocker la valeur qui est en cours de modification. À chaque appui sur un bouton, une interruption est émise et le code associé effectue une tâche qui varie selon la valeur d'`etat`. L'interruption peut changer certaines variables du système (la température du mode jour par exemple, ou l'heure actuelle), ou bien l'état lui-même.
  86 +
  87 +Pour chaque état on a défini plusieurs fonctions qui sont appelés par les différents boutons. Pour un état donné `Demo`, on aura alors :
  88 +
  89 +- `etatDemoU` qui permet de changer l'affichage pour l'état courant, éventuellement en fonction de la valeur de compteur dans le cas d'un paramètrage. Cette fonction est appelé à la fin de toutes les autres fonctions que l'on définira par la suite.
  90 +- `etatDemo` est l'action éxecutée lorsque l'utilisateur arrive sur l'état : la valeur du registre `etat` est changée, et la valeur de compteur est chargée avec la variable du système correspondante dans le cas d'un paramètrage.
  91 +- `etatDemoC` (paramètrages seulement) est appelé lorsque la valeur de compteur est changée par les boutons Incrementer ou Decrementer. Elle fait appel aux fonctions `boundType` qui permettent de remettre dans les bornes la valeur si elle passe hors de l'intervalle de définition (par exemple si une minute est incrémentée à 60 elle repasse à 0). Ensuite elle sauvegarde dans le bon endroit de la mémoire (registres ou RAM) la valeur de compteur.
  92 +
  93 +Pour certains états, on aura aussi un comportement plus spécifique. Par exemple, lorsqu'on fait Retour depuis les états 10 à 16, la valeur d'`etat` est décrémentée de 7. On créera donc deux fonctions : `etatMenuJours` qui est utilisé quand on arrive d'un niveau parent (on passe donc à l'état 3, Lundi par défaut), et `etatMenuJoursR` qui est utilisé quand on arrive d'un niveau enfant (on passe donc à l'état du menu correspondant au jour que l'on venait de modifier).
  94 +
81 95 ## Pseudo-code
82 96 !include(principal.txt lang=avrpseudo)
... ...
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
... ... @@ -32,8 +32,11 @@
32 32 .def d2 = r20 ; Digit 2
33 33 .def d1 = r20 ; Digit 1
34 34 .def d0 = r20 ; Digit 0 (tout à droite)
35   -.def compteur = r20 ; Utilisé pour différentes choses
36   -.def tempo = r20 ; Utilisé pour différentes choses mais très brièvement
  35 +.def compteur = r20 ; Utilisé pour modifier des valeurs dans le menu
  36 +.def temp = r20 ; Utilisé pour différentes choses mais très brièvement
  37 +.def t2 = r20 ; Jour (3 premiers bits) et Heure (5 derniers bits)
  38 +.def t1 = r20 ; Minutes
  39 +.def t0 = r20 ; Secondes / 2
37 40  
38 41 ; Vecteurs d'interruptions
39 42  
... ... @@ -98,154 +101,323 @@ boucle:
98 101 jmp boucle
99 102  
100 103 ; Fonctions
101   -afficherHeure:
  104 +
  105 +; Affichages
  106 +afficherHorloge:
102 107 ; Affiche l'heure actuelle
103   - temp <-
  108 + temp <- t2 & 0b00011111
  109 + d3 <- 0x00
  110 + si temp > 10 alors d3 <- afficheur[temp/10]
  111 + d2 <- afficheur[temp%10] | 0b10000000
  112 + d1 <- afficheur[t2/10]
  113 + d0 <- afficheur[t2%10]
104 114 ret
105 115  
106   -
107 116 afficherTemperature:
108 117 ; Considère le registre compteur comme une température et l'affiche
109 118 d0 <- afficheurLettre[26] ; Sigle °
110 119 d1 <- afficheur[compteur%10]
111 120 temp <- compteur + 50
112   - d2 <- afficheur[(temp/10)%10]
  121 + d2 <- afficheur[(temp/10)%10] | 0b10000000
113 122 d3 <- afficheur[temp/100]
114 123 ret
115 124  
  125 +afficherHeur:
  126 + ; Considère le registre compteur comme une heure et l'affiche
  127 + d3 <- afficheur[compteur/10]
  128 + d2 <- afficheur[compteur%10] | 0b100000000
  129 + d1 <- 0x00
  130 + d0 <- 0x00
  131 + ret
  132 +
  133 +afficherMinu:
  134 + ; Considère le registre compteur comme une minute et l'affiche
  135 + d3 <- 0x00
  136 + d2 <- 0b10000000
  137 + d1 <- afficheur[compteur/10]
  138 + d0 <- afficheur[compteur%10]
  139 + ret
  140 +
  141 +afficherJour:
  142 + ; Considère le registre compteur comme un jour et l'affiche
  143 + ; TODO
  144 + ret
  145 +
  146 +; Logique
116 147 agir10s:
117 148 ; Initialise une lecture ADC
118 149 ; Met à jour l'état de veille (si on est en état veille)
  150 + ; TODO
119 151 ret
120 152  
121   -agirHeure:
  153 +agirHeur:
122 154 ; Recharge la température de référence
  155 + ; TODO
123 156 ret
124 157  
125   -; Interruption boutons
  158 +; Recadrage
  159 +boundHeur:
  160 + si compteur = 255 alors compteur <- 23
  161 + si compteur >= 24 alors compteur <- 0
  162 + ret
126 163  
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
  164 +boundMinu:
  165 + si compteur = 255 alors compteur <- 59
  166 + si compteur >= 60 alors compteur <- 0
  167 + ret
  168 +
  169 +boundJour:
  170 + si compteur = 255 alors compteur <- 6
  171 + si compteur >= 7 alors compteur <- 0
  172 + ret
  173 +
  174 +boundTemperature:
  175 + si compteur < 5 alors compteur <- 5
  176 + si compteur > 200 alors compteur <- 200
  177 + ret
  178 +
  179 +reti:
139 180 reti
140 181  
141   -decrementer:
142   - si etat <= 1 saut reti
  182 +; États
  183 +; × : Arrivée à l'état par un niveau supérieur
  184 +; R : Arrivée à l'état par un niveau inférieur
  185 +; U : Mise à jour de l'affichage
  186 +; C : Changement de l'état
  187 +
  188 +etatVeilleHeur:
  189 + etat <- 0
  190 + call afficherHorloge
  191 + reti
  192 +
  193 +etatVeilleTemp:
  194 + etat <- 0
  195 + compteur <- ADCH
  196 + call afficherTemperature
143 197 reti
144 198  
145 199 etatMenuAssoc:
146 200 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:
  201 + d <- "ASSO"
167 202 reti
168 203  
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
  204 +etatMenuJours:
  205 + compteur <- 0
  206 +etatMenuJoursU:
  207 + etat <- 3 + compteur
  208 + call afficherJour
181 209 reti
182   - ; TODO Affichages
183   -validerVeille:
184   - etat <- 2
185   -validerAssoc:
186   - etat <- 3
187   -validerAJour:
  210 +
  211 +etatMenuJoursR:
  212 + compteur <- etat - 7 - 3
  213 + jmp etatMenuJoursU
  214 +
  215 +etatMenuJoursC:
  216 + call boundJour
  217 + jmp etatMenuJoursU
  218 +
  219 +etatParaJours:
188 220 etat <- etat + 7
  221 + compteur <- 12
  222 +etatParaJoursU:
  223 + d3 <- afficheur[compteur/10]
  224 + d2 <- afficheur[compteur%10]
  225 + d1 <- 0x00
  226 + d0 <- 0xFF ; TODO Récupérer le mode
189 227 reti
190   -validerParaAJour:
191   - ; TODO
  228 +
  229 +etatParaJoursC:
  230 + call boundHeur
  231 + jmp etatParaJoursU
  232 +
  233 +etatParaJoursS: ; Switch
  234 + ; TODO Sauvegarde
  235 + jmp etatParaJoursU
  236 +
  237 +etatMenuTJour:
  238 + etat <- 17
  239 + d <- "JOUR"
192 240 reti
193   -validerTJour:
  241 +
  242 +etatParaTJour:
194 243 etat <- 18
  244 + compteur <- 0 ; TODO Récupérer la température
  245 +etatParaTJourU:
  246 + call afficherTemperature
195 247 reti
196   -validerParaTJour:
197   - ; TODO
198   - etat <- 17
  248 +
  249 +etatParaTJourC:
  250 + call boundTemperature
  251 + ; TODO Sauvegarde
  252 + jmp etatParaTJourU
  253 +
  254 +etatMenuTNuit:
  255 + etat <- 19
  256 + d <- "NUIT"
199 257 reti
200   -validerTNuit:
  258 +
  259 +etatParaTNuit:
201 260 etat <- 20
  261 + compteur <- 0 ; TODO Récupérer la température
  262 +etatParaTNuitU:
  263 + call afficherTemperature
202 264 reti
203   -validerParaTNuit:
204   - ; TODO
205   - etat <- 19
  265 +
  266 +etatParaTNuitC:
  267 + call boundTemperature
  268 + ; TODO Sauvegarde
  269 + jmp etatParaTNuitU
  270 +
  271 +etatMenuHorloge:
  272 + etat <- 21
  273 + d <- "HORL"
206 274 reti
207   -validerHorloge:
  275 +
  276 +etatMenuHJour:
208 277 etat <- 22
  278 + d <- "JOUR"
209 279 reti
210   -validerMenuHorloge:
211   - etat <- etat + 3
212   - reti
213   -validerParaHorloge:
214   - etat <- etat - 3
  280 +
  281 +etatMenuHHeur:
  282 + etat <- 23
  283 + d <- "HEUR"
215 284 reti
216 285  
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:
  286 +etatMenuHMinu:
  287 + etat <- 24
  288 + d <- "MINU"
226 289 reti
227   -retourVeille:
228   - etat <- 0
  290 +
  291 +etatParaHJour:
  292 + etat <- 25
  293 + compteur <- 0 ; TODO Récupérer le jour
  294 + call afficherJour
229 295 reti
230   -retourMenuAssoc:
231   - etat <- 2
  296 +
  297 +etatParaHJourC:
  298 + call boundJour
  299 + ; TODO Sauvegarde
  300 + call afficherJour
232 301 reti
233   -retourMenuJAssoc:
234   - etat <- etat - 7
  302 +
  303 +etatParaHHeur:
  304 + etat <- 26
  305 + compteur <- 0 ; TODO Récupérer l'heure
  306 + call afficherHeur
235 307 reti
236   -retourMoinsUn:
237   - etat <- etat - 1
  308 +
  309 +etatParaHHeurC:
  310 + call boundHeur
  311 + ; TODO Sauvegarde
  312 + call afficherHeur
238 313 reti
239   -retourMenuHorloge:
240   - etat <- 21
  314 +
  315 +etatParaHMinu:
  316 + etat <- 27
  317 + compteur <- 0 ; TODO Récupérer la minute
  318 + call afficherMinu
241 319 reti
242   -retourMenuMenuHorloge:
243   - etat <- etat - 3
  320 +
  321 +etatParaHMinuC:
  322 + call boundMinu
  323 + ; TODO Sauvegarde
  324 + call afficherMinu
244 325 reti
245 326  
  327 +; Interruption boutons
  328 +
  329 +incrementer:
  330 + inc compteur
  331 + si etat = 0 saut etatVeilleHeur
  332 + si etat = 1 saut etatVeilleTemp
  333 + si etat = 2 saut etatMenuTJour
  334 + si etat <= 9 saut etatMenuJoursC
  335 + si etat <= 16 saut etatParaJoursC
  336 + si etat = 17 saut etatMenuTNuit
  337 + si etat = 18 saut etatParaTJourC
  338 + si etat = 19 saut etatMenuHorloge
  339 + si etat = 20 saut etatParaTNuitC
  340 + si etat = 21 saut etatMenuAssoc
  341 + si etat = 22 saut etatMenuHHeur
  342 + si etat = 23 saut etatMenuHMinu
  343 + si etat = 24 saut etatMenuHJour
  344 + si etat = 25 saut etatParaHJourC
  345 + si etat = 26 saut etatParaHHeurC
  346 + si etat = 27 saut etatParaHMinuC
  347 + reti ; Ne devrait pas arriver, mais permet d'éviter les dégâts
  348 +
  349 +decrementer:
  350 + dec compteur
  351 + si etat = 0 saut etatVeilleHeur
  352 + si etat = 1 saut etatVeilleTemp
  353 + si etat = 2 saut etatMenuHorloge
  354 + si etat <= 9 saut etatMenuJoursC
  355 + si etat <= 16 saut etatParaJoursC
  356 + si etat = 17 saut etatMenuAssoc
  357 + si etat = 18 saut etatParaTJourC
  358 + si etat = 19 saut etatMenuTJour
  359 + si etat = 20 saut etatParaTNuitC
  360 + si etat = 21 saut etatMenuTNuit
  361 + si etat = 22 saut etatMenuHMinu
  362 + si etat = 23 saut etatMenuHJour
  363 + si etat = 24 saut etatMenuHHeur
  364 + si etat = 25 saut etatParaHJourC
  365 + si etat = 26 saut etatParaHHeurC
  366 + si etat = 27 saut etatParaHMinuC
  367 + reti ; Ne devrait pas arriver, mais permet d'éviter les dégâts
  368 +
  369 +valider:
  370 + si etat <= 1 saut etatMenuAssoc
  371 + si etat = 2 saut etatMenuJours
  372 + si etat <= 9 saut etatParaJours
  373 + si etat <= 16 saut etatMenuJoursS
  374 + si etat = 17 saut etatParaTJour
  375 + si etat = 18 saut etatMenuTJour
  376 + si etat = 19 saut etatParaTNuit
  377 + si etat = 20 saut etatMenuTNuit
  378 + si etat = 21 saut etatMenuHJour
  379 + si etat = 22 saut etatParaHJour
  380 + si etat = 23 saut etatMenuHJour
  381 + si etat = 24 saut etatParaHHeur
  382 + si etat = 25 saut etatMenuHHeur
  383 + si etat = 26 saut etatParaHMinu
  384 + si etat = 27 saut etatMenuHMinu
  385 + reti ; Ne devrait pas arriver, mais permet d'éviter les dégâts
  386 +
  387 +retour:
  388 + si etat <= 1 saut reti
  389 + si etat = 2 saut etatVeilleHeur
  390 + si etat <= 9 saut etatMenuAssoc
  391 + si etat <= 16 saut etatMenuJoursR
  392 + si etat = 17 saut etatVeilleHeur
  393 + si etat = 18 saut etatMenuTJour
  394 + si etat = 19 saut etatVeilleHeur
  395 + si etat = 20 saut etatMenuTNuit
  396 + si etat = 21 saut etatVeilleHeur
  397 + si etat <= 24 saut etatMenuHorloge
  398 + si etat = 25 saut etatMenuHJour
  399 + si etat = 26 saut etatMenuHHeur
  400 + si etat = 27 saut etatMenuHMinu
  401 + reti ; Ne devrait pas arriver, mais permet d'éviter les dégâts
  402 +
246 403 ; Interruption Watchdog
247 404 watchdog:
248   - ; Met à jour les registres de temps, active agir10s ou agirHeure si nécessaire
  405 + ; Met à jour les registres de temps, active agir10s ou agirHeur si nécessaire
  406 + inc t0
  407 + si t0 % 5 != 0 saut reti ; Continue si on est sur un multiple de 10 secondes
  408 + call agir10s
  409 + si t0 < 30 saut reti ; Continue si on est sur un multiple de 60 secondes
  410 + t0 <- 0
  411 + inc t1
  412 + si t1 < 60 saut reti ; Continue si on est sur un multiple de 60 minutes
  413 + t1 <- 0
  414 + inc t2
  415 + si t2 & 0b00011111 >= 7 saut watchdogHeure ; Continue si il est minuit
  416 + t2 <- t2 + 0b00100000 ; Jour suivant
  417 + t2 <- t2 & 0b11100000 ; Heure à minuit
  418 + si t2 >= 0b11100000 t2 <- 0b00000000 ; Si on est dimanche soir, on revient à lundi matin
  419 +watchdogHeure:
  420 + call agirHeure
249 421 reti
250 422  
251 423 ; Interruption ADC
... ...
template.html
... ... @@ -36,7 +36,7 @@
36 36 p {
37 37 text-align: justify;
38 38 }
39   - p code {
  39 + ul code, p code {
40 40 border: 1px solid #ccc;
41 41 border-radius: 2px;
42 42 padding: 0px 2px;
... ...