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

📄 main.s

📁 基于MEAG16的电机PID控制程序
💻 S
📖 第 1 页 / 共 3 页
字号:
; #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 + -