Проблема управления цифровым потенциометром с микроконтроллером

Я пытаюсь управлять цифровым потенциометром с помощью 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

Ответы (1)

Наконец-то я нашел проблему! При инициализации портов на 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