作者wayn12342000 (阿菁)
看板ASM
标题Re: [问题] C++求救!不知道问题在哪里!!
时间Sat Jul 18 22:32:53 2009
※ 引述《wayn12342000 (阿菁)》之铭言:
: ※ [本文转录自 C_and_CPP 看板]
: 作者: wayn12342000 (阿菁) 看板: C_and_CPP
: 标题: [问题] C++求救!不知道问题在哪里!!
: 时间: Sat Jul 18 21:40:13 2009
: 目前正在进行专题,
: 遇到一个很奇怪的问题,
: 我描述一下情况:
: 目前从学长那继承一个由伺服马达控制的机器人,
: 原有的控制方式是组语,
: 後来改用C控制,
: 但发生副程式无法动作的情况,
: 下面是控制方式
: 范例(组语):
: 略...
: mov r2,#50 ;给值50
: loop0:
: mov p2,00000001;丢值进P2.0 控制motor1
: call delay15 ;延迟1.5ms(角度一)
: mov p2,00000010;丢值进P2.1 控制motor2 同时将P2.0值=0
: call delay20 ;延迟2.0ms(角度二)
: call delay200 ;延迟20ms (满足周期 驱动马达动作)
: djnz r2,loop0
: 略...
: 注:伺服马达的控制是给予一小段特定时间脉波(1.5ms 2.0ms...
: 并於满足周期後向着目标角度进行一动(视马达而定...
: 给予足够回圈就可以移至正确角度位置(r2=50...
: 简单介绍後进入正题,
: 目前写出来的C是
: 略....
: void hd1( int );宣告各部位副程式 头
: void lh2( int ); 手
: 略...
: main()
: {
: int i;
: for(i=0;i<50;i++)
: {
: hd1( 45 );要求移向的角度
: }
: for(i=0;i<50;i++)
: {
: lh2( 45 );
: }
: }
: void hd1( int angle )
: {
: p1=00000001;
: angledelay( angle );
: }
: void lh2( int angle )
: {
: p1=00000010;
: angledelay( angle );
: }
: void angledelay( int angle )
: 略...
: 问题开始!!
: 在原先测试的时候发现robot像中风一样一直抖...抖...抖...
: 转而用这个简易程式测试
: 结果发现各种交叉测试
: 1.交换马达
: 2.交换程式位置(考虑定义先後
: 3.改变输出port点
: 都无法使lh2这个副程式正常动作
: 但hd1完全正常!!!
: 但hd1完全正常!!!
: 但hd1完全正常!!!
: DEBUG到目前为止并无发现任何硬体上的错误以及软体上直接的错误
: 是有什麽隐规则被忽略掉了吗?
: 这两个副程式只差在一个叫hd1 一个叫lh2
: 但结果是天差地别
: 请问各位高手有什麽办法吗??
再次说明问题点
目前有的东西:hd1副程式 lh2副程式 P1.0 P1.1 motor1 motor2
测试一: hd1=>P1=0000 0001 motor1接到P1.0 结果 会动
lh2=>P1=0000 0010 motor2接到P1.1 结果 不会动
测试二: hd1=>P1=0000 0001 motor2接到P1.0 结果 会动
lh2=>P1=0000 0010 motor1接到P1.1 结果 不会动
测试一及测试二证实了马达没有问题
测试三: hd1=>P1=0000 0010 motor1接到P1.1 结果 会动
lh2=>P1=0000 0001 motor2接到P1.0 结果 不会动
测试四: hd1=>P1=0000 0010 motor2接到P1.1 结果 会动
lh2=>P1=0000 0001 motor1接到P1.0 结果 不会动
测试三及测试四再次证实了马达没有问题
测试一及测试三证实了接点(P1.0 P1.1)都没有问题
hd1 及 lh2 这两个副程式差别在哪里呢
答案是只有差在名称不一样而已
一样的过程 一样的宣告 只有不一样的名字
我用的是keil C 写的是C语言
跪求高手解答了!!
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 122.126.120.102
1F:推 typeotoco:那你干嘛不把ASM包进来, 改一下PORT脚就好 07/18 22:53
2F:→ typeotoco:keil c 也是可以连ASM档或是写组语阿 07/18 22:54
3F:→ wayn12342000:上一届的档案是一个步骤一个步骤写, 颇冗长,之後还要 07/18 22:57
4F:→ wayn12342000:加进无线传输以及数个感测器,所以才使用C ,不过谢谢 07/18 22:57
5F:推 WolfLord:我觉得是他的驱动方法有问题,SERVO不是这样驱动的 XD 07/18 22:58
6F:→ wayn12342000:你,我会去试试看的,说不定单纯用ASM控制机器人是最好 07/18 22:58
7F:→ wayn12342000:的方式. 谢谢 07/18 22:58
8F:→ WolfLord:你最好把马达的资料好好研读,仔细看前人的程式 07/18 22:59
9F:→ wayn12342000:可是上一届的动做很顺畅@@" 也是用同样的方式驱动 07/18 22:59
10F:→ wayn12342000:PWM(脉波宽度调变)? 07/18 22:59
11F:→ wayn12342000:恩 我明天会好好努力 然後再来请教你 07/18 23:00
12F:推 utility:新手用c的话.最好先拿掉最佳化的设定..另外马达除了接你的 07/18 23:22
13F:→ utility:程式输出的地方..是不是也有接其它的东西.如电源等等. 07/18 23:23
14F:→ utility:看有没有过电流或什麽保护..举例而已. 07/18 23:24
15F:推 m490521:你使用的应该是伺服舵机吧? 模型用的那种 07/19 00:11
16F:→ m490521:波形我记得要同时驱动两的话 不是这样送的 07/19 00:12
17F:推 WolfLord:伺服舵机的话那波形可复杂了 XDDD 07/19 00:13
18F:推 m490521:嗯嗯 两个以上如果要用程式延迟的方式 有点小麻烦 07/19 00:16
19F:→ m490521:通常是接到mcu的pwm脚 或是搭配计时器去弄 07/19 00:17
20F:→ m490521:如果转的角度每次都是固定的话 也是可以写死啦 XD~ 07/19 00:18
21F:推 WolfLord:也还好啦! 善用TIMER就OK了 ^^;; 07/19 00:56