principal.txt 5.21 KB
; É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