principal.txt
3.59 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
; É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 ; TODO
; ; A, B, C, D, E, F, G, H ; TODO
; 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 <- 0x63 ; 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:
reti
decrementer:
reti
valider:
si mode <= 1 saut validerVeille
si mode = 2 saut validerAssoc
si mode <= 9 saut validerAJour
si mode <= 16 saut validerParaAJour
si mode = 17 saut validerTJour
si mode = 18 saut validerParaTJour
si mode = 19 saut validerTNuit
si mode = 20 saut validerParaTNuit
si mode = 21 saut validerHorloge
si mode <= 24 saut validerMenuHorloge
si mode <= 27 saut validerParaHorloge
reti
; TODO Affichages
validerVeille:
mode <- 2
validerAssoc:
mode <- 3
validerAJour:
mode <- mode + 7
reti
validerParaAJour:
; TODO
reti
validerTJour:
mode <- 18
reti
validerParaTJour:
; TODO
mode <- 17
reti
validerTNuit:
mode <- 20
reti
validerParaTNuit:
; TODO
mode <- 19
reti
validerHorloge:
mode <- 22
reti
validerMenuHorloge:
mode <- mode + 3
reti
validerParaHorloge:
mode <- mode - 3
reti
retour:
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