Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur l'Assembleur !

Modérateur : mazertoc

Pwm progressive
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#1 Message par Temps-x » dim. 29 janv. 2017 16:22

Bonjour tout le monde,

Voila suite à une demande, j'ai ouvert ce poste sur la : Diminution & Augmentation Progressivement du Pwm

J'ai utilisé pour cette démonstration les Microcontrôleurs PIC16F627, PIC16F627A, PIC16F628, PIC16F628A, avec un quartz à 16 Mhz,

On aurait pu utiliser l'oscillateur interne du pic, qui est cadencé à 4 Mhz, ceci aurait économisé 2 pattes, mais tous dépends
de votre utilisation, pour le reste de votre programme.

j'ai réglé la fréquence à 15800 Hz, avec le logiciel PicPwm que vous pouvez télécharger ICI

Cette fréquence et encore audible, mais très faiblement, une fréquence plus base serait bruyante.

La sortie du Pwm peut varier de 0% à 99,75% la sortie se fait sur RB3, ou j'ai raccordé une led avec une résistance
de 470 ohms, pour visualisation du Pwm.

Utilisation de 4 bouton poussoir, les boutons poussoir doit êtres montés sur RB7, RB6, RB5, RB4.

Pas besoin de résistance, car j'ai activé les résistances, sur le Port B

Si appui sur RB7, mets en fonction l'augmentation du Pwm progressivement.
Si appui sur RB6, mets en fonction la diminution du Pwm progressivement.
Si appui sur RB5, pause du Pwm, il reste comme il est.
Si appui sur RB4, stop et remis à zéro du Pwm.

Le temps est réglable de 15 minutes à 2 secondes, la monté du Pwm, ou la descente, se fait progressivement
à raison de 252 graduation par pas de 65535.

J'ai réglé le temps à 40 secondes, on peut changer ce temps très facilement, si vous voulez le faire,
il vous faut changer le chiffre de la variable Tmps qui est compris de 0 à 255, la valeur actuel et de 10,
plus vous diminuer le chiffre, plus le temps seras court pour une diminution ou augmentation du Pwm.

Il faudra recompilé le fichier source une fois la modification faite, avec MPASMWIN.EXE, fourni
gratuitement par Microchip, ça donne ça :

MPASM.jpg

La taille du fichier une fois compilé est approximativement de 765 octets, en fonction du PIC, :lol: même Winzip à eut du mal à le réduire :lol:

J'ai compilé quatre version.

Fichier pour programmer votre pic 16F627 :
Pwm(16F627).zip

Fichier pour programmer votre pic 16F627A :
Pwm(16F627A).zip

Fichier pour programmer votre pic 16F628 :
Pwm(16F628).zip

Fichier pour programmer votre pic 16F628A :
Pwm(16F628A).zip

Voici le schéma :
16F62X Pwm.jpg

Le code :

Code : Tout sélectionner


  
;**********************************************************************************************
 
    Errorlevel
-302                                                   ; Supprime le message "Ensure that bank bits are correct" 

    list        p
=16F628A                                            ; processeur utilisé 

    
#include    <p16F628A.inc>                                       ; Définitions des constantes
            
  
    __CONFIG  _CP_OFF 
& _DATA_CP_OFF & _BODEN_OFF & _LVP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC

;******************************* Définitions variables en RAM *********************************

    CBLOCK 0x70            
      loop1                   
:
      loop2                   
:
      tmps                    
:1   
      temps                   
:1
      sauve                   
:1  
      indique                 
:
      status_temp             
:1  
      w_temp                  
:1  
      pclath_temp             
:1  
      fsr_temp                
:1  
    ENDC                

;***************************** adresse de depart après reset ********************************** 

   ORG H
'00'
      goto debut      

   ORG H
'04'
      movwf  w_temp     
      swapf STATUS
,W   
      movwf status_temp
      movf  FSR
,W       
      movwf fsr_temp     
      movf  PCLATH
,W    
      movwf pclath_temp

      clrf PCLATH                                                                     

      btfss PIR1
,TMR1IF                   ; tester si le timer1 a débordé 
      goto restoreg                       
; non, aucun débordement                                        
                                          
; oui, le timer1 à débordé

      btfsc T1CON
,TMR1ON                  ; tester si le timer1 est activé
      goto timer1                         
; oui, le timer1 est activé
      goto restoreg                       
; non, il n'est pas activé

;********************************** débordement du timer1 ************************************* 
timer1

     decfsz temps,F
     goto restoreg

;************************** réglage du temps de monté du pwm **********************************

      movfw tmps                          ; remis en fonction du temps 
      movwf temps 

;********************** sélection du label avec dimiution du temps   **************************

      btfsc indique,0                      ; si le bit 0 de la variable indique est à 1 va au label plus  
      goto plus       

moins
      movfw CCPR1L                        ; regarder si Pwm est à son mini '
0'
      xorlw D'
0'      
      btfss STATUS,Z
      decf CCPR1L,1 
      goto restoreg
    

plus
      movfw CCPR1L                        ; regarder si Pwm est à son maxi '
252'
      xorlw D'
252'      
      btfss STATUS,Z
      incf CCPR1L,1 
      goto restoreg                                 

restoreg

;******************************** effacer flag du timer1 ************************************** 

      btfsc PIR1,TMR1IF                   ; si le bit TMR1IF est à 1 on va à la ligne 1
      bcf PIR1,TMR1IF                     ; effacer flag interupttion du timer1 causé par le débordement             
                                          
;************************************* restauration *******************************************

      movf pclath_temp,W
      movwf PCLATH          
      movf fsr_temp,W
      movwf FSR     
      swapf status_temp,W
      movwf STATUS            
      swapf w_temp,F     
      swapf w_temp,W          
      retfie    
debut

;**********************************************************************************************       

      BANKSEL OPTION_REG                  ; on passe en bank 1                                          

;************************ configuration du registre OPTION_REG en bank 1 ********************** 
     
      movlw B'
00000000'                   ; résistanse en service 
      movwf OPTION_REG                      ; 

;************ configuration des registres TRISA & TRISB bank 1 ************* 

      movlw B'
00110000'                   ; B'00110000
      movwf TRISA                         ; 17(RA0),18(RA1),1(RA2),2(RA3),3(RA4),4(RA5),15(RA6),16(RA7)
                                           
      movlw B'
11110111'                   ; 
      movwf TRISB                         ; 6(RB0),7(RB1),8(RB2),9(RB3),10(RB4),11(RB5),12(RB6),13(RB7)

;************************ configuration du registre PIE1 en bank 1 ****************************

      movlw B'
00000001
      movwf PIE1                          ; active le débordement du timer1

;************************ configuration du registre PR2 en bank 1 *****************************

      movlw D'
252'                        ; réglage du "débordement" de TMR2 
      movwf PR2                           ; PR2 D'
252' fréquence à 15800 Hz
                                          ; Pwm 99,75% maximal, sinon erreur
;**********************************************************************************************       

      BANKSEL CMCON                       ; on passe en bank 0

;************************ configuration du registre CMCON en bank 0 **************************
  
      movlw B'
00000111'                   ; le mode 111 pour utiliser RA0 RA1 RA2 RA3 en E/S
      movwf CMCON                          ; inactivation des comparateurs analogiques

;******************************** on initialise le timer2 ************************************
                                          
      movlw B'
00000100'                   ; prédiviseur à 1, timer2 activé, postdiviseur à 1  
      movwf T2CON                         ; 
                                         
      movlw B'
00001100'                   ; B'00001100' mode pwm sur RB3
      movwf CCP1CON                       ; 

;********************* configuration du registre INTCON en bank 0,1,2,3 ***********************

      movlw B'
01000000'                   ; autorisation générale périphériques
      movwf INTCON                        ; 

;******************************* début du programme principal  ********************************

      clrf CCPR1L                         ; mise à zéro du pwm sur RB3

      movlw D'
10'                         ; <<=== ici pour changer le temps, de 0 à 255, pour avoir un temps différent
      movwf tmps                          ;

      movwf temps 

      bcf INTCON,GIE                      ; interruptions général hors service
      bcf T1CON,TMR1ON                    ; arrêt du timer1   
 
;**********************************************************************************************       

touche1
      btfsc PORTB,7                       ; si le bit RB7 est à 1 on va à la ligne 1 
      goto touche2                        ; pas d'
appuie sur le bouton pousoir 
      btfss PORTB
,7                       ; si le bit RB7 est à 0 on va à la ligne 1
      goto 
$+D'2'                         ; appuie sur le bouton pousoir 
      goto 
$+D'3'                         ; appuie relaché sur le bouton pousoir
      call anti_rebond                    
; gestion anti rebond
      goto 
$-D'4'    

      call tester                         
; contrôl si registre conserné en cours

      bsf indique
,0                       ; augmentation du Pwm

touche2
      btfsc PORTB
,6                       ; si le bit RB6 est à 1 on va à la ligne 1 
      goto touche3                          
; pas d'appuie sur le bouton pousoir 
      btfss PORTB,6                       ; si le bit RB6 est à 0 on va à la ligne 1
      goto $+D'
2'                         ; appuie sur le bouton pousoir 
      goto $+D'
3'                         ; appuie relaché sur le bouton pousoir
      call anti_rebond                    ; gestion anti rebond
      goto $-D'
4'    
 
      call tester                         ; contrôl si registre conserné en cours 

      bcf indique,0                       ; diminution du Pwm

touche3
      btfsc PORTB,5                       ; si le bit RB5 est à 1 on va à la ligne 1 
      goto touche4                        ; pas d'
appuie sur le bouton pousoir 
      btfss PORTB
,5                       ; si le bit RB5 est à 0 on va à la ligne 1
      goto 
$+D'2'                         ; appuie sur le bouton pousoir 
      goto 
$+D'3'                         ; appuie relaché sur le bouton pousoir
      call anti_rebond                    
; gestion anti rebond
      goto 
$-D'4'    
      
      bcf INTCON
,GIE                      ; interruptions général hors service
      bcf T1CON
,TMR1ON                    ; arrêt du timer1

      movfw CCPR1L                        
; sauvegarde du Pwm
      movwf sauve


touche4
      btfsc PORTB
,4                       ; si le bit RB4 est à 1 on va à la ligne 1 
      goto touche1                        
; pas d'appuie sur le bouton pousoir 
      btfss PORTB,4                       ; si le bit RB4 est à 0 on va à la ligne 1
      goto $+D'
2'                         ; appuie sur le bouton pousoir 
      goto $+D'
3'                         ; appuie relaché sur le bouton pousoir
      call anti_rebond                    ; gestion anti rebond
      goto $-D'
4'    
        
      bcf INTCON,GIE                      ; interruptions général hors service
      bcf T1CON,TMR1ON                    ; arrêt du timer1

      clrf TMR1L
      clrf TMR1H             
      clrf CCPR1L                         ; arrêt du Pwm
      clrf sauve                          ; remis à zéro du Pwm 
      
      movfw tmps                          ; remis à niveau du temps
      movwf temps

      goto touche1

;******************* "contrôl si les registres sélectionné son en fonction" ********************
tester
      btfss INTCON,GIE
      bsf INTCON,GIE                      ; interruptions général en service                      
      btfss T1CON,TMR1ON
      bsf T1CON,TMR1ON                    ; lancer le timer1 

    return
;*********************** "pause approximatif de 300 microsecondes" **************************** 
anti_rebond
                                
      movlw D'
100'                         ; 
      movwf loop1                          ; 
                                            
      decfsz loop1,F                       ; 
      goto $-D'
1'                          ; 

      return       

      End



A+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Modifié en dernier par Temps-x le mer. 24 janv. 2018 01:48, modifié 4 fois.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Pwm progressive
JMarc
Confirmé
Confirmé
Messages : 605
Enregistré en : août 2016
Localisation : Dans le Sud...

#2 Message par JMarc » sam. 11 févr. 2017 10:02

Bonjour temps-x


Merci pour l'exemple, car j'arrive justement dans la partie CCP (et je continue mon tachymètre mais avec cette fois capture :wink: ) et cela va bien me servir

Merci !


Retourner vers « Langage ASM »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 41 invités