[問題] 被RI中斷之後就不去main的迴圈了

看板ASM (組合語言)作者 (800IM)時間12年前 (2012/08/04 22:45), 編輯推噓18(18042)
留言60則, 5人參與, 最新討論串1/1
測試了一整個晚上 想要用 UART 動態改變 PWM 值, PWM 值 是由 Timer loop 中讀取 Pin 0~3 所決定 (存放在PWM_Pin[]) UART 要傳入新 PWM 值的時候會由 RI 中斷, 但是不知道怎麼搞得,一被 RI 中斷,就再也回不去 main loop 了 我不知道 uVision 怎麼像 MSVC 一步一步地的看變數 debug, 只能從硬體動作推測程式碼實際動作 code在此 http://pastie.org/4389549 拜託各位了... Orz -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.122.167.217

08/04 23:00, , 1F
1.你怎會開IE0中斷?2.T1執行週期太短.小於PWM副程式時間
08/04 23:00, 1F
IE=0x92=1001,1010(Bin) IE.0是停用的 ※ 編輯: deo2000 來自: 140.122.167.217 (08/05 02:53) 把 PWM_PerCycle() 改寫成 Timer0 的中斷副程式,而不用垂詢,就可用UART控制Duty了 http://pastie.org/4391162 但還是有個不懂的地方.這個新程式輸出 PWM 週期應該是 10us中斷一次*10解析度=100us(Rx都沒收到東西的話) f應該是10kHz,但是實際上看電路動作,目測大約10Hz, 馬達整個抖得很厲害,直流馬達跑得像步進馬達一樣,是哪裡出問題呢? ※ 編輯: deo2000 來自: 140.122.167.217 (08/05 06:13)

08/05 15:40, , 2F
IE0是我看錯.但是 0x92的bin應該是 1001-0010
08/05 15:40, 2F

08/05 15:44, , 3F
&& buf<=0x39 .&& buf<=0x46 好像是多餘的
08/05 15:44, 3F

08/05 15:45, , 4F
buf 的計算很詭異
08/05 15:45, 4F

08/05 15:46, , 5F
0x30<=buf 應該是 >=
08/05 15:46, 5F

08/05 15:47, , 6F
重點應該是 10us中斷一次 太短.你的中斷程式一定超過10us
08/05 15:47, 6F
請問執行時間怎麼看呢? 是翻譯成組合語言後,對照原廠規格,每個指令需要1或2個機器週期嗎? ※ 編輯: deo2000 來自: 140.122.167.217 (08/05 17:20)

08/05 17:23, , 7F
你說的是一種方法.我都是用示波器看.
08/05 17:23, 7F

08/05 17:23, , 8F
其實你大約算看看就知道了.
08/05 17:23, 8F

08/05 23:32, , 9F
8051在11.059MHZ下10uS只有9個M Cycle,扣掉中斷的兩個週
08/05 23:32, 9F

08/05 23:33, , 10F
期以及反還的2個週期你只剩五個一週指令可以用喔
08/05 23:33, 10F

08/06 07:45, , 11F
1.馬達對於頻率反應並不快,你不需要這麼高的頻率
08/06 07:45, 11F

08/06 07:46, , 12F
2.你不可以用TA7279AP來驅動,因為認一端截止都會變成
08/06 07:46, 12F

08/06 07:46, , 13F
電磁煞車(只要你關閉馬達,包括PWM訊號的OFF)你發抖的
08/06 07:46, 13F

08/06 07:47, , 14F
原因是因為你的PWM變成電磁煞車。改用L298,把PWM接到
08/06 07:47, 14F

08/06 07:48, , 15F
EN 訊號去。然後停車時PWM為FULL(電磁煞車)
08/06 07:48, 15F

08/06 07:49, , 16F
任一端截止
08/06 07:49, 16F

08/06 07:52, , 17F
3.建議時鐘改22.1184,然後TH0改成0x80
08/06 07:52, 17F

08/06 07:53, , 18F
4.SERIAL(232)不要用中斷(會撞到T0)用MAIN LOOP
08/06 07:53, 18F
TA7279AP 要兩個輸入都 Hi 才會變成煞車,其他三個狀態是 正 反 空檔 目前測試結果,TA7279AP的確對PWM會有響應. 目前遇到最大的問題是:不管怎麼寫,寫出來的 PWM 頻率總是比理論上低很多 例如 200uS中斷一次*100解析度=20mS一周,但實際上一周卻有好幾秒 而且,把 PWM 中斷函式 的計時從 1~256uS 發現輸出都差不多,大約10Hz; 但是單獨用 Timer 中斷寫一個 LED 閃爍程式卻沒錯誤. 我觀察到的抖動原因,認為是頻率過低,而不是煞車; 因為我同時把訊號輸出到 P0 和 P1,一個馬達,另一個LED, 從 LED 觀測訊號可以避掉馬達的一些效應. 至於你建議的方法1.3.4.我會試看看 最近為了這個身心俱疲,找了一堆書,發現寫的應用例子都差不多,而且PWM部分很淺 ※ 編輯: deo2000 來自: 140.122.167.217 (08/06 08:41)

08/06 08:39, , 19F
TA7279 沒有高阻抗狀態,不管你拉LOW或HIGH只要兩端一樣
08/06 08:39, 19F

08/06 08:39, , 20F
都是電磁煞車狀態
08/06 08:39, 20F
剛剛看datasheet確認是有 http://pdf1.alldatasheet.com/datasheet-pdf/view/31270/TOSHIBA/TA7279AP.html page 4 ※ 編輯: deo2000 來自: 140.122.167.217 (08/06 08:44)

08/06 08:48, , 21F
那你就繼續用吧,不過你如果堅持要用TA7279你就得繼續跟
08/06 08:48, 21F

08/06 08:49, , 22F
MCU的指令速度跟頻率格鬥,而且也沒辦法使用硬體PWM
08/06 08:49, 22F
照你說的,拿掉 interrupt 4 之後,預期的頻率就出來了! ※ 編輯: deo2000 來自: 140.122.167.217 (08/06 08:52)

08/06 08:55, , 23F
@所以,結果就是你中斷打架,彼此吃掉對方的CPU週期嘛
08/06 08:55, 23F

08/06 08:57, , 24F
你要使用TA7279你的中斷內IO動作就多,不要期待頻率太高
08/06 08:57, 24F

08/06 08:57, , 25F
不然CPU跑不完中斷你就等著堆疊大錯亂 XDD
08/06 08:57, 25F

08/06 09:02, , 26F
怕中斷打架的話 可以考慮硬體PWM的MCU
08/06 09:02, 26F

08/06 10:14, , 27F
如果你堅持目前架構.問題就在你的中斷副程式太肥了
08/06 10:14, 27F

08/06 17:44, , 28F
他的硬體架構要用硬體PWM恐怕問題還很大哩 :P
08/06 17:44, 28F
剛剛看 datasheet,L298似乎邏輯較簡單,對PWM響應會比較好? ※ 編輯: deo2000 來自: 140.122.167.217 (08/06 18:22)

08/06 20:48, , 29F
因為他可以PWM是PWM,方向是方向。所以你產生PWM的中斷
08/06 20:48, 29F

08/06 20:49, , 30F
函式就可以精簡。中斷函式精簡你就比較不用跟CPU的指令
08/06 20:49, 30F

08/06 20:51, , 31F
週期葛葛纏,剪不斷理還亂。而且L298還有提供過載檢知,
08/06 20:51, 31F

08/06 20:51, , 32F
你的驅動電路可以簡單的做得更完善。
08/06 20:51, 32F

08/06 20:54, , 33F
你想用硬體PWM,硬體的PWM也是單獨輸出,你方向跟PWM還得
08/06 20:54, 33F

08/06 20:55, , 34F
做外部電路整合,單靠TA7279你是無法整合硬體PWM產生器的
08/06 20:55, 34F

08/06 23:55, , 35F
TA7279比L298簡單也更適合PWM, 只是power小
08/06 23:55, 35F
Power小沒關係,負載只有webcam. 可以問一下,為什麼更適合PWM呢? 我看TA7279的 input 到 H-橋 中間還有一塊未知電路

08/07 00:14, , 36F
你要靠不段變換輸出狀態嗎? 還是外接一個電源控制晶體?
08/07 00:14, 36F
本來有想過用PWM接 P-MOS 或 PNP,但是覺得這樣電路會太複雜 ※ 編輯: deo2000 來自: 140.122.167.217 (08/07 01:56)

08/07 02:35, , 37F
不管你要接PN晶體來世MOS,從+端控制只要馬達跟邏輯電壓
08/07 02:35, 37F

08/07 02:36, , 38F
不一樣,LEVEL SHIFT都不會是太簡單的電路(要懂類比)
08/07 02:36, 38F

08/07 02:36, , 39F
還是
08/07 02:36, 39F

08/07 02:37, , 40F
所以我還是覺得L298比較好用 ^.^
08/07 02:37, 40F

08/07 09:32, , 41F
TA7279AP因為有高阻抗狀態比較適合PWM控制
08/07 09:32, 41F

08/07 15:07, , 42F
把L298的EN拉道地現她就自然高阻抗了,要PWM直接送EN就好
08/07 15:07, 42F

08/07 15:08, , 43F
了,你用TA7279你還要花中斷內CPU時間改變兩個輸出狀態
08/07 15:08, 43F

08/07 15:09, , 44F
而且為了等一下要還原你還得保存剛剛的狀態。這對於CPU
08/07 15:09, 44F

08/07 15:09, , 45F
TIME不高的標準51哪裡佔優勢了?
08/07 15:09, 45F

08/07 15:10, , 46F
拉到地線
08/07 15:10, 46F

08/07 15:12, , 47F
然後你不滿意還可以從L298的ISENSE(電流監測腳)對它進
08/07 15:12, 47F

08/07 15:13, , 48F
行外加一個MOS或NPN晶體的CE PWM控制。我怎麼覺得日本IC
08/07 15:13, 48F

08/07 15:13, , 49F
設計用途根本就不是給你這樣用的?
08/07 15:13, 49F

08/07 23:18, , 50F
兩組pwm輸出到in1/in2不就好了? 且這樣只需2 pins
08/07 23:18, 50F

08/07 23:19, , 51F
現在很多mcu都有多組pwm輸出 用fw寫pwm也不見得差很多
08/07 23:19, 51F

08/08 03:36, , 52F
你硬體PWM輸出如果不經過組合怎麼接上TA7279 ?
08/08 03:36, 52F

08/08 03:37, , 53F
外部組合電路
08/08 03:37, 53F

08/08 03:39, , 54F
然後兩組硬體PWM對應一個IO 這樣算是比較優嗎?
08/08 03:39, 54F

08/08 09:58, , 55F
pwm1->in1, pwm2->in2, 然後控制兩組pwm的duty cycle
08/08 09:58, 55F

08/08 09:59, , 56F
就可做出對brushed dc motor的所有動作
08/08 09:59, 56F

08/08 10:30, , 57F
我不是用BLDC,控制的目標是兩顆減速有刷DCM
08/08 10:30, 57F

08/08 19:19, , 58F
brush=電刷, brushED=有刷, brushLESS才是無刷
08/08 19:19, 58F

08/08 19:24, , 59F
不跟你爭辯了,反正哪個好用大家冷暖自知 XD
08/08 19:24, 59F

08/08 21:11, , 60F
抱歉看錯..看成brushless
08/08 21:11, 60F
文章代碼(AID): #1G7JLn_y (ASM)
文章代碼(AID): #1G7JLn_y (ASM)