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

📄 he313sv1.asm

📁 此程序为热水器控制板用,为我公司资深程序员开发.
💻 ASM
📖 第 1 页 / 共 4 页
字号:
;----------------------------------------------------
;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 + -