📄 tx.lst
字号:
(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:
00D0 2422 CLR R2
00D1 BE29 OUT 0x39,R2
(0020) EICRB|=(BIT(ISC51)|BIT(ISC50)); //修改外部中断5(DR)的触发方式为上升沿触发
00D2 B78A IN R24,0x3A
00D3 608C ORI R24,0xC
00D4 BF8A OUT 0x3A,R24
(0021) EIFR=0XFF; //清除外部中断的标志位
00D5 EF8F LDI R24,0xFF
00D6 BF88 OUT 0x38,R24
(0022) // EIMSK|=BIT(5); //不屏蔽外部中断5
(0023) _SEI(); //全局中断使能,相当于语句SREG|=(1<7)
00D7 9478 BSET 7
00D8 9508 RET
_Int_DR:
00D9 D12A RCALL push_lset
00DA 0000 NOP
FILE: E:\心电监护系统\测试程序\第一阶段\无线测试\发送端\main.c
(0001) /*
(0002) *2008,浙江工业大学信息与控制研究所
(0003) *All rights reserved
(0004) *
(0005) *文件名称:ECG_NRF905.C
(0006) *摘 要:主函数,实现心电数据的采集,发送
(0007) *
(0008) *当前版本:1.0
(0009) *作 者:董齐芬
(0010) *完成日期:2008.5.17
(0011) *
(0012) *取代版本:
(0013) *原 作 者:
(0014) *完成日期:
(0015) */
(0016)
(0017) //#include "time.h"
(0018) //#include "mcp42010.h"
(0019) //#include "adc.h"
(0020) #include "nrf.h"
(0021) #include "common.h"
(0022) #include "spi.h"
(0023) #include "int.h"
(0024)
(0025) unsigned char receive_addr[4]={0x56,0x31,0x56,0x31}; //4字节的接收地址a513d36a
(0026) unsigned char send_addr[4]={0x13,0x65,0x13,0x65}; //4字节的发送地址
(0027) unsigned char ECG_data[ECG_LENGTH]; //存放心电数据1024个
(0028) unsigned char *w_ptr=ECG_data; //将采集到的数据存放到存储区的地址指针
(0029) unsigned char *r_ptr=ECG_data; //无线发送时数据存储区的地址指针
(0030) unsigned char nrf_data[PACKAGE_LENGTH]; //正要发送的无线数据包 0x5f+心电数据+序列号
(0031) unsigned char receive_data[PACKAGE_LENGTH]; //接收到的无线数据包 0x5f+心电数据+序列号
(0032) unsigned char second=0x80; //秒的次序,8秒一次循环
(0033) unsigned char led_flag=0;
(0034)
(0035) void mcu_init(void); //声明处理器初始化函数
(0036)
(0037) #pragma interrupt_handler Int_DR: 7
(0038) void Int_DR(void) //外部中断INT5,中断向量号为7,接收数无线据
(0039) {
(0040) LED_YELLOW;
00DB 9AD8 SBI 0x1B,0
00DC 98D9 CBI 0x1B,1
(0041) RxPacket(receive_data);
00DD E102 LDI R16,0x12
00DE E011 LDI R17,1
00DF D0E6 RCALL _RxPacket
00E0 0000 NOP
00E1 D139 RCALL pop_lset
00E2 0000 NOP
00E3 9518 RETI
(0042) //////////////////////还应改变一下缓冲区的指针(接收多个包时)
(0043)
(0044) }
(0045)
(0046) /*
(0047) *函数功能:主函数
(0048) *输入参数:无
(0049) *输出参数:无
(0050) *返 回 值:无
(0051) */
(0052) void main(void)
(0053) {
(0054) unsigned char i,j,s;
(0055) s=0;
_main:
j --> Y+1
s --> R20
i --> R22
00E4 2744 CLR R20
(0056)
(0057) CLI(); //disable all interrupts
00E5 94F8 BCLR 7
(0058) mcu_init(); //处理器各模块初始化
00E6 D03D RCALL _mcu_init
(0059)
(0060) for (i=0;i<PACKAGE_LENGTH-1;i++)
00E7 2766 CLR R22
00E8 C008 RJMP 0x00F1
(0061) {
(0062) nrf_data[i]=i; //测试数据,每个数据包的前PACKAGE_LENGTH-1个数据都一致,最后一个字节为数据包的序列号
00E9 E287 LDI R24,0x27
00EA E091 LDI R25,1
00EB 2FE6 MOV R30,R22
00EC 27FF CLR R31
00ED 0FE8 ADD R30,R24
00EE 1FF9 ADC R31,R25
00EF 8360 STD Z+0,R22
00F0 9563 INC R22
00F1 3164 CPI R22,0x14
00F2 F3B0 BCS 0x00E9
00F3 C02E RJMP 0x0122
(0063) }
(0064)
(0065) while (1)
(0066) {
(0067)
(0068) nrf_data[PACKAGE_LENGTH-1]=s; //代表数据包的序列号
00F4 9340013B STS 0x13B,R20
(0069) set_Tmode(); //把905设置成发送模式
00F6 D085 RCALL _set_Tmode
00F7 0000 NOP
(0070) EIMSK&=~BIT(5); //发送时将屏蔽外部中断5
00F8 B789 IN R24,0x39
00F9 7D8F ANDI R24,0xDF
00FA BF89 OUT 0x39,R24
(0071) LED_RED;
00FB 98D8 CBI 0x1B,0
00FC 9AD9 SBI 0x1B,1
(0072) set_Taddr(send_addr);
00FD E004 LDI R16,4
00FE E011 LDI R17,1
00FF D091 RCALL _set_Taddr
0100 0000 NOP
(0073) TxPacket(nrf_data);
0101 E207 LDI R16,0x27
0102 E011 LDI R17,1
0103 D0A7 RCALL _TxPacket
0104 0000 NOP
(0074)
(0075) if (led_flag)
0105 9020010D LDS R2,led_flag
0107 2022 TST R2
0108 F031 BEQ 0x010F
(0076) {
(0077) LED_RED;
0109 98D8 CBI 0x1B,0
010A 9AD9 SBI 0x1B,1
(0078) led_flag=0;
010B 2422 CLR R2
010C 9220010D STS led_flag,R2
(0079) }
010E C005 RJMP 0x0114
(0080) else
(0081) {
(0082) LED_YELLOW;
010F 9AD8 SBI 0x1B,0
0110 98D9 CBI 0x1B,1
(0083) led_flag=1;
0111 E081 LDI R24,1
0112 9380010D STS led_flag,R24
(0084) }
(0085)
(0086) EIFR|=0XFF; //清除外部中断的标志位
0114 B788 IN R24,0x38
0115 6F8F ORI R24,0xFF
0116 BF88 OUT 0x38,R24
(0087) set_Rmode(); //nRF设置成接收模式 必须有下一句的开启外部中断5和上一句的清除外部中断的标志位
0117 D06A RCALL _set_Rmode
0118 0000 NOP
(0088) EIMSK|=BIT(5); //开启外部中断5,以监测是无线模块是否收到数据
0119 B789 IN R24,0x39
011A 6280 ORI R24,0x20
011B BF89 OUT 0x39,R24
(0089)
(0090) Delays(); //延时一段时间继续发送
011C DF8B RCALL _Delays
011D 0000 NOP
(0091) s++;
011E 9543 INC R20
(0092) if (s==250)
011F 3F4A CPI R20,0xFA
0120 F409 BNE 0x0122
(0093) {
(0094) s=0;
0121 2744 CLR R20
0122 CFD1 RJMP 0x00F4
0123 9508 RET
(0095) }
(0096) }
(0097) }
(0098)
(0099)
(0100) /*
(0101) *函数功能:处理器初始化函数,将要用到的各个模块的初始化函数放在一起
(0102) *输入参数:无
(0103) *输出参数:无
(0104) *返 回 值:无
(0105) */
(0106) void mcu_init(void)
(0107) {
(0108) initled(); //led灯初始化
_mcu_init:
0124 DFA2 RCALL _initled
0125 0000 NOP
(0109) initbuzzer(); //蜂鸣器初始化
0126 DFA6 RCALL _initbuzzer
0127 0000 NOP
(0110) init_spi();
0128 DF47 RCALL _init_spi
0129 0000 NOP
(0111) init_905(); //nrf905上电初始化
012A D00A RCALL _init_905
012B 0000 NOP
(0112) set_confword(receive_addr);//设置905配置寄存器
012C E000 LDI R16,0
012D E011 LDI R17,1
012E D014 RCALL _set_confword
012F 0000 NOP
(0113) send_conf(); //配置寄存器内容
0130 D033 RCALL _send_conf
0131 0000 NOP
(0114) init_INT(); //DR引脚中断初始化
0132 DF9D RCALL _init_INT
0133 0000 NOP
0134 9508 RET
FILE: E:\心电监护系统\测试程序\第一阶段\无线测试\发送端\nrf.c
(0001)
(0002) #include "spi.h"
(0003) #include "common.h"
(0004) #include "nrf.h"
(0005)
(0006) unsigned char broad_addr[4]={0xff,0xff,0xff,0xff}; //4字节的广播地址
(0007) unsigned char data_conf[10];
(0008) /**************************************************
(0009) 函数功能:初始化nRF905,
(0010) 输入参数:无
(0011) 输出参数:无
(0012) **************************************************/
(0013) void init_905(void)
(0014) {
(0015) DDRE|=(1<<CSN)|(1<<PWR_UP)|(1<<TX_EN);//设置端口E的1,2,3引脚为输出引脚
_init_905:
0135 B182 IN R24,0x02
0136 608E ORI R24,0xE
0137 B982 OUT 0x02,R24
(0016) DDRB|=(1<<MOSI)|(1<<SCK)|(1<<TRX_CE);//设置MOSI、SCK和SS 为输出,其他为输入
0138 B387 IN R24,0x17
0139 6087 ORI R24,7
013A BB87 OUT 0x17,R24
(0017)
(0018) PORTE |=(1<<PWR_UP); //905上电
013B 9A1A SBI 0x03,2
(0019) PORTE |=(1<<CSN); //CSN引脚置位,停止SPI操作,
013C 9A19 SBI 0x03,1
(0020)
(0021) PORTB |=1<<SCK; // Spi clock line init high
013D 9AC1 SBI 0x18,1
(0022)
(0023) PORTE &=~(1<<TX_EN);
013E 981B CBI 0x03,3
(0024) PORTB &=~(1<<TRX_CE); // Set nRF905 in standby mode
013F 98C0 CBI 0x18,0
(0025)
(0026) Delay3ms();
0140 DF5D RCALL _Delay3ms
0141 0000 NOP
0142 9508 RET
(0027) }
(0028)
(0029) /**************************************************
(0030) 函数功能:设置配置字
(0031) 输入参数:905的接收地址
(0032) 输出参数:无
(0033) **************************************************/
(0034) void set_confword(unsigned char*r_addr)
(0035) {
(0036)
(0037) data_conf[0]=0x01; //
_set_confword:
r_addr --> R16
0143 E081 LDI R24,1
0144 9380053C STS data_conf,R24
(0038) data_conf[1]=0x0c; //不重发数据,接收模式为正常模式,输出功率为10dB("11"),工作在433MHz
0146 E08C LDI R24,0xC
0147 9380053D STS data_conf+1,R24
(0039) data_conf[2]=0x44; //4字节的接收地址和发送地址
0149 E484 LDI R24,0x44
014A 9380053E STS data_conf+2,R24
(0040)
(0041) data_conf[3]=PACKAGE_LENGTH; //RX有效数据长度
014C E185 LDI R24,0x15
014D 9380053F STS data_conf+3,R24
(0042) data_conf[4]=PACKAGE_LENGTH; //TX有效数据长度
014F 93800540 STS 0x540,R24
(0043)
(0044) data_conf[5]=r_addr[0]; //5~8为RX地址
0151 01F8 MOVW R30,R16
0152 8020 LDD R2,Z+0
0153 92200541 STS 0x541,R2
(0045) data_conf[6]=r_addr[1];
0155 8021 LDD R2,Z+1
0156 92200542 STS 0x542,R2
(0046) data_conf[7]=r_addr[2];
0158 01F8 MOVW R30,R16
0159 8022 LDD R2,Z+2
015A 92200543 STS 0x543,R2
(0047) data_conf[8]=r_addr[3];
015C 01F8 MOVW R30,R16
015D 8023 LDD R2,Z+3
015E 92200544 STS 0x544,R2
(0048)
(0049) data_conf[9]=0xd8;
0160 ED88 LDI R24,0xD8
0161 93800545 STS 0x545,R24
0163 9508 RET
_send_conf:
i --> R20
0164 D088 RCALL push_gset1
0165 0000 NOP
(0050)
(0051) }
(0052)
(0053) /************************************************************
(0054) 函数功能:发送配置字 ,通过SPI口把设定的配置寄存器的值写入到905
(0055) 输入参数:无
(0056) 输出参数:无
(0057) *************************************************************/
(0058) void send_conf(void)
(0059) {
(0060) unsigned char i;
(0061)
(0062) PORTE &=~(1<<CSN); // Spi enable for write a spi command
0166 9819 CBI 0x03,1
(0063) SpiWrite(WC); // Write config command写放配置命令
0167 2700 CLR R16
0168 DF14 RCALL _SpiWrite
0169 0000 NOP
(0064)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -