⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rx.lst

📁 atmega128单片机上实现的nrf905无线收发程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
(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 + -