Re: [問題] C++求救!不知道問題在哪裡!!

看板ASM (組合語言)作者 (阿菁)時間15年前 (2009/07/18 22:32), 編輯推噓7(7014)
留言21則, 5人參與, 最新討論串3/4 (看更多)
※ 引述《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

07/18 22:53, , 1F
那你幹嘛不把ASM包進來, 改一下PORT腳就好
07/18 22:53, 1F

07/18 22:54, , 2F
keil c 也是可以連ASM檔或是寫組語阿
07/18 22:54, 2F

07/18 22:57, , 3F
上一屆的檔案是一個步驟一個步驟寫, 頗冗長,之後還要
07/18 22:57, 3F

07/18 22:57, , 4F
加進無線傳輸以及數個感測器,所以才使用C ,不過謝謝
07/18 22:57, 4F

07/18 22:58, , 5F
我覺得是他的驅動方法有問題,SERVO不是這樣驅動的 XD
07/18 22:58, 5F

07/18 22:58, , 6F
你,我會去試試看的,說不定單純用ASM控制機器人是最好
07/18 22:58, 6F

07/18 22:58, , 7F
的方式. 謝謝
07/18 22:58, 7F

07/18 22:59, , 8F
你最好把馬達的資料好好研讀,仔細看前人的程式
07/18 22:59, 8F

07/18 22:59, , 9F
可是上一屆的動做很順暢@@" 也是用同樣的方式驅動
07/18 22:59, 9F

07/18 22:59, , 10F
PWM(脈波寬度調變)?
07/18 22:59, 10F

07/18 23:00, , 11F
恩 我明天會好好努力 然後再來請教你
07/18 23:00, 11F

07/18 23:22, , 12F
新手用c的話.最好先拿掉最佳化的設定..另外馬達除了接你的
07/18 23:22, 12F

07/18 23:23, , 13F
程式輸出的地方..是不是也有接其它的東西.如電源等等.
07/18 23:23, 13F

07/18 23:24, , 14F
看有沒有過電流或什麼保護..舉例而已.
07/18 23:24, 14F

07/19 00:11, , 15F
你使用的應該是伺服舵機吧? 模型用的那種
07/19 00:11, 15F

07/19 00:12, , 16F
波形我記得要同時驅動兩的話 不是這樣送的
07/19 00:12, 16F

07/19 00:13, , 17F
伺服舵機的話那波形可複雜了 XDDD
07/19 00:13, 17F

07/19 00:16, , 18F
嗯嗯 兩個以上如果要用程式延遲的方式 有點小麻煩
07/19 00:16, 18F

07/19 00:17, , 19F
通常是接到mcu的pwm腳 或是搭配計時器去弄
07/19 00:17, 19F

07/19 00:18, , 20F
如果轉的角度每次都是固定的話 也是可以寫死啦 XD~
07/19 00:18, 20F

07/19 00:56, , 21F
也還好啦! 善用TIMER就OK了 ^^;;
07/19 00:56, 21F
文章代碼(AID): #1AOTqMVA (ASM)
文章代碼(AID): #1AOTqMVA (ASM)