From f629950c75277afc3dd87ce6a196c5412b84f8b9 Mon Sep 17 00:00:00 2001 From: Geoffrey Frogeye Date: Sat, 13 May 2017 16:44:47 +0200 Subject: [PATCH] Réorganisation de la navigation dans le menu --- CR.md | 3 ++- Makefile | 2 +- principal.txt | 337 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------------------------------------------------------- 3 files changed, 245 insertions(+), 97 deletions(-) diff --git a/CR.md b/CR.md index 8f0066a..d6d9731 100644 --- a/CR.md +++ b/CR.md @@ -42,6 +42,7 @@ On peut passer d'un menu à son menu hiérarchiquement supérieur (parent) avec ## 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. 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 correspond peut se coder sur 8bits en 256 valeurs. + 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. ## États @@ -64,7 +65,7 @@ Les accès à la RAM nécessitant plus d'instructions et donc étant plus gourma - **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. 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 +- **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 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. diff --git a/Makefile b/Makefile index f397d62..38b37c8 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,7 @@ default: CR.pdf # COMPTE-RENDU -SOURCES=$(wildcard *.asm) $(wildcard *.txt) +SOURCES=$(wildcard *.txt) %.pdf: %.html scripts/html2pdf -i "$<" -o "$@" -t "Tutorat de microprocesseurs S6 - TD1 Sujet 8" diff --git a/principal.txt b/principal.txt index 6544978..cbe3fe5 100644 --- a/principal.txt +++ b/principal.txt @@ -98,154 +98,301 @@ boucle: jmp boucle ; Fonctions -afficherHeure: + +; Affichages +afficherHorloge: ; Affiche l'heure actuelle - temp <- + ; TODO ret - afficherTemperature: ; Considère le registre compteur comme une température et l'affiche d0 <- afficheurLettre[26] ; Sigle ° d1 <- afficheur[compteur%10] temp <- compteur + 50 - d2 <- afficheur[(temp/10)%10] + d2 <- afficheur[(temp/10)%10] | 0b10000000 d3 <- afficheur[temp/100] ret +afficherHeur: + ; Considère le registre compteur comme une heure et l'affiche + d3 <- afficheur[compteur/10] + d2 <- afficheur[compteur%10] | 0b100000000 + d1 <- 0x00 + d0 <- 0x00 + ret + +afficherMinu: + ; Considère le registre compteur comme une minute et l'affiche + d3 <- 0x00 + d2 <- 0b10000000 + d1 <- afficheur[compteur/10] + d0 <- afficheur[compteur%10] + ret + +afficherJour: + ; Considère le regustre compteur comme un jour et l'affiche + ; TODO + ret + +; Logique agir10s: ; Initialise une lecture ADC ; Met à jour l'état de veille (si on est en état veille) ret -agirHeure: +agirHeur: ; Recharge la température de référence ret -; Interruption boutons +; Recadrage +boundHeur: + si compteur = 255 alors compteur <- 23 + si compteur >= 24 alors compteur <- 0 + ret -incrementer: - si etat <= 1 saut reti - si etat = 2 saut etatMenuJour - si etat < 9 saut etatPlusUn - si etat = 9 saut etatLundi - si etat = 17 saut etatMenuNuit - si etat = 18 saut TODO - si etat = 19 saut etatMenuHorloge - si etat = 20 saut TODO - si etat = 21 saut etatMenuAssoc - si etat < 24 saut etatPlusUn - si etat = 24 saut etatMenuHorlogeJour +boundMinu: + si compteur = 255 alors compteur <- 59 + si compteur >= 60 alors compteur <- 0 + ret + +boundJour: + si compteur = 255 alors compteur <- 6 + si compteur >= 7 alors compteur <- 0 + ret + +boundTemperature: + si compteur < 5 alors compteur <- 5 + si compteur > 200 alors compteur <- 200 + ret + +; États +; × : Arrivée à l'état par un niveau supérieur +; R : Arrivée à l'état par un niveau inférieur +; U : Mise à jour de l'affichage +; C : Changement de l'état + +etatVeilleHeur: + etat <- 0 + call afficherHorloge reti -decrementer: - si etat <= 1 saut reti +etatVeilleTemp: + etat <- 0 + compteur <- ADCH + call afficherTemperature reti etatMenuAssoc: etat <- 2 - reti -etatMenuJour: - etat <- 17 - reti -etatMenuNuit: - etat <- 19 - reti -etatMenuHorloge - etat <- 21 - reti -etatPlusUn: - etat <- etat + 1 - reti -etatLundi: - etat <- 3 - reti -etatMenuHorlogeJour: - etat <- 22 - reti -reti: + d <- "ASSO" reti -valider: - si etat <= 1 saut validerVeille - si etat = 2 saut validerAssoc - si etat <= 9 saut validerAJour - si etat <= 16 saut validerParaAJour - si etat = 17 saut validerTJour - si etat = 18 saut validerParaTJour - si etat = 19 saut validerTNuit - si etat = 20 saut validerParaTNuit - si etat = 21 saut validerHorloge - si etat <= 24 saut validerMenuHorloge - si etat <= 27 saut validerParaHorloge +etatMenuJours: + compteur <- 0 +etatMenuJoursU: + etat <- 3 + compteur + call afficherJour reti - ; TODO Affichages -validerVeille: - etat <- 2 -validerAssoc: - etat <- 3 -validerAJour: + +etatMenuJoursR: + compteur <- etat - 7 - 3 + jmp etatMenuJoursU + +etatMenuJoursC: + call boundJour + jmp etatMenuJoursU + +etatParaJours: etat <- etat + 7 + compteur <- 12 +etatParaJoursU: + d3 <- afficheur[compteur/10] + d2 <- afficheur[compteur%10] + d1 <- 0x00 + d0 <- 0xFF ; TODO Récupérer le mode reti -validerParaAJour: - ; TODO + +etatParaJoursC: + call boundHeur + jmp etatParaJoursU + +etatParaJoursS: ; Switch + ; TODO Sauvegarde + jmp etatParaJoursU + +etatMenuTJour: + etat <- 17 + d <- "JOUR" reti -validerTJour: + +etatParaTJour: etat <- 18 + compteur <- 0 ; TODO Récupérer la température +etatParaTJourU: + call afficherTemperature reti -validerParaTJour: - ; TODO - etat <- 17 + +etatParaTJourC: + call boundTemperature + ; TODO Sauvegarde + jmp etatParaTJourU + +etatMenuTNuit: + etat <- 19 + d <- "NUIT" reti -validerTNuit: + +etatParaTNuit: etat <- 20 + compteur <- 0 ; TODO Récupérer la température +etatParaTNuitU: + call afficherTemperature reti -validerParaTNuit: - ; TODO - etat <- 19 + +etatParaTNuitC: + call boundTemperature + ; TODO Sauvegarde + jmp etatParaTNuitU + +etatMenuHorloge: + etat <- 21 + d <- "HORL" reti -validerHorloge: + +etatMenuHJour: etat <- 22 + d <- "JOUR" reti -validerMenuHorloge: - etat <- etat + 3 + +etatMenuHHeur: + etat <- 23 + d <- "HEUR" reti -validerParaHorloge: - etat <- etat - 3 + +etatMenuHMinu: + etat <- 24 + d <- "MINU" reti -retour: - si etat <= 1 saut retourRien - si (etat = 2 ou etat = 17 ou etat = 19 ou etat = 21) saut retourVeille - si etat <= 9 saut retourMenuAssoc - si etat <= 16 saut retourMenuJAssoc - si etat <= 21 saut retourMoinsUn - si etat <= 24 saut retourMenuHorloge - si etat <= 27 saut retourMenuMenuHorloge -retourRien: +etatParaHJour: + etat <- 25 + compteur <- 0 ; TODO Récupérer le jour + call afficherJour reti -retourVeille: - etat <- 0 + +etatParaHJourC: + call boundJour + ; TODO Sauvegarde + call afficherJour reti -retourMenuAssoc: - etat <- 2 + +etatParaHHeur: + etat <- 26 + compteur <- 0 ; TODO Récupérer l'heure + call afficherHeur reti -retourMenuJAssoc: - etat <- etat - 7 + +etatParaHHeurC: + call boundHeur + ; TODO Sauvegarde + call afficherHeur reti -retourMoinsUn: - etat <- etat - 1 + +etatParaHMinu: + etat <- 27 + compteur <- 0 ; TODO Récupérer la minute + call afficherMinu reti -retourMenuHorloge: - etat <- 21 + +etatParaHMinuC: + call boundMinu + ; TODO Sauvegarde + call afficherMinu reti -retourMenuMenuHorloge: - etat <- etat - 3 + +; Interruption boutons + +incrementer: + inc compteur + si etat = 0 saut etatVeilleHeur + si etat = 1 saut etatVeilleTemp + 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 + +decrementer: + dec compteur + si etat = 0 saut etatVeilleHeur + si etat = 1 saut etatVeilleTemp + si etat = 2 saut etatMenuHorloge + si etat <= 9 saut etatMenuJoursC + si etat <= 16 saut etatParaJoursC + si etat = 17 saut etatMenuAssoc + si etat = 18 saut etatParaTJourC + si etat = 19 saut etatMenuTJour + si etat = 20 saut etatParaTNuitC + si etat = 21 saut etatMenuTNuit + si etat = 22 saut etatMenuHMinu + si etat = 23 saut etatMenuHJour + si etat = 24 saut etatMenuHHeur + 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 + +valider: + si etat <= 1 saut etatMenuAssoc + si etat = 2 saut etatMenuJours + si etat <= 9 saut etatParaJours + si etat <= 16 saut etatMenuJoursS + si etat = 17 saut etatParaTJour + si etat = 18 saut etatMenuTJour + si etat = 19 saut etatParaTNuit + si etat = 20 saut etatMenuTNuit + si etat = 21 saut etatMenuHJour + si etat = 22 saut etatParaHJour + si etat = 23 saut etatMenuHJour + si etat = 24 saut etatParaHHeur + si etat = 25 saut etatMenuHHeur + si etat = 26 saut etatParaHMinu + si etat = 27 saut etatMenuHMinu + reti ; Ne devrait pas arriver, mais permet d'éviter les dégâts + +retour: + si etat <= 1 saut rien + si etat = 2 saut etatVeilleHeur + si etat <= 9 saut etatMenuAssoc + si etat <= 16 saut etatMenuJoursR + si etat = 17 saut etatVeilleHeur + si etat = 18 saut etatMenuTJour + si etat = 19 saut etatVeilleHeur + si etat = 20 saut etatMenuTNuit + si etat = 21 saut etatVeilleHeur + si etat <= 24 saut etatMenuHorloge + si etat = 25 saut etatMenuHJour + si etat = 26 saut etatMenuHHeur + si etat = 27 saut etatMenuHMinu + reti ; Ne devrait pas arriver, mais permet d'éviter les dégâts + +rien: reti ; Interruption Watchdog watchdog: - ; Met à jour les registres de temps, active agir10s ou agirHeure si nécessaire + ; Met à jour les registres de temps, active agir10s ou agirHeur si nécessaire reti ; Interruption ADC -- libgit2 0.21.2