8051的串列傳輸問題 |
答題得分者是:阿信
|
cefiro350
一般會員 發表:12 回覆:21 積分:6 註冊:2005-09-08 發送簡訊給我 |
|
㊣
版主 發表:261 回覆:2302 積分:1667 註冊:2005-01-04 發送簡訊給我 |
|
阿信
版主 發表:111 回覆:983 積分:813 註冊:2005-03-10 發送簡訊給我 |
|
cefiro350
一般會員 發表:12 回覆:21 積分:6 註冊:2005-09-08 發送簡訊給我 |
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 發送簡訊給我 |
|
cefiro350
一般會員 發表:12 回覆:21 積分:6 註冊:2005-09-08 發送簡訊給我 |
|
阿信
版主 發表:111 回覆:983 積分:813 註冊:2005-03-10 發送簡訊給我 |
這樣的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 發送簡訊給我 |
|
阿信
版主 發表:111 回覆:983 積分:813 註冊:2005-03-10 發送簡訊給我 |
//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 發送簡訊給我 |
|
faco
一般會員 發表:3 回覆:6 積分:1 註冊:2005-06-25 發送簡訊給我 |
|
cefiro350
一般會員 發表:12 回覆:21 積分:6 註冊:2005-09-08 發送簡訊給我 |
|
阿信
版主 發表:111 回覆:983 積分:813 註冊:2005-03-10 發送簡訊給我 |
引言:補滿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 發送簡訊給我 |
真是太感謝了,不過還是很多地方還要再請問你 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 發送簡訊給我 |
//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 發送簡訊給我 |
我用了您建議的程式,結果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 發送簡訊給我 |
|
cefiro350
一般會員 發表:12 回覆:21 積分:6 註冊:2005-09-08 發送簡訊給我 |
|
DavidLo
高階會員 發表:17 回覆:225 積分:168 註冊:2004-07-21 發送簡訊給我 |
|
cefiro350
一般會員 發表:12 回覆:21 積分:6 註冊:2005-09-08 發送簡訊給我 |
|
faco
一般會員 發表:3 回覆:6 積分:1 註冊:2005-06-25 發送簡訊給我 |
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 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |