Problema al controlar el potenciómetro digital con micro

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 lo apago y lo vuelvo a encender. La hoja de datos X9313 establece que para iniciar un guardado de la posición del limpiaparabrisas de los potenciómetros digitales en su propia EEPROM interna, la línea CS debe tomarse de menor a mayor mientras que la línea INC se eleva. 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, esta 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 se vuelve a encender, el potenciómetro digital vuelve a encenderse y ha disminuido una posición del limpiaparabrisas. Esto solo sucede cuando se cambia el volumen y luego se enciende y apaga por PRIMERA vez. Por ejemplo, si configuro el potenciómetro en el medio, lo que me da una salida de 1 V en el limpiaparabrisas (usando números falsos para simplificar) y cada paso es de 50 mV cuando ciclo y enciendo, la salida en el limpiaparabrisas será de 950 mV cuando vuelva a aplicar energía. Si dejo el volumen allí y no lo cambio, puedo encender tantas veces como quiera y siempre recordará los 950 mV. Pero si lo cambio de nuevo para decir 500 mV y ciclo de encendido, en el próximo encendido tendré 450 mV en el limpiaparabrisas y ese valor se recordará durante tantos ciclos de encendido como haya probado. Parece ser un problema de limpiaparabrisas andante como se discutió en este intersilnota de la aplicación , pero parece extraño que solo ocurra el primer ciclo de encendido después de que el valor haya cambiado.
Agregué pequeñas porciones de mi código. los bits de configuración y la parte donde estoy cambiando el valor del potenciómetro digital. Si alguien quiere ver el resto del código, hágamelo saber y se lo puedo hacer llegar. ¿Alguien puede ver un problema con mi código o la configuración que podría estar causando este problema? Agradezco cualquier aporte que pueda obtener.

Parcial;  Esquemático

    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

Respuestas (1)

¡Finalmente encontré el problema! Mientras se inicializaban los puertos en el PIC, las líneas CS e INC en el potenciómetro digital se borraban momentáneamente el tiempo suficiente para iniciar un comando de disminución pero no lo suficiente para un comando de almacenamiento. Se estaba almacenando el valor correcto y el dispositivo disminuiría ese valor almacenado correcto cada ciclo de encendido, dando la ilusión de que se había almacenado un nuevo valor. Al configurar las líneas CS e INC en alto antes de la inicialización del puerto (ni siquiera sabía que podía hacer eso), evité la disminución no deseada.

        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