;********************************************************************* ; NOM: gretel1.asm ; ____ ____ _____ _____ _____ _ ; / ___| _ \| ____|_ _| ____| | ; | | _| |_) | _| | | | _| | | ; | |_| | _ <| |___ | | | |___| |___ ; \____|_| \_\_____| |_| |_____|_____| ; ; Date: 12/06/2008 ; Auteur: JCGrimaldi ; COPYRIGHT 2008 JC GRIMALDI POUR PTITRAIN ; http://www.ptitrain.com/electronique/microp/page53/index.htm ; Ce montage commande une sortie PWM à partir d'une entrée analogique ; avec deux sens comme pour un potentiomètre à point milieu (-255 0 +255) ; Supprimer * dans ET_Boucle pour fonctionnement à un seul sens (0 à 255) ; ATTENTION, par rapport au schéma publié, l'entrée est en AN0 et non AN2 ;********************************************************************* LIST p=PIC12F675 ; Définition du processeur #INCLUDE ; Définitions des constantes ERRORLEVEL -302 __CONFIG _CPD_OFF & _BODEN_OFF & _CP_OFF & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT ; oscillateur interne 4 MHz ;********************************************************************* ; DEFINE - EQU - INC ;********************************************************************* #DEFINE IO_Mesure GPIO,0 ; (patte 7) Entrée Potentiomètre #DEFINE IO_PWM GPIO,1 ; (patte 6) Sortie Commande PWM ; #DEFINE IO_ GPIO,2 ; (patte 5) ; #DEFINE IO_ GPIO,3 ; (entrée4) ; #DEFINE IO_Arret GPIO,4 ; (patte 3) #DEFINE IO_Sens GPIO,5 ; (patte 2) Sortie Sens de marche #INCLUDE ; Paramétrage standard ;********************************************************************* ; PARAMETRES SPECIFIQUES ;********************************************************************* BANK0 ; Comparateurs analogiques movlw B'00000111' ; Comparateurs off movwf CMCON ; Entrées analogiques movlw b'00000001' ; b7 à 0 : Résultat calé à gauche (8 bits forts, octet bas négligé) ; b6 à 0 : Référence interne = Vcc ; b5 à 0 : Non Utilisé ; b4 à 0 : Non Utilisé ; b3 à 0 : Choix entrée AN0 (= GP0 = broche 7) ; b2 à 0 : b2/b2 entrée ANx (b2=0 AN1 b2=1 AN2) ; b1 à 0 : Pas de demande de conversion ; b0 à 1 : Validation Convertisseur analogique movwf ADCON0 ; ANO selectionné en attente d'une conversion ; Timer 1 (mesure) movlw B'00000001' movwf T1CON ; TIMER1 actif ; Entrées analogiques BANK1 movlw B'00010001' movwf ANSEL ; fosc/8 et AN0 en mode analogique ; Entrées tout ou rien bcf TRISIO,1 ; Port GP1 en sortie bcf TRISIO,4 ; Port GP4 en sortie bcf TRISIO,5 ; Port GP5 en sortie ; Paramètres du prédiviseur movlw B'10000011' movwf OPTION_REG ; Pré-diviseur sur 16 pour TMR0 ; Registre contrôle interruptions INTCON clrf INTCON bsf INTCON,GIE ; Activation des interruptions ; Variables BANK0 CBLOCK 0x020 ; Début de la zone des variables VA_Mesure ; Valeur mesure entrée (entre 0 et 255) VA_Intensite ; Valeur intensité PWM (entre 0 et 255) VA_Calcul1 ; Variable intermédiaire (entre 0 et 255) VA_Calcul2 ; Variable intermédiaire (entre 0 et 255) ENDC ; Fin de la zone des variables ;********************************************************************** ; Boucle principale ;********************************************************************** ET_Boucle call SP_mesure ; Mesure tension analogique movfw VA_Mesure ; Charge mesure dans W movwf VA_Calcul1 ; * Charge mesure dans variable call SP_doublesens ; * Double sens à point milieu movfw VA_Calcul2 ; * Charge variable dans W movwf VA_Intensite ; Charge référence intensité call SP_PWM ; Commande sortie PWM goto ET_Boucle ; Recommence ;********************************************************************* ; Sous programmes ;********************************************************************* ; Interruption TMR1 appelée à chaque interruption TMR1 ;********************************************************************* SP_inttimer1 ; non utilisé dans ce montage return ; conservé pour paramétrage standard ;********************************************************************* ; Interruption TMR0 appelée à chaque interruption TMR0 ;********************************************************************* SP_inttimer0 ; non utilisé dans ce montage return ; conservé pour paramétrage standard ;********************************************************************* ; PWM Sortie 'haut' pendant (Intensité), 'bas' pendant (255-Intensité) ;********************************************************************* SP_PWM bsf IO_PWM ; Met sortie à 'haut' movf VA_Intensite, W ; Transfère la valeur Intensité dans W sublw D'255' ; Soustrait 255 de W movwf TMR0 ; Charge le contenu de W dans le timer ET_timer1 btfss INTCON,2 ; Teste si le timer a fini le comptage goto ET_timer1 ; Boucle si pas terminé bcf INTCON,2 ; Remet à zéro le statut TOIF bcf IO_PWM ; Met la sortie à 'bas' movf VA_Intensite, W ; Transfère la valeur Intensité dans W movwf TMR0 ; Charge le contenu de W dans le timer ET_timer2 btfss INTCON,2 ; Teste si le timer a fini le comptage goto ET_timer2 ; Boucle si pas terminé bcf INTCON,2 ; Remet à zéro le statut TOIF return ;********************************************************************* ; Mesure tension analogique ;********************************************************************* SP_mesure bsf ADCON0,1 ; Lance la mesure sur l'entrée analogique ET_mesure btfss PIR1,6 ; Teste si la mesure est finie goto ET_mesure ; Boucle si la mesure n'est pas terminée bcf PIR1,6 ; Remet à zéro le statut bcf INTCON,2 ; Remet à zéro le statut TOIF movf ADRESH, W ; Transfère le résultat dans W movwf VA_Mesure ; Transfère W dans la variable return ;********************************************************************* ; Double sens en utilisant le potentiomètre avec zéro au milieu ;********************************************************************* SP_doublesens movlw d'128' ; Charge valeur point milieu dans W subwf VA_Calcul1,0 ; Soustrait W, copie résultat dans W movwf VA_Calcul2 ; Charge W dans variable btfsc STATUS,Z ; Test si zéro btfss STATUS,C ; Test si dépassement goto ET_inverse ET_direct movfw VA_Calcul2 ; Charge variable dans W rlf VA_Calcul2,1 ; Double la variable (décalage 1 bit) bcf IO_Sens ; Met à zéro la sortie sens inverse return ET_inverse movlw d'127' ; Charge la valeur dans W movwf VA_Calcul2 ; Charge W dans la variable movfw VA_Mesure ; Charge mesure dans W subwf VA_Calcul2,1 ; Soustrait W de la variable rlf VA_Calcul2,1 ; Double la variable (décalage 1 bit) bsf IO_Sens ; Met à "un" la sortie sens inverse return ;********************************************************************* END ;*********************************************************************