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

📄 app.lis

📁 易于atmage128和ucos的手动机器人控制程序。
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 0002           ; OS_STK  motor_move_m_Stk[OS_TASK_STK_SIZE];                     //左行进电机堆zai
 0002           ; OS_STK  motor_move_t_Stk[OS_TASK_STK_SIZE];                     //左行进电机堆zai
 0002           ; 
 0002           ; /*
 0002           ; **************************************************************************************************************
 0002           ; *                                           FUNCTION PROTOTYPES
 0002           ; **************************************************************************************************************
 0002           ; */
 0002           ; /**********************************************任务**********************************/
 0002           ;      
 0002           ; static void  Task_Start(void *p_arg);                       //初始任务
 0002           ; static void  Task_time_show(void *p_arg);
 0002           ; static void  motor_move_l(void *p_arg);                                 //左行进电机任务
 0002           ; static void  motor_move_r(void *p_arg);                                 //右行进电机任务
 0002           ; static void  motor_move_m(void *p_arg);                                 //中行进电机任务
 0002           ; static void  motor_move_t(void *p_arg);                                 //中行进电机任务
 0002           ; 
 0002           ; 
 0002           ; /**********************************************其他函数**********************************/
 0002           ; static void  Task_action(void);                                         //运动任务
 0002           ; static void  reset_action(void);                                    //复位任务
 0002           ; static void  Task_cfg(void);                                    //机器人配置
 0002           ; static void  IO_Init(void);                                                 //IO初始化
 0002           ; void  main(void);
 0002           ; void  LED_send_16b(unsigned int LED_message);           //LED发送命令函数               
 0002           ; void  intit_LED(void);                                                                  //LED初始化函数
 0002           ; void  LED_show(void);         
 0002           ; void  psin(void);                                                                       //给ps发送讯号
 0002           ; void  psout(int j);                                                                     //接收ps讯号
 0002           ; void  scan(void);                                                                       //手柄扫描    
 0002           ; void  data_save(void);                                                                  //EEprom 存数据
 0002           ; void  data_read(void);                                                                  //EEPROM读数据
 0002           ; void Init_TC(void);
 0002           ; 
 0002           ; unsigned char EEPROMread(int Address);                                  //EEPROM读函数
 0002           ; int EEPROMwrite(int Address,unsigned char Data);        //EEPROM写函数
 0002           ;       
 0002           ; /*********************************************邮箱**************************/
 0002           ; 
 0002           ; OS_EVENT *time_Box;                                                                     //时间信号 邮箱指针
 0002           ; OS_EVENT *motor_l_Box;                                                                  //左行进电机 驱动邮箱指针
 0002           ; OS_EVENT *motor_r_Box;                                                                  //右行进电机 驱动邮箱指针
 0002           ; OS_EVENT *motor_m_Box;                                                                  //中行进电机 驱动邮箱指针
 0002           ; OS_EVENT *motor_t_Box;                                                                  //中行进电机 驱动邮箱指针
 0002           ; 
 0002           ; int *time_key_ptr;                                      //动作信号发送消息指针 时间消息指针...
 0002           ; int *time_key,*motor_l_key,*motor_r_key,
 0002           ; *motor_m_key,*motor_t_key;                                                      //动作信号接收消息指针 时间消息指针....
 0002           ; int time_key_msg=1,motor_l_msg,motor_r_msg,
 0002           ; motor_m_msg,motor_t_msg;                                                         //动作信号 时间信号 底盘运动邮箱 发送信号
 0002           ; char err;                                                                       //错误信号存储
 0002           ;                        
 0002           ; /*******************************************全局变量*********************************/
 0002           ; INT8U LED_reg[8][2]={{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}};
 0002           ; unsigned char tx_chr;                                                           //tx_chr发送的字符
 0002           ; unsigned char rx_chr[3][8][2];                                                  //rx_chr接收的字符,3个,每个记录一个bit位, 0为上次键值,1为本次键值
 0002           ; unsigned char rx_chr_b[3][2];                                                   //接受字符,3个,低位先行,每个8bit
 0002           ; unsigned int  robot_model=0;                                            // robot_model机器人工作模式,0正常模式,1记忆模式,2回放模式,3配置模式,默认值为0,robot_model_tmp模式值临时存储值
 0002           ; unsigned int  data_ptr=0x0001;                                                  //数据存储地址指针
 0002           ; INT8U robot_model_key=0,robot_model_tmp=0;                              //模式切换钥匙
 0002           ; INT16U time_count=0,                                    //舵机控制脉冲信号计时
 0002           ; robot_model_dly=0,                                              //测试模式下的延时计数
 0002           ; auto_s_2=0,auto_x_2=0,                                          //自动提升 计数器
 0002           ; //手抓参数配置--------
 0002           ; hand_cy[4]={0,0,0,0},                           //存储手抓运动角度数值
 0002           ; hand_st_0[4]={4,7,4,7},hand_st_1[4]={6,5,6,4},hand_st_2[4]={5,6,5,6},hand_st_3[4]={4,7,4,7},hand_whe[4]={2,2,2,2}, //hand_st_1 打开电源后手抓的位置  hand_st_2 计时开始后手抓的位置    hand_st_3闭合后位置   hand_whe的位置 0 开 1 半开 2 闭和        3 半开                                            //hand_cy手抓位置信号 对应手抓0-4  控制矩形波高电平时间 取值 2-10 dly_time 慢起时间 秒 1 
 0002           ; 
 0002           ;   
 0002           ; 
 0002           ; //提升电机,行程开关相关-------------------
 0002           ; contact_t[4][2]={{0,0},{0,0},{0,0},{0,0}};  // 0 1 2 3 行程开关的值  上次值 0  本次值1
 0002           ; t_model=0;  //
 0002           ; 
 0002           ; 
 0002           ; 
 0002           ; //电机的速度值及转向,分别对应    up3,dawnx,  up x, dawn3,   up , down ,   3  ,  x   ,左平移,右平移  建议设为 03f0以下  03ff可能会异常
 0002           ; INT16U speed[2][2][3][13]={{{{0x0180,0x1180,0x0180,0x1180,0x0100,0x1100,0x0000,0x0000,0x0070,0x1070,0x0000,0x03ff,0x13ff},//正常模式,第一步速度,左电机
 0002           ;                              {0x0180,0x1180,0x1180,0x0180,0x0000,0x0000,0x0100,0x1100,0x1070,0x0070,0x0000,0x0000,0x0000},//正常模式,第一步速度,右电机
 0002           ;                                                    {0x0000,0x0000,0x0080,0x1080,0x0080,0x1080,0x1080,0x0080,0x0250,0x1250,0x0000,0x0000,0x0000}},//正常模式,第一步速度,中电机
 0002           ;                                                       
 0002           ;                                                       {{0x0180,0x1180,0x0180,0x1180,0x0100,0x1100,0x0000,0x0000,0x0070,0x1070,0x0000,0x03ff,0x13ff},//正常模式,第二步速度,左电机
 0002           ;                              {0x0180,0x1180,0x1180,0x0180,0x0000,0x0000,0x0100,0x1100,0x1070,0x0070,0x0000,0x0000,0x0000},//正常模式,第二步速度,右电机
 0002           ;                                                    {0x0000,0x0000,0x0080,0x1080,0x0080,0x1080,0x1080,0x0080,0x0250,0x1250,0x0000,0x0000,0x0000}},//正常模式,第二步速度,中电机
 0002           ;                                                       
 0002           ;                                                       },
 0002           ;                                                  {{{0x0180,0x1180,0x0250,0x1250,0x0250,0x1250,0x0000,0x0000,0x0070,0x1070,0x0000,0x03ff,0x13ff},//提速模式,第一步速度,左电机
 0002           ;                              {0x0180,0x1180,0x1250,0x0250,0x0000,0x0000,0x0250,0x1250,0x1070,0x0070,0x0000,0x0000,0x0000},//提速模式,第一步速度,右电机
 0002           ;                                                    {0x0000,0x0000,0x0080,0x1080,0x0080,0x1080,0x1080,0x0080,0x0250,0x1250,0x0000,0x0000,0x0000}},//提速模式,第一步速度,中电机
 0002           ;                                                       
 0002           ;                                                       {{0x03f0,0x13f0,0x0250,0x1250,0x0250,0x1250,0x0000,0x0000,0x0080,0x1080,0x0000,0x03ff,0x13ff},//高速模式,第二步速度,左电机
 0002           ;                              {0x03d0,0x13d0,0x1250,0x0250,0x0000,0x0000,0x0250,0x1250,0x1080,0x0080,0x0000,0x0000,0x0000},//高速模式,第二步速度,右电机
 0002           ;                                                    {0x0000,0x0000,0x0080,0x1080,0x0080,0x1080,0x1080,0x0080,0x02a0,0x12a0,0x0000,0x0000,0x0000}},//高速模式,第二步速度,中电机
 0002           ;                                                       
 0002           ;                                                       }};
 0002           ; //电机启动方式,分别对应  up3,dawnx, up x, dawn3, up , down , 3 ,  x  ,左平移,右平移,停 0方式立即加电,1方式逐步加电
 0002           ; INT8U  heading[2][2][13]={{{0,     0,    0,     0,   0,     0,  0,    0,     0,     0 ,0 ,0,0},    //正常模式,第一步,启动模式
 0002           ;                                                  {0,     0,    0,     0,   0,     0,  0,    0,     0,     0 ,0 ,0,0}},   //正常模式,第二步,启动模式
 0002           ;                                                 
 0002           ;                                                 {{2,     2,    0,     0,   0,     0,  0,    0,     0,     0 ,0 ,0,0},    //高速模式,第一步,启动模式
 0002           ;                                                  {2,     2,    0,     0,   1,     1,  0,    0,     0,     0 ,0 ,0,0}}};   //高速模式,第二步,启动模式
 0002           ; //启动过程时间,分别对应   up3,dawnx, up x, dawn3, up , down , 3 ,  x  ,左平移,右平移,单位是秒,只可取整数,最好不要取0
 0002           ; INT8U dly_time[2][2][13]={{{1,     1,    1,     1,   1,     1,  1,    1,     1,     1  ,1 ,1 ,1},    //正常模式,第一步
 0002           ;                                                  {1,     1,    1,     1,   1,     1,  1,    1,     1,     1  ,1 ,1 ,1}},   //正常模式,第二步
 0002           ;                                                 
 0002           ;                                                 {{1,     1,    1,     1,   1,     1,  1,    1,     1,     1  ,1 ,1 ,1},          //高速模式,第一步,
 0002           ;                                                  {1,     1,    1,     1,   2,    2,  1,    1,     1,     1   ,1 ,1 ,1}}};   //高速模式,第二步,
 0002           ; 
 0002           ; INT8U speed_model=1;     //默认速度模式
 0002           ; /*
 0002           ; **************************************************************************************************************
 0002           ; *                                                MAIN
 0002           ; *
 0002           ; * Note(s): 1) You SHOULD use OS_TASK_STK_SIZE (see OS_CFG.H) when setting OSTaskStkSize prior to calling 
 0002           ; *             OSInit() because OS_TASK_IDLE_STK_SIZE and OS_TASK_STAT_STK_SIZE are set to this value in
 0002           ; *             OS_CFG.H.
 0002           ; **************************************************************************************************************
 0002           ; */
 0002           ; 
 0002           ; void  main (void)
 0002           ; {
 0002           ;       OSTaskStkSize     = OS_TASK_STK_SIZE;             //Setup the total stack size                   
 0002 80E0              ldi R24,256
 0004 91E0              ldi R25,1
 0006 90930100          sts _OSTaskStkSize+1,R25
 000A 80930000          sts _OSTaskStkSize,R24
 000E           ;     OSTaskHardStkSize = OS_TASK_HARD_STK_SIZE;          //Setup the hardware stack size              
 000E 80E4              ldi R24,64
 0010 90E0              ldi R25,0
 0012 90930100          sts _OSTaskHardStkSize+1,R25
 0016 80930000          sts _OSTaskHardStkSize,R24
 001A           ;     OSInit();                                           //Initialize "uC/OS-II, The Real-Time Kernel"     
 001A 0E940000          xcall _OSInit
 001E           ;       time_Box                  =OSMboxCreate((void*)0);                //建立时间消息邮箱
 001E 0027              clr R16
 0020 1127              clr R17
 0022 0E940000          xcall _OSMboxCreate
 0026 10935500          sts _time_Box+1,R17
 002A 00935400          sts _time_Box,R16
 002E           ;       motor_l_Box               =OSMboxCreate((void*)0);                //建立左电机消息邮箱
 002E 0027              clr R16
 0030 1127              clr R17
 0032 0E940000          xcall _OSMboxCreate
 0036 10935300          sts _motor_l_Box+1,R17
 003A 00935200          sts _motor_l_Box,R16
 003E           ;       motor_r_Box               =OSMboxCreate((void*)0);                //建立右电机消息邮箱
 003E 0027              clr R16
 0040 1127              clr R17
 0042 0E940000          xcall _OSMboxCreate
 0046 10935100          sts _motor_r_Box+1,R17
 004A 00935000          sts _motor_r_Box,R16
 004E           ;       motor_m_Box               =OSMboxCreate((void*)0);                //建立中电机消息邮箱
 004E 0027              clr R16
 0050 1127              clr R17
 0052 0E940000          xcall _OSMboxCreate
 0056 10934F00          sts _motor_m_Box+1,R17
 005A 00934E00          sts _motor_m_Box,R16
 005E           ;       motor_t_Box               =OSMboxCreate((void*)0);                //建立中电机消息邮箱
 005E 0027              clr R16
 0060 1127              clr R17
 0062 0E940000          xcall _OSMboxCreate
 0066 10934D00          sts _motor_t_Box+1,R17
 006A 00934C00          sts _motor_t_Box,R16
 006E           ;       
 006E           ;       OSTaskCreate(Task_Start, (void *)0, (OS_STK *)&TaskStartStk[OS_TASK_STK_SIZE - 1], 0);
 006E 2224              clr R2
 0070 2A82              std y+2,R2
 0072 80E0              ldi R24,<_TaskStartStk+255
 0074 90E0              ldi R25,>_TaskStartStk+255
 0076 8883              std y+0,R24
 0078 9983              std y+1,R25
 007A 2227              clr R18
 007C 3327              clr R19
 007E 00E0              ldi R16,<PL_Task_Start
 0080 10E0              ldi R17,>PL_Task_Start
 0082 0E940000          xcall _OSTaskCreate
 0086           ;       OSStart();                                        //Start multitasking (i.e. give control to uC/OS-II) 
 0086 0E940000          xcall _OSStart
 008A           ; }
 008A           L1:
 008A 2396              adiw R28,3
 008C                   .dbline 0 ; func end
 008C 0895              ret
 008E           ;   cpu_usage_10 -> R20,R21
 008E           ;    cpu_usage_1 -> R20,R21
 008E           ;          p_arg -> R22,R23
                        .even
 008E           _Task_Start:
 008E 0E940000          xcall push_gset2
 0092 B801              movw R22,R16
 0094 2397              sbiw R28,3
 0096           ; 
 0096           ; /*
 0096           ; *********************************************************************************************************
 0096           ; *                                          STARTUP TASK
 0096           ; 起始任务,主任务
 0096           ; 手柄的扫描,模式切换,键值改变判别并给Task_action发送消息
 0096           ; *********************************************************************************************************
 0096           ; */
 0096           ; 
 0096           ; static void  Task_Start (void *p_arg)
 0096           ; {
 0096           ;     INT16S cpu_usage_1=0x0000,cpu_usage_10=0x0000;      //cpu使用百分率 个位和十位
 0096 4427              clr R20
 0098 5527              clr R21
 009A           ;     p_arg = p_arg;                                    //Prevent compiler warnings                         
 009A           ;       Init_TC();                                                                                //定时计数器初始化           
 009A 0E94FE08          xcall _Init_TC
 009E           ;     IO_Init();                                                  // Initialize the I/Os                            
 009E 0E94E508          xcall _IO_Init
 00A2           ;     intit_LED();                                                                        //数码管初始化
 00A2 0E94620A          xcall _intit_LED
 00A6           ;       OSStatInit();                                                                     //任务统计初始化      
 00A6 0E940000          xcall _OSStatInit
 00AA           ;       OSTaskCreate(Task_time_show, (void *)0, (OS_STK *)&Task_time_show_Stk[OS_TASK_STK_SIZE - 1], 2); //创建时间显示任务 优先级2
 00AA 82E0              ldi R24,2
 00AC 8A83              std y+2,R24
 00AE 80E0              ldi R24,<_Task_time_show_Stk+255
 00B0 90E0              ldi R25,>_Task_time_show_Stk+255
 00B2 8883              std y+0,R24
 00B4 9983              std y+1,R25
 00B6 2227              clr R18
 00B8 3327              clr R19
 00BA 00E0              ldi R16,<PL_Task_time_show
 00BC 10E0              ldi R17,>PL_Task_time_show
 00BE 0E940000          xcall _OSTaskCreate
 00C2           ;       OSTaskCreate(motor_move_l, (void *)0, (OS_STK *)&motor_move_l_Stk[OS_TASK_STK_SIZE - 1], 3); //左电机行进任务 优先级3
 00C2 83E0              ldi R24,3
 00C4 8A83              std y+2,R24
 00C6 80E0              ldi R24,<_motor_move_l_Stk+255
 00C8 90E0              ldi R25,>_motor_move_l_Stk+255
 00CA 8883              std y+0,R24
 00CC 9983              std y+1,R25
 00CE 2227              clr R18
 00D0 3327              clr R19
 00D2 00E0              ldi R16,<PL_motor_move_l
 00D4 10E0              ldi R17,>PL_motor_move_l
 00D6 0E940000          xcall _OSTaskCreate
 00DA           ;       OSTaskCreate(motor_move_r, (void *)0, (OS_STK *)&motor_move_r_Stk[OS_TASK_STK_SIZE - 1], 4); //左电机行进任务 优先级3
 00DA 84E0              ldi R24,4
 00DC 8A83              std y+2,R24
 00DE 80E0              ldi R24,<_motor_move_r_Stk+255
 00E0 90E0              ldi R25,>_motor_move_r_Stk+255
 00E2 8883              std y+0,R24
 00E4 9983              std y+1,R25
 00E6 2227              clr R18
 00E8 3327              clr R19
 00EA 00E0              ldi R16,<PL_motor_move_r
 00EC 10E0              ldi R17,>PL_motor_move_r
 00EE 0E940000          xcall _OSTaskCreate
 00F2           ;       OSTaskCreate(motor_move_m, (void *)0, (OS_STK *)&motor_move_m_Stk[OS_TASK_STK_SIZE - 1], 5); //左电机行进任务 优先级3
 00F2 85E0              ldi R24,5
 00F4 8A83              std y+2,R24
 00F6 80E0              ldi R24,<_motor_move_m_Stk+255
 00F8 90E0              ldi R25,>_motor_move_m_Stk+255
 00FA 8883              std y+0,R24
 00FC 9983              std y+1,R25
 00FE 2227              clr R18
 0100 3327              clr R19
 0102 00E0              ldi R16,<PL_motor_move_m
 0104 10E0              ldi R17,>PL_motor_move_m
 0106 0E940000          xcall _OSTaskCreate
 010A           ;       OSTaskCreate(motor_move_t, (void *)0, (OS_STK *)&motor_move_t_Stk[OS_TASK_STK_SIZE - 1], 6); //左电机行进任务 优先级3
 010A 86E0              ldi R24,6
 010C 8A83              std y+2,R24
 010E 80E0              ldi R24,<_motor_move_t_Stk+255
 0110 90E0              ldi R25,>_motor_move_t_Stk+255
 0112 8883              std y+0,R24
 0114 9983              std y+1,R25
 0116 2227              clr R18
 0118 3327              clr R19
 011A 00E0              ldi R16,<PL_motor_move_t
 011C 10E0              ldi R17,>PL_motor_move_t
 011E 0E940000          xcall _OSTaskCreate
 0122           ;       //开电后手抓全开-----------
 0122           ;       hand_cy[0]=hand_st_1[0];
 0122 20903000          lds R2,_hand_st_1
 0126 30903100          lds R3,_hand_st_1+1
 012A 30922100 

⌨️ 快捷键说明

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