⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qt2chgrdemo.asm

📁 freescale充电器原程序,可直接编译
💻 ASM
📖 第 1 页 / 共 2 页
字号:
        cmp     #$80                    ; 80/FF =128/255= 50% duty = max duty allow for Trickle charge
        beq     exit_CC_Trick
        inc     PWM_duty_L
        bra     exit_CC_Trick
error_CC_Trick
        clr     PWM_duty_L
        clr     PWM_duty_H
        bclr    0,PTA                   ; output low to PWM_ctrl pin
        bclr    0,DDRA                  ; change the PWM_ctrl pin to input
        mov     #%00001000,TSC0         ; disable PWM
exit_CC_Trick
        mov     PWM_duty_H,TCH0H        ; write Hi byte first
        mov     PWM_duty_L,TCH0L

        jsr     bat_V_chk
        lda     VOLTAGE
        cmp     #$91                    ; >2.5V?
        bhi     exit_trikle
        jsr     check_tim_out           ; 10 mins charging time out?
        brset   time_overflow,FLAG,CHRG_FAULT

       ;jsr     Tx_data                 ; transmit the data out
;        jsr      dly_500ms

        bra     trickle_loop
exit_trikle
        bclr    TOIE,TSC
        clr     chrg_tim_cnt_H
        clr     chrg_tim_cnt_L
        bclr    trickle,FLAG1
        bclr    trickle_fin,FLAG1
        jmp     fast_charge
*----------------------------------------------------------------------------------------

CHRG_FAULT
        clr     TCH0L
        clr     TCH0H
        clr     PWM_duty_L
        clr     PWM_duty_H
	mov     PWM_duty_H,TCH0H        ; write Hi byte first
        mov     PWM_duty_L,TCH0L

        mov     #%00010000,TSC0         ; disable PWM, TCH0 as I/O with o/p Low
        bclr    TOIE,TSC                ; disable TOF interrupt
        bclr    0,PTA                   ; output low to PWM_ctrl pin
        bclr    0,DDRA                  ; change the PWM_ctrl pin to input

Flash_LED
        bset    Green_LED,PTA           ; turn-on Green LED
        jsr     dly_500ms
	jsr	check_bat_remove
        brset   bat_remove_f,FLAG1,bat_rmved 	; battery removed?
        bclr    Red_LED,PTA             ; turn on Red LED
        jsr     dly_500ms
	jsr	check_bat_remove
        brset   bat_remove_f,FLAG1,bat_rmved    ; battery removed?
        bra     Flash_LED
bat_rmved
        jsr     dly_20ms
	jsr	check_bat_remove
        brset   bat_remove_f,FLAG1,exit_bf
        bra     Flash_LED
exit_bf
        jmp     START

********************************************************************
*     Constant Current Charging Control
*
*    R sense = 0.5 ohm, VrefH = 4.40V
*-------------------------------------------------------------------
*    I (mA)       380      310       200       100       75      50
*    Isense(mV)   190      155       100        50       37      25
*    CURRENT      $0B      $09       $06       $03       $02     $01
********************************************************************
CC_Charging
        bclr    CC_error,FLAG1
        jsr     bat_I_chk
        lda     CURRENT
        CMP     #$0B
        BLO     Increase_Current        ; if current < 380mA
        BEQ     exit_CC                 ; if equal then let it be
Decrease_Current                        ; if current > 380mA
        lda     PWM_duty_L
        cmp     #$00                    ; 01/FF = 01/255 = 1% duty
        beq     error_CC
        dec     PWM_duty_L
        bra     exit_CC
Increase_Current
        lda     PWM_duty_L
        cmp     #$FF                    ; FF/100 =255/256= 99% duty = max duty
        beq     exit_CC
        inc     PWM_duty_L
        bra     exit_CC
error_CC
        bset    CC_error,FLAG1
        mov     #$10,TSC0               ; disable PWM output
        bclr    0,PTA                   ; output low to PWM_ctrl pin
        bclr    0,DDRA                  ; change the PWM_ctrl pin to input
exit_CC
        mov     PWM_duty_H,TCH0H        ; write Hi byte first
        mov     PWM_duty_L,TCH0L
;        lda     CURRENT
;        sta     V_IRbyte
;        jsr     DSRL_out               ; transmit the data out
        rts


********************************************************************
*     Constant Voltage Charging Control
*
*     VrefH = 4.40V
*-------------------------------------------------------------------
*    B+ (V)       4.20     4.10     4.00
*                 $F4      $EE      $E7
********************************************************************
CV_Charging
        jsr     bat_V_chk               ; V_B+ (AD3)
        LDA     VOLTAGE
        CMP     #$EE
        BLO     Increase_Voltage        ; if Voltage < 4.10V
        BEQ     exit_CV                 ; if equal then let it be
Decrease_Voltage                        ; if Voltage > 4.1V
        lda     PWM_duty_L
        cmp     #$00                    ; 01/FF = 26/255 = 10% duty
        beq     exit_CV
        dec     PWM_duty_L
        bra     exit_CV
Increase_Voltage
        lda     PWM_duty_L
        cmp     #$ff                    ; ff/FF = max current
        beq     exit_CV
        inc     PWM_duty_L
        bra     exit_CV
error_CV
        bclr    0,PTA                   ; output low to PWM_ctrl pin
        bclr    0,DDRA                  ; change the PWM_ctrl pin to input
exit_CV
        mov     PWM_duty_H,TCH0H        ; write Hi byte first
        mov     PWM_duty_L,TCH0L
;        lda     VOLTAGE
;        sta     V_IRbyte
;        jsr     DSRL_out                ; transmit the data out
        rts



********************************************************************
*     Check Temperature
*
*    R pull-up = 10Kohm (1%), VrefH = 4.40V
*-------------------------------------------------------------------
*    T (degC)     50      45      40      25     10      0      -5
*    R NTC(K)     3.63    4.40    5.356   10    19.85   32.33   42.81
*    Tsense(V)    1.17    1.34    1.53    2.2    2.92   3.36    3.57
*    Tsense       $44     $4E     $59     $7F    $A9    $C2     $CF
********************************************************************
Temp_Check
        lda     #$01            	; selected AD1 as ADC input (VR for Tsense)
        jsr     AD_Check        	; result stored in Acc.
        sta     TEMPERATURE
        cmp     #$4E
        blo     error_Ts        	; temperature > 45 degC
        cmp     #$C2
        bhi     error_Ts        	; temperature < 0  degC
        bclr    TEMP_FLAG,FLAG
exit_Ts
        ;lda     TEMPERATURE
        ;sta     V_IRbyte
        ;jsr     DSRL_out       	; transmit the data out
        rts
Error_Ts
        bset    TEMP_FLAG,FLAG
        bra     exit_Ts
*-------------------------------------------------


********************************************************************
*     Check Battery Valid
********************************************************************
bat_ID_check
	brset	2,PTA,bat_not_valid
	jsr	dly_20ms		; for debounce
	brset	2,PTA,bat_not_valid
        jsr     DLY_500ms
	brset	2,PTA,bat_not_valid
	bset	bat_ID,FLAG          	; 1=bat valid
        rts
bat_not_valid
	bclr	bat_ID,FLAG          	; 0=not valid
	rts

*--------------------------------------------------


check_bat_remove
	brset	2,PTA,set_bat_remove_flag	; battery removed?
clr_bat_remove_f
	bclr	bat_remove_f,FLAG1	; battery not removed
        rts
set_bat_remove_f
	bset	bat_remove_f,FLAG1	; battery removed
	rts

********************************************************************
*     Check Battery voltage valid (ADC3)
*
*    VrefH = 4.40V
*-------------------------------------------------------------------
*
*    Battery(V)    1.0V    2.5V	   4.1V    1.53    2.2    2.92   3.36    3.57
*    VOLTAGE       $3A     $91	   $EE     $59     $7F    $A9    $C2     $CF
********************************************************************
bat_valid_v_chk
        lda     #$03            	; selected AD3 as ADC input (battery voltage)
        jsr     AD_Check        	; result stored in Acc.
        sta     VOLTAGE
	cmp	#$EE			; 4.1V
	bhi	battery_full
	cmp     #$3A			; 1.0V
	blo	bat_v_not_valid
	bset	bat_v_valid,FLAG
	rts

bat_v_not_valid
	bclr	bat_v_valid,FLAG
	rts

battery_full
	bset 	bat_full,FLAG
	rts


*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
bat_V_chk
        lda     #$03            	; selected AD3 as ADC input (battery voltage)
        jsr     AD_Check        	; result stored in Acc.
        SUB     CURRENT
        sta     VOLTAGE
        rts

bat_I_chk
        lda     #$02            	; I_Sense (AD2)
        jsr     AD_Check
        sta     CURRENT
        rts

bat_T_chk
        lda     #$01            	; selected AD1 as ADC input (VR for Tsense)
        jsr     AD_Check        	; result stored in Acc.
        sta     TEMPERATURE
        rts
*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
TOGGLE_IO				; used to check the bus frequency
        bset    3,DDRA			; LED's control pin
        bclr    3,PTA
        bset    3,PTA
        bclr    3,PTA
        bset    3,PTA
        bclr    3,PTA
        rts

*********************************************************************
*	Enable the MMDS clock. For EM board only		    *
*********************************************************************
enable_ext_clock
;        mov  #08,$1E            	; enable external oscillator
        mov  #18,$1E            	; enable external crysta
Delay1  deca                    	; Delay 4096 cycles
        bne   Delay1
        bset  1,$36             	; set ECGON bit
        nop
        brclr 0,$36,*           	; check ECGST bit
        bset  4,$36             	; set this unknow bit
	rts

*********************************************************************
*	Enable the MMDS clock. For EM board only		    *
*********************************************************************
en_int_3M2_clk
	mov	#$20,$37		; turn the ICG to generated 3.2MHz bus
	mov	#$2E,$38
	rts


***********************************************************
*   Initialize the Oscillator for internal clock only.    *
***********************************************************
Enable_int_Clk
        mov     #$00,OSCSTAT    	; use internal clock only
        lda     $FFC0       
        sta     OSCTRIM         	; use current trim value
        rts

*********************************************************************
* Config TIMER module as UNBuffered PWM for channel 0 		    *
*********************************************************************
Init_TIM_dis_PWM:
        MOV     #$30,TSC        	; stop and reset the TIM counter, disable TOF interrupt
        ;MOV     #$1A,TSC0       	; prescaler, set up channel 0 for unbuffered PWM
        mov     #%00010000,TSC0 	;  ch0 interrupt enable, TCH0 use as port function output Low
        MOV     #$00,TCH0H      	; output low at TCH0
        MOV     #$00,TCH0L
        BCLR    5,TSC           	; clear TSTOP, enable timer counter,
			        	; timer counter start only when charger is in ready to charge state
	LDA     TSC0            	; read TCH0 status and control register to clear CH0F flag
        bclr    CH0F,TSC0		; clear CH0F flag
	lda	TSC			; clear TOF flag
	bclr	TOF,TSC
        rts


        ORG  $FC00
************************************************
KBIRQ_ISR:
        NOP
        BSET    2,KBSCR         	; clear KBIF
        NOP
        RTI

IRQ_ISR:
        NOP
        BSET    2,INTSCR          	; CLEAR IRQF
        NOP
        RTI
*
* DMY_ISR - dummy Interrupt Service Routine(with no operation)          *
* In      :  <nil>                                                      *
* Out     :  <nil>                                                      *
* Call    :  <nil>                                                      *
* --------------------------------------------------------------------- *
DMY_ISR:
        nop
* ------------------------------------------------------------------------
        rti


TIM0_ISR                             	; 
        LDA     TSC0                 	; read TCH0 status and control register to clear CH0F flag
        bclr    CH0F,TSC0
        rti

TOF_ISR
	dbnz	tim_cnt_low,exit_tof	; [5]
        dbnz    ms500_cnt,nexxt         ; 512ms = 1/12.5K * 256 * $19
        bset    rs232_tick,FLAG1
nexxt
	dbnz	tim_cnt_high,exit_tof	; [5]
	bset	timer_tick,FLAG		; [4] this flag set every 65536 TOF = 5.24288s

exit_tof
	lda	TSC			; [3]
	bclr	TOF,TSC			; [4]
	rti				; [7]



********************************************************************************************************
;       org $FFC0
;        fdb $73			; ICG trimmed value for this QT2 sample

        org $FFE0
ADCIRQ       DW      DMY_ISR

        org $FFDE
KBIRQ        DW      KBIRQ_ISR

        org $FFF2
TOFIRQ       DW      TOF_ISR
TIMCH1IRQ    DW      DMY_ISR    
TIMCH0IRQ    DW      TIM0_ISR

        org $FFFA
EXT_IRQ      DW      IRQ_ISR
SWI_IRQ      DW      DMY_ISR
RESET        DW      START





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -