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

📄 getpower_m8.s

📁 感应取电的控制
💻 S
字号:
	.module GetPower_M8.c
	.area data(ram, con, rel)
_reset::
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile E:\GetPower_M8_source\GetPower_M8.c
	.dbsym e reset _reset pfV
	.area text(rom, con, rel)
	.dbfile E:\GetPower_M8_source\GetPower_M8.c
	.dbfunc e delay _delay fV
;              n -> R16,R17
	.even
_delay::
	.dbline -1
	.dbline 69
; 
; //	
; /***********************************************************************************
; Project:          GetPower program (V0.6)
; Filename:         GetPower.c    
; Prozessor:        Mega8 family
; Compiler:         ICCAVR Version 6.14
; Autor:              Dou
; Copyrigth:        (c) Sensirion AG      
; ***********************************************************************************/
; /////////////////////////////////////////////////////////////
; /*
; 	烟台国网中电自动化技术有限公司
; 	雷击模块程序(ICCAVR)
; 	作者:窦庚欣
; 
; 
; */
; #include<iom8v.h>
; #include <math.h>
; #include<macros.h>
; #include<eeprom.h>
; #include<string.h>
; #include<stdio.h>
; 
; 
; 
; 
; typedef unsigned char	BOOLEAN;
; typedef unsigned char	INT8U;
; typedef signed char		INT8S;
; typedef unsigned int	INT16U;
; typedef signed int		INT16S;
; typedef unsigned long	INT32U;
; typedef signed long		INT32S;
; 
; #define BIT_H(x)	(1<<x)
; #define BIT_L(x)	(~(1<<x))
; 
; #define	LED_H	(PORTD |= BIT_H(PD3))
; #define	LED_L	(PORTD &= BIT_L(PD3))
; 
; 
; #define fosc		7372800
; #define baud		115200
; 
; #define MS_COUNT	fosc/1000/17		//延时计数
; #define SR_NOP()	asm("nop")			//空指令
; 
; 
; 
; #define	BYTE	unsigned char
; #define	WORD	unsigned int
; 
; 
; volatile 	static 	WORD	adc_val;		//AD最终结果
; volatile    static      int	Power_Low;    //电压低标志
; static	WORD	adc_first;		//第1次AD标志
; 
; 
; 
; 
; 
; void (*reset)(void)=0x0000; 	
; 
; /////////////////////////////////////////////////////////////////////////////////
; 
; void delay(WORD n)
; {
L2:
	.dbline 70
	.dbline 70
	.dbline 70
L3:
	.dbline 70
;     while(--n){;}
	movw R24,R16
	sbiw R24,1
	movw R16,R24
	cpi R16,0
	cpc R16,R17
	brne L2
X0:
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbsym r n 16 i
	.dbend
	.dbfunc e sr_ms _sr_ms fV
;              i -> R10,R11
;              j -> R12,R13
;              n -> R16,R17
	.even
_sr_ms::
	rcall push_gset4
	.dbline -1
	.dbline 74
; }
; //延时n毫秒
; void sr_ms(WORD n)
; {	//延时n毫秒
	.dbline 77
; 	WORD i,j;
; 
; 	for(i=0; i<n; i++)
	clr R10
	clr R11
	rjmp L9
L6:
	.dbline 78
	clr R12
	clr R13
	rjmp L13
L10:
	.dbline 78
L11:
	.dbline 78
	movw R24,R12
	adiw R24,1
	movw R12,R24
L13:
	.dbline 78
	ldi R20,177
	ldi R21,1
	ldi R22,0
	ldi R23,0
	movw R2,R12
	clr R4
	clr R5
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brlt L10
L7:
	.dbline 77
	movw R24,R10
	adiw R24,1
	movw R10,R24
L9:
	.dbline 77
	cp R10,R16
	cpc R11,R17
	brlo L6
	.dbline -2
L5:
	rcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym r i 10 i
	.dbsym r j 12 i
	.dbsym r n 16 i
	.dbend
	.dbfunc e quarter_ms _quarter_ms fV
;              i -> R10,R11
;              j -> R12,R13
;              n -> R16,R17
	.even
_quarter_ms::
	rcall push_gset4
	.dbline -1
	.dbline 83
; 		for(j=0; j<MS_COUNT;j++);
; }
; 
; /////////////////////////////////////////////////////////////
; void quarter_ms(WORD n)
; {	//延时n毫秒
	.dbline 86
; 	WORD i,j;
; 
; 	for(i=0; i<n; i++)
	clr R10
	clr R11
	rjmp L18
L15:
	.dbline 87
	clr R12
	clr R13
	rjmp L22
L19:
	.dbline 87
L20:
	.dbline 87
	movw R24,R12
	adiw R24,1
	movw R12,R24
L22:
	.dbline 87
	ldi R20,108
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R2,R12
	clr R4
	clr R5
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brlt L19
L16:
	.dbline 86
	movw R24,R10
	adiw R24,1
	movw R10,R24
L18:
	.dbline 86
	cp R10,R16
	cpc R11,R17
	brlo L15
	.dbline -2
L14:
	rcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym r i 10 i
	.dbsym r j 12 i
	.dbsym r n 16 i
	.dbend
	.dbfunc e half_ms _half_ms fV
;              i -> R10,R11
;              j -> R12,R13
;              n -> R16,R17
	.even
_half_ms::
	rcall push_gset4
	.dbline -1
	.dbline 92
; 		for(j=0; j<MS_COUNT/4;j++);
; }
; 
; /////////////////////////////////////////////////////////////
; void half_ms(WORD n)
; {	//延时n毫秒
	.dbline 95
; 	WORD i,j;
; 
; 	for(i=0; i<n; i++)
	clr R10
	clr R11
	rjmp L27
L24:
	.dbline 96
	clr R12
	clr R13
	rjmp L31
L28:
	.dbline 96
L29:
	.dbline 96
	movw R24,R12
	adiw R24,1
	movw R12,R24
L31:
	.dbline 96
	ldi R20,216
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R2,R12
	clr R4
	clr R5
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brlt L28
L25:
	.dbline 95
	movw R24,R10
	adiw R24,1
	movw R10,R24
L27:
	.dbline 95
	cp R10,R16
	cpc R11,R17
	brlo L24
	.dbline -2
L23:
	rcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym r i 10 i
	.dbsym r j 12 i
	.dbsym r n 16 i
	.dbend
	.dbfunc e ms _ms fV
;              i -> R10,R11
;              j -> R12,R13
;              n -> R16,R17
	.even
_ms::
	rcall push_gset4
	.dbline -1
	.dbline 100
; 		for(j=0; j<MS_COUNT/2;j++);
; }
; 
; void ms(WORD n)
; {	//延时n毫秒
	.dbline 103
	clr R10
	clr R11
	rjmp L36
L33:
	.dbline 103
; 	WORD i,j;
; 
; 	for(i=0; i<n; i++){WDR();
	.dbline 103
	wdr
	.dbline 104
	clr R12
	clr R13
	rjmp L40
L37:
	.dbline 104
L38:
	.dbline 104
	movw R24,R12
	adiw R24,1
	movw R12,R24
L40:
	.dbline 104
	ldi R20,177
	ldi R21,1
	ldi R22,0
	ldi R23,0
	movw R2,R12
	clr R4
	clr R5
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brlt L37
	.dbline 104
L34:
	.dbline 103
	movw R24,R10
	adiw R24,1
	movw R10,R24
L36:
	.dbline 103
	cp R10,R16
	cpc R11,R17
	brlo L33
	.dbline -2
L32:
	rcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym r i 10 i
	.dbsym r j 12 i
	.dbsym r n 16 i
	.dbend
	.dbfunc e us _us fV
;              i -> R10,R11
;              j -> R12,R13
;              n -> R16,R17
	.even
_us::
	rcall push_gset4
	.dbline -1
	.dbline 108
; 		for(j=0; j<MS_COUNT;j++);}
; }
; 
; void us(WORD n)
; {	//延时n毫秒
	.dbline 111
; 	WORD i,j;
; 
; 	for(i=0; i<n; i++)
	clr R10
	clr R11
	rjmp L45
L42:
	.dbline 112
	clr R12
	clr R13
	rjmp L49
L46:
	.dbline 112
L47:
	.dbline 112
	movw R24,R12
	adiw R24,1
	movw R12,R24
L49:
	.dbline 112
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R2,R12
	clr R4
	clr R5
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brlt L46
L43:
	.dbline 111
	movw R24,R10
	adiw R24,1
	movw R10,R24
L45:
	.dbline 111
	cp R10,R16
	cpc R11,R17
	brlo L42
	.dbline -2
L41:
	rcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym r i 10 i
	.dbsym r j 12 i
	.dbsym r n 16 i
	.dbend
	.dbfunc e delay_s _delay_s fV
;              i -> R20,R21
;              n -> R22,R23
	.even
_delay_s::
	rcall push_gset2
	movw R22,R16
	.dbline -1
	.dbline 117
; 		for(j=0; j<MS_COUNT/1000;j++);
; }
; 
; /////////////////////////////////////////////////////////////
; void delay_s(WORD n)
; {
	.dbline 119
	clr R20
	clr R21
	rjmp L54
L51:
	.dbline 119
	ldi R16,100
	ldi R17,0
	rcall _ms
L52:
	.dbline 119
	subi R20,255  ; offset = 1
	sbci R21,255
L54:
	.dbline 119
; 	WORD	i;
; 	for ( i=0; i<10*n; i++ )	ms(100);
	ldi R16,10
	ldi R17,0
	movw R18,R22
	rcall empy16s
	cp R20,R16
	cpc R21,R17
	brlo L51
	.dbline -2
L50:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r n 22 i
	.dbend
	.dbfunc e adc_init _adc_init fV
	.even
_adc_init::
	.dbline -1
	.dbline 126
; }
; 
; 
; /////////////////////////////////////////////////////////////////////////////////
; //	ADC		初始化
; void adc_init(void)
; {
	.dbline 127
; 	adc_first =1;	
	ldi R24,1
	ldi R25,0
	sts _adc_first+1,R25
	sts _adc_first,R24
	.dbline 128
; 	adc_val = 0;
	clr R2
	clr R3
	sts _adc_val+1,R3
	sts _adc_val,R2
	.dbline 130
; 
; 	DDRC&=0xFE;//设PC0口为高阻输入
	in R24,0x14
	andi R24,254
	out 0x14,R24
	.dbline 131
; 	PORTC&=0xFE;
	in R24,0x15
	andi R24,254
	out 0x15,R24
	.dbline 136
; //	ADMUX=0x00;//选择外部2.47V为基准,ADC0通道
; //	ACSR  =(1<<ACD);//关闭模拟比较器
; //	SFIOR&=(~(1<<ADHSM)); //低速AD模式	
; 	//64分频单次转换模式并开始第一次转换
; 	ADCSRA|=(1<<ADEN)|(1<<ADIE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);
	in R24,0x6
	ori R24,142
	out 0x6,R24
	.dbline -2
L55:
	.dbline 0 ; func end
	ret
	.dbend
	.area vector(rom, abs)
	.org 28
	rjmp _adc_isr
	.area text(rom, con, rel)
	.dbfile E:\GetPower_M8_source\GetPower_M8.c
	.dbfunc e adc_isr _adc_isr fV
	.even
_adc_isr::
	rcall push_lset
	.dbline -1
	.dbline 144
; 
; }
; 
; /////////////////////////////////////////////////////////////////////////////////
; //ADC完成中断
; #pragma interrupt_handler adc_isr:iv_ADC
; void adc_isr(void)
; {
	.dbline 145
; 	WDR();		
	wdr
	.dbline 147
; 
; 	if ( adc_first ){adc_first--;
	lds R2,_adc_first
	lds R3,_adc_first+1
	tst R2
	brne X1
	tst R3
	breq L57
X1:
	.dbline 147
	.dbline 147
	lds R24,_adc_first
	lds R25,_adc_first+1
	sbiw R24,1
	sts _adc_first+1,R25
	sts _adc_first,R24
	.dbline 148
	rjmp L58
L57:
	.dbline 148
; 		}else{adc_val = ADC & 0x3ff;	//取AD值
	.dbline 148
	in R24,0x4
	in R25,0x5
	andi R25,3
	sts _adc_val+1,R25
	sts _adc_val,R24
	.dbline 149
; 			if(adc_val==0x3ff){
	lds R24,_adc_val
	lds R25,_adc_val+1
	cpi R24,255
	ldi R30,3
	cpc R25,R30
	brne L59
	.dbline 149
	.dbline 150
; 					Power_Low=0;
	clr R2
	clr R3
	sts _Power_Low+1,R3
	sts _Power_Low,R2
	.dbline 151
; 					DDRB|=(1<<PB1);
	sbi 0x17,1
	.dbline 152
; 					PORTB|=(1<<PB1);
	sbi 0x18,1
	.dbline 153
; 					ms(500);
	ldi R16,500
	ldi R17,1
	rcall _ms
	.dbline 154
; 					PORTB&=(~(1<<PB1));
	cbi 0x18,1
	.dbline 155
; 					DDRB&=(~(1<<PB1));
	cbi 0x17,1
	.dbline 156
; 			}
L59:
	.dbline 158
L58:
	.dbline -2
L56:
	rcall pop_lset
	.dbline 0 ; func end
	reti
	.dbend
	.dbfunc e AC_init _AC_init fV
	.even
_AC_init::
	.dbline -1
	.dbline 163
; 
; 		}
; }
; /////////////////////////////////////////////////////////////////////////////////
; //比较器    初始化
; void AC_init(void)
; {
	.dbline 164
; 	DDRD&=0x3F;//设PD6,PD7口为高阻输入
	in R24,0x11
	andi R24,63
	out 0x11,R24
	.dbline 165
; 	PORTD&=0X3F;
	in R24,0x12
	andi R24,63
	out 0x12,R24
	.dbline 166
; 	ACSR|=(1<<ACIE)|(1<<ACIS1)|(1<<ACIS0);//比较器中断允许,输出上升沿触发
	in R24,0x8
	ori R24,11
	out 0x8,R24
	.dbline -2
L61:
	.dbline 0 ; func end
	ret
	.dbend
	.area vector(rom, abs)
	.org 32
	rjmp _ac_isr
	.area text(rom, con, rel)
	.dbfile E:\GetPower_M8_source\GetPower_M8.c
	.dbfunc e ac_isr _ac_isr fV
	.even
_ac_isr::
	rcall push_lset
	.dbline -1
	.dbline 173
; }
; 
; /////////////////////////////////////////////////////////////////////////////////
; //比较器中断处理
; #pragma interrupt_handler ac_isr:iv_ANA_COMP 
; void ac_isr(void)
; {
	.dbline 174
; 	Power_Low=1;
	ldi R24,1
	ldi R25,0
	sts _Power_Low+1,R25
	sts _Power_Low,R24
	.dbline 175
; 	DDRB|=(1<<PB2);
	sbi 0x17,2
	.dbline 176
; 	PORTB|=(1<<PB2);
	sbi 0x18,2
	.dbline 177
; 	ms(500);
	ldi R16,500
	ldi R17,1
	rcall _ms
	.dbline 178
; 	PORTB&=(~(1<<PB2));
	cbi 0x18,2
	.dbline 179
; 	DDRB&=(~(1<<PB2));
	cbi 0x17,2
	.dbline -2
L62:
	rcall pop_lset
	.dbline 0 ; func end
	reti
	.dbend
	.dbfunc e wdt_init _wdt_init fV
	.even
_wdt_init::
	.dbline -1
	.dbline 184
; 	
; }
; /////////////////////////////////////////////////////////////////////////////////
; void wdt_init(void)
; {
	.dbline 185
; 	WDR();//喂狗
	wdr
	.dbline 186
; 	WDTCR|=(BIT(WDCE)|BIT(WDE));
	in R24,0x21
	ori R24,24
	out 0x21,R24
	.dbline 187
; 	WDTCR=BIT(WDP2)|BIT(WDP1)|BIT(WDP0)|BIT(WDE);
	ldi R24,15
	out 0x21,R24
	.dbline -2
L63:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e main _main fV
	.even
_main::
	.dbline -1
	.dbline 194
; }
; 
; 
; /////////////////////////////////////////////////////////////
; 
; void main(void)
; {
	.dbline 195
; 	CLI();
	cli
	.dbline 196
; 	wdt_init();
	rcall _wdt_init
	.dbline 197
; 	adc_init();
	rcall _adc_init
	.dbline 198
; 	AC_init();
	rcall _AC_init
	.dbline 199
; 	WDR();
	wdr
	.dbline 200
; 	DDRD|=(1<<PD3);//Led指示
	sbi 0x11,3
	.dbline 201
; 	SEI();
	sei
	.dbline 202
; 	ac_isr();
	rcall _ac_isr
	.dbline 203
; 	Power_Low=1;
	ldi R24,1
	ldi R25,0
	sts _Power_Low+1,R25
	sts _Power_Low,R24
	rjmp L66
L65:
	.dbline 204
; 	while(1){
	.dbline 205
; 	WDR();
	wdr
	.dbline 206
; 	LED_H;
	sbi 0x12,3
	.dbline 207
; 	ms(3000);
	ldi R16,3000
	ldi R17,11
	rcall _ms
	.dbline 208
	lds R2,_Power_Low
	lds R3,_Power_Low+1
	tst R2
	brne L68
	tst R3
	brne L68
X2:
	.dbline 208
	.dbline 208
	nop
	.dbline 208
	rjmp L69
L68:
	.dbline 208
; 		if(!Power_Low){NOP();}else{ADCSRA|=(1<<ADSC);}
	.dbline 208
	sbi 0x6,6
	.dbline 208
L69:
	.dbline 209
	cbi 0x12,3
	.dbline 210
	ldi R16,3000
	ldi R17,11
	rcall _ms
	.dbline 211
L66:
	.dbline 204
	rjmp L65
X3:
	.dbline -2
L64:
	.dbline 0 ; func end
	ret
	.dbend
	.area bss(ram, con, rel)
	.dbfile E:\GetPower_M8_source\GetPower_M8.c
_adc_first:
	.blkb 2
	.dbsym s adc_first _adc_first i
_Power_Low:
	.blkb 2
	.dbsym s Power_Low _Power_Low I
_adc_val:
	.blkb 2
	.dbsym s adc_val _adc_val i

⌨️ 快捷键说明

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