Commit b4948e20c16b6b5ac27411caa8432a62712117b0

Authored by Geoffrey PREUD'HOMME
1 parent 523f44f2

Modifs pre-oral

Showing 2 changed files with 33 additions and 28 deletions   Show diff stats
@@ -3,9 +3,9 @@ @@ -3,9 +3,9 @@
3 3
4 # Sujet 4 # Sujet
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ée 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 de 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. On s'arrêtera dans cet objectif à l'optimisation des instructions assembleurs. 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, procédé qui s'automatise facilement.
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
@@ -22,11 +22,9 @@ Voyons en détails ses composants : @@ -22,11 +22,9 @@ Voyons en détails ses composants :
22 22
23 On utilisera 4 boutons pour pouvoir modifier les paramètres : pour valider, revenir en arrière, incrémenter et décrémenter. 23 On utilisera 4 boutons pour pouvoir modifier les paramètres : pour valider, revenir en arrière, incrémenter et décrémenter.
24 24
25 -Pour chaque bouton, nous allons associer une résistance pull-up. Elle a pour rôle de maintenir la valeur en entrée du bouton à 5v quand le bouton n'est pas actionné, tout en lui permettant de prendre la valeur 0 sans qu'il se passe de court-circuit quand le bouton est pressé. Du coup, quand le bouton n'est pas pressé, l'entrée digitale est branché à une résistance en série avec du 5V. Et comme aucun courant ne passe dans l'entrée digitale, il n'y a pas de chutes de tension aux bornes de la resistance. Quand le bouton est actionné, comme l'autre pin du bouton est branché à la masse, le pin lu est à la masse, mais du courant circule dans la resistance, qui dissipe donc de l'énergie. Par conséquent, pour limiter le courant et la puissance dissipée à l'appui du bouton, nous avons choisi des résistances élevées, soit de 1 Méga-Ohm. 25 +Pour chaque bouton, nous allons associer une résistance pull-up. Elle a pour rôle de maintenir la valeur en entrée du bouton à 5v quand le bouton n'est pas actionné, tout en lui permettant de prendre la valeur 0 sans qu'il se passe de court-circuit quand le bouton est pressé. En conséquence, quand le bouton n'est pas pressé, l'entrée digitale est branché à une résistance en série avec du 5V. Et comme aucun courant ne passe dans l'entrée digitale, il n'y a pas de chutes de tension aux bornes de la resistance. Quand le bouton est actionné, comme l'autre pin du bouton est branché à la masse, le broche lu est à la masse, mais du courant circule dans la resistance, qui dissipe donc de l'énergie. Par conséquent, pour limiter le courant et la puissance dissipée à l'appui du bouton, nous avons choisi des résistances élevées, soit de $1 M\Omega$.
26 26
27 -Les boutons ont ensuite posé des problèmes à cause de leurs rebonds. Comme ils déclenchent des interruptions, tout phénomène de rebond, qui crée une suite de fronts montants et descendants, est à supprimer pour éviter que plusieurs interruptions se déclenchent d'affilée à l'appui du bouton. Il faut donc lisser la tension, ce qui se fait en ajoutant une capacité entre les pattes des boutons. Pour le choix de nos valeurs, nous avons pu prendre des capacités de petites valeurs, car nos résistances pull-up avec une grosse valeur limitent fortement le courant pour charger les capacités. Nous avons choisi des capacités de 10µf, qui associées aux résistances de 1 Méga-Ohm, lissent la tension efficacement.  
28 -  
29 -Pour finir, nous obtenons un programme qui répond tout à fait normalement à l'appui des boutons. 27 +Les boutons ont ensuite posé des problèmes à cause de leurs rebonds. Comme ils déclenchent des interruptions, tout phénomène de rebond - qui crée une suite de fronts montants et descendants - est à supprimer pour éviter que plusieurs interruptions se déclenchent d'affilée à l'appui du bouton. Il faut donc lisser la tension, ce qui se fait en ajoutant une capacité entre les pattes des boutons. Pour le choix de nos valeurs, nous avons pu prendre des capacités de petites valeurs, car nos résistances pull-up avec une grosse valeur limitent fortement le courant pour charger les capacités. Nous avons choisi des capacités de $10 \nu F$, qui associées aux résistances de $1 M\Omega$, lissent la tension efficacement.
30 28
31 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. 29 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.
32 30
@@ -34,9 +32,9 @@ Afin de lire la température réelle pour pouvoir faire un asservissement, on ut @@ -34,9 +32,9 @@ Afin de lire la température réelle pour pouvoir faire un asservissement, on ut
34 32
35 ## Sorties 33 ## Sorties
36 34
37 -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. 35 +En sortie, nous avons utilisé 4 afficheurs 7-segments, lesquels permettront 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.
38 36
39 -Le fonctionnement de l'afficheur est simple. On envoie une valeur de tension positive sur les pattes des segments à allumer, et on met les pattes de selection de l'afficheur à zéro, pour que le courant passe entre les deux. Ainsi, les segments de l'afficheur sélectionné seront allumés. On a ajouté des résistances à chaque patte de sélection d'afficheur pour limiter le courant débité, car il n'y a pas de résistances internes à cet afficheur. 37 +Le fonctionnement de l'afficheur est simple. On envoie une valeur de tension positive sur les pattes des segments à allumer, et on met les pattes de selection de l'afficheur à la masse, pour que le courant passe entre les deux. Ainsi, les segments de l'afficheur sélectionné seront allumés. On a ajouté des résistances à chaque patte de sélection d'afficheur pour limiter le courant débité, car il n'y a pas de résistances internes.
40 38
41 Pour utiliser cet afficheur, il suffira donc d'envoyer des 1 logiques pour les segments à afficher, et des 0 logiques pour les afficheurs à sélectionner. Il est intéressant de signaler que des diodes internes empêchent les courants de passer en sens inverse, quand le segment non allumé, donc à 0, est sur un afficheur non sélectionné, donc à 1, ce qui crée une tension négative aux bornes des résistances. 39 Pour utiliser cet afficheur, il suffira donc d'envoyer des 1 logiques pour les segments à afficher, et des 0 logiques pour les afficheurs à sélectionner. Il est intéressant de signaler que des diodes internes empêchent les courants de passer en sens inverse, quand le segment non allumé, donc à 0, est sur un afficheur non sélectionné, donc à 1, ce qui crée une tension négative aux bornes des résistances.
42 40
@@ -50,9 +48,9 @@ Avant de configurer les interfaces et d'écrire un algorithme, nous devons défi @@ -50,9 +48,9 @@ Avant de configurer les interfaces et d'écrire un algorithme, nous devons défi
50 48
51 ## Contrôle de la température 49 ## Contrôle de la température
52 50
53 -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). 51 +Concernant la régulation de la température, il a été prévu que celle-ci se fasse toutes les 10 secondes (soit au même moment que l'état de veille change, 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, correspondant à une plage de température allant de 5 à 30.6°C.
54 52
55 -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. 53 +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. Cela permet de créer un phénomène d'hysteresis afin d'éviter d'allumer et d'éteindre la chaudière trop fréquemment. 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.
56 54
57 ## Menu 55 ## Menu
58 56
@@ -78,14 +76,14 @@ On peut passer d'un menu à son menu hiérarchiquement supérieur (parent) avec @@ -78,14 +76,14 @@ On peut passer d'un menu à son menu hiérarchiquement supérieur (parent) avec
78 76
79 ## Stockage des données 77 ## Stockage des données
80 78
81 -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 : 79 +Les accès à la RAM nécessitant plus d'instructions et donc étant plus gourmands en énergie, on stockera un maximum d'informations dans les registres, de préférences les données étant lues/écrites les plus fréquemment. On y utilisera donc :
82 80
83 - `d3`, `d2`, `d1` et `d0` : 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. 81 - `d3`, `d2`, `d1` et `d0` : 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.
84 - `PORTC` : 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. 82 - `PORTC` : 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.
85 - `t2`, `t1` et `t0` : stockage du temps actuel. Il y a $7 \times 24 \times 60 \times 60$ $=604800$ valeurs possibles pour ce compteur de temps. On a donc besoin de 3 registres $\left( 2^{8 \times 2} = 65536 < 604800 < 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 pour stocker les secondes de la minute. Cela permet de simplifier les calculs et d'éviter de faire des opérations sur des entiers de 24 bits. 83 - `t2`, `t1` et `t0` : stockage du temps actuel. Il y a $7 \times 24 \times 60 \times 60$ $=604800$ valeurs possibles pour ce compteur de temps. On a donc besoin de 3 registres $\left( 2^{8 \times 2} = 65536 < 604800 < 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 pour stocker les secondes de la minute. Cela permet de simplifier les calculs et d'éviter de faire des opérations sur des entiers de 24 bits.
86 - `etat` et `compteur` : ils permettent de stocker l'état actuel du menu. 84 - `etat` et `compteur` : ils permettent de stocker l'état actuel du menu.
87 - `reference` : contient la température désirée actuelle (c'est à dire pour le mode de l'heure actuelle). Étant comparée toutes les 10 secondes avec la température réelle et le calcul de sa valeur nécessitant de connaître le temps actuel, le mode associé à ce temps et la température associée à ce mode, on a jugé avantageux de le stocker dans un registre qui sera mis à jour au besoin. 85 - `reference` : contient la température désirée actuelle (c'est à dire pour le mode de l'heure actuelle). Étant comparée toutes les 10 secondes avec la température réelle et le calcul de sa valeur nécessitant de connaître le temps actuel, le mode associé à ce temps et la température associée à ce mode, on a jugé avantageux de le stocker dans un registre qui sera mis à jour au besoin.
88 -- `temp` : registre dédié à certaines opérations temporaires. Il n'a pas de rapport (la plupart du temps) avec la température. 86 +- `temp` : registre dédié à certaines opérations temporaires. Malgré son nom, il n'a pas de rapport (la plupart du temps) avec la température.
89 87
90 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. 88 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.
91 89
@@ -93,37 +91,37 @@ Enfin, on stockera les températures des deux modes dans la RAM également, car @@ -93,37 +91,37 @@ Enfin, on stockera les températures des deux modes dans la RAM également, car
93 91
94 ## Économies d'énergie 92 ## Économies d'énergie
95 93
96 -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. 94 +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 nous n'en avons pas le besoin.
97 95
98 # Configuration des interfaces 96 # Configuration des interfaces
99 97
100 ## Interruptions externes 98 ## Interruptions externes
101 99
102 -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, ce qui est rendu possible par l'ajout des capacité anti-rebonds vues précédemment. 100 +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 des entrées `INT0` à `INT3`, qui déclencheront une fonction dans le code.
103 101
104 ## Ports parallèles 102 ## Ports parallèles
105 103
106 -Nos afficheurs 7 segments se contrôlent par 12 pins. 8 servent à choisir les segments à afficher, qui seront branchées en PortA (0:7), et 4 pins commandés en logique inversée servent à choisir l'afficheur à utiliser. Nous brancherons ces derniers en PortC(0:3). Ce système implique de mettre au point un sytème d'affichage qui alterne entre les afficheurs, nous verrons cela juste après. 104 +Nos afficheurs 7 segments se contrôlent par 12 broches. 8 servent à choisir les segments à afficher, elles seront branchées sur le port A de `PA0` à `PA7`, et 4 broches commandés en logique inversée servent à choisir l'afficheur à utiliser. Nous brancherons ces derniers sur le port C de `PC0` à `PC3`. Ces deux ports sont configurés en sortie.
107 105
108 -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`). 106 +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`), qui est donc configuré en sortie.
109 107
110 ## Analogic to Digital Converter (ADC) 108 ## Analogic to Digital Converter (ADC)
111 109
112 -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`. 110 +Le thermostat est branché sur l'entrée analgique `ADC0`. Pour éviter d'utiliser de l'énergie inutilement, on désactivera les autres convertisseurs analogique→numérique avec les directives `DIR0` et `DIR2`.
113 111
114 -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. 112 +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°C, en choisissant une précision de 0,1° on obient 257 valeurs possibles, ce qui peut se stocker sur un seul régistre en faisant abstraction d'une valeur. Une précision supplémentaire ne semble pas nécessaire et de plus compliquée à gérer.
115 113
116 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. 114 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.
117 115
118 ## Watchdog 116 ## Watchdog
119 117
120 -Le Watchdog doit être appellé toutes les secondes dans l'idéal. On l'a donc configuré pour avoir un tel résultat. Mais 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. 118 +Le Watchdog doit permettre de changer l'état de veille toutes les 10 secondes ainsi que garder la trace de la minute actuelle, on peut donc le configurer pour qu'il active une interruptions toutes les deux secondes (facteur de 10 et de 60).
121 119
122 -## Timer 120 +Mais 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.
123 121
  122 +## Timer
124 123
125 -Pour le timer, nous avons fait le choix de l'utiliser en overflow, ce qui simplifie l'initialisation. Nous avons utilisé un prescaler à 256, ce qui nous permet d'avoir une fréquence égale à $\frac{16 MHz}{256^2}=244.140625Hz$, ce qui correspond à 4.1 ms. Cela nous permet d'avoir un affichage complet tous les 16ms, ce qui est le minimum pour un affichage correct, ce qui permet de faire la plus grande économie d'énergie pour un affichage correct.  
126 -A chaque cycle, on va décaler l'octet envoyé au portC, qui sert à sélectionner l'afficheur, et on enverra en PortA la valeur correspondante. 124 +Pour le timer, nous avons utilisé un prescaler à 256, ce qui nous permet d'avoir une fréquence égale à $\frac{16 MHz}{256^2}=244.140625Hz$, ce qui correspond à $4.1 ms$. Cela nous permet d'avoir un affichage complet tous les 16ms, ce qui est le maximum pour que la persistence rétinienne fasse effet et que le cerveau perçoive un affichage qui ne clignote pas. On le configure ainsi pour qu'il déclenche une interruptions à la fin de sa période (mode overflow).
127 125
128 # Algorithme 126 # Algorithme
129 127
@@ -135,9 +133,9 @@ boucle: @@ -135,9 +133,9 @@ boucle:
135 jmp boucle 133 jmp boucle
136 ``` 134 ```
137 135
138 -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. 136 +En effet, nous avons dit 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éclencheraient en même temps.
139 137
140 -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`). 138 +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/blob/master/principal.txt>.
141 139
142 ## Interruptions 140 ## Interruptions
143 141
@@ -167,15 +165,15 @@ timer: @@ -167,15 +165,15 @@ timer:
167 165
168 ### Watchdog 166 ### Watchdog
169 167
170 -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 $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. 168 +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 $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.
171 169
172 -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. 170 +D'un point de vue énergétique, cette approche est beaucoup 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.
173 171
174 ### Convertisseur analogique→numérique 172 ### Convertisseur analogique→numérique
175 173
176 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. 174 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.
177 175
178 -*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.* 176 +*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 a été fait pour simplifier la présentation orale.*
179 177
180 ### Boutons 178 ### Boutons
181 179
@@ -285,6 +283,9 @@ Bien que ce genre de système n&#39;est pas fait pour être redémarré (puisque les @@ -285,6 +283,9 @@ Bien que ce genre de système n&#39;est pas fait pour être redémarré (puisque les
285 283
286 # Conclusion 284 # Conclusion
287 285
288 -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 ce fut une experience très enrichissante. 286 +Pour ce projet de thermostat, nous avons réalisé son architecture matérielle, son algorithme, et même réussi à en faire une simulation matérielle, 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, a aussi posé quelques problèmes, mais elle a été utile pour se rendre compte que certains chemins envisagés au débuts n'étaient pas réalisables, et elle a permis de pouvoir tester notre algorithme. Au final ce fut une experience très enrichissante.
  287 +
  288 +Si nous avions des ressources supplémentaires, nous aurions ajouté une mémoire morte pour sauvegarder les données même en cas de coupure de courant, et un module RTC (Real-Time Clock), pour un suivi plus précis du temps.
  289 +
289 290
290 291
@@ -24,6 +24,8 @@ @@ -24,6 +24,8 @@
24 .equ ADCSRB = 0x7B 24 .equ ADCSRB = 0x7B
25 .equ ADCSRA = 0x7A 25 .equ ADCSRA = 0x7A
26 .equ ADCH = 0x79 26 .equ ADCH = 0x79
  27 +.equ DIR0 = 0x7E
  28 +.equ DIR2 = 0x7D
27 29
28 .equ SPH = 0x3E 30 .equ SPH = 0x3E
29 .equ SPL = 0x3D 31 .equ SPL = 0x3D
@@ -119,6 +121,8 @@ debut: @@ -119,6 +121,8 @@ debut:
119 ADMUX <- 0b01100000 121 ADMUX <- 0b01100000
120 ADCSRB <- 0b00000010 122 ADCSRB <- 0b00000010
121 ADCSRA <- 0b11011110 123 ADCSRA <- 0b11011110
  124 + DIR0 <- 0b11111110
  125 + DIR2 <- 0b11111111
122 126
123 ; Initialisation des registre 127 ; Initialisation des registre
124 etat <- 0 128 etat <- 0