Commit e931eb2b9d373fa6c49d0dcfc9444c80045c5a44

Authored by Geoffrey PREUD'HOMME
1 parent 7fe24741

Réorganisation du CR

Enfin un titre sympa !
Showing 1 changed file with 77 additions and 75 deletions   Show diff stats
... ... @@ -116,6 +116,83 @@ En effet, nous avons dit précédemment que pour économiser l'énergie, toutes
116 116  
117 117 L'algorithme étant assez lourd 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> (`Files` > `principal.txt`).
118 118  
  119 +## Interruptions
  120 +
  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.
  122 +
  123 +### Timer
  124 +
  125 +Déclenchée toutes les ~4 ms, elle change le digit de l'afficheur 4 × 7 segments actuellement affiché en modifiant la configuration du port C, et cenvoie sur le port A les données du registre `dX` correspondant.
  126 +
  127 +```avrasmplus
  128 +timer:
  129 + ; Notre composant requiert d'envoyer 0 sur PC7-4
  130 + ; afin d'activer le digit qui y est connecté
  131 +
  132 + ; Affiche le digit suivant sur l'afficheur 7seg
  133 + temp <- PORTC@IO ; On lis l'état précédent du port
  134 + lsr temp ; On change de digit
  135 + ; Il y a 4 digits et 8 bits, on doit donc boucler plus tôt
  136 + si temp < 0b00001111 alors temp <- 0b11110111
  137 + PORTC@IO <- temp
  138 + ; On envoie le registre correpspondant
  139 + si temp = 0b11110111 alors PORTA@IO <- d3
  140 + si temp = 0b01111011 alors PORTA@IO <- d2
  141 + si temp = 0b00111101 alors PORTA@IO <- d1
  142 + si temp = 0b00011110 alors PORTA@IO <- d0
  143 +```
  144 +
  145 +### Watchdog
  146 +
  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`.
  148 +
  149 +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 +
  151 +### ADC
  152 +
  153 +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 +
  155 +*Note : Vous pourrez constater dans le code que cette interruption en déclenche une autre afin d'avoir un retour immédiat sur nos actions. Cela n'a été fait que pour simplifier la présentation orale.*
  156 +
  157 +### Boutons
  158 +
  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 +```
  184 +
  185 +## Fonction d'agissement
  186 +
  187 +Ces fonctions permettent de réaliser des actions en fonction du temps.
  188 +
  189 +- `agir1s` : déclenchée toutes les secondes, elle met à jour les registres de temps, et appelle les fonctions `agir10s` et `agirHeure`
  190 +- `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 +- `agirHeure` : elle recharge depuis la RAM le mode actuel, et met à jour le registre `reference` contenant la température à utiliser.
  192 +
  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 +
  195 +
119 196 ## Gestion des états
120 197  
121 198 Chacun des boutons provoque une interruption qui modifie l'affichage et les valeurs nécessaires en fonction de celui qui a été appuyé et de l'état précédent du menu. Il faut alors stocker dans quel état est le menu en mémoire. On utilisera pour cela un registre `etat`, qui prendra les valeurs suivantes :
... ... @@ -204,81 +281,6 @@ boundHeur:
204 281  
205 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.
206 283  
207   -## Fonction d'agissement
208   -
209   -Ces fonctions permettent de réaliser des actions en fonction du temps.
210   -
211   -- `agir1s` : déclenchée toutes les secondes, elle met à jour les registres de temps, et appelle les fonctions `agir10s` et `agirHeure`
212   -- `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.
213   -- `agirHeure` : elle recharge depuis la RAM le mode actuel, et met à jour le registre `reference` contenant la température à utiliser.
214   -
215   -*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.*
216   -
217   -## Interruptions
218   -
219   -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.
220   -
221   -### Timer
222   -
223   -Déclenchée toutes les ~4 ms, elle change le digit de l'afficheur 4 × 7 segments actuellement affiché en modifiant la configuration du port C, et cenvoie sur le port A les données du registre `dX` correspondant.
224   -
225   -```avrasmplus
226   -timer:
227   - ; Notre composant requiert d'envoyer 0 sur PC7-4
228   - ; afin d'activer le digit qui y est connecté
229   -
230   - ; Affiche le digit suivant sur l'afficheur 7seg
231   - temp <- PORTC@IO ; On lis l'état précédent du port
232   - lsr temp ; On change de digit
233   - ; Il y a 4 digits et 8 bits, on doit donc boucler plus tôt
234   - si temp < 0b00001111 alors temp <- 0b11110111
235   - PORTC@IO <- temp
236   - ; On envoie le registre correpspondant
237   - si temp = 0b11110111 alors PORTA@IO <- d3
238   - si temp = 0b01111011 alors PORTA@IO <- d2
239   - si temp = 0b00111101 alors PORTA@IO <- d1
240   - si temp = 0b00011110 alors PORTA@IO <- d0
241   -```
242   -
243   -### Watchdog
244   -
245   -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`.
246   -
247   -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.
248   -
249   -### ADC
250   -
251   -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.
252   -
253   -*Note : Vous pourrez constater dans le code que cette interruption en déclenche une autre afin d'avoir un retour immédiat sur nos actions. Cela n'a été fait que pour simplifier la présentation orale.*
254   -
255   -### Boutons
256   -
257   -À 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.
258   -
259   -Voici par exemple la fonction appelée par le bouton Incrémenter :
260   -
261   -```avrasmplus
262   -incrementer:
263   - inc compteur
264   - si etat = 0 saut etatVeilleTemp
265   - si etat = 1 saut etatVeilleHeur
266   - si etat = 2 saut etatMenuTJour
267   - si etat <= 9 saut etatMenuJoursC
268   - si etat <= 16 saut etatParaJoursC
269   - si etat = 17 saut etatMenuTNuit
270   - si etat = 18 saut etatParaTJourC
271   - si etat = 19 saut etatMenuHorloge
272   - si etat = 20 saut etatParaTNuitC
273   - si etat = 21 saut etatMenuAssoc
274   - si etat = 22 saut etatMenuHHeur
275   - si etat = 23 saut etatMenuHMinu
276   - si etat = 24 saut etatMenuHJour
277   - si etat = 25 saut etatParaHJourC
278   - si etat = 26 saut etatParaHHeurC
279   - si etat = 27 saut etatParaHMinuC
280   - reti ; Ne devrait pas arriver, mais permet d'éviter les dégâts
281   -```
282 284  
283 285 # Conclusion
284 286  
... ...