Problema que controla el potenciómetro digital con micro

1

Estoy tratando de controlar un potenciómetro digital con un PIC18F14K50 y tengo un problema aleatorio (el potenciómetro no recuerda el valor correcto) cuando apago y luego vuelvo a encenderlo. La X9313 hoja de datos indica que para iniciar un guardado de la posición del limpiaparabrisas digital en su propia EEPROM interna, la línea CS debe tomarse de baja a alta, mientras que la línea INC es alta. la línea INC está en RC6 y la línea CS está en RA5 (CS se lleva a 5V a través de 10k para evitar condiciones desconocidas en el encendido, esto fue una modificación tardía y no se muestra en el esquema).

El problema es que cuando se cambia el volumen y se apaga la alimentación y luego vuelve a encenderse el potenciómetro digital y ha disminuido una posición de limpiaparabrisas. Esto solo ocurre cuando se cambia el volumen y luego se apaga la primera vez. Por ejemplo, si coloco el potenciómetro en el medio, me da una salida de 1 V en el limpiaparabrisas (usando números falsos para simplificar) y cada paso es de 50 mV cuando enciendo la alimentación en el limpiaparabrisas, la salida en el limpiador será de 950 mV cuando vuelva a aplicar la alimentación. Si dejo el volumen allí y no lo cambio, puedo apagar y encender la energía tantas veces como lo desee y siempre recordará los 950 mV. Pero si vuelvo a cambiarlo para decir 500 mV y ciclo de energía, en el próximo encendido tendré 450 mV en el limpiaparabrisas y ese valor será recordado por tantos ciclos de energía como lo haya probado. Parece ser un problema de limpiaparabrisas a pie, como se explica en esta nota de aplicación , pero Parece extraño que solo ocurra el primer ciclo de alimentación después de que el valor haya cambiado.
Agregué pequeñas porciones de mi código. Los bits de configuración y la parte en la que estoy cambiando el valor del pot digital. Si alguien quiere ver el resto del código, hágamelo saber y se lo puedo enviar. ¿Alguien puede ver un problema con mi código o la configuración que podría estar causando este problema? Aprecio cualquier entrada que pueda obtener.

    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
    
pregunta Brandon Bailey

1 respuesta

3

Finalmente encontré el problema! Al inicializar los puertos en el PIC, las líneas CS e INC en el potenciómetro digital se despejaron momentáneamente el tiempo suficiente para iniciar un comando de disminución, pero no el tiempo suficiente para un comando de tienda. El valor correcto se estaba almacenando y el dispositivo disminuiría ese valor almacenado correcto en cada ciclo de energía, dando la ilusión de que se había almacenado un nuevo valor. Al establecer las líneas CS e INC en alto antes de la inicialización del puerto (no sabía que podría hacerlo) evité el decremento no deseado.

        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
    
respondido por el Brandon Bailey

Lea otras preguntas en las etiquetas