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

📄 rd_useserialframe_proc.s

📁 移动机器人(小车)的物理坐标和逻辑坐标的转换源码
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module RD_UseSerialFrame_PROC.c
	.area text(rom, con, rel)
	.dbfile E:\单片机\ROOBCO~1\全向定位系统\坐标转换模块\相对定位模块应用版\Relative_Locate_Module\RD_UseSerialFrame_PROC.c
	.dbfunc e SFP_NULL_Output_Data_Function _SFP_NULL_Output_Data_Function fc
;              p -> R10,R11
;          cData -> y+2
	.even
_SFP_NULL_Output_Data_Function::
	st -y,r17
	st -y,r16
	st -y,R10
	st -y,R11
	.dbline -1
	.dbline 104
; /***********************************************************
; *   函数库说明:串行通信数据帧处理函数函数库               *
; *   版本:      v1.00                                      *
; *   作者:      王卓然                                     *
; *   创建日期:  2007年4月6日                               *
; * -------------------------------------------------------- *
; *  [支 持 库]                                              *
; *   支持库名称:LIB_Config.h                               *
; *   需要版本:  -----                                      *
; *   支持库说明:库函数配置声明库                           *
; *                                                          *
; *   支持库名称:RD_MacroAndConst.h                         *
; *   需要版本:  v0.01 &abv                                 *
; *   支持库说明:系统常用宏定义库                           *
; *                                                          *
; *   支持库名称:RD_UseSerialFrame_PROC.h                   *
; *   需要版本:  -----                                      *
; *   支持库名称:串行通信数据帧处理函数声明库               *
; * -------------------------------------------------------- *
; *  [版本更新]                                              *
; *   修改:                                                 *
; *   修改日期:                                             *
; *   版本:                                                 *
; * -------------------------------------------------------- *
; *  [版本历史]                                              *
; * -------------------------------------------------------- *
; *  [使用说明]                                              *
; ***********************************************************/
; 
; /********************
; * 头 文 件 配 置 区 *
; ********************/
; # include "RD_MacroAndConst.h"
; # include "RD_ADT_QUEUE.h"
; # include "RD_ADT_MSGMap.h"
; # include "RD_UseSerialFrame_PROC.h"
; # include "RD_UseBits.h"
; 
; /********************
; *   系 统 宏 定 义  *
; ********************/
; 
; /*------------------*
; *   常 数 宏 定 义  *
; *------------------*/
; #ifndef SFP_CMD_ERROR
;     # define SFP_CMD_ERROR      0xED
; #endif
; #ifndef SFP_ERROR_CMD_ERROR     
;     # define SFP_ERROR_CMD_ERROR    0x00
; #endif
; #ifndef SFP_ERROR_XOR
;     # define SFP_ERROR_XOR      0x01
; #endif
; 
; 
; /*------------------*
; *   动 作 宏 定 义  *
; *------------------*/
; # define SFP_ACTION_FLAG            SET_BIT8_FORMAT(cTempActionFlag)
; # define SFP_STOP_ALL_ACTION        cTempActionFlag = NULL;
; # define SFP_WAIT_FOR_FRAME_HEAD    SFP_ACTION_FLAG.BIT0
; # define SFP_WAIT_FOR_FRAME_SIZE    SFP_ACTION_FLAG.BIT1
; # define SFP_WAIT_FOR_ALL_DATA      SFP_ACTION_FLAG.BIT2
; 
; 
; /********************
; *  用户变量类型定义 *
; ********************/
; 
; /********************
; *    结构体定义区   *
; ********************/
; 
; /********************
; *   模块函数声明区  *
; ********************/
; static void SFP_Check_Frames(SERIAL_FRAME_PROCESS *pSFP);
; 
; /********************
; *   全局函数声明区  *
; ********************/
; void Serial_Frame_Process(SERIAL_FRAME_PROCESS *pSFP);
; BOOL SFP_NULL_Output_Data_Function(uint8 cData);
; BOOL SFP_NULL_Input_Data_Function(uint8 *pData);
; BOOL SFP_NULL_Peek_Data_Function(uint8 *pData);
; BOOL SPF_Send_MSG(SERIAL_FRAME_PROCESS *pSFP,
;                   uint8 cCMD,uint8 *pMSG,uint8 Length);
; /********************
; *   模块变量声明区  *
; ********************/
; 
; /********************
; *   全局变量声明区  *
; ********************/
; 
; /***********************************************************
; *   函数说明:数据输出空函数                               *
; *   输入:    数据                                         *
; *   输出:    FALSE                                        *
; *   调用函数:无                                           *
; ***********************************************************/
; BOOL SFP_NULL_Output_Data_Function(uint8 cData)
; {
	.dbline 105
;     uint8 *p = &cData;
	movw R24,R28
	adiw R24,2
	movw R10,R24
	.dbline 107
;     
;     return FALSE;
	clr R16
	.dbline -2
L1:
	.dbline 0 ; func end
	ld R11,y+
	ld R10,y+
	adiw R28,2
	ret
	.dbsym r p 10 pc
	.dbsym l cData 2 c
	.dbend
	.dbfunc e SFP_NULL_Input_Data_Function _SFP_NULL_Input_Data_Function fc
;          pData -> R16,R17
	.even
_SFP_NULL_Input_Data_Function::
	.dbline -1
	.dbline 117
; }
; 
; /***********************************************************
; *   函数说明:数据输入空函数                               *
; *   输入:    指针                                         *
; *   输出:    FALSE                                        *
; *   调用函数:无                                           *
; ***********************************************************/
; BOOL SFP_NULL_Input_Data_Function(uint8 *pData)
; {
	.dbline 118
;     (*pData) = NULL;
	clr R2
	movw R30,R16
	std z+0,R2
	.dbline 120
;     
;     return FALSE;
	clr R16
	.dbline -2
L2:
	.dbline 0 ; func end
	ret
	.dbsym r pData 16 pc
	.dbend
	.dbfunc e SFP_NULL_Peek_Data_Function _SFP_NULL_Peek_Data_Function fc
;          pData -> R16,R17
	.even
_SFP_NULL_Peek_Data_Function::
	.dbline -1
	.dbline 130
; }
; 
; /***********************************************************
; *   函数说明:数据察看空函数                               *
; *   输入:    指针                                         *
; *   输出:    FALSE                                        *
; *   调用函数:无                                           *
; ***********************************************************/
; BOOL SFP_NULL_Peek_Data_Function(uint8 *pData)
; {
	.dbline 131
;     (*pData) = NULL;
	clr R2
	movw R30,R16
	std z+0,R2
	.dbline 133
;     
;     return FALSE;
	clr R16
	.dbline -2
L3:
	.dbline 0 ; func end
	ret
	.dbsym r pData 16 pc
	.dbend
	.dbfunc e Serial_Frame_Process _Serial_Frame_Process fV
	.dbstruct 0 18 AbstructDataTypeQueue
	.dbfield 0 pBuffer pc
	.dbfield 2 nSize i
	.dbfield 4 nHead i
	.dbfield 6 nTail i
	.dbfield 8 nCount i
	.dbfield 10 fnAddToBuffer pfc
	.dbfield 12 fnGetFromBuffer pfc
	.dbfield 14 fnCheckEmpty pfc
	.dbfield 16 fnPeekFromBuffer pfc
	.dbend
	.dbstruct 0 3 MsgMapItem
	.dbfield 0 cCMD c
	.dbfield 1 pMsgFunc pfc
	.dbend
	.dbstruct 0 3 MsgMap
	.dbfield 0 cItemCount c
	.dbfield 1 pMsgItems pS[MsgMapItem]
	.dbend
	.dbstruct 0 4 MsgItem
	.dbfield 0 cCMD c
	.dbfield 1 cDataLength c
	.dbfield 2 pData pc
	.dbend
	.dbstruct 0 37 SerialFrameProcess
	.dbfield 0 FrameBuffer S[AbstructDataTypeQueue]
	.dbfield 18 pMsgMap pS[MsgMap]
	.dbfield 20 MsgItem S[MsgItem]
	.dbfield 24 cHeadByte c
	.dbfield 25 cEndByte c
	.dbfield 26 cFixLength c
	.dbfield 27 cAddress c
	.dbfield 28 InputDataFunc pfc
	.dbfield 30 OutputDataFunc pfc
	.dbfield 32 PeekDataFunc pfc
	.dbfield 34 cActionFlag c
	.dbfield 35 cXORCheck c
	.dbfield 36 cFrameSize c
	.dbend
;      cTempData -> y+4
;         pQueue -> R22,R23
; cTempActionFlag -> y+3
;           pSFP -> R20,R21
	.even
_Serial_Frame_Process::
	rcall push_xgsetF00C
	movw R20,R16
	sbiw R28,5
	.dbline -1
	.dbline 144
; }
; 
; 
; /***********************************************************
; *   函数说明:串行通讯数据帧处理函数                       *
; *   输入:    要处理的数据帧结构指针                       *
; *   输出:    无                                           *
; *   调用函数:SFP_Check_Frames()                           *
; ***********************************************************/
; void Serial_Frame_Process(SERIAL_FRAME_PROCESS *pSFP)
; {
	.dbline 146
; 
;     uint8 cTempActionFlag = pSFP->cActionFlag;
	movw R30,R20
	ldd R2,z+34
	std y+3,R2
	.dbline 147
;     uint8 cTempData = 0;
	clr R2
	std y+4,R2
	.dbline 148
;     ADT_QUEUE *pQueue = &(pSFP->FrameBuffer);
	movw R22,R30
	.dbline 151
; 
;     
;     if (!(*(pSFP->InputDataFunc))(&cTempData))              //利用函数指针调用函数
	movw R16,R28
	subi R16,252  ; offset = 4
	sbci R17,255
	ldd R26,z+28
	ldd R27,z+29
	movw R30,R26
	rcall xicall
	tst R16
	brne L5
X0:
	.dbline 152
;     {
	.dbline 153
;         return ;
	rjmp L4
L5:
	.dbline 156
;     }
;     
;     if (cTempActionFlag == NULL)
	ldd R2,y+3
	tst R2
	brne L7
X1:
	.dbline 157
;     {
	.dbline 158
;         pSFP->cXORCheck = 0;
	clr R2
	movw R30,R20
	std z+35,R2
	.dbline 159
;         pSFP->cFrameSize = 0;
	std z+36,R2
	.dbline 160
;         SFP_WAIT_FOR_FRAME_HEAD = TRUE;
	ldd R24,y+3
	ori R24,1
	std y+3,R24
	.dbline 161
;     }
L7:
	.dbline 163
;     
;     if (SFP_WAIT_FOR_FRAME_HEAD)
	movw R30,R28
	ldd R24,z+3
	andi R24,1
	brne X13
	rjmp L9
X13:
X2:
	.dbline 164
;     {
	.dbline 165
;         if (cTempData == pSFP->cHeadByte)
	movw R30,R20
	ldd R2,z+24
	ldd R3,y+4
	cp R3,R2
	breq X14
	rjmp L4
X14:
X3:
	.dbline 166
;         {
	.dbline 167
;             ADT_ADD_DATA_TO_QUEUE((*pQueue),cTempData);
	mov R18,R3
	movw R16,R22
	movw R24,R22
	adiw R24,10
	movw R30,R24
	ldd R26,z+0
	ldd R27,z+1
	movw R30,R26
	rcall xicall
	.dbline 170
;             
;             
;             if (!(pSFP->cFixLength))
	movw R30,R20
	ldd R2,z+26
	tst R2
	brne L13
X4:
	.dbline 171
;             {
	.dbline 173
;                 //变长数据帧
;                 SFP_WAIT_FOR_FRAME_SIZE = TRUE;
	ldd R24,y+3
	ori R24,2
	std y+3,R24
	.dbline 174
;             }
	rjmp L14
L13:
	.dbline 176
;             else
;             {
	.dbline 178
;                 //固定长度的数据帧
;                 SFP_WAIT_FOR_ALL_DATA = TRUE;
	ldd R24,y+3
	ori R24,4
	std y+3,R24
	.dbline 179
;                 pSFP->cFrameSize = pSFP->cFixLength;
	movw R30,R20
	ldd R2,z+26
	std z+36,R2
	.dbline 180
;             }
L14:
	.dbline 182
;             
;             SFP_WAIT_FOR_FRAME_HEAD = FALSE;
	ldd R24,y+3
	andi R24,254
	std y+3,R24
	.dbline 183
;             pSFP->cActionFlag = cTempActionFlag;
	mov R2,R24
	movw R30,R20
	std z+34,R2
	.dbline 185
;             
;         }
	.dbline 187
;         
;         return ;
	rjmp L4
L9:
	.dbline 190
;     }
;     
;     if (SFP_WAIT_FOR_FRAME_SIZE)
	movw R30,R28
	ldd R24,z+3
	lsr R24
	andi R24,1
	brne X15
	rjmp L15
X15:
X5:
	.dbline 191
;     {
	.dbline 193
;         
;         if (cTempData > (pQueue->nSize))
	movw R30,R22
	ldd R2,z+2
	ldd R3,z+3
	ldd R4,y+4
	clr R5
	cp R2,R4
	cpc R3,R5
	brsh L17
X6:
	.dbline 194
;         {
	.dbline 197
;             //错误的数据帧长度
;            
;             ADT_QUEUE_LET_EMPTY((*pQueue))                  //清空队列
	.dbline 197
	clr R2
	clr R3
	std z+5,R3
	std z+4,R2
	.dbline 197
	std z+7,R3
	std z+6,R2
	.dbline 197
	std z+9,R3
	std z+8,R2
	.dbline 197
	.dbline 199
; 
;             SFP_STOP_ALL_ACTION
	std y+3,R2
	.dbline 200
;         }
	rjmp L18
L17:
	.dbline 202
;         else
;         {
	.dbline 204
;             //有效的数据帧长度
;             pSFP->cFrameSize = cTempData;                   //更新数据帧长度信息
	ldd R2,y+4
	movw R30,R20
	std z+36,R2
	.dbline 205
;             pSFP->cXORCheck ^= cTempData;
	movw R24,R30
	adiw R24,35
	movw R30,R24
	ldd R3,z+0
	eor R3,R2
	std z+0,R3
	.dbline 207
;             
;             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 210
;             
;             
;             SFP_WAIT_FOR_ALL_DATA = TRUE;
	ldd R24,y+3
	ori R24,4
	std y+3,R24
	.dbline 211
;             SFP_WAIT_FOR_FRAME_SIZE = FALSE;        
	andi R24,253
	std y+3,R24
	.dbline 212
;         }
L18:
	.dbline 214
;         
;         pSFP->cActionFlag = cTempActionFlag;
	ldd R2,y+3
	movw R30,R20
	std z+34,R2
	.dbline 215
;         return ;
	rjmp L4
L15:
	.dbline 218
;     }
;     
;     if (SFP_WAIT_FOR_ALL_DATA)
	movw R30,R28
	ldd R24,z+3
	lsr R24
	lsr R24
	andi R24,1
	brne X16
	rjmp L19
X16:
X7:
	.dbline 219
;     {
	.dbline 220
;         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
	brsh L21
X8:
	.dbline 221
;         {
	.dbline 222
;             pSFP->cXORCheck ^= cTempData;

⌨️ 快捷键说明

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