📄 he313sv1.asm
字号:
;----------------------------------------------------
;Project: 豪特电热水器控制器
;Version: V1.0
;Filename: HE313SV1.ASM
;Start Date: 2006.6.6
;Designed by: WHY
;MCU type: ATmega8
; Internal 8MHz clock and 32.768K sub clock.
;Modify history:
;
;----------------------------------------------------------------
.include "m8def.inc"
.include "HE313SH.INC"
;----------------------------------------------------------------
;----------------------------------------------
;--------------Reset and Interrupt access-------------
.org $000
rjmp Start ;Reset
rjmp LeakCheck ;INT0
rjmp PowerCheck ;NopInt ;INT1
rjmp NopInt ;TIMER2 COMP
rjmp Clock ;NopInt ;TIMER2 OVER
rjmp NopInt ;TIMER1 CAPT
rjmp LeakCount ;TIMER1 COMPA
rjmp NopInt ;TIMER1 COMPB
rjmp NopInt ;TIMER1 OVER
rjmp BaseTimer ;TIMER0 OVER
rjmp NopInt ;SPI
rjmp NopInt ;USART RCX
rjmp NopInt ;USART UDRE
rjmp NopInt ;USART TXC
rjmp NopInt ;ADC
rjmp NopInt ;EE READY
rjmp NopInt ;ANA COMP
rjmp NopInt ;I2C
rjmp NopInt ;SPM READY
;-----------------------------------------------------
;---------Interrupt sub progress-------
;Note:r24 , r25 has been used in interrupt progress.--------------
;--------Base timer----------------
.org $30
NumberTab:
;.db $03f, $06, $05b,$04f,$066,$06d,$07d,$07,$07f,$06f,$077,$07c,$039,$05e,$079,$071,$00 , $00
.db 80 , 250 , 76 , 74 , 226 , 67 , 65,122,64,66,96,193,85,200,69,101
SetTab:
.db 0 , 1 ;
.db 30 , 75 ;set temp low
;.db 77 ;set temp high
.db 0 , 23 ;real time hour low
;.db 23 ;real time hour high
.db 0 , 59 ;real time minute low
;.db 59 ;real time minute high
.db 0 , 23 ;timerA on hour low
;.db 23 ;timerA on hour high
.db 0 , 59 ;timerA on minute low
;.db 59 ;timerA on minute high
.db 0 ,23 ;timerA off hour low
;.db 23 ;timerA off hour high
.db 0 ,59 ;timerA off minute low
;.db 59 ;timerA off minute high
.db 0 , 23 ;timerB on hour low
;.db 23 ;timerB on hour high
.db 0 ,59 ;timerB on minute low
;.db 59 ;timerB on minute high
.db 0 ,23 ;timerB off hour low
;.db 23 ;timerB off hour high
.db 0 ,59 ;timerB off minute low
;.db 59 ;timerB off minute high
TempTab:
;***Sensor type is R503-B4000***
;***Up_Res is 22000 Down_Res is 0 The ADC is 8 Bit ***
;.DB 30,31,33,34,36,37,39,41,42,44;0C`~9C`
;.DB 46,48,50,52,54,56,58,60,62,64;10C`~19C`
;.DB 66,69,71,73,76,78,80,83,85,88;20C`~29C`
;.DB 90,93,95,98,100,103,106,108,111,113;30C`~39C`
;.DB 116,119,121,124,126,129,131,134,136,139;40C`~49C`
;.DB 141,144,146,149,151,153,156,158,160,162;50C`~59C`
;.DB 165,166,169,171,173,175,177,179,181,183;60C`~69C`
;.DB 184,186,188,190,191,193,195,196,198,199;70C`~79C`
;.DB 201,202,203,205,206,207,209,210,211,212;80C`~89C`
;.DB 213,215,216,217,218,255;
;***Sensor type is 50K3950***
;***Up_Res is 22000 Down_Res is 0 The ADC is 8 Bit ***
.DB 31,32,34,35,37,38,40,42,43,45;0C`~9C`
.DB 47,49,51,53,55,57,59,61,63,65;10C`~19C`
.DB 67,69,72,74,76,78,81,83,86,88;20C`~29C`
.DB 91,93,96,98,101,103,106,108,111,113;30C`~39C`
.DB 116,119,121,124,126,129,131,134,136,139;40C`~49C`
.DB 141,143,146,148,150,153,155,157,159,162;50C`~59C`
.DB 164,166,168,170,172,174,176,178,180,182;60C`~69C`
.DB 183,185,187,188,190,192,193,195,196,198;70C`~79C`
.DB 199,201,202,204,205,206,207,209,210,211;80C`~89C`
.DB 212,213,214,215,216,217,218,219,220,221;90C`~99C`
.DB 255,255 ;
;-------------------------------------------------------------
TempTab1:
;-------------------------------------------------------------
;***Sensor type is MF52A-103H3435H ****
;***Up_Res is 10000 Down_Res is 0 The ADC is 8 Bit ***
.DB 188,186,183,181,179,176,174,172,169,167;0C`~9C`
.DB 164,162,159,157,154,152,149,147,144,142;10C`~19C`
.DB 139,137,134,132,129,127,125,122,120,117;20C`~29C`
.DB 115,113,110,108,106,104,101,99,97,95;30C`~39C`
.DB 93,91,89,87,85,83,81,79,78,76;40C`~49C`
.DB 74,72,71,69,67,66,64,63,61,60;50C`~59C`
.DB 58,40,30,0;
;===================================================================
;.org $100
BaseTimer:
;-----------
in r25 , SREG
push r16
push r17
; push r18
; push r19
; push r20
; push r21
; push r22
; push r23
movw TriggerByte0 , BlinkByte0
inc BlinkByte0
brne BaseTimer10
inc BlinkByte1
BaseTimer10:
eor TriggerByte0 , BlinkByte0
eor TriggerByte1 , BlinkByte1
set
sbrc TriggerByte0 , Trigger8ms
bld UserTrigger , ADCTrigger
sbrc TriggerByte0 , Trigger125ms
bld UserTrigger , DispTrigger
sbrc TriggerByte1 , Trigger1s
bld UserTrigger , TempTrigger
sbrc TriggerByte1 , Trigger2s
bld SystemByte , InputOK
rcall LEDKeyScan
rcall TimeCenter
; pop r23
; pop r22
; pop r21
; pop r20
; pop r19
; pop r18
pop r17
pop r16
out SREG , r25
reti
;----------------------------------
LeakCount:
in r25 , SREG
ldi r24 , 5
LeakCount20:
sbic LeakPort , LeakLine
rjmp Leakcount50
dec r24
brne LeakCount20
lds r24 , LeakDelay
dec r24
sts LeakDelay , r24
brne LeakCount90
set
bld ErrorByte , LeakErr
LeakCount50:
ldi r24 , 0
out TCCR1B , r24
ldi r24 , LeakDelayInit
sts LeakDelay , r24
LeakCount90:
out SREG , r25
reti
;----------------------------------
LeakCheck:
in r25 , SREG
sbrc ErrorByte , LeakErr
rjmp LeakCheck60
ldi r24 , 20
LeakCheck20:
sbic LeakPort , LeakLine
rjmp LeakCheck60
dec r24
brne LeakCheck20
ldi r24 , 0b00001001
out TCCR1B , R24
ldi r24 , LeakDelayInit
sts LeakDelay , r24
rjmp LeakCheck90
LeakCheck60:
ldi r24 , 0
out TCCR1B , r24
ldi r24 , 16
sts LeakDelay , r24
LeakCheck90:
out SREG , r25
reti
;----------------------------------
PowerCheck:
in r25 , SREG
clt
bld SystemByte , SleepAsk
sbrc SystemByte , InSleep
nop
ldi r24 , PowerDelayInit
sts PowerDelay , r24
out SREG , r25
reti
;---------------------------------
;---------------- 0.5S 中断一次 ---------------------------------
Clock:
in r25 , SREG
lds r24,timer5s
inc r24
sts timer5s,r24
cpi r24,10
brne Clock00
set
bld UserTrigger , display8s
clr r24
sts timer5s,r24
Clock00:
lds r24 , TimeSecCnt
inc r24
cpi r24 , 120
brcs Clock10
clr r24
Clock10:
sts TimeSecCnt , r24
tst r24
brne Clock90
lds r24 , TimeMinCnt
inc r24
cpi r24 , 60
brcs Clock20
clr r24
Clock20:
sts TimeMinCnt , r24
tst r24
brne Clock90
set
bld UserTrigger ,time1h
lds r24 , TimeHourCnt
inc r24
cpi r24 , 24
brcs Clock30
clr r24
Clock30:
sts TimeHourCnt , r24
Clock90:
out SREG , r25
reti
;-------Start progress----------
.org $200
NopInt:
reti
;=========================================================================================
Start:
cli
;----Reset stack-----
ldi r16, high(RAMEND)
out SPH,r16
ldi r16, low(RAMEND)
out SPL,r16
;--------------------
ldi r16, PortBIOInit
out DDRB , r16
ldi r16, PortCIOInit
out DDRC , r16
ldi r16, PortDIOInit
out DDRD , r16
ldi r16 , 0b00001000
out ASSR , r16 ;T2 be used as real clock
ldi r16 , 0b00000100 ;T2 use clkt2s/64 , on 32.768K clock is 500ms
out TCCR2 , r16
ldi r16, 0b00000011 ;clk/8
out TCCR0 , r16
;OCR1A=399; //50us
;TCCR1A=0B00000000;//timer1初始化
;TCCR1B=0B00001001;
ldi r17 , 0x07 ;250us
ldi r16 , 0x80
out OCR1AH , r17
out OCR1AL , r16
ldi r16 , 0
out TCCR1A , r16
;ldi r16 , 0b00001001
out TCCR1B , R16
ldi r16, 0b01010001 ;enable TOIE0 TOIE2 OCIE1A
out TIMSK , r16
ldi r16 , 0b10111010 ;INT0 and INT1 fail edge
out MCUCR , r16
;------For debug----------
; ldi r16 , 0b01000000;0b11000000 ;enable INT0 and INT1 interrupt
;-------------------------------
ldi r16 , 0b11000000 ;enable INT0 and INT1 interrupt
out GICR , r16
ldi r16 , 0b10000000 ;close Analog compare
out ACSR , r16
ldi r16 , 0b00000100
out SFIOR , r16
ldi r16 , 0
out ADCSR , r16
out EECR , r16
ldi r16, 0b00011000 ;wdt full out time is 16ms
out WDTCR , r16
;------------Ram data init----------
in r16 , MCUCSR
andi r16 , 0b00001111
cpi r16 , 0b00000010
brne Start40
rcall CheckSum
lds r16 , CheckSumLow
cp Reg0 , r16
brne Start40
lds r16 , CheckSumHigh
cp Reg1 , r16
brne Start40
lds r16 , CheckRam1
cpi r16 , 12
brne Start40
lds r16 , CheckRam2
cpi r16 , 24
brne Start40
;-----same data will be cleaed but keep saved data ---
lds SetByte , BuffSetByte
lds ModeByte , BuffModeByte
lds r16 , BuffSetTemp
sts SetTemp , r16
rcall ResetRam
rcall DataInit50
rjmp Start50
Start40:
;;----all data will be cleared---
rcall ClearRam
rcall DataInit
Start50:
clr r16
out MCUCSR , r16
ldi r16 , 75
mov CheckReg1 , r16
ldi r16 , 12
sts CheckRam1 , r16
ldi r16 , 24
sts CheckRam2 , r16
ldi r16 , 0
sts SetSP , r16
;-----------------------------------
sei
Main:
; sbi OutPort , NLine
wdr
rcall ReadTemp
sbrs SystemByte , InputOK
rjmp Main10
rcall TimerMask
rcall DecodeKey
rcall Display
rcall RoomTemplogic
rcall STSMODE
rcall Logic
rcall ErrorLogic
rcall PowerLogic
Main10:
rcall Driver
rjmp Main
;-------------------------------------------
DataInit:
set
bld ModeByte , DownMode
bld UserTrigger,display8s
ldi r16 , 12
sts TimeHourCnt , r16
ldi r16 , 65
sts SetTemp , r16
; ldi r16 , 21
; sts TAOnHourCnt , r16
ldi r16 , 6
sts TAOffHourCnt , r16
; ldi r16 , 18
; sts TBOnHourCnt , r16
; ldi r16 , 21
ldi r16,2
sts delay,r16
sts dispshift,r16
; sts TBOffHourCnt , r16
DataInit50:
ldi r16 , KeyDelayInit
sts KeyDelayByte , r16
ldi r16 , PowerDelayInit
sts PowerDelay , r16
ldi r16 , LeakDelayInit
sts LeakDelay , r16
ldi r16 , LeakLineInit
sts LeakLineCnt , r16
clr r16
out MCUCSR , r16
ldi r16 , 75
mov CheckReg1 , r16
ldi r16 , 12
sts CheckRam1 , r16
ldi r16 , 24
sts CheckRam2 , r16
ldi r16 , 0
sts SetSP , r16
ret
;--------------------------------------------
PowerLogic:
sbrs SystemByte , SleepAsk
rjmp PowerLogic50
;-------Change IO to input mode-----
ldi r16 , 0
out DDRB , r16
out DDRC , r16
out DDRD , r16
out ADCSR , r16 ;close ADC
cli
ldi r16 , (1<<WDCE)|(1<<WDE) ;close WDT
out WDTCR , r16
ldi r16 , (0<<WDE)
out WDTCR , r16
sbrc SystemByte , InSleep
rjmp PowerLogic30
sts BuffSetByte ,SetByte
sts BuffModeByte,ModeByte
lds r16 , SetTemp
sts BuffSetTemp , r16
rcall CheckSum
sts CheckSumLow , Reg0
sts CheckSumHigh , Reg1
PowerLogic30:
ldi r16 , 0b10110010 ;INT0 and INT1 fail edge
out MCUCR , r16
sei
PowerLogic40:
set
bld SystemByte , InSleep
nop
nop
nop
sleep
nop
rcall Delay10us
rcall Delay10us
rcall Delay10us
rcall Delay10us
rcall Delay10us
rcall Delay10us
rcall Delay10us
rcall Delay10us
rcall Delay10us
rcall Delay10us
rcall Delay10us
rcall Delay10us
rcall Delay10us
rcall Delay10us
rcall Delay10us
rcall Delay10us
rcall Delay10us
rcall Delay10us
rcall Delay10us
rcall Delay10us
rcall Delay10us
rcall Delay10us
rcall Delay10us
rcall Delay10us
rcall Delay10us
rcall Delay10us
rjmp PowerLogic
PowerLogic50:
sbrs SystemByte , InSleep
rjmp PowerLogic90
;------wake up--------
clt
bld SystemByte , InSleep
rcall CheckSum
lds r16 , CheckSumLow
cp Reg0 , r16
brne PowerLogic55
lds r16 , CheckSumHigh
cp Reg1 , r16
brne PowerLogic55
lds r16 , CheckRam1
cpi r16 , 12
brne PowerLogic55
lds r16 , CheckRam2
cpi r16, 24
brne PowerLogic55
;-----some data will be cleaed but keep saved data ---
lds SetByte , BuffSetByte
lds ModeByte , BuffModeByte
lds r16 , BuffSetTemp
sts SetTemp , r16
rcall ResetRam
rcall DataInit50
rjmp PowerLogic60
PowerLogic55:
rcall ClearRam
rcall DataInit
PowerLogic60:
ldi r16, PortBIOInit
out DDRB , r16
ldi r16, PortCIOInit
out DDRC , r16
ldi r16, PortDIOInit
out DDRD , r16
ldi r16 , 0b00001000
out ASSR , r16 ;T2 be used as real clock
ldi r16 , 0b00000100 ;T2 use clkt2s/64 , on 32.768K clock is 500ms
out TCCR2 , r16
ldi r16, 0b00000011 ;clk/8
out TCCR0 , r16
ldi r17 , 0x07 ;250us
ldi r16 , 0x80
out OCR1AH , r17
out OCR1AL , r16
ldi r16 , 0
out TCCR1A , r16
out TCCR1B , R16
ldi r16, 0b01010001 ;enable TOIE0 TOIE2 OCIE1A
out TIMSK , r16
ldi r16 , 0b10111010 ;INT0 and INT1 fail edge
out MCUCR , r16
ldi r16 , 0b11000000 ;enable INT0 and INT1 interrupt
out GICR , r16
ldi r16 , 0b10000000 ;close Analog compare
out ACSR , r16
ldi r16 , 0b00000100
out SFIOR , r16
ldi r16 , 0
out ADCSR , r16
out EECR , r16
ldi r16, 0b00011000 ;wdt full out time is 16ms
out WDTCR , r16
PowerLogic90:
ret
;------------------------------------------------------
;-------------if timer on=off then timer disable------
TimerMask:
lds r16 , SetDelay
tst r16
breq Timermask10
rjmp timermask90
timermask10:
clt
bld SetByte , SetTADis
lds r16 , TAOnHourCnt
lds r17 , TAOffHourCnt
cpse r16 , r17
rjmp TimerMask42
lds r16 , TAOnMinCnt
lds r17 , TAOffMinCnt
cpse r16 , r17
rjmp TimerMask42
set
bld SetByte , SetTADis
TimerMask42:
clt
bld SetByte , SetTBDis
lds r16 , TBOnHourCnt
lds r17 , TBOffHourCnt
cpse r16 , r17
rjmp TimerMask45
lds r16 , TBOnMinCnt
lds r17 , TBOffMinCnt
cpse r16 , r17
rjmp TimerMask45
set
bld SetByte , SetTBDis
TimerMask45:
clt
sbrc setbyte,setTADis
bld setbyte,settimerA
sbrc setbyte,setTBDis
bld setbyte,settimerB
TimerMask90:
ret
;--------------------------------------------
TimeCenter:
lds r16 , PowerDelay
tst r16
brne TimeCenter10
set
bld SystemByte , SleepAsk
rjmp TimeCenter15
TimeCenter10:
dec r16
sts PowerDelay , r16
TimeCenter15:
sbrs TriggerByte0 , Trigger125ms
rjmp TimeCenter30
lds r16 , TimerDispDelay
tst r16
breq TimeCenter18
dec r16
sts TimerDispDelay , r16
TimeCenter18:
lds r16 , SetDelay
tst r16
breq TimeCenter20
dec r16
sts SetDelay , r16
rjmp TimeCenter30
TimeCenter20:
clr r16
sts SetSP , r16
TimeCenter30:
; sbrs TriggerByte1 , Trigger16s
; rjmp TimeCenter40
; lds r16 , NowDelay
; dec r16
; sts NowDelay , r16
; brne TimeCenter40
; clt
; bld SetByte , SetNow
TimeCenter40:
TimeCenter90:
ret
;-------------------------------------------
TimerDispLogic:
sbrs RunByte , TARun
sbrc RunByte , TBRun
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -