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 ---
Modérateur : mazertoc
Pwm progressive
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 :
La taille du fichier une fois compilé est approximativement de 765 octets, en fonction du PIC, même Winzip à eut du mal à le réduire
J'ai compilé quatre version.
Fichier pour programmer votre pic 16F627 :
Fichier pour programmer votre pic 16F627A :
Fichier pour programmer votre pic 16F628 :
Fichier pour programmer votre pic 16F628A :
Voici le schéma :
Le code :
A+
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 :
La taille du fichier une fois compilé est approximativement de 765 octets, en fonction du PIC, même Winzip à eut du mal à le réduire
J'ai compilé quatre version.
Fichier pour programmer votre pic 16F627 :
Fichier pour programmer votre pic 16F627A :
Fichier pour programmer votre pic 16F628 :
Fichier pour programmer votre pic 16F628A :
Voici le schéma :
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 :1
loop2 :1
tmps :1
temps :1
sauve :1
indique :1
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.
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 121 invités