📄 source.asm
字号:
-M34508G4
;**********************************
; MAIN PROGRAM
;**********************************
;Copyright(C) 2007. Renesas Technology Corp., All rights reserved.
;Frequency 500K HZ
;
test .equ 0
;-------------------------------------------------------------------------
; Definition Table
;-------------------------------------------------------------------------
c_s_limith .equ 8h ; Limit value of AD result
c_s_limitl .equ 0h
c_t_limith .equ 7h
c_t_limitl .equ 8h
c_y_limith .equ 7h
c_y_limitl .equ 6h
c_k1_on .equ 0100b
c_k2_on .equ 0001b
c_k3_on .equ 0010b
c_k1_off .equ 1011b
c_k2_off .equ 1110b
c_k3_off .equ 1101b
;
;-------------------------------------------------------------------------
; RAM Table
;-------------------------------------------------------------------------
s_ad_sl .EQU 0,0,0 ; Last value
g_ad_sl .EQU 0,0,1 ; Average of last two values
s_ad_yl .EQU 0,0,2
g_ad_yl .EQU 0,0,3
s_ad_tl .EQU 0,0,4
g_ad_tl .EQU 0,0,5
s_ad_sh .EQU 0,1,0
g_ad_sh .EQU 0,1,1
s_ad_yh .EQU 0,1,2
g_ad_yh .EQU 0,1,3
s_ad_th .EQU 0,1,4
g_ad_th .EQU 0,1,5
s_ad_target .EQU 0,0,6
;
g_beep_cnt .equ 0,0,7
bf_mode .equ 0,0,0,8
bf_beep .equ 1,0,0,8
g_back_flag .equ 0,0,9
t_temp .equ 0,0,10
g_mode .equ 0,0,11
s_wait0 .equ 0,0,12
s_wait1 .equ 0,0,13
s_wait2 .equ 0,0,14
s_wait3 .equ 0,0,15
s_ktemp .equ 0,1,6
bf_2ms .equ 0,0,1,7
bf_alarm .equ 1,0,1,7
s_bak_p0 .equ 0,1,8
;-------------------------------------------------------------------------
; Code
;-------------------------------------------------------------------------
.org 0,0
reset:
DI ; Disable all interrupts
DWDT ; Disable Watch Dog Timer
WRST
.if test
LA 1100b ; Stop Xin, set f(RING) and direct clock mode
.else
LA 0011b
.endif
TMRA
;
clear_ram:
LXY 0,0
LZ 0
clear1:
LA 0
XAMI 0
B clear1
LXY 1,0
clear2: LA 0
XAMI 0
B clear2
;
;
;-------------------------------------------------------------------------
; Initialize
; Function: Light up POWER LED, initialize SFR and start beep
;
;-------------------------------------------------------------------------
light_power:
LXY 0,1 ; Light up Power LED on port D1
RD
;
init_SFR:
set_IO:
LA 1000b
OP0A ; Shut all relays and LEDs
LA 0111b
TFR0A ; Set relays control ports CMOS output mode
;
LA 1101b
OP1A ; Shut buzzer and LEDs
LA 0010b
TFR1A ; Set buzzer output pin to CMOS mode
;
LA 1000b
TPU0A ; Enable pull-up at P03
LA 0001b
TPU1A ; Enable pull-up at P10
;
set_ad:
LA 0100b
TQ1A ; Set AN4 as AD input, check T signal
ADST
;
set_int:
LA 1000b
TI1A ; Enable INT input
NOP
SNZ0
NOP
set_pwm:
LA 0110b
TBA
LA 1101b
T2AB ; Set data to Timer 2 and Timer 2 reload register R2L (220us = 500KHz * (109+1))
T2HAB ; Set data to Timer 2 reload register R2H (220us = 500KHz * (109+1))
;
LA 1111b ; Set Timer control register W2
TW2A ; Timer 2 Operating
; Select Timer 2 count source, System clock (STCK)
; PWM2 function valid
;
set_2ms_int:
LA 0
TBA
LA 8
TPSAB ; Set prescaler 1/9
;
LA 2
TBA
LA 4
T1AB ; Set Timer 1 interval 2ms
;
LA 0100b
TV1A ; Enable Timer 1 interrupt
;
LA 0101b
TW1A ; Start Timer 1, disable pwm1 and select prescaler as clock input
;
LA 1
TPAA ; Start prescaler
;
EI ; Enable interrupt
;
power_on_beep:
BM start_buzzer
LA 1
BM wait_n100ms
LA 0000b ; Disable pwm output
TW6A
;
wait_for_key:
check_d: ; Check P10 pin
LA 0001b
LXY t_temp
TMA 0
IAP1
AND
SEAM
BL check_d2 ; Check twice
BL check_m
check_d2:
LA 0
BM wait_n100ms ; Wait 100ms for debounce
LA 0001b
LXY t_temp
TMA 0
IAP1
AND
SEAM
BL mode_lvdou ; Go to mode
check_m: ; Check P03 pin
LA 1000b
LXY t_temp
TMA 0
IAP0
AND
SEAM
BL check_m2 ; Check twice
BL check_n
check_m2:
LA 0
BM wait_n100ms ; Wait 100ms for debounce
LA 1000b
LXY t_temp
TMA 0
IAP0
AND
SEAM
BL mode_lvdou ; Go to mode
check_n:
LXY 0,0 ; Load 0 into Y
SZD ; Check D0 pin
B check_d
LA 0
BM wait_n100ms ; Wait 100ms for debounce
LXY 0,0 ; Load 0 into Y
SZD ; Check twice
B check_d
BL mode_lvdou
;
;********************************************************************************
.org 1,0
;================================================================================
;=
;= Interrput Vector Table
;=
;================================================================================
EI ; External 0 interrupt <not use>
RTI ;
;+++++++++++++++++++++++++++++++;
EI ;
RTI ;
;+++++++++++++++++++++++++++++++;
BL t1_ih ; Timer 1 interrupt <in use>
;
;+++++++++++++++++++++++++++++++;
EI ; Timer 2 interrupt <not use>
RTI ;
;+++++++++++++++++++++++++++++++;
EI ;
RTI ;
;+++++++++++++++++++++++++++++++;
EI ;
RTI ;
;+++++++++++++++++++++++++++++++;
EI ; A/D interrupt <not use>
RTI ;
;+++++++++++++++++++++++++++++++;
EI ;
RTI ;
;
;-------------------------------------------------------------------
; t1_ih
;-------------------------------------------------------------------
t1_ih:
.clb bf_2ms
adc:
SNZAD
B adc ; Wait for ADC stop
LXY s_ad_target ; Check which signal is converted
TAM 0
A 0fh
B check_1
LA 2 ; When it comes to f, reset it to 2
TMA 0
LA 0101b ; Change AD channel to AN5, S signal
TQ1A
B adc_t_store ; T signal result available
check_1:
TMA 0
SEA 1
B adc_y_store ; Y signal result available
LA 0000b ; Change AD channel to AN0, Y signal
TQ1A
B adc_s_store ; S signal result available
adc_y_store:
LA 0100b ; Change AD channel to AN4, T signal
TQ1A
LXY s_ad_yl
adc_s_store:
LXY s_ad_sl ; S signal result available
adc_t_store:
LXY s_ad_tl
TABAD ; Transmit AD result register A&B
XAM 0 ; Exchange the lower 4 bits of the latest result and the previous one's
AMC ; Add two lower 4 bits
INY
XAMD 1 ; Temporarily save the lower 4 bits of the middle result
TAB
XAM 0 ; Save the higher 4 bits of the latest result
AMC ; Add two higher 4 bits
RAR ; Right rotate = divide by 2
INY
TMA 1 ; Save the higher 4 bits of the average
TAM 0
RAR
TMA 0 ; Save the lower 4 bits of the average
;
.if 1
TAY
SEA 1
B start_ad
s_analyse:
LA c_s_limith
TBA
LA c_s_limitl
BM compare_8
.szxyb bf_alarm
B alarm
not_alarm:
SZC
B start_alarm ; S value over limit, alarm
B start_ad ; No S signal, return
start_alarm:
LXY s_bak_p0
LA 1001b
TMA 0
IAP0 ; Save relays' status
XAM 0
AND
OP0A ; Shut K1 and K3
LA 1000b
TW6A ; Enable pwm1 output
.seb bf_alarm
B t1_loop ; Loop in ADC sub routine
alarm:
SZC
B t1_loop ; Loop in ADC sub routine
stop_alarm:
LA 0000b ; Disable pwm1 output
TW6A
LA c_k2_off
BM shut_kn
LXY s_bak_p0
LA c_k3_on
SZB 1
BM open_kn
LXY s_bak_p0
LA c_k1_on
SZB 2
BM open_kn
LXY s_bak_p0
LA c_k2_on
SZB 0
BM open_kn
.clb bf_alarm
.endif
start_ad:
ADST ; Start a new ADC process
t1_exit:
EI ; Enable interrupt
RTI
t1_loop:
LA 0101b
TQ1A
LXY s_ad_target
LA 2
TMA 0
ADST
B adc
;********************************************************************************
;-------------------------------------------------------------------
; Subroutines
;-------------------------------------------------------------------
.org 2,0
;-------------------------------------------------------------------
; Start_buzzer
;-------------------------------------------------------------------
start_buzzer:
LA 1000b ; Set Timer control register W6
TW6A ; Select P1_1(input)/CNTR1(I/O)
RT
;-------------------------------------------------------------------------
; Compare_8
; Function: Compare M(DP)&M(DP^1) and AB
; Output: M(DP)&M(DP^1) < AB C = 0;
; M(DP)&M(DP^1) >=AB C = 1;
;-------------------------------------------------------------------------
compare_8:
CMA
RC
AMC ; M(DP) + COM(A)
TAM 1 ; Set DP to DP^1
TAB ; Load higher 4 bits
CMA
AMC ; M(DP^1) + COM(B)
RT
;-------------------------------------------------------------------
; wait_n100ms n = A + 1
;-------------------------------------------------------------------
wait_n100ms:
LXY s_wait0
w100ms_loop0:
TMA 0
LXY s_wait1
LA 4 ; (4+1)*(9+1)*2ms= 100ms
w100ms_loop1:
TMA 0
LA 9
w100ms_loop2:
.szxyb bf_2ms
B w100ms_loop2
.seb bf_2ms
A 0fh
B w100ms_loop2
LXY s_wait1
TAM 0
A 0fh
B w100ms_loop1
LXY s_wait0
TAM 0
A 0fh
B w100ms_loop0
RT
;-------------------------------------------------------------------
; wait_n1s n = A + 1
;-------------------------------------------------------------------
wait_n1s:
LXY s_wait2
w1s_loop:
TMA 0
LA 10
BM wait_n100ms
LXY s_wait2
TAM 0
A 0fh
B w1s_loop
RT
;-------------------------------------------------------------------
; open_kn
;-------------------------------------------------------------------
open_kn:
SNZ0 ; Clear INT interrupt flag
NOP
;DI ; Disable interrupt
op_kn_loop:
SNZ0
B op_kn_loop
LXY s_ktemp
TMA 0
IAP0 ; Read P0 port
OR
OP0A ; Execute the change on P0
;EI ; Enable interrupt
RT
;-------------------------------------------------------------------
; shut_kn
;-------------------------------------------------------------------
shut_kn:
SNZ0 ; Clear INT interrupt flag
NOP
;DI ; Disable interrupt
sh_kn_loop:
SNZ0
B sh_kn_loop
LXY s_ktemp
TMA 0
IAP0 ; Read P0 port
AND
OP0A ; Execute the change on P0
;EI ; Enable interrupt
RT
;-------------------------------------------------------------------
; check_t
;-------------------------------------------------------------------
check_t:
LA c_t_limith
TBA
LA c_t_limitl
LXY g_ad_tl
BM compare_8
SZC
RT
RTS
;-------------------------------------------------------------------
; check_y
;-------------------------------------------------------------------
check_y:
LA c_y_limith
TBA
LA c_y_limitl
LXY g_ad_yl
BM compare_8
SZC
RT
RTS
;
;-------------------------------------------------------------------
; lvdou procedure
;-------------------------------------------------------------------
.org 3,0
mode_lvdou:
LA 0000b
OP0A ; Light up LED of Lvdou
BM start_buzzer
LA 0 ; beep 3 times
BM wait_n100ms
LA 0000b
TW6A
LA 0
BM wait_n100ms
LA 1000b
TW6A
LA 0
BM wait_n100ms
LA 0000b
TW6A
LA 0
BM wait_n100ms
LA 1000b
TW6A
LA 0
BM wait_n100ms
LA 0000b
TW6A
phase1:
BM check_t
B phase2
LA c_k1_on
BM open_kn ; Start heater
LA c_k2_on
BM open_kn
p1_loop1:
BM check_t ; Check temperature
B phase2
p1_check_y:
BM check_y ; Check overflow signal Y
B phase1
LA c_k1_off
BM shut_kn
B p1_loop1
phase2:
BM start_buzzer
LA 0 ; Beep twice
BM wait_n100ms
LA 0000b
TW6A
LA 0
BM wait_n100ms
LA 1000b
TW6A
LA 0
BM wait_n100ms
LA 0000b
TW6A
;
LA c_k2_off
BM shut_kn ; Stop heater
LA c_k1_off
BM shut_kn
;
LA 0 ; Wait 1.3s
BM wait_n1s
LA 2
BM wait_n100ms
LA c_k3_on
BM open_kn ; Start motor, half speed
;
LA 0 ; Wait 1.7s
BM wait_n1s
LA 6
BM wait_n100ms
LA c_k2_on
BM open_kn ; Switch to full speed
;
LA 1 ; Wait 2.7s
BM wait_n1s
LA 6
BM wait_n100ms
LA c_k2_off
BM shut_kn ; Back to half speed
;
LA 1 ; Wait 1.7s
BM wait_n1s
LA 6
BM wait_n100ms
LA c_k3_off
BM shut_kn ; Stop motor
;
LA 7 ; Wait 800ms
BM wait_n100ms
LA c_k1_on
BM open_kn ; Start heater
LA c_k2_on
BM open_kn
phase3:
BM check_y
B phase3
LA c_k2_off
BM shut_kn
LA c_k1_off
BM shut_kn
;
LA 12
BM wait_n1s
LA 10
BM wait_n1s
LA c_k3_on
BM open_kn
;
LA 5
BM wait_n100ms
LA c_k3_off
BM shut_kn
;
LA 2
BM wait_n1s
LA c_k3_on
BM open_kn
;
LA 1
BM wait_n1s
LA c_k2_on
BM open_kn
;
LA 13
BM wait_n1s
LA c_k2_off
BM shut_kn
;
LA 2
BM wait_n1s
LA c_k3_off
BM shut_kn
;
LA 0
BM wait_n1s
LA c_k1_on
BM open_kn
;
LA 7
BM wait_n1s
LA c_k1_off
BM shut_kn
;
LA 0
BM wait_n1s
LA c_k3_on
BM open_kn
;
LA 1
BM wait_n1s
LA c_k2_on
BM open_kn
;
LA 13
BM wait_n1s
LA c_k2_off
BM shut_kn
;
LA 2
BM wait_n1s
LA c_k3_off
BM shut_kn
;
LA 3
BM wait_n1s
LA c_k1_on
BM open_kn
;
phase4:
LXY t_temp
LA 01h
p4_loop:
TMA 0
LA 0fh
BM wait_n1s
LXY t_temp
TAM 0
A 0fh
B p4_loop
;
LA c_k1_off
BM shut_kn
;
BM start_buzzer
end: B end
.END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -