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

Potentiomètre numérique et Rhéostat
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#1 Message par Temps-x » dim. 15 déc. 2019 19:01

Bonjour tout le forum,

J'ai reçu dernièrement des potentiomètres et rhéostats numériques de chez Microchip, je vais vous montrer comment les mettre en fonction.

Pour ceux qui sont intéressés voici une liste des potentiomètres et rhéostats numériques de chez Microchip ICI

J'ai utilisé pour les testes un microcontrôleur Pic18F26K22, voici son datasheet

Pour le teste j'ai pris un MCP41XX d'une valeur de 10 kΩ, commandé en mode SPI, en nombre de pas de 256 positions, voici le datasheet

Dans la série des potentiomètres numériques et rhéostats, on peut soit prendre une version SPI ou I2C

Vous avez le choix lors de l'achat de 4 valeur résistif, pour les modéles de chez Microchip

- 5kΩ
- 10 kΩ
- 50 kΩ
- 100 kΩ

Ses potentiomètres numériques et rhéostats ont un nombre de pas, ainsi qu'une tolérance, défini dans la datasheet
Ils, peuvent être du type volatile, et non volatile, les versions non-volatile ont une EEPROM

Ils intègrent la technologie WiperLock qui fournit une méthode de verrouillage de la configuration du curseur.

Pour la déverrouiller, une commande haute tension est nécessaire (>8,5 V), ce qui protège la configuration pendant le fonctionnement normal.


Schéma

Potentiomètre & rhéostat.jpg


Le code

Le code ASM a été écrit avec jens file Editor 3.95

Code : Tout sélectionner



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

    radix dec                                                       
; par defaut en mode décimal

    list p
=18f26K22                       ; processeur utilisé                  
    
#include <p18f26K22.inc>              ; Définitions des constantes

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

;
 CONFIG11H
     CONFIG FOSC 
= INTIO67 
     CONFIG FCMEN 
= OFF 
     CONFIG IESO 
= OFF
; CONFIG2L
     CONFIG PWRTEN 
= OFF 
     CONFIG BOREN 
= OFF 
     CONFIG BORV 
= 190
; CONFIG2H
     CONFIG WDTEN 
= OFF 
     CONFIG  WDTPS 
= 1
; CONFIG3H
     CONFIG CCP2MX 
= PORTC1                         
     CONFIG PBADEN 
= OFF
     CONFIG CCP3MX 
= PORTC6
     CONFIG HFOFST 
= OFF
     CONFIG T3CMX 
= PORTC0
     CONFIG P2BMX 
= PORTC0
     CONFIG MCLRE 
= INTMCLR
; CONFIG4L
     CONFIG STVREN 
= OFF 
     CONFIG LVP 
= OFF 
     CONFIG XINST 
= OFF 
     CONFIG DEBUG 
= OFF
; CONFIG5L
     CONFIG CP0 
= OFF 
     CONFIG CP1 
= OFF 
     CONFIG CP2 
= OFF 
     CONFIG CP3 
= OFF
; CONFIG5H
     CONFIG CPB 
= OFF 
     CONFIG CPD 
= OFF
; CONFIG6L
     CONFIG EBTR0 
= OFF
; CONFIG6H
     CONFIG EBTR1 
= OFF
; CONFIG7L
     CONFIG EBTR2 
= OFF
; CONFIG7H
     CONFIG EBTR3 
= OFF

;*************************************** assignations ***************************************** 

#DEFINE cs     LATC,7                     ; RC7 ==> activer ou désactiver la transmission

#DEFINE led3   LATA,3                     ; RA3 led rouge, témoin de la limite maximal atteint par le potentiomètre

#DEFINE led2   LATA,0                     ; RA0 led bleu, témoin  de la limite minimal atteint par le potentiomètre

#DEFINE led1   LATA,7                     ; RA7 led verte, témoin de mise en fonction de l'appareil

;********************************* "déclaration des variables" *********************************

     CBLOCK H'20'                          ; bank0  
      loop1               
:1
      loop2               
:1
      loop3               
:1
      loop4               
:1
      loop5               
:1                    
    
      buzzer              
:1
      curseur             
:2
  
      temps               
:1
      tmps                
:1

      adresse_low         
:
      adresse_hi          
:1

      donner              
:
 
    ENDC

;************************* "Macro pour se positionner dans un tableau" ************************* 
tableau MACRO adresse

      movlw UPPER
(adresse)                ; 
      movwf TBLPTRU                       
;
      movlw HIGH(adresse)                 ;
      movwf TBLPTRH                       ; 
      movlw LOW
(adresse)                  ;
      movwf TBLPTRL                 
     
    ENDM

;************************** Macro pour écrit dans l'eeprom  ************************************ 
ecriture_eeprom MACRO valeur1,valeur2,valeur3 

      movlw valeur1
      movwf adresse_hi

      movlw valeur2
      movwf adresse_low

      movf valeur3,W
      movwf donner

      call eeprom_ecriture 

    ENDM

;*************************** Macro pour lire dans l'
eeprom  ************************************ 
lecture_eeprom MACRO valeur1
,valeur2

      movlw valeur1
      movwf adresse_hi

      movlw valeur2
      movwf adresse_low

      call eeprom_lecture

    ENDM

;******************************* "adresse de depart après reset" *******************************
    ORG H'0'
      bra debut

    ORG H
'8'
      retfie 

    ORG H
'18'                                  
      retfie 

debut
;***************** "configuration de la bank sélectionné du microcontrôleur" *******************

      movlw B'00000000'          
      movwf BSR

;******************** "configuration de l'oscillateur du microcontrôleur" ********************** 

      movlw B
'01110100'                   ; oscillateur à 16 Mhz, fréquence stable si PLL (16 * 4)= 64 Mhz
;     movlw B'01100100'                   ; oscillateur à 8 Mhz, fréquence stable si PLL (* 4) = 32 Mhz
;     movlw B'01010010'                   ; oscillateur à 4 Mhz, fréquence stable  
;     movlw B'01000010'                   ; oscillateur à 2 Mhz, fréquence stable  
;     movlw B'00110010'                   ; oscillateur à 1 Mhz, fréquence stable  

      movwf OSCCON
      
;**************************** configuration du registre OSCTUNE ********************************

      movlw B'00000000'                   ; bit 6 à 1 : PLL * 4
      movwf OSCTUNE                       
; bit 6 à 0 : PLL désactivé
                                         
;*************************** configuration du registre ANSELA ********************************** 

      movlw B
'00000000'                   ; en mode numérique : 
      movwf ANSELA                        
; en mode E/S       : 2(RA0), 3(RA1), 4(RA2), 5(RA3), 7(RA5) 

;**************************** configuration du registre ANSELB ********************************* 

      movlw B
'00000000'                   ; en mode numérique : 
      movwf ANSELB                        
; en mode E/S       : 21(RB0), 22(RB1) 23(RB2), 24(RB3), 25(RB4), 26(RB5)  
             
;**************************** configuration du registre ANSELC ********************************* 

      movlw B
'00000000'                   ; en mode numérique :
      movwf ANSELC                        ; en mode E/S       : 13(RC2),  14(RC3), 15(RC4), 16(RC5), 17(RC6), 18(RC7)  

;*************************** configuration du registre ADCON0 ********************************** 

      movlw B
'00000000'                   ; b0 = ADON mise en service le convertiseur 0 = arrêt : 1 = marche   
      movwf ADCON0                        
; b1 = GO/DONE indique la fin de la conversion analogique, et permet de lancer la conversion
                                          
; b2 à b6 = réglage de la sélection du canal

;*************************** configuration du registre ADCON1 ********************************** 

      movlw B
'00000000'                   ; b2 à b3 = 00 : sélection de la tension de reférence, Vref+ = Vss   
      movwf ADCON1                        
; b0 à b1 = 00 : sélection de la tension de reférence, Vref- = Vdd 
                                          
;*************************** configuration du registre ADCON2 ********************************** 

      movlw B
'00110110'                   ; b0 à b2 = FOSC/64
      movwf ADCON2                        
; b3 à b5 = 16 TAG 
                                          
; 
                                          
; b7 = détermine si le résultat de la conversion
                                          
; sera justifié à droite = 1 ou à gauche = 0  

;************************* configuration du registre CM1CON0 & CM2CON0 *************************

      movlw B'00000000'                   ; comparateur 1 off
      movwf CM1CON0 

      movlw B
'00000000'                   ; comparateur 2 off
      movwf CM2CON0 

;*********************** "configuration du pwm du microncontrôleur" ****************************

      movlw D'255'                        ; réglage du "débordement" de TMR2 
      movwf PR2                           
; PR2 D'255' donc fréquence à 1950 Hz avec prédiviseur à 4

                                  
      movlw B
'00000101'                   ; "prédiviseur à 4" bit zéro à 1, bit un à 0 
      movwf T2CON                         
; "timer on", bit deux à 1 (mise en route du timer2. 0 : arrêt. 1 : marche)
                                          ; "postdiviseur à 1" bit trois à 0, bit quatre à 0, bit cinq à 0, bit six à 0
                                          
; dans registre de contrôle
                                         
      movlw B
'00001100'                   ; "1100" 4 bits mode pwm 
      movwf CCP1CON                       
; "00" 2 bits pour variation du rapport cyclique(RC2) 
      movwf CCP2CON                       
; "00" 2 bits pour variation du rapport cyclique(RC1) 

;***************** configuration des registres TRISA & TRISB & TRISC & TRISE ******************* 

      movlw B
'00000000'                   ; RA0(2), RA1(3), RA2(4), RA3(5), RA4(6), RA5(7), RA6(10), RA7(9)  
      movwf TRISA                         
; 

      movlw B
'11111111'                   ; RB0(21), RB1(22), RB2(23), RB3(24), RB4(25), RB5(26), RB6(27), RB7(28)
      movwf TRISB                         ; 

      movlw B
'01010000'                   ; RC0(11), RC1(12), RC2(13), RC3(14), RC4(15), RC5(16), RC6(17), RC7(18)     
      movwf TRISC                         
; 

      movlw B
'00001000'                   ; RE3(1) 
      movwf TRISE                         
;

                                          ; VSS(8), VSS(19), VDD(20) 

;**************************** configuration du registre SSP1CON1 ******************************* 

      movlw B
'01000000'                   ; B7 = 0 : lecture des données au milieu
      movwf SSP1STAT                      
; B'01000000'
             
      movlw B
'00100001'                   ; B0 ...B3 = spi en mode Maître, clock = FOSC/16, B5 = polarité négative
      movwf SSP1CON1                      
; 16 /16(quartz) = 1Mbps B'00100001'
           
;**************************** configuration du registre INTCON2 ******************************** 

     movlw B
'00000000'                    ; B7 = 0 résistances en service
     movwf INTCON2                        
;

;****************************
 configuration du registre WPUB *********************************** 
                                        
     movlw B
'11111111'                    ; tirage de résistance sur        : RB0(21), RB1(22), RB2(23), RB3(24), RB4(25), RB5(26), RB6(27), RB7(28)  
     movwf WPUB                           
; pas de tirage de résistance sur :

;****************************
 configuration du registre INTCON *********************************      

    movlw B
'00000000'                     ; 
    movwf INTCON                          
; interruption hors service 

;************************************ départ du programme **************************************

      clrf CCPR1L                         ; sortie du pwm(RC2) 
      clrf CCPR2L                         
; sortie du pwm(RC1) 

      clrf PORTA
      clrf PORTB
      clrf PORTC
   
      clrf LATA
      clrf LATB 
      clrf LATC

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

      bsf cs                              
; désactivé l'émision du port spi

;**************************** " témoin visuel de mise en fonction" *****************************

      movlw D'
2'                          ; pour 2 clignotements
      movwf loop5
clignote
      bsf led1   
      rcall _1s
      bcf led1   
      rcall _1s
      decfsz loop5,F
      bra clignote   

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

      clrf curseur+0
      clrf curseur+1

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

      rcall traiter 

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

      bsf led2                            ; témoin de mise à zéro 

;*********************************************************************************************** 
gestion
      btfss PORTB,7
      rcall augmenter 

      btfss PORTB,0
      rcall diminuer

      bra gestion

;*********************************************************************************************** 
augmenter
      btfsc led3
      return
         
      bcf led2
  
      movlw D'
255'
      xorwf curseur+0,W
      btfsc STATUS,Z    
      bra plus_end

      incf curseur+0,F        
      bra traiter       

plus_end
      bsf led3
      clrf curseur+0                      ; 
      bsf curseur+1,0                     ; 256         
      bra traiter       

;*********************************************************************************************** 
diminuer
      btfsc led2
      return

      bcf led3

      btfss curseur+1,0
      bra moins          

      clrf curseur+1
      movlw D'
255'
      movwf curseur+0
      bra traiter       

moins
      movlw D'
1'
      xorwf curseur+0,W
      btfsc STATUS,Z    
      bra moins_end

      decf curseur+0,F        
      bra traiter       

moins_end      
      bsf led2
      decf curseur+0,F        
      bra traiter       

;*********************************************************************************************** 
traiter              
      rcall _100ms                        ; 

      bcf cs                              ; activé l'
émision du port spi
      movf curseur
+1,W                    ; poids haut
      rcall spi
      movf curseur
+0,W                    ; poids bas
      rcall spi
      bsf cs                              
; désactivé l'émision du port spi

      return

;*********************************************************************************************** 
spi
      movwf SSP1BUF    
attends
      btfss SSP1STAT,BF                   ;
      bra attends  

      movf SSP1BUF,W                      ;  
      
      return

;************************* "pause de 1 seconde pour horloge de 16 Mhz" ************************* 
_1s
      movlw D'
190'
      movwf loop1

      movlw D'
75'
      movwf loop2

      movlw D'
21'
      movwf loop3

      decfsz loop1,F
      bra $-D'
2'
      decfsz loop2,F
      bra $-D'
6'
      decfsz loop3,F
      bra $-D'
10'

      return
;********************* "pause de 100 millisecondes pour horloge de 16 Mhz" ********************* 
_100ms
      movlw D'
119'
      movwf loop1

      movlw D'
8'
      movwf loop2

      movlw D'
3'
      movwf loop3

      decfsz loop1
      bra $-D'
2'
      decfsz loop2
      bra $-D'
6'
      decfsz loop3
      bra $-D'
10'

      return

;********************** "pause de 10 millisecondes pour horloge de 16 Mhz" *********************
_10ms
      movlw D'
241'
      movwf loop1

      movlw D'
52'
      movwf loop2

      decfsz loop1
      bra $-D'
2'
      decfsz loop2
      bra $-D'
6'

      return

;****************************** "pour écrit dans l'
eeprom" ************************************* 
eeprom_ecriture
      movf adresse_hi,W                   ; adresse du poid fort
      movwf EEADRH                        ;

      movf adresse_low,W                  ; adresse du poid faible
      movwf EEADR                         ; 

      movf donner,W                       ;
      movwf EEDATA                        ; écriture de la donnée
 
      bcf EECON1,EEPGD                    ; préparation à l'autorisation 
      bcf EECON1,CFGS                     ; access eeprom

      bsf EECON1,WREN                     ; Enable writes   
 
      bcf INTCON,GIE                      ; couper les interruptions

      btfsc INTCON,GIE                    ; contrôl si les interruptions sont bien coupés
      bra $-D'2'                          ; remonte à la ligne 2 jusqu'a coupures des interruptions 

      movlw H'55'                         ; séquence spécifique (c'est comme ça, il faut le savoir)
      movwf EECON2                        ; séquence spécifique
      movlw H'AA'                         ; séquence spécifique
      movwf EECON2                        ; séquence spécifique

      bsf EECON1,WR                       ; lance une opération d'écriture

      btfsc EECON1,WR                     ; on attend que l'operation d'ecriture soit finie (de l'ordre de la ms
      bra $-D'2'                          ; remonte à la ligne 2 jusqu'a fin d'écriture

      bcf EECON1, WREN                    ; interdiction de l'écriture

      return

;******************************** "
pour lire dans l'eeprom" ************************************ 
eeprom_lecture
      movf adresse_hi,W                   ; adresse du poid fort
      movwf EEADRH                        ;

      movf adresse_low,W                  ; adresse du poid faible
      movwf EEADR                         ; 

      bcf EECON1,EEPGD                    ; préparation à la lecture
      bcf EECON1,CFGS                     ; access EEPROM
      bsf EECON1,RD                       ; lecture de l'
EEPROM

      movf EEDATA
,W                       ; la valeur lue dans l'éeprom est placée dans W 
      movwf donner

      return

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

      End



Fichier à mettre dans le Pic : Mcp4151(Hex).zip

Fichier code : Mcp4151(Code).zip
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Modifié en dernier par Temps-x le dim. 14 juin 2020 13:01, modifié 20 fois.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Potentiomètre numérique et Rhéostat
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 1413
Âge : 70
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#2 Message par F6FCO » mer. 18 déc. 2019 16:55

Bonjour,
Je ne connais pas ces composants, concrètement çà sert dans quelles applications ? çà s'utilise comment ? il faut quand même avoir quelque chose à toucher avec les doigts pour agir dessus ?
Comme je n'ai pas Proteus je ne peux pas tester ton schéma, c'est en agissant sur deux boutons poussoirs ?
Une porte nand prend 2 bits en entrée... la cochonne !!! :langue:

Potentiomètre numérique et Rhéostat
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#3 Message par Temps-x » jeu. 19 déc. 2019 01:16

Bonsoir F6FCO, et tout le forum,

F6FCO a écrit :Source du message concrètement çà sert dans quelles applications ?


Dans n'importe quelle application, selon ton imagination.....,

Exemple : si tu désir avoir une tension fixe sur la sortie d'un amplificateur, suffit de faire varier le potentiomètre à l'aide d'un microcontrôleur.

Avantage tu n'as pas besoin d'y touché, c'est le programme que tu auras écrit qui va s'en charger en envoyant une donnée numérique sur celui-ci

F6FCO a écrit :Source du message çà s'utilise comment ?


Dans la série des potentiomètres numériques et rhéostats, on peut soit prendre une version par SPI ou I2C, au choix ...

Il faut bien sur écrire un petit programme, :roll: de préférence en ASM pour le mettre en fonction.

j'en reparle ce Week-end, en début de post, pour l'instant j'attends la poste qui doit me les livrés surement fin de semaine.

Ce qui me permettra de vous faire une petit vidéo sur le composant.

F6FCO a écrit :Source du message il faut quand même avoir quelque chose à toucher avec les doigts pour agir dessus ?


Pas obligé, tu peux le faire par télécommande... reconnaissance vocal,.... ou automatique...., mais aussi en manuelle, mais toujours suivit d'un microcontrôleur pour envoyer l'information du positionnement

:roll: Il existe aussi des amplificateurs numériques, surement pour un prochain post....paulfjujo en a déjà utilisé voir ICI pour les intéressé

A+
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Potentiomètre numérique et Rhéostat
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 1413
Âge : 70
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#4 Message par F6FCO » jeu. 19 déc. 2019 06:36

Bonjour tout le monde,
Temps-x a écrit :
Pas obligé, tu peux le faire par télécommande... reconnaissance vocal,.... ou automatique...., mais aussi en manuelle, mais toujours suivit d'un microcontrôleur pour envoyer l'information du positionnement

Ah d'accord je comprends mieux maintenant, au début je ne voyais l’intérêt par rapport à un potentiomètre normal si ce n'est la difficulté accrue pour la mise en oeuvre.

Il neige de nouveau sur le forum, faudra vérifier la toiture.
Une porte nand prend 2 bits en entrée... la cochonne !!! :langue:

Potentiomètre numérique et Rhéostat
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#5 Message par Temps-x » dim. 22 déc. 2019 12:26

Bonjour F6FCO, et tout le forum,

F6FCO a écrit :Source du message Comme je n'ai pas Proteus je ne peux pas tester ton schéma


Si tu veux l'essayer tu peux la télécharger ICI en version limité

==> A+
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:


Retourner vers « Langage ASM »

Qui est en ligne

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