;---------------------------------------------------------------------------
; SEQUENCEUR POUR PIC16CXXX
; By Olivier HUMEZ, Mars 1996 V‚lizy France
; Edition 01: juin 1996, remplacement de la led par un buzzer
;---------------------------------------------------------------------------
; Processeur cible:
        List p=16C84, f=inhx8M , n = 255
; Registre de configuration (p2-625)
;       b'111011'
constant  DEBUG = 0    ;1 = mode simulateur (acc‚leration du s‚quenceur)
                       ;0 = mode normal
;---------------------------------------------------------------------------
; RB0 = Bouton poussoir
; RB4 = sortie retardement appareil photo
; RB5 = sortie mode appareil photo
; RA1 = sortie led-buzzer (actif 0)
; RA2 = sortie moteur 1
; RA3 = sortie moteur 2
;---------------------------------------------------------------------------
; Registres Bank 0
        INDF      EQU   00
        TMR0      EQU   01
        PCL       EQU   02
        STATUS    EQU   03
        FSR       EQU   04
        PORTA     EQU   05
        PORTB     EQU   06
        ADRES     EQU   09
        PCLATCH   EQU   0A
        INTCON    EQU   0B
; Registres Bank 1
        OPTIO     EQU   01
        TRISA     EQU   05
        TRISB     EQU   06
;---------------------------------------------------------------------------
; D‚claration
#DEFINE    RP0    STATUS,5    ; bit s‚lection de la Bank Registre
#DEFINE      Z    STATUS,2    ; Zero bit
#DEFINE     DC    STATUS,1    ; Digit Carry bit
#DEFINE      C    STATUS,0    ; Carry bit
#DEFINE   T0IF    INTCON,2    ; Flag IT Timer TMR0
#DEFINE   T0IE    INTCON,5    ; Enable IT Timer TMR0
#DEFINE   GIE     INTCON,7    ; Enable g‚n‚ral ITs
;---------------------------------------------------------------------------
; Initialisation du s‚quenceur
 Constant PERIODE_CYCLE_RAPIDE =  d'4'    ; 4 --> 1,024ms … Fclk=4MHz
                 ; unit‚ = horloge d'entr‚e du TMR0 fix‚e par le prescaler
;
 Constant PERIODE_CYCLE_LENT = d'10'      ; 10 --> 10,24ms
                 ; unit‚ = p‚riode du cycle lent
;---------------------------------------------------------------------------
; Initialisation du registre OPTION:
; bit7 - bit6   - bit5 - bit4 - bit3 - bit2 - bit1 - bit0
; RBPU - INTEDG - T0CS - T0SE - PSA  - PS2  - PS1  - PS0
;
; RPBU = 0  : pullup sur le port B
; INTEDG = 1: Edge de la pin INT = Rising
; T0CS = 0  : Source de TMR0 = Interne
; T0SE = 1  : Edge de la source Externe de TMR0 = Falling
; PSA = 0   : Assignation Prescaler = TMR0
; PS2,PS1,PS0 = 7: Prescaler = 2^(N+1)  (Attention: = 2^N pour le WDOG)
;
 Constant  VAL_OPTION = b'01010111'
;---------------------------------------------------------------------------
; D‚claration RAM
         DEBUT_RAM   EQU  0C
;
         CPTR_CYCLE_LENT     EQU  DEBUT_RAM
         CPTR_TACHE          EQU  DEBUT_RAM + 1
         STATUS_TACHE        EQU  DEBUT_RAM + 2
         STATUS_SAVE_INT     EQU  DEBUT_RAM + 3
         W_SAVE_INT          EQU  DEBUT_RAM + 4
         ETAT_BOUTON         EQU  DEBUT_RAM + 5
         NB_APPUI_BOUTON     EQU  DEBUT_RAM + 6
         TEMPS_DERNIER_APPUI EQU  DEBUT_RAM + 7
         CPTR_BOUTON         EQU  DEBUT_RAM + 8
         POWER_OFF           EQU  DEBUT_RAM + 9
         TEMP_TEMPO1         EQU  DEBUT_RAM + 0A
         TEMP_TEMPO2         EQU  DEBUT_RAM + 0B
         TEMP_TEMPO3         EQU  DEBUT_RAM + 0C
         SENS                EQU  DEBUT_RAM + 0D
         DUREE               EQU  DEBUT_RAM + 0E
         ACTION              EQU  DEBUT_RAM + 0F
         NB_VUES             EQU  DEBUT_RAM + 10
         NB_DELAI            EQU  DEBUT_RAM + 11
         CPTR_DELAI          EQU  DEBUT_RAM + 12
         CPTR1_DELAI         EQU  DEBUT_RAM + 13
         ETAT_LED            EQU  DEBUT_RAM + 14
         TIMER_ACTION        EQU  DEBUT_RAM + 15
         NB_IMPULSION_MODE   EQU  DEBUT_RAM + 16
         NB_DUREE_MOTEUR     EQU  DEBUT_RAM + 17
         ENABLE_BIP_BOUTON   EQU  DEBUT_RAM + 18
;
;        max                 EQU  DEBUT_RAM + 23
;---------------------------------------------------------------------------
; Macro de masquage g‚n‚ral des ITs (page 2-636)
RESET_GIE    MACRO
             local LOOP_GIE
LOOP_GIE     bcf GIE
             btfsc GIE
             goto LOOP_GIE
             ENDM
;---------------------------------------------------------------------------
; Vecteurs
         ORG 00
         goto RESET
         ORG 04
         goto INTERRUPT
;---------------------------------------------------------------------------
; D‚but code
         ORG 05
;---------------------------------------------------------------------------
; TABLE DES TACHES
; Toutes ces tƒches sont interruptibles. La dur‚e (TACHE_A + TACHE_X)
;  ne doit d‚passer la p‚riode du cycle lent que de maniŠre exceptionelle.
; Cette dur‚e ne doit jamais d‚passer la moiti‚ de la dur‚e de r‚p‚tition
;  de la tƒche X.
; La p‚riode de r‚p‚tition de la tƒche 1 correspond … celle du cycle lent.
;-----------------------------
TACHE_1      call TRAITE_BOUTON
             call TRAITE_ACTION
             call COM_MOTEUR
             call TRAITE_LED
             goto FIN_TACHE_1
;-----------------------------
TACHE_2      goto FIN_TACHE_X
;-----------------------------
TACHE_4      goto FIN_TACHE_X
;-----------------------------
TACHE_8      call TRAITE1_BOUTON
             call TRAITE_TIMER_ACTION
             goto FIN_TACHE_X
;-----------------------------
TACHE_16     goto FIN_TACHE_X
;-----------------------------
TACHE_32     call TRAITE_DELAI
             call TRAITE_IMPULSION_MODE
             goto FIN_TACHE_X
;-----------------------------
TACHE_64     nop
             goto FIN_TACHE_X
;-----------------------------
TACHE_128    goto FIN_TACHE_X
;-----------------------------
TACHE_256    call AUTO_POWER_OFF
             goto FIN_TACHE_X
;-----------------------------
;---------------------------------------------------------------------------
INTERRUPT    clrwdt                 ; activation Watchdog
             movwf W_SAVE_INT
             swapf STATUS,0
             bcf RP0
             movwf STATUS_SAVE_INT  ; sauvegardes W et STATUS
             movlw d'256' - PERIODE_CYCLE_RAPIDE
             movwf TMR0
             bcf T0IF
             decfsz CPTR_CYCLE_LENT,1
             goto INT_RETOUR
             goto INT_CYCLE_LENT
INT_RETOUR   swapf STATUS_SAVE_INT,0 ; retour si pas de nouveau cycle lent
             movwf STATUS             ; restauration contexte
             swapf W_SAVE_INT,1
             swapf W_SAVE_INT,0
             retfie
; traitement cycle lent
INT_CYCLE_LENT movlw PERIODE_CYCLE_LENT
             movwf CPTR_CYCLE_LENT
;-----------------------------
; Tƒches Cycle Lent effectu‚e sous IT
;            Pas de tƒche
;-----------------------------
             incf CPTR_TACHE,1
             btfss STATUS_TACHE,0
             goto INT_CYCLE_LENT1
             swapf STATUS_SAVE_INT,0 ; retour si tƒche en cours non termin‚e
             movwf STATUS             ; restauration contexte
             swapf W_SAVE_INT,1
             swapf W_SAVE_INT,0
             retfie   
;
INT_CYCLE_LENT1 bsf STATUS_TACHE,0  ; positionnement bit tƒche en cours
             bsf GIE      ; autorisation ITs
             goto TACHE_1
FIN_TACHE_1  btfss CPTR_TACHE,0
             goto TACHE_2
             btfss CPTR_TACHE,1
             goto TACHE_4
             btfss CPTR_TACHE,2
             goto TACHE_8
             btfss CPTR_TACHE,3
             goto TACHE_16
             btfss CPTR_TACHE,4
             goto TACHE_32
             btfss CPTR_TACHE,5
             goto TACHE_64
             btfss CPTR_TACHE,6
             goto TACHE_128
             btfss CPTR_TACHE,7
             goto TACHE_256
FIN_TACHE_X  RESET_GIE      ; interdiction IT
             bcf STATUS_TACHE,0  ; plus de tƒche en cours
       if DEBUG == 0
             retfie
       else
             return
       endif
;---------------------------------------------------------------------------
RESET        movlw d'25'    ; tempo 250ms
             call TEMPO
;------------------------
; Init port A
             bsf RP0
             movlw b'00000' ; RAx en sortie
             movwf TRISA
             bcf RP0
             movlw b'00010'
             movwf PORTA
;------------------------
; Init port B
             bsf RP0
             movlw b'00000001' ; RB en sortie sauf RB0
             movwf TRISB
             bcf RP0
             clrf PORTB
;------------------------
; init registre option
             bsf RP0
             movlw VAL_OPTION
             movwf OPTIO
             bcf RP0
;------------------------
; Init Application
             call INIT
;------------------------
; Init sequenceur
             movlw d'256' - PERIODE_CYCLE_RAPIDE
             movwf TMR0
             movlw PERIODE_CYCLE_LENT
             movwf CPTR_CYCLE_LENT
             bsf T0IE    ; autorisation IT TMR0
             movlw d'1'
             movwf CPTR_TACHE
             clrf STATUS_TACHE
;------------------------
; Programme principal
             bsf GIE
       if DEBUG == 0
BOUCLE       goto BOUCLE
       else
             bcf T0IE
BOUCLE       call INT_CYCLE_LENT
             clrwdt
             goto BOUCLE
       endif
;---------------------------------------------------------------------------
INIT         movlw b'00000010'
             movwf PORTA   ; init PORTA, commande alimentation (RA4),led OFF
             movlw b'00000000'
             movwf PORTB
; init autopower off
             clrf POWER_OFF
; init TRAITE_BOUTON
             clrf ETAT_BOUTON
             clrf NB_APPUI_BOUTON
             clrf TEMPS_DERNIER_APPUI
             clrf CPTR_BOUTON
; init moteur
             clrf SENS
             clrf DUREE
; init action
             clrf ACTION
; init led
             movlw d'2'
             movwf ETAT_LED
             movlw d'1'
             movwf ENABLE_BIP_BOUTON
;
             clrf TIMER_ACTION
             clrf NB_IMPULSION_MODE
             return
;---------------------------------------------------------------------------
AUTO_POWER_OFF incf POWER_OFF,1
             movf POWER_OFF,0
             sublw d'23'    ; 23 * 2.6 = 1 minute
             skpz
             return
;-------------------------
SWITCH_OFF   RESET_GIE
             movlw b'00000010' ; moteur ‚teind, led allum‚e
             movwf PORTA
             movlw d'50'       ; tempo 0.5 s pour attendre l'arrˆt du moteur
             call TEMPO
             movlw b'00010010' ; moteur ‚teind, led allum‚e, Alim ‚teinte
             movwf PORTA
SWITCH_OFF_1 goto SWITCH_OFF_1
;---------------------------------------------------------------------------
; temporisation de W * 10ms
TEMPO        movwf TEMP_TEMPO1
TEMPO_1      movlw d'13'
             movwf TEMP_TEMPO2
TEMPO_2      movlw d'0'
             movwf TEMP_TEMPO3
             clrwdt
TEMPO_3      decfsz TEMP_TEMPO3,1
             goto TEMPO_3
             decfsz TEMP_TEMPO2,1
             goto TEMPO_2
             decfsz TEMP_TEMPO1,1
             goto TEMPO_1
             return
;---------------------------------------------------------------------------
TRAITE_BOUTON btfsc ETAT_BOUTON,0
             goto TRAITE_BOUTON_ON
; TRAITEMENT OFF
             btfsc PORTB,0
             goto TRAITE_BOUTON_OFF1
             clrf CPTR_BOUTON
             return
TRAITE_BOUTON_OFF1 incf CPTR_BOUTON,1
             movf CPTR_BOUTON,0
             sublw d'2'    ; anti rebond 2 coups … l'appui
             skpz
             return
             bsf ETAT_BOUTON,0
             clrf CPTR_BOUTON
             incf NB_APPUI_BOUTON,1
             clrf TEMPS_DERNIER_APPUI
             clrf POWER_OFF        ; relance auto power off
             btfss ENABLE_BIP_BOUTON,0
             return
             movlw d'4'
             movwf ETAT_LED   ; BIP
             return
;
TRAITE_BOUTON_ON btfss PORTB,0
             goto TRAITE_BOUTON_ON1
             clrf CPTR_BOUTON
             return
TRAITE_BOUTON_ON1 incf CPTR_BOUTON,1
             movf CPTR_BOUTON,0
             sublw d'5'    ; anti rebond 10 coups au relachement
             skpz
             return
             bcf ETAT_BOUTON,0
             clrf CPTR_BOUTON
             return
;---------------------------------------------------------------------------
TRAITE1_BOUTON btfsc ETAT_BOUTON,0
             goto TRAITE1_BOUTON1
             incf TEMPS_DERNIER_APPUI,1
             return
TRAITE1_BOUTON1 clrf TEMPS_DERNIER_APPUI
             return
;---------------------------------------------------------------------------
TOGGLE_RA1   btfsc PORTA,1
             goto TOGGLE_RA1_CLEAR
             bsf PORTA,1
             return
TOGGLE_RA1_CLEAR bcf PORTA,1
             return
;---------------------------------------------------------------------------
POSITION_MOTEUR btfsc ETAT_BOUTON,0
             goto POSITION_MOTEUR1
             clrf DUREE   ; arrˆt moteur
             return
;
POSITION_MOTEUR1 btfss NB_APPUI_BOUTON,0
             goto POSITION_MOTEUR2
             bsf SENS,0
             movlw d'255'
             movwf DUREE
             return
;
POSITION_MOTEUR2 bcf SENS,0
             movlw d'255'
             movwf DUREE
             return
;---------------------------------------------------------------------------
COM_MOTEUR   tstf DUREE
             skpz
             goto COM_MOTEUR1
             bcf PORTA,2
             bcf PORTA,3
             return
;
COM_MOTEUR1  decf DUREE,1
             btfsc SENS,0
             goto COM_MOTEUR2
             bsf PORTA,2
             bcf PORTA,3
             return
COM_MOTEUR2  bcf PORTA,2
             bsf PORTA,3
             return
;---------------------------------------------------------------------------
RESET_DELAI  clrf CPTR_DELAI
             clrf CPTR1_DELAI
             return
;---------------------------------------------------------------------------
; compteur CPTR_DELAI en Minutes
TRAITE_DELAI incf CPTR1_DELAI,1
             movf CPTR1_DELAI,0
             sublw d'184'
             skpz
             return
             incf CPTR_DELAI,1
             clrf CPTR1_DELAI
             return
;---------------------------------------------------------------------------
TRAITE_LED   btfsc ETAT_LED,0
             goto TRAITE_LED1
             btfsc ETAT_LED,1
             goto TRAITE_LED2
             btfsc ETAT_LED,2
             goto TRAITE_LED4
             btfsc ETAT_LED,3
             goto TRAITE_LED8
             bsf PORTA,1
             return
;ETAT_LED=1: Bip intermitent 20ms/1.2s
TRAITE_LED1  movf CPTR_TACHE,0
             andlw b'01111110'
             skpz
             goto TRAITE_LED11
             bcf PORTA,1   ; led allum‚e
             return
TRAITE_LED11 bsf PORTA,1   ; led ‚teinte
             return
;ETAT_LED=2: Bip intermitent 20ms/80ms
TRAITE_LED2  movf CPTR_TACHE,0
             andlw b'00001110'
             skpz
             goto TRAITE_LED21
             bcf PORTA,1   ; led allum‚e
             return
TRAITE_LED21 bsf PORTA,1   ; led ‚teinte
             return
;ETAT_LED=4: Bip 20ms
TRAITE_LED4  movf CPTR_TACHE,0
             andlw b'00000011'
             skpz
             return
             bcf PORTA,1   ; led allum‚e
             movlw d'8'
             movwf ETAT_LED
             return
;
TRAITE_LED8  movf CPTR_TACHE,0
             andlw b'00000011'
             skpz
             return
             bsf PORTA,1   ; led ‚teinte
             clrf ETAT_LED
             return
;---------------------------------------------------------------------------
TRAITE_TIMER_ACTION decf TIMER_ACTION,1
             return
;---------------------------------------------------------------------------
TRAITE_IMPULSION_MODE tstf NB_IMPULSION_MODE
             skpnz
             return
             btfss PORTB,5
             goto TRAITE_IMPULSION_MODE1
             bcf PORTB,5
             decf NB_IMPULSION_MODE,1
             return
TRAITE_IMPULSION_MODE1 bsf PORTB,5
             return
;---------------------------------------------------------------------------
TRAITE_ACTION movf ACTION,0
             sublw d'0'
             skpnz
             goto TRAITE_ACTION0
;
             movf ACTION,0
             sublw d'1'
             skpnz
             goto TRAITE_ACTION1
;
             movf ACTION,0
             sublw d'2'
             skpnz
             goto TRAITE_ACTION2
;
             movf ACTION,0
             sublw d'3'
             skpnz
             goto TRAITE_ACTION3
;
             movf ACTION,0
             sublw d'4'
             skpnz
             goto TRAITE_ACTION4
;
             movf ACTION,0
             sublw d'5'
             skpnz
             goto TRAITE_ACTION5
;
             movf ACTION,0
             sublw d'6'
             skpnz
             goto TRAITE_ACTION6
;
             movf ACTION,0
             sublw d'7'
             skpnz
             goto TRAITE_ACTION7
;
             movf ACTION,0
             sublw d'8'
             skpnz
             goto TRAITE_ACTION8
;
             movf ACTION,0
             sublw d'9'
             skpnz
             goto TRAITE_ACTION9
;
             movf ACTION,0
             sublw d'10'
             skpnz
             goto TRAITE_ACTION10
;
             movf ACTION,0
             sublw d'11'
             skpnz
             goto TRAITE_ACTION11
;
             movf ACTION,0
             sublw d'12'
             skpnz
             goto TRAITE_ACTION12
;
             movf ACTION,0
             sublw d'13'
             skpnz
             goto TRAITE_ACTION13
;
             movf ACTION,0
             sublw d'14'
             skpnz
             goto TRAITE_ACTION14
;
             movf ACTION,0
             sublw d'15'
             skpnz
             goto TRAITE_ACTION15
;
             movf ACTION,0
             sublw d'16'
             skpnz
             goto TRAITE_ACTION16
;
             movf ACTION,0
             sublw d'17'
             skpnz
             goto TRAITE_ACTION17
;
             movf ACTION,0
             sublw d'18'
             skpnz
             goto TRAITE_ACTION18
;
             movf ACTION,0
             sublw d'19'
             skpnz
             goto TRAITE_ACTION19
;
             movf ACTION,0
             sublw d'20'
             skpnz
             goto TRAITE_ACTION20
;
             movf ACTION,0
             sublw d'21'
             skpnz
             goto TRAITE_ACTION21
;
             movf ACTION,0
             sublw d'22'
             skpnz
             goto TRAITE_ACTION22
;
             movf ACTION,0
             sublw d'23'
             skpnz
             goto TRAITE_ACTION23
;
             goto SWITCH_OFF
;
; Action 0: Attente relacher du bouton
TRAITE_ACTION0 movlw d'2'
             movwf ETAT_LED   ; Bip-Bip
             movf TEMPS_DERNIER_APPUI,0
             sublw d'2'   ; attente 80ms * 10 = 160ms relachement
             skpz
             return
;
             incf ACTION,1
             return
;
; Action 1 attente 1er appui bouton:
TRAITE_ACTION1 btfss ETAT_BOUTON,0
             return
;
             incf ACTION,1
             return
;
; Action 2 Positionnement moteur:
TRAITE_ACTION2 movf TEMPS_DERNIER_APPUI,0
             sublw d'20' ; time out de 20 * 80ms = 1.6s
             skpz
             goto TRAITE_ACTION2_1
             movlw d'2'
             movwf ETAT_LED ; allumage LED
             incf ACTION,1
             return
TRAITE_ACTION2_1 call POSITION_MOTEUR
             return
;
; Action 3 attente 1er appui bouton:
TRAITE_ACTION3 btfss ETAT_BOUTON,0
             return
;
             incf ACTION,1
             movlw d'1'
             movwf NB_APPUI_BOUTON
             return
;
; Action 4 Comptage Nombre de vues
TRAITE_ACTION4 movf TEMPS_DERNIER_APPUI,0
             sublw d'20' ; time out de 20 * 80ms = 1.6s
             skpz
             goto TRAITE_ACTION41
             movf NB_APPUI_BOUTON,0
             movwf NB_VUES
             movlw d'2'
             movwf ETAT_LED ; allumage LED
             incf ACTION,1
             return
TRAITE_ACTION41 return
;
; Action 5 attente 1er appui bouton:
TRAITE_ACTION5 btfss ETAT_BOUTON,0
             return
;
             incf ACTION,1
             movlw d'1'
             movwf NB_APPUI_BOUTON
             return
;
; Action 6 Comptage dur‚e Incr‚ment Moteur
TRAITE_ACTION6 movf TEMPS_DERNIER_APPUI,0
             sublw d'20' ; time out de 20 * 80ms = 1.6s
             skpz
             goto TRAITE_ACTION61
             movf NB_APPUI_BOUTON,0
             movwf NB_DUREE_MOTEUR
             movlw d'2'
             movwf ETAT_LED ; allumage LED
             incf ACTION,1
             return
TRAITE_ACTION61 return
;
; Action 7 attente 1er appui bouton:
TRAITE_ACTION7 btfss ETAT_BOUTON,0
             return
;
             incf ACTION,1
             movlw d'1'
             movwf NB_APPUI_BOUTON
             return
;
; Action 8 Comptage D‚lai
TRAITE_ACTION8 movf TEMPS_DERNIER_APPUI,0
             sublw d'20' ; time out de 20 * 80ms = 1.6s
             skpz
             goto TRAITE_ACTION81
             movf NB_APPUI_BOUTON,0
             movwf NB_DELAI
             incf ACTION,1
             clrf ENABLE_BIP_BOUTON
             return
TRAITE_ACTION81 return
;
; Action 9 Test appareil photo: 4 impulsions mode infini
TRAITE_ACTION9 movlw d'4'
             movwf NB_IMPULSION_MODE
             incf ACTION,1
             return
;
; Action 10 Test appareil photo: attente fin impulsions
TRAITE_ACTION10 tstf NB_IMPULSION_MODE
             skpz
             return
             movlw d'6'  ; init tempo 6 * 80ms
             movwf TIMER_ACTION
             incf ACTION,1
             return
;
; Action 11 Test appareil photo: retardement On
TRAITE_ACTION11 tstf TIMER_ACTION
             skpz
             return
             bsf PORTB,4
             movlw d'6'  ; init tempo 6 * 80ms
             movwf TIMER_ACTION
             incf ACTION,1
             return
;
; Action 12 Test appareil photo: retardement Off
TRAITE_ACTION12 tstf TIMER_ACTION
             skpz
             return
             bcf PORTB,4
             movlw d'20'  ; init tempo 20 * 80ms
             movwf TIMER_ACTION
             incf ACTION,1
             return
;
; Action 13 Test appareil photo: Retardement on
TRAITE_ACTION13 tstf TIMER_ACTION
             skpz
             return
             bsf PORTB,4
             movlw d'6'  ; init tempo 6 * 80ms
             movwf TIMER_ACTION
             incf ACTION,1
             return
;
; Action 14 Test appareil photo: retardement Off
TRAITE_ACTION14 tstf TIMER_ACTION
             skpz
             return
             bcf PORTB,4
             movlw d'6'  ; init tempo 6 * 80ms
             movwf TIMER_ACTION
             incf ACTION,1
             return
;
; Action 15 Test appareil photo: 1 impulsion retour mode normal
TRAITE_ACTION15 tstf TIMER_ACTION
             skpz
             return
             movlw d'1'
             movwf NB_IMPULSION_MODE
             incf ACTION,1
             return
;
; Action 16 Test appareil photo: attente fin impulsions
TRAITE_ACTION16 tstf NB_IMPULSION_MODE
             skpz
             return
             incf ACTION,1
             return
;
; Action 17 init DELAI
TRAITE_ACTION17 call RESET_DELAI
             incf ACTION,1
             bsf ETAT_LED,0  ; clignotement LED
             return
;
; Action 18 attente fin d‚lai DELAI
TRAITE_ACTION18 movf NB_DELAI,0
             subwf CPTR_DELAI,0
             skpnz
             goto TRAITE_ACTION181
             clrf POWER_OFF   ; inhibition de l'auto power off
             return
TRAITE_ACTION181 incf ACTION,1
             clrf ETAT_LED
             return
;
;   CYCLE DE PRISE DE VUE
;
; Action 19 programmation mode infini
TRAITE_ACTION19 movlw d'4'
             movwf NB_IMPULSION_MODE
             incf ACTION,1
             return
;
; Action 20 Test appareil photo: attente fin impulsions
TRAITE_ACTION20 tstf NB_IMPULSION_MODE
             skpz
             return
             incf ACTION,1
             movlw d'6'  ; init tempo 6 * 80ms
             movwf TIMER_ACTION
             return
;
; Action 21  Retardement On
TRAITE_ACTION21 tstf TIMER_ACTION
             skpz
             return
             bsf PORTB,4
             movlw d'6'  ; init tempo 6 * 80ms
             movwf TIMER_ACTION
             incf ACTION,1
             return
;
; Action 22  retardement Off
TRAITE_ACTION22 tstf TIMER_ACTION
             skpz
             return
             bcf PORTB,4
             movlw d'150'  ; init tempo 15 * 80ms = 12s
             movwf TIMER_ACTION
             incf ACTION,1
             return
;
; Action 23 D‚placement appareil + boucle
TRAITE_ACTION23 tstf TIMER_ACTION
             skpz
             return
             clrf SENS
             call TABLE_DUREE_MOTEUR  ; commande moteur pendant XX ms
             movwf DUREE
             clrf POWER_OFF   ; inhibition de l'auto power off
;
             decfsz NB_VUES,1
             goto TRAITE_ACTION231
             incf ACTION,1
             return
TRAITE_ACTION231 movlw d'19'
             movwf ACTION
             return
;---------------------------------------------------------------------------
; nonbre de tours donn‚s pour 12 vues
TABLE_DUREE_MOTEUR movf NB_DUREE_MOTEUR,0
             sublw d'1'
             skpnz
             retlw d'5'    ; 1  : 0 tour
             movf NB_DUREE_MOTEUR,0
             sublw d'2'
             skpnz
             retlw d'10'    ; 2  : 1/8 tour
             movf NB_DUREE_MOTEUR,0
             sublw d'3'
             skpnz
             retlw d'20'    ; 3  : 1/4 tour
             movf NB_DUREE_MOTEUR,0
             sublw d'4'
             skpnz
             retlw d'35'    ; 4  : 1/2 tour
             movf NB_DUREE_MOTEUR,0
             sublw d'5'
             skpnz
             retlw d'55'    ; 5  : 3/4 tour
             movf NB_DUREE_MOTEUR,0
             sublw d'6'
             skpnz
             retlw d'70'   ; 6   : 1 tour
             movf NB_DUREE_MOTEUR,0
             sublw d'7'
             skpnz
             retlw d'100'   ; 7  : 1,5 tours
             retlw d'135'   ; 8  : 2 tours
;---------------------------------------------------------------------------
end
