📄 getpower_m8.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 + -