線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3110
推到 Plurk!
推到 Facebook!

8051的串列傳輸問題

答題得分者是:阿信
cefiro350
一般會員


發表:12
回覆:21
積分:6
註冊:2005-09-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-11-23 20:45:03 IP:140.112.xxx.xxx 未訂閱
請問如果要傳送4個byte的資料要用什麼方法,我使用mode1,起始位元跟停止位元51好像會自己給bit,那降子我一次只能給8bit的資料位元,51就自動把TI設為1,降不就不能傳送4byte的資料(起始位元 資料位元32bit 停止位元),因為我買的AI馬達是用串列傳輸每次需要4byte的資料位元,還是說4byte指的就是(起始位元 資料位元 8bit 停止位元)x4次,麻煩各位指教! K1
------
K1

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-11-24 01:01:38 IP:203.203.xxx.xxx 未訂閱
1> 51 原本一次就只能傳 1 byte. 2> 有無詳細資料, 單純貼這樣資訊有點不足.
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
阿信
版主


發表:111
回覆:983
積分:813
註冊:2005-03-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-11-24 19:18:34 IP:61.66.xxx.xxx 未訂閱
這不是標準RS232 要用軟體完成 也就是要自己寫傳輸介面 它的速度多快啊?
cefiro350
一般會員


發表:12
回覆:21
積分:6
註冊:2005-09-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-11-25 10:37:08 IP:140.112.xxx.xxx 未訂閱
Operation Command Packet就只有這樣子,其他的有控制定速等等,但傳輸格式都是一樣要4byte,鮑率是2400 to 460800 bps,工程師跟我說,他們也有用51直接控制馬達,不透過電腦也可以,我後來想想說明書指的應該是連續傳送4個byte吧,因為說明書上的第一個byte是Header最後一個byte是終結,我用51控制所以工程師已經幫我先用電腦設馬達的鮑率為9600,馬達ID為0(他說也可以用晶片的程式去做設定),所以剩下的就是傳輸這4個byte到馬達上,如果51沒法傳32bit的資料,我想應該是分4次傳輸,以下是馬達的的block diagram及C code的4byte程式範例,麻煩各位幫我判斷是否為我所想的,感謝你們的幫忙! K1
------
K1
cefiro350
一般會員


發表:12
回覆:21
積分:6
註冊:2005-09-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-11-25 10:42:46 IP:140.112.xxx.xxx 未訂閱
block diagram K1
------
K1
cefiro350
一般會員


發表:12
回覆:21
積分:6
註冊:2005-09-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-11-25 10:45:24 IP:140.112.xxx.xxx 未訂閱
C code K1
------
K1
阿信
版主


發表:111
回覆:983
積分:813
註冊:2005-03-10

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-11-25 18:30:31 IP:211.21.xxx.xxx 未訂閱
這樣的C語言喔    那我會了< class="code"> mov a,Data1 xor a,Data2 and a,#0fh mov CheckSum,a mov a,HEADER call SendByte mov a,Data1 call SendByte mov a,Data2 call SendByte mov a,CheckSum call SendByte 你的重點在SendBye函數 這個函數跟震盪器有關 使用11.0592Mhz震盪器 指令數/秒=11.0592MHz/12=0.9216MHz 0.9216MHz/9600=96 每個Bit間隔96個指令週期 利用JB或JNB或JC指令來判斷Data的資料 RL或RLC來依序判斷 CLR/SET來輸出 發表人 - 阿信 於 2005/11/25 18:33:37
cefiro350
一般會員


發表:12
回覆:21
積分:6
註冊:2005-09-08

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-11-25 23:58:10 IP:140.109.xxx.xxx 未訂閱
head 0xFF是等於255嗎?0x7F是127嗎?怎麼會跟0fH做and?我還以為只要包率一樣就可以傳輸訊號,版主說的bit週期是指說可能會有time delay的現象是嗎?還是說對程式的執行會有影響?請指教,謝謝! K1
------
K1
阿信
版主


發表:111
回覆:983
積分:813
註冊:2005-03-10

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-11-28 11:06:25 IP:61.66.xxx.xxx 未訂閱
//head 0xFF是等於255嗎? 對! 不然呢! //0x7F是127嗎?怎麼會跟0fH做and? 筆誤 Sorry 是跟0x7F做AND //版主說的bit週期是指說可能會有time delay的現象是嗎? 不是 是要補滿96個週期    
SendByte: ;要傳的資料在Acc
        mov        R0,#8
 SB_Loop:
        rlc        A
        jc        SB1
        jmp        SB0
  SB_1:
        nop
        set        Tx
        jmp        SB_dec
  SB_0:
        clr        Tx
        jmp        SB_dec
  SB_dec:
        call        Nop_83 ;Delay 83 Cycle 補滿96週期
        djnz        R0,SB_Loop             ret    Nop_83:        ;Delay 83 Cycle 
;這段你自己寫吧!
        ret
cefiro350
一般會員


發表:12
回覆:21
積分:6
註冊:2005-09-08

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-12-01 15:14:40 IP:140.112.xxx.xxx 未訂閱
補滿96個周期是因為要讓包率滿足9600/sec是嗎?可是書上範例是用timer1來設定包率 ;Use timer1 mode 2 MOV TMOD,#00100000B ;Baud rate=9600 bit/sec@11.059Mhz ANL PCON,#01111111B MOV TH1,#0FDH SET TR1 那這樣子還需要考慮指令週期的問題嗎?因為看書上都是用Timer1來設包率,請指教,感謝回答!
------
K1
faco
一般會員


發表:3
回覆:6
積分:1
註冊:2005-06-25

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-12-02 07:53:26 IP:61.229.xxx.xxx 未訂閱
請問您是用AI MOTOR編號AI-701的可控制角度的AI馬達嗎 因為剛好我專題也是用51襙控這顆馬達,今天設測試出來了,可以控制,您可以按照一般51的串列傳輸設定就可以來控制這顆馬達了
cefiro350
一般會員


發表:12
回覆:21
積分:6
註冊:2005-09-08

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-12-02 12:25:45 IP:140.112.xxx.xxx 未訂閱
@@....是ㄝ...是益眾的,我的是10cm-kg,701是7cm-kg,我也是用51做串列傳輸,可是失敗了,我程式寫好了不過手邊資料不足所以有很多錯誤,不知道可不可以跟你要程式做參考,如果不方便的話,還是給你看我寫的程式請你指教錯誤,因為是51初學,所以很多不懂請指教,非常感謝! K1
------
K1
阿信
版主


發表:111
回覆:983
積分:813
註冊:2005-03-10

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-12-02 14:20:41 IP:211.21.xxx.xxx 未訂閱
引言:補滿96個周期是因為要讓包率滿足9600/sec是嗎?可是書上範例是用timer1來設定包率 ;Use timer1 mode 2 MOV TMOD,#00100000B ;Baud rate=9600 bit/sec@11.059Mhz ANL PCON,#01111111B MOV TH1,#0FDH SET TR1 那這樣子還需要考慮指令週期的問題嗎?因為看書上都是用Timer1來設包率,請指教,感謝回答!
這是兩種不同的實做方法 使用Delay或是Timer都可以 現在已經不是標準的RS232了 所以那些設定可以不用理會 原廠有C的程式 那應該也有函式庫 問原廠 在組語下如何把它連結過來 下面是SendByte副程式跟NOP副程式 做過時序對齊 在程式中呼叫 就可以控制馬達了
;---------------------------------------
        mov        a,Data1
        xor        a,Data2
        and        a,#7FH
        mov        CheckSum,a            mov        a,#FFH
        call         SendByte            mov        a,Data1
        call         SendByte            mov        a,Data2
        call        SendByte            mov        a,CheckSum ;93
        call        SendByte ;94~95
;---------------------------------------
SendByte: ;要傳的資料在Acc
        mov        R0,#7        ;96
SB_Loop:
        rlc        A        ;1
        jc        SB1        ;2~3
        jmp        SB0        ;3~4
SB_1:
        nop                ;4
        set        Tx        ;5
        jmp        SB_dec        ;6~7
SB_0:
        clr        Tx        ;5
        jmp        SB_dec        ;6~7
SB_dec:
        call        Nop_83        ;8~94 ;Delay 83 Cycle 補滿96週期
        djnz        R0,SB_Loop ;95~96
   ;------------------------
        rlc        A        ;1
        jc        SBX1        ;2~3
        jmp        SBX0        ;3~4
SBX_1:
        nop                ;4
        set        Tx        ;5
        jmp        SBX_dec        ;6~7
SBX_0:
        clr        Tx        ;5
        jmp        SBX_dec        ;6~7
SBX_dec:
        call        Nop_79        ;8~90
         ret                ;91~92
;---------------------------------------
Nop_83:  ;延遲副程式 給SendByte副程式呼叫用
        jmp        $ 1
        jmp        $ 1
Nop_79:
        mov        R7,#26
Nop_79Lp:
        nop
        djnz        R7,Nop_79Lp
        jmp        $ 1
        ret
;---------------------------------------
cefiro350
一般會員


發表:12
回覆:21
積分:6
註冊:2005-09-08

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-12-02 18:23:22 IP:140.112.xxx.xxx 未訂閱
真是太感謝了,不過還是很多地方還要再請問你 mov a,Data1 xor a,Data2 and a,#7FH mov CheckSum,a mov a,#FFH call SendByte mov a,Data1 call SendByte mov a,Data2 call SendByte 在這裡Data直接改成要輸入的數字就可以了吧,那函式庫的作用是什麼?因為說明說有附一些c的程式,我也不知道哪個是哪個? mov a,CheckSum ;93 call SendByte ;94~95 ;--------------------------------------- SendByte: ;要傳的資料在Acc mov R0,#7 ;96 SB_Loop: rlc A ;1 jc SB1 ;2~3 jmp SB0 ;3~4 SB_1: nop ;4 set Tx ;5 jmp SB_dec ;6~7 SB_0: clr Tx ;5 jmp SB_dec ;6~7 SB_dec: call Nop_83 ;8~94 ;Delay 83 Cycle 補滿96週期 djnz R0,SB_Loop ;95~96 以上的指令是說,Tx送出的訊號就是A的0或1訊號嗎?看起來最後沒有給TI(終結位元),還是說不需要? ;------------------------ rlc A ;1 jc SBX1 ;2~3 jmp SBX0 ;3~4 SBX_1: nop ;4 set Tx ;5 jmp SBX_dec ;6~7 SBX_0: clr Tx ;5 jmp SBX_dec ;6~7 SBX_dec: call Nop_79 ;8~90 ret ;91~92 請問為何要再寫一次重複的指令,看起來跟上面幾行幾乎樣? ;--------------------------------------- Nop_83: ;延遲副程式 給SendByte副程式呼叫用 jmp $ 1 jmp $ 1 Nop_79: mov R7,#26 Nop_79Lp: nop djnz R7,Nop_79Lp jmp $ 1 ret 這應該就是補足週期的延遲副程式吧,看來我要多看看其他書籍,很多都是第一次看到!太感謝了! K1
------
K1
阿信
版主


發表:111
回覆:983
積分:813
註冊:2005-03-10

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-12-03 11:26:31 IP:220.228.xxx.xxx 未訂閱
//and a,#7FH 這個and要改成anl //在這裡Data直接改成要輸入的數字就可以了吧, 不對! 是要把給馬達的值放到data1 & data2 別忘了 還要先做xor取checksum值 //那函式庫的作用是什麼?因為說明說有附一些c的程式,我也不知道哪個是哪個? 看它的C範例引入哪些 全部include進來 //以上的指令是說,Tx送出的訊號就是A的0或1訊號嗎? //看起來最後沒有給TI(終結位元),還是說不需要? Tx是一般I/O 沒使用內建RS232 不需要TI //請問為何要再寫一次重複的指令,看起來跟上面幾行幾乎樣? 最後一次的delay不一樣 直觀寫法就寫二次 //這應該就是補足週期的延遲副程式吧,看來我要多看看其他書籍, //很多都是第一次看到!太感謝了! jmp $ , "$"指的是這行位址 jmp $ 1 , 跳到下一行
cefiro350
一般會員


發表:12
回覆:21
積分:6
註冊:2005-09-08

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-12-06 11:03:39 IP:140.112.xxx.xxx 未訂閱
我用了您建議的程式,結果TXD出現錯誤,是說TXD要在宣告嗎?
Line 32: Can't find symbol :       32  0075                             SET        TXD    問過工程師,他說可以用8051串列傳輸UART的mode1來做控制,陸續傳出4個byte即可,以下是我寫的程式,compiler沒問題,不過馬達還是無法依照我給定的位置移動,不知道有什麼辦法可以檢驗錯誤,請不吝指教,感謝!!    BUFFR        EQU        45H
        ORG        00H
        JMP        START    START:
        MOV        TMOD,#00100000B                ;timer1設成mode2
        ANL        PCON,#01111111B                ;鮑率9600Bit/sec
        MOV        TH1,#0FDH
        SETB        TR1
        MOV        SCON,#01010000B                ;UART mode1    Header:
        CLR        TI
        MOV        BUFFR,#11111111B        ;傳送Header,#FFH
        MOV        SBUF,BUFFR
        JBC        TI,DATA1    DATA1:        
        CLR        TI
        MOV        BUFFR,#00000000B        ;傳送DATA1,#00H(速度第0,ID第0)
        MOV        SBUF,BUFFR
        MOV        A,BUFFR
        JBC        TI,DATA2    DATA2:
        CLR        TI                        ;傳送DATA2,#06H(指定位置)
        MOV        BUFFR,#00000110B
        MOV        SBUF,BUFFR
        MOV        R0,BUFFR
        JBC        TI,CheckSum    CheckSum:
        CLR        TI
        XRL        A,R0                        ;A xor R0
        ANL        A,01111111B                ;A and #7FH
        MOV        SBUF,A                        ;傳送CheckSum
        JBC        TI,Header
                        
        RET            END    K1
發表人 - ㊣ 於 2005/12/06 20:18:35
------
K1
DavidLo
高階會員


發表:17
回覆:225
積分:168
註冊:2004-07-21

發送簡訊給我
#17 引用回覆 回覆 發表時間:2005-12-06 11:59:36 IP:61.228.xxx.xxx 未訂閱
JBC TI,DATA1 DATA1: CLR TI 語法錯! JBC:Jump to DATA1 if bit TI is set and clear TI.Otherwise proceed next instruction.
cefiro350
一般會員


發表:12
回覆:21
積分:6
註冊:2005-09-08

發送簡訊給我
#18 引用回覆 回覆 發表時間:2005-12-06 13:58:59 IP:140.112.xxx.xxx 未訂閱
嗯嗯...我後來也發現了..所以每行的 CLR TI 要去掉吧,還有別的錯誤嗎? 除掉就正確了嗎?好像還是不行,感謝指正! K1
------
K1
DavidLo
高階會員


發表:17
回覆:225
積分:168
註冊:2004-07-21

發送簡訊給我
#19 引用回覆 回覆 發表時間:2005-12-06 18:43:21 IP:218.169.xxx.xxx 未訂閱
Hello!    "Otherwise proceed next instruction."    Ithink as follows:    
  ...
Label1:
  JBC TI,DATA1 ;發送完畢跳至DATA1
  JMP Lable1   ;尚未發送完畢,跳至Lable1在檢查
  DATA1: 
  ...
這處理了嗎?
cefiro350
一般會員


發表:12
回覆:21
積分:6
註冊:2005-09-08

發送簡訊給我
#20 引用回覆 回覆 發表時間:2005-12-07 12:50:20 IP:140.112.xxx.xxx 未訂閱
真是一語道破,可以執行了,非常感謝各位板主及版友們的大力協助,真的很謝謝你們! K1
------
K1
faco
一般會員


發表:3
回覆:6
積分:1
註冊:2005-06-25

發送簡訊給我
#21 引用回覆 回覆 發表時間:2005-12-07 17:52:10 IP:61.229.xxx.xxx 未訂閱
        ORG 0H
        AJMP START
        ORG 30H
START:
        MOV SCON,#50H
        MOV PCON,#00H
        MOV TMOD,#20H
        MOV TH1,#0FDH
        MOV IP,#10H
        MOV IE,#90H
        SETB TR1
        MOV DPTR,#DATA_LAB
        MOV R1,#4
LOOP2:
        CLR A
        MOVC A,@A DPTR
        MOV SBUF,A
        MOV P2,SBUF
        ACALL DELAY
        CLR RI
        CLR TI
        INC DPTR
        DJNZ R1,LOOP2
        JMP START    DELAY:
        MOV R5,#15
D1:   MOV R6,#30
D2:        DJNZ R6,D2
        DJNZ R5,D1
 RET
DATA_LAB:
        DB 
END
因為我自己是要把馬達用成無線控制的方式,所以我用VB先把所有數據抓下來建成一個TABLE,程式裡面,因為我的TI在實際操作時無法做判斷,所以我自己給延遲時間,我這樣子只要把我所需要的數據丟入TABLE裡面馬達就可以轉動,已經試過OK了!!但好像有小問題,希望可以互相研究 發表人 - ㊣ 於 2005/12/07 22:23:15
系統時間:2024-07-06 11:33:47
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!