;********************************************************************* ; File: LiIon_1s_Lader.ASM ; Author: Ottmar ; Date: 21.05.2022 ;********************************************************************* NOLIST ; PROJEKT ; Laden von 1zelligem LiPo-Akku, mit Ladezustandsabhängiger Steuerung ; des Ladestromes, automatische Abschaltung bei Ladeende. ; ; FUNKTIONSÜBERBLICK ; Der Ladevorgang beginnt mit Tastendruck (KEY_START). Sodann werden ; die Parameter ; Vdd - Versorgungsspannung der gesamnten Schaltung ; Vdrn - Spannung ueber Drain IRFZ34 ; Vbat - aktuelle Akkuspannung = Vdd - Vdrn ; Ishnt - Ladestrom ; P0W - Wiperposition MC4151 ; ausgegeben. ; Vbat wird fortlaufend berechnet und der Ladestrom mittels der ; Wiperposition so eingestellt, dass die maximale Vbat=4200mV-20mV ; nicht überschritten wird. ; Die Programmierung einer Ladespannungskurve ist Aufgabe eines ; späteren, fortführenden Projekts ;********************************************************************* ; Hardware PIC16F1627 Int. Osz 4MHz9 ; LCD 4x20 ; 2-Wire-Adapter für LCD ; Ladeschaltung auf Steckbrett ; MCP4151-SPI DigiPot Ladestromeinstellung ; LM358 OPA Ladestromregelung ; IRFZ34N MOSFET-Treiber Ladestrom ; LiIon (Nokia BL5CA (1 Zelle aus Handy) ;********************************************************************* ; Files: 00 HEADER_LiIon.INC ; 01 ISR_LiIon.INC ; 02 INIT_LiIon.INC ; 03 LCD_LiIon.INC ; 04 ADC_LiIon.INC ; D:\MPLAB_PROJEKTE\z_LCD\HD44780_2Wire.INC ; PIC16F1827.INC ; Schaltplan_LiPo-Lader ;********************************************************************* #INCLUDE <00_HEADER_LiIon.INC> ;********************************************************************* ORG 0x0004 ;INTERRUPT-VECTOR #INCLUDE <01_ISR_LiIon.INC> ;********************************************************************* #INCLUDE <02_INIT_LiIon.INC> ;********************************************************************* main: ..... .....Ablaufsteuerung ;******************************************************************** Charge_Ctrl: ; Hier Einstellung des korrekten Stromes, dass die maximale Ladespannung ; 4200mV nicht überschreitten wird. ; klappt soweit üerfekt. ; nahfolgend sie Übergabe der WiperValue - Position von MCP4151,P0W ;-------------------------------------------------------------------- ;...... chrg_wiper_ctrl: ;WiperValue im Bereich =< WIPER_MAX? movlw WIPER_MAX ;Prüfen: WiperValue <> WIPER-MAX subwf WiperValue,w btfss STATUS,C GOTO chrg_wpr_set ;C=0 WiperValue < WIPER_MAX-prüfen movlw WIPER_MAX-.1 ;C=1 WiperValue => WIPER_MAX movwf WiperValue ; chrg_wpr_set: movf WiperValue,w ;adjust WiperValue MCP4151,P0W CALL WiperValue_Set ; charge_ctrl_end: RETURN ;********************************************************************* ; ; nachfolgend die Routine welche das MSSP-Modul des PIC16F1827 ; verwendet, um die Wiperposition des Digi-Pot einzustellen. ;********************************************************************* WiperValue_Set: ; 16-Bit Command, used to set wiper position ; Bit 15:8 Data1 Address (4bits), Command(2bits), Data (2bits) ; Bit 7;0 Data0 = value to be written to wiper-memory, ; is handed over through WREG ; Übergabe: Wiper_Value wird vom im WREG in Data0übernommen ; movwf Data0 ;LowByte copy WREG -> wipervalue bcf PORTA,SS2 ;b2=1 ENABLE Chip Select Output (LOW) ; movlw WIPER0_WRITE ;b7:4="0000" wiper0 memory-address movwf Data1 ;b3:2="00" Command "Write Data" ;1:0="00" b9:8 Databits WiperValue_Send: ;SEND COMMAND BYTE movwf Data1 ;16Bit-Comand Bit 16:9 WREG -> Data1 BANKSEL SSP2BUF ;bank4 movwf SSP2BUF ;copy Data to be send from WREG->SSP2BUF ; #IFDEF __DEBUG bsf SSP2STAT,BF ;BF-Flag wird im Debug-Modus nicht gesetzt #ENDIF ; wipervalue_buf1: btfss SSP2STAT,BF ;b0=1? Data transfer complete? (Buffer Full?) GOTO wipervalue_buf1 ;NO, check again movf SSP2BUF,w ;Get Data from SSP2BUF, throw it away ;------------------ BANKSEL 0 movf Data0,w ;16Bit-Comand Bit 7:0 Data0->WREG BANKSEL SSP2BUF ;bank4 movwf SSP2BUF ;ccopy Data to be send from WREG->SSP2BUF ; #IFDEF __DEBUG ;Für Debugging muß das BF-Flag gesetzt bsf SSP2STAT,BF ;werden da der SPI-Verkehr nicht erfolgt #ENDIF ; wipervalue_buf0: btfss SSP2STAT,BF ;b0=1? Data transfer complete? (Buffer Full?) GOTO wipervalue_buf0 ;NO, check again movf SSP2BUF,w ;Get Data from SSP2BUF, throw it away BANKSEL 0 ;bank0 bsf PORTA,SS2 ;b2=1 Disable Chip Select Output (high) CALL WiperValue_Out ;Actual Wipervalue (MCP4151.P0W) RETURN ;********************************************************************* ; ; Zum guten Schluss noch die ISR - Interval = 10ms, ; welche auch die Entprellroutine nach Dattalo enthält. ; Dazu noch die im Sekundentakt hochzählende Uhr für die Ladezeit. ; ;********************************************************************* ; File: 00_ISR_LiIon.INC ; Author: Ottmar ; Date: 21.05.2022 ;********************************************************************* isr_tmr0: CTRL_LEDOFF ;ISR-Widerholrate = 10ms ;INTCON,GIE is automatically cleared ;WREG, STATUS, PCLATH are automatically saved ; bcf INTCON,TMR0IF ;b2=0 overflow flag is cleared movlw .100 movwf TMR0 ;Preset TMR0 after 100 overflow cycles ; isr_debounce: ;needs 15 cycles ; Take over current button state into the debounce routine movf KEY_PORT,w ;select only input-Port-pins (push buttons) andlw KEY_MASK movwf KeyState ;the actual state of inputs ; comf KeyState,w ; Increment the vertical counter movf cnt1,W xorwf cnt0,F comf cnt1,F ; See if any changes occurred movf KeyState,W xorwf KeyPress,W ; Reset the counter if no change has occurred andwf cnt1,F andwf cnt0,F ; Determine the counter's state movf cnt1,W iorwf cnt0,W ; Clear all bits that are filtered-or more accurately, save ; the state of those that are being filtered andwf KeyPress,F xorlw 0xff ; Re-write the bits that haven't changed. andwf KeyState,W iorwf KeyPress,F ;the debounced keybits are LOW as long as ; ;the button is down. isr_cnt: decf cnt10ms,f ;Instruction Descriptions S.329 btfss STATUS,Z ;Z=1? cnt10ms=0? 1 sec finished? GOTO isr_end ;NO jump over set counter & new sec movlw .100 ; preset counter movwf cnt10ms ;---------------------------- ;Bit Flags,NEW_SEC wechselt von 0->1->0 time 1-1 = 2xISR-Interval clrw bsf WREG,NEW_SEC ;universeller als movlw b'01000000' xorwf Flags,f; ; btfss Flags,NEW_SEC ;Flag is used to refresh LCD-Data GOTO isr_end ;each second bsf Flags,NEW_SEC CTRL_LEDON ; isr_sec: ; incf Esec,f ;Increase time each new second movlw .10 subwf Esec,w btfss STATUS,Z GOTO isr_end ; clrf Esec incf Zsec,f ;10 Sekunden erhöhen movlw D'6' subwf Zsec,w btfss STATUS,Z GOTO isr_end ;10 Sekunden <> 6 ; clrf Zsec incf Emin, f ;1 Minuten erhöhen movlw D'10' subwf Emin, w btfss STATUS, Z goto isr_end ;1 Minuten <> 10 ; clrf Emin incf Zmin, f ;10 Minuten erhöhen movlw D'6' subwf Zmin, w btfss STATUS, Z goto isr_end ;10 Minuten <> 6 ; clrf Zmin incf Estd, f ;1 Stunden erhöhen movlw D'10' subwf Estd, w btfss STATUS, Z goto isr_end ; clrf Estd incf Zstd,f ;10 Stunden erhöhen isr_end: RETFIE ;*********************************************************************