📄 soc_test.lst
字号:
(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 + -