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

📄 rd_useserialframe_proc.s

📁 移动机器人(小车)的物理坐标和逻辑坐标的转换源码
💻 S
📖 第 1 页 / 共 2 页
字号:
	movw R24,R20
	adiw R24,35
	ldd R2,y+4
	movw R30,R24
	ldd R3,z+0
	eor R3,R2
	std z+0,R3
	.dbline 223
;             ADT_ADD_DATA_TO_QUEUE((*pQueue),cTempData);     //将该信息添加到缓冲区
	mov R18,R2
	movw R16,R22
	movw R24,R22
	adiw R24,10
	movw R10,R24
	movw R30,R24
	ldd R26,z+0
	ldd R27,z+1
	movw R30,R26
	rcall xicall
	.dbline 225
;             
;         }
L21:
	.dbline 227
;         
;         if ((pQueue->nCount) == ((pSFP->cFrameSize) - 1))
	movw R30,R20
	ldd R24,z+36
	subi R24,1
	clr R25
	movw R30,R22
	ldd R2,z+8
	ldd R3,z+9
	cp R2,R24
	cpc R3,R25
	brne L23
X9:
	.dbline 228
;         {
	.dbline 229
;             if (pSFP->cXORCheck)
	movw R30,R20
	ldd R2,z+35
	tst R2
	brne X17
	rjmp L4
X17:
X10:
	.dbline 230
;             {
	.dbline 233
;                 //XOR校验错误
;                 //错误的数据帧长度
;                 ADT_QUEUE_LET_EMPTY((*pQueue))              //清空队列
	.dbline 233
	clr R2
	clr R3
	movw R30,R22
	std z+5,R3
	std z+4,R2
	.dbline 233
	std z+7,R3
	std z+6,R2
	.dbline 233
	std z+9,R3
	std z+8,R2
	.dbline 233
	.dbline 235
;                 
;                 SFP_STOP_ALL_ACTION
	std y+3,R2
	.dbline 237
;                 
;                 pSFP->cActionFlag = cTempActionFlag;
	movw R30,R20
	std z+34,R2
	.dbline 238
;                 cTempData = SFP_ERROR_XOR;
	ldi R24,1
	std y+4,R24
	.dbline 239
;                 SPF_Send_MSG(pSFP,SFP_CMD_ERROR,&cTempData,1);
	std y+2,R24
	movw R24,R28
	adiw R24,4
	std y+1,R25
	std y+0,R24
	ldi R18,237
	movw R16,R30
	rcall _SPF_Send_MSG
	.dbline 240
;                 return ;
	rjmp L4
L23:
	.dbline 247
;             }
;             else
;             {
;                 //ReceiveData = cTempData;
;             }
;         }
;         else if ((pQueue->nCount) == (pSFP->cFrameSize))
	movw R30,R20
	ldd R2,z+36
	clr R3
	movw R30,R22
	ldd R4,z+8
	ldd R5,z+9
	cp R4,R2
	cpc R5,R3
	brne L4
X11:
	.dbline 248
;         {
	.dbline 250
;             //所有的数据都添加完成
;             if (cTempData == pSFP->cEndByte)
	movw R30,R20
	ldd R2,z+25
	ldd R3,y+4
	cp R3,R2
	brne L29
X12:
	.dbline 251
;             {
	.dbline 253
;                 //获得了所有的数据,并且数据帧正确
;                 SFP_Check_Frames(pSFP);                     //进行数据帧检测
	movw R16,R30
	rcall _SFP_Check_Frames
	.dbline 254
;             }                
L29:
	.dbline 256
;             
;             ADT_QUEUE_LET_EMPTY((*pQueue))                  //清空队列
	.dbline 256
	clr R2
	clr R3
	movw R30,R22
	std z+5,R3
	std z+4,R2
	.dbline 256
	std z+7,R3
	std z+6,R2
	.dbline 256
	std z+9,R3
	std z+8,R2
	.dbline 256
	.dbline 258
;             
;             SFP_STOP_ALL_ACTION
	std y+3,R2
	.dbline 259
;             pSFP->cActionFlag = cTempActionFlag;
	movw R30,R20
	std z+34,R2
	.dbline 261
;             
;             return ;
	.dbline 266
;         }
;         
;         
;         
;         return ;
L19:
	.dbline -2
L4:
	.dbline 0 ; func end
	adiw R28,5
	rjmp pop_xgsetF00C
	.dbsym l cTempData 4 c
	.dbsym r pQueue 22 pS[AbstructDataTypeQueue]
	.dbsym l cTempActionFlag 3 c
	.dbsym r pSFP 20 pS[SerialFrameProcess]
	.dbend
	.dbfunc s SFP_Check_Frames _SFP_Check_Frames fV
;      cTempData -> y+4
;       pMsgItem -> R22,R23
;         pQueue -> R10,R11
;              n -> y+3
;           pSFP -> R20,R21
	.even
_SFP_Check_Frames:
	rcall push_xgsetF03C
	movw R20,R16
	sbiw R28,5
	.dbline -1
	.dbline 278
;     }
; 
; }
; 
; /***********************************************************
; *   函数说明:数据帧提取检测函数                           *
; *   输入:    串行数据帧检测结构指针                       *
; *   输出:    无                                           *
; *   调用函数:无                                           *
; ***********************************************************/
; static void SFP_Check_Frames(SERIAL_FRAME_PROCESS *pSFP)
; {
	.dbline 279
;     uint8 n = 0;
	clr R2
	std y+3,R2
	.dbline 280
;     uint8 cTempData = 0;
	std y+4,R2
	.dbline 281
;     MSG_ITEM *pMsgItem = &(pSFP->MsgItem);
	movw R22,R20
	subi R22,236  ; offset = 20
	sbci R23,255
	.dbline 282
;     ADT_QUEUE *pQueue = &(pSFP->FrameBuffer);
	movw R10,R20
	.dbline 285
;     
;     //将头部去除
;     ADT_GET_DATA_FROM_QUEUE((*pQueue),n);          
	movw R18,R28
	subi R18,253  ; offset = 3
	sbci R19,255
	movw R16,R10
	movw R24,R10
	adiw R24,12
	movw R30,R24
	ldd R26,z+0
	ldd R27,z+1
	movw R30,R26
	rcall xicall
	.dbline 288
;     
;     //获取消息长度
;     if (!(pSFP->cFixLength))
	movw R30,R20
	ldd R2,z+26
	tst R2
	brne L32
X18:
	.dbline 289
;     {
	.dbline 290
;         ADT_GET_DATA_FROM_QUEUE((*pQueue),(pMsgItem->cDataLength));
	movw R18,R22
	subi R18,255  ; offset = 1
	sbci R19,255
	movw R16,R30
	ldd R26,z+12
	ldd R27,z+13
	movw R30,R26
	rcall xicall
	.dbline 292
;     
;         pMsgItem->cDataLength -= 5;
	movw R24,R22
	adiw R24,1
	movw R12,R24
	movw R30,R24
	ldd R24,z+0
	subi R24,5
	std z+0,R24
	.dbline 293
;     }
	rjmp L33
L32:
	.dbline 295
;     else
;     {
	.dbline 296
;         pMsgItem->cDataLength = pSFP->cFixLength - 4;
	movw R30,R20
	ldd R24,z+26
	subi R24,4
	movw R30,R22
	std z+1,R24
	.dbline 297
;     }
L33:
	.dbline 300
;     
;     //获取指令字
;     ADT_GET_DATA_FROM_QUEUE((*pQueue),(pMsgItem->cCMD));   
	movw R18,R22
	movw R16,R10
	movw R24,R10
	adiw R24,12
	movw R12,R24
	movw R30,R24
	ldd R26,z+0
	ldd R27,z+1
	movw R30,R26
	rcall xicall
	.dbline 302
;     
;     for (n = 0;n < (pMsgItem->cDataLength);n++)
	clr R2
	std y+3,R2
	rjmp L37
L34:
	.dbline 303
;     {
	.dbline 305
;         //依次获取所有数据
;         ADT_GET_DATA_FROM_QUEUE((*pQueue),(pMsgItem->pData[n]));
	movw R30,R22
	ldd R2,z+2
	ldd R3,z+3
	ldd R18,y+3
	clr R19
	add R18,R2
	adc R19,R3
	movw R16,R10
	movw R24,R10
	adiw R24,12
	movw R12,R24
	movw R30,R24
	ldd R26,z+0
	ldd R27,z+1
	movw R30,R26
	rcall xicall
	.dbline 306
;     }
L35:
	.dbline 302
	ldd R24,y+3
	subi R24,255    ; addi 1
	std y+3,R24
L37:
	.dbline 302
	movw R30,R22
	ldd R2,z+1
	ldd R3,y+3
	cp R3,R2
	brlo L34
X19:
	.dbline 308
;     
;     if (!MsgMapProcess(pSFP->pMsgMap,pMsgItem))
	movw R18,R30
	movw R30,R20
	ldd R16,z+18
	ldd R17,z+19
	rcall _MsgMapProcess
	mov R10,R16
	tst R16
	brne L38
X20:
	.dbline 309
;     {
	.dbline 312
;         //信息未被正确处理
;         //有待添加代码
;         cTempData = SFP_ERROR_CMD_ERROR;
	clr R2
	std y+4,R2
	.dbline 313
;         SPF_Send_MSG(pSFP,SFP_CMD_ERROR,&cTempData,1);
	ldi R24,1
	std y+2,R24
	movw R24,R28
	adiw R24,4
	std y+1,R25
	std y+0,R24
	ldi R18,237
	movw R16,R20
	rcall _SPF_Send_MSG
	.dbline 314
;     }                       
L38:
	.dbline -2
L31:
	.dbline 0 ; func end
	adiw R28,5
	rjmp pop_xgsetF03C
	.dbsym l cTempData 4 c
	.dbsym r pMsgItem 22 pS[MsgItem]
	.dbsym r pQueue 10 pS[AbstructDataTypeQueue]
	.dbsym l n 3 c
	.dbsym r pSFP 20 pS[SerialFrameProcess]
	.dbend
	.dbfunc e SPF_Send_MSG _SPF_Send_MSG fc
;           Reg2 -> R20,R21
;           Reg8 -> R22,R23
;             n1 -> R12
;     cXORCheck0 -> R10
;         Length -> R14
;           pMSG -> y+14
;           cCMD -> R12
;           pSFP -> y+10
	.even
_SPF_Send_MSG::
	rcall push_arg4
	rcall push_xgsetF0FC
	mov R12,R18
	ldd R14,y+16
	.dbline -1
	.dbline 325
; }
; 
; /***********************************************************
; *   函数说明:消息发送函数                                 *
; *   输入:    串行数据帧检测结构指针,指令,消息,消息长度 *
; *   输出:    TRUE                                         *
; *   调用函数:无                                           *
; ***********************************************************/
; BOOL SPF_Send_MSG(SERIAL_FRAME_PROCESS *pSFP,
;                   uint8 cCMD,uint8 *pMSG,uint8 Length)
; {
	.dbline 326
;     uint8 n = 0;
	.dbline 327
;     uint8 cXORCheck = 0;
	clr R10
	.dbline 329
;     
;     (*(pSFP->OutputDataFunc))(pSFP->cHeadByte);             //发送消息头部
	ldd R30,y+10
	ldd R31,y+11
	ldd R16,z+24
	movw R20,R30
	subi R20,226  ; offset = 30
	sbci R21,255
	movw R30,R20
	ldd R26,z+0
	ldd R27,z+1
	movw R30,R26
	rcall xicall
	.dbline 331
;     
;     if (!(pSFP->cFixLength))
	ldd R30,y+10
	ldd R31,y+11
	ldd R2,z+26
	tst R2
	brne L41
X21:
	.dbline 332
;     {
	.dbline 333
;         (*(pSFP->OutputDataFunc))((Length+5));              //发送消息长度
	mov R16,R14
	subi R16,251    ; addi 5
	movw R30,R20
	ldd R26,z+0
	ldd R27,z+1
	movw R30,R26
	rcall xicall
	.dbline 334
;         cXORCheck ^= (Length + 5);
	mov R24,R14
	subi R24,251    ; addi 5
	eor R10,R24
	.dbline 335
;     }
L41:
	.dbline 337
;     
;     (*(pSFP->OutputDataFunc))(cCMD);                        //发送指令字节
	mov R16,R12
	movw R30,R20
	ldd R26,z+0
	ldd R27,z+1
	movw R30,R26
	rcall xicall
	.dbline 338
;     cXORCheck ^= cCMD;
	eor R10,R12
	.dbline 340
; 
;     for (n = 0;n < Length;n++)
	clr R12
	rjmp L46
L43:
	.dbline 341
;     {
	.dbline 342
;         (*(pSFP->OutputDataFunc))(pMSG[n]);                 //发送消息本体
	mov R22,R12
	clr R23
	ldd R0,y+14
	ldd R1,y+15
	add R22,R0
	adc R23,R1
	movw R30,R22
	ldd R16,z+0
	movw R30,R20
	ldd R26,z+0
	ldd R27,z+1
	movw R30,R26
	rcall xicall
	.dbline 343
;         cXORCheck ^= pMSG[n];
	movw R30,R22
	ldd R2,z+0
	eor R10,R2
	.dbline 344
;     }
L44:
	.dbline 340
	inc R12
L46:
	.dbline 340
	cp R12,R14
	brlo L43
X22:
	.dbline 346
;     
;     (*(pSFP->OutputDataFunc))(cXORCheck);                   //发送校验字节
	mov R16,R10
	movw R30,R20
	ldd R26,z+0
	ldd R27,z+1
	movw R30,R26
	rcall xicall
	.dbline 347
;     (*(pSFP->OutputDataFunc))(pSFP->cEndByte);              //发送消息头部
	ldd R30,y+10
	ldd R31,y+11
	ldd R16,z+25
	movw R30,R20
	ldd R26,z+0
	ldd R27,z+1
	movw R30,R26
	rcall xicall
	.dbline 349
;     
;     return TRUE;
	ldi R16,1
	.dbline -2
L40:
	.dbline 0 ; func end
	rcall pop_xgsetF0FC
	adiw R28,4
	ret
	.dbsym r Reg2 20 pV
	.dbsym r Reg8 22 pV
	.dbsym r n1 12 c
	.dbsym r cXORCheck0 10 c
	.dbsym r Length 14 c
	.dbsym l pMSG 14 pc
	.dbsym r cCMD 12 c
	.dbsym l pSFP 10 pS[SerialFrameProcess]
	.dbend
; }
; 

⌨️ 快捷键说明

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