Problème de contrôle du potentiomètre numérique avec micro

Brandon Bailey

Problème de contrôle du potentiomètre numérique avec micro


J’essaie de contrôler un potentiomètre numérique avec un PIC18F14K50 et j’ai un problème aléatoire (le potentiomètre ne se souvient pas de la valeur correcte) lorsque je l’éteins puis le rallume. La fiche technique du X9313 stipule que pour lancer une sauvegarde de la position de l’essuyeur de pots numériques dans sa propre EEPROM interne, la ligne CS doit être prise de bas en haut pendant que la ligne INC est tirée haut. la ligne INC est sur RC6 et la ligne CS est sur RA5 (CS est tiré à 5V à 10k pour éviter des conditions inconnues à la mise sous tension, c’était une modification tardive et n’est pas montrée sur le schéma).

Le problème est que lorsque le volume est modifié et que l’alimentation est coupée puis remise en marche, le pot numérique se rallume et a décrémenté une position d’essuie-glace. Cela ne se produit que lorsque le volume est modifié et que l’alimentation est redémarrée pour la PREMIÈRE fois. Par exemple, si je mets le pot au milieu en me donnant une sortie de 1 V au niveau de l’essuie-glace (en utilisant de faux chiffres pour plus de simplicité) et que chaque étape est de 50 mV lorsque je passe sous tension, la sortie au niveau de l’essuie-glace sera de 950 mV lorsque je réappliquerai la puissance. Si je laisse le volume là-bas et que je ne le modifie pas, je peux redémarrer autant de fois que je le souhaite et il se souviendra toujours des 950 mV. Mais si je le modifie à nouveau pour dire 500 mV et puissance de cycle, lors de la prochaine mise sous tension, j’aurai 450 mV au niveau de l’essuie-glace et cette valeur sera mémorisée pour autant de cycles de puissance que j’ai testés. Cela semble être un problème d’essuie-glace de marche, comme indiqué dans cette note d’ application intersil , mais il semble étrange que cela ne se produise que le premier cycle d’alimentation après que la valeur a changé.
J’ai ajouté de petites portions de mon code. les bits de configuration et la partie où je change la valeur du pot numérique. Si quelqu’un veut voir le reste du code, faites le moi savoir et je pourrai vous le faire parvenir. Quelqu’un peut-il voir un problème avec mon code ou la configuration qui serait à l’origine de ce problème? J’apprécie toutes les contributions que je peux obtenir.

Partiel; Schématique

  CONFIG CPUDIV =  NOCLKDIV ;   No  CPU System   Clock  divide CONFIG USBDIV =  OFF ;  USB Clock  comes directly from  the OSC1 / OSC2 oscillator block ;   no  divide CONFIG FOSC =  IRC ;   Internal  RC oscillator ,  CLKOUT function  on OSC2 CONFIG PLLEN =  OFF ;   Oscillator  multiplied by   4 CONFIG PCLKEN =  ON ;   Primary  clock enabled CONFIG FCMEN =  OFF ;   Fail - Safe   Clock   Monitor  disabled CONFIG IESO =  OFF ;   Oscillator   Switchover  mode disabled CONFIG PWRTEN =  ON ;  PWRT enabled CONFIG BOREN =  ON ;   Brown - out   Reset  enabled in  hardware only ( SBOREN is  disabled ) CONFIG BORV =   27             ;  VBOR set  to 2.7  V nominal CONFIG WDTEN =  OFF ;  WDT is  controlled by  SWDTEN bit of the WDTCON register CONFIG WDTPS =   1             ;   1 : 1 CONFIG MCLRE =  ON ;  MCLR pin enabled ,  RE3 input pin disabled CONFIG HFOFST =  OFF ;   The  system clock is  held off until  the HFINTOSC is  stable CONFIG STVREN =  OFF ;   Stack  full / underflow will not  cause Reset CONFIG LVP =  OFF ;   Single - Supply  ICSP disabled CONFIG BBSIZ =  ON ;   2kW  boot block size CONFIG XINST =  OFF ;   Instruction   set  extension and   Indexed   Addressing  mode disabled ( Legacy  mode ) CONFIG CP0 =  OFF ;   Block   0   not  code - protected CONFIG CP1 =  OFF ;   Block   1   not  code - protected CONFIG CPB =  OFF ;   Boot  block not  code - protected CONFIG CPD =  OFF ;   Data  EEPROM not  code - protected CONFIG WRT0 =  OFF ;   Block   0   not  write - protected CONFIG WRT1 =  OFF ;   Block   1   not  write - protected CONFIG WRTB =  OFF ;   Boot  block not  write - protected CONFIG WRTC =  OFF ;   Configuration  registers not  write - protected CONFIG WRTD =  OFF ;   Data  EEPROM not  write - protected CONFIG EBTR0 =  OFF ;   Block   0   not   protected   from  table reads executed in  other blocks CONFIG EBTR1 =  OFF ;   Block   1   not   protected   from  table reads executed in  other blocks CONFIG EBTRB =  OFF ;   Boot  block not   protected   from  table reads executed in  other blocks DIR_CCW ; BSF UPDOWN ; Set  up /  down bit BCF CS ; pulse CS line NOP BCF INC NOP NOP BSF INC NOP ; MOVLW 0x64              ; 100ms  delay MOVWF LOOP_COUNT DLOOP CALL DELAY_ONE_MS DECFSZ LOOP_COUNT GOTO DLOOP ; BSF CS NOP BCF ENCDR_FLG ,   1 RETURN ;********************************************************* DIR_CW ; BCF UPDOWN ; Clear  up /  down bit BCF CS ; pulse CS line NOP BCF INC NOP NOP BSF INC NOP ; MOVLW 0x64              ; 100ms  delay MOVWF LOOP_COUNT DLOOP1 CALL DELAY_ONE_MS DECFSZ LOOP_COUNT GOTO DLOOP1 ; BSF CS NOP BCF ENCDR_FLG ,   0 RETURN 

Réponses


 Brandon Bailey

J’ai finalement trouvé le problème! Lors de l’initialisation des ports sur le PIC, les lignes CS et INC du pot numérique étaient momentanément effacées suffisamment longtemps pour lancer une commande de décrémentation mais pas assez longtemps pour une commande de stockage. La valeur correcte était stockée et le dispositif décrémenterait cette valeur stockée correcte à chaque cycle d’alimentation, donnant l’illusion qu’une nouvelle valeur avait été stockée. En définissant les lignes CS et INC à un niveau élevé avant l’initialisation du port (je ne savais même pas que je pouvais le faire), j’ai évité la décrémentation indésirable.

  BSF CS ;  SET CS BSF INC ;  SET INC ; MOVLW 0X1F              ; MOVWF TRISC ; MOVLW 0x80 MOVWF TRISB ; CLRF TRISA ; CLRF ANSEL ;  CONFIGURE AS DIGITAL IO CLRF ANSELH ; CLRF PORTA ;  INITIALIZE PORT A CLRF PORTB ;  INITIALIZE PORT B CLRF PORTC ;  INITIALIZE PORT C 

 

#de, avec, contrôle, du, micro?, numérique, potentiomètre, Problème

 

google

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *