Commit 2444e3258e010a50028f8ea15092b673c7911f0c
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 | 42 | ## États |
43 | 43 | - 0→1 : Veille (Heure, Température) |
44 | 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 | 47 | - 17 : Menu température du mode jour |
48 | 48 | - 18 : Paramétrage température du mode jour |
49 | 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 | 58 | |
59 | 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 | 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 | 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 | ... | ... |
principal.txt
... | ... | @@ -32,15 +32,14 @@ |
32 | 32 | .def d2 = r20 ; Digit 2 |
33 | 33 | .def d1 = r20 ; Digit 1 |
34 | 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 | 38 | ; Vecteurs d'interruptions |
37 | 39 | |
38 | 40 | .org 0x000 ; Vecteur RESET |
39 | 41 | jmp debut |
40 | 42 | |
41 | -.org 0x003A ; ADC | |
42 | - jmp adc | |
43 | - | |
44 | 43 | .org 0x0002 ; INT0 |
45 | 44 | jmp valider |
46 | 45 | |
... | ... | @@ -53,17 +52,24 @@ |
53 | 52 | .org 0x0008 ; INT3 |
54 | 53 | jmp decrementer |
55 | 54 | |
55 | +.org 0x0018 ; Watchdog | |
56 | + jmp watchdog | |
57 | + | |
58 | +.org 0x003A ; ADC | |
59 | + jmp adc | |
60 | + | |
61 | + | |
56 | 62 | .org 0x0080 |
57 | 63 | |
58 | 64 | ; Tableaux de la mémoire du programme |
59 | 65 | |
60 | 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 | 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 | 74 | ; Programme |
69 | 75 | |
... | ... | @@ -72,7 +78,8 @@ debut: |
72 | 78 | SREG <- 0b10000000 |
73 | 79 | |
74 | 80 | ; Watchdog |
75 | - WDTCSR <- | |
81 | + WDTCSR <- 0b00010000 | |
82 | + WDTCSR <- 0b01000111 | |
76 | 83 | |
77 | 84 | ; Interruptions externes |
78 | 85 | EIMSK <- 0b00001111 |
... | ... | @@ -91,6 +98,21 @@ boucle: |
91 | 98 | jmp boucle |
92 | 99 | |
93 | 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 | 116 | agir10s: |
95 | 117 | ; Initialise une lecture ADC |
96 | 118 | ; Met à jour l'état de veille (si on est en état veille) |
... | ... | @@ -103,15 +125,122 @@ agirHeure: |
103 | 125 | ; Interruption boutons |
104 | 126 | |
105 | 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 | 139 | reti |
107 | 140 | |
108 | 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 | 167 | reti |
110 | 168 | |
111 | 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 | 215 | reti |
113 | 216 | |
114 | 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 | 244 | reti |
116 | 245 | |
117 | 246 | ; Interruption Watchdog | ... | ... |