📄 main.s
字号:
.module main.c
.area data(ram, con, rel)
_buf::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.blkb 8
.area idata
.byte 0,0,0,0,0,0,0,0
.area data(ram, con, rel)
.dbfile E:\公司用\atmega8l\final\new\nrf905_receive\main.c
.dbsym e buf _buf A[9:9]c
.area text(rom, con, rel)
.dbfile E:\公司用\atmega8l\final\new\nrf905_receive\main.c
.dbfunc e Get_CRC16 _Get_CRC16 fi
; low -> R20
; high -> R22
; i -> R10
; check -> R6
; j -> R14
; crc -> R12,R13
; len -> R18
; buf -> R4,R5
.even
_Get_CRC16::
rcall push_gset5
movw R4,R16
.dbline -1
.dbline 18
; /************************************
; 功能:nrf905接受函数主函数
; 时间:2008年8月30日
; 编写:陈锐
; 版本:1.2
; ************************************/
;
; #include "confg.h"
;
; //buf[0]:子机地址;buf[1]:命令参数0x03;
; //buf[2]:数据长度,长度为7;buf[3]和buf[4]:温度数据
; //buf[5]和buf[6]:子机电压数据;buf[7]和buf[8]:crc校检
; unsigned char buf[9]={0};//向主机发送的数据
;
; //crc校检函数
; //*buf数据缓冲区,len数据缓冲区长度,CRC 返回的16位校检码
; unsigned int Get_CRC16(unsigned char *buf,unsigned char len)
; {
.dbline 23
; unsigned char high,low;
; unsigned char i,j;
; unsigned char check;
; unsigned int crc;
; crc=0xffff;
ldi R24,65535
ldi R25,255
movw R12,R24
.dbline 24
; for(i=0;i<len;i++)
clr R10
rjmp L5
L2:
.dbline 25
; {
.dbline 26
; crc=crc^buf[i];
mov R30,R10
clr R31
add R30,R4
adc R31,R5
ldd R2,z+0
clr R3
eor R12,R2
eor R13,R3
.dbline 27
; for(j=0;j<8;j++)
clr R14
rjmp L9
L6:
.dbline 28
; {
.dbline 29
; check=crc&1;
movw R24,R12
andi R24,1
andi R25,0
mov R6,R24
.dbline 30
; crc=crc>>1;
lsr R13
ror R12
.dbline 31
; crc=crc&0x7fff;
movw R24,R12
andi R25,127
movw R12,R24
.dbline 32
; if(check==1)
mov R24,R6
cpi R24,1
brne L10
.dbline 33
; {
.dbline 34
; crc=crc^0xa001;
ldi R24,40961
ldi R25,160
eor R12,R24
eor R13,R25
.dbline 35
; }
L10:
.dbline 36
L7:
.dbline 27
inc R14
L9:
.dbline 27
mov R24,R14
cpi R24,8
brlo L6
.dbline 37
L3:
.dbline 24
inc R10
L5:
.dbline 24
cp R10,R18
brlo L2
.dbline 38
; }
; }
; high=crc&0x00ff;
mov R22,R12
andi R23,0
.dbline 39
; low=crc>>8;
movw R20,R12
mov R20,R21
clr R21
.dbline 40
; crc=(high<<8)|low;
mov R13,R22
mov R12,R20
.dbline 41
; return crc;
movw R16,R12
.dbline -2
L1:
rcall pop_gset5
.dbline 0 ; func end
ret
.dbsym r low 20 c
.dbsym r high 22 c
.dbsym r i 10 c
.dbsym r check 6 c
.dbsym r j 14 c
.dbsym r crc 12 i
.dbsym r len 18 c
.dbsym r buf 4 pc
.dbend
.dbfunc e port_init _port_init fV
.even
_port_init::
.dbline -1
.dbline 46
; }
;
; //串口初始化
; void port_init(void)
; {
.dbline 48
;
; PORTB = 0xD7;
ldi R24,215
out 0x18,R24
.dbline 49
; DDRB = 0x2C;
ldi R24,44
out 0x17,R24
.dbline 50
; PORTC = 0x00; //m103 output only
clr R2
out 0x15,R2
.dbline 51
; DDRC = 0x00;
out 0x14,R2
.dbline 52
; PORTD = 0x1f;
ldi R24,31
out 0x12,R24
.dbline 53
; DDRD = 0xe0;
ldi R24,224
out 0x11,R24
.dbline -2
.dbline 54
; }
L12:
.dbline 0 ; func end
ret
.dbend
.dbfunc e spi_init _spi_init fV
; temp -> R16
.even
_spi_init::
.dbline -1
.dbline 59
;
;
; //SPI initialize
; void spi_init(void)
; {uchar temp;
.dbline 62
;
; //SPCR = 0xD1; //SPI中断允许,SPI允许,主机模式,MSB,极性方式00,1/16系统时钟速率
; SPCR = 0x51; //不使用SPI中断,其它同上
ldi R24,81
out 0xd,R24
.dbline 63
; SPSR = 0x00; //setup SPI
clr R2
out 0xe,R2
.dbline 65
;
; temp = SPSR; //!!!
in R16,0xe
.dbline 66
; temp = SPDR; //清空SPI,和中断标志,使SPI空闲
in R16,0xf
.dbline -2
.dbline 67
; }
L13:
.dbline 0 ; func end
ret
.dbsym r temp 16 c
.dbend
.dbfunc e init_devices _init_devices fV
.even
_init_devices::
.dbline -1
.dbline 71
;
; //call this routine to initialize all peripherals
; void init_devices(void)
; {
.dbline 73
; //stop errant interrupts until set up
; CLI(); //disable all interrupts
cli
.dbline 74
; port_init();
rcall _port_init
.dbline 75
; spi_init();
rcall _spi_init
.dbline 76
; uart_init();
rcall _uart_init
.dbline 78
;
; MCUCR = 0x0c;
ldi R24,12
out 0x35,R24
.dbline 79
; GICR|= 0x80;//enable INT1 interrupt
in R24,0x3b
ori R24,128
out 0x3b,R24
.dbline 80
; GIFR = 0xc0;// 清除INT0、INT1 中断标志位
ldi R24,192
out 0x3a,R24
.dbline 81
; SEI(); //re-enable interrupts
sei
.dbline -2
.dbline 83
; //all peripherals are now initialized
; }
L14:
.dbline 0 ; func end
ret
.dbend
.dbfunc e rs485_send _rs485_send fV
.even
_rs485_send::
.dbline -1
.dbline 86
;
; void rs485_send(void)//打开rs485发送,DE位为1
; {
.dbline 87
; DDRC=0x01;
ldi R24,1
out 0x14,R24
.dbline 88
; PORTC=0x01;
out 0x15,R24
.dbline -2
.dbline 89
; }
L15:
.dbline 0 ; func end
ret
.dbend
.dbfunc e rs485_rec _rs485_rec fV
.even
_rs485_rec::
.dbline -1
.dbline 92
;
; void rs485_rec(void)//打开rs485接收
; {
.dbline 93
; DDRC=0x01;
ldi R24,1
out 0x14,R24
.dbline 94
; PORTC=0x00;
clr R2
out 0x15,R2
.dbline -2
.dbline 95
; }
L16:
.dbline 0 ; func end
ret
.dbend
.dbfunc e main _main fV
; string -> <dead>
; i -> R20,R21
.even
_main::
.dbline -1
.dbline 99
;
;
; void main(void)
; {
.dbline 101
; uchar string;
; int i=0;
clr R20
clr R21
.dbline 102
; init_devices();
rcall _init_devices
.dbline 103
; delay_10ms(20);
ldi R16,20
ldi R17,0
rcall _delay_10ms
.dbline 105
;
; Read_nrf905Add();//读取nrf905的接受发送地址
rcall _Read_nrf905Add
.dbline 107
;
; nrf905_Init(); //初始化nrf905
rcall _nrf905_Init
.dbline 112
;
; //delay_10ms(50);
; //puts_hh("receive start!");//用来演示
; // delay_10ms(2);
; nrf905_RxOn();//enable nrf905接收
rcall _nrf905_RxOn
L18:
.dbline 114
.dbline 116
L19:
.dbline 114
rjmp L18
X0:
.dbline -2
.dbline 117
;
; while(1) {
;
; }
; }
L17:
.dbline 0 ; func end
ret
.dbsym l string 1 c
.dbsym r i 20 I
.dbend
.area vector(rom, abs)
.org 4
rjmp _int1_isr
.area text(rom, con, rel)
.dbfile E:\公司用\atmega8l\final\new\nrf905_receive\main.c
.dbfunc e int1_isr _int1_isr fV
; crc -> R20,R21
.even
_int1_isr::
rcall push_lset
rcall push_gset1
.dbline -1
.dbline 123
;
;
;
; #pragma interrupt_handler int1_isr:3
; void int1_isr(void)
; {
.dbline 126
; unsigned int crc;
;
; RfRecvProc();//接收处理
rcall _RfRecvProc
.dbline 130
; //读出的数据Rx_Buf[0]是子机地址,Rx_Buf[2]和Rx_Buf[3]是温度数据,
; //Rx_Buf[4]和Rx_Buf[5]是子机电源电压数据,Rx_Buf[1]是命令字
;
; buf[0]=Rx_Buf[0];//子机地址
lds R2,_Rx_Buf
sts _buf,R2
.dbline 131
; buf[1]=Rx_Buf[1];//命令字
lds R2,_Rx_Buf+1
sts _buf+1,R2
.dbline 132
; buf[2]=0x07;//数据长度,包括子机地址、命令字和数据
ldi R24,7
sts _buf+2,R24
.dbline 133
; buf[3]=Rx_Buf[2];//Rx_Buf[2]和Rx_Buf[3]是温度数据
lds R2,_Rx_Buf+2
sts _buf+3,R2
.dbline 134
; buf[4]=Rx_Buf[3];
lds R2,_Rx_Buf+3
sts _buf+4,R2
.dbline 135
; buf[5]=Rx_Buf[4];//Rx_Buf[4]和Rx_Buf[5]是子机电源电压数据
lds R2,_Rx_Buf+4
sts _buf+5,R2
.dbline 136
; buf[6]=Rx_Buf[5];
lds R2,_Rx_Buf+5
sts _buf+6,R2
.dbline 137
; crc=Get_CRC16(buf,7);//获得CRC校检
ldi R18,7
ldi R16,<_buf
ldi R17,>_buf
rcall _Get_CRC16
movw R20,R16
.dbline 138
; buf[7]=crc;
sts _buf+7,R20
.dbline 139
; buf[8]=(crc<<8);
movw R2,R20
mov R3,R2
clr R2
sts _buf+8,R2
.dbline 140
; rs485_send();//置rs485为发送状态
rcall _rs485_send
.dbline 143
; //printf("%s",buf);//向485发送数据
;
; printf("slave add is %d\r\n",Tx_Buf[0]);
lds R18,_Tx_Buf
clr R19
ldi R16,<L35
ldi R17,>L35
rcall _printf
.dbline 144
; printf("command is %x\r\n",Tx_Buf[1]);
lds R18,_Tx_Buf+1
clr R19
ldi R16,<L36
ldi R17,>L36
rcall _printf
.dbline 147
;
; //改变nrf905的发送地址
; Change_TX_ADD(Rx_Buf[0]);
lds R16,_Rx_Buf
rcall _Change_TX_ADD
.dbline 148
; Tx_Buf[0]=0xFF;//发出确认收到命令
ldi R24,255
sts _Tx_Buf,R24
.dbline 150
; //发送测试
; RfSendProc();
rcall _RfSendProc
.dbline 151
; rs485_rec();//置rs485为接收状态
rcall _rs485_rec
.dbline 152
; CLR(PORTB,AM);//清除中断标志
cbi 0x18,3
.dbline -2
.dbline 153
; }
L21:
rcall pop_gset1
rcall pop_lset
.dbline 0 ; func end
reti
.dbsym r crc 20 i
.dbend
.area data(ram, con, rel)
.dbfile E:\公司用\atmega8l\final\new\nrf905_receive\main.c
L36:
.blkb 16
.area idata
.byte 'c,'o,'m,'m,'a,'n,'d,32,'i,'s,32,37,'x,13,10,0
.area data(ram, con, rel)
.dbfile E:\公司用\atmega8l\final\new\nrf905_receive\main.c
L35:
.blkb 18
.area idata
.byte 's,'l,'a,'v,'e,32,'a,'d,'d,32,'i,'s,32,37,'d,13
.byte 10,0
.area data(ram, con, rel)
.dbfile E:\公司用\atmega8l\final\new\nrf905_receive\main.c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -