; É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