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