📄 app.lis
字号:
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 + -