Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 35429|回復: 87
打印 上一主題 下一主題

ssc(8通道pwm產生器950613)by marbol

[複製鏈接]
跳轉到指定樓層
1#
發表於 2006-12-6 10:07:04 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
marbol大大您好,
   怎麼開始?
;---------------------------------------------------------------------
;程式檔名:ssc(8通道pwm產生器950613)
;
;
;
;
;------------------------------------------------------------------
CH1             .REG   P2.0
CH2             .REG   P2.1
PWM0            EQU    40H                  ;
PWM1            EQU    41H                  ;
PWM2            EQU    42H                  ;
PWM3            EQU    43H                  ;
PWM4            EQU    44H                  ;
PWM5            EQU    45H                  ;
PWM6            EQU    46H                  ;
PWM7            EQU    47H                  ;
COUNT           EQU    37H
CUT             EQU    39H
F               EQU    50H
PIN             EQU    51H
PWM             EQU    52H
PIN1            EQU    53H
;------------------------------------------------------
  ORG 00H  
        AJMP     START  
        ORG 0BH
        LJMP    T0_INT                       ;timer0中斷
        ORG 1BH
        LJMP    T1_INT                       ;timer1中斷
               
        ORG 30H
START:
        MOV     SP,#5FH                      ;設定堆疊區60H-7FH
MOV TMOD,#00010001B ;設定 TIMER1 作業於模式 1,TIMER0 作業於模式 1
;---------------------------------------------------------
        MOV   TH0,#>(2**16-40)  ;設定TIMER0在每40us中斷一次,if use
12Mhz crystal
        MOV   TL0,#<(2**16-40)
        MOV   TH1,#>(2**16-10000)  ;設定TIMER1在每10ms計時一次,if use
12Mhz crystal
        MOV   TL1,#<(2**16-10000)
;--------------------------------------------------------
SETB    EA
        SETB    ET0             ;啟用TIMER0中斷
        SETB    ET1             ;啟用TIMER1中斷
              
        MOV     CUT,#0          ;賦予解譯旗標CUT歸零
        MOV     COUNT,#0
;--------------------------------------------------------
                       
        MOV     PWM,#12       ;PWM初始值設定
        MOV     PWM0,#12      ;
        MOV     PWM1,#1
        MOV     PWM2,#24
        MOV     PWM3,#12
        MOV     PWM4,#12
        MOV     PWM5,#12
        MOV     PWM6,#1
        MOV     PWM7,#24
        
        
;--------------------------------------------------------------------------------
;通道判斷
;--------------------------------------------------------------------------------
MAIN:
     
      LCALL  OUT
           
              LJMP MAIN
;--------------------------------------------------------------------------------
        
DEL_H:                                    
;延時R7*0.1毫秒,晶振在11.0592MHZ
;MOV R7,#1  ;令 R7=0
L7:
MOV R6,#2  ;令 R6=0
L6:
MOV R5,#17         ;令 R5=0
DJNZ R5,$  ;R5=R5-1, 若 R5 <> 0, 則繼續本指令
DJNZ R6,L6  ;R6=R6-1, 若 R6 <> 0, 則跳至 $6
DJNZ R7,L7  ;R7=R7-1, 若 R7 <> 0, 則跳至 $7
RET
;--------------------------------------------------------------------------------
DEL_L:
       ; MOV R7,#2  ;令 R7=     ;延時R7*1毫秒,晶振在11.0592MHZ
L5:
MOV R6,#20  ;令 R6=0
L4:
MOV R5,#20  ;令 R5=0
DJNZ R5,$  ;R5=R5-1, 若 R5 <> 0, 則繼續本指令
DJNZ R6,L4  ;R6=R6-1, 若 R6 <> 0, 則跳至 $6
DJNZ R7,L5  ;R7=R7-1, 若 R7 <> 0, 則跳至 $7
RET
;----------------------------------------------------
PWM_WIDTH:
           MOV  COUNT,@R0
LOOP1:     SETB TR0
           JNB  TF0,$
           CLR  TR0
           DJNZ COUNT,LOOP1         
           CLR  TR0
           MOV  CUT,#0        
;因為T0中斷給兩個副程式使用,所以CUT累加在此須清除         
           INC  R0
           RET

[ 本帖最後由 ayu 於 2006-12-6 10:11 編輯 ]

8通道PWM訊號產生器測試電路圖.jpg (162.58 KB, 下載次數: 749)

8通道PWM訊號產生器測試電路圖

8通道PWM訊號產生器測試電路圖
2#
 樓主| 發表於 2006-12-6 10:12:39 | 只看該作者

程式

;----------------------------------------------------  
;輪序迴圈
;---------------------------------------------------      
OUT:
           MOV    R0,#40H        
C0:        SETB   P1.0
           MOV    R7,#10         ;每一格"H"的時間,視需要微調
           LCALL  DEL_H
           LCALL  PWM_WIDTH
           CLR    P1.0
C1:        SETB   P1.1
           MOV    R7,#10         ;每一格"H"的時間,視需要微調
           LCALL  DEL_H
           LCALL  PWM_WIDTH
           CLR    P1.1
C2:        SETB   P1.2
           MOV    R7,#10         ;每一格"H"的時間,視需要微調
           LCALL  DEL_H
           LCALL  PWM_WIDTH
           CLR    P1.2
C3:        SETB   P1.3
           MOV    R7,#10         ;每一格"H"的時間,視需要微調
           LCALL  DEL_H
           LCALL  PWM_WIDTH
           CLR    P1.3
C4:        SETB   P1.4
           MOV    R7,#10         ;每一格"H"的時間,視需要微調
           LCALL  DEL_H
           LCALL  PWM_WIDTH
           CLR    P1.4
C5:        SETB   P1.5
           MOV    R7,#10         ;每一格"H"的時間,視需要微調
           LCALL  DEL_H
           LCALL  PWM_WIDTH
           CLR    P1.5
C6:        SETB   P1.6
           MOV    R7,#10         ;每一格"H"的時間,視需要微調
           LCALL  DEL_H
           LCALL  PWM_WIDTH
           CLR    P1.6
C7:        SETB   P1.7
           MOV    R7,#10         ;每一格"H"的時間,視需要微調
           LCALL  DEL_H
           LCALL  PWM_WIDTH
           CLR    P1.7
           
            
           SETB   TR1
           RET

;---------------------------------------------------------------------
T0_INT:
           PUSH  A
           PUSH  PSW
           ;CLR   TR0
           MOV   TH0,#>(2**16-40)  ;設定TIMER0在每40us中斷一次,if use
12Mhz crystal
           MOV   TL0,#<(2**16-40)
           ;INC   CUT
           ;SETB  TR0
           POP   PSW
           POP   A
           RETI
;---------------------------------------------------------------------
T1_INT:
           PUSH  A
           PUSH  PSW
           CLR   TR0
           MOV   TH1,#>(2**16-10000)  ;設定TIMER0在每10ms中斷一次,if
use 12Mhz crystal
           MOV   TL1,#<(2**16-10000)
           SETB  TR0
           CLR   TR1
           POP   PSW
           POP   A
           RETI
   
;---------------------------------------------------------------------
      END
3#
發表於 2006-12-6 21:27:27 | 只看該作者
原帖由 ayu 於 2006-12-6 10:07 發表
marbol大大您好,
   怎麼開始?
;---------------------------------------------------------------------
;程式檔名:ssc(8通道pwm產生器950613)
;
;
;
;
;--------------------------------------------- ...

ayu大大~~~~~
要開始的話,手上要依照線路圖做出板子,電源的供給也不要忽略,然後要有組譯器及燒錄器並學習如何使用它們,這些備齊了,才能夠驗證上述的程式碼是否能工作喔!!!動手做做看!! 然後秀出來!!

最好能夠買本51的書,先試著瞭解指令與範例程式,若蹲好馬步,則上述程式碼都可看成範例程式的組合哩!!!

基本上SSC是一個輸入與輸出的訊號系統,而這個程式只有持續輸出PWM的效果,如果覺得每次要更動PWM初值就要重新編輯,組譯與燒錄一次很麻煩的話,那麼透過串列傳輸來賦予PWM初值就是做好輸入的工作了~~~
當您能發現有些副程式用不到,那就是呼叫uucww大大的時候了!!

[ 本帖最後由 marbol 於 2006-12-6 21:42 編輯 ]
4#
 樓主| 發表於 2006-12-7 21:38:26 | 只看該作者

第一次實驗報告

原帖由 marbol 於 2006-12-6 21:27 發表


ayu大大~~~~~
要開始的話,手上要依照線路圖做出板子,電源的供給也不要忽略,然後要有組譯器及燒錄器並學習如何使用它們,這些備齊了,才能夠驗證上述的程式碼是否能工作喔!!!動手做做看!! 然後秀出來 ...

marbol世界第一大大您好,
         我用的是亞將視窗組譯器, http://www.robofun.net/forum/viewthread.php?tid=479&highlight ,

crystal用的是11.0592MHz,兩個capacitors用的是22pf ,程式中的

CH1             .REG   P2.0     改成 CH1             REG   P2.0     請問 有無這個 "." 是什麼意思?
CH2             .REG   P2.1      CH2            REG   P2.1

程式中的每一個  MOV   TH0,#>(2**16-40)  ,設定TIMER 的 2**16 意思應該是2的16次方吧?我全部把它改成25536 這樣編譯器才可編譯成功。

我偷懶先把編譯後的hex檔燒進2051,結果沒顯現出pwm,後來才把hex檔燒進s51用示波器才看到連續的pwm,不過沒變化。

p10是1.4ms,p11<1ms,p12是2.4ms,p13是1.6ms,p14是1.6ms,p15是1.6ms,p16<1ms,p17<2.6ms,都是連續的pwm,請問是這個結果嗎?(示波器(IWATSU,SS-5702A,20MHz)比較舊,所以可能有些誤差。)

以上是實驗的結果,請大大指點一下

可否用程式流程圖來表示程式的架構呢?麻煩的話,就不用了。謝謝喔

5#
發表於 2006-12-8 07:24:56 | 只看該作者
原帖由 ayu 於 2006-12-7 21:38 發表


marbol世界第一大大您好,
         我用的是亞將視窗組譯器, http://www.robofun.net/forum/viewthread.php?tid=479&highlight ,

crystal用的是11.0592MHz,兩個capacitors用的是22pf ,程式中的 ...

ayu大大~~~您好~~~
動作相當快喔!!
1.首先,組譯器的不同當然語法上也會有所差異,您能夠組譯完成,表示能解決問題,很不錯的啦!!
2.我用晶振12Mhz,在"H"延時的效果也會有所不同,您可以試著調整延時副程式,調到中立點1.5ms
3.PWM能連續輸出就是這個程式最主要的結果,這樣才能讓伺服機持續維持在同一位置直到改變初值,換句話說,您要讓PWM的duty cycle有變化就要改變初值
4.在這個程式基礎上,要加上更多功能(外加的副程式)是可行的,您需要的是理解這個程式,並且把外加的副程式照顧好,這樣SSC就OK啦!!
5.流程圖的部份,您畫畫看,是理解這個程式的一種學習喔!!
6#
 樓主| 發表於 2006-12-11 20:23:24 | 只看該作者

第一次心得報告

原帖由 marbol 於 2006-12-6 21:27 發表
當您能發現有些副程式用不到,那就是呼叫uucww大大的時候了!!...

marbol老師您好,
         初步研讀,理解如下,請指正,感激不盡喔!

這個程式用到timer0 interrupt so the timer1 interrupt 可以刪掉吧?TI_INT這個 routine可刪掉,timer1的設定可刪掉,老師果然很厲害 。補充 DEL_L這個 routine 也可刪掉
        其它的理解,未盡之處還望指導喔 。傳送指令的vb和51程式,要如何開始呢?這裡可能要傷腦筋了。

[ 本帖最後由 ayu 於 2006-12-12 13:16 編輯 ]
7#
發表於 2006-12-12 22:05:02 | 只看該作者
原帖由 ayu 於 2006-12-11 20:23 發表


marbol老師您好,
         初步研讀,理解如下,請指正,感激不盡喔!

這個程式用到timer0 interrupt so the timer1 interrupt 可以刪掉吧?TI_INT這個 routine可刪掉,timer1的設定可刪掉,老師果然很厲 ...

ayu大大~~~~
1.我不是老師,不要叫我老師喔~~~~
2.流程圖呢?? 怎麼沒有看到呢??不可以偷懶喔!!!您可以對照http://www.robofun.net/forum/viewthread.php?tid=232&extra=page%3D1&page=3
輪序PWM產生器示意圖來理解程式,最好POST照片上來
3.這個程式需要配合uucww大大的遙控解譯程式來賦值,這就是何以會有TI_INT的存在,不過現在還不需要那個程式~~~~~那賦值賦到哪裡去呢~~~~~~您說呢??給您一個方向,做一個table,然後定時抓取table的值賦給pwm0~pwm7,然後接上伺服機,看能否依照您給的table依序轉動角度~~
如果可以的話,您就可以讓機器人動起來囉!!!(您應該有伺服機吧可以試吧,小心不要接錯接腳)

[ 本帖最後由 marbol 於 2006-12-12 22:07 編輯 ]
8#
發表於 2006-12-12 23:02:10 | 只看該作者
接錯腳就促進經濟發展而已啊,台灣加油
話說,上面的老大對小弟說:「做研究沒爆過、沒燒過是不會成功的」
所以多燒多爆幾次就有經驗了
呵呵

請教一下,如果不計成本的話,選用內有3組的馬達控制PWM + 4組PWM的  共7組不受中斷干擾的PWM是否在學習上會比較方便?  (DSPIC30F4011 傳說零賣一顆300元,報價約6.X美金)
9#
 樓主| 發表於 2006-12-13 07:28:42 | 只看該作者
原帖由 marbol 於 2006-12-12 22:05 發表
1.我不是老師,不要叫我老師喔~~~~
2.流程圖呢?? 怎麼沒有看到呢??不可以偷懶喔!!!您可以對照http://www.robofun.net/forum/viewthread.php?tid=232&extra=page%3D1&page=3
輪序PWM產生器示意圖來理解程式,最好POST照片上來
3.,做一個table,然後定時抓取table的值賦給pwm0~pwm7,然後接上伺服機,看能否依照您給的table依序轉動角度~~
如果可以的話,您就可以讓機器人動起來囉!!!(您應該有伺服機吧可以試吧,小心不要接錯接腳)
marbol老師您好,
        尊稱您老師,不過份吧? 套句論語,聖人無常師,只要可以讓我們學習的對象,都可稱為師吧!,老師不要謙虛了。
這個table,會使pwm0~pwm7,分別依序轉動角度動作,還是一個pwm只作依序轉動角度變化?
       流程圖,我再補上來。
10#
 樓主| 發表於 2006-12-13 07:31:42 | 只看該作者
原帖由 doubletime 於 2006-12-12 23:02 發表
請教一下,如果不計成本的話,選用內有3組的馬達控制PWM + 4組PWM的  共7組不受中斷干擾的PWM是否在學習上會比較方便?  (DSPIC30F4011 傳說零賣一顆300元,報價約6.X美金)
doubletime大大您好,
     dsp沒玩過喔?所以不知如何來作回應,抱歉了。
11#
發表於 2006-12-13 09:03:34 | 只看該作者
話說dsPIC 是MICROCHIP出大概二年的新產品
為DSP+PIC 合稱dsPIC,有著強大的硬體功能與運算能力,著重馬達控制,且最快可達30MIPS
實在是一顆非常好用的單晶片,成本高了點(300元在機器人的世界應該算小錢吧),如果能省去自己寫軟體做硬體輸出的時間話,實在是非常非常值得推薦(感覺雖然比不上FPPA的好用)(最近又常常遇到有人和我在聊低成本的話題,實在有點悶@@)

其實小弟也有興趣想玩看看機器人,可是著重金費問題與沒接觸過,加上對機樲結構的不熟悉,所以就遲遲未入門

目前著重偏自動控制與馬達定位與轉速控制上
12#
發表於 2006-12-13 18:57:21 | 只看該作者
原帖由 ayu 於 2006-12-13 07:28 發表

marbol老師您好,
        尊稱您老師,不過份吧? 套句論語,聖人無常師,只要可以讓我們學習的對象,都可稱為師吧!,老師不要謙虛了。
這個table,會使pwm0~pwm7,分別依序轉動角度動作,還是一個pwm只作 ...

ayu大大~~~
這麼說您是聖人囉!!!   失敬啊失敬~~~~

這個table,可以先用一個腳位做輸出,也就是一個pwm腳轉動不同角度(一般是0,90,0,90....這樣轉動看看),先熟悉熟悉基本的賦值,我一開始也只試這個功能(先做到影像檔PWM信號跳動的樣子),等到成功了,再想想如何讓不同的pwm腳隨個人意思來變動角度不遲!!!
13#
 樓主| 發表於 2006-12-14 22:11:46 | 只看該作者
marbol老師您好,
       讀書太少,只想到這個比喻,見笑了。 我想意思應該懂吧,客套話不多說了,趕緊研究囉,潛水去了。

報告marbol老師,我作出來了,不過沒延時,但可看到波形有變化,您的影片,我都保存得很好,我的數位相機可能需充一天的電,到時拍好影片,再請老師修正一下喔 !


老師您好,影片如下,拍得效果不好,只看到示波器的波形,伺服機看不到,光線太暗了。

http://www.youtube.com/watch?v=FVEUJ4kKZao

接下來要作些什麼進度呢?

[ 本帖最後由 ayu 於 2006-12-14 22:24 編輯 ]
14#
發表於 2006-12-14 22:33:57 | 只看該作者
原帖由 ayu 於 2006-12-14 22:11 發表
marbol老師您好,
       讀書太少,只想到這個比喻,見笑了。 我想意思應該懂吧,客套話不多說了,趕緊研究囉,潛水去了。

報告marbol老師,我作出來了,不過沒延時,但可看到波形有變化,您的影片,我 ...

太讚囉~~~~~
看起來您已經可以賦值給一個PWM腳做不同角度的擺動了 ,您用到的table的順序是怎樣的呢??看起來像是霹靂燈每次增一或減一來賦值的呢~~~~

接下來就是讓二個PWM腳交互做不同角度的擺動,要用到兩個伺服機喔!!

[ 本帖最後由 marbol 於 2006-12-14 22:36 編輯 ]
15#
 樓主| 發表於 2006-12-14 22:48:34 | 只看該作者
原帖由 marbol 於 2006-12-14 22:33 發表
您用到的table的順序是怎樣的呢??看起來像是霹靂燈每次增一或減一來賦值的呢~~~~

接下來就是讓二個PWM腳交互做不同角度的擺動 ...

marbol老師您好,

      老師,我用的是如您所說,一次增加一個數值01h,02h,03h,04h………,增加上去的,然後再減下來。請問老師一下,最後八個都要讓它們交互做不同角度的擺動嗎?
16#
發表於 2006-12-15 08:08:14 | 只看該作者
原帖由 ayu 於 2006-12-14 22:48 發表


marbol老師您好,

      老師,我用的是如您所說,一次增加一個數值01h,02h,03h,04h………,增加上去的,然後再減下來。請問老師一下,最後八個都要讓它們交互做不同角度的擺動嗎?


1.叫我marbol大大就好囉!!

2.增加的方式有用到table嗎??雖然說有步伐產生器的數學模型,不過有些時候動作不規則還是需要用table的方式來賦值~~~~
3.最後就是如同您所說的八個都要讓它們交互做不同角度的擺動,現在先用兩個試試看,成功了再加上去~~~`  ,您一定會遇到問題的~~~~ 這要由您來說明!!!

[ 本帖最後由 marbol 於 2006-12-20 22:08 編輯 ]
17#
 樓主| 發表於 2006-12-20 08:35:40 | 只看該作者
原帖由 marbol 於 2006-12-15 08:08 發表

2.最後就是如同您所說的八個都要讓它們交互做不同角度的擺動,現在先用兩個試試看,成功了再加上去~~~`  ,您一定會遇到問題的~~~~ 這要由您 ...
marbol大大您好,
      討論一下程式問題,

一、DEL_H 這個副程式,它是延長0.1ms的結構,經由R7給它變成1ms的延時功能,使我們的輸出電位變成1,然後再跑入TIMER0的中斷,延長PWM所給予的設定時間,基準是40us,比如   MOV  PWM0,#12 ,  P1.0  就會輸出大約1.48ms的高電位,以此類推,八個PWM應該是2.5msx8=20ms,接下來一直重覆。便產生了示波器看到的結果。

二、現在有一個想法,用DEL_H 這種方式來跑虛功的方式,應該也可達成,或用TIMER0的的中斷來完成就好了,可不可以不要兩種都用。只用一種的計時方法來完成這個程式。我有試了兩種的計時方式,可能還有一些bug,會再修正一下的。

全部用TIMER0的的中斷完成了,個別的pwm波形可形成,同最初的八通道pwm產生器。

[ 本帖最後由 ayu 於 2006-12-20 22:47 編輯 ]
18#
發表於 2006-12-20 21:55:57 | 只看該作者
原帖由 ayu 於 2006-12-20 08:35 發表

marbol大大您好,
      討論一下程式問題,

一、DEL_H 這個副程式,它是延長0.1ms的結構,經由R7給它變成1ms的延時功能,使我們的輸出電位變成1,然後再跑入TIMER0的中斷,延長PWM所給予的設定時間,基準是4 ...


ayu大大~~~
前半部說對了......
您可以畫畫看伺服機中立點所需的PWM波形,應該是1.5ms左右,
在這1.5ms左右各0.5ms代表舵桿各轉左右45度的角度,以這個觀點來看
應該會比較瞭解程式的意思及該如何去操作pwm波型的產生~~~~~
所以PWM=#12即是給與480us的"H",加上1ms的前置的"H",這樣約等於1.5ms,不就是中立點了嗎~~~
這是控制伺服機的基本信號原理~~~~~要溫故知新喔
http://www.robofun.net/forum/viewthread.php?tid=392&highlight=

[ 本帖最後由 marbol 於 2007-7-13 22:24 編輯 ]
19#
 樓主| 發表於 2006-12-20 22:15:37 | 只看該作者
原帖由 marbol 於 2006-12-15 08:08 發表
2.增加的方式有用到table嗎??雖然說有步伐產生器的數學模型,不過有些時候動作不規則還是需要用table的方式來賦值~~~~
3.最後就是如同您所說的八個都要讓它們交互做不 ...

八個都要讓它們交互做不同轉動 的實驗作出來了。
要秀很麻煩,我寄給您。
;---------------------------------------------------------------------
;程式檔名:ssc(8通道pwm)
;------------------------------------------------------------------
PWM0            EQU    40H                  ;
PWM1            EQU    41H                  ;
PWM2            EQU    42H                  ;
PWM3            EQU    43H                  ;
PWM4            EQU    44H                  ;
PWM5            EQU    45H                  ;
PWM6            EQU    46H                  ;
PWM7            EQU    47H                  ;
COUNT           EQU    37H
pWM             EQU    52H
;------------------------------------------------------
  ORG 00H  
        AJMP     START  
        ORG 0BH
        LJMP    T0_INT                       ;timer0中斷
                        
        ORG 30H
START:
             mov     dptr,#table                     
MOV TMOD,#00010001B              ;設定 TIMER1 作業於模式 1,TIMER0 作業於模式 1
;---------------------------------------------------------
        MOV   TH0,#>(65536-40)           ;設定TIMER0在每40us中斷一次,if use 12Mhz crystal
        MOV   TL0,#<(65536-40)
      
;--------------------------------------------------------
SETB    EA
        SETB    ET0             ;啟用TIMER0中斷         
        
;--------------------------------------------------------------------------------
;通道判斷
;--------------------------------------------------------------------------------
MAIN:
      mov   r1,#0
      mov   r2,#50
loop:
      mov   a,r1
      movc  a,@a+dptr
      mov   pwm0,a
      inc   r1
      mov   a,r1
      movc  a,@a+dptr
      mov   pwm1,a
      inc   r1
      mov   a,r1
      movc  a,@a+dptr
      mov   pwm2,a
      inc   r1
      mov   a,r1
      movc  a,@a+dptr
      mov   pwm3,a
      inc   r1
      mov   a,r1
      movc  a,@a+dptr
      mov   pwm4,a
      inc   r1
      mov   a,r1
      movc  a,@a+dptr
      mov   pwm5,a
      inc   r1
      mov   a,r1
      movc  a,@a+dptr
      mov   pwm6,a
      inc   r1
      mov   a,r1
      movc  a,@a+dptr
      mov   pwm7,a
      inc   r1
      
      LCALL OUT
      djnz  r2,loop     
           
      LJMP MAIN
;--------------------------------------------------------------------------------
table:
      db    01h,02h,03h,04h,05h,06h,07h,08h,09h,0ah,0bh,0ch,0dh,0eh,0fh,10h,11h,12h,13h,14h,15h,16h,17h,18h,19h
      db    19h,18h,17h,16h,15h,14h,13h,12h,11h,10h,0fh,0eh,0dh,0ch,0bh,0ah,09h,08h,07h,06h,05h,04h,03h,02h,01h
;----------------------------------------------------


[ 本帖最後由 ayu 於 2006-12-20 22:35 編輯 ]
20#
 樓主| 發表於 2006-12-20 22:29:00 | 只看該作者
;----------------------------------------------------  
;輪序迴圈
;---------------------------------------------------      
OUT:
           MOV    R0,#40H        
C0:        SETB   P1.0
           MOV    R7,#10         ;每一格"H"的時間,視需要微調
           LCALL  DEL_H
           LCALL  PWM_WIDTH
           CLR    P1.0
C1:        SETB   P1.1
           MOV    R7,#10         ;每一格"H"的時間,視需要微調
           LCALL  DEL_H
           LCALL  PWM_WIDTH
           CLR    P1.1
C2:        SETB   P1.2
           MOV    R7,#10         ;每一格"H"的時間,視需要微調
           LCALL  DEL_H
           LCALL  PWM_WIDTH
           CLR    P1.2
C3:        SETB   P1.3
           MOV    R7,#10         ;每一格"H"的時間,視需要微調
           LCALL  DEL_H
           LCALL  PWM_WIDTH
           CLR    P1.3
C4:        SETB   P1.4
           MOV    R7,#10         ;每一格"H"的時間,視需要微調
           LCALL  DEL_H
           LCALL  PWM_WIDTH
           CLR    P1.4
C5:        SETB   P1.5
           MOV    R7,#10         ;每一格"H"的時間,視需要微調
           LCALL  DEL_H
           LCALL  PWM_WIDTH
           CLR    P1.5
C6:        SETB   P1.6
           MOV    R7,#10         ;每一格"H"的時間,視需要微調
           LCALL  DEL_H
           LCALL  PWM_WIDTH
           CLR    P1.6
C7:        SETB   P1.7
           MOV    R7,#10         ;每一格"H"的時間,視需要微調
           LCALL  DEL_H
           LCALL  PWM_WIDTH
           CLR    P1.7
           
            
           RET
;--------------------------------------------------------------------------------
        
DEL_H:                                    
                                            ;延時R7*0.1毫秒,晶振在11.0592MHZ
;MOV R7,#1  ;令 R7=0
L7:
MOV R6,#2  ;令 R6=0
L6:
MOV R5,#17         ;令 R5=0
DJNZ R5,$  ;R5=R5-1, 若 R5 <> 0, 則繼續本指令
DJNZ R6,L6  ;R6=R6-1, 若 R6 <> 0, 則跳至 $6
DJNZ R7,L7  ;R7=R7-1, 若 R7 <> 0, 則跳至 $7
RET
;----------------------------------------------------
PWM_WIDTH:
           MOV  COUNT,@R0
LOOP1:     SETB TR0
           JNB  TF0,$
           CLR  TR0
           DJNZ COUNT,LOOP1         
           CLR  TR0
           MOV  CUT,#0        
                                       ;因為T0中斷給兩個副程式使用,所以CUT累加在此須清除         
           INC  R0
           RET

;---------------------------------------------------------------------
T0_INT:
           PUSH  A
           PUSH  PSW
           ;CLR   TR0
           MOV   TH0,#>(65536-40)  ;設定TIMER0在每40us中斷一次,if use 12Mhz crystal
           MOV   TL0,#<(65536-40)
           ;INC   CUT
           ;SETB  TR0
           POP   PSW
           POP   A
           RETI
;---------------------------------------------------------------------
      END

請各位大大們指正了喔

[ 本帖最後由 ayu 於 2006-12-20 22:43 編輯 ]
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2024-9-27 20:56 , Processed in 0.254107 second(s), 9 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表