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