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 ---
- 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 ---
Routine PWM pour PIC ne disposant pas de module CCP
-
adede5000
Débutant- Messages : 62
- Âge : 60
- Enregistré en : août 2017
- Localisation : Sart Saint Laurent (BE)
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 :
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
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
Bonsoir adede5000, et tout le forum,
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+
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.
Routine PWM pour PIC ne disposant pas de module CCP
-
Jérémy
Administrateur du site- Messages : 2725
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Bonjour ici ,
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
Une diode se pilote en courant ! tu va donc diminuer le courant et non la tension aux bornes de la LED . non ?
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 ?
Routine PWM pour PIC ne disposant pas de module CCP
Routine PWM pour PIC ne disposant pas de module CCP
-
adede5000
Débutant- Messages : 62
- Âge : 60
- Enregistré en : août 2017
- Localisation : Sart Saint Laurent (BE)
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
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
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.
- 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- Messages : 62
- Âge : 60
- Enregistré en : août 2017
- Localisation : Sart Saint Laurent (BE)
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
adede5000
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 73 invités