看板 ASM 關於我們 聯絡資訊
※ 引述《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
typeotoco:那你幹嘛不把ASM包進來, 改一下PORT腳就好 07/18 22:53
typeotoco:keil c 也是可以連ASM檔或是寫組語阿 07/18 22:54
wayn12342000:上一屆的檔案是一個步驟一個步驟寫, 頗冗長,之後還要 07/18 22:57
wayn12342000:加進無線傳輸以及數個感測器,所以才使用C ,不過謝謝 07/18 22:57
WolfLord:我覺得是他的驅動方法有問題,SERVO不是這樣驅動的 XD 07/18 22:58
wayn12342000:你,我會去試試看的,說不定單純用ASM控制機器人是最好 07/18 22:58
wayn12342000:的方式. 謝謝 07/18 22:58
WolfLord:你最好把馬達的資料好好研讀,仔細看前人的程式 07/18 22:59
wayn12342000:可是上一屆的動做很順暢@@" 也是用同樣的方式驅動 07/18 22:59
wayn12342000:PWM(脈波寬度調變)? 07/18 22:59
wayn12342000:恩 我明天會好好努力 然後再來請教你 07/18 23:00
utility:新手用c的話.最好先拿掉最佳化的設定..另外馬達除了接你的 07/18 23:22
utility:程式輸出的地方..是不是也有接其它的東西.如電源等等. 07/18 23:23
utility:看有沒有過電流或什麼保護..舉例而已. 07/18 23:24
m490521:你使用的應該是伺服舵機吧? 模型用的那種 07/19 00:11
m490521:波形我記得要同時驅動兩的話 不是這樣送的 07/19 00:12
WolfLord:伺服舵機的話那波形可複雜了 XDDD 07/19 00:13
m490521:嗯嗯 兩個以上如果要用程式延遲的方式 有點小麻煩 07/19 00:16
m490521:通常是接到mcu的pwm腳 或是搭配計時器去弄 07/19 00:17
m490521:如果轉的角度每次都是固定的話 也是可以寫死啦 XD~ 07/19 00:18
WolfLord:也還好啦! 善用TIMER就OK了 ^^;; 07/19 00:56