Commit f85fc94724def7f415e349d5b248c489b9f089b9

Authored by Geoffrey PREUD'HOMME
1 parent b6312db0

Avancement sur le compte-rendu

Showing 4 changed files with 140 additions and 46 deletions   Show diff stats
@@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
5 5
6 Le projet consiste à réaliser un thermostat pour la commande du chauffage d'une maison individuelle. Le dispositif devra d'abord afficher alternativement la température et l'heure chaque 10s, sur des afficheurs 7-segments. Notre thermostat devra aussi permettre le réglage de la température pour chaque heure de la journée, selon deux modes : jour et nuit, dont les températures seront réglé par l'utilisateur. Enfin, la commande permettant l'allumage de la chaudière se fera en fonction de la température mesurée. Si celle-ci est 0.5°C inférieure à la consigne fixée, la chaudière s'allume. Si la température mesurée dépasse la consigne de 0.5°C, la chaudière s'eteint. 6 Le projet consiste à réaliser un thermostat pour la commande du chauffage d'une maison individuelle. Le dispositif devra d'abord afficher alternativement la température et l'heure chaque 10s, sur des afficheurs 7-segments. Notre thermostat devra aussi permettre le réglage de la température pour chaque heure de la journée, selon deux modes : jour et nuit, dont les températures seront réglé par l'utilisateur. Enfin, la commande permettant l'allumage de la chaudière se fera en fonction de la température mesurée. Si celle-ci est 0.5°C inférieure à la consigne fixée, la chaudière s'allume. Si la température mesurée dépasse la consigne de 0.5°C, la chaudière s'eteint.
7 7
8 -De plus nous nous sommes fixés un objectif supplémentaire afin de faire programme qui consomme un minimum d'énergie. Bien que ce genre de système est branché en permanence au secteur et la consommation du micro-contrôleur est négligeable par rapport à celle de la chaudière, on considère que programmer de manière optimisée est une bonne pratique à adopter. 8 +De plus nous nous sommes fixés un objectif supplémentaire afin de faire programme qui consomme un minimum d'énergie. Bien que ce genre de système est branché en permanence au secteur et la consommation du micro-contrôleur est négligeable par rapport à celle de la chaudière, on considère que programmer de manière optimisée est une bonne pratique à adopter. On s'arrêtera dans cet objectif à l'optimisation des instructions assembleurs.
9 9
10 Enfin, afin de vérifier la validité de notre algorithme et de nos configurations, nous avons recréé une simulation du système avec une Arduino Mega 2560, qui est la carte que nous avons utilisé pour les TP de microprocesseurs, et que nous avons programmé en utilisant les mêmes outils utilisés pendant lesdits TP. 10 Enfin, afin de vérifier la validité de notre algorithme et de nos configurations, nous avons recréé une simulation du système avec une Arduino Mega 2560, qui est la carte que nous avons utilisé pour les TP de microprocesseurs, et que nous avons programmé en utilisant les mêmes outils utilisés pendant lesdits TP.
11 11
@@ -16,20 +16,22 @@ Enfin, afin de vérifier la validité de notre algorithme et de nos configuratio @@ -16,20 +16,22 @@ Enfin, afin de vérifier la validité de notre algorithme et de nos configuratio
16 16
17 ## Entrées 17 ## Entrées
18 18
19 -On utilisera 4 boutons : 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. 19 +On utilisera 4 boutons : 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 -->
20 20
21 -Le capteur de température est connecté sur le convertisseur analogique-numérique numéro 8 (`ADC8`).  
22 -Concernant la réalisation de notre composant, nous avons prévu d'utiliser un potentiomètre afin de régler la température d'entrée du thermostat. 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.
23 23
24 ## Sorties 24 ## Sorties
25 25
26 -En sortie, nous avons prévu 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). 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).
  27 +
  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`).
27 29
28 # Étude du fonctionnement 30 # Étude du fonctionnement
29 31
30 ## Menu 32 ## Menu
31 33
32 -Voici la hiérarchie du menu qui sera utilisée pour configurer le thermostat : 34 +Pour pouvoir afficher et modifier les différentes valeurs dont l'utilisateur a accès, on a créé un menu, dont voici sa hiérarchie :
33 35
34 - Veille 36 - Veille
35 - Association mode ↔ heure de la semaine 37 - Association mode ↔ heure de la semaine
@@ -52,17 +54,19 @@ On peut passer d&#39;un menu à son menu hiérarchiquement supérieur (parent) avec @@ -52,17 +54,19 @@ On peut passer d&#39;un menu à son menu hiérarchiquement supérieur (parent) avec
52 54
53 ## Contrôle de la température 55 ## Contrôle de la température
54 56
55 -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. 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).
56 58
57 -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. 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.
58 60
59 ## Stockage des données 61 ## Stockage des données
60 62
61 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 : 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 stockera donc :
62 64
63 - **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. 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.
64 -- **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 -->  
65 -- **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. 66 +- **1 registre (dont 4 bits inutilisés)** : afficheur 7 segment actuellement en cours d'affichage. Cela permet d'alterner les 4 dans l'ordre. Pour économiser un registre d'utilisation générale, on utilisera le fait que le port C est considéré comme un registre et sauvegarde les états qui lui sont envoyés.
  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 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 *(on aurait pu utiliser un registre supplémentaire pour stocker le jour de la semaine et éviter des opérations, mais on voulait s'amuser avec des masques et des divisions)*.
  68 +
  69 +TODO Il manque des registres
66 70
67 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. 71 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.
68 72
@@ -82,16 +86,28 @@ On configurera les registres concernant l&#39;ADC de manière à mettre les 8 bits @@ -82,16 +86,28 @@ On configurera les registres concernant l&#39;ADC de manière à mettre les 8 bits
82 86
83 Il sera de plus configuré pour s'activer sur demande et activera une interruption dès que la conversion est terminée afin d'éviter toute scrutation. 87 Il sera de plus configuré pour s'activer sur demande et activera une interruption dès que la conversion est terminée afin d'éviter toute scrutation.
84 88
85 -## Timer 89 +## Watchdog
86 90
87 TODO 91 TODO
88 92
89 -## Watchdog 93 +## Timer
90 94
91 TODO 95 TODO
92 96
93 # Algorithme 97 # Algorithme
94 98
  99 +Voici la fonction principale du programme :
  100 +
  101 +```avrasmplus
  102 +boucle:
  103 + sleep
  104 + jmp boucle
  105 +```
  106 +
  107 +En effet, nous avons dit précédemment que pour économiser l'énergie, toutes les actions seraient gérées par des interruptions, le reste du temps le micro-contrôleur ne fait que dormir. On peut se le permettre car les actions sont très courtes, et il n'y a donc peu de risque de conflit au cas où deux interruptions se déclenchent en même temps.
  108 +
  109 +L'algorithme étant assez imposant (~620 lignes) et redondant, on ne présentera que les principes clefs et quelques exemples d'astuces utilisés. Le code complet (et les outils utilisés pour l'ensemble du projet) sont disponibles à l'adresse suivante : <https://archives.plil.fr/gbontoux/s6-mp-tutorat> (`Fies` > `principal.txt`).
  110 +
95 ## Menu 111 ## Menu
96 112
97 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 : 113 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 :
@@ -118,5 +134,86 @@ Pour chaque état on a défini plusieurs fonctions qui sont appelés par les dif @@ -118,5 +134,86 @@ Pour chaque état on a défini plusieurs fonctions qui sont appelés par les dif
118 134
119 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). 135 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).
120 136
121 -## Pseudo-code  
122 -!include(principal.txt lang=avrpseudo) 137 +Voici un exemple, pour le menu et le paramètrage de la sélection de la température du mode jour :
  138 +
  139 +```avrasmplus
  140 +; Appelé depuis l'état 2 après un appui sur le bouton Incrémenter
  141 +; 19 Décrémenter
  142 +; 18 Valider
  143 +; 18 Retour
  144 +etatMenuTJour:
  145 + etat <- 17
  146 + d3 <- 0x3c ; "JOUR"
  147 + d2 <- 0x5c
  148 + d1 <- 0x1c
  149 + d0 <- 0x44
  150 + reti
  151 +
  152 +; Appelé depuis l'état 17 après un appui sur Valider
  153 +etatParaTJour:
  154 + etat <- 18
  155 + compteur <- tempJour ; Lecture depuis la RAM
  156 +etatParaTJourU:
  157 + call afficherTemperature
  158 + reti
  159 +
  160 +; Appelé depuis l'état 18 après un appui sur Incrementer ou Decrementer
  161 +etatParaTJourC:
  162 + call boundTemperature ; Remet la température dans les bornes
  163 + tempJour <- compteur ; Écriture vers la RAM
  164 + call agirHeure ; Au cas où on change le mode de l'heure actuelle, on recharge la température de référence
  165 + jmp etatParaTJourU
  166 +```
  167 +
  168 +*On remarque l'utilisation de `reti` et non de `ret`. Étant donné que ces fonctions sont les dernières appelées dans les interruptions des boutons, on fait de la sorte pour simplifier le code.*
  169 +
  170 +## Fonctions usuelles
  171 +
  172 +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.
  173 +
  174 +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 :
  175 +
  176 +```avrasmplus
  177 +afficherTemperature:
  178 + ; Considère le registre compteur comme une température et l'affiche
  179 + d0 <- 0x63 ; Sigle degré
  180 + d1 <- afficheur@ROM[compteur%10] ; Décimale
  181 + temp <- compteur / 10 + 5 ; On stocke temporairement la partie entière pour simplifier
  182 + d2 <- afficheur@ROM[temp%10] | 0b10000000 ; Chiffre des unités, auquel on ajoute le point
  183 + d3 <- 0x00 ; On affiche le chiffre des dizaines si la température est > 10
  184 + si temp > 10 alors d3 <- afficheur@ROM[temp/10]
  185 + ret
  186 +```
  187 +
  188 +Les boutons d'incrémentation et de décrémentation changent la valeur de `compteur` indépendamment du type de données qu'il contient. Il faut donc remettre à posteriori les valeurs dans leur intervalle de définition. Voici un exemple pour utilisé pour la modification de l'heure actuelle :
  189 +
  190 +```avrasmplus
  191 +boundHeur:
  192 + si compteur = 255 alors compteur <- 23
  193 + si compteur >= 24 alors compteur <- 0
  194 + ret
  195 +```
  196 +
  197 +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.
  198 +
  199 +## Fonction d'agissement
  200 +
  201 +TODO
  202 +
  203 +## Interruptions
  204 +
  205 +TODO
  206 +
  207 +## Timer
  208 +
  209 +## Watchdog
  210 +
  211 +## ADC
  212 +
  213 +## Boutons
  214 +
  215 +# Conclusion
  216 +
  217 +Pour ce projet de thermostat, nous avons réalisé son architecture matérielle, son algorithme, et même réussi à en faire une simulation sur du matériel réel, ce qui a nécessite l'écriture de l'algorithme complet. Bien qu'un sujet similaire était proposé dans un des TP, on s'est rendu compte que l'ajout de certaines fonctions paraissant anodines (telles que la gestion du temps, ou un menu) nécessitent un gros travail pour tout coordonner. La réalisation de la simulation, bien que non nécessaire, a été utile pour se rendre compte que certains chemins envisagés au débuts n'étaient pas réalisables, et a permis de pouvoir tester notre algorithme. Au final
  218 +
  219 +
1 -# Tutorat de microprocesseurs - Sujet 8 - Thermostats 1 +# Tutorat de microprocesseurs - Sujet 8 - Thermostat
2 DJERABA Taky - HUBERT Thomas - PREUD'HOMME Geoffrey 2 DJERABA Taky - HUBERT Thomas - PREUD'HOMME Geoffrey
3 3
4 ## Compte-rendu 4 ## Compte-rendu
@@ -126,10 +126,10 @@ debut: @@ -126,10 +126,10 @@ debut:
126 ; reference initialisé avec agirHeure 126 ; reference initialisé avec agirHeure
127 ; d3, d2, d1, d0 initialisés avec afficherHorloge 127 ; d3, d2, d1, d0 initialisés avec afficherHorloge
128 128
129 - ; Mercredi 12h34'56  
130 - t2 <- 0b01001100  
131 - t1 <- 34  
132 - t0 <- 28 129 + ; Mardi 14h00'55
  130 + t2 <- 0b00101110
  131 + t1 <- 0
  132 + t0 <- 55
133 tt <- 0 133 tt <- 0
134 134
135 ; temp initialisé quand on en aura besoin 135 ; temp initialisé quand on en aura besoin
@@ -177,11 +177,11 @@ afficherHorloge: @@ -177,11 +177,11 @@ afficherHorloge:
177 177
178 afficherTemperature: 178 afficherTemperature:
179 ; Considère le registre compteur comme une température et l'affiche 179 ; Considère le registre compteur comme une température et l'affiche
180 - d0 <- 0x63  
181 - d1 <- afficheur@ROM[compteur%10]  
182 - temp <- compteur / 10 + 5  
183 - d2 <- afficheur@ROM[temp%10] | 0b10000000  
184 - d3 <- 0x00 180 + d0 <- 0x63 ; Sigle degré
  181 + d1 <- afficheur@ROM[compteur%10] ; Décimale
  182 + temp <- compteur / 10 + 5 ; On stocke temporairement la partie entière pour simplifier
  183 + d2 <- afficheur@ROM[temp%10] | 0b10000000 ; Chiffre des unités, auquel on ajoute le point
  184 + d3 <- 0x00 ; On affiche le chiffre des dizaines si la température est > 10
185 si temp > 10 alors d3 <- afficheur@ROM[temp/10] 185 si temp > 10 alors d3 <- afficheur@ROM[temp/10]
186 ret 186 ret
187 187
@@ -212,6 +212,7 @@ afficherJour: @@ -212,6 +212,7 @@ afficherJour:
212 si compteur = 4 saut afficherVe 212 si compteur = 4 saut afficherVe
213 si compteur = 5 saut afficherSa 213 si compteur = 5 saut afficherSa
214 si compteur = 6 saut afficherDi 214 si compteur = 6 saut afficherDi
  215 + ret ; Ne devrait pas arriver, mais permet d'éviter les dégâts
215 216
216 afficherLu: 217 afficherLu:
217 d3 <- 0x0E 218 d3 <- 0x0E
@@ -310,10 +311,11 @@ boundJour: @@ -310,10 +311,11 @@ boundJour:
310 ret 311 ret
311 312
312 boundTemperature: 313 boundTemperature:
313 - si compteur < 5 alors compteur <- 5  
314 - si compteur > 200 alors compteur <- 200 314 + si compteur < 5 alors compteur <- 250
  315 + si compteur > 250 alors compteur <- 5
315 ret 316 ret
316 317
  318 +; Puisque l'assembleur étendu ne supporte pas les retours conditionnels
317 ret: 319 ret:
318 ret 320 ret
319 reti: 321 reti:
@@ -384,30 +386,36 @@ etatParaJoursS: ; Switch @@ -384,30 +386,36 @@ etatParaJoursS: ; Switch
384 call agirHeure ; Au cas où on change l'heure en cours 386 call agirHeure ; Au cas où on change l'heure en cours
385 jmp etatParaJoursU 387 jmp etatParaJoursU
386 388
  389 +; Appelé depuis l'état 2 après un appui sur le bouton Incrémenter
  390 +; 19 Décrémenter
  391 +; 18 Valider
  392 +; 18 Retour
387 etatMenuTJour: 393 etatMenuTJour:
388 etat <- 17 394 etat <- 17
389 - d3 <- 0x3c 395 + d3 <- 0x3c ; "JOUR"
390 d2 <- 0x5c 396 d2 <- 0x5c
391 d1 <- 0x1c 397 d1 <- 0x1c
392 d0 <- 0x44 398 d0 <- 0x44
393 reti 399 reti
394 400
  401 +; Appelé depuis l'état 17 après un appui sur Valider
395 etatParaTJour: 402 etatParaTJour:
396 etat <- 18 403 etat <- 18
397 - compteur <- tempJour 404 + compteur <- tempJour ; Lecture depuis la RAM
398 etatParaTJourU: 405 etatParaTJourU:
399 call afficherTemperature 406 call afficherTemperature
400 reti 407 reti
401 408
  409 +; Appelé depuis l'état 18 après un appui sur Incrementer ou Decrementer
402 etatParaTJourC: 410 etatParaTJourC:
403 - call boundTemperature  
404 - tempJour <- compteur  
405 - call agirHeure ; Au cas où on change le mode en cours 411 + call boundTemperature ; Remet la température dans les bornes
  412 + tempJour <- compteur ; Écriture vers la RAM
  413 + call agirHeure ; Au cas où on change le mode de l'heure actuelle, on recharge la température de référence
406 jmp etatParaTJourU 414 jmp etatParaTJourU
407 415
408 etatMenuTNuit: 416 etatMenuTNuit:
409 etat <- 19 417 etat <- 19
410 - d3 <- 0x54 418 + d3 <- 0x54 ; "NUIT"
411 d2 <- 0x1c 419 d2 <- 0x1c
412 d1 <- 0x04 420 d1 <- 0x04
413 d0 <- 0x4e 421 d0 <- 0x4e
@@ -592,11 +600,6 @@ eteindreChaudiere: @@ -592,11 +600,6 @@ eteindreChaudiere:
592 600
593 ; Interruption timer 601 ; Interruption timer
594 timer: 602 timer:
595 - ; Sauvegarde de l'état  
596 - PUSH temp  
597 - PUSH r16  
598 - PUSH r17  
599 -  
600 ; Affiche le digit suivant sur l'afficheur 7seg 603 ; Affiche le digit suivant sur l'afficheur 7seg
601 temp <- PORTC@IO 604 temp <- PORTC@IO
602 lsr temp 605 lsr temp
@@ -609,16 +612,10 @@ timer: @@ -609,16 +612,10 @@ timer:
609 612
610 ; Watchdog artificiel 613 ; Watchdog artificiel
611 inc tt 614 inc tt
612 - if tt < 244 saut timerRestore  
613 - ;if tt < 10 saut timerRestore ; DEBUG Avancer le temps 615 + if tt < 244 saut reti
  616 + ;if tt < 10 saut reti ; DEBUG Avancer le temps
614 tt <- 0 617 tt <- 0
615 call agir1s 618 call agir1s
616 619
617 -timerRestore:  
618 - ; Restoration de l'état  
619 - POP r17  
620 - POP r16  
621 - POP temp  
622 -  
623 reti 620 reti
624 621
@@ -100,7 +100,7 @@ eti{NUM0}: @@ -100,7 +100,7 @@ eti{NUM0}:
100 [blanc] 100 [blanc]
101 --> 101 -->
102 102
103 -'<>[]_{}@&~()-çà+éèù%"$£!:;.,?!':c 103 +'<>[]_{}@&~()-çÇàÀ+éÉèù%"°$£!:;.,?!':c
104 -->{c} 104 -->{c}
105 105
106 106