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

📄 soc_test.lst

📁 atmega128串口通信
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0193) 			}
    013E C06F      RJMP	0x01AE
(0194) 			else
(0195) 			{
(0196) 				haveError=0x02;			//haveError索引(2),开始字出错
    013F E082      LDI	R24,2
    0140 93800107  STS	_haveError,R24
(0197) 			}
(0198) 		}
    0142 C06B      RJMP	0x01AE
(0199) 		else if(1==buf_index && BEGIN_WORD==beginWord)
    0143 91800105  LDS	R24,_buf_index
    0145 3081      CPI	R24,1
    0146 F4C1      BNE	0x015F
    0147 9180010A  LDS	R24,_beginWord
    0149 378E      CPI	R24,0x7E
    014A F4A1      BNE	0x015F
(0200) 		{	//索引为1,且已经起始
(0201) 			if(BEGIN_WORD==buffer[1])	//若第二个数据也是起始字,删除一个
    014B 91800120  LDS	R24,_buffer+1
    014D 378E      CPI	R24,0x7E
    014E F439      BNE	0x0156
(0202) 			{
(0203) 				buf_index=0;		//索引变为0
    014F 2422      CLR	R2
    0150 92200105  STS	_buf_index,R2
(0204) 				buffer[1]=0x01;	//清除第二个接收到的起始字
    0152 E081      LDI	R24,1
    0153 93800120  STS	_buffer+1,R24
(0205) 			}
    0155 C058      RJMP	0x01AE
(0206) 			//判断所收命令是否归本片AVR处理
(0207) 			else if(ADDRESS_WORD!=buffer[1]) 
    0156 91800120  LDS	R24,_buffer+1
    0158 358F      CPI	R24,0x5F
    0159 F409      BNE	0x015B
    015A C053      RJMP	0x01AE
(0208) 			{
(0209) 				haveError=0x03;   //haveError索引(3),地址不对,重新接收
    015B E083      LDI	R24,3
    015C 93800107  STS	_haveError,R24
(0210) 			}
(0211) 		}
    015E C04F      RJMP	0x01AE
(0212) 		else if(haveSpeWord)	//这里用else,是因为第一个字,第二个字都不可能是转义字符
    015F 90200106  LDS	R2,_haveSpeWord
    0161 2022      TST	R2
    0162 F409      BNE	0x0164
    0163 C039      RJMP	0x019D
(0213) 		{//含有转义字符,做转义操作,若数据错误,则设置错误标志,重新接收
(0214) 			haveSpeWord=0x00;			//清除标志
    0164 2422      CLR	R2
    0165 92200106  STS	_haveSpeWord,R2
(0215) 			if(CHANGE_WORDL1==buffer[buf_index])
    0167 E18F      LDI	R24,0x1F
    0168 E091      LDI	R25,1
    0169 91E00105  LDS	R30,_buf_index
    016B 27FF      CLR	R31
    016C 0FE8      ADD	R30,R24
    016D 1FF9      ADC	R31,R25
    016E 8180      LDD	R24,Z+0
    016F 358E      CPI	R24,0x5E
    0170 F479      BNE	0x0180
(0216) 			{
(0217) 				buffer[buf_index-1]=0x7E;	//若是7D 5E -> 7E
    0171 E18E      LDI	R24,0x1E
    0172 E091      LDI	R25,1
    0173 91E00105  LDS	R30,_buf_index
    0175 27FF      CLR	R31
    0176 0FE8      ADD	R30,R24
    0177 1FF9      ADC	R31,R25
    0178 E78E      LDI	R24,0x7E
    0179 8380      STD	Z+0,R24
(0218) 				buf_index-=1;			//buf_index减一
    017A 91800105  LDS	R24,_buf_index
    017C 5081      SUBI	R24,1
    017D 93800105  STS	_buf_index,R24
(0219) 			}
    017F C02E      RJMP	0x01AE
(0220) 			else if(CHANGE_WORDL2==buffer[buf_index])
    0180 E18F      LDI	R24,0x1F
    0181 E091      LDI	R25,1
    0182 91E00105  LDS	R30,_buf_index
    0184 27FF      CLR	R31
    0185 0FE8      ADD	R30,R24
    0186 1FF9      ADC	R31,R25
    0187 8180      LDD	R24,Z+0
    0188 358D      CPI	R24,0x5D
    0189 F479      BNE	0x0199
(0221) 			{
(0222) 				buffer[buf_index-1]=0x7D;	//若是7D 5D -> 7D
    018A E18E      LDI	R24,0x1E
    018B E091      LDI	R25,1
    018C 91E00105  LDS	R30,_buf_index
    018E 27FF      CLR	R31
    018F 0FE8      ADD	R30,R24
    0190 1FF9      ADC	R31,R25
    0191 E78D      LDI	R24,0x7D
    0192 8380      STD	Z+0,R24
(0223) 				buf_index-=1;			//buf_index减一
    0193 91800105  LDS	R24,_buf_index
    0195 5081      SUBI	R24,1
    0196 93800105  STS	_buf_index,R24
(0224) 			}
    0198 C015      RJMP	0x01AE
(0225) 			else
(0226) 			{
(0227) 				haveError=0x04;		//haveError索引(4),转义字符出错
    0199 E084      LDI	R24,4
    019A 93800107  STS	_haveError,R24
(0228) 			}
(0229) 		}
    019C C011      RJMP	0x01AE
(0230) 		else if(0x7D==buffer[buf_index])
    019D E18F      LDI	R24,0x1F
    019E E091      LDI	R25,1
    019F 91E00105  LDS	R30,_buf_index
    01A1 27FF      CLR	R31
    01A2 0FE8      ADD	R30,R24
    01A3 1FF9      ADC	R31,R25
    01A4 8180      LDD	R24,Z+0
    01A5 378D      CPI	R24,0x7D
    01A6 F439      BNE	0x01AE
(0231) 		{
(0232) 			haveSpeWord=0x01;			//接收到转义字符
    01A7 E081      LDI	R24,1
    01A8 93800106  STS	_haveSpeWord,R24
(0233) 		} 
(0234) 	}
    01AA C003      RJMP	0x01AE
(0235) 	else
(0236) 	{
(0237) 		haveError=0x01;		//haveError索引(1),超出了接收长度
    01AB E081      LDI	R24,1
    01AC 93800107  STS	_haveError,R24
(0238) 	}
(0239) 	//跳出时做错误判断
(0240) 	if(haveError!=0)				//如果发现有错误
    01AE 90200107  LDS	R2,_haveError
    01B0 2022      TST	R2
    01B1 F071      BEQ	0x01C0
(0241) 	{	//如果有错误,重新接收
(0242) 		buffer[0]=0x00;			//第一个字符清零
    01B2 2422      CLR	R2
    01B3 9220011F  STS	_buffer,R2
(0243) 		buf_index=0;				//buffer索引清零,继续接收
    01B5 92200105  STS	_buf_index,R2
(0244) 		beginWord=0x00;			//为开始做准备
    01B7 9220010A  STS	_beginWord,R2
(0245) 		endWord=0x00;				//结束字还没收到
    01B9 92200109  STS	_endWord,R2
(0246) 		haveSpeWord=0;				//清接收转义字符标志
    01BB 92200106  STS	_haveSpeWord,R2
(0247) 		haveError=0;				//清错误标志
    01BD 92200107  STS	_haveError,R2
(0248) 	}
    01BF C005      RJMP	0x01C5
(0249) 	else
(0250) 	{										//若没有错误
(0251) 		buf_index+=1;					//buffer索引加1
    01C0 91800105  LDS	R24,_buf_index
    01C2 5F8F      SUBI	R24,0xFF
    01C3 93800105  STS	_buf_index,R24
(0252) 	}
(0253) }//end usart0_receive
    01C5 9029      LD	R2,Y+
    01C6 BE2F      OUT	0x3F,R2
    01C7 91F9      LD	R31,Y+
    01C8 91E9      LD	R30,Y+
    01C9 9199      LD	R25,Y+
    01CA 9189      LD	R24,Y+
    01CB 9109      LD	R16,Y+
    01CC 9029      LD	R2,Y+
    01CD 9518      RETI
_Write_bus_data:
  bus_data_H           --> R20
  bus_data_L           --> R22
  bus_data             --> R22
    01CE 940E07AE  CALL	push_gset2
    01D0 01B8      MOVW	R22,R16
(0254) 
(0255) /*********************************************************
(0256) 向命令总线写命令数据
(0257) *********************************************************/
(0258) void  Write_bus_data(short bus_data)
(0259) {unsigned char bus_data_L;
(0260)  unsigned char bus_data_H;
(0261)  bus_data_H = bus_data/256;
    01D1 E020      LDI	R18,0
    01D2 E031      LDI	R19,1
    01D3 018B      MOVW	R16,R22
    01D4 940E06AA  CALL	div16s
    01D6 2F40      MOV	R20,R16
(0262)  bus_data_L = bus_data%256;
    01D7 E020      LDI	R18,0
    01D8 E031      LDI	R19,1
    01D9 018B      MOVW	R16,R22
    01DA 940E06A6  CALL	mod16s
    01DC 2F60      MOV	R22,R16
(0263)  INSTRUCT_BYTE_LOW = bus_data_L;
    01DD 936011FF  STS	0x11FF,R22
(0264)  INSTRUCT_BYTE_HIG = bus_data_H;
    01DF 934012FF  STS	0x12FF,R20
(0265) }//end Write_bus_data
    01E1 940E0791  CALL	pop_gset2
    01E3 9508      RET
(0266) /*********************************************************
(0267) 向命令总线写命令地址
(0268) *********************************************************/
(0269)     
(0270) void  Write_bus_add(unsigned char bus_add)
(0271) {INSTRUCT_ADD = bus_add;
_Write_bus_add:
  bus_add              --> R16
    01E4 930013FF  STS	0x13FF,R16
(0272) }//end Write_bus_add
    01E6 9508      RET
_send_instruct:
  address              --> R20
  command              --> R22
    01E7 940E07AE  CALL	push_gset2
    01E9 2F42      MOV	R20,R18
    01EA 01B8      MOVW	R22,R16
(0273) /*********************************************************
(0274) 写控制命令
(0275) *********************************************************/
(0276) void  send_instruct(short command ,unsigned char address)
(0277) {Write_bus_data(command);
    01EB 018B      MOVW	R16,R22
    01EC DFE1      RCALL	_Write_bus_data
(0278)  Write_bus_add(address);
    01ED 2F04      MOV	R16,R20
    01EE DFF5      RCALL	_Write_bus_add
(0279)  PORTE&=~BIT(BUSWEN);  //BUSWEN置低
    01EF 981B      CBI	0x03,3
(0280)  NOP5();
    01F0 DE9F      RCALL	_NOP5
(0281)  PORTE|=BIT(BUSWEN);  //BUSWEN置高
    01F1 9A1B      SBI	0x03,3
(0282)  NOP5();
    01F2 DE9D      RCALL	_NOP5
(0283)  PORTE&=~BIT(NBUS_CLK);  //NBUS_CLK置低
    01F3 981A      CBI	0x03,2
(0284)  NOP5();
    01F4 DE9B      RCALL	_NOP5
(0285)  PORTE|=BIT(NBUS_CLK);  //NBUS_CLK置高
    01F5 9A1A      SBI	0x03,2
(0286)  NOP5();
    01F6 DE99      RCALL	_NOP5
(0287)  PORTE&=~BIT(NBUS_CLK);  //NBUS_CLK置低
    01F7 981A      CBI	0x03,2
(0288)  NOP5();
    01F8 DE97      RCALL	_NOP5
(0289)  PORTE&=~BIT(BUSWEN);  //BUSWEN置低
    01F9 981B      CBI	0x03,3
(0290)  NOP5();
    01FA DE95      RCALL	_NOP5
(0291)  
(0292) }//end send_instruct
    01FB 940E0791  CALL	pop_gset2
    01FD 9508      RET
(0293) /*********************************************************
(0294) 启动DDC数据采样
(0295) *********************************************************/
(0296) void start_sample(void)
(0297) {PORTE&=~BIT(SAMPLE_START);  //SAMPLE_START置低
_start_sample:
    01FE 981C      CBI	0x03,4
(0298)  NOP5();
    01FF DE90      RCALL	_NOP5
(0299)  PORTE|=BIT(SAMPLE_START);  //SAMPLE_START置高
    0200 9A1C      SBI	0x03,4
(0300)  NOP5();
    0201 DE8E      RCALL	_NOP5
(0301)  NOP5();
    0202 DE8D      RCALL	_NOP5
(0302)  NOP5();
    0203 DE8C      RCALL	_NOP5
(0303)  NOP5();
    0204 DE8B      RCALL	_NOP5
(0304)  NOP5();
    0205 DE8A      RCALL	_NOP5
(0305)  NOP5();
    0206 DE89      RCALL	_NOP5
(0306)  PORTE&=~BIT(SAMPLE_START);  //SAMPLE_START置低
    0207 981C      CBI	0x03,4
(0307) }//end start_sample
    0208 9508      RET
_start_mcuread_sample:
  temp                 --> R20
    0209 940E0797  CALL	push_gset1
(0308) 
(0309) /*********************************************************
(0310) 启动单片机读DDC采样数据
(0311) *********************************************************/
(0312) void start_mcuread_sample(void)
(0313) {unsigned char temp;
(0314)  PORTE&=~BIT(MCUREAD_START);  //MCUREAD_START置低
    020B 981D      CBI	0x03,5
(0315)  NOP5();
    020C DE83      RCALL	_NOP5
(0316)  PORTE|=BIT(MCUREAD_START);  //MCUREAD_START置高
    020D 9A1D      SBI	0x03,5
(0317)  NOP5();
    020E DE81      RCALL	_NOP5
(0318)  temp=DDCDATA_ADD;
    020F 914016FF  LDS	R20,0x16FF
(0319)  NOP5();
    0211 DE7E      RCALL	_NOP5
(0320)  PORTE&=~BIT(MCUREAD_START); //MCUREAD_START置低
    0212 981D      CBI	0x03,5
(0321) }//end start_sample
    0213 940E079A  CALL	pop_gset1
    0215 9508      RET
_aquire_data:
  cnt                  --> R20
  ddc_data             --> R22
    0216 940E07AE  CALL	push_gset2
(0322) 
(0323) 
(0324) /*********************************************************
(0325) 通过串口获取DDC数据
(0326) *********************************************************/
(0327) void aquire_data(void)
(0328) {unsigned char ddc_data;
(0329) int cnt;
(0330) start_sample();                //启动DDC数据采集
    0218 DFE5      RCALL	_start_sample
(0331) asm("ldi R16,$20");
    0219 E200      LDI	R16,0x20
(0332) delay1();                      //延时足够时间保证采样结束
    021A DEA7      RCALL	_delay1
(0333) start_mcuread_sample();        //启动MCU读
    021B DFED      RCALL	_start_mcuread_sample
(0334) usart0_sendbyte(0x7E);         //发送起始字
    021C E70E      LDI	R16,0x7E
    021D DEDC      RCALL	_usart0_sendbyte
(0335) usart0_sendbyte(0x6F);        //发送地址字
    021E E60F      LDI	R16,0x6F
    021F DEDA      RCALL	_usart0_sendbyte
(0336) ddc_data=DDCDATA_ADD;         //假读一次
    0220 916016FF  LDS	R22,0x16FF
(0337) for(cnt=0;cnt<8192;cnt++)     //发送数据
    0222 2744      CLR	R20
    0223 2755      CLR	R21
(0338) {
(0339)  ddc_data=DDCDATA_ADD;
    0224 916016FF  LDS	R22,0x16FF
(0340)  usart0_sendbyte(ddc_data);
    0226 2F06      MOV	R16,R22
    0227 DED2      RCALL	_usart0_sendbyte
    0228 5F4F      SUBI	R20,0xFF
    0229 4F5F      SBCI	R21,0xFF
    022A 3040      CPI	R20,0
    022B E2E0      LDI	R30,0x20
    022C 075E      CPC	R21,R30
    022D F3B4      BLT	0x0224
(0341) }
(0342) usart0_sendbyte(0x7E);       //发送结束字
    022E E70E      LDI	R16,0x7E
    022F DECA      RCALL	_usart0_sendbyte
(0343) }//end aquire_data
    0230 940E0791  CALL	pop_gset2
    0232 9508      RET
_set_dds_freq:
  temp                 --> R10
  dds_freq             --> Y+6
    0233 940E06A1  CALL	push_arg4
    0235 940E07B2  CALL	push_gset3
(0344) 
(0345) /*********************************************************
(0346) 设置DDS频率
(0347) *********************************************************/
(0348) void set_dds_freq(long dds_freq)
(0349) {short temp;
(0350)     temp=(short)(dds_freq>>16);
    0237 01FE      MOVW	R30,R28
    0238 8026      LDD	R2,Z+6
    0239 8037      LDD	R3,Z+7
    023A 8440      LDD	R4,Z+8
    023B 8451      LDD	R5,Z+9
    023C 0152      MOVW	R10,R4
(0351) 	send_instruct(temp,0x83);
    023D E823      LDI	R18,0x83
    023E 0185      MOVW	R16,R10
    023F DFA7      RCALL	_send_instruct
(0352) 	temp=dds_freq%65536;
    0240 E040      LDI	R20,0
    0241 E050      LDI	R21,0
    0242 E061      LDI	R22,1
    0243 E070      LDI	R23,0
    0244 01FE      MOVW	R30,R28
    0245 8026      LDD	R2,Z+6
    0246 8037      LDD	R3,Z+7
    0247 8440      LDD	R4,Z+8
    0248 8451      LDD	R5,Z+9
    0249 937A      ST	R23,-Y

⌨️ 快捷键说明

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