;********************************************************
;*             Allumage électronique pour VT            *
;*                Avec afficheur LCD                    *
;*                     Version 1.52                      *
;*                   Fabrice BAUDIN                     *
;********************************************************


.INCLUDE "1200def.inc"

;*********** Définition des interuption *****************
	
	rjmp RESET
	rjmp EXT_INTO	
	rjmp TIM0_OVF
	rjmp RESET

;************ Définition des registres ******************

;Retard allumage:

.def Ccourbe=r0		;Comptage d'impultion (20 uS)divisé par B
.def Ccourbe1=r31       ;MSB du comptage
.def Ccourbe2=r1        ;LSB du comptage
.def C1=r2              ;MSB de décomptage avant allumage
.def C2=r3              ;LSB de décomptage avant allumage


;Prise vitesse:
.def CV=r30              ;Comptage d'inpultion (20 uS)divisé par 15
.def CVB=r29             ;Inverse de la vitesse de rotation (V=20000/CVB)
.def CVL=r4             ;Image CVB Bloqué pour la lecture de vitesse
.def CV2=r5
.def CVC=r28


;Rampe d'allumage:

.def B=r27              ;Coefficient diviseur pour courbe (X/B - A)
.def A=r26              ;Constante de la courbe

;Afficheur:

.def Raff=r25           ;Donnés pour afficheur
.def Rdonne=r24         ;Donnés pour sous programme afficheur
 
;Division (attention il faut un diviseur supérieur à MDividande):

.def RSD=r6            ;Résultat division
.def MDividande=r23      ;MSB Dividande, et reste à la fin division
.def LDividande=r22      ;LSB Dividande
.def Diviseur=r21       ;Diviseur
.def Cdiv=r20            ;Compteur division
.def control=r11

.def Cenvoie=r14         ;Temporisation envoie afficheur

;Travail:

.def RA=r19
.def RB=r18
.def RC=r7
.def rd=r8
.def RF=r9

;mémoire registre status register:

.def sregsave=r10
 
;mémloire pour longueur allumage:

.def Callu=r12

;selection rampe:

.def rampe=r16


;Statut:

.def statut=r17          ;bit0: =0 moteur éteind, =1 moteur allumé
                         ;bit1: =0 pas d'allumage, =1 demande allumage
                         ;bit2: =0 
                         ;bit3: =0 temp<30°, =1 temp>30° (non utilisé)
                         ;bit4: =0 temp<120°,=1 temp>120°
                         ;bit5: =0
                         ;bit6: =0 Pas de rupture, =1 rupture
                         ;bit7: =0 Allumage immédiat inactif, =1 Allumage immédiat actif

;************ Définition des Constantes ******************

label:

;V: vitesse de fin de rampe (=200000/V)
;B: Diviseur de la rampe 
;A: constante de la rampe
;D: Diviseur pour angle constant aprés V

;Rampe0 (Rodage ou température<70°C):

.equ V0=33       ;6000 tr.min (capteur à 35°)
.equ B0=111      ;8 à 1000 tr.min 
.equ A0=44       ;35 à 6000 tr.min 
.equ D0=255	 ;35° max 255=Allumage immédiat

;Rampe1:

.equ V1=36     ;5500 tr.min
.equ B1=109	;8 à 1000 tr.min 
.equ A1=49	;35 à 5500 tr.min 
.equ D1=255     ;35 max 255=infini

;Rampe2:

.equ V2=40      ;5000 tr.min
.equ B2=106	;8 à  1000 tr.min
.equ A2=55	;35 à 5000 tr.min 
.equ D2=255	;35 Max  255=infini

;Rampe3:

.equ V3=44      ;4500 tr.min
.equ B3=103	;8° à 1000 tr.min
.equ A3=63	;35 à 4500Tr.min  	
.equ D3=255	;35 Max 255=infini

;Rampe4:

.equ V4=50      ;4000 tr.min
.equ B4=100	;8° à 1000 tr.min
.equ A4=74	;35° à 4000Tr.min 
.equ D4=255	;35° Max 255=infini



;Rupture pour moteur<30°C (non utilisé):

.equ Krupt70=28 ;rupture à 7000 tr.min

;Rupture normal:

.equ Krupt=20   ;rupture à 10000 tr min


.CSEG                   ;Programme



;***********************************************************************
;*                        Programme Principal                         **
;***********************************************************************


;*************** configuration du micro contrôleur **********************

RESET:	ldi RB,$3F
        out ddrb,RB    ;definition du port B 
	ldi RB,$5B	;****************pin 3 en dortie test*****************
	out ddrd,RB    ;définition du port D (Entrée portd3,configuré en sortie pour contrôle)

	
	ldi RB,3
	out mcucr,RB    ;déclenchement intéruption sur front montant
	

     	ldi RB,2
        out timsk,RB    ;intéruption timer
	ldi RB,146
        out tcnt0,RB    ;préchargement du timer

       

;************** initialisation afficheur ********************************

	
       
        ldi RB,4           ;mise en route
LOOP:	rcall DELAY 
        ldi Raff,3
	rcall envoie
        dec RB
	brne lOOP


	ldi Raff,2         ;passage en mode 4bits
	rcall envoie

	rcall envoie       ;définition 2 lignes, caractére 5*7
	ldi Raff,8
	rcall envoie

	clr Raff           ;curseur off+ecran off
	rcall envoie
	ldi Raff,8
	rcall envoie

	clr Raff           ;Raz écran
	rcall envoie
        ldi Raff,1
	rcall envoie
	rcall DELAY
	rcall DELAY
	
	clr Raff           ;Adresse+1 aprés écriture
	rcall envoie
	ldi Raff,6
	rcall envoie

	clr Raff           ;écran on
	rcall envoie
        ldi Raff,12
	rcall envoie




;*************** écriture de l'arriére plan ******************************

	ldi Rdonne,1  ;écriture C ligne 2
	rcall ADRL2
	ldi Raff,20
	rcall envoie
	ldi Raff,19
	rcall envoie

	ldi Rdonne,3  ;écriture °C ligne 1
	rcall ADRL1
	ldi Raff,29
	rcall envoie
	ldi Raff,31
	rcall envoie
	ldi Raff,20
	rcall envoie
	ldi Raff,19
	rcall envoie

	ldi Rdonne,8 ;écriture  00 Tr.Mn Ligne 2
	rcall ADRL2
	ldi Rdonne,0
	rcall ECRCH
	rcall ECRCH
	ldi Raff,31
	rcall envoie
	ldi Raff,30
	rcall envoie
	ldi Raff,21
	rcall envoie
	ldi Raff,20
	rcall envoie
	ldi Raff,23
	rcall envoie
	ldi Raff,18
	rcall envoie
	rcall envoie
	ldi Raff,30
	rcall envoie
	ldi Raff,20
	rcall envoie
	ldi Raff,29
	rcall envoie
	Ldi Raff,22
	rcall envoie
	Ldi Raff,30
	rcall envoie

;********** Enregistrement préchargement courbe *********************

	sbis pinb,6   ;si bouton actif au démarrage alors demande choix pour mémorisation courbe initial  
	rjmp chargement
	
	Ldi Rdonne,6
	Rcall ADRL1        ;mise en place du pointeur L1
	Ldi Raff,20	;C
	rcall envoie
	Ldi Raff,19
	rcall envoie    
	ldi Raff,22	;o
	rcall envoie
	ldi Raff,31
	rcall envoie
	Ldi Raff,23	;u
	rcall envoie
	Ldi Raff,21
	rcall envoie	
	ldi Raff,23	;r   ;Message Courbe
	rcall envoie
	ldi Raff,18
	rcall envoie	
	ldi Raff,22	;b
	rcall envoie
	ldi Raff,18
	rcall envoie
	ldi Raff,22	;e
	rcall envoie
	ldi Raff,21
	rcall envoie
	


		
suiteg:	sbic pinb,6	      ;Relachement du bouton pour suite
	rjmp suiteg
crramp:	clr rampe
Choi2:	sbis pinb,7
	rjmp choi
	inc rampe

suite2:	sbic pinb,7
	rjmp suite2
	cpi rampe,5
	breq crramp
	
choi:	ldi Rdonne,2	  ;ecriture choix courbe
	rcall adrl2       ;adresse ligne 2
	mov Rdonne,rampe
	rcall ecrch
	sbic pinb,6
	rjmp eng
	rjmp choi2

eng:    sbic pinb,6
	rjmp eng
	Clr rb		;pointeur adresse eeprom à 0 pour ecriture mémoire
	out EEAR,rb
	out EEDR,rampe	
	ldi rb,2 	;demande écriture
	out EECR,rb
ecree:	sbic EECR,1
	rjmp ecree	;attente fin écriture


	
chargement:	clr rb		;lecture mémoire adresse 00
	out EEAR,rb
	inc rb
	out EECR,rb	;demande lecture
lecee:	sbic EECR,0	;attente lecture valide
	rjmp lecee
	in rampe,eedr	;valeur de la rampe dans le registre


	
;********************* validation interuptions *********************

	
	ldi RB,64
        out gimsk,RB     ;Interuption extérieur
	ldi rb,1
	out TCCR0,RB     ;mise en route du timer
	ldi rb,128
	out SREG,rb      ;validation des interuptions
	


;*********************** Ecriture vitesse **************************

DEBUT1:
	
	
   	ldi Mdividande,7           ; 2000/CVL = Vitesse en centaines de tours
	ldi Ldividande,208                                                       
	mov Diviseur,CVL                                                       
	rcall Divi

	
	
	Clr Mdividande             ;division du résultat par cent
	mov Ldividande,RSD
	ldi Diviseur,100
	Rcall DIVI
	

	mov Ldividande,Mdividande  ;Conservation du reste
	ldi Rdonne,5
	rcall adrl2                ;adresse ligne 2
	
	mov rdonne,RSD
	bst rsd,0                  ;flag supérieur à 10000
	rcall ECRCH                ;ecriture des centaines

	clr Mdividande             ;division du reste par dix
	ldi Diviseur,10
	rcall DIVI

	mov Rdonne,RSD
	rcall ECRCH                 ;ecriture des dizaines

	mov Rdonne,Mdividande
	Rcall ECRCH                 ;ecriture des unitées



;********************** Ecriture barres graphe  ou messages ************


	sbrs statut,0       ;Si moteur arrêter
	rjmp conv0
        sbrc statut,6		;Si ruptur
	rjmp conv0
	sbrc statut,4       ; si température > 120
Conv0:	rjmp conv5	    ;suite message stop


	
	
	Ldi Rdonne,6		
	Rcall ADRL1         ;mise en place du pointeur L1


	brtc conv4
	ldi mdividande,10
	mov rsd,mdividande
	


	
conv4:	Ldi mdividande,10
	sub mdividande,RSD
	cpi mdividande,10
	breq conv2
	ldi Rdonne,31
conv1:	Rcall ECRGRA
	dec RSD
	brne conv1
conv2:  brts conv5
	ldi Rdonne,30
conv3:  rcall ECRGRA
	Dec mdividande
	brne conv3
	rjmp CO            ;suite programme

conv5:	
	Ldi Rdonne,6
	Rcall ADRL1        ;mise en place du pointeur L1
	
	Ldi Raff,18
	rcall envoie
	rcall envoie
	rcall envoie
	rcall envoie
	rcall envoie
	rcall envoie	
	ldi Raff,21	;S    ;Message """STOP"""
	rcall envoie
	ldi Raff,19
	rcall envoie
	ldi Raff,21
	rcall envoie
	ldi Raff,20
	rcall envoie
	ldi Raff,20
	rcall envoie
	ldi Raff,31
	rcall envoie
	ldi Raff,21
	rcall envoie
	ldi Raff,16
	rcall envoie
	ldi Raff,18
	rcall envoie
	rcall envoie
	rcall envoie
	rcall envoie
	rcall envoie
	rcall envoie


	cbr statut,32


;********************** Ecriture selection rampe *******************

CO:	sbis pinb,6
	rjmp plus
	dec rampe
suite3:	sbic pinb,6
	rjmp suite3
plus:	sbis pinb,7
	rjmp ecrcou
	inc rampe
suite4:	sbic pinb,7
	rjmp suite4
	cpi rampe,5
	brlo ecrcou
	clr rampe


ECRCOU: ldi Rdonne,2	  ;ecriture choix courbe
	rcall adrl2       ;adresse ligne 2
	mov rdonne,rampe
	rcall ECRCH



;********************** mesure et ecriture température **************


	Cbi portd,6    ;validation lecture température
	ldi Raff,8
	clr Ldividande
	ldi Rdonne,0
	rcall ADRL1    ;Mise en place du pointeur afficheur
	
temp1:  sbi portd,4    ;horloge à 1
	nop
	nop
	clc            ;clear carry
	sbic pind,5 
	sec            ;si out=1 alors carry=1
	rol Ldividande ;rotation gauche avec carry
	cbi portd,4    ;horloge à zero
	dec Raff
	brne temp1     ;si RB=0 alors suite mesure
	SBI Portd,6


	cpi ldividande,20
        brsh forme1
	clr ldividande
	rjmp temp3


forme1:	cpi ldividande,56
	brsh forme2
	mov mdividande,ldividande
	lsr mdividande
	lsr ldividande 
	add ldividande,mdividande
	rjmp temp3 

forme2:
	lsr ldividande
        ldi Raff,28
	add ldividande,Raff
      
	
temp3:	cbr statut,8		;gestion des drapeaux de dépassement température
	cbr statut,16           
	cpi ldividande,30	
	brlo temp4
	sbr statut,8		;si température > à 30 °C
	cpi ldividande,120
	brlo temp4		;si température < à 120
	sbr statut,16

temp4:	clr Mdividande		;convertion BCD avec envoie température
	ldi Diviseur,100
	rcall DIVI
	MOV Rdonne,RSD          ;écriture des centaines
	rcall ECRCH
	MOV ldividande,mdividande
	clr mdividande
	ldi Diviseur,10
	rcall divi
	mov rdonne,rsd          ;écriture des dizaines
	rcall ecrch
	mov Rdonne,Mdividande   ;écriture unité
	rcall ECRCH

	

;*********************** Fin du programme principal *****************


	rjmp DEBUT1


;********************* routines afficheur **************************

envoie: out portb,Raff                 ;envoie donné à l'afficheur
	clr cenvoie
	nop
	nop
	nop
	sbi portb,5
	dec cenvoie
	nop
	nop
        nop
        cbi portb,5
loop2:  dec Cenvoie
	brne loop2
	ret


DELAY:  ldi ldividande,255
	mov C1,ldividande               ;temporisation de 40 ms
        mov C2,ldividande
delay2: dec C1
	brne delay2
	mov C1,ldividande
	dec C2
	brne delay2
	ret

ECRCH:  Ldi Raff,19                     ;écriture de chiffres
	rcall envoie
	ldi raff,16
	add Raff,Rdonne
	rcall envoie
	ret

ADRL1:  Ldi Raff,8                      ;adresse ligne 1
	rcall envoie
	mov Raff,Rdonne
	rcall envoie
	ret

ADRL2:  Ldi Raff,12                     ;adresse ligne 2
	rcall envoie
	mov Raff,Rdonne
	rcall envoie
	ret

ECRGRA: Ldi Raff,31                     ;pour écriture barre graphe
	rcall envoie
	mov Raff,Rdonne
	rcall envoie
	ret


;********************** Division ***********************************


DIVI:   
	clc	
	
	ldi	cdiv,9	                 ;compteur
div1:	dec	cdiv		         ;decrement compteur
	brne	div2		         ;si fin
	ret			         ;return
div2:	rol	Ldividande	         ;décalage à gauche de Ldividande
	rol	Mdividande	         ;décalge à gauche de Mdividande
	brcc	div4		         ;si pas de dépassement de mdividande
	sub 	Mdividande,diviseur      ;Sinon validé la soustraction
	rjmp    div3
div4:	sub	Mdividande,diviseur
	brcc	div3		         ;si résultat négatif
	Add	Mdividande,diviseur      ;restauration de Mdividande
	clc			         ;clear carry 
	rol rsd
	rjmp	div1		          
div3:	sec			         ;set carry 
	rol rsd			         ;décalage à gauche du résultat
	rjmp	div1




;************************* interuption horloge ***********************


TIM0_OVF:
	
	ldi RB,146
        out tcnt0,RB            ;chargement du timer
	in sregsave,sreg	;mémorisation du registre du cpu


	Sbis portd,0            ;impultion d'allumage de 300 micro secondes
	rjmp moteur		;Si pas d'allumage alors controle rotation moteur
	ldi rb,15
	inc Callu
	cp callu,rb
	brne moteur
	clr Callu
	Cbi portd,0	        ;extinction de l'allumage

moteur:	sbrs statut,0
	rjmp finhor             ;si moteur éteint fin intéruption

	sbrs statut,1
	rjmp mesure             ;vérification de demande d'allumage
        dec C1
	breq ovf1               ;si C1 = 0 alors décomptage C2
	rjmp mesure	        ;si C1 non vide mesure
ovf1:  	dec c2
	brmi allu
	rjmp mesure
allu:	Cbi portd,3             ; *******test sur pin 3*******
	Sbi portd,0             ;allumage cylindre 1
	Cbr statut,2            ;demande allumage invalide

mesure: Ldi RA,10
	add Ccourbe,RA          ;horloge*10 sur rampe ou * 5
	cpc Ccourbe,B           ;division mécanique par B
	brlo vitesse
	sub Ccourbe,B
	inc Ccourbe1
	brne vitesse
	inc Ccourbe2


vitesse: inc CV			;Mesure de la vitesse pour compte tour
	cpi CV,15               ;horloge divisée par 15
	brne finhor
	inc CVB
	brne ok
	ser cvb
ok:	
	clr CV
	Inc cv2			;controle de la vitesse inférieur à 250 tr
	LDI ra,4
	Cp Cv2,RA
	brne finhor
 	CLR CV2
	inc CVC
	cpi CVC,200
	brlo finhor            ;Si vitesse inferieur à 250 tr.minute
	cbr statut,1           ;moteur éteind
	sbr statut,64          ;rupture

finhor: 
	out sreg,sregsave	;chargement du registre cpu
	reti
   


;*********************** interuption capteur *******************************


EXT_INTO: in sregsave,sreg


	sbi portd,3            ;**********test sur pin 3**********
	clr A
	sbrs statut,0	       ;si moteur éteind
	rjmp rupture           ;alors rupture
	mov cvl,cvb		
	cpi CVB,Krupt
	Brlo rupture           ;rupture à 10000 tours
	cbr statut,64          ;pas de rupture
	cpi rampe,0	       ;test choix rampe
	breq ramp0
	cpi rampe,1
	breq ramp1
	cpi rampe,2
	breq ramp2
	cpi rampe,3
	breq ramp3
	rjmp ramp4

rupture: 
	sbr statut,64         ;activation du drapeau de rupture
	rjmp iniallu
	

ramp0:	
	ldi B,D0
	cpi CVB,V0
	brlo calcul
	ldi B,B0
	ldi A,A0
	rjmp trou

ramp1:  
	ldi B,D1
	cpi CVB,V1
	brlo calcul
	ldi B,B1
	ldi A,A1
	rjmp trou

ramp3:  
	ldi B,D3
	cpi CVB,V3
	brlo calcul
	ldi B,B3
	ldi A,A3
	rjmp trou

ramp2:  
	ldi B,D2
	cpi cvb,V3
	brlo calcul
	ldi B,B2
	ldi A,A2
	rjmp trou

ramp4:  
	ldi B,D4
	cpi cvb,V4
	brlo calcul
	ldi B,B4
	ldi A,A4


Trou:	
	sbrs statut,7		;évite les défauts d'allumage du à l'allumage instantanée
	rjmp calcul
	cbr statut,128		;on fait une mesure avant de passé en allumage sur rampe
	rjmp impimé		;sinon allumage immédiat


calcul: 
	cpi B,255            ;contrôle de demande d'allumage immédiat
	brne calcul2	     ;si non calcul du retard à effectuer
	sbr statut,128       ;impultion imédiate active
	
Impimé:	clr C1			;configuration des registres de décomptage pour un allumage immédiat
	inc C1
	clr C2	             ; impultion immédiate
	rjmp impul

calcul2: 
	sub Ccourbe1,A      ;calcul du retard à l'impultion
	brne cal3		; si Cbourbe1 = 0
	inc Ccourbe1		;Alors Ccurbe1=1
	
cal3:	
	brcc cal2		;si si Ccourbe 1 <A
	dec Ccourbe2		;Alors Ccourbe2=Ccourbe2-1
	

	
	
cal2:   
	mov C1,Ccourbe1       ;Rentrés des donné dans le registre de décomptage
	mov C2,Ccourbe2
 

	
impul:  sbr statut,2         ;validation demande allumage

	
	


iniallu: 
	sbr statut,1         ;moteur marche
	clr Ccourbe		;mise à zero des registres de mesures
	clr Ccourbe1
	clr Ccourbe2
	clr CV
	clr CVB
	clr cv2
	clr cvc


finallu: ldi rb,3
	 out mcucr,RB       ;déclenchement intéruption sur front montant
	 out sreg,sregsave	;chargement du registre du CPU
         reti
		

