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