From af2c171d422fd8c792ecae4913d16bdfeb889805 Mon Sep 17 00:00:00 2001 From: Geoffrey Frogeye Date: Thu, 11 May 2017 07:41:05 +0200 Subject: [PATCH] Rédaction du matin --- CR.md | 33 ++++++++++++++++++++++++++++++--- principal.txt | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+), 3 deletions(-) create mode 100644 principal.txt diff --git a/CR.md b/CR.md index 465b1fb..a5b8cae 100644 --- a/CR.md +++ b/CR.md @@ -15,12 +15,37 @@ Le capteur de température est connecté sur le convertisseur analogique-numéri # Étude du fonctionnement -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. De toutes manières, 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, donc il n'y a que des avantages à utiliser cette technique. +## Menu +Voici la hiérarchie du menu qui sera utilisée pour configurer le thermostat : -## Menu +- Veille + - Association mode ↔ heure de la semaine + - Lundi + - Mardi + - Mercredi + - Jeudi + - Vendredi + - Samedi + - Dimanche + - Température du mode jour + - Témpérature du mode nuit + - Réglage de la date et heure + - Heures + - Minutes + - Jour de la semaine + +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. + +## 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 stockera donc : + +- **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. +- **1 registre (dont 6 bits inutilisés)** : afficheur 7 segment actuellement en cours d'affichage. Cela permet d'alterner les 4 dans l'ordre. +- **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. -Voici la hiérarchie du menu qui sera utilisé pour +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. # Configuration des interfaces @@ -32,3 +57,5 @@ Il sera de plus configuré pour s'activer sur demande et activera une interrupti # Algorithme +## Pseudo-code +!include(principal.txt lang=avrpseudo) diff --git a/principal.txt b/principal.txt new file mode 100644 index 0000000..1a55b31 --- /dev/null +++ b/principal.txt @@ -0,0 +1,76 @@ +; Équivalences + +.equ PINA = 0x00 +.equ DDRA = 0x01 +.equ PORTA = 0x02 +.equ PINB = 0x03 +.equ DDRB = 0x04 +.equ PORTB = 0x05 + +.equ RAMEND = 0x21FF +.equ SPH = 0x3E +.equ SPL = 0x3D + +; Nommage des registres utilisés + +.def etat = r19 + +; Vecteurs d'interruptions + +.org 0x000 ; Vecteur RESET + jmp debut + + +; Tableaux de la mémoire du programme + +.org 0x0080 + +; Programme + +debut: +; Configuration des composants +; Initialisation des valeurs + +boucle: + sleep + jmp boucle + +; Fonctions +agir10s: + ; Initialise une lecture ADC + ; Met à jour l'état de veille (si on est en état veille) + ret + +agirHeure: + ; Recharge la température de référence + ret + +; Interruption boutons + +incrementer: + reti + +decrementer: + reti + +valider: + reti + +retour: + reti + +; Interruption Watchdog +watchdog: + ; Met à jour les registres de temps, active agir10s ou agirHeure si nécessaire + reti + +; Interruption ADC +adc: + ; Active ou désactive la chaudière selon la température lue et celle de référence + reti + +; Interruption timer +timer: + ; Affiche le digit suivant sur l'afficheur 7seg + reti + -- libgit2 0.21.2