From 1f570b8bfe09d60caad8de65c936cb6ae5b33abd Mon Sep 17 00:00:00 2001 From: Geoffrey Frogeye Date: Mon, 22 May 2017 19:13:55 +0200 Subject: [PATCH] Modification des transitions dûes à la réorganisation du CR --- CR.md | 93 +++++++++++++++++++++++++++++++++++++++++---------------------------------------------------- 1 file changed, 41 insertions(+), 52 deletions(-) diff --git a/CR.md b/CR.md index f9f0426..5d6307c 100644 --- a/CR.md +++ b/CR.md @@ -12,26 +12,39 @@ Enfin, afin de vérifier la validité de notre algorithme et de nos configuratio # Architecture matérielle +Voici à quoi ressemble la simulation du système que nous avons recréée : + ![Schéma de la modélisation](montage.svg) +Voyons en détails ses composants : + ## Entrées -On utilisera 4 boutons pour pouvoir modifier les paramètres : 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. +On utilisera 4 boutons pour pouvoir modifier les paramètres : pour valider, revenir en arrière, incrémenter et décrémenter. -Le capteur de température est connecté sur le convertisseur analogique-numérique numéro 0 (`ADC0`). -Pour la simulation, nous avons utilisé un potentiomètre afin de régler la température d'entrée du thermostat. +TODO Pourquoi résistances et capa + +Afin de lire la température réelle pour pouvoir faire un asservissement, on utilisera un capteur de température analogique, qui peut lire de 5,0°C à 30,6°C (correspondant à une plage de 0 à 5 V). Pour la simulation, nous avons utilisé un potentiomètre, ce qui nous permet de simuler plus facilement les différents cas. ## Sorties -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). +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 permettent aussi à 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 : 8 pour la selection des segments, et 4 pour la selection de l'afficheur. -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`). +Enfin, le système ne serait rien sans la chaudière, qui se commande simplement par un signal logique (allumé ou éteint). On la simule avec une simple LED. # Étude du fonctionnement +Avant de configurer les interfaces et d'écrire un algorithme, nous devons définir plus en détails comment notre système devra se comporter. + +## Contrôle de la température + +Concernant la régulation de la température, il a été prévu que celle-ci se fasse chaque 10 secondes (soit en même temps que l'état de veille est censé changer, pour simplifier l'algorithme), 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). + +La température mesurée 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. + ## Menu -Pour pouvoir afficher et modifier les différentes valeurs dont l'utilisateur a accès, on a créé un menu, dont voici la hiérarchie : +Pour pouvoir afficher et modifier les différentes valeurs que l'utilisateur a accès, on créé un menu, dont voici la hiérarchie : - Veille - Association mode ↔ heure de la semaine @@ -51,13 +64,6 @@ Pour pouvoir afficher et modifier les différentes valeurs dont l'utilisateur a 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. - -## Contrôle de la température - -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). - -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. - ## Stockage des données 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 utilisera donc : @@ -73,19 +79,29 @@ Les associations de chaque heure de la semaine à son mode (jour/nuit) seront st Enfin, on stockera les températures des deux modes dans la RAM également, car on y accède que toutes les heures (ou lors de leur modification), le registre `reference` agissant comme intermédiaire. +## Économies d'énergie + +On s'est donné comme objectif d'économiser un maximum d'énergie. Pour cela, on préfèrera utiliser des interruptions plutôt que des scrutations, et ne déclencher les lectures que lorsque nécessaire. On n'activera aucune interface si on en a pas besoin. + # Configuration des interfaces ## Interruptions externes -Nos boutons sont branchés sur les ports d'interruptions `INT0` à `INT3`. On active donc les interruption au niveau du micro-contrôleur avec la directive `SEI` (qui servira aussi pour les autres interfaces mais on ne le rappelera pas). Ensuite, on active les interruptions sur front montant +Pour éviter des scrutations, nos boutons sont branchés sur les ports d'interruptions `INT0` à `INT3`. On active donc les interruption au niveau du micro-contrôleur avec la directive `SEI` (qui servira aussi pour les autres interfaces mais on ne le rappelera pas). Ensuite, on active les interruptions sur front montant + +## Ports parallèles + +TODO sur quoi qu'on branche les 7 segments -TODO Blabla rebond etc. +↓↓↓ TODO réintégrer + +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`). ## Analogic to Digital Converter (ADC) Le thermostat est branché sur l'entrée analgique `ADC0`. Pour éviter d'utiliser de l'énergie inutilement, on désactivera les autres convertisseur analogique-numérique avec les directives `DIR0` et `DIR2`. -On configurera les registres concernant l'ADC de manière à mettre les 8 bits de points forts sur un seul registre (`ADCH`). En effet, les valeurs de témpératures allant de 5,0° à 30,6°, en choisissant une précision de 0,1° on obient 256 valeurs possibles, ce qui peut se stocker sur un seul régistre. Une précision supplémentaire ne semble pas nécessaire. +On configurera les registres concernant l'ADC de manière à mettre les 8 bits de points forts sur un seul registre (`ADCH`). En effet, les valeurs de témpératures allant de 5,0° à 30,6°, en choisissant une précision de 0,1° on obient 256 valeurs possibles, ce qui peut se stocker sur un seul régistre. Une précision supplémentaire ne semble pas nécessaire et de plus compliquée à gérer. Il sera configuré pour s'activer sur demande, ici toutes les dix secondes. En effet, la température étant un paramètre variant très lentemenent, il n'est pas nécessaire et de plus énergivore de la lire continuellement. Enfin, il sera de plus configuré pour déclencher une interruption dès que la conversion est terminée afin d'éviter toute scrutation. @@ -97,7 +113,6 @@ TODO toutes les deux secondes, déclenche une interruption, nécessite d'être u On s'est rendu compte que la fréquence d'appel était ~100× plus élevé que ce qui devrait être. N'ayant pas réussi à corriger ce comportement (que l'on a pu aussi constater en TP), nous avons dû trouver un autre moyen de procéder. - ## Timer TODO 4 ms (détailler le calcul, copier ce qu'il y a dans la partie algo), pas trop long pour que l'oeil puisse distinguer (persistence rétinienne, tout ça) ni trop court pour pas consommer d'énergie. @@ -118,7 +133,7 @@ L'algorithme étant assez lourd et redondant, on ne présentera que les principe ## Interruptions -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. +Voici les différentes fonctions qui sont appelées par le micro-contrôleur lui-même, et une vue d'ensemble de ce qu'elles sont censées faire. ### Timer @@ -144,11 +159,11 @@ timer: ### Watchdog -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`. +Le watchdog ne fonctionnant pas, nous avons donc étendu l'interruption du timer pour pouvoir compter les secondes. Pour cela, un utilise un registre supplémentaire, `tt`, qui est incrémenté à chacune des interruptions du timer. Sa fréquence exacte étant de de $\frac{16 MHz}{256^2}=244.140625 Hz$, dès que `tt` a depassé `244` on appelle donc la fonction qui était censée être appelée par le watchdog, `agir1s` qui gère les éxecute les fonctions dépendant du temps. 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. -### ADC +### Convertisseur analogique→numérique 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. @@ -156,42 +171,17 @@ Cette interruption est déclenchée à chaque fois qu'une conversion analogiqueâ ### Boutons -À 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. - -Voici par exemple la fonction appelée par le bouton Incrémenter : - -```avrasmplus -incrementer: - inc compteur - si etat = 0 saut etatVeilleTemp - si etat = 1 saut etatVeilleHeur - si etat = 2 saut etatMenuTJour - si etat <= 9 saut etatMenuJoursC - si etat <= 16 saut etatParaJoursC - si etat = 17 saut etatMenuTNuit - si etat = 18 saut etatParaTJourC - si etat = 19 saut etatMenuHorloge - si etat = 20 saut etatParaTNuitC - si etat = 21 saut etatMenuAssoc - si etat = 22 saut etatMenuHHeur - si etat = 23 saut etatMenuHMinu - si etat = 24 saut etatMenuHJour - si etat = 25 saut etatParaHJourC - si etat = 26 saut etatParaHHeurC - si etat = 27 saut etatParaHMinuC - reti ; Ne devrait pas arriver, mais permet d'éviter les dégâts -``` +À chaque bouton est associé une interruption, et chacune modifie l'affichage, les registres `etat` et/ou `compteur`, et éventuellement les valeurs de fonctionnement du système (heure actuelle, température des modes...), et ce en fonction des registres `etat` et `compteur` précédents. ## Fonction d'agissement -Ces fonctions permettent de réaliser des actions en fonction du temps. +Certaines actions sont prises selon une base horaire. Elles sont déclenchées par l'interruption du timer (normalement celle du watchdog), lorsque leur intervalle de temps coïncide. -- `agir1s` : déclenchée toutes les secondes, elle met à jour les registres de temps, et appelle les fonctions `agir10s` et `agirHeure` +- `agir1s` : déclenchée toutes les secondes, elle met à jour les registres de temps, et appelle les fonctions `agir10s` et `agirHeure` si besoin - `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. - `agirHeure` : elle recharge depuis la RAM le mode actuel, et met à jour le registre `reference` contenant la température à utiliser. -*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.* - +*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 les modifications de l'utilisateur. 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.* ## Gestion des états @@ -254,7 +244,7 @@ etatParaTJourC: ## Fonctions usuelles -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. +Pour clarifier le code et pouvoir le réutiliser, on définit un certain nombre de fonctions usuelles. Généralement, elles utilisent la valeur de compteur dans son contexte, et la modifie si besoin. 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 : @@ -279,8 +269,7 @@ boundHeur: ret ``` -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. - +On utilise le fait qu'une décrémentation depuis la valeur 0 effectue un dépassement et remet le registre à 255. Nous ne pouvons pas 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. # Conclusion -- libgit2 0.21.2