📄 main.s
字号:
; #define LED0_CLR() {PORTC&=~(1<<PC0);}
; #define LED1_SET() {PORTC|=1<<PC1;DDRC|=1<<PC1;}
; #define LED1_CLR() {PORTC&=~(1<<PC1);}
;
; #define KEY0 (PINB&(1<<PB0))
; #define KEY1 (PINB&(1<<PB1))
; #define KEY_INIT() {PORTB|=((1<<PB0)|(1<<PB1));DDRB&=~((1<<PB0)|(1<<PB1));}
;
; /*
; *************************************************************
; * nRF2401 Configuration *
; * 保存2401 的配置信息 *
; *************************************************************
; */
; /*=====<RF-Configuration-Register 配置信息>=====*/
; //芯片测试用,无需修改
; #define TEST_2 0x8E //MSB D143~D136
; #define TEST_1 0x08 // D135~D128
; #define TEST_0 0x1C // D127~D120
; /* 注意: DATAx_W + ADDRx_W + CRC 的值必须小于256 !
; 单个数据包的大小必须小于32 字节(256 位) */
; #define DATA2_W 0x10 //0x10=2 字节 //频道2 发送/接收数据长度(单位:Bit)
; #define DATA1_W 0xE0 //0x20=28 字节 //频道1 发送/接收数据长度(单位:Bit)
; /* 注意:2401 忽略ADDR 中超过ADDR_W 设定宽度的那些位,同时地址不能全部设置为0 */
; //频道2 接收地址 < - 频道2 未启用
; #define ADDR2_4 0x00
; #define ADDR2_3 0x1c
; #define ADDR2_2 0xcc
; #define ADDR2_1 0xcc
; #define ADDR2_0 0xcc
; //频道 1 接收地址 (当前模块地址) <- 只使用到频道 1
; #define ADDR1_4 0x00
; #define ADDR1_3 0xcc
; #define ADDR1_2 0xcc
; #define ADDR1_1 0xcc
; #define ADDR1_0 0xcc
; #define ADDR_W 0x10 //0x10=2 字节 //发送/接收地址宽度(单位:Bit)
; #define CRC_L 0x1 //CRC 模式 0:8 位 1:16 位
; #define CRC_EN 0x1 //CRC 校验 0:禁用 1:启用
; #define RX2_EN 0x0 //双频道功能 0:禁用 1:启用
; #define CM 0x1 //0:Direct mode 1:ShockBurst mode
; #define RFDR_SB 0x0 //传输速率0:250kbps/1:1Mbps(250kbps比1Mbps传输距离更远)
; #define XO_F 0x3 //16M //nRF2401 晶振频率(具体设置见下图)
; #define RF_PWR 0x3 //信号发射功率(具体设置见下图)
; #define RF_CH 0x2 //Channel RF 频率设置
; //Channel = 2400MHz + RF_CH * 1.0MHz
; #define RXEN_NRF 0x0 //0:Tx 1:Rx
; //程序会通过 SetTxMode/SetRxMode 重新设置此项参数
; //<将设置信息组合成每个字节的数据信息,此区域无需修改>
; #define RFConfig_Bit0 TEST_2
; #define RFConfig_Bit1 TEST_1
; #define RFConfig_Bit2 TEST_0
; #define RFConfig_Bit3 DATA2_W
; #define RFConfig_Bit4 DATA1_W
; #define RFConfig_Bit5 ADDR2_4
; #define RFConfig_Bit6 ADDR2_3
; #define RFConfig_Bit7 ADDR2_2
; #define RFConfig_Bit8 ADDR2_1
; #define RFConfig_Bit9 ADDR2_0
; #define RFConfig_Bit10 ADDR1_4
; #define RFConfig_Bit11 ADDR1_3
; #define RFConfig_Bit12 ADDR1_2
; #define RFConfig_Bit13 ADDR1_1
; #define RFConfig_Bit14 ADDR1_0
; #define RFConfig_Bit15 (ADDR_W<<2 | CRC_L<<1 | CRC_EN)
; #define RFConfig_Bit16 (RX2_EN<<7 | CM<<6 | RFDR_SB<<5 | XO_F <<2 | RF_PWR)
; #define RFConfig_Bit17 (RF_CH<<1 | RXEN_NRF)
;
; //------------------------------------------------------
; //通过宏定义将 18 字节的寄存器参数按照各个功能分解,以便于参数的调整
; unsigned char /*code*/ nRF2401_Conf[18] =
; {
; RFConfig_Bit0, RFConfig_Bit1, RFConfig_Bit2, RFConfig_Bit3, RFConfig_Bit4,
; RFConfig_Bit5, RFConfig_Bit6, RFConfig_Bit7, RFConfig_Bit8, RFConfig_Bit9,
; RFConfig_Bit10, RFConfig_Bit11, RFConfig_Bit12, RFConfig_Bit13,
; RFConfig_Bit14, RFConfig_Bit15, RFConfig_Bit16, RFConfig_Bit17
; };
; //------------------------------------------------------------
;
; /*
; *************************************************************
; * nRF2401 Tx/Rx functions
; *
; *
; * void Delay100(void);
; * void Config2401(void); //配置2401,写入初始化设置
; * void SetTxMode(void); //设置为发送模式
; * void SetRxMode(void); //设置为接收模式
; * void nRF2401_TxPacket(unsigned char TxBuf[]);
; * //发送TxBuf[] 内的数据 长度由 DATA1_W 决定
; * unsigned char nRF2401_RxPacket(unsigned char *RxBuf);
; * //检查是否有数据需要接受 如果有,则保存至RxBuf[]
; * //返回值 0:没有接收到数据 1:接收到数据
; *************************************************************
; */
; //16M 晶振 600us 左右
; /*void Delay100(void)
; {
; unsigned int i;
; for (i=0;i<100;i++);
; }*/
;
; /*==================================================
; nRF2401 设置配置寄存器时序
; =====================================================*/
; //bdata
; unsigned char DATA_BUF; //用于ByteRead和ByteWrite函数
; #define DATA7 ((DATA_BUF&BYTE_BIT7) != 0)
; #define DATA0 ((DATA_BUF&BYTE_BIT0) != 0)
;
;
; void delay_1us(void) //1us延时函数
; {
.dbline 382
; asm("nop");
nop
.dbline -2
L33:
.dbline 0 ; func end
ret
.dbend
.dbfunc e delay_nus _delay_nus fV
; i -> R20,R21
; n -> R22,R23
.even
_delay_nus::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 386
; }
;
; void delay_nus(unsigned int n) //N us延时函数
; {
.dbline 387
; unsigned int i=0;
clr R20
clr R21
.dbline 388
; for (i=0;i<n;i++)
xjmp L38
L35:
.dbline 389
xcall _delay_1us
L36:
.dbline 388
subi R20,255 ; offset = 1
sbci R21,255
L38:
.dbline 388
cp R20,R22
cpc R21,R23
brlo L35
.dbline -2
L34:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r n 22 i
.dbend
.dbfunc e delay_1ms _delay_1ms fV
; i -> R16,R17
.even
_delay_1ms::
.dbline -1
.dbline 393
; delay_1us();
; }
;
; void delay_1ms(void) //1ms延时函数
; {
.dbline 395
clr R16
clr R17
xjmp L43
L40:
.dbline 395
L41:
.dbline 395
subi R16,255 ; offset = 1
sbci R17,255
L43:
.dbline 395
; unsigned int i;
; for (i=0;i<1140;i++);
cpi R16,116
ldi R30,4
cpc R17,R30
brlo L40
.dbline -2
L39:
.dbline 0 ; func end
ret
.dbsym r i 16 i
.dbend
.dbfunc e delay_nms _delay_nms fV
; i -> R20,R21
; n -> R22,R23
.even
_delay_nms::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 399
; }
;
; void delay_nms(unsigned int n) //N ms延时函数
; {
.dbline 400
; unsigned int i=0;
clr R20
clr R21
.dbline 401
; for (i=0;i<n;i++)
xjmp L48
L45:
.dbline 402
xcall _delay_1ms
L46:
.dbline 401
subi R20,255 ; offset = 1
sbci R21,255
L48:
.dbline 401
cp R20,R22
cpc R21,R23
brlo L45
.dbline -2
L44:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r n 22 i
.dbend
.dbfunc e ByteRead _ByteRead fc
; i -> R16
.even
_ByteRead::
.dbline -1
.dbline 408
; delay_1ms();
; }
;
;
;
; unsigned char ByteRead(void)
; {
.dbline 410
; unsigned char i;
; for (i=0;i<8;i++)
clr R16
xjmp L53
L50:
.dbline 411
; {
.dbline 412
; DATA_BUF=DATA_BUF<<1;
lds R2,_DATA_BUF
lsl R2
sts _DATA_BUF,R2
.dbline 414
; //CLK1=1;
; CLK1_SET();
.dbline 414
sbi 0x15,3
.dbline 414
.dbline 414
.dbline 416
; //DATA=1; //设置为输入状态
; NRF_DDR&=~(1<<DATA);
cbi 0x14,5
.dbline 417
; DATA_SET();
.dbline 417
sbi 0x15,5
.dbline 417
.dbline 417
.dbline 419
; //if (DATA) //读取最高位,保存至最末尾,通过左移位完成整个字节
; if(DATA_STATE)
in R24,0x13
andi R24,32
cpi R24,32
brne L54
.dbline 420
; {
.dbline 421
; DATA_BUF|=BYTE_BIT0;
mov R24,R2
ori R24,1
sts _DATA_BUF,R24
.dbline 422
; }
xjmp L55
L54:
.dbline 424
; else
; {
.dbline 425
; DATA_BUF&=~BYTE_BIT0;
lds R24,_DATA_BUF
andi R24,254
sts _DATA_BUF,R24
.dbline 426
; }
L55:
.dbline 428
.dbline 428
cbi 0x15,3
.dbline 428
.dbline 428
.dbline 429
L51:
.dbline 410
inc R16
L53:
.dbline 410
cpi R16,8
brlo L50
.dbline 430
; //CLK1=0;
; CLK1_CLR();
; }
; return DATA_BUF;
lds R16,_DATA_BUF
.dbline -2
L49:
.dbline 0 ; func end
ret
.dbsym r i 16 c
.dbend
.dbfunc e ByteWrite _ByteWrite fV
; i -> R20
; send -> R16
.even
_ByteWrite::
xcall push_gset1
.dbline -1
.dbline 434
; }
;
; void ByteWrite(unsigned char send)
; {
.dbline 436
; unsigned char i;
; DATA_BUF=send;
sts _DATA_BUF,R16
.dbline 437
; NRF_DDR|=((1<<DATA)|(1<<CLK1));
in R24,0x14
ori R24,40
out 0x14,R24
.dbline 438
; for (i=0;i<8;i++)
clr R20
xjmp L60
L57:
.dbline 439
; {
.dbline 440
; if (DATA7) //总是发送最高位
lds R2,_DATA_BUF
sbrs R2,7
rjmp L61
.dbline 441
; {
.dbline 443
; //DATA=1;
; DATA_SET();
.dbline 443
sbi 0x15,5
.dbline 443
.dbline 443
.dbline 444
; }
xjmp L62
L61:
.dbline 446
; else
; {
.dbline 448
; //DATA=0;
; DATA_CLR();
.dbline 448
cbi 0x15,5
.dbline 448
.dbline 448
.dbline 449
; }
L62:
.dbline 451
.dbline 451
sbi 0x15,3
.dbline 451
.dbline 451
.dbline 452
lds R2,_DATA_BUF
lsl R2
sts _DATA_BUF,R2
.dbline 454
.dbline 454
cbi 0x15,3
.dbline 454
.dbline 454
.dbline 455
L58:
.dbline 438
inc R20
L60:
.dbline 438
cpi R20,8
brlo L57
.dbline -2
L56:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r send 16 c
.dbend
.dbfunc e Config2401 _Config2401 fV
; variablel -> R20
; i -> R22,R23
.even
_Config2401::
xcall push_gset2
.dbline -1
.dbline 470
; //CLK1=1;
; CLK1_SET();
; DATA_BUF=DATA_BUF<<1;
; //CLK1=0;
; CLK1_CLR();
; }
; }
;
; /* <2401 配置寄存器的写入方式>
; NOTE.
; On the falling edge of CS, the nRF2401A updates the number of bits actually shifted
; in during the last configuration.
; Ex:
; If the nRF2401A is to be configured for 2 channel RX in ShockBurst., a total of 120
; bits must be shifted in during the first configuration after VDD is applied.
; Once the wanted protocol, modus and RF channel are set, only one bit (RXEN) is
; shifted in to switch between RX and TX.
; 注意 :2401 配置寄存器的数据写入通过一移位寄存器完成
; */
; void Config2401(void)
; {
.dbline 476
; unsigned int i;
; unsigned char variablel;
; //CS=0;
; //CE=0;
; //PWR_UP=1; //上电
; NRF_DDR|=((1<<CS)|(1<<CE)|(1<<PWR_UP));
in R24,0x14
ori R24,19
out 0x14,R24
.dbline 477
; CS_CLR();
.dbline 477
cbi 0x15,4
.dbline 477
.dbline 477
.dbline 478
; CE_CLR();
.dbline 478
cbi 0x15,1
.dbline 478
.dbline 478
.dbline 479
; PWR_UP_CLR();
.dbline 479
cbi 0x15,0
.dbline 479
.dbline 479
.dbline 481
; //for (i=0;i<10;i++) Delay100();//从上电到进入配置模式需要3ms 的延时
; delay_nms(6);
ldi R16,6
ldi R17,0
xcall _delay_nms
.dbline 483
; //CS=1; //使RF2401 进入配置方式
; CS_SET();
.dbline 483
sbi 0x15,4
.dbline 483
.dbline 483
.dbline 484
; for (i=0;i<18;i++)
clr R22
clr R23
xjmp L67
L64:
.dbline 485
.dbline 486
ldi R24,<_nRF2401_Conf
ldi R25,>_nRF2401_Conf
movw R30,R22
add R30,R24
adc R31,R25
ldd R20,z+0
.dbline 487
mov R16,R20
xcall _ByteWrite
.dbline 488
L65:
.dbline 484
subi R22,255 ; offset = 1
sbci R23,255
L67:
.dbline 484
cpi R22,18
ldi R30,0
cpc R23,R30
brlo L64
.dbline 490
; {
; variablel=nRF2401_Conf[i];
; ByteWrite(variablel);
; }
; //Delay100();
; delay_nus(600);
ldi R16,600
ldi R17,2
xcall _delay_nus
.dbline 492
; //CS=0; //CS 置低使配置有效
; CS_CLR();
.dbline 492
cbi 0x15,4
.dbline 492
.dbline 492
.dbline 494
; //Delay100();
; delay_nus(600);
ldi R16,600
ldi R17,2
xcall _delay_nus
.dbline -2
L63:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r variablel 20 c
.dbsym r i 22 i
.dbend
.dbfunc e SetTxMode _SetTxMode fV
.even
_SetTxMode::
.dbline -1
.dbline 498
; }
;
; void SetTxMode(void)
; {
.dbline 499
; NRF_DDR|=((1<<CS)|(1<<CE)|(1<<PWR_UP)|(1<<DATA)|(1<<CLK1));
in R24,0x14
ori R24,59
out 0x14,R24
.dbline 504
; //设置为配置模式
; //PWR_UP=1;
; //CE=0;
; //CS=1;
; PWR_UP_SET();
.dbline 504
sbi 0x15,0
.dbline 504
.dbline 504
.dbline 505
; CE_CLR();
.dbline 505
cbi 0x15,1
.dbline 505
.dbline 505
.dbline 506
; CS_SET();
.dbline 506
sbi 0x15,4
.dbline 506
.dbline 506
.dbline 508
; //Delay100();
; delay_nus(600);
ldi R16,600
ldi R17,2
xcall _delay_nus
.dbline 513
; //配置寄存器0 字节RXEN 设置为0:发送模式
; //DATA =0;
; //CLK1=1;
; //CLK1=0;
; DATA_CLR();
.dbline 513
cbi 0x15,5
.dbline 513
.dbline 513
.dbline 514
; CLK1_SET();
.dbline 514
sbi 0x15,3
.dbline 514
.dbline 514
.dbline 515
; CLK1_CLR();
.dbline 515
cbi 0x15,3
.dbline 515
.dbline 515
.dbline 519
; //设置为Activemodes(Tx)
; //CS=0;
; //CE=1;
; CS_CLR();
.dbline 519
cbi 0x15,4
.dbline 519
.dbline 519
.dbline 520
; CE_SET();
.dbline 520
sbi 0x15,1
.dbline 520
.dbline 520
.dbline 522
; //Delay100();
; delay_nus(600);
ldi R16,600
ldi R17,2
xcall _delay_nus
.dbline -2
L68:
.dbline 0 ; func end
ret
.dbend
.dbfunc e SetRxMode _SetRxMode fV
.even
_SetRxMode::
.dbline -1
.dbline 526
; }
;
; void SetRxMode(void)
; {
.dbline 527
; NRF_DDR|=((1<<CS)|(1<<CE)|(1<<PWR_UP)|(1<<DATA)|(1<<CLK1));
in R24,0x14
ori R24,59
out 0x14,R24
.dbline 532
; //设置为配置模式
; //PWR_UP = 1;
; //CE=0;
; //CS=1;
; PWR_UP_SET();
.dbline 532
sbi 0x15,0
.dbline 532
.dbline 532
.dbline 533
; CE_CLR();
.dbline 533
cbi 0x15,1
.dbline 533
.dbline 533
.dbline 534
; CS_SET();
.dbline 534
sbi 0x15,4
.dbline 534
.dbline 534
.dbline 536
; //Delay100();
; delay_nus(600);
ldi R16,600
ldi R17,2
xcall _delay_nus
.dbline 541
; //配置寄存器0 字节RXEN 设置为 1:接收模式
; //DATA =1;
; //CLK1=1;
; //CLK1=0;
; DATA_SET();
.dbline 541
sbi 0x15,5
.dbline 541
.dbline 541
.dbline 542
; CLK1_SET();
.dbline 542
sbi 0x15,3
.dbline 542
.dbline 542
.dbline 543
; CLK1_CLR();
.dbline 543
cbi 0x15,3
.dbline 543
.dbline 543
.dbline 547
; //设置为Activemodes(Rx)
; //CS=0;
; //CE=1;
; CS_CLR();
.dbline 547
cbi 0x15,4
.dbline 547
.dbline 547
.dbline 548
; CE_SET()
.dbline 548
sbi 0x15,1
.dbline 548
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -