; =================================================================================== ; Durée de parcours d'une balle sur une longueur de 101,6mm - Quarz 16 MHz ; Doumai Copyleft ; =================================================================================== LIST P=16F628, F=INHX8M, r=dec include "P16F628.inc" __CONFIG _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _HS_OSC ; Do not show warnings ERRORLEVEL -224 ; Bouton poussoir RAZ sur Reset ; RB0 à RB3 Afficheur LCD mode 4 bits #DEFINE Dep PORTB,6 ; Faisceau départ #DEFINE Arr PORTB,7 ; Faisceau arrivée ; #DEFINE E PORTA,3 ; E Afficheur LCD #DEFINE RS PORTA,2 ; RS Afficheur LCD ; cblock 0x20 Chiffre : 1 ; Chiffre en cours d'émission I : 1 ; Comptage d'usage général J : 1 ; Comptage d'usage général K : 1 ; Comptage d'usage général SE0 : 1 ; Micro seconde unités SE1 : 1 ; Micro seconde dizaines SE2 : 1 ; Micro seconde centaines SE3 : 1 ; Milli seconde unité SE4 : 1 ; Milli seconde dizaines SE : 1 ; Variable temporaire pour écriture sur afficheur endc ; ; ================================================================================== ORG 0x0000 goto main main: bcf STATUS,RP0 ; Bank 0 movlw 0x07 ; Désactivation du mode comparateur et movwf CMCON ; passe en mode Entrées / Sorties ; bsf STATUS,RP0 ; Bank 1 movlw 0xC0 ; Deux cellules opto en entrée movwf TRISB ; Les autres en sortie clrf TRISA ; PortA en sortie bcf STATUS,RP0 ; Bank 0 ; ; ================================================================================== ; Initialisation de l'afficheur en mode 4 bits ; ================================================================================== bcf RS ; Mode instruction movlw 0x03 movwf PORTB ; Mode 8 bits call ImpulsE ; Impulsion sur E ; movlw 41 movwf I T5 call Temp ; Temporisation > 4,1 ms decfsz I,F goto T5 ; movlw 0x03 movwf PORTB ; Fonction Set call ImpulsE ; Impulsion sur E call Temp ; movlw 0x03 movwf PORTB ; Fonction Set call ImpulsE ; Impulsion sur E call Temp ; movlw 0x02 movwf PORTB ; Mode 4 bits call ImpulsE ; Impulsion sur E call Temp ; movlw 0x02 movwf PORTB ; Mode 1 ligne, caractère 7x5 call ImpulsE ; Impulsion sur E call Temp movlw 0x00 movwf PORTB ; call ImpulsE ; Impulsion sur E call Temp ; movlw 0x00 movwf PORTB ; Display OFF call ImpulsE ; Impulsion sur E call Temp movlw 0x08 movwf PORTB ; call ImpulsE ; Impulsion sur E call Temp ; movlw 0x00 movwf PORTB ; Display ON call ImpulsE ; Impulsion sur E call Temp movlw 0x0C movwf PORTB ; call ImpulsE ; Impulsion sur E call Temp ; movlw 0x00 movwf PORTB ; Entry mode set call ImpulsE ; Impulsion sur E call Temp movlw 0x06 movwf PORTB ; call ImpulsE ; Impulsion sur E call Temp ; ; --------------------------------------- ; RAZ de la durée ; --------------------------------------- clrf SE0 clrf SE1 clrf SE2 clrf SE3 clrf SE4 ; ; ---------------------------------------------------------------------------------- ; Si un capteur n'est pas élairé, pas d'affichage ; Si les 2 capteurs sont éclairés ; RAZ du Timer et afichage de 00 000 µs BAT 64 ; ---------------------------------------------------------------------------------- init: btfss Dep ; Teste la cellule de départ (1 si éclairée) goto init ; La cellule n'est pas éclairée ; btfss Arr ; Teste la cellule d'arrivée goto init ; La cellule n'est pas éclairée ; clrf TMR1L ; RAZ du Timer 1 clrf TMR1H ; clrf SE0 ; RAZ du temps affiché clrf SE1 clrf SE2 clrf SE3 clrf SE4 call Affich ; Affichage 00 000 µs ; movlw 0x24 ; Prescaler 1/4, Oscillateur externe désactivé movwf T1CON ; Osc interne, TMRON=0 comtage inhibé ; ; ---------------------------------------------------------------------------------- ; Attente de la coupure du faisceau de départ puis comptage Timer1 ; ---------------------------------------------------------------------------------- Sect1 btfsc Dep ; Teste la cellule de départ (0 si faisceau coupé) goto Sect1 ; Le faisceau laser n'est pas coupé ; ; Prescaler 1/4, Quartz 16 MHz, bsf T1CON,TMR1ON ; Comptage sur le Timer1 à 1 MHz ; ; ---------------------------------------------------------------------------------- ; Attente de la coupure du faisceau d'arrivée et arrêt du comptage Timer1 ; ---------------------------------------------------------------------------------- Sect2 btfsc Arr ; Teste la cellule d'arrivée (0 si faisceau coupé) goto Sect2 ; Le faisceau laser n'est pas coupé ; bcf T1CON,TMR1ON ; Arrêt du comptage sur le Timer1 ; ; ---------------------------------------------------------------------------------- ; Transcodage de la durée Hexa dans TMR1 vers BCD (SE4 à SE0) ; ---------------------------------------------------------------------------------- ; RAZ des variables clrf SE0 ; RAZ des variables de la durée clrf SE1 clrf SE2 clrf SE3 clrf SE4 ; ; Transcodage de TMR1L ( octet de poids faible ) Conv00 movf TMR1L,W ; Teste si TMR1L = 0 sublw 0 btfsc STATUS,Z goto Conv10 ; Fin de la conversion de TMR1L ; decf TMR1L,F ; TMR1L = TMR1L - 1 incf SE0,F ; SE0 = SE0 + 1 ; movf SE0,W ; sublw 10 ; W = SE0 - 10 btfss STATUS,Z ; Skip si SE0 = 10 goto Conv01 ; SE0 <> 10 clrf SE0 ; SE0 = 10 donc SE0 = 0 incf SE1,F ; SE1 = SE1 + 1 ; movf SE1,W ; sublw 10 ; W = SE1 - 10 btfss STATUS,Z ; Skip si SE1 = 10 goto Conv01 ; SE1 <> 10 clrf SE1 ; SE1 = 10 donc SE1 = 0 incf SE2,F ; SE2 = SE2 + 1 ; Conv01 goto Conv00 ; La conversion de TMR1L n'est pas terminée ; ; Transcodage de TMR1H ( octet de poids fort ) ; On rajoute 256 pour chaque décrémentation de TMR1H ; Conv10 movf TMR1H,W ; Teste si TMR1H = 0 sublw 0 btfsc STATUS,Z goto Conv20 ; Fin de la conversion de TMR1H ; decf TMR1H,F ; TRM1H = TMR1H - 1 ; movlw 6 addwf SE0,F ; SE0 = SE0 + 6 (256) movf SE0,W ; Si SE0 > 9 sublw 9 btfsc STATUS,Z goto Conv11 ; Sinon sauter à Conv11 btfsc STATUS,C goto Conv11 ; Sinon sauter à Conv11 movlw 6 ; Alors SE0 = SE0 + 6 addwf SE0,F ; ( différence entre base 16 et base 10 ) bcf SE0,4 ; Garde le quartet de poids faible incf SE1,F ; SE1 = SE1 + 1 : Fin Si ; Conv11 movlw 5 addwf SE1,F ; SE1 = SE1 + 5 (256) movf SE1,W ; Si SE1 > 9 sublw 9 btfsc STATUS,Z goto Conv12 ; Sinon sauter à Conv12 btfsc STATUS,C goto Conv12 ; Sinon sauter à Conv12 movlw 6 ; Alors SE1 = SE1 + 6 addwf SE1,F ; ( différence entre base 16 et base 10 ) bcf SE1,4 ; Garde le quartet de poids faible incf SE2,F ; SE2 = SE2 + 1 : Fin Si ; Conv12 movlw 2 addwf SE2,F ; SE2 = SE2 + 2 (256) movf SE2,W ; Si SE2 > 9 sublw 9 btfsc STATUS,Z goto Conv13 ; Sinon sauter à Conv13 btfsc STATUS,C goto Conv13 ; Sinon sauter à Conv13 movlw 6 ; Alors SE2 = SE2 + 6 addwf SE2,F ; ( différence entre base 16 et base 10 ) bcf SE2,4 ; Garde le quartet de poids faible incf SE3,F ; SE3 = SE3 + 1 : Fin Si ; Conv13 movf SE3,W ; sublw 10 ; W = SE3 - 10 btfss STATUS,Z ; Skip si SE3 = 10 goto Conv14 ; SE3 <> 10 clrf SE3 ; SE3 = 10 donc SE3 = 0 incf SE4,F ; SE4 = SE4 + 1 ; Conv14 goto Conv10 ; Conv20 call Affich ; Affichage de la durée ; ---------------------------------------- ; Affichage mémorisé ; ---------------------------------------- Fin nop ; Attente d'une nouvelle action goto Fin ; sur le bouton poussoir RAZ ( Reset ) ; ;****************************************** ; Temporisation de 100 µs ;****************************************** Temp movlw 128 movwf K Temp1 decfsz K,F goto Temp1 return ;****************************************** ; Impulsion sur la broche E de l'afficheur ;****************************************** ImpulsE bsf E ; E=1 call Temp bcf E ; E=0 call Temp return ;****************************************** ; Affichage ; On ajoute 0x30 au chiffre en cours ; pour obtenir son code ASCII ; Affichage du type 12 564 µs BAT 64 ;****************************************** Affich bcf RS ; Mode Instruction call Temp ; movlw 0x00 movwf PORTB ; Mode Home call ImpulsE ; Impulsion sur E call Temp movlw 0x02 movwf PORTB ; call ImpulsE ; Impulsion sur E call Temp ; movlw 50 ; Attente > 4,8 ms movwf I ; pour certains afficheurs T2 call Temp ; dans le mode Home decfsz I,F goto T2 ; bsf RS ; Mode Données call Temp ; ; Affichage de ms ; movlw 0x30 ; Pour le caractère ASCII addwf SE4,F ; SE4 = SE4 + 0x30 swapf SE4,F ; Quartet de poids fort sur faible movf SE4,W movwf PORTB ; Caractère sur le PORTB call ImpulsE ; Impulsion sur E call Temp swapf SE4,F ; Quartet de poids faible sur faible movf SE4,W movwf PORTB ; Caractère sur le PORTB call ImpulsE ; Impulsion sur E call Temp ; movlw 0x30 ; Pour le caractère ASCII addwf SE3,F ; SE3 = SE3 + 0x30 swapf SE3,F ; Quartet de poids fort sur faible movf SE3,W movwf PORTB ; Caractère sur le PORTB call ImpulsE ; Impulsion sur E call Temp swapf SE3,F ; Quartet de poids faible sur faible movf SE3,W movwf PORTB ; Caractère sur le PORTB call ImpulsE ; Impulsion sur E call Temp ; ; Affichage d'un espace ; movlw " " ; Espace entre les ms et les µs movwf SE ; swapf SE,F ; Quartet de poids fort sur faible movf SE,W movwf PORTB ; Caractère sur le PORTB call ImpulsE ; Impulsion sur E call Temp swapf SE,F ; Quartet de poids faible sur faible movf SE,W movwf PORTB ; Caractère sur le PORTB call ImpulsE ; Impulsion sur E call Temp ; ; Affichage de µs ; movlw 0x30 ; Pour le caractère ASCII addwf SE2,F ; SE2 = SE2 + 0x30 swapf SE2,F ; Quartet de poids fort sur faible movf SE2,W movwf PORTB ; Caractère sur le PORTB call ImpulsE ; Impulsion sur E call Temp swapf SE2,F ; Quartet de poids faible sur faible movf SE2,W movwf PORTB ; Caractère sur le PORTB call ImpulsE ; Impulsion sur E call Temp ; movlw 0x30 ; Pour le caractère ASCII addwf SE1,F ; SE1 = SE1 + 0x30 swapf SE1,F ; Quartet de poids fort sur faible movf SE1,W movwf PORTB ; Caractère sur le PORTB call ImpulsE ; Impulsion sur E call Temp swapf SE1,F ; Quartet de poids faible sur faible movf SE1,W movwf PORTB ; Caractère sur le PORTB call ImpulsE ; Impulsion sur E call Temp ; movlw 0x30 ; Pour le caractère ASCII addwf SE0,F ; SE0 = SE0 + 0x30 swapf SE0,F ; Quartet de poids fort sur faible movf SE0,W movwf PORTB ; Caractère sur le PORTB call ImpulsE ; Impulsion sur E call Temp swapf SE0,F ; Quartet de poids faible sur faible movf SE0,W movwf PORTB ; Caractère sur le PORTB call ImpulsE ; Impulsion sur E call Temp ; ; Affichage d'un espace ; movlw " " ; Espace entre la durée et l'unité movwf SE ; swapf SE,F ; Quartet de poids fort sur faible movf SE,W movwf PORTB ; Caractère sur le PORTB call ImpulsE ; Impulsion sur E call Temp swapf SE,F ; Quartet de poids faible sur faible movf SE,W movwf PORTB ; Caractère sur le PORTB call ImpulsE ; Impulsion sur E call Temp ; ; Affichage de µs ; movlw 0xE4 ; Affichage du symbole µ movwf SE ; "µ" n'est pas associé à 0xE4 swapf SE,F ; Quartet de poids fort sur faible movf SE,W movwf PORTB ; Caractère sur le PORTB call ImpulsE ; Impulsion sur E call Temp swapf SE,F ; Quartet de poids faible sur faible movf SE,W movwf PORTB ; Caractère sur le PORTB call ImpulsE ; Impulsion sur E call Temp ; movlw "s" ; Affichage de s pour seconde movwf SE ; swapf SE,F ; Quartet de poids fort sur faible movf SE,W movwf PORTB ; Caractère sur le PORTB call ImpulsE ; Impulsion sur E call Temp swapf SE,F ; Quartet de poids faible sur faible movf SE,W movwf PORTB ; Caractère sur le PORTB call ImpulsE ; Impulsion sur E call Temp ; ; Affichage d'un espace ; movlw " " ; Espace entre la durée et BAT 64 movwf SE ; swapf SE,F ; Quartet de poids fort sur faible movf SE,W movwf PORTB ; Caractère sur le PORTB call ImpulsE ; Impulsion sur E call Temp swapf SE,F ; Quartet de poids faible sur faible movf SE,W movwf PORTB ; Caractère sur le PORTB call ImpulsE ; Impulsion sur E call Temp ; ; Affichage de BAT 64 ; movlw "B" ; Affichage de B movwf SE ; swapf SE,F ; Quartet de poids fort sur faible movf SE,W movwf PORTB ; Caractère sur le PORTB call ImpulsE ; Impulsion sur E call Temp swapf SE,F ; Quartet de poids faible sur faible movf SE,W movwf PORTB ; Caractère sur le PORTB call ImpulsE ; Impulsion sur E call Temp ; movlw "A" ; Affichage de A movwf SE ; swapf SE,F ; Quartet de poids fort sur faible movf SE,W movwf PORTB ; Caractère sur le PORTB call ImpulsE ; Impulsion sur E call Temp swapf SE,F ; Quartet de poids faible sur faible movf SE,W movwf PORTB ; Caractère sur le PORTB call ImpulsE ; Impulsion sur E call Temp ; movlw "T" ; Affichage de T movwf SE ; swapf SE,F ; Quartet de poids fort sur faible movf SE,W movwf PORTB ; Caractère sur le PORTB call ImpulsE ; Impulsion sur E call Temp swapf SE,F ; Quartet de poids faible sur faible movf SE,W movwf PORTB ; Caractère sur le PORTB call ImpulsE ; Impulsion sur E call Temp ; movlw " " ; Affichage de l'espace movwf SE ; swapf SE,F ; Quartet de poids fort sur faible movf SE,W movwf PORTB ; Caractère sur le PORTB call ImpulsE ; Impulsion sur E call Temp swapf SE,F ; Quartet de poids faible sur faible movf SE,W movwf PORTB ; Caractère sur le PORTB call ImpulsE ; Impulsion sur E call Temp ; movlw "6" ; Affichage de 6 movwf SE ; swapf SE,F ; Quartet de poids fort sur faible movf SE,W movwf PORTB ; Caractère sur le PORTB call ImpulsE ; Impulsion sur E call Temp swapf SE,F ; Quartet de poids faible sur faible movf SE,W movwf PORTB ; Caractère sur le PORTB call ImpulsE ; Impulsion sur E call Temp ; movlw "4" ; Affichage de 4 movwf SE ; swapf SE,F ; Quartet de poids fort sur faible movf SE,W movwf PORTB ; Caractère sur le PORTB call ImpulsE ; Impulsion sur E call Temp swapf SE,F ; Quartet de poids faible sur faible movf SE,W movwf PORTB ; Caractère sur le PORTB call ImpulsE ; Impulsion sur E call Temp ; return ; ; end