Я пытаюсь управлять цифровым потенциометром с помощью PIC18F14K50, и у меня возникает случайная проблема (потенциометр не запоминает правильное значение), когда я выключаю питание, а затем снова включаю. В техническом описании X9313 указано, что для инициирования сохранения положения ползунка цифровых потенциометров в его собственное внутреннее EEPROM линия CS должна быть переведена с низкого уровня на высокий, в то время как линия INC подтянута к высокому уровню. линия INC находится на RC6, а линия CS на RA5 (CS подтягивается к 5 В через 10 кОм, чтобы избежать неизвестных условий при включении питания, это была поздняя модификация и не показана на схеме).
Проблема в том, что когда громкость изменяется и питание отключается, а затем снова включается, цифровой потенциометр снова включается и уменьшает одно положение дворника. Это происходит только при изменении громкости, а затем в ПЕРВЫЙ раз отключается питание. Например, если я установил потенциометр посередине, давая мне выход 1 В на стеклоочистителе (используя ложные числа для простоты), и каждый шаг составляет 50 мВ, когда я выключаю питание, выход на стеклоочистителе будет 950 мВ, когда я снова подаю питание. Если я оставлю громкость там и не изменю ее, я могу включать и выключать питание столько раз, сколько захочу, и он всегда будет помнить 950 мВ. Но если я снова изменю его, скажем, на 500 мВ и выполню цикл включения, при следующем включении питания у меня будет 450 мВ на очистителе, и это значение будет запомнено на столько циклов включения, сколько я тестировал. Кажется, это проблема с ходячими дворниками, как обсуждалось в этом интерсиле.примечание к приложению , но кажется странным, что это происходит только при первом цикле питания после изменения значения.
Я добавил небольшие части моего кода. биты конфигурации и часть, где я меняю значение цифрового горшка. Если кто-то хочет увидеть остальную часть кода, дайте мне знать, и я могу предоставить ее вам. Может ли кто-нибудь увидеть проблему с моим кодом или настройкой, которая может вызвать эту проблему? Я ценю любой вклад, который я могу получить.
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
Наконец-то я нашел проблему! При инициализации портов на PIC линии CS и INC на цифровом потенциометре на мгновение очищались достаточно долго, чтобы инициировать команду уменьшения, но недостаточно долго для команды сохранения. Сохранялось правильное значение, и устройство уменьшало это правильное сохраненное значение при каждом цикле включения питания, создавая иллюзию сохранения нового значения. Установив высокие значения линий CS и INC перед инициализацией порта (даже не знал, что смогу это сделать), я избежал нежелательного уменьшения.
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