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.
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
¡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