Problem bei der Steuerung des Digitalpotentiometers mit Mikro

Ich versuche, ein digitales Potentiometer mit einem PIC18F14K50 zu steuern, und habe ein zufälliges Problem (Potentiometer merkt sich nicht den richtigen Wert), wenn ich es aus- und wieder einschalte. Das Datenblatt des X9313 besagt, dass zum Einleiten einer Speicherung der Wischerposition der digitalen Töpfe in seinem eigenen internen EEPROM die CS-Leitung von niedrig auf hoch gebracht werden muss, während die INC-Leitung auf hoch gezogen wird. Die INC-Leitung befindet sich auf RC6 und die CS-Leitung befindet sich auf RA5 (CS wird über 10 k auf 5 V gezogen, um unbekannte Bedingungen beim Einschalten zu vermeiden. Dies war eine späte Änderung und ist im Schaltplan nicht dargestellt).

Das Problem ist, dass, wenn die Lautstärke geändert wird und der Strom ausgeschaltet und dann wieder eingeschaltet wird, das digitale Poti wieder eingeschaltet wird und eine Wischerposition verringert hat. Dies geschieht nur, wenn die Lautstärke geändert und dann das ERSTE Mal aus- und wieder eingeschaltet wird. Wenn ich zum Beispiel den Topf in die Mitte stelle und am Wischer einen Ausgang von 1 V erhalte (der Einfachheit halber falsche Zahlen verwenden) und jeder Schritt 50 mV beträgt, wenn ich die Stromversorgung aus- und wieder einschalte, beträgt der Ausgang am Wischer 950 mV, wenn ich die Stromversorgung wieder anlege. Wenn ich die Lautstärke dort belasse und sie nicht ändere, kann ich die Stromversorgung so oft wiederholen, wie ich möchte, und sie wird sich immer an die 950 mV erinnern. Aber wenn ich es wieder auf 500 mV ändere und die Leistung aus- und wieder einschalte, habe ich beim nächsten Einschalten 450 mV am Wischer und dieser Wert wird für so viele Einschaltzyklen gespeichert, wie ich getestet habe. Es scheint ein Problem mit laufenden Scheibenwischern zu sein, wie in diesem Intersil diskutiertApp-Hinweis , aber es scheint seltsam, dass dies nur beim ersten Aus- und Einschalten geschieht, nachdem sich der Wert geändert hat.
Ich habe kleine Teile meines Codes hinzugefügt. die Konfigurationsbits und der Teil, in dem ich den Wert des digitalen Potis ändere. Wenn jemand den Rest des Codes sehen möchte, lass es mich wissen und ich kann ihn dir zukommen lassen. Kann jemand ein Problem mit meinem Code oder dem Setup sehen, das dieses Problem verursachen würde? Ich freue mich über jeden Input, den ich bekommen kann.

Teilweise;  Schema

    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

Antworten (1)

Endlich habe ich das Problem gefunden! Während der Initialisierung der Ports auf dem PIC wurden die CS- und INC-Leitungen auf dem digitalen Pot vorübergehend lange genug gelöscht, um einen Dekrementierungsbefehl einzuleiten, aber nicht lange genug für einen Speicherbefehl. Der korrekte Wert wurde gespeichert, und das Gerät verringerte diesen korrekten gespeicherten Wert bei jedem Einschaltzyklus, wodurch die Illusion entstand, dass ein neuer Wert gespeichert worden war. Indem ich die CS- und INC-Leitungen vor der Portinitialisierung hoch setzte (wusste nicht einmal, dass ich das tun könnte), vermied ich das unerwünschte Dekrement.

        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