📄 905receive.lst
字号:
__start:
__text_start:
00D2 E5CF LDI R28,0x5F
00D3 E0D4 LDI R29,4
00D4 BFCD OUT 0x3D,R28
00D5 BFDE OUT 0x3E,R29
00D6 51C0 SUBI R28,0x10
00D7 40D0 SBCI R29,0
00D8 EA0A LDI R16,0xAA
00D9 8308 STD Y+0,R16
00DA 2400 CLR R0
00DB EDEB LDI R30,0xDB
00DC E0F0 LDI R31,0
00DD E011 LDI R17,1
00DE 33E6 CPI R30,0x36
00DF 07F1 CPC R31,R17
00E0 F011 BEQ 0x00E3
00E1 9201 ST R0,Z+
00E2 CFFB RJMP 0x00DE
00E3 8300 STD Z+0,R16
00E4 E2E9 LDI R30,0x29
00E5 E0F1 LDI R31,1
00E6 E6A0 LDI R26,0x60
00E7 E0B0 LDI R27,0
00E8 E011 LDI R17,1
00E9 3AE4 CPI R30,0xA4
00EA 07F1 CPC R31,R17
00EB F021 BEQ 0x00F0
00EC 95C8 LPM
00ED 9631 ADIW R30,1
00EE 920D ST R0,X+
00EF CFF9 RJMP 0x00E9
00F0 D05C RCALL _main
_exit:
00F1 CFFF RJMP _exit
_Get_CRC16:
low --> R20
high --> R22
i --> R10
check --> R6
j --> R14
crc --> R12
len --> R18
buf --> R4
00F2 D487 RCALL push_gset5
00F3 0128 MOVW R4,R16
FILE: E:\公司用\atmega8l\final\new\nrf905_receive\main.c
(0001) /************************************
(0002) 功能:nrf905接受函数主函数
(0003) 时间:2008年8月30日
(0004) 编写:陈锐
(0005) 版本:1.2
(0006) ************************************/
(0007)
(0008) #include "confg.h"
(0009)
(0010) //buf[0]:子机地址;buf[1]:命令参数0x03;
(0011) //buf[2]:数据长度,长度为7;buf[3]和buf[4]:温度数据
(0012) //buf[5]和buf[6]:子机电压数据;buf[7]和buf[8]:crc校检
(0013) unsigned char buf[9]={0};//向主机发送的数据
(0014)
(0015) //crc校检函数
(0016) //*buf数据缓冲区,len数据缓冲区长度,CRC 返回的16位校检码
(0017) unsigned int Get_CRC16(unsigned char *buf,unsigned char len)
(0018) {
(0019) unsigned char high,low;
(0020) unsigned char i,j;
(0021) unsigned char check;
(0022) unsigned int crc;
(0023) crc=0xffff;
00F4 EF8F LDI R24,0xFF
00F5 EF9F LDI R25,0xFF
00F6 016C MOVW R12,R24
(0024) for(i=0;i<len;i++)
00F7 24AA CLR R10
00F8 C01F RJMP 0x0118
(0025) {
(0026) crc=crc^buf[i];
00F9 2DEA MOV R30,R10
00FA 27FF CLR R31
00FB 0DE4 ADD R30,R4
00FC 1DF5 ADC R31,R5
00FD 8020 LDD R2,Z+0
00FE 2433 CLR R3
00FF 24C2 EOR R12,R2
0100 24D3 EOR R13,R3
(0027) for(j=0;j<8;j++)
0101 24EE CLR R14
0102 C011 RJMP 0x0114
(0028) {
(0029) check=crc&1;
0103 01C6 MOVW R24,R12
0104 7081 ANDI R24,1
0105 7090 ANDI R25,0
0106 2E68 MOV R6,R24
(0030) crc=crc>>1;
0107 94D6 LSR R13
0108 94C7 ROR R12
(0031) crc=crc&0x7fff;
0109 01C6 MOVW R24,R12
010A 779F ANDI R25,0x7F
010B 016C MOVW R12,R24
(0032) if(check==1)
010C 2D86 MOV R24,R6
010D 3081 CPI R24,1
010E F421 BNE 0x0113
(0033) {
(0034) crc=crc^0xa001;
010F E081 LDI R24,1
0110 EA90 LDI R25,0xA0
0111 26C8 EOR R12,R24
0112 26D9 EOR R13,R25
0113 94E3 INC R14
0114 2D8E MOV R24,R14
0115 3088 CPI R24,0x8
0116 F360 BCS 0x0103
0117 94A3 INC R10
0118 16A2 CP R10,R18
0119 F2F8 BCS 0x00F9
(0035) }
(0036) }
(0037) }
(0038) high=crc&0x00ff;
011A 2D6C MOV R22,R12
011B 7070 ANDI R23,0
(0039) low=crc>>8;
011C 01A6 MOVW R20,R12
011D 2F45 MOV R20,R21
011E 2755 CLR R21
(0040) crc=(high<<8)|low;
011F 2ED6 MOV R13,R22
0120 2EC4 MOV R12,R20
(0041) return crc;
0121 0186 MOVW R16,R12
0122 D435 RCALL pop_gset5
0123 9508 RET
(0042) }
(0043)
(0044) //串口初始化
(0045) void port_init(void)
(0046) {
(0047)
(0048) PORTB = 0xD7;
_port_init:
0124 ED87 LDI R24,0xD7
0125 BB88 OUT 0x18,R24
(0049) DDRB = 0x2C;
0126 E28C LDI R24,0x2C
0127 BB87 OUT 0x17,R24
(0050) PORTC = 0x00; //m103 output only
0128 2422 CLR R2
0129 BA25 OUT 0x15,R2
(0051) DDRC = 0x00;
012A BA24 OUT 0x14,R2
(0052) PORTD = 0x1f;
012B E18F LDI R24,0x1F
012C BB82 OUT 0x12,R24
(0053) DDRD = 0xe0;
012D EE80 LDI R24,0xE0
012E BB81 OUT 0x11,R24
(0054) }
012F 9508 RET
(0055)
(0056)
(0057) //SPI initialize
(0058) void spi_init(void)
(0059) {uchar temp;
(0060)
(0061) //SPCR = 0xD1; //SPI中断允许,SPI允许,主机模式,MSB,极性方式00,1/16系统时钟速率
(0062) SPCR = 0x51; //不使用SPI中断,其它同上
_spi_init:
temp --> R16
0130 E581 LDI R24,0x51
0131 B98D OUT 0x0D,R24
(0063) SPSR = 0x00; //setup SPI
0132 2422 CLR R2
0133 B82E OUT 0x0E,R2
(0064)
(0065) temp = SPSR; //!!!
0134 B10E IN R16,0x0E
(0066) temp = SPDR; //清空SPI,和中断标志,使SPI空闲
0135 B10F IN R16,0x0F
(0067) }
0136 9508 RET
(0068)
(0069) //call this routine to initialize all peripherals
(0070) void init_devices(void)
(0071) {
(0072) //stop errant interrupts until set up
(0073) CLI(); //disable all interrupts
_init_devices:
0137 94F8 BCLR 7
(0074) port_init();
0138 DFEB RCALL _port_init
(0075) spi_init();
0139 DFF6 RCALL _spi_init
(0076) uart_init();
013A D256 RCALL _uart_init
(0077)
(0078) MCUCR = 0x0c;
013B E08C LDI R24,0xC
013C BF85 OUT 0x35,R24
(0079) GICR|= 0x80;//enable INT1 interrupt
013D B78B IN R24,0x3B
013E 6880 ORI R24,0x80
013F BF8B OUT 0x3B,R24
(0080) GIFR = 0xc0;// 清除INT0、INT1 中断标志位
0140 EC80 LDI R24,0xC0
0141 BF8A OUT 0x3A,R24
(0081) SEI(); //re-enable interrupts
0142 9478 BSET 7
(0082) //all peripherals are now initialized
(0083) }
0143 9508 RET
(0084)
(0085) void rs485_send(void)//打开rs485发送,DE位为1
(0086) {
(0087) DDRC=0x01;
_rs485_send:
0144 E081 LDI R24,1
0145 BB84 OUT 0x14,R24
(0088) PORTC=0x01;
0146 BB85 OUT 0x15,R24
(0089) }
0147 9508 RET
(0090)
(0091) void rs485_rec(void)//打开rs485接收
(0092) {
(0093) DDRC=0x01;
_rs485_rec:
0148 E081 LDI R24,1
0149 BB84 OUT 0x14,R24
(0094) PORTC=0x00;
014A 2422 CLR R2
014B BA25 OUT 0x15,R2
(0095) }
014C 9508 RET
(0096)
(0097)
(0098) void main(void)
(0099) {
(0100) uchar string;
(0101) int i=0;
_main:
string --> Y+1
i --> R20
014D 2744 CLR R20
014E 2755 CLR R21
(0102) init_devices();
014F DFE7 RCALL _init_devices
(0103) delay_10ms(20);
0150 E104 LDI R16,0x14
0151 E010 LDI R17,0
0152 D20A RCALL _delay_10ms
(0104)
(0105) Read_nrf905Add();//读取nrf905的接受发送地址
0153 D067 RCALL _Read_nrf905Add
(0106)
(0107) nrf905_Init(); //初始化nrf905
0154 D14C RCALL _nrf905_Init
(0108)
(0109) //delay_10ms(50);
(0110) //puts_hh("receive start!");//用来演示
(0111) // delay_10ms(2);
(0112) nrf905_RxOn();//enable nrf905接收
0155 D13D RCALL _nrf905_RxOn
(0113)
(0114) while(1) {
0156 CFFF RJMP 0x0156
(0115)
(0116) }
(0117) }
0157 9508 RET
_int1_isr:
crc --> R20
0158 D42D RCALL push_lset
0159 D400 RCALL push_gset1
(0118)
(0119)
(0120)
(0121) #pragma interrupt_handler int1_isr:3
(0122) void int1_isr(void)
(0123) {
(0124) unsigned int crc;
(0125)
(0126) RfRecvProc();//接收处理
015A D1F6 RCALL _RfRecvProc
(0127) //读出的数据Rx_Buf[0]是子机地址,Rx_Buf[2]和Rx_Buf[3]是温度数据,
(0128) //Rx_Buf[4]和Rx_Buf[5]是子机电源电压数据,Rx_Buf[1]是命令字
(0129)
(0130) buf[0]=Rx_Buf[0];//子机地址
015B 902000DB LDS R2,_Rx_Buf
015D 92200060 STS 0x60,R2
(0131) buf[1]=Rx_Buf[1];//命令字
015F 902000DC LDS R2,_Rx_Buf+1
0161 92200061 STS 0x61,R2
(0132) buf[2]=0x07;//数据长度,包括子机地址、命令字和数据
0163 E087 LDI R24,7
0164 93800062 STS 0x62,R24
(0133) buf[3]=Rx_Buf[2];//Rx_Buf[2]和Rx_Buf[3]是温度数据
0166 902000DD LDS R2,_Rx_Buf+2
0168 92200063 STS 0x63,R2
(0134) buf[4]=Rx_Buf[3];
016A 902000DE LDS R2,_Rx_Buf+3
016C 92200064 STS 0x64,R2
(0135) buf[5]=Rx_Buf[4];//Rx_Buf[4]和Rx_Buf[5]是子机电源电压数据
016E 902000DF LDS R2,0xDF
0170 92200065 STS 0x65,R2
(0136) buf[6]=Rx_Buf[5];
0172 902000E0 LDS R2,0xE0
0174 92200066 STS 0x66,R2
(0137) crc=Get_CRC16(buf,7);//获得CRC校检
0176 E027 LDI R18,7
0177 E600 LDI R16,0x60
0178 E010 LDI R17,0
0179 DF78 RCALL _Get_CRC16
017A 01A8 MOVW R20,R16
(0138) buf[7]=crc;
017B 93400067 STS 0x67,R20
(0139) buf[8]=(crc<<8);
017D 011A MOVW R2,R20
017E 2C32 MOV R3,R2
017F 2422 CLR R2
0180 92200068 STS 0x68,R2
(0140) rs485_send();//置rs485为发送状态
0182 DFC1 RCALL _rs485_send
(0141) //printf("%s",buf);//向485发送数据
(0142)
(0143) printf("slave add is %d\r\n",Tx_Buf[0]);
0183 912000FB LDS R18,_Tx_Buf
0185 2733 CLR R19
0186 E709 LDI R16,0x79
0187 E010 LDI R17,0
0188 D4D2 RCALL _printf
(0144) printf("command is %x\r\n",Tx_Buf[1]);
0189 912000FC LDS R18,_Tx_Buf+1
018B 2733 CLR R19
018C E609 LDI R16,0x69
018D E010 LDI R17,0
018E D4CC RCALL _printf
(0145)
(0146) //改变nrf905的发送地址
(0147) Change_TX_ADD(Rx_Buf[0]);
018F 910000DB LDS R16,_Rx_Buf
0191 D05D RCALL _Change_TX_ADD
(0148) Tx_Buf[0]=0xFF;//发出确认收到命令
0192 EF8F LDI R24,0xFF
0193 938000FB STS _Tx_Buf,R24
(0149) //发送测试
(0150) RfSendProc();
0195 D19E RCALL _RfSendProc
(0151) rs485_rec();//置rs485为接收状态
0196 DFB1 RCALL _rs485_rec
(0152) CLR(PORTB,AM);//清除中断标志
0197 98C3 CBI 0x18,3
(0153) }
0198 D3C4 RCALL pop_gset1
0199 D403 RCALL pop_lset
019A 9518 RETI
FILE: E:\公司用\atmega8l\final\new\nrf905_receive\nrf905.c
(0001) /*****************************
(0002) 功能:nrf905接收函数
(0003) 时间:2008年8月30日
(0004) 编写:陈锐
(0005) 版本:1.2
(0006) *****************************/
(0007)
(0008) #include "confg.h"
(0009) uchar Tx_Buf[SIZE];
(0010) uchar Rx_Buf[SIZE];
(0011)
(0012)
(0013) //extern void delay_us(uint us);
(0014) uchar nrf905_SpiRW(uchar val);
(0015) void nrf905_SpiTest(void);
(0016)
(0017) #define SIZE 32
(0018)
(0019)
(0020) unsigned long RX_ADDRESS=0xAAAAAAAA,TX_ADDRESS=0x11111101;
(0021)
(0022) /*-------------------------------------------------------------------------------------------
(0023) nrf905配置寄存器宏定义 author:HotPower
(0024) nrf905配置寄存器(10Byte)
(0025) 工作频率f=(422.4+CH_NO/10)*(1+HFREQ_PLL)MHz
(0026) -------------------------------------------------------------------------------------------*/
(0027)
(0028) //#define RX_ADDRESS 0xAAAAAAAA //接收有效地址(本方)
(0029) //#define TX_ADDRESS 0x111111f0 //发送有效地址(对方)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -