+;*******************************************************************************
+;* Système d'Injection et d'Allumage Électronique *
+;* Version : 01 *
+;* Auteur : Hugo Villeneuve *
+;* *
+;* 10 mars 1999 *
+;*******************************************************************************
+
+ $MOD52 ; Micro-contrôleur Atmel AT89S8252
+
+
+;*******************************************************************************
+;* Définition des constantes *
+;*******************************************************************************
+
+TOS EQU 60h ; Adresse du dessus de la pile.
+CR EQU 0Dh ; Code ASCII pour un retour de chariot.
+LF EQU 0Ah ; Code ASCII pour un changement de ligne
+
+
+;*******************************************************************************
+;* Définition des variables *
+;*******************************************************************************
+ BSEG
+ ORG 20h
+C_FLAG: DBIT 1
+Z_FLAG: DBIT 2
+N_FLAG: DBIT 3 ; Utilisé par la sous-routine MULT8_16
+SIGNE: DBIT 4 ; Utilisé pour l'interpolation.
+
+ DSEG
+ ORG 30h
+PERIODE2: DS 1 ; Période pour une rotation du vilebrequin, sur 24 bits.
+PERIODE1: DS 1
+PERIODE0: DS 1
+POSITION_VILB: DS 1 ; Renseignement sur la position actuelle du vilebrequin (zones 0,1 ou 2).
+VITESSE_RPM: DS 2 ; Vitesse de rotation du moteur en RPM.
+INDEX_RPM: DS 1 ; Index de 8 bits pour l'adressage des colonnes de la table d'allumage.
+INDEX_MAP: DS 1 ; Index de 8 bits pour l'adressage des lignes de la table d'allumage.
+ANGLE: DS 1 ; Angle d'allumage calculé à partir de la table.
+BAT: DS 2 ; Voltage de la batterie.
+MAT: DS 2 ; Manifold Air Temperature.
+CLT: DS 2 ; Coolant Temperature.
+TPS: DS 2 ; Throttle Position Sensor.
+MAP: DS 2 ; Manifold Absolute Pressure.
+EGO: DS 2 ; Exhaust Gas-Oxygen Sensor.
+CAN6: DS 2 ; Canal #6 du convertisseur AN.
+CAN7: DS 2 ; Canal #7 du convertisseur AN.
+GAMMA: DS 2 ; Rapport Air/Carburant.
+LSB_CAN: DS 1 ; Octet de poids faible de la conversion Analogique-Numérique.
+MSB_CAN: DS 1 ; Octet de poids fort de la conversion Analogique-Numérique.
+NOMBRE4: DS 1 ; Stockage des codes ASCII pour les conversions.
+NOMBRE3: DS 1
+NOMBRE2: DS 1
+NOMBRE1: DS 1
+NOMBRE0: DS 1
+C3: DS 1 ; Accumulateur C de 32 bits pour les calculs mathématiques.
+C2: DS 1
+C1: DS 1
+C0: DS 1
+D3: DS 1 ; Accumulateur D de 32 bits pour les calculs mathématiques.
+D2: DS 1
+D1: DS 1
+D0: DS 1
+TMP6: DS 1 ; Variables temporaires utilisées pour les calculs mathématiques.
+TMP5: DS 1 ; FAIRE LE MÉNAGE VARIABLES NON UTILISEES!!!
+TMP4: DS 1
+TMP3: DS 1
+TMP2: DS 1
+TMP1: DS 1
+TMP0: DS 1
+VAR0: DS 1
+VAR1: DS 1
+VAR2: DS 1
+
+
+;*******************************************************************************
+;* Définition des régistres spécifiques au AT89S8252 *
+;*******************************************************************************
+SPCR DATA 0D5h ; SPCR - SPI Control Register
+SPSR DATA 0AAh ; SPSR - SPI Status Register
+SPIF EQU 10000000b ; Masque pour le drapeau SPI.
+WCOL EQU 01000000b ; Masque pour le drapeau Write Collision.
+SPDR DATA 086h ; SPDR - SPI Data Register
+
+
+;*******************************************************************************
+;* Vecteurs d'interruptions *
+;*******************************************************************************
+ CSEG
+
+ ORG 0000h ; Vecteur d'interruption du RESET.
+ JMP DEBUT
+
+ ORG 0003h ; Vecteur pour l'interruption EXTERNE 0.
+ JMP VILEBREQUIN
+
+ ORG 000Bh ; Vecteur pour l'interruption du TIMER 0.
+ JMP DEBUT
+
+ ORG 0013h ; Vecteur pour l'interruption EXTERNE 1.
+ JMP DEBUT
+
+ ORG 001Bh ; Vecteur pour l'interruption du TIMER 1.
+ JMP DEBUT
+
+ ORG 0023h ; Vecteur pour l'interruption du Port série.
+ JMP DEBUT
+
+ ORG 002Bh ; Vecteur pour l'interruption du TIMER 2.
+ JMP DEBUT
+
+
+;*******************************************************************************
+;* Début du programme principal *
+;*******************************************************************************
+ ORG 0033h
+
+DEBUT:
+ MOV SP,#TOS ; Initialisation de la pile.
+ CALL INITIALISATION
+ ; il ne faut pas modifier la valeur de P1.0!!!
+
+ICI:
+ NOP
+ NOP
+ NOP
+ NOP
+
+ JMP ICI
+
+
+;*******************************************************************************
+;* Délai *
+;*******************************************************************************
+DELAI: MOV TMP0,#016h ; Délai de 1/2 seconde.
+B3: MOV A,#0
+B2: MOV B,#0
+B1: DJNZ B,B1
+ DJNZ ACC,B2
+ DJNZ TMP0,B3
+ RET
+
+
+
+;*******************************************************************************
+;* INTERRUPTION *
+;*******************************************************************************
+VILEBREQUIN:
+ RETI
+
+
+;*******************************************************************************
+;* Initialisation *
+;*******************************************************************************
+INITIALISATION: MOV SPCR,#01000100b ; Interruption SPI désactivée;
+ ; Activation du port SPI;
+ ; Ordre des transferts : MSB en premier;
+ ; Opération en mode escalve (SLAVE);
+ ; Polarité de l'horloge : niveau bas si inactif.
+ ; Phase de l'horloge : transfert sur front montant.
+ MOV TH0,#2
+ MOV TL0,#55h
+ SETB TCON.4 ; Timer 0 ON.
+ SETB TCON.6 ; Timer 1 ON.
+ MOV TMOD,#00010001B ; Initialisation des timers 0 et 1 en timers de
+ ; 16 bits, incrémentés par l'horloge interne
+ ; Chaque timer est incrémenté tant que le bit correspondant de
+ ; TCON est à 1 (TCON.4 et TCON.6).
+ RET
+
+
+
+ END
+
+
+
+
+