Forum Électro-Bidouilleur

Sections => Discussion et Suivi sur les Vidéos d'Électro-Bidouilleur => Discussion démarrée par: papyblue le mars 22, 2020, 05:08:41 pm

Titre: EB#_349 potentiomètre numérique
Posté par: papyblue le mars 22, 2020, 05:08:41 pm
Bonjour à  tous,
Il se trouve que j'avais commandé la même plaquette que celle que Bertrand nous a présenté dans la vidéo 349 mais je n'avais jusque là  pas eu le temps d'essayer (comme un certain nombre d'autres plaquettes d'ailleurs...). J'ai d'abord testé avec des tensions continues de -5V à  +5V et en retournant VH et VL puis en injectant un signal alternatif. Le fonctionnement est nominal, le bruit mesuré est de l'ordre de 10 mV cc à  1 MHz.
J'en conclue que la plaquette de Bertrand était défectueuse et ne représente pas le fonctionnement de ce composant.

PB
Titre: Re : EB#_349 potentiomètre numérique
Posté par: Curiosus le mars 23, 2020, 08:02:13 am
Bonjour papyblue, et tout le forum,

Pour ceux qui sont intéressés voici une liste des potentiomètres et rhéostats numériques de chez Microchip https://www.google.fr/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=2ahUKEwjg3JzJwbDoAhU_DmMBHcJmCr0QFjAAegQIBBAB&url=http%3A%2F%2Fww1.microchip.com%2Fdownloads%2Fen%2FDeviceDoc%2F20002017D.pdf&usg=AOvVaw3_WiXv2YGAxB2TM3LT9H99 (https://www.google.fr/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=2ahUKEwjg3JzJwbDoAhU_DmMBHcJmCr0QFjAAegQIBBAB&url=http%3A%2F%2Fww1.microchip.com%2Fdownloads%2Fen%2FDeviceDoc%2F20002017D.pdf&usg=AOvVaw3_WiXv2YGAxB2TM3LT9H99)

J'ai pu testé des MCP41XX d'une valeur de 10 kΩ, commandé en mode SPI, avec Pic18F26K22 en nombre de pas de 256 positions

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.

Voici la datasheet du MCP41XX : https://www.google.fr/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=2ahUKEwig-5iHxLDoAhVRA2MBHbOwBI4QFjAAegQIBhAB&url=http%3A%2F%2Fww1.microchip.com%2Fdownloads%2Fen%2FDeviceDoc%2F22059a.pdf&usg=AOvVaw04i4cAfkGREqC6mfYFVhuT (https://www.google.fr/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=2ahUKEwig-5iHxLDoAhVRA2MBHbOwBI4QFjAAegQIBhAB&url=http%3A%2F%2Fww1.microchip.com%2Fdownloads%2Fen%2FDeviceDoc%2F22059a.pdf&usg=AOvVaw04i4cAfkGREqC6mfYFVhuT)

Pour que vous puissiez tester sans achat je vous donne le schéma avec son fichier de simulation sous Proteus 8.9

Vous pouvez télécharger le logiciel Proteus en version d’évaluation (malheureusement) https://proteus.fr.malavida.com/#gref

Je vous joint aussi le fichier qui est à  mettre dans le Pic, sous simulation ou sans simulation

De plus voici le code écrit en langage assembleur (ASM)


    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         :1
      adresse_hi          :1

      donner              :1
 
    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 (8 * 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 joint :