Commit 2444e3258e010a50028f8ea15092b673c7911f0c

Authored by thubert
2 parents b2e56564 1d126a93

Merge branch 'master' of archives.plil.fr:gbontoux/s6-mp-tutorat

Showing 2 changed files with 140 additions and 11 deletions   Show diff stats
@@ -42,8 +42,8 @@ On peut passer d'un menu à son menu hiérarchiquement supérieur (parent) avec @@ -42,8 +42,8 @@ On peut passer d'un menu à son menu hiérarchiquement supérieur (parent) avec
42 ## États 42 ## États
43 - 0→1 : Veille (Heure, Température) 43 - 0→1 : Veille (Heure, Température)
44 - 2 : Menu Association mode ↔ Heure de la semaine 44 - 2 : Menu Association mode ↔ Heure de la semaine
45 -- 3→9 : Menu jours (Lundi - Vendredi)  
46 -- 10→16 : Paramétrage des jours (Lundi - Vendredi) 45 +- 3→9 : Menu jours (Lundi - Dimanche)
  46 +- 10→16 : Paramétrage des jours (Lundi - Dimanche)
47 - 17 : Menu température du mode jour 47 - 17 : Menu température du mode jour
48 - 18 : Paramétrage température du mode jour 48 - 18 : Paramétrage température du mode jour
49 - 19 : Menu température du mode nuit 49 - 19 : Menu température du mode nuit
@@ -58,7 +58,7 @@ Les accès à la RAM nécessitant plus d'instructions et donc étant plus gourma @@ -58,7 +58,7 @@ Les accès à la RAM nécessitant plus d'instructions et donc étant plus gourma
58 58
59 - **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. 59 - **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.
60 - **1 registre (dont 6 bits inutilisés)** : afficheur 7 segment actuellement en cours d'affichage. Cela permet d'alterner les 4 dans l'ordre. <!-- TODO Voir si c'est pas possible d'utiliser le timer pour stocker ces infos --> 60 - **1 registre (dont 6 bits inutilisés)** : afficheur 7 segment actuellement en cours d'affichage. Cela permet d'alterner les 4 dans l'ordre. <!-- TODO Voir si c'est pas possible d'utiliser le timer pour stocker ces infos -->
61 -- **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. 61 +- **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
62 62
63 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. 63 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.
64 64
@@ -32,15 +32,14 @@ @@ -32,15 +32,14 @@
32 .def d2 = r20 ; Digit 2 32 .def d2 = r20 ; Digit 2
33 .def d1 = r20 ; Digit 1 33 .def d1 = r20 ; Digit 1
34 .def d0 = r20 ; Digit 0 (tout à droite) 34 .def d0 = r20 ; Digit 0 (tout à droite)
  35 +.def compteur = r20 ; Utilisé pour différentes choses
  36 +.def tempo = r20 ; Utilisé pour différentes choses mais très brièvement
35 37
36 ; Vecteurs d'interruptions 38 ; Vecteurs d'interruptions
37 39
38 .org 0x000 ; Vecteur RESET 40 .org 0x000 ; Vecteur RESET
39 jmp debut 41 jmp debut
40 42
41 -.org 0x003A ; ADC  
42 - jmp adc  
43 -  
44 .org 0x0002 ; INT0 43 .org 0x0002 ; INT0
45 jmp valider 44 jmp valider
46 45
@@ -53,17 +52,24 @@ @@ -53,17 +52,24 @@
53 .org 0x0008 ; INT3 52 .org 0x0008 ; INT3
54 jmp decrementer 53 jmp decrementer
55 54
  55 +.org 0x0018 ; Watchdog
  56 + jmp watchdog
  57 +
  58 +.org 0x003A ; ADC
  59 + jmp adc
  60 +
  61 +
56 .org 0x0080 62 .org 0x0080
57 63
58 ; Tableaux de la mémoire du programme 64 ; Tableaux de la mémoire du programme
59 65
60 afficheurNombres: 66 afficheurNombres:
61 - .DB 0x7E, 0x0C, 0x37, 0x9F, 0x4D, 0xDB, 0xFB, 0x0E, 0xFF, 0xDF ; TODO Ce sont pas les bonnes valeurs 67 + .DB 0x3F, 0x30, 0x6D, 0x79, 0x72, 0x5B, 0x5F, 0x31, 0x7F, 0x7B
62 ; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 68 ; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
63 69
64 -;afficheurLettres:  
65 -; .DB ; TODO  
66 -; ; A, B, C, D, E, F, G, H ; TODO 70 +afficheurLettres:
  71 + .DB 0x3F, 0x30, 0x6D, 0x79, 0x72, 0x5B, 0x5F, 0x31, 0x7F, 0x7B, 0x77, 0x40, 0x4c, 0xfc, 0xcf, 0xc7, 0x40, 0xf6, 0x04, 0x3c, 0x40, 0x0E, 0x37, 0x54, 0x5c, 0x40, 0x40, 0x44, 0x5b, 0x4e, 0x1c, 0x1c, 0x40, 0x40, 0x40, 0x40, 0x63
  72 + ; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, °
67 73
68 ; Programme 74 ; Programme
69 75
@@ -72,7 +78,8 @@ debut: @@ -72,7 +78,8 @@ debut:
72 SREG <- 0b10000000 78 SREG <- 0b10000000
73 79
74 ; Watchdog 80 ; Watchdog
75 - WDTCSR <- 81 + WDTCSR <- 0b00010000
  82 + WDTCSR <- 0b01000111
76 83
77 ; Interruptions externes 84 ; Interruptions externes
78 EIMSK <- 0b00001111 85 EIMSK <- 0b00001111
@@ -91,6 +98,21 @@ boucle: @@ -91,6 +98,21 @@ boucle:
91 jmp boucle 98 jmp boucle
92 99
93 ; Fonctions 100 ; Fonctions
  101 +afficherHeure:
  102 + ; Affiche l'heure actuelle
  103 + temp <-
  104 + ret
  105 +
  106 +
  107 +afficherTemperature:
  108 + ; Considère le registre compteur comme une température et l'affiche
  109 + d0 <- afficheurLettre[26] ; Sigle °
  110 + d1 <- afficheur[compteur%10]
  111 + temp <- compteur + 50
  112 + d2 <- afficheur[(temp/10)%10]
  113 + d3 <- afficheur[temp/100]
  114 + ret
  115 +
94 agir10s: 116 agir10s:
95 ; Initialise une lecture ADC 117 ; Initialise une lecture ADC
96 ; Met à jour l'état de veille (si on est en état veille) 118 ; Met à jour l'état de veille (si on est en état veille)
@@ -103,15 +125,122 @@ agirHeure: @@ -103,15 +125,122 @@ agirHeure:
103 ; Interruption boutons 125 ; Interruption boutons
104 126
105 incrementer: 127 incrementer:
  128 + si etat <= 1 saut reti
  129 + si etat = 2 saut etatMenuJour
  130 + si etat < 9 saut etatPlusUn
  131 + si etat = 9 saut etatLundi
  132 + si etat = 17 saut etatMenuNuit
  133 + si etat = 18 saut TODO
  134 + si etat = 19 saut etatMenuHorloge
  135 + si etat = 20 saut TODO
  136 + si etat = 21 saut etatMenuAssoc
  137 + si etat < 24 saut etatPlusUn
  138 + si etat = 24 saut etatMenuHorlogeJour
106 reti 139 reti
107 140
108 decrementer: 141 decrementer:
  142 + si etat <= 1 saut reti
  143 + reti
  144 +
  145 +etatMenuAssoc:
  146 + etat <- 2
  147 + reti
  148 +etatMenuJour:
  149 + etat <- 17
  150 + reti
  151 +etatMenuNuit:
  152 + etat <- 19
  153 + reti
  154 +etatMenuHorloge
  155 + etat <- 21
  156 + reti
  157 +etatPlusUn:
  158 + etat <- etat + 1
  159 + reti
  160 +etatLundi:
  161 + etat <- 3
  162 + reti
  163 +etatMenuHorlogeJour:
  164 + etat <- 22
  165 + reti
  166 +reti:
109 reti 167 reti
110 168
111 valider: 169 valider:
  170 + si etat <= 1 saut validerVeille
  171 + si etat = 2 saut validerAssoc
  172 + si etat <= 9 saut validerAJour
  173 + si etat <= 16 saut validerParaAJour
  174 + si etat = 17 saut validerTJour
  175 + si etat = 18 saut validerParaTJour
  176 + si etat = 19 saut validerTNuit
  177 + si etat = 20 saut validerParaTNuit
  178 + si etat = 21 saut validerHorloge
  179 + si etat <= 24 saut validerMenuHorloge
  180 + si etat <= 27 saut validerParaHorloge
  181 + reti
  182 + ; TODO Affichages
  183 +validerVeille:
  184 + etat <- 2
  185 +validerAssoc:
  186 + etat <- 3
  187 +validerAJour:
  188 + etat <- etat + 7
  189 + reti
  190 +validerParaAJour:
  191 + ; TODO
  192 + reti
  193 +validerTJour:
  194 + etat <- 18
  195 + reti
  196 +validerParaTJour:
  197 + ; TODO
  198 + etat <- 17
  199 + reti
  200 +validerTNuit:
  201 + etat <- 20
  202 + reti
  203 +validerParaTNuit:
  204 + ; TODO
  205 + etat <- 19
  206 + reti
  207 +validerHorloge:
  208 + etat <- 22
  209 + reti
  210 +validerMenuHorloge:
  211 + etat <- etat + 3
  212 + reti
  213 +validerParaHorloge:
  214 + etat <- etat - 3
112 reti 215 reti
113 216
114 retour: 217 retour:
  218 + si etat <= 1 saut retourRien
  219 + si (etat = 2 ou etat = 17 ou etat = 19 ou etat = 21) saut retourVeille
  220 + si etat <= 9 saut retourMenuAssoc
  221 + si etat <= 16 saut retourMenuJAssoc
  222 + si etat <= 21 saut retourMoinsUn
  223 + si etat <= 24 saut retourMenuHorloge
  224 + si etat <= 27 saut retourMenuMenuHorloge
  225 +retourRien:
  226 + reti
  227 +retourVeille:
  228 + etat <- 0
  229 + reti
  230 +retourMenuAssoc:
  231 + etat <- 2
  232 + reti
  233 +retourMenuJAssoc:
  234 + etat <- etat - 7
  235 + reti
  236 +retourMoinsUn:
  237 + etat <- etat - 1
  238 + reti
  239 +retourMenuHorloge:
  240 + etat <- 21
  241 + reti
  242 +retourMenuMenuHorloge:
  243 + etat <- etat - 3
115 reti 244 reti
116 245
117 ; Interruption Watchdog 246 ; Interruption Watchdog