;÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷ ; NOM: PicTrain3 - VA-ET-VIENT - Version: 2.0d - Date: 20/5/2007 ; Circuit: Cimec ; Auteur: PSi ; Version pour 12F675 ; pour d'autres PIC, changer les lignes 7-8-46 ;÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷ LIST p=PIC12F675 ; Définition de processeur #include ; Définitions des constantes errorlevel -302 __CONFIG _CPD_OFF & _BODEN_OFF & _CP_OFF & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT ;÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷ ; ASSIGNATIONS ; Constantes : CO_V_max EQU d'180' ; Vitesse mavimum CO_V_ralenti EQU d'100' ; Vitesse de ralenti CO_I_accel EQU d'50' ; Inertie en accélération CO_I_frein EQU d'3' ; Inertie en freinage CO_PauseG EQU d'3' ; Valeur pause à gauche (aller) CO_PauseD EQU d'10' ; Valeur pause à droite (retour) ;÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷ ; DEFINE ; Entrées sorties ; #define IO_SOR_FREQ GPIO,5 ; Sortie fréquence de commande #define IO_SOR_INV GPIO,4 ; Commande inversion sens de marche #define IO_OCC_arret GPIO,2 ; Occupation zone arret ; ATTENTION : actif à l'état 'haut' ; Indicateurs (switchs) : #define IN_ACCEL VA_ETAT,0 ; Accélération en cours #define IN_FREIN VA_ETAT,1 ; Freinage en cours #define IN_PAUSE VA_ETAT,2 ; Pause en cours #define IN_RALENTI VA_ETAT,3 ; Ralenti en cours ;÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷ ; DECLARATIONS DE VARIABLES CBLOCK 0x020 ; Début de la zone desvariables VA_Vitesse ; Valeur frequence VA_ETAT ; état du système VA_PAUSE ; Valeur travail pause VA_CPT_boucle ; Travail inertie VA_CPT_delai1 ; Variables spécifiques VA_CPT_delai2 ; aux sous-programmes VA_CPT_delai3 ; de délais ENDC ; Fin de la zone variables #include ; Paramétrage standard ;÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷ ; PARAMETRES SPECIFIQUES clrf ANSEL ; Uniquement pour processeur 12F675 ; Port : 1 pour entrée, 0 pour sortie BANK1 clrf TRISIO ; Port en sortie bsf IO_OCC_arret ; sauf entrée détection zone d'arret clrf INTCON bsf INTCON,GIE ; Interruptions activées bsf INTCON,T0IE ; Interruption sur timer0 bsf OPTION_REG,1 ; Pré-diviseur sur 16 bsf OPTION_REG,0 BANK0 clrf GPIO ; Sorties à 0 ; Initialisation du cycle movlw CO_I_accel ; Chargement inertie accélération movwf VA_CPT_boucle bsf IN_ACCEL ; Démarrage initial en accélération ;÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷ ; P R O G R A M M E P R I N C I P A L ; boucle principale ;÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷ boucle_repos ; Boucle principale movfw VA_ETAT ; Test si ETAT vide (=0) btfss STATUS,Z goto ETAT_frein ; Si non, test des états ; Si oui, test détection btfss IO_OCC_arret ; Test occupation zone d'arret goto boucle_repos ; Si non, boucle movlw d'100' ; Si oui, séquence confirmation détection call SP_delai_variable_100uS btfss IO_OCC_arret ; Confirmation si occupation zone d'arret goto boucle_repos ; Si non, boucle movlw d'100' call SP_delai_variable_100uS btfss IO_OCC_arret ; Confirmation si occupation zone d'arret goto boucle_repos ; Si non, boucle ; Si confirmation détection, bsf IN_FREIN ; Activation ETAT = freinage goto boucle_repos ETAT_frein btfss IN_FREIN ; Test si ETAT = freinage goto ETAT_ralenti ; Si non, test état suivant movlw CO_V_ralenti xorwf VA_Vitesse,w btfss STATUS,Z ; Test si vitesse en cours = vitesse ralenti goto boucle_repos ; Si non, boucle ; Si égal bcf IN_FREIN ; Fin ETAT freinage bsf IN_RALENTI ; Activation ETAT = ralenti goto boucle_repos ETAT_ralenti btfss IN_RALENTI ; Test si ETAT = ralenti goto ETAT_pause ; Si non, test état suivant ; Si oui btfsc IO_OCC_arret ; Test si fin de détection goto boucle_repos ; Si non, boucle ; Si oui, confirmation fin détection movlw d'100' call SP_delai_variable_100uS btfsc IO_OCC_arret ; Confirmation si fin d'occupation zone d'arret goto boucle_repos movlw d'100' call SP_delai_variable_100uS btfsc IO_OCC_arret ; Confirmation si fin d'occupation zone d'arret goto boucle_repos ; Si occupation confirmée, clrf VA_Vitesse ; Fin cycle, vitesse = 0 bcf IN_RALENTI ; Fin ETAT freinage bsf IN_PAUSE ; Activation ETAT = ralenti movlw CO_PauseG ; Chargement duré pause selon sens gauche/droite btfsc IO_SOR_INV movlw CO_PauseD movwf VA_PAUSE bcf INTCON,GIE ; Arrêt Timer0 goto boucle_repos ETAT_pause btfss IN_PAUSE ; Test si ETAT = pause goto ETAT_accel ; Si non, test état suivant call SP_delai_1seconde ; Délai d'une seconde decfsz VA_PAUSE,f ; Décrément compteur de secondes goto boucle_repos ; Si zéro, fin de pause bsf INTCON,GIE ; Activation Timer0 bcf IN_PAUSE ; Fin ETAT pause bsf IN_ACCEL ; Activation ETAT = accélération btfss IO_SOR_INV ; Inversion de sens du train goto ETAT2b bcf IO_SOR_INV goto boucle_repos ETAT2b bsf IO_SOR_INV goto boucle_repos ETAT_accel btfss IN_ACCEL ; Test si ETAT = accélération goto boucle_repos movlw CO_V_max xorwf VA_Vitesse,w btfsc STATUS,Z ; Test si vitesse en cours = vitesse ralenti bcf IN_ACCEL ; Si oui, fin ETAT accélération goto boucle_repos ;÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷ ; INTERRUPTION TIMER 0 ; génération du signal carré 240 Hz - fréquence du timer0 : 480 Hz SP_inttimer0 BANK0 btfsc IO_SOR_FREQ ; Test sortie bas goto inttimer2 ; Si non branche 2 ; Si oui, test inertie decfsz VA_CPT_boucle,f goto inttimer_suite ; Incrément/décrément compteurs btfss IN_FREIN ; Si ETAT = freinage goto inttimer_accel decf VA_Vitesse,f ; Vitesse -1 movlw CO_I_frein ; Re-chargement compteur inertie movwf VA_CPT_boucle ; Avec inertie freinage goto inttimer_suite inttimer_accel btfss IN_ACCEL ; Si ETAT = freinage goto inttimer_suite incf VA_Vitesse,F ; Vitesse +1 movlw CO_I_accel ; Re-chargement compteur inertie movwf VA_CPT_boucle ; Avec inertie accélaration ; Suite traitement interruption inttimer_suite bsf IO_SOR_FREQ ; Sortie haut movf VA_Vitesse,w sublw d'255' ; Chargement timer avec inverse fréquence movwf TMR0 return ; Fin d'interruption timer inttimer2 ; Si sortie haut bcf IO_SOR_FREQ ; Sortie bas movf VA_Vitesse,w ; Chargement timer avec valeur fréquence movwf TMR0 return SP_inttimer1 ; Non utilisé return #include ; Inclusion des sous-programmes de délais END