;L4xCH 4x3,6V LiFePO4 CHARGER SWITCH-CONTROL (c)Hauptmann 2.24 ;================================================================================= .EQU VERTAG = 27 .EQU VERMON = 2 .EQU VERJHR = 24 ;CPU: AVR64EA28 @ Fuse 16 MHz ;PORT-Alloc: DA0/IPU: REL4K0- DC0/OUT1: RELAY1 ; DA1/IPU: REL3K0- DC1/OUT1: RELAY2 ; DA2/IPU: REL2K0- DC2/OUT1: RELAY3 ; DA3/IPU: REL1K0- DC3/OUT1: RELAY4 ; DA4/IPD: REL1K0+ RPD ; DA5/IPD: REL2K0+ RPD ; DA6/IPD: REL3K0+ RPD ; DA7/IPD: REL4K0+ RPD ; ; ADD0/AIN: CBV DF0/INP: Not used ; ADD1/OUT: DUOLED:GREEN DF1/INP: Not used ; ADD2/OUT: DUOLED:ORANGE DF6/INP: Not used ; ADD3/IPU: CLED1: GREEN-LOW ; ADD4/IPU: CLED2: RED-LOW ; ADD5/IPU: BUTTON ; ADD6/INP: Not used ; ADD7/INP: Not used .EQU CLK4 = $3 ;CPU CLOCK DIVIDER 4 MHz .EQU CPUFREQ = $3f ;CPU CLOCK MANUAL TUNE (4 MHz) .EQU SRTCFREQ = $a2 ;START RTC FREQ (199.8 Hz @ 25°C) .EQU CHT = $31 ;CHARGE TIME LIMIT .DEF SECIC = r7 ;SECINT COUNTER .DEF SYSIC = r8 ;SYSINT COUNTER .DEF TSREG = r9 ;INTERRUPT SREG TEMP ;R10-R15 SYSINT TEMP ;[GPR0] USART BUFFER STATUS REGISTER GPR_GPR0 .EQU BUTTON = 0 ;GPR0/0: BUTTON SWITCH-STATUS ;[GPR1] [GPR2] [GPR3] ;--------------------------------------------------------------------------------- .DSEG DATARAM: DT0HSEK: .BYTE 1 ;[6800H] BUTTON SWITCH TIMER DT0SEK: .BYTE 1 ;[6801H] not used DT0MIN: .BYTE 1 ;[6802H] not used DT0STU: .BYTE 1 ;[6803H] not used DT1HSEK: .BYTE 1 ;[6804H] not used DT1SEK: .BYTE 1 ;[6805H] not used DT1MIN: .BYTE 1 ;[6806H] CHARGE TIMER CONTROL DT1STU: .BYTE 1 ;[6807H] not used ADD0MV: .BYTE 2 ;[6808H] MV BATT.VOLTAGE (>E00H= BATT.FULL) CCYCLE: .BYTE 1 ;[680AH] CHARGE CYCLE 0/2/4/6/8/A: ; 0: NOT STARTED ; 2: CHARGE RELAY1 ON ; 4: CHARGE RELAY1 ON ; 6: CHARGE RELAY1 ON ; 8: CHARGE RELAY1 ON ; A: FINISHED: GREEN FLASHES ; ODD: RELAY OFF, CHECK CONTACTS ;--------------------------------------------------------------------------------- .CSEG SYSINTTAB: jmp RESET ;0000: RESET jmp RETURN ;0002: NMI jmp RETURN ;0004: VLM jmp RETURN ;0006: CFD jmp SYSINT ;0008: RTC_CNT jmp SECINT ;000A: RTC_PIT jmp RETURN ;000C: CCL jmp RETURN ;000E: PORTA jmp RETURN ;0010: TCA0 OVF/LUNF jmp RETURN ;0012: TCA0 HUNF jmp RETURN ;0014: TCA0 CMP0 jmp RETURN ;0016: TCA0 CMP1 jmp RETURN ;0018: TCA0 CMP2 jmp RETURN ;001A: TCB0 CAP/OVF jmp RETURN ;001C: TCB1 CAP/OVF jmp RETURN ;001E: TWI0_TWIC jmp RETURN ;0020: TWI0_TWIH jmp RETURN ;0022: SPI0 jmp RETURN ;0024: USART0_RXC jmp RETURN ;0026: USART0_DRE jmp RETURN ;0028: USART0_TXC jmp RETURN ;002A: PORTD jmp RETURN ;002C: AC0 CMP jmp RETURN ;002E: ADC0_ERROR jmp ADCINT ;0030: ADC0_RESRDY jmp RETURN ;0032: ADC0_SAMPRDY jmp RETURN ;0034: AC1 CMP jmp RETURN ;0036: PORTC jmp RETURN ;0038: TCB2 CAP/OVF jmp RETURN ;003A: USART1_RXC jmp RETURN ;003C: USART1_DRE jmp RETURN ;003E: USART1_TXC jmp RETURN ;0040: PORTF jmp RETURN ;0042: NVM READY jmp RETURN ;0044: USART2_RXC jmp RETURN ;0046: USART2_DRE jmp RETURN ;0048: USART2_TXC jmp RETURN ;004A: TCB3 CAP/OVF jmp RETURN ;004C: TCA1 OVF/LUNF jmp RETURN ;004E: TCA1 HUNF jmp RETURN ;0050: TCA1 CMP0 jmp RETURN ;0052: TCA1 CMP1 jmp RETURN ;0054: TCA1 CMP2 ; jmp RETURN ;0056: PORTE ; jmp RETURN ;0058: PORTB RESET: ldi XH,CLK4 ;SYSTEM-CLOCK 4 MHz ldi XL,$d8 out CPU_CCP,XL sts CLKCTRL_MCLKCTRLB,XH ldi XL,4 sts CLKCTRL_MCLKTIMEBASE,XL ;1us CLKS @ 4MHz for ADC ; ldi XH,CPUFREQ ;CLOCK FEINTUNING ; sts CLKCTRL_OSCHFTUNE,XH clr XL ldi XH,high(DATARAM) ;SRAM INIT ldi YH,high(RAMEND) ldi YL,low(RAMEND) out CPU_SPL,YL out CPU_SPH,YH delram: st -Y,XL ;SRAM-DELETE: cp YH,XH ;6800H-7FFFH (6kB) brcc delram ldi XL,8 ;PORT CONFIG sts PORTA_PIN0CTRL,XL sts PORTA_PIN1CTRL,XL sts PORTA_PIN2CTRL,XL sts PORTA_PIN3CTRL,XL sts PORTD_PIN3CTRL,XL sts PORTD_PIN4CTRL,XL sts PORTD_PIN5CTRL,XL sbi VPORTC_DIR,0 ;OUTPUT RELAY1 sbi VPORTC_DIR,1 ;OUTPUT RELAY2 sbi VPORTC_DIR,2 ;OUTPUT RELAY3 sbi VPORTC_DIR,3 ;OUTPUT RELAY4 sbi VPORTD_DIR,1 ;OUTPUT DUOLED sbi VPORTD_DIR,2 ;OUTPUT DUOLED ldi XL,3 ;4MHz/DIV8= 500kHz ADC TAKT sts ADC0_CTRLB,XL ldi XL,6 ;INTERNAL REFERENCE 4,096V sts ADC0_CTRLC,XL ldi XL,4 ;SAMPDUR > 0,000004*500000 sts ADC0_CTRLE,XL ldi XL,$2a ;ENABLE FREERUN-MODE & 1024 Sample sts ADC0_CTRLF,XL ldi XL,0 ;AIN= AIN0/ADD0 sts ADC0_MUXPOS,XL ldi XL,1 ;ENABLE ADC RES_READY INT sts ADC0_INTCTRL,XL ldi XL,1 ;ENABLE ADC sts ADC0_CTRLA,XL ldi XL,$41 ;START SINGLE 12BIT CONVERSION sts ADC0_COMMAND,XL initrtc: lds XH,RTC_STATUS ;SYSINT/SEKINT(RTC) INIT: tst XH brne initrtc ldi XL,SRTCFREQ sts RTC_PERL,XL ;32768/xxx = 200Hz approx. sts RTC_PERH,XH ldi XH,1 sts RTC_INTCTRL,XH ;Enable OVF-INT sts RTC_CTRLA,XH ;Enable RTC initrtc1: lds XL,RTC_PITSTATUS tst XL brne initrtc1 sts RTC_PITINTCTRL,XH ;Enable PIT-INT ldi XL,$71 ;32768/32768 = approx.1Hz sts RTC_PITCTRLA,XL ;Enable PIT sei mprog: sleep jmp mprog ;--------------------------------------------------------------------------------- ;ADCINT ADC RESULT READY INTERRUPT (1024 BURST CONVERSION) ADCINT: in TSREG,CPU_SREG ;SREG->R9 movw r11:r10,XH:XL ;X-Pointer Backup movw r13:r12,YH:YL ;Y-Pointer Backup movw r15:r14,ZH:ZL ;Z-Pointer Backup lds XL,ADC0_RESULT0 ;READ CURRENT MV lds XH,ADC0_RESULT1 ;= RESET INTFLAG lds YL,ADC0_RESULT2 lds YH,ADC0_RESULT3 lsr YH ;RESULT/1024 ror YL ror XH lsr YH ror YL ror XH sts ADD0MV,XH ;SAVE sts ADD0MV+1,YL rjmp sysint96 ;------------------------------------------------------------------------------- ;SECINT SECOND-INTERRUPT SECINT: in TSREG,CPU_SREG ;SREG->R9 movw r11:r10,XH:XL ;X-Pointer Backup movw r13:r12,YH:YL ;Y-Pointer Backup movw r15:r14,ZH:ZL ;Z-Pointer Backup lds XL,CCYCLE sbrc XL,0 rjmp secint90 tst XL breq secint92 ;CCYCLE=0: ALL RELAY OFF cpi XL,2 breq secint20 cpi XL,4 breq secint40 cpi XL,6 breq secint60 cpi XL,8 brne secint92 ;CHARGE CYCLES FINISHED sbi VPORTC_OUT,3 rjmp secint80 secint20: sbi VPORTC_OUT,0 rjmp secint80 secint40: sbi VPORTC_OUT,1 rjmp secint80 secint60: sbi VPORTC_OUT,2 secint80: lds XH,DT1MIN ;CHARGE TIMER CONTROL tst XH ;(Safety shutdowns) brne secint82 ldi XH,CHT ;CHARGETIME LIMIT/CELL sts DT1MIN,XH rjmp secint95 secint82: cpi XH,1 breq secint88 ;CHARGETIME LIMIT REACHED lds XH,ADD0MV+1 cpi XH,$f breq secint88 ;3,8V VOLTAGE LIMIT REACHED sbic VPORTD_IN,3 rjmp secint95 ;CHARGEMODUL: CHARGING secint88: inc XL ;CHARGING FINISHED/FULL/NOBATT clr XH sts CCYCLE,XL sts DT1MIN,XH rjmp secint95 secint90: in XH,VPORTA_IN ;CCYCLE ODD: cpi XH,$f0 ;CHECK CONTACTS... brne secint92 ;NOT OK YET inc XL ;OK: NEXT RELAY OR FINISHED sts CCYCLE,XL secint92: cbi VPORTC_OUT,0 cbi VPORTC_OUT,1 ;ALL RELAY OFF cbi VPORTC_OUT,2 cbi VPORTC_OUT,3 secint95: inc SECIC ;INC SECINT-COUNTER ldi XL,1 ;CLEAR INTERRUPT FLAG sts RTC_PITINTFLAGS,XL rjmp sysint96 ;------------------------------------------------------------------------------- ;SYSINT SYSTEM INTERRUPT 200Hz SYSINT: in TSREG,CPU_SREG ;SREG->R9 movw r11:r10,XH:XL ;X-Pointer Backup movw r13:r12,YH:YL ;Y-Pointer Backup movw r15:r14,ZH:ZL ;Z-Pointer Backup inc SYSIC ;INC SYSIC sbrs SYSIC,0 ;100Hz Divider rjmp sysint90 rcall dtp ;DownTimer Processing rcall bup ;Button Processing sysint90: in XL,VPORTA_IN ;DUOLED CONTROL cpi XL,$f0 brne sysint94 ;CONTACT-SUM NOT OK cbi VPORTD_OUT,2 ;DUOLED:GREEN lds XL,CCYCLE ;CONTACT-SUM OK! cpi XL,$a brlo sysint92 cbi VPORTD_OUT,1 ;CCYCLE>= $A sbrs SYSIC,4 ;FLASHING: CHARGING FINISHED sysint92: sbi VPORTD_OUT,1 rjmp sysint95 sysint94: cbi VPORTD_OUT,1 ;DUOLED:ORANGE sbi VPORTD_OUT,2 ;CONTACTS NOT ACTIVE! sysint95: ldi XL,1 ;OVF INTFLAG RESET sts RTC_INTFLAGS,XL wdr ;WATCHDOG RESET sysint96: movw ZH:ZL,r15:r14 ;Z-Pointer Restore sysint97: movw YH:YL,r13:r12 ;Y-Pointer Restore sysint98: movw XH:XL,r11:r10 ;X-Pointer Restore sysint99: out CPU_SREG,TSREG ;SREG Restore RETURN: reti ;--------------------------------------------------------------------------------- ;DTP PROCESS DTx (x= DoubleWord 0-7: HSEC/2.56Sek/10.92Min/46.6 Hour) ; (HSEC/ SEC / MIN / Hour ) ; 1Sec= 64/00/00/00, 1Min= 70/17/00/00, 1Hour= 40/7E/05/00 ; 1Day= 00/D6/83/00, 1Week= 00/DA/9A/03 dtp: ldi ZL,low(DT0HSEK) ldi ZH,high(DT0HSEK) ldi YL,2 ;2 TIMER dtp1: ldd XL,Z+0 ldd XH,Z+1 sbiw XH:XL,1 brsh dtp2 ldd XL,Z+2 ldd XH,Z+3 sbiw XH:XL,1 brlo dtp3 std Z+2,XL std Z+3,XH ser XL ser XH dtp2: std Z+0,XL std Z+1,XH dtp3: adiw ZH:ZL,4 dec YL brne dtp1 ret ;--------------------------------------------------------------------------------- ;BUP BUTTON PROCESSING: START/STOP CHARGE CYCLES bup: sbic VPORTD_IN,5 ;B=0: CAN SWITCH ON ret ;BUTTON INACTIVE->RET lds XL,DT0HSEK ldi XH,5 tst XL ;BUTTON ACTIVE brne bup8 ;OLD ACTIVE sbis GPR_GPR0,BUTTON rjmp bup2 cbi GPR_GPR0,BUTTON ;NEW ACTIVE: SWITCH OFF rjmp bup7 bup2: sbi GPR_GPR0,BUTTON ;NEW ACTIVE: SWITCH ON ldi XL,1 bup7: sts CCYCLE,XL bup8: sts DT0HSEK,XH bup9: ret