;********************************************************************* ; File: 02_INIT_LiIon.INC ; Author: Ottmar ; Date: 21.05.2022 ;********************************************************************* init: ;--OSCCON 4MHz Internal Oscillator Frequency adjustment ; Internal Osc. block fosc=4MHz, 4xPLL disabled ; b7 =0/1 4xPLL off/on ; b6:3 =1101 fosc=4MHz ; b2 =0 unimplemented ; b1:0 =10 System Clock is Int.Osc BANKSEL OSCCON ;bank1 S.65, S.53ff movlw b'01101010' ;4xPLL OFF, 4MHz ; movlw b'01111010' ;4xPLL OFF, 16MHz ; movlw b'11110010' ;4xPLL ON, 4x8=32MHz movwf OSCCON clrf OSCTUNE ; bank1 adjust fosc = factory calibrated ; BANKSEL WPUB ;S.128 ;Beachten: WeakPull ups an den ADC-Pins müssen abgeschaltet sein ;entweder pauschal mit "bsf OPTION_REG,NOT_WPUEN" (b7=1) ;oder mit dem Register WPUA,RA5- nur MCLRE-pin S.123 ;und/oder WPUB,WPUB7:0 S.128 bcf WPUB,VREF ;RB3/AN9 (09) All weak pullups are DISABLED ; BANKSEL PORTA ;ADC_PORT, SPI_PORT,KEY_PORT clrf PORTA BANKSEL LATA clrf LATA BANKSEL TRISA bcf TRISA,RA7 ;RA7(16) n.c OUT bcf TRISA,RA6 ;RA6(15) n.c OUT bsf TRISA,RA5 ;RA5(04) INP MCLRE, Reset-Button bsf ADC_TRIS,DRAIN ;RA4(03) AN3 INP Udrain zugleich -Akku bsf ADC_TRIS,SHUNT ;RA3(02) AN4 INP Ushunt Strommessung bsf ADC_TRIS,VDD5V ;RA2(01) AN2 INP Vdd 5V zugleich +Akku bcf TRISA,SS2 ;RA1(18 SPI OUT bcf TRISA,SDO2 ;RA0(17) SPI OUT BANKSEL ANSELA clrf ANSELA ;RA7:6 n.c. RA7:5,RA1:0 dig.I/O bsf ADC_ANSEL,SHUNT ;RA4(03) AN4 Ushunt Strommessung bsf ADC_ANSEL,DRAIN ;RA3(02) AN3 Udrain zugleich -Akku bsf ADC_ANSEL,VDD5V ;RA2(01) AN2 Vdd 5V zugleich +Akku ; ;--PORTB BANKSEL PORTB ;ADC, SPI_PORT->PORTA clrf PORTB BANKSEL LATB clrf LATB BANKSEL TRISB bcf LCD_TRIS,LCDDAT ;RB7(13) OUT (blue) bcf LCD_TRIS,LCDCLK ;RB6(12) OUT (grey) bcf SPI_TRIS,SCK2 ;RB5(11) OUT SPI Clock bcf TRISB,SW_VREF ;RB4(10) OUT Vref INP ON/OFF bsf TRISB,VREF ;RB3(09) AN9 INP Vref an MCP4151,P0W bsf TRISB,KEY_START ;RB2(08) INP bsf TRISB,KEY_STOP ;RB1(07) INP bcf TRISB,LED_GRN ;RB0(06) OUT to Control programm flow BANKSEL ANSELB clrf ANSELB bsf ANSELB,VREF ;RB3(09) AN9 MCP4151,P0W ; ; ;--------------------------------------------------------------------- ; MSSP2-MODULE FOR SPI INITIALIZE S.278-279 ;--------------------------------------------------------------------- ;--APFCON0: ALTERNATE PIN FUNCTION S.119 ; FOR MSSP1-MODULE ONLY! change SDO/SS1-Pin Function ; APFCON0,SDO1SEL 0 = SDO1 function is on RB2 ; 1 = SDO1 function is on RA6 ; APFCON0,SS1SEL: 0 = SS1 function is on RB5 ; 1 = SS1 function is on RA5 ; ; MMSP2-MODULE the SPI-Pins are: ; SS2 =RA1(18) ; SD02=RA0(17 ; SCK2=RB5(11) ; SDI2=RB2(08) ; BANKSEL SSP2STAT ; b7= 0 MASTER: INPUT DATA SAMPLED AT MIDDLE/END OF DATA OUTPUT TIME ; b6= 1 TRANSMIT OCCURS ON TRANSITION FROM IDLE TO ACTIVE CLOCK STATE ; b5= 0 last byte received or transmitted was DATA/ADDRESS ; b4:1= 0000 I2C mode only ; b0= 0 0/1 Flag Receive complete/not complete movlw b'01000000' movwf SSP2STAT ; BANKSEL SSP2CON1 ;(SPI-Mode) ;S.280 ; b7 =0 unused I2C mode only ; b6 =0 Flag Receive Overflow Indicator 0=No overflow ; b5 =1 SSPxEN Enables SPI-Port and config SCKx, SDOx, SDIx and SSx as the source of the serial port pins (2) ; b4 =0 CKP 1/0 IDLE STATE FOR CLOCK is a HIGH/LOW LEVEL ; b3:0=0010 SSPxM Synchronous Serial Port Mode Select bits ; 0000 = SPI Master mode, clock = F OSC /4 ; 0001 = SPI Master mode, clock = F OSC /16 ; 0010 = SPI Master mode, clock = F OSC /64 ; 1010 = SPI Master mode, clock = F OSC /(4 * (SSPxADD+1)) (5) movlw b'00110001' movwf SSP2CON1 BANKSEL 0 ; ;--------------------------------------------------------------------- ; AD-CONVERSION INITIALIZE (procedure-excample S.144) ;--------------------------------------------------------------------- ;--ADC-CHANNEL SELECTION BANKSEL ADCON0 ;bank1 S. 145 ; b7= unimplemented ; b6:2= AD-Channel S.145 ; ADC_VDD EQU b'00001000' RA2(01) AN2 Vdd ; ADC_SHUNT EQU b'00001100' RA3(02) AN3 Strommess-Shunt ; ADC_DRAIN EQU b'00010000' RA4(03) AN4 -Referenz für Uakku ; ADC_P0W EQU b'00100000' ;RB4(10) AN8 Vref für OPA LM358 ; ADC_P0W EQU b'00101100' ;RB1(07) AN11 Vref für OPA LM358 ; b1= ADCON0,G0 Setting this bit starts an A/D conversion cycle. ; Bit is automatically cleared when the A/D conversion has completed. ; b0= ADCON0,ADON ;Bit0 ADC enabled ; ;--ADC VREF, CONVERSION CLOCK, RESULT FORMAT BANKSEL ADCON1 ;bank1 S. 146 clrf ADCON1 bsf ADCON1,ADFM ;b7=1 Result Format right justified bsf ADCON1,ADCS2 ;b6:4=001 Conversion Clock=Fosc/8 bsf ADCON1,ADCS1 ; 110 " /64 bcf ADCON1,ADCS0 ;0 b3 unimlemented bcf ADCON1,ADNREF ;b2 Vref- connected to Vss (GND) bsf ADCON1,ADPREF1 ;b1:0=11 Vref+ intern connected bsf ADCON1,ADPREF0 ; movlw b'10010011' ; movwf ADCON1 ; ;--ADC VOLTAGE REFERENCE S1erLECTION BANKSEL FVRCON ;S.135 clrf FVRCON bsf FVRCON,FVREN ;b7= 1 FVR enabled ; FVRCON,FVRRD1 ;b6= 0/1 FVR not enalbled/ready ; Reserved ;b5 0 ; Reserved ;b4 0 ; FVRCON,CDAFVR ;Bit3:2=00 Comp+DAC FVR off bcf FVRCON,ADFVR1 ;Bit1:0=11 Vref+ intern=4096mV bsf FVRCON,ADFVR0 ;Bit1:0=01 Vref+ intern 1,024V BANKSEL 0 ; ;--------------------------------------------------------------------- ; LCD INITIALIZATION & TEST & OUTPUT-LCD_MASK ;--------------------------------------------------------------------- #IFNDEF __DEBUG ;LCD-Init nicht im DEBUG-Modus durchlaufen CALL Lcd_Init ;initialize the LCD CALL Lcd_Ready ;LCD-Test: "LCD 2Wire ready! movlw .10 ;value to delay 10x100ms CALL Delay100ms ;show LCD-Test for estimated delaytime CALL Lcd_Clear ;clear display ;--CREATE LCD-MASK movlw DISPLAY_OFF ;LCD Anzeige von Zeichen ausschalten CALL OutLcd_Ctrl ;verhindert wirrre Zeichen movlw HIGH tbl_lcd_mask4x20 movwf pntr1 movlw LOW tbl_lcd_mask4x20 movwf pntr0 movlw LCD_LINES ;Zeilen 1-4 im LCD ausgeben CALL LcdOut_Table_1 movlw DISPLAY_ON ;LCD-Zeichen wieder sichtbar CALL OutLcd_Ctrl #ENDIF ;--------------------------------------------------------------------- ;--PRESET/CLEAR VARIABLES ;--------------------------------------------------------------------- clrf Flags ;Allgemeine Programmablaufsteuerung ; ;clear all digits of ISR-clock clrf cnt10ms clrf Esec ;ISR-Clock ISR-SS.MM.HH clrf Zsec clrf Emin clrf Zmin clrf Estd clrf Zstd ; ;Set Icharge = 0 #IFNDEF __DEBUG clrf WiperValue CALL WiperValue_Set ;MCP4151,P0W = 0 #ENDIF VREF_OFF ;RB4=0 OPAVref = 0 CTRL_LEDOFF ;Aus, später aktiv im Ladezyklus ;--------------------------------------------------------------------- ;--INTERRUPT TMR0-OVERFLOW-INTERRUPT ;--------------------------------------------------------------------- ; ISR Interval Soll = 4000us (fosc/4) = 1.000.000us ; 1.000.000 / 4000us = 250 ; 1.000.000 / 250 = 4.000 Prescalerrate=4000/256 = 15,6 ; next highest rate = 16:1 ; Preset TMR0 = 1.000.000 /16/250=250 (vgl. ISR) BANKSEL OPTION_REG ;S.176 ;b7 =0 (=1 weak pull ups disabled) ;b6 =0 unused ;b5 =0 Timer0 Clock Source is fosc/4 ;b4 =0 TMR0 increment on LOW/HIGH edge ;b3 =0 Prescaler is assigned to the Timer0 module ;b2:0=011 Prescaler Rate=1:16; TMR0 Preset .7 4ms ;b2:0=100 " " 1:32 " " .100 5ms ;b2:0=101 Prescaler Rate=1:64, TMR0 Preset .100 10ms movlw b'00000100' movwf OPTION_REG ; BANKSEL 0 clrf TMR0 bcf INTCON,TMR0IF ;TMR0 register did not overflow bsf INTCON,TMR0IE ;b5 0/1 Disable/enable TMR0 overfl. S.86 bsf INTCON,GIE ;b7=1/0 Interrupts global enabled/disabled ; GOTO main ;--------------------------------------------------------------------- ;--LCD-MASK TABLE ;tbl_lcd_mask4x16: ;0123456789012345 ; dt LINE1+.0,"Vdd : V",80h ;.,..V Ub+Akku ; dt LINE2+.0,"Shunt: mV",80h ;...mV Ladestrom ; dt LINE3+.0,"Drain: mV",80h ;...mV" -Akku ; dt LINE4+.0,"P0W : mV",80h ;...mV" Wiper ; ; DDRAM-Addr, Text,Endmark ; tbl_lcd_mask4x20: ;01234567890123456789 dt LINE1+.0,"Vdd 0mV Ud 0mV",80h ;Versorgung, Vdrain IRFZ34N dt LINE2+.0,"Bat 0mV Vrf 0mV",80h ;LiIon-Ladespannung, Vref dt LINE3+.0,"Shnt 0mA P0W 0 ",80h ;Ladestrom, Wiperpositio dt LINE4+.0," Push [START] ",80h ;Ausgabe Ladezeit ; 01234567890123456789 ; START 00:00:00 ; START 00:00:00 ; "FERTIG",80h ;Ausgabe Ladezeit ; DDRAM-Addr, Text,Endmark ; tbl_no_batt: ;01234567890123456789 dt LINE4+.0," No Accu to charge! ",80h ;Ausgabe Ladezeit ; tbl_charge_end: ;01234567890123456789 dt LINE4+.0,"FERTIG",80h ;Ausgabe Ladezeit