Algorithme 4.89 KB
;Algorithme de tutorat de microp

;Initialisation

.equ DDRA = 0x01
.equ PORTA = 0x02
.equ DDRB = 0x03
.equ PORTB = 0x05
.equ DDRC = 0x07
.equ PORTC = 0x08
.equ PIND = 0x09
.equ DDRD = 0x0A
.equ PINF = 0x0F
.equ DDRF = 0x10


.equ EIMSK = 0x1D
.equ EICRA = 0x69
.equ RAMEND = 0x21FF
.equ SPH = 0x3E
.equ SPL = 0x3D

.equ ADMUX = 0x7C
.equ ADCSRB = 0x7B
.equ ADCSRA = 0x7
.equ ADCL = 0x78 
.equ ADCH = 0x79



.org 0x0000:
	JMP debut

.org 0x0002:
	JMP HMJN

.org 0x0004:
	JMP MH

.org 0x0006:
    JMP CAN
	
.org 0x002E:
	JMP inc_heure



debut:
	DDRA = 0x00
	DDRB = 0xFF
	DDRC = 0x0F
	DDRD = 0x00
	DDRF = 0x00
	OCR0A->250
        OCR0B = 0x00
        TCCR0A = 0xC2
        TCCR0B = 0x04
        TIMSK0 = 0x02
        TIFR0 = 0x02
	EIMSK = 0x03
	EICRA = 0x06
	EICRB = 0x00
	LDI R28, low(RAMEND)
	LDI R29, high(RAMEND)
	OUT SPL, R28
	OUT SPH, R29
	ADMUX <- 0b00010000
	ADCSRB <- 0b00000000
	ADCSRA <- 0b11100001
	tab jour_lettre_1 = [70, 6E, 6E, 1C, 7C, 5B, 7E]
	tab jour_lettre_2 = [7C, 6C, 73, 73, 73, 6F, 0C]
	tab chiffre = [7E, 0C, 37, 17, 4D, 5B, 7B, 0E, 7F, 5F]
	tab heure_jour = [08, 08, 08, 08, 08, 08, 08]
	tab minute_jour = [00, 00, 00, 00, 00 ,00, 00]
	tab heure_nuit = [20, 20, 20, 20, 20, 20, 20]
	tab minute_nuit = [00, 00, 00, 00, 00 ,00, 00]
	T_nuit=15		;Température de la nuit
	T_jour=20		;Température du jour
	Jour=0          ;Jour actuel
	Heure=0			;Heure actuelle
	Minute=0		;Minute actuelle
	Seconde=0		;Seconde actuelle
	Top_seconde=0   ;Tops de timer0
	chauffe=0		;Etat actuel : 1 si en chauffage, 0 sinon
	T=0		;Température actuelle lue par le capteur

    sei
	JMP boucle_inf

boucle_inf:
	CALL reglage	;Fonction de réglage de la chaudière
	if(Seconde/10 == 0 || Seconde/10 == 2 // Seconde/10 == 4)
	    Afficher(Heure:Minute)
	else
	    Afficher(T)
	call tempo
	JMP boucle_inf

HMJN:
	cli
	
	WHILE(!HMJN)
		if(plus)
			Jour=(Jour+1)%7	;Ajout de 1
		if(moins)
			Jour=(Jour-1)%7	;Retrait de 1
		Afficher(jour_lettre_1[Jour], jour_lettre_2[Jour])	;Affichage du jour
	
	WHILE(!HMJN)
		if(plus)
			Heure=(Heure+1)%24	;Ajout de 1
		if(moins)
			Heure=(Heure+23)%24	;Retrait de 1
		Afficher(Heure:Minute)	;Affichage de l'heure
		
	WHILE(!HMJN)
		if(plus)
			Minute=(Minute+1)%60	;Ajout de 1
		if(moins)
			Minute=(Minute+59)%60	;Retrait de 1
		Afficher(Heure:Minute)		;Affichage de l'heure
		
	WHILE(!HMJN)
		if(plus)
			if(T_jour<30.5)
				T_jour=T_jour+0.5	;Ajout par pas de 0.5
		if(moins)
			if(T_jour>5)
				T=jour=T_jour-0.5	;Retrait par pas de 0.5
		Afficher(T_jour)			;Affichage de la temperature du jour
	
	WHILE(!HMJN)
		if(plus)
			if(T_nuit<30.5)
				T_nuit=T_nuit+0.5	;Ajout par pas de 0.5
		if(moins)
			if(T_nuit>5)
				T=nuit=T_nuit-0.5	;Retrait par pas de 0.5
		Afficher(T_nuit)			;Affichage de la temperature de la nuit
	
	sei
	RETI
	
MH:
	cli
	Jour_aff=0
	while(!ok)
		if(MH)
		    sei
			RETI
		if(plus)
			Jour_aff=(Jour_aff+1)%7
		if(moins)
			Jour_aff=(Jour_aff-1)%7
		afficher jour_lettre_1[Jour_aff]
		afficher jour_lettre_2[Jour_aff]
		call tempo
		
	while(!ok)
		if(MH)
		    sei
			RETI
		if(plus)
			heure_jour[Jour_aff]=(heure_jour[Jour_aff]+1)%24
		if(moins)
			heure_jour[Jour_aff]=(heure_jour[Jour_aff]-1)%24
		afficher heure_jour[Jour_aff]
		afficher minute_jour[Jour_aff]
		call tempo
		
	while(!ok)
		if(MH)
		    sei
			RETI
		if(plus)
			minute_jour[Jour_aff]=(minute_jour[Jour_aff]+1)%24
		if(moins)
			minute_jour[Jour_aff]=(minute_jour[Jour_aff]-1)%24
		afficher heure_jour[Jour_aff]
		afficher minute_jour[Jour_aff]
		call tempo
		
	while(!ok)
		if(MH)
		    sei
			RETI
		if(plus)
			heure_nuit[Jour_aff]=(heure_nuit[Jour_aff]+1)%24
		if(moins)
			heure_nuit[Jour_aff]=(heure_nuit[Jour_aff]-1)%24
		afficher heure_nuit[Jour_aff]
		afficher minute_nuit[Jour_aff]
		call tempo
		
	while(!ok)
		if(MH)
		    sei
			RETI
		if(plus)
			minute_nuit[Jour_aff]=(minute_nuit[Jour_aff]+1)%24
		if(moins)
			minute_nuit[Jour_aff]=(minute_nuit[Jour_aff]-1)%24
		afficher heure_nuit[Jour_aff]
		afficher minute_nuit[Jour_aff]
		call tempo
		
	sei
	RETI
				
reglage:
    H_reglage_jour=Heure_jour[Jour]:Minute_jour[Jour];
    H_reglage_nuit=Heure_nuit[Jour]:Minute_nuit[Jour];
	CALL CAN		;Lecture de la valeur du capteur de température
	if(Heure:Minute<H_reglage_jour || Heure:Minute>H_reglage_nuit)
		if(T_nuit-T>0.5 && !chauffe)
			chauffe=1
		else if(T_nuit-T<-0.5 && chauffe)
			chauffe=0
	else
		if(T_jour-T>0.5 && !chauffe)
			chauffe=1
		else if(T_jour-T<-0.5 && chauffe)
			chauffe=0
	if(chauffe)
	    allumage chaudiere
	else
	    extinction chaudiere
	RET
	

CAN:
    capteur<-ADCH    ; On charge la valeur de la sonde dans capteur
    T = 5 + capteur/10      ; 5+0 <= T <= 5+255/10=30.5
    
    
    
    
inc_heure:
    Top_seconde=Top_seconde+1
    if(Top_seconde==250)
        Top_seconde=0
	    Seconde=Seconde+1
	    if(Seconde==60)
	    	Seconde=0
	    	Minute=Minute+1
	    	if(Minute==60)
	    		Minute=0
	    		Heure=Heure+1
	    		if(Heure==24)
	    			Heure=0
	    			Jour=(Jour+1)%7
	call reglage
	RETI
	
	
tempo:
	wait 4ms
	RET