作者tea1116 (大鈞)
看板ASM
標題[問題] 8051串列傳輸接收資料後對其他輸入做處理問題
時間Wed Nov 7 22:26:52 2007
ORG00H
MAIN:
;========設定鮑率========可以正確接收了
MOVTMOD,
#00100000B;使用計時計數器模式暫存器1與2 ,1號mode2,2號mode1
;
MOVTH1,#FDH;鮑率=9600,可由timer1 mode2 產生
MOVTL1,#FDH
REV:
SETB P1.1
MOVSCON,
#01010000B;SCON串列埠控制暫存器01=mode1,ren=1開始接收
SETBTR1
;部分1=========等待垂直訊號進來,開始做延遲==================
;byte1
JNBRI,$;RI=1?,是,下一步,否則繼續偵測
MOVA,SBUF
MOVR0,A
CLRRI
;byte2
JNBRI,$;RI=1?,是,下一步,否則繼續偵測
MOVA,SBUF
MOVR1,A
CLRRI
;byte3
JNBRI,$;RI=1?,是,下一步,否則繼續偵測
MOVA,SBUF
MOVR2,A
CLRRI
;部分2=========等待垂直訊號進來,開始做延遲==================部分2
MOVP0,#0FFH
LOOP:
SETB P1.1;P2.1的狀態一開始高5v電位
LOOP1:MOVA,P0;等待下一個垂直脈波出現
CJNEA,
#11111111B,LOOP1
SETB P1.1
ACALL DELAY
CLR P1.1
AJMP REV
DELAY:
MOV R6,#43
S3: MOV R7,#76
DJNZ R7,$
DJNZ R6,S3
MOV R7,#4
DJNZ R7,$
RET
JMP LOOP
END
**************************************
以上是我做的程式
我的功能是
1.我點觸控螢幕後接收觸控螢幕的資料放於r3 r2 r1
2.接收完以後等待螢幕的數位訊號高電位的時候做一段時間的delay
然後送出1us的低電位(此種動作接在光筆可以讓主機知道我的滑鼠要定位在哪裡)
3.跳回去等待我下一次點觸控螢幕
問題來了:
1.我有只單純做部分一的程式,每個byte如同預期沒問題
部分二所做出來的座標位置(用延遲時間來算的),也大約在1~4us的誤差內
(還能接受)
但是當我把兩個部分放在一起的時候卻有1~15us的大誤差,所以我想問的是
"當我接收完串列資料以後然後要做其他動作的時候我需不需要設定什麼才能讓結果如同
沒加上接收串列資料的結果一樣?"
雖然結果只差15us,但對我ㄧ個座標只有30ns卻是非常大的錯誤
p.s因為這是測試程式,所以我沒有對串列資料作處理,但是結果還是有上面提到的誤差
感謝大大們的幫忙阿
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.175.183.91
1F:推 ruemann:這個排版真是……太贊了……orz 11/07 22:39
2F:→ ruemann:看不懂你說的1~4us和1~15us的誤差是如何算出的 11/07 22:39
3F:→ ruemann:所謂的誤差是?另外,30ns一個座標是指?看不懂 11/07 22:40
4F:→ tea1116:我的意思是我做這CODE是接收串列資料後不處理 11/07 22:47
5F:→ tea1116:然後DELAY一段時間CLR P1.1腳 11/07 22:48
6F:→ tea1116:而至於怎麼知道DELAY時間的問題,因為以800*600為例 11/07 22:49
7F:→ tea1116:我要定位Y=300在螢幕上的話,就送出300*30ns的delay 11/07 22:50
8F:→ tea1116:線在單純只定位在我想讓滑鼠停在螢幕某點可以做到 11/07 22:51
9F:推 ruemann:所以你的意思是,當滑鼠點了以後,你顯示的點和滑鼠的位置 11/07 22:53
10F:→ ruemann:有誤差就是了? 11/07 22:53
11F:→ tea1116:所以我只要燒玩啟動電路就知道滑鼠位置跟加部份1的結果 11/07 22:52
12F:→ ruemann:再問一下,你的8051是幾T的,另外用多少MHz的Crystal 11/07 22:54
13F:→ tea1116:差多少了?主要問題在這兩個放一起是否需設定什麼 11/07 22:54
14F:→ tea1116:對阿...我的意思是這樣~希望可以幫我解決 11/07 22:55
15F:推 ruemann:依你的條件,假設誤差要設在1us以內,則每個指令的時間需 11/07 22:57
16F:→ ruemann:要小於1us,最好是每個指令能小於0.5us比較容易做 11/07 22:57
17F:→ tea1116:可是現在問題點是我加了接收串列資料跟沒家結果有出入 11/07 22:59
18F:→ tea1116:問題在於我不清楚這兩者加起來怎麼會干擾? 11/07 23:00
19F:→ tea1116:因為我接受串列資料只是做到碰一下做一個DELAY. 11/07 23:00
20F:→ tea1116:理論上應該不影響我要做的後面的DELAY部分,但結果有影響 11/07 23:01
21F:推 ruemann:要確定在接收UART時,垂直訊號是否已經進來了? 11/07 23:04
22F:→ ruemann:你現在是先收3bytes,然後再去檢查P1,所以如果在收UART 11/07 23:05
23F:→ ruemann:時,P1的狀態已經改變的話,那麼誤差就有可能產生 11/07 23:05
24F:→ tea1116:垂直訊號一直有進來...所以大大的意思是我收UART時 11/07 23:07
25F:→ tea1116:有可能影響到P1的垂直訊號摟? 11/07 23:08
26F:→ tea1116:那單純只看加上UART跟沒加只做DELAY的CODE 11/07 23:09
27F:→ tea1116:加了以後不做什麼設定不會影響後面做DELAY嗎? 11/07 23:11
28F:→ tea1116:因為垂直訊號是固定從螢幕送出來的...應該不會有問題 11/07 23:12
29F:推 ruemann:我的意思是,沒有收UART的話,那垂直訊號應該不會漏掉 11/07 23:12
30F:→ tea1116:如果有問題的話在我只單純做DELAY的時候就會有問題 11/07 23:13
31F:→ ruemann:但加了UART後,就有可能會漏掉幾個訊號,那會不會影響結 11/07 23:13
32F:→ ruemann:果不清楚 11/07 23:13
33F:→ tea1116:不會等我加了URAT以後才又增大誤差(1~15us) 11/07 23:13
34F:→ tea1116:那有辦法拿到漏掉的訊號嗎?減慢做UART的速度之類的 11/07 23:14
35F:→ tea1116:我有試過可是沒影響 11/07 23:15
36F:推 ruemann:UART不是可以用中斷去收嗎? 11/07 23:16
37F:→ tea1116:用中斷就可以去掉考慮訊號漏掉的問題嗎? 11/07 23:19
38F:→ tea1116:因為我後面還需要這些BYTE的資料作處理 11/07 23:20
39F:→ tea1116:所以我才寫在最前面...那如果用中斷我該怎麼寫呢 11/07 23:21
40F:推 ruemann:UART是只有一次,還是會一直去讀? 11/07 23:22
41F:→ tea1116:把它改成副程式?然後ACALL UART副程式 11/07 23:21
42F:→ tea1116:感覺也是做同樣的動作的樣子 11/07 23:22
43F:→ tea1116:一直讀...因為要做定位的工作...所以一直要再同一點 11/07 23:22
44F:推 ruemann:用中斷的話,在讀UART時就不用一直耗在那裡,影響會小很多 11/07 23:25
45F:推 tea1116:嗯嗯..那我明天TRY看看再回報請大大幫忙 11/07 23:27
46F:→ tea1116:也感謝大大不辭辛勞回答我的問題 11/07 23:27
47F:→ tea1116:因為我也覺得是UART接收部分影響作DELAY部分 11/07 23:28
48F:推 ruemann:你設9600,那收3個bytes至少要3.4375ms,如果訊號的速度 11/07 23:29
49F:→ ruemann:比這個還慢的話,大概影響不大 11/07 23:29
50F:→ tea1116:只是不清楚UART要怎麼做才不會影響作DELAY的方法 11/07 23:28
51F:→ tea1116:訊號的速度大概16ms會出現一次高電位 11/07 23:30
52F:→ tea1116:可惜理論跟結果出來的有出入阿...所以要假設會影響才行 11/07 23:31
53F:→ tea1116:目前沒有找到書有講說類似這方面的問題 11/07 23:32
54F:推 ruemann:有多的IO的話,在讀UART時設成high,然後和訊號做比較 11/07 23:33
55F:→ ruemann:看會不會打架 11/07 23:33
56F:→ ruemann:如果你有示波器或LA的話 11/07 23:33
57F:→ tea1116:我都有...那我也會測試看看...先建立副程式然後再做這動作 11/07 23:34
58F:→ tea1116:恩?可是我的P1.1就是設為HIGH然後做比較耶 11/07 23:35
59F:→ tea1116:現在我就有用到3個PORT 1個接收訊號做DELAY 一個UART 11/07 23:37
60F:→ tea1116:一個等DALAY完立刻送低電位 11/07 23:38
61F:→ tea1116:而我的IC 89C51只有三個I/O PORT ....用滿了 11/07 23:38
62F:推 tea1116:做中斷結果一樣..看樣子又卡關了.... 11/08 23:26
※ 編輯: tea1116 來自: 140.127.77.235 (11/09 13:51)
63F:推 ruemann:解決了是很好,不過方便的話大概敘述一下原因… 11/09 20:57
64F:推 tea1116:原因是uart收資料的時間影響做延遲的時間~不過加判斷式就 11/10 00:15
65F:→ tea1116:好了...還是感謝大大幫忙 11/10 00:16
66F:推 ruemann:就是a+b>c……還真的沒想到 11/10 09:45
67F:→ ruemann:所以要調整一下b的值…… 11/10 09:46
68F:推 ruemann:其實用timer計時,時間到就送訊號出去,做法上會比較簡單 11/10 16:26