diff --git a/principal.txt b/principal.txt index c9ad41b..c8c4769 100644 --- a/principal.txt +++ b/principal.txt @@ -6,6 +6,9 @@ .equ PINC = 0x06 .equ DDRC = 0x07 .equ PORTC = 0x08 +.equ PING = 0x12 +.equ DDRG = 0x13 +.equ PORTG = 0x14 .equ WDTCSR = 0x60 @@ -38,7 +41,7 @@ .def t2 = r8 ; Jour (3 premiers bits) et Heure (5 derniers bits) .def t1 = r9 ; Minutes .def t0 = r10 ; Secondes / 2 -.def selaff = r11 ; Digit en cours d'affichage +.def tt = r11 ; Watchdog artificiel ; Nommage des adresses RAM utilisées @@ -88,15 +91,16 @@ debut: ; Ports parallèles DDRA@IO <- 0xFF DDRC@IO <- 0xFF + DDRG@IO <- 0xFF ; Watchdog - WDTCSR <- 0b00010000 - WDTCSR <- 0b01000111 + ;WDTCSR <- 0b00010000 + ;WDTCSR <- 0b01000111 ; Timer - TTCR0A@IO <- 0b00000001 - TTCR0B@IO <- 0b00000011 - TMSK0 <- 0b00000001 + TTCR0A@IO <- 0b00000000 + TTCR0B@IO <- 0b00000100 ; Timer toutes les 4ms + TMSK0 <- 0b00000001 ; Interruptions externes EIMSK <- 0b00001111 @@ -109,14 +113,15 @@ debut: ADCSRA <- 0b10011101 ; TODO Auto-trigger ? sei + wdr ; Initialisation des valeurs ; Mercredi 12h34'56 t2 <- 0b01001100 t1 <- 34 t0 <- 28 + tt <- 0 - selaff <- 0b11110111 etat <- 0 call afficherHorloge @@ -211,6 +216,27 @@ afficherDi: ret ; Logique + +agir1s: + inc d0 + ; Met à jour les registres de temps, active agir10s ou agirHeur si nécessaire + inc t0 + si t0-(t0/5)*5 != 0 saut ret ; Continue si on est sur un multiple de 10 secondes + call agir10s + si t0 < 30 saut ret ; Continue si on est sur un multiple de 60 secondes + t0 <- 0 + inc t1 + si t1 < 60 saut ret ; Continue si on est sur un multiple de 60 minutes + t1 <- 0 + inc t2 + si t2 & 0b00011111 >= 7 saut agir1sHeur ; Continue si il est minuit + t2 <- t2 + 0b00100000 ; Jour suivant + t2 <- t2 & 0b11100000 ; Heure à minuit + si t2 >= 0b11100000 alors t2 <- 0b00000000 ; Si on est dimanche soir, on revient à lundi matin +agir1sHeur: + call agirHeur + ret + agir10s: ; Initialise une lecture ADC @@ -244,6 +270,8 @@ boundTemperature: si compteur > 200 alors compteur <- 200 ret +ret: + ret reti: reti @@ -496,22 +524,7 @@ retour: ; Interruption Watchdog watchdog: - ; Met à jour les registres de temps, active agir10s ou agirHeur si nécessaire - inc t0 - si t0-(t0/5)*5 != 0 saut reti ; Continue si on est sur un multiple de 10 secondes - call agir10s - si t0 < 30 saut reti ; Continue si on est sur un multiple de 60 secondes - t0 <- 0 - inc t1 - si t1 < 60 saut reti ; Continue si on est sur un multiple de 60 minutes - t1 <- 0 - inc t2 - si t2 & 0b00011111 >= 7 saut watchdogHeure ; Continue si il est minuit - t2 <- t2 + 0b00100000 ; Jour suivant - t2 <- t2 & 0b11100000 ; Heure à minuit - si t2 >= 0b11100000 alors t2 <- 0b00000000 ; Si on est dimanche soir, on revient à lundi matin -watchdogHeure: - call agirHeur + call agir1s reti ; Interruption ADC @@ -520,21 +533,40 @@ adc: si ADCH < reference - 5 saut allumerChaudiere reti allumerChaudiere: - PORTC <- 0x01 + PORTG@IO <- 0xFF reti eteindreChaudiere: - PORTC <- 0x00 + PORTG@IO <- 0x00 reti ; Interruption timer timer: + ; Sauvegarde de l'état + PUSH temp + PUSH r16 + PUSH r17 + ; Affiche le digit suivant sur l'afficheur 7seg - lsr selaff - si selaff < 0b00001111 alors selaff <- 0b11110111 - PORTC@IO <- selaff - si selaff = 0b11110111 alors PORTA@IO <- d3 - si selaff = 0b01111011 alors PORTA@IO <- d2 - si selaff = 0b00111101 alors PORTA@IO <- d1 - si selaff = 0b00011110 alors PORTA@IO <- d0 + temp <- PORTC@IO + lsr temp + si temp < 0b00001111 alors temp <- 0b11110111 + PORTC@IO <- temp + si temp = 0b11110111 alors PORTA@IO <- d3 + si temp = 0b01111011 alors PORTA@IO <- d2 + si temp = 0b00111101 alors PORTA@IO <- d1 + si temp = 0b00011110 alors PORTA@IO <- d0 + + ; Watchdog artificiel + inc tt + if tt < 244 saut timerRestore + tt <- 0 + call agir1s + +timerRestore: + ; Restoration de l'état + POP r17 + POP r16 + POP temp + reti -- libgit2 0.21.2