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

📄 smart.lst

📁 基于MEAG16的电机PID控制程序
💻 LST
📖 第 1 页 / 共 4 页
字号:
(0202)      unsigned int addata;
(0203) 	 ADCSRA|=BIT(ADSC);
    0125 9A36      SBI	0x06,6
(0204) 	 while(!(ADCSRA&(BIT(ADIF))));
    0126 9B34      SBIS	0x06,4
    0127 CFFE      RJMP	0x0126
(0205)      addata=ADCL;
    0128 B144      IN	R20,0x04
    0129 2755      CLR	R21
(0206) 	 addata=addata+ADCH*256;
    012A B125      IN	R18,0x05
    012B 2733      CLR	R19
    012C E000      LDI	R16,0
    012D E011      LDI	R17,1
    012E 940E03DE  CALL	empy16s
    0130 0F40      ADD	R20,R16
    0131 1F51      ADC	R21,R17
(0207) 	 return addata;
    0132 018A      MOVW	R16,R20
    0133 940E03FF  CALL	pop_gset1
    0135 9508      RET
(0208) }  
(0209) 
(0210) 
(0211) 
(0212) ///////////////////////////////////////////////////////////////////////////////////////////////////////
(0213) 
(0214) #define BYTE_BIT0     0x01
(0215) #define BYTE_BIT1     0x02
(0216) #define BYTE_BIT2     0x04
(0217) #define BYTE_BIT3     0x08
(0218) #define BYTE_BIT4     0x10
(0219) #define BYTE_BIT5     0x20
(0220) #define BYTE_BIT6     0x40
(0221) #define BYTE_BIT7     0x80
(0222) //<nRF2401_Pins 对应引脚>
(0223) /*sbit PWR_UP = P1^6;
(0224) sbit CE     = P1^2;
(0225) //sbit DR2    = P3^5;  //暂时没有用到
(0226) //sbit CLK2   = P3^4;
(0227) //sbit OUT2   = P3^3;
(0228) sbit CS    = P1^1;
(0229) sbit DR1   = P1^0;
(0230) sbit CLK1  = P3^7;
(0231) sbit DATA  = P3^3;
(0232) sbit LED0  = P3^4;
(0233) sbit LED1  = P3^5;
(0234) sbit KEY0  = P3^0;
(0235) sbit KEY1  = P3^1;
(0236) */
(0237) #define NRF_PORT 	PORTC
(0238) #define NRF_DDR		DDRC
(0239) #define NRF_PIN		PINC
(0240) 
(0241) #define PWR_UP 		PC0
(0242) #define CE 			PC1
(0243) #define CS			PC4
(0244) #define DR1			PC2
(0245) #define CLK1		PC3
(0246) #define DATA		PC5
(0247) 
(0248) #define PWR_UP_STATE		(NRF_PIN&(1<<PWR_UP))==(1<<PWR_UP)
(0249) #define CE_STATE			(NRF_PIN&(1<<CE))==(1<<CE)
(0250) #define CS_STATE			(NRF_PIN&(1<<CS))==(1<<CS)
(0251) #define DR1_STATE			(NRF_PIN&(1<<DR1))==(1<<DR1)
(0252) #define CLK1_STATE			(NRF_PIN&(1<<CLK1))==(1<<CLK1)
(0253) #define DATA_STATE			(NRF_PIN&(1<<DATA))==(1<<DATA)
(0254) 
(0255) #define PWR_UP_SET()		{NRF_PORT|=1<<PWR_UP;}
(0256) #define PWR_UP_CLR()		{NRF_PORT&=~(1<<PWR_UP);}
(0257) #define CE_SET()			{NRF_PORT|=1<<CE;}
(0258) #define CE_CLR()			{NRF_PORT&=~(1<<CE);}
(0259) #define CS_SET()			{NRF_PORT|=1<<CS;}
(0260) #define CS_CLR()			{NRF_PORT&=~(1<<CS);}
(0261) #define DR1_SET()			{NRF_PORT|=1<<DR1;}
(0262) #define DR1_CLR()			{NRF_PORT&=~(1<<DR1);}
(0263) #define CLK1_SET()			{NRF_PORT|=1<<CLK1;}
(0264) #define CLK1_CLR()			{NRF_PORT&=~(1<<CLK1);}
(0265) #define DATA_SET()			{NRF_PORT|=1<<DATA;}
(0266) #define DATA_CLR()			{NRF_PORT&=~(1<<DATA);}
(0267) /*
(0268) #define LED0_SET()			{PORTC|=1<<PC0;DDRC|=1<<PC0;}
(0269) #define LED0_CLR()			{PORTC&=~(1<<PC0);}
(0270) #define LED1_SET()			{PORTC|=1<<PC1;DDRC|=1<<PC1;}
(0271) #define LED1_CLR()			{PORTC&=~(1<<PC1);}
(0272) 
(0273) #define KEY0			(PINB&(1<<PB0))
(0274) #define KEY1			(PINB&(1<<PB1))
(0275) #define KEY_INIT()		{PORTB|=((1<<PB0)|(1<<PB1));DDRB&=~((1<<PB0)|(1<<PB1));}
(0276) 
(0277) /*
(0278) *************************************************************
(0279) *     nRF2401 Configuration                                 *
(0280) *    保存2401 的配置信息                                    *
(0281) *************************************************************
(0282) */
(0283) /*=====<RF-Configuration-Register   配置信息>=====*/
(0284) //芯片测试用,无需修改
(0285) #define TEST_2         0x8E               //MSB     D143~D136 
(0286) #define TEST_1         0x08               //        D135~D128 
(0287) #define TEST_0         0x1C               //       D127~D120 
(0288) /* 注意: DATAx_W + ADDRx_W + CRC 的值必须小于256 !
(0289) 单个数据包的大小必须小于32 字节(256 位) */
(0290) #define DATA2_W        0x10      //0x10=2 字节        //频道2   发送/接收数据长度(单位:Bit) 
(0291) #define DATA1_W        0xE0      //0x20=28 字节       //频道1   发送/接收数据长度(单位:Bit) 
(0292) /* 注意:2401 忽略ADDR 中超过ADDR_W 设定宽度的那些位,同时地址不能全部设置为0 */
(0293) //频道2    接收地址          < - 频道2 未启用
(0294) #define ADDR2_4        0x00
(0295) #define ADDR2_3        0x1c
(0296) #define ADDR2_2        0xcc
(0297) #define ADDR2_1        0xcc
(0298) #define ADDR2_0        0xcc
(0299) //频道 1  接收地址 (当前模块地址)                 <- 只使用到频道 1
(0300) #define ADDR1_4        0x00
(0301) #define ADDR1_3        0xcc
(0302) #define ADDR1_2        0xcc
(0303) #define ADDR1_1        0xcc
(0304) #define ADDR1_0        0xcc
(0305) #define ADDR_W       0x10   //0x10=2 字节      //发送/接收地址宽度(单位:Bit) 
(0306) #define CRC_L        0x1                       //CRC 模式  0:8 位 1:16 位 
(0307) #define CRC_EN       0x1                       //CRC 校验  0:禁用         1:启用 
(0308) #define RX2_EN       0x0                       //双频道功能  0:禁用          1:启用 
(0309) #define CM           0x1                       //0:Direct mode   1:ShockBurst mode 
(0310) #define RFDR_SB      0x0    //传输速率0:250kbps/1:1Mbps(250kbps比1Mbps传输距离更远)
(0311) #define XO_F         0x3    //16M              //nRF2401  晶振频率(具体设置见下图) 
(0312) #define RF_PWR       0x3                       //信号发射功率(具体设置见下图) 
(0313) #define RF_CH        0x2                       //Channel RF 频率设置 
(0314) //Channel = 2400MHz + RF_CH * 1.0MHz
(0315) #define RXEN_NRF         0x0                       //0:Tx    1:Rx 
(0316) //程序会通过 SetTxMode/SetRxMode 重新设置此项参数
(0317) //<将设置信息组合成每个字节的数据信息,此区域无需修改>
(0318) #define RFConfig_Bit0  TEST_2
(0319) #define RFConfig_Bit1  TEST_1
(0320) #define RFConfig_Bit2  TEST_0
(0321) #define RFConfig_Bit3  DATA2_W
(0322) #define RFConfig_Bit4  DATA1_W
(0323) #define RFConfig_Bit5  ADDR2_4
(0324) #define RFConfig_Bit6  ADDR2_3
(0325) #define RFConfig_Bit7  ADDR2_2
(0326) #define RFConfig_Bit8  ADDR2_1
(0327) #define RFConfig_Bit9  ADDR2_0
(0328) #define RFConfig_Bit10 ADDR1_4
(0329) #define RFConfig_Bit11 ADDR1_3
(0330) #define RFConfig_Bit12 ADDR1_2
(0331) #define RFConfig_Bit13 ADDR1_1
(0332) #define RFConfig_Bit14 ADDR1_0
(0333) #define RFConfig_Bit15 (ADDR_W<<2 | CRC_L<<1 | CRC_EN)
(0334) #define RFConfig_Bit16 (RX2_EN<<7 | CM<<6 | RFDR_SB<<5 | XO_F <<2 | RF_PWR)
(0335) #define RFConfig_Bit17 (RF_CH<<1 | RXEN_NRF)
(0336) 
(0337) //------------------------------------------------------
(0338) //通过宏定义将 18 字节的寄存器参数按照各个功能分解,以便于参数的调整
(0339) unsigned char /*code*/ nRF2401_Conf[18] =
(0340) {
(0341) 	RFConfig_Bit0, RFConfig_Bit1, RFConfig_Bit2, RFConfig_Bit3,	RFConfig_Bit4,
(0342) 	RFConfig_Bit5, RFConfig_Bit6, RFConfig_Bit7, RFConfig_Bit8, RFConfig_Bit9,
(0343) 	RFConfig_Bit10, RFConfig_Bit11, RFConfig_Bit12, RFConfig_Bit13, 
(0344) 	RFConfig_Bit14,	RFConfig_Bit15, RFConfig_Bit16, RFConfig_Bit17
(0345) };
(0346) //------------------------------------------------------------
(0347) 
(0348) /*
(0349) *************************************************************
(0350) *     nRF2401 Tx/Rx functions                                             
(0351) *
(0352) *
(0353) *     void Delay100(void);
(0354) *     void Config2401(void);      //配置2401,写入初始化设置
(0355) *     void SetTxMode(void);       //设置为发送模式
(0356) *     void SetRxMode(void);       //设置为接收模式
(0357) *     void nRF2401_TxPacket(unsigned char TxBuf[]);
(0358) *                                 //发送TxBuf[] 内的数据 长度由 DATA1_W 决定
(0359) *     unsigned char nRF2401_RxPacket(unsigned char *RxBuf);
(0360) *                                 //检查是否有数据需要接受 如果有,则保存至RxBuf[]
(0361) *                                 //返回值  0:没有接收到数据 1:接收到数据
(0362) *************************************************************
(0363) */
(0364) //16M  晶振  600us 左右
(0365) /*void Delay100(void)
(0366) {
(0367) 	unsigned int i;
(0368) 	for (i=0;i<100;i++);
(0369) }*/
(0370) 
(0371) /*==================================================
(0372) nRF2401 设置配置寄存器时序
(0373) =====================================================*/
(0374) //bdata 
(0375) unsigned char DATA_BUF;       //用于ByteRead和ByteWrite函数
(0376) #define DATA7    ((DATA_BUF&BYTE_BIT7) != 0)
(0377) #define DATA0    ((DATA_BUF&BYTE_BIT0) != 0)
(0378) 
(0379) 
(0380) void delay_1us(void)                 //1us延时函数 
(0381)   { 
(0382)    asm("nop"); 
_delay_1us:
    0136 0000      NOP
    0137 9508      RET
_delay_nus:
  i                    --> R20
  n                    --> R22
    0138 940E03FA  CALL	push_gset2
    013A 01B8      MOVW	R22,R16
(0383)   } 
(0384) 
(0385) void delay_nus(unsigned int n)       //N us延时函数 
(0386)   { 
(0387)    unsigned int i=0; 
    013B 2744      CLR	R20
    013C 2755      CLR	R21
(0388)    for (i=0;i<n;i++) 
    013D C003      RJMP	0x0141
(0389)    delay_1us(); 
    013E DFF7      RCALL	_delay_1us
    013F 5F4F      SUBI	R20,0xFF
    0140 4F5F      SBCI	R21,0xFF
    0141 1746      CP	R20,R22
    0142 0757      CPC	R21,R23
    0143 F3D0      BCS	0x013E
    0144 940E03EE  CALL	pop_gset2
    0146 9508      RET
(0390)   } 
(0391)    
(0392) void delay_1ms(void)                 //1ms延时函数 
(0393)   { 
(0394)    unsigned int i; 
(0395)    for (i=0;i<1140;i++); 
_delay_1ms:
  i                    --> R16
    0147 2700      CLR	R16
    0148 2711      CLR	R17
    0149 C002      RJMP	0x014C
    014A 5F0F      SUBI	R16,0xFF
    014B 4F1F      SBCI	R17,0xFF
    014C 3704      CPI	R16,0x74
    014D E0E4      LDI	R30,4
    014E 071E      CPC	R17,R30
    014F F3D0      BCS	0x014A
    0150 9508      RET
_delay_nms:
  i                    --> R20
  n                    --> R22
    0151 940E03FA  CALL	push_gset2
    0153 01B8      MOVW	R22,R16
(0396)   } 
(0397)    
(0398) void delay_nms(unsigned int n)       //N ms延时函数 
(0399)   { 
(0400)    unsigned int i=0; 
    0154 2744      CLR	R20
    0155 2755      CLR	R21
(0401)    for (i=0;i<n;i++) 
    0156 C003      RJMP	0x015A
(0402)    delay_1ms(); 
    0157 DFEF      RCALL	_delay_1ms
    0158 5F4F      SUBI	R20,0xFF
    0159 4F5F      SBCI	R21,0xFF
    015A 1746      CP	R20,R22
    015B 0757      CPC	R21,R23
    015C F3D0      BCS	0x0157
    015D 940E03EE  CALL	pop_gset2
    015F 9508      RET
(0403)   } 
(0404) 
(0405) 
(0406) 
(0407) unsigned char ByteRead(void)
(0408) {
(0409) 	unsigned char i;
(0410) 	for (i=0;i<8;i++)
_ByteRead:
  i                    --> R16
    0160 2700      CLR	R16
    0161 C018      RJMP	0x017A
(0411) 	{
(0412) 		DATA_BUF=DATA_BUF<<1;
    0162 90200096  LDS	R2,DATA_BUF
    0164 0C22      LSL	R2
    0165 92200096  STS	DATA_BUF,R2
(0413) 		//CLK1=1;
(0414) 		CLK1_SET();
    0167 9AAB      SBI	0x15,3
(0415) 		//DATA=1;        //设置为输入状态
(0416) 		NRF_DDR&=~(1<<DATA);
    0168 98A5      CBI	0x14,5
(0417) 		DATA_SET();
    0169 9AAD      SBI	0x15,5
(0418) 		//if (DATA)      //读取最高位,保存至最末尾,通过左移位完成整个字节
(0419) 		if(DATA_STATE)
    016A B383      IN	R24,0x13
    016B 7280      ANDI	R24,0x20
    016C 3280      CPI	R24,0x20
    016D F429      BNE	0x0173
(0420) 		{
(0421) 			DATA_BUF|=BYTE_BIT0;
    016E 2D82      MOV	R24,R2
    016F 6081      ORI	R24,1
    0170 93800096  STS	DATA_BUF,R24
(0422) 		}
    0172 C005      RJMP	0x0178
(0423) 		else
(0424) 		{
(0425) 			DATA_BUF&=~BYTE_BIT0;
    0173 91800096  LDS	R24,DATA_BUF
    0175 7F8E      ANDI	R24,0xFE
    0176 93800096  STS	DATA_BUF,R24
(0426) 		}
(0427) 		//CLK1=0;
(0428) 		CLK1_CLR();
    0178 98AB      CBI	0x15,3
    0179 9503      INC	R16
    017A 3008      CPI	R16,0x8
    017B F330      BCS	0x0162
(0429) 	}
(0430) 	return DATA_BUF;
    017C 91000096  LDS	R16,DATA_BUF
    017E 9508      RET
_ByteWrite:
  i                    --> R20
  send                 --> R16
    017F 940E03FC  CALL	push_gset1
(0431) }
(0432) 
(0433) void ByteWrite(unsigned char send)
(0434) {
(0435) 	unsigned char i;
(0436) 	DATA_BUF=send;
    0181 93000096  STS	DATA_BUF,R16
(0437) 	NRF_DDR|=((1<<DATA)|(1<<CLK1));
    0183 B384      IN	R24,0x14
    0184 6288      ORI	R24,0x28
    0185 BB84      OUT	0x14,R24
(0438) 	for (i=0;i<8;i++)
    0186 2744      CLR	R20
    0187 C00F      RJMP	0x0197
(0439) 	{
(0440) 		if (DATA7)     //总是发送最高位
    0188 90200096  LDS	R2,DATA_BUF
    018A FE27      SBRS	R2,7
    018B C002      RJMP	0x018E
(0441) 		{
(0442) 			//DATA=1;
(0443) 			DATA_SET();
    018C 9AAD      SBI	0x15,5
(0444) 		}
    018D C001      RJMP	0x018F
(0445) 		else
(0446) 		{
(0447) 			//DATA=0;
(0448) 			DATA_CLR();
    018E 98AD      CBI	0x15,5
(0449) 		}
(0450) 		//CLK1=1;
(0451) 		CLK1_SET();
    018F 9AAB      SBI	0x15,3
(0452) 		DATA_BUF=DATA_BUF<<1;
    0190 90200096  LDS	R2,DATA_BUF
    0192 0C22      LSL	R2
    0193 92200096  STS	DATA_BUF,R2
(0453) 		//CLK1=0;
(0454) 		CLK1_CLR();
    0195 98AB      CBI	0x15,3
    0196 9543      INC	R20
    0197 3048      CPI	R20,0x8
    0198 F378      BCS	0x0188
    0199 940E03FF  CALL	pop_gset1
    019B 9508      RET
_Config2401:
  variablel            --> R20
  i                    --> R22
    019C 940E03FA  CALL	push_gset2
(0455) 	}
(0456) }
(0457) 
(0458) /*    <2401 配置寄存器的写入方式>
(0459) NOTE.
(0460) On the falling edge of CS, the nRF2401A updates the number of bits actually shifted
(0461) in during the last configuration.
(0462) Ex:
(0463) If the nRF2401A is to be configured for 2 channel RX in ShockBurst., a total of 120
(0464) bits must be shifted in during the first configuration after VDD is applied.
(0465) Once the wanted protocol, modus and RF channel are set, only one bit (RXEN) is
(0466) shifted in to switch between RX and TX.
(0467) 注意  :2401 配置寄存器的数据写入通过一移位寄存器完成
(0468) */
(0469) void Config2401(void)
(0470) {
(0471) 	unsigned int i;
(0472) 	unsigned char variablel;
(0473) 	//CS=0;
(0474) 	//CE=0;
(0475) 	//PWR_UP=1; //上电
(0476) 	NRF_DDR|=((1<<CS)|(1<<CE)|(1<<PWR_UP));
    019E B384      IN	R24,0x14
    019F 6183      ORI	R24,0x13
    01A0 BB84      OUT	0x14,R24
(0477) 	CS_CLR();
    01A1 98AC      CBI	0x15,4
(0478) 	CE_CLR();
    01A2 98A9      CBI	0x15,1
(0479) 	PWR_UP_CLR();
    01A3 98A8      CBI	0x15,0
(0480) 	//for (i=0;i<10;i++) Delay100();//从上电到进入配置模式需要3ms 的延时
(0481) 	delay_nms(6);
    01A4 E006      LDI	R16,6
    01A5 E010      LDI	R17,0
    01A6 DFAA      RCALL	_delay_nms
(0482) 	//CS=1;     //使RF2401 进入配置方式
(0483) 	CS_SET();
    01A7 9AAC      SBI	0x15,4
(0484) 	for (i=0;i<18;i++)
    01A8 2766      CLR	R22
    01A9 2777      CLR	R23
    01AA C00A      RJMP	0x01B5
(0485) 	{
(0486) 		variablel=nRF2401_Conf[i];
    01AB E680      LDI	R24,0x60
    01AC E090      LDI	R25,0
    01AD 01FB      MOVW	R30,R22
    01AE 0FE8      ADD	R30,R24
    01AF 1FF9      ADC	R31,R25
    01B0 8140      LDD	R20,Z+0
(0487) 		ByteWrite(variablel);
    01B1 2F04      MOV	R16,R20
    01B2 DFCC      RCALL	_ByteWrite
    01B3 5F6F      SUBI	R22,0xFF
    01B4 4F7F      SBCI	R23,0xFF
    01B5 3162      CPI	R22,0x12
    01B6 E0E0      LDI	R30,0
    01B7 077E      CPC	R23,R30
    01B8 F390      BCS	0x01AB
(0488) 	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -