principal.txt
5.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
; Équivalences
.equ PINA = 0x00
.equ DDRA = 0x01
.equ PORTA = 0x02
.equ PINB = 0x03
.equ DDRB = 0x04
.equ PORTB = 0x05
.equ SREG = 0x3F
.equ WDTCSR = 0x60
.equ EIMSK = 0x3D
.equ EICRA = 0x69
.equ EICRB = 0x6A
.equ ADMUX = 0x7C
.equ ADCSRB = 0x7B
.equ ADCSRA = 0x7A
.equ ADCH = 0x79
.equ SPH = 0x3E
.equ SPL = 0x3D
; Nommage des registres utilisés
.def etat = r19
.def reference = r20
.def d3 = r20 ; Digit 3 (tout à gauche)
.def d2 = r20 ; Digit 2
.def d1 = r20 ; Digit 1
.def d0 = r20 ; Digit 0 (tout à droite)
.def compteur = r20 ; Utilisé pour différentes choses
.def tempo = r20 ; Utilisé pour différentes choses mais très brièvement
; Vecteurs d'interruptions
.org 0x000 ; Vecteur RESET
jmp debut
.org 0x0002 ; INT0
jmp valider
.org 0x0004 ; INT1
jmp retour
.org 0x0006 ; INT2
jmp incrementer
.org 0x0008 ; INT3
jmp decrementer
.org 0x0018 ; Watchdog
jmp watchdog
.org 0x003A ; ADC
jmp adc
.org 0x0080
; Tableaux de la mémoire du programme
afficheurNombres:
.DB 0x3F, 0x30, 0x6D, 0x79, 0x72, 0x5B, 0x5F, 0x31, 0x7F, 0x7B
; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
afficheurLettres:
.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
; 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, °
; Programme
debut:
; Configuration des composants
SREG <- 0b10000000
; Watchdog
WDTCSR <- 0b00010000
WDTCSR <- 0b01000111
; Interruptions externes
EIMSK <- 0b00001111
EICRA <- 0b11111111 ; TODO Oscillations annulables ?
EICRB <- 0b00000000
; ADC
ADMUX <- 0b01110000
ADCSRB <- 0b00001011
ADCSRA <- 0b10011101 ; TODO Auto-trigger ?
sei
; Initialisation des valeurs
boucle:
sleep
jmp boucle
; Fonctions
afficherHeure:
; Affiche l'heure actuelle
temp <-
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]
d3 <- afficheur[temp/100]
ret
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:
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
reti
decrementer:
si etat <= 1 saut reti
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:
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
reti
; TODO Affichages
validerVeille:
etat <- 2
validerAssoc:
etat <- 3
validerAJour:
etat <- etat + 7
reti
validerParaAJour:
; TODO
reti
validerTJour:
etat <- 18
reti
validerParaTJour:
; TODO
etat <- 17
reti
validerTNuit:
etat <- 20
reti
validerParaTNuit:
; TODO
etat <- 19
reti
validerHorloge:
etat <- 22
reti
validerMenuHorloge:
etat <- etat + 3
reti
validerParaHorloge:
etat <- etat - 3
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:
reti
retourVeille:
etat <- 0
reti
retourMenuAssoc:
etat <- 2
reti
retourMenuJAssoc:
etat <- etat - 7
reti
retourMoinsUn:
etat <- etat - 1
reti
retourMenuHorloge:
etat <- 21
reti
retourMenuMenuHorloge:
etat <- etat - 3
reti
; Interruption Watchdog
watchdog:
; Met à jour les registres de temps, active agir10s ou agirHeure si nécessaire
reti
; Interruption ADC
adc:
si ADCH > reference + 5 saut eteindreChaudiere
si ADCH < reference - 5 saut allumerChaudiere
reti
allumerChaudiere:
PORTC <- 0x01
reti
eteindreChaudiere:
PORTC <- 0x00
reti
; Interruption timer
timer:
; Affiche le digit suivant sur l'afficheur 7seg
reti