📄 init.s
字号:
.module init.c
.area data(ram, con, rel)
_ptr::
.blkb 2
.area idata
.byte 0,0
.area data(ram, con, rel)
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile E:\abol\file\EMD\programme\init.c
.dbsym e ptr _ptr A[3:3]c
.area text(rom, con, rel)
.dbfile E:\abol\file\EMD\programme\init.c
.dbfunc e port_init _port_init fV
.even
_port_init::
.dbline -1
.dbline 22
; /********************************************************/
; /* ABOL */
; /* 868MHZ数码管显示接收器 */
; /* 作者:于朝晖 2008-5-24 9:30:00 */
; /* 目标MCU:MEGA16 晶振:INT RC 8MHZ */
; /* 文件名称:init.c 负责初始化MCU各内部资源及外部端口 */
; /* 编译:ICC-AVR application builder */
; /* 当前版本: 1.0 */
; /* 修改日期: 2008.5.24 */
; /********************************************************/
;
; #include <iom88v.h>
; #include <macros.h>
; #include "eeprom.h"
; #include "delay.h"
; #include "init.h"
; #define bitset(var, bitno) ((var) |= (1 << (bitno)))
; #define bitclr(var, bitno) ((var) &= ~(1 << (bitno)))
; unsigned char ptr[3]={0,0,0};
;
; void port_init(void)
; {
.dbline 23
; PORTB = 0xff; //00010000 ff
ldi R24,255
out 0x5,R24
.dbline 24
; DDRB = 0xff; //11111111 ff
out 0x4,R24
.dbline 25
; PORTC = 0x0c; //00001100 0c
ldi R24,12
out 0x8,R24
.dbline 26
; DDRC = 0xf7; //11111011 f7
ldi R24,247
out 0x7,R24
.dbline 27
; PORTD = 0xee; //11101111 e7
ldi R24,238
out 0xb,R24
.dbline 28
; DDRD = 0x11; //00010001 19
ldi R24,17
out 0xa,R24
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e timer0_init _timer0_init fV
.even
_timer0_init::
.dbline -1
.dbline 32
; }
;
; void timer0_init(void)
; {
.dbline 33
; TCNT0 =196; // T/C0开始值
ldi R24,196
out 0x26,R24
.dbline 34
; TCCR0B=0x02; // 预分频 ck/8 ,计数允许
ldi R24,2
out 0x25,R24
.dbline 35
; TIFR0=0;
clr R2
out 0x15,R2
.dbline 36
; TIMSK0=1;
ldi R24,1
sts 110,R24
.dbline 37
; TIFR0=1;
out 0x15,R24
.dbline -2
L2:
.dbline 0 ; func end
ret
.dbend
.dbfunc e timer2_init _timer2_init fV
.even
_timer2_init::
.dbline -1
.dbline 41
; }
;
; void timer2_init(void)
; {
.dbline 42
; TIMSK2=0;
clr R2
sts 112,R2
.dbline 43
; ASSR=32; //外部时钟输入使能
ldi R24,32
sts 182,R24
.dbline 44
; TCCR2A=0; //普通模式
sts 176,R2
.dbline 45
; TCCR2B=3; //32分频
ldi R24,3
sts 177,R24
.dbline 46
; TCNT2=0; // T/C2开始值
sts 178,R2
.dbline 47
; NOP();
nop
.dbline 49
;
; NOP();
nop
.dbline 50
; NOP();
nop
.dbline 51
; NOP();
nop
.dbline 52
; TIFR2=0; //清标致位
out 0x17,R2
.dbline 53
; TIMSK2=0; // 预分频 32768/32 ,计数允许
sts 112,R2
.dbline 54
; TIFR2=1;
ldi R24,1
out 0x17,R24
.dbline -2
L3:
.dbline 0 ; func end
ret
.dbend
.dbfunc e watchdog_init _watchdog_init fV
.even
_watchdog_init::
.dbline -1
.dbline 58
; }
;
; void watchdog_init(void)
; {
.dbline 59
; WDR(); //this prevents a timout on enabling
wdr
.dbline 60
; WDTCSR=(1<<WDCE)|(1<<WDE);
ldi R24,24
sts 96,R24
.dbline 61
; WDTCSR=(0<<WDE);
clr R2
sts 96,R2
.dbline -2
L4:
.dbline 0 ; func end
ret
.dbend
.dbfunc e init_devices _init_devices fV
.even
_init_devices::
.dbline -1
.dbline 67
; }
;
;
; //call this routine to initialize all peripherals
; void init_devices(void)
; {
.dbline 69
; //stop errant interrupts until set up
; CLI(); //disable all interrupts
cli
.dbline 70
; port_init();
rcall _port_init
.dbline 71
; timer0_init();
rcall _timer0_init
.dbline 72
; timer2_init();
rcall _timer2_init
.dbline 75
; //watchdog_init();
;
; MCUCR = 0x00;
clr R2
out 0x35,R2
.dbline 76
; EIMSK = 0x00;
out 0x1d,R2
.dbline 77
; EICRA = 0x00; //extended ext ints
sts 105,R2
.dbline 79
;
; TIMSK0 = 0x01; //timer 0 interrupt sources
ldi R24,1
sts 110,R24
.dbline 80
; TIMSK1 = 0x00; //timer 1 interrupt sources
sts 111,R2
.dbline 81
; TIMSK2 = 0x01; //timer 2 interrupt sources
sts 112,R24
.dbline 83
;
; PCMSK0 = 0x00; //pin change mask 0
sts 107,R2
.dbline 84
; PCMSK1 = 0x00; //pin change mask 1
sts 108,R2
.dbline 85
; PCMSK2 = 0x00; //pin change mask 2
sts 109,R2
.dbline 86
; PCICR = 0x00; //pin change enable
sts 104,R2
.dbline 88
; //PRR = 0xa2; //power controller
; SEI(); //re-enable interrupts
sei
.dbline 89
; ADCSRA=0X16;
ldi R24,22
sts 122,R24
.dbline 90
; ADMUX=0X00; //关ADC
sts 124,R2
.dbline 91
; ACSR=(1<<ACD);
ldi R24,128
out 0x30,R24
.dbline 92
; SMCR=(0<<SM2)|(1<<SM1)|(0<<SM0); //设定为掉电模式
ldi R24,4
out 0x33,R24
.dbline -2
L5:
.dbline 0 ; func end
ret
.dbend
.dbfunc e ADconv _ADconv fV
.even
_ADconv::
.dbline -1
.dbline 98
; //all peripherals are now initialized
; }
;
; /* AD转换 */
; void ADconv (void)
; {WDR();
.dbline 98
wdr
.dbline 99
; CLI();
cli
.dbline 100
; ADMUX=0XE0; //1.1V基准,ADC0通道0B11100000
ldi R24,224
sts 124,R24
.dbline 101
; ADCSRA=0XC6; //使能和转换
ldi R24,198
sts 122,R24
L7:
.dbline 102
L8:
.dbline 102
; while(!(ADCSRA & (1<<ADIF)));//转换测试
lds R2,122
sbrs R2,4
rjmp L7
.dbline 103
; ADcon=ADCL;
lds R2,120
sts _ADcon,R2
.dbline 104
; ADcon=ADCH;
lds R2,121
sts _ADcon,R2
.dbline 105
; ADCSRA=0X16;
ldi R24,22
sts 122,R24
.dbline 106
; ADMUX=0X00; //关ADC
clr R2
sts 124,R2
.dbline 107
; SEI();
sei
.dbline -2
L6:
.dbline 0 ; func end
ret
.dbend
.dbfunc e CRC3 _CRC3 fc
; i -> <dead>
; j -> R22
; len -> R10
; data -> R20,R21
.even
_CRC3::
rcall push_gset3
mov R10,R18
movw R20,R16
.dbline -1
.dbline 120
; }
; /******************************************
; CRC3校验函数
; 输 入: ptr需要进行校验的数据包
; len需要校验的数据包字节数
; 输 出: 校验码;
; 调 用: 无;
; 被调用: 从机协议打包函数;
; 功 能: 将一给定的数据包进行CRC12校验给调用者返回校验码
; ******************************************/
;
; unsigned char CRC3(unsigned char *data, unsigned char len)
; {
.dbline 123
; unsigned char i;
; unsigned char j;
; j = 0;
clr R22
.dbline 124
; crc=0;
clr R2
sts _crc,R2
rjmp L12
L11:
.dbline 126
; while(len)
; {
.dbline 128
; /*多项式除法*/
; if(*data & (0x80>>j)) //如果该位为1
mov R18,R22
clr R19
ldi R16,128
ldi R17,0
rcall asr16
movw R30,R20
ldd R2,z+0
clr R3
and R2,R16
and R3,R17
tst R2
brne X0
tst R3
breq L14
X0:
.dbline 129
; crc |= 0x01; //则在余数尾部添1否则添0
lds R24,_crc
ori R24,1
sts _crc,R24
L14:
.dbline 130
; if(crc >= 0x8)
lds R24,_crc
cpi R24,8
brlo L16
.dbline 131
; crc ^= 11;
ldi R24,11
lds R2,_crc
eor R2,R24
sts _crc,R2
L16:
.dbline 132
; crc <<= 1;
lds R2,_crc
lsl R2
sts _crc,R2
.dbline 133
; j++;
inc R22
.dbline 134
; if(j == 8)
cpi R22,8
brne L18
.dbline 135
; {
.dbline 136
; j = 0;
clr R22
.dbline 137
; data++;
subi R20,255 ; offset = 1
sbci R21,255
.dbline 138
; len--;
dec R10
.dbline 139
; }
L18:
.dbline 140
L12:
.dbline 125
tst R10
brne L11
.dbline 141
; }
; return(crc);
lds R16,_crc
.dbline -2
L10:
rcall pop_gset3
.dbline 0 ; func end
ret
.dbsym l i 1 c
.dbsym r j 22 c
.dbsym r len 10 c
.dbsym r data 20 pc
.dbend
.area vector(rom, abs)
.org 32
rjmp _timer0_ovf_isr
.area text(rom, con, rel)
.dbfile E:\abol\file\EMD\programme\init.c
.dbfunc e timer0_ovf_isr _timer0_ovf_isr fV
; j -> R20
; i -> R22
.even
_timer0_ovf_isr::
rcall push_lset
rcall push_gset2
.dbline -1
.dbline 145
; }
; #pragma interrupt_handler timer0_ovf_isr:17
; void timer0_ovf_isr(void) //中断程序
; {
.dbline 147
; unsigned char i,j;
; TCNT0=196; //产生16.8K的信号
ldi R24,196
out 0x26,R24
.dbline 149
;
; if (((flag&0x02)!=0)&&((flag&0x04)==0))//RF开关
lds R2,_flag
sbrs R2,1
rjmp L21
sbrc R2,2
rjmp L21
.dbline 150
; {//1
.dbline 151
; if ((PINC&0x08)==0)//测试输入电平 如输入为1跳到高计数
sbic 0x6,3
rjmp L23
.dbline 152
; {//2
.dbline 153
; if ((flag&0x01)==0)//检测以前的解码状态
sbrc R2,0
rjmp L25
.dbline 154
; {//2-1
.dbline 155
; LO_COUNT++;//最大计数 FFH
lds R24,_LO_COUNT
subi R24,255 ; addi 1
sts _LO_COUNT,R24
.dbline 156
; if (LO_COUNT==0)
tst R24
breq X3
rjmp L20
X3:
.dbline 157
; {//2-1'
.dbline 158
; LO_COUNT--;
subi R24,1
sts _LO_COUNT,R24
.dbline 159
; }//2-1'
.dbline 160
; return;//大于FFH跳出中断
rjmp L20
L25:
.dbline 162
; }//2-1
; DECODER_STATUS_L; //变成当前状态
lds R24,_flag
andi R24,254
sts _flag,R24
.dbline 163
; LO_COUNT_SAVE=LO_COUNT;//保存低电平计数
lds R2,_LO_COUNT
sts _LO_COUNT_SAVE,R2
.dbline 164
; LO_COUNT=0;//更新低电平计数
clr R2
sts _LO_COUNT,R2
.dbline 165
; if ((HI_COUNT_SAVE>MAXDURATION)||(HI_COUNT_SAVE==0))//如果高电平大于限定值
ldi R30,<_MAXDURATION
ldi R31,>_MAXDURATION
lpm R30,Z
lds R2,_HI_COUNT_SAVE
cp R30,R2
brlo L31
tst R2
breq X4
rjmp L20
X4:
L31:
.dbline 166
; {//2-2
.dbline 167
; BITCOUNTER=CODELANGTH;//代码是错误的
ldi R30,<_CODELANGTH
ldi R31,>_CODELANGTH
lpm R30,Z
sts _BITCOUNTER,R30
.dbline 168
; data[0]=0;
clr R2
sts _data,R2
.dbline 169
; data[1]=0;
sts _data+1,R2
.dbline 170
; data[2]=0;
sts _data+2,R2
.dbline 171
; }//2-2
.dbline 172
; return;//跳出中断
rjmp L20
L23:
.dbline 175
; }//2
; else//高计数
; {//3
.dbline 176
; if ((flag&0x01)!=0)//检测以前的解码状态
lds R2,_flag
sbrs R2,0
rjmp L34
.dbline 177
; {//4
.dbline 178
; HI_COUNT++;
lds R24,_HI_COUNT
subi R24,255 ; addi 1
sts _HI_COUNT,R24
.dbline 179
; if (HI_COUNT==0)//大于FFH跳出中断
tst R24
breq X5
rjmp L20
X5:
.dbline 180
; {//4-1
.dbline 181
; HI_COUNT--;
subi R24,1
sts _HI_COUNT,R24
.dbline 182
; }//4-1
.dbline 183
; return;//跳出中断
rjmp L20
L34:
.dbline 185
; }//4
; DECODER_STATUS_H; //变成当前状态
lds R24,_flag
ori R24,1
sts _flag,R24
.dbline 186
; HI_COUNT_SAVE=HI_COUNT;//保存高电平计数
lds R2,_HI_COUNT
sts _HI_COUNT_SAVE,R2
.dbline 187
; HI_COUNT=0;//更新低电平计数
clr R2
sts _HI_COUNT,R2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -