📄 rx.lst
字号:
(0006) *摘 要:外部中断的初始化实现
(0007) *
(0008) *当前版本:1.1
(0009) *作 者:王微
(0010) *完成日期:2008.5.
(0011) ****************************************/
(0012) #include<iom128v.h>
(0013) #include<macros.h>
(0014) #include"INT.h"
(0015)
(0016)
(0017) void init_INT()
(0018) {
(0019) EIMSK=0; //屏蔽所有外部中断
_init_INT:
00CF 2422 CLR R2
00D0 BE29 OUT 0x39,R2
(0020) EICRB|=(BIT(ISC51)|BIT(ISC50)); //修改外部中断5(DR)的触发方式为上升沿触发
00D1 B78A IN R24,0x3A
00D2 608C ORI R24,0xC
00D3 BF8A OUT 0x3A,R24
(0021) EIFR=0XFF; //清除外部中断的标志位
00D4 EF8F LDI R24,0xFF
00D5 BF88 OUT 0x38,R24
(0022) // EIMSK|=BIT(5); //不屏蔽外部中断5
(0023) _SEI(); //全局中断使能,相当于语句SREG|=(1<7)
00D6 9478 BSET 7
00D7 9508 RET
_Int_DR:
00D8 D134 RCALL push_lset
00D9 0000 NOP
FILE: E:\心电监护系统\测试程序\第一阶段\无线测试\接收端\main.c
(0001) /***************************************
(0002) *2008,浙江工业大学信息与控制研究所
(0003) *All rights reserved
(0004) *
(0005) *文件名称:main.c
(0006) *摘 要:接收节点测试主程序,用来测试丢包,传输时间和载波侦听
(0007) *
(0008) *当前版本:1.1
(0009) *作 者:王微
(0010) *完成日期:2008.7.9
(0011) ****************************************/
(0012)
(0013)
(0014) #include<iom128v.h>
(0015) #include<macros.h>
(0016)
(0017)
(0018) #include"nrf.h"
(0019) #include"spi.h"
(0020) #include"common.h"
(0021) #include"INT.h"
(0022)
(0023) //LED显示驱动
(0024) #define LED_YELLOW PORTA|=(1<<PORTA0);PORTA&=~(1<<PORTA1);
(0025) #define LED_RED PORTA&=~(1<<PORTA0);PORTA|=(1<<PORTA1);
(0026)
(0027) unsigned char R_flag=0; //接收到其他节点的数据包的标志
(0028)
(0029) unsigned char send_addr[4]={0x56,0x31,0x56,0x31}; //4字节的发送地址
(0030) unsigned char receive_addr[4]={0x13,0x65,0x13,0x65}; //4字节的接收地址a513d36a
(0031) unsigned char broad_addr[4]={0xff,0xff,0xff,0xff}; //4字节的广播地址
(0032) unsigned char receive_data[PACKAGE_LENGTH]; //PACKAGE_LENGTH字节的接收数据缓存区
(0033) unsigned char transmit_data[PACKAGE_LENGTH]; //PACKAGE_LENGTH字节的发送数据缓存区
(0034)
(0035) unsigned char flag=0;
(0036) unsigned int pack_num=0; //接收到数据包的个数
(0037) #pragma interrupt_handler Int_DR: 7
(0038) void Int_DR(void) //外部中断INT5,中断向量号为7,接收数无线据
(0039) {
(0040) RxPacket(receive_data);
00DA E205 LDI R16,0x25
00DB E011 LDI R17,1
00DC D0F2 RCALL _RxPacket
00DD 0000 NOP
(0041) //////////////////////还应改变一下缓冲区的指针(接收多个包时)
(0042) R_flag=1; //接收到其他节点的数据包的标志
00DE E081 LDI R24,1
00DF 93800100 STS R_flag,R24
00E1 D142 RCALL pop_lset
00E2 0000 NOP
00E3 9518 RETI
(0043)
(0044) }
(0045)
(0046)
(0047)
(0048) void main(void)
(0049) {
(0050) int i;
(0051)
(0052) init_spi();
_main:
i --> Y+1
00E4 DF8A RCALL _init_spi
00E5 0000 NOP
(0053) init_905();
00E6 D057 RCALL _init_905
00E7 0000 NOP
(0054) init_INT(); //初始化外部中断
00E8 DFE6 RCALL _init_INT
00E9 0000 NOP
(0055)
(0056) set_confword(receive_addr);//以后在初始条件下,接收地址应该为广播地址
00EA E005 LDI R16,5
00EB E011 LDI R17,1
00EC D05F RCALL _set_confword
00ED 0000 NOP
(0057) send_conf(); //设置905的配置字
00EE D07E RCALL _send_conf
00EF 0000 NOP
(0058)
(0059) EIFR|=0XFF; //清除外部中断的标志位
00F0 B788 IN R24,0x38
00F1 6F8F ORI R24,0xFF
00F2 BF88 OUT 0x38,R24
(0060) set_Rmode(); //nRF设置成接收模式 必须有下一句的开启外部中断5和上一句的清除外部中断的标志位
00F3 D097 RCALL _set_Rmode
00F4 0000 NOP
(0061) EIMSK|=BIT(5); //开启外部中断5,以监测是无线模块是否收到数据
00F5 B789 IN R24,0x39
00F6 6280 ORI R24,0x20
00F7 BF89 OUT 0x39,R24
(0062)
(0063) LED_YELLOW;
00F8 9AD8 SBI 0x1B,0
00F9 98D9 CBI 0x1B,1
00FA C041 RJMP 0x013C
(0064) while(1)
(0065) {
(0066) if(R_flag==1)
00FB 91800100 LDS R24,R_flag
00FD 3081 CPI R24,1
00FE F5E9 BNE 0x013C
(0067) {
(0068) R_flag=0;
00FF 2422 CLR R2
0100 92200100 STS R_flag,R2
(0069) pack_num++;
0102 9180010E LDS R24,pack_num
0104 9190010F LDS R25,pack_num+1
0106 9601 ADIW R24,1
0107 9390010F STS pack_num+1,R25
0109 9380010E STS pack_num,R24
(0070) if(0xffff==pack_num)
010B 3F8F CPI R24,0xFF
010C EFEF LDI R30,0xFF
010D 079E CPC R25,R30
010E F429 BNE 0x0114
(0071) {
(0072) pack_num=0;
010F 2433 CLR R3
0110 9230010F STS pack_num+1,R3
0112 9220010E STS pack_num,R2
(0073) }
(0074) /* */
(0075) if(flag==0)
0114 9020010D LDS R2,flag
0116 2022 TST R2
0117 F431 BNE 0x011E
(0076) {
(0077) LED_RED;
0118 98D8 CBI 0x1B,0
0119 9AD9 SBI 0x1B,1
(0078) flag=1;
011A E081 LDI R24,1
011B 9380010D STS flag,R24
(0079) }
011D C009 RJMP 0x0127
(0080) else if(flag==1)
011E 9180010D LDS R24,flag
0120 3081 CPI R24,1
0121 F429 BNE 0x0127
(0081) {
(0082) LED_YELLOW;
0122 9AD8 SBI 0x1B,0
0123 98D9 CBI 0x1B,1
(0083) flag=0;
0124 2422 CLR R2
0125 9220010D STS flag,R2
(0084) }
(0085) /**/
(0086)
(0087) set_Tmode();
0127 D05D RCALL _set_Tmode
0128 0000 NOP
(0088) EIMSK&=~BIT(5); //屏蔽外部中断5
0129 B789 IN R24,0x39
012A 7D8F ANDI R24,0xDF
012B BF89 OUT 0x39,R24
(0089) set_Taddr(send_addr);
012C E001 LDI R16,1
012D E011 LDI R17,1
012E D06B RCALL _set_Taddr
012F 0000 NOP
(0090) //Delay650us(); //写地址和写数据之间要延时
(0091) TxPacket(receive_data); //转发接收到的数据
0130 E205 LDI R16,0x25
0131 E011 LDI R17,1
0132 D081 RCALL _TxPacket
0133 0000 NOP
(0092)
(0093) EIFR|=0XFF; //清除外部中断的标志位
0134 B788 IN R24,0x38
0135 6F8F ORI R24,0xFF
0136 BF88 OUT 0x38,R24
(0094) set_Rmode();
0137 D053 RCALL _set_Rmode
0138 0000 NOP
(0095) EIMSK|=BIT(5); //开启外部中断5 */
0139 B789 IN R24,0x39
013A 6280 ORI R24,0x20
013B BF89 OUT 0x39,R24
013C CFBE RJMP 0x00FB
013D 9508 RET
FILE: E:\心电监护系统\测试程序\第一阶段\无线测试\接收端\nrf.c
(0001) /***************************************
(0002) *2008,浙江工业大学信息与控制研究所
(0003) *All rights reserved
(0004) *
(0005) *文件名称:nrf.c
(0006) *摘 要:NRF905相关的子程序实现
(0007) *
(0008) *当前版本:1.1
(0009) *作 者:王微
(0010) *完成日期:2008.4.28
(0011) ****************************************/
(0012) #include<macros.h>
(0013) #include<iom128v.h>
(0014)
(0015) #include"spi.h"
(0016) #include"common.h"
(0017) #include"nrf.h"
(0018)
(0019)
(0020) unsigned char data_conf[10];
(0021) //unsigned char send_addr[4]={0x13,0x65,0x13,0x65}; //4字节的发送地址
(0022) //unsigned char broad_addr[4]={0xff,0xff,0xff,0xff}; //4字节的广播地址
(0023) //unsigned char receive_addr[4]={0x65,0x13,0x65,0x13}; //4字节的接收地址a513d36a
(0024) //unsigned char receive_data[PACKAGE_LENGTH]; //PACKAGE_LENGTH字节的接收数据缓存区
(0025) //unsigned char transmit_data[PACKAGE_LENGTH]; //PACKAGE_LENGTH字节的发送数据缓存区
(0026)
(0027)
(0028)
(0029) /**************************************************
(0030) 函数功能:初始化nRF905,
(0031) 输入参数:无
(0032) 输出参数:无
(0033) **************************************************/
(0034) void init_905()
(0035) {
(0036) DDRE|=(1<<CSN)|(1<<PWR_UP)|(1<<TX_EN);//设置端口E的1,2,3引脚为输出引脚
_init_905:
013E B182 IN R24,0x02
013F 608E ORI R24,0xE
0140 B982 OUT 0x02,R24
(0037) DDRB|=(1<<MOSI)|(1<<SCK)|(1<<TRX_CE);//设置MOSI、SCK和SS 为输出,其他为输入
0141 B387 IN R24,0x17
0142 6087 ORI R24,7
0143 BB87 OUT 0x17,R24
(0038)
(0039) PORTE |=(1<<PWR_UP); //905上电
0144 9A1A SBI 0x03,2
(0040) PORTE |=(1<<CSN); //CSN引脚置位,停止SPI操作,
0145 9A19 SBI 0x03,1
(0041)
(0042) PORTB |=1<<SCK; // Spi clock line init high
0146 9AC1 SBI 0x18,1
(0043)
(0044) PORTE &=~(1<<TX_EN);
0147 981B CBI 0x03,3
(0045) PORTB &=~(1<<TRX_CE); // Set nRF905 in standby mode
0148 98C0 CBI 0x18,0
(0046)
(0047) Delay3ms();
0149 DF53 RCALL _Delay3ms
014A 0000 NOP
014B 9508 RET
(0048) }
(0049)
(0050) /**************************************************
(0051) 函数功能:设置配置字
(0052) 输入参数:905的接收地址
(0053) 输出参数:无
(0054) **************************************************/
(0055) void set_confword(unsigned char*r_addr)
(0056) {
(0057)
(0058) data_conf[0]=0x01; //
_set_confword:
r_addr --> R16
014C E081 LDI R24,1
014D 9380013A STS data_conf,R24
(0059) data_conf[1]=0x0c; //不重发数据,接收模式为正常模式,输出功率为10dB("11"),工作在433MHz
014F E08C LDI R24,0xC
0150 9380013B STS data_conf+1,R24
(0060) data_conf[2]=0x44; //4字节的接收地址和发送地址
0152 E484 LDI R24,0x44
0153 9380013C STS data_conf+2,R24
(0061)
(0062) data_conf[3]=PACKAGE_LENGTH; //RX有效数据长度
0155 E185 LDI R24,0x15
0156 9380013D STS data_conf+3,R24
(0063) data_conf[4]=PACKAGE_LENGTH; //TX有效数据长度
0158 9380013E STS 0x13E,R24
(0064)
(0065) data_conf[5]=r_addr[0]; //5~8为RX地址
015A 01F8 MOVW R30,R16
015B 8020 LDD R2,Z+0
015C 9220013F STS 0x13F,R2
(0066) data_conf[6]=r_addr[1];
015E 8021 LDD R2,Z+1
015F 92200140 STS 0x140,R2
(0067) data_conf[7]=r_addr[2];
0161 01F8 MOVW R30,R16
0162 8022 LDD R2,Z+2
0163 92200141 STS 0x141,R2
(0068) data_conf[8]=r_addr[3];
0165 01F8 MOVW R30,R16
0166 8023 LDD R2,Z+3
0167 92200142 STS 0x142,R2
(0069)
(0070) data_conf[9]=0xd8;
0169 ED88 LDI R24,0xD8
016A 93800143 STS 0x143,R24
016C 9508 RET
_send_conf:
i --> R20
016D D088 RCALL push_gset1
016E 0000 NOP
(0071)
(0072) }
(0073)
(0074) /************************************************************
(0075) 函数功能:发送配置字 ,通过SPI口把设定的配置寄存器的值写入到905
(0076) 输入参数:无
(0077) 输出参数:无
(0078) *************************************************************/
(0079) void send_conf()
(0080) {
(0081) unsigned char i;
(0082) PORTE &=~(1<<CSN); // Spi enable for write a spi command
016F 9819 CBI 0x03,1
(0083) SpiWrite(WC); // Write config command写放配置命令
0170 2700 CLR R16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -