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

📄 model.lst

📁 移动机器人(小车)的物理坐标和逻辑坐标的转换源码
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0002) *   函数库说明:串行通信数据帧处理函数函数库               *
(0003) *   版本:      v1.00                                      *
(0004) *   作者:      王卓然                                     *
(0005) *   创建日期:  2007年4月6日                               *
(0006) * -------------------------------------------------------- *
(0007) *  [支 持 库]                                              *
(0008) *   支持库名称:LIB_Config.h                               *
(0009) *   需要版本:  -----                                      *
(0010) *   支持库说明:库函数配置声明库                           *
(0011) *                                                          *
(0012) *   支持库名称:RD_MacroAndConst.h                         *
(0013) *   需要版本:  v0.01 &abv                                 *
(0014) *   支持库说明:系统常用宏定义库                           *
(0015) *                                                          *
(0016) *   支持库名称:RD_UseSerialFrame_PROC.h                   *
(0017) *   需要版本:  -----                                      *
(0018) *   支持库名称:串行通信数据帧处理函数声明库               *
(0019) * -------------------------------------------------------- *
(0020) *  [版本更新]                                              *
(0021) *   修改:                                                 *
(0022) *   修改日期:                                             *
(0023) *   版本:                                                 *
(0024) * -------------------------------------------------------- *
(0025) *  [版本历史]                                              *
(0026) * -------------------------------------------------------- *
(0027) *  [使用说明]                                              *
(0028) ***********************************************************/
(0029) 
(0030) /********************
(0031) * 头 文 件 配 置 区 *
(0032) ********************/
(0033) # include "RD_MacroAndConst.h"
(0034) # include "RD_ADT_QUEUE.h"
(0035) # include "RD_ADT_MSGMap.h"
(0036) # include "RD_UseSerialFrame_PROC.h"
(0037) # include "RD_UseBits.h"
(0038) 
(0039) /********************
(0040) *   系 统 宏 定 义  *
(0041) ********************/
(0042) 
(0043) /*------------------*
(0044) *   常 数 宏 定 义  *
(0045) *------------------*/
(0046) #ifndef SFP_CMD_ERROR
(0047)     # define SFP_CMD_ERROR      0xED
(0048) #endif
(0049) #ifndef SFP_ERROR_CMD_ERROR     
(0050)     # define SFP_ERROR_CMD_ERROR    0x00
(0051) #endif
(0052) #ifndef SFP_ERROR_XOR
(0053)     # define SFP_ERROR_XOR      0x01
(0054) #endif
(0055) 
(0056) 
(0057) /*------------------*
(0058) *   动 作 宏 定 义  *
(0059) *------------------*/
(0060) # define SFP_ACTION_FLAG            SET_BIT8_FORMAT(cTempActionFlag)
(0061) # define SFP_STOP_ALL_ACTION        cTempActionFlag = NULL;
(0062) # define SFP_WAIT_FOR_FRAME_HEAD    SFP_ACTION_FLAG.BIT0
(0063) # define SFP_WAIT_FOR_FRAME_SIZE    SFP_ACTION_FLAG.BIT1
(0064) # define SFP_WAIT_FOR_ALL_DATA      SFP_ACTION_FLAG.BIT2
(0065) 
(0066) 
(0067) /********************
(0068) *  用户变量类型定义 *
(0069) ********************/
(0070) 
(0071) /********************
(0072) *    结构体定义区   *
(0073) ********************/
(0074) 
(0075) /********************
(0076) *   模块函数声明区  *
(0077) ********************/
(0078) static void SFP_Check_Frames(SERIAL_FRAME_PROCESS *pSFP);
(0079) 
(0080) /********************
(0081) *   全局函数声明区  *
(0082) ********************/
(0083) void Serial_Frame_Process(SERIAL_FRAME_PROCESS *pSFP);
(0084) BOOL SFP_NULL_Output_Data_Function(uint8 cData);
(0085) BOOL SFP_NULL_Input_Data_Function(uint8 *pData);
(0086) BOOL SFP_NULL_Peek_Data_Function(uint8 *pData);
(0087) BOOL SPF_Send_MSG(SERIAL_FRAME_PROCESS *pSFP,
(0088)                   uint8 cCMD,uint8 *pMSG,uint8 Length);
(0089) /********************
(0090) *   模块变量声明区  *
(0091) ********************/
(0092) 
(0093) /********************
(0094) *   全局变量声明区  *
(0095) ********************/
(0096) 
(0097) /***********************************************************
(0098) *   函数说明:数据输出空函数                               *
(0099) *   输入:    数据                                         *
(0100) *   输出:    FALSE                                        *
(0101) *   调用函数:无                                           *
(0102) ***********************************************************/
(0103) BOOL SFP_NULL_Output_Data_Function(uint8 cData)
(0104) {
(0105)     uint8 *p = &cData;
     19E 01CE      MOVW	R24,R28
     19F 9602      ADIW	R24,2
     1A0 015C      MOVW	R10,R24
(0106)     
(0107)     return FALSE;
     1A1 2700      CLR	R16
     1A2 90B9      LD	R11,Y+
     1A3 90A9      LD	R10,Y+
     1A4 9622      ADIW	R28,2
     1A5 9508      RET
(0108) }
(0109) 
(0110) /***********************************************************
(0111) *   函数说明:数据输入空函数                               *
(0112) *   输入:    指针                                         *
(0113) *   输出:    FALSE                                        *
(0114) *   调用函数:无                                           *
(0115) ***********************************************************/
(0116) BOOL SFP_NULL_Input_Data_Function(uint8 *pData)
(0117) {
(0118)     (*pData) = NULL;
_SFP_NULL_Input_Data_Function:
  pData                --> R16
     1A6 2422      CLR	R2
     1A7 01F8      MOVW	R30,R16
     1A8 8220      STD	Z+0,R2
(0119)     
(0120)     return FALSE;
     1A9 2700      CLR	R16
     1AA 9508      RET
(0121) }
(0122) 
(0123) /***********************************************************
(0124) *   函数说明:数据察看空函数                               *
(0125) *   输入:    指针                                         *
(0126) *   输出:    FALSE                                        *
(0127) *   调用函数:无                                           *
(0128) ***********************************************************/
(0129) BOOL SFP_NULL_Peek_Data_Function(uint8 *pData)
(0130) {
(0131)     (*pData) = NULL;
_SFP_NULL_Peek_Data_Function:
  pData                --> R16
     1AB 2422      CLR	R2
     1AC 01F8      MOVW	R30,R16
     1AD 8220      STD	Z+0,R2
(0132)     
(0133)     return FALSE;
     1AE 2700      CLR	R16
     1AF 9508      RET
_Serial_Frame_Process:
  cTempData            --> Y,+4
  pQueue               --> R22
  cTempActionFlag      --> Y,+3
  pSFP                 --> R20
     1B0 D8C7      RCALL	push_xgsetF00C
     1B1 01A8      MOVW	R20,R16
     1B2 9725      SBIW	R28,5
(0134) }
(0135) 
(0136) 
(0137) /***********************************************************
(0138) *   函数说明:串行通讯数据帧处理函数                       *
(0139) *   输入:    要处理的数据帧结构指针                       *
(0140) *   输出:    无                                           *
(0141) *   调用函数:SFP_Check_Frames()                           *
(0142) ***********************************************************/
(0143) void Serial_Frame_Process(SERIAL_FRAME_PROCESS *pSFP)
(0144) {
(0145) 
(0146)     uint8 cTempActionFlag = pSFP->cActionFlag;
     1B3 01FA      MOVW	R30,R20
     1B4 A022      LDD	R2,Z+34
     1B5 822B      STD	Y+3,R2
(0147)     uint8 cTempData = 0;
     1B6 2422      CLR	R2
     1B7 822C      STD	Y+4,R2
(0148)     ADT_QUEUE *pQueue = &(pSFP->FrameBuffer);
     1B8 01BF      MOVW	R22,R30
(0149) 
(0150)     
(0151)     if (!(*(pSFP->InputDataFunc))(&cTempData))              //利用函数指针调用函数
     1B9 018E      MOVW	R16,R28
     1BA 5F0C      SUBI	R16,0xFC
     1BB 4F1F      SBCI	R17,0xFF
     1BC 8DA4      LDD	R26,Z+28
     1BD 8DB5      LDD	R27,Z+29
     1BE 01FD      MOVW	R30,R26
     1BF D8D8      RCALL	xicall
     1C0 2300      TST	R16
     1C1 F409      BNE	0x01C3
(0152)     {
(0153)         return ;
     1C2 C0CA      RJMP	0x028D
(0154)     }
(0155)     
(0156)     if (cTempActionFlag == NULL)
     1C3 802B      LDD	R2,Y+3
     1C4 2022      TST	R2
     1C5 F439      BNE	0x01CD
(0157)     {
(0158)         pSFP->cXORCheck = 0;
     1C6 2422      CLR	R2
     1C7 01FA      MOVW	R30,R20
     1C8 A223      STD	Z+35,R2
(0159)         pSFP->cFrameSize = 0;
     1C9 A224      STD	Z+36,R2
(0160)         SFP_WAIT_FOR_FRAME_HEAD = TRUE;
     1CA 818B      LDD	R24,Y+3
     1CB 6081      ORI	R24,1
     1CC 838B      STD	Y+3,R24
(0161)     }
(0162)     
(0163)     if (SFP_WAIT_FOR_FRAME_HEAD)
     1CD 01FE      MOVW	R30,R28
     1CE 8183      LDD	R24,Z+3
     1CF 7081      ANDI	R24,1
     1D0 F409      BNE	0x01D2
     1D1 C024      RJMP	0x01F6
(0164)     {
(0165)         if (cTempData == pSFP->cHeadByte)
     1D2 01FA      MOVW	R30,R20
     1D3 8C20      LDD	R2,Z+24
     1D4 803C      LDD	R3,Y+4
     1D5 1432      CP	R3,R2
     1D6 F009      BEQ	0x01D8
     1D7 C0B5      RJMP	0x028D
(0166)         {
(0167)             ADT_ADD_DATA_TO_QUEUE((*pQueue),cTempData);
     1D8 2D23      MOV	R18,R3
     1D9 018B      MOVW	R16,R22
     1DA 01CB      MOVW	R24,R22
     1DB 960A      ADIW	R24,0xA
     1DC 01FC      MOVW	R30,R24
     1DD 81A0      LDD	R26,Z+0
     1DE 81B1      LDD	R27,Z+1
     1DF 01FD      MOVW	R30,R26
     1E0 D8B7      RCALL	xicall
(0168)             
(0169)             
(0170)             if (!(pSFP->cFixLength))
     1E1 01FA      MOVW	R30,R20
     1E2 8C22      LDD	R2,Z+26
     1E3 2022      TST	R2
     1E4 F421      BNE	0x01E9
(0171)             {
(0172)                 //变长数据帧
(0173)                 SFP_WAIT_FOR_FRAME_SIZE = TRUE;
     1E5 818B      LDD	R24,Y+3
     1E6 6082      ORI	R24,2
     1E7 838B      STD	Y+3,R24
(0174)             }
     1E8 C006      RJMP	0x01EF
(0175)             else
(0176)             {
(0177)                 //固定长度的数据帧
(0178)                 SFP_WAIT_FOR_ALL_DATA = TRUE;
     1E9 818B      LDD	R24,Y+3
     1EA 6084      ORI	R24,4
     1EB 838B      STD	Y+3,R24
(0179)                 pSFP->cFrameSize = pSFP->cFixLength;
     1EC 01FA      MOVW	R30,R20
     1ED 8C22      LDD	R2,Z+26
     1EE A224      STD	Z+36,R2
(0180)             }
(0181)             
(0182)             SFP_WAIT_FOR_FRAME_HEAD = FALSE;
     1EF 818B      LDD	R24,Y+3
     1F0 7F8E      ANDI	R24,0xFE
     1F1 838B      STD	Y+3,R24
(0183)             pSFP->cActionFlag = cTempActionFlag;
     1F2 2E28      MOV	R2,R24
     1F3 01FA      MOVW	R30,R20
     1F4 A222      STD	Z+34,R2
(0184)             
(0185)         }
(0186)         
(0187)         return ;
     1F5 C097      RJMP	0x028D
(0188)     }
(0189)     
(0190)     if (SFP_WAIT_FOR_FRAME_SIZE)
     1F6 01FE      MOVW	R30,R28
     1F7 8183      LDD	R24,Z+3
     1F8 9586      LSR	R24
     1F9 7081      ANDI	R24,1
     1FA F409      BNE	0x01FC
     1FB C02E      RJMP	0x022A
(0191)     {
(0192)         
(0193)         if (cTempData > (pQueue->nSize))
     1FC 01FB      MOVW	R30,R22
     1FD 8022      LDD	R2,Z+2
     1FE 8033      LDD	R3,Z+3
     1FF 804C      LDD	R4,Y+4
     200 2455      CLR	R5
     201 1424      CP	R2,R4
     202 0435      CPC	R3,R5
     203 F450      BCC	0x020E
(0194)         {
(0195)             //错误的数据帧长度
(0196)            
(0197)             ADT_QUEUE_LET_EMPTY((*pQueue))                  //清空队列
     204 2422      CLR	R2
     205 2433      CLR	R3
     206 8235      STD	Z+5,R3
     207 8224      STD	Z+4,R2
     208 8237      STD	Z+7,R3
     209 8226      STD	Z+6,R2
     20A 8631      STD	Z+9,R3
     20B 8620      STD	Z+8,R2
(0198) 
(0199)             SFP_STOP_ALL_ACTION
     20C 822B      STD	Y+3,R2
(0200)         }
     20D C018      RJMP	0x0226
(0201)         else
(0202)         {
(0203)             //有效的数据帧长度
(0204)             pSFP->cFrameSize = cTempData;                   //更新数据帧长度信息
     20E 802C      LDD	R2,Y+4
     20F 01FA      MOVW	R30,R20
     210 A224      STD	Z+36,R2
(0205)             pSFP->cXORCheck ^= cTempData;
     211 01CF      MOVW	R24,R30
     212 9683      ADIW	R24,0x23
     213 01FC      MOVW	R30,R24
     214 8030      LDD	R3,Z+0
     215 2432      EOR	R3,R2
     216 8230      STD	Z+0,R3
(0206)             
(0207)             ADT_ADD_DATA_TO_QUEUE((*pQueue),cTempData);     //将该信息添加到缓冲区
     217 2D22      MOV	R18,R2
     218 018B      MOVW	R16,R22
     219 01CB      MOVW	R24,R22
     21A 960A      ADIW	R24,0xA
     21B 015C      MOVW	R10,R24
     21C 01FC      MOVW	R30,R24
     21D 81A0      LDD	R26,Z+0
     21E 81B1      LDD	R27,Z+1
     21F 01FD      MOVW	R30,R26
     220 D877      RCALL	xicall
(0208)             
(0209)             
(0210)             SFP_WAIT_FOR_ALL_DATA = TRUE;

⌨️ 快捷键说明

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