作者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