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 ---
Commentez, partagez et proposez des Tutos en langage ASM !
Routine PWM pour PIC ne disposant pas de module CCP
adede5000
Débutant
Débutant
Messages : 62
Âge : 60
Enregistré en : août 2017
Localisation : Sart Saint Laurent (BE)

#1 Message par adede5000 » dim. 17 déc. 2017 19:39

Sujet : Routine PWM pour PIC ne disposant pas de module CCP

Bonjour,

Voici une routine PWM qui peut-être intérressante à mettre en oeuvre sur un 16F84A :
J'omettrai de mettre tout le code d'initialisation du PIC.
La variation de la largeur d'impulsion va modifier la tension d'une LED connectée sur le PORTA,0
Supposons que la tension nominale d'une LED rouge est de 2.0 volts et que l'on veuille appliquer une tension de 1.0 volt;l'intensité de lumière sera donc réduite de moitié.
Voici le code :

Code : Tout sélectionner


init_valeur_cycle   
 
    movlw    d
'128'        ; initialisation de la valeur du cycle à 128
    movwf    val_cycle     
; valeur minimale = 0 (LED éteinte)et valeur maximale 255 (LED allumée)
    movf     val_cycle,w
    movwf    temp          
; charger val_cycle (d'128') dans temp
    bsf      PORTA
,0       ; LED allumée

pwma    

    decfsz   temp          
; décrémenter temp de 128 jusque 0
    goto     pwma          
; boucler à pwma si temp est supérieur à 0
    movlw    d
'255'    
    movwf    temp          
; charger d'255' dans temp
    movf     val_cycle
,w   ; charger val_cycle (d'128') dans w
    subwf    temp
,f        ; temp = 255 - 128 soit 127 ce qui correspond à la moitié de 2 volts
    bcf      PORTA
,0       ; LED éteinte

pwmb    

    decfsz   temp          
; décrémenter temp de 127 jusque 0
    goto     pwmb          
; boucler à pwmb si temp est supérieur à 0
    
    goto     init_valeur_cycle 
; retour à init_valeur_cycle


Cette routine doit être exécutée en permanence pour fonctionner.
Je posterai en exemple prochainement un petit programme dans lequel cette routine sera implantée dans une interruption TMR0.
Si vous avez des questions,n'hésitez pas à me les poser.

adede5000

Routine PWM pour PIC ne disposant pas de module CCP
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#2 Message par Temps-x » lun. 18 déc. 2017 02:07

Bonsoir adede5000, et tout le forum,

:bravo: pour ce tutoriel, je vais de ce pas ressortir mes anciens 16F84A

Tu peux aller jusqu’à quelle fréquence en PWM ?

As tu un schéma, avec un exemple en version compilé ?

A+
Modifié en dernier par Temps-x le lun. 18 déc. 2017 15:03, modifié 1 fois.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Routine PWM pour PIC ne disposant pas de module CCP
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#3 Message par Jérémy » lun. 18 déc. 2017 07:34

Bonjour ici ,

Temps-x a écrit :Source du message As tu un schéma, avec un exemple en version compilé ?

Très bonne suggestion . afin de tester ton code . Un petit schéma , avec le code complet mis entre les balises "SPOILER" pourrait être sympa.

Réduire le code c'est bien pour les explications, mais il faut aussi un code complet a injecter directement le PIC !

PS
Supposons que la tension nominale d'une LED rouge est de 2.0 volts et que l'on veuille appliquer une tension de 1.0 volt

Une diode se pilote en courant ! tu va donc diminuer le courant et non la tension aux bornes de la LED . non ?
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Routine PWM pour PIC ne disposant pas de module CCP
adede5000
Débutant
Débutant
Messages : 62
Âge : 60
Enregistré en : août 2017
Localisation : Sart Saint Laurent (BE)

#4 Message par adede5000 » lun. 18 déc. 2017 10:29

Une diode se pilote en courant ! tu va donc diminuer le courant et non la tension aux bornes de la LED . non ?


Bonjour Jérémy

La chute de tension sur les bornes de la LED sera réduite également mais ton raisonnement est le bon.
Ce soir,je colle le programme fonctionnel et une photo du schéma.

adede5000

Routine PWM pour PIC ne disposant pas de module CCP
adede5000
Débutant
Débutant
Messages : 62
Âge : 60
Enregistré en : août 2017
Localisation : Sart Saint Laurent (BE)

#5 Message par adede5000 » lun. 18 déc. 2017 22:21

Voici le programme fonctionnel de la routine PWM

Code : Tout sélectionner

    LIST      p=16f84a        ; Définition de processeur
    
#include <p16f84a.inc>        ; Définitions des constantes
    ERRORLEVEL -302            ; suppression du message bank select 
    radix dec            
; décimal par défaut

    __CONFIG   _CP_OFF 
& _WDT_OFF & _PWRTE_ON & _HS_OSC


;*********************************************************************
;
                              ASSIGNATIONS                          *
;*********************************************************************

OPTIONVAL    EQU    B'10000000'    

;*********************************************************************
;*
                            MACROS                                 *
;*********************************************************************
                    
                    
BANK0        macro
        bcf    STATUS
,RP0    ; passer en banque 0
        endm

BANK1        macro
        bsf    STATUS
,RP0    ; passer en banque 1
        endm                    
        
;*********************************************************************
;*
                  DECLARATIONS DE VARIABLES                        *
;*********************************************************************

    CBLOCK 0x00C               ; Début de la zone variables
    w_temp 
:1            ; Sauvegarde du registre W
    status_temp 
:1            ; Sauvegarde du registre STATUS    
    temp 
:1
    val_cycle 
:1
    ENDC
    
;**********************************************************************
;*
                        DEMARRAGE SUR RESET                         *
;**********************************************************************

    org     0x000             ; adresse de départ après reset
      goto    init            
; adresse 0: initialiser
    
;*********************************************************************
;*
                          INITIALISATIONS                          *
;*********************************************************************
init

    BANK1                
; passer en banque 1
    movlw    OPTIONVAL        
; charger masque
    movwf    OPTION_REG        
; initialiser registre option
            
;*********************************************************************
;*
                            EFFACER RAM                            *
;*********************************************************************
    movlw    0x0c            ; initialisation pointeur
    movwf    FSR            
; pointeur d'adressage indirect

init_ram

    clrf    INDF            ; effacer ram
    incf    FSR,f            ; pointer sur suivant
    btfss    FSR,6            ; tester si fin zone atteinte (>=40)
    goto    init_ram        ; non, retour à init_ram
    btfss    FSR,4            ; tester si fin zone atteinte (>=50)
    goto    init_ram        ; non, retour à init_ram

init_TRIS

    clrf    TRISA            ; PORTA en sortie
    clrf    TRISB            ; PORTB en sortie
    
init_PORT
    
    BANK0
    clrf    PORTA            ; sorties PORTA à 0
    clrf    PORTB            ; sorties PORTB à 0
    
;*********************************************************************
;*                     PROGRAMME PRINCIPAL                           *
;*********************************************************************       
    
init_valeur_cycle   
 
    movlw    D'
128'        ; initialisation de la valeur du cycle à 128
    movwf    val_cycle     ; valeur minimale = 0 (LED éteinte)et valeur maximale 255 (LED allumée)
    movf     val_cycle,w
    movwf    temp          ; charger val_cycle (D'
128') dans temp
    bsf      PORTA,0       ; LED allumée

pwma    

    decfsz   temp          ; décrémenter temp de 128 jusque 0
    goto     pwma          ; boucler à pwma si temp est supérieur à 0
    movlw    D'
255'    
    movwf    temp          ; charger D'
255' dans temp
    movf     val_cycle,w   ; charger val_cycle (D'
128') dans w
    subwf    temp,f        ; temp = 255 - 128 soit 127 ce qui correspond à la moitié de 2 volts
    bcf      PORTA,0       ; LED éteinte

pwmb    

    decfsz   temp          ; décrémenter temp de 127 jusque 0
    goto     pwmb          ; boucler à pwmb si temp est supérieur à 0
    
    goto     init_valeur_cycle ; retour à init_valeur_cycle    
    
    end

Capture du 2017-12-18 22-17-36.jpg
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Routine PWM pour PIC ne disposant pas de module CCP
mazertoc
Passioné
Passioné
Messages : 201
Enregistré en : juillet 2015
Localisation : Auvernha

#6 Message par mazertoc » ven. 22 déc. 2017 15:42

Pour éclairer les précédentes remarques :
- le courant led est déterminé par la résistance
- la sortie fonctionne en tout ou rien
- c'est la valeur moyenne du courant (donc la luminosité) qui est modifiée par le PWM

Il vaut mieux commander la led par une sortie à 0, on s'éloigne ainsi du courant maxi que peut supporter la pin.

Routine PWM pour PIC ne disposant pas de module CCP
adede5000
Débutant
Débutant
Messages : 62
Âge : 60
Enregistré en : août 2017
Localisation : Sart Saint Laurent (BE)

#7 Message par adede5000 » sam. 23 déc. 2017 00:15

Il vaut mieux commander la led par une sortie à 0, on s'éloigne ainsi du courant maxi que peut supporter la pin.


Bonjour mazertoc,

L'anode de la LED via la résistance de limitation est donc connectée au +5V et la cathode sur le port du PIC;c'est le niveau bas qui est modulé.

Merci pour l'info,tu m'as appris quelque chose :wink:

adede5000


Retourner vers « Langage ASM »

Qui est en ligne

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