[問題] 已解決...有相同問題可以寫信問我

看板ASM (組合語言)作者 (大鈞)時間16年前 (2007/11/07 22:26), 編輯推噓16(16052)
留言68則, 2人參與, 最新討論串1/1
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

11/07 22:39, , 1F
這個排版真是……太贊了……orz
11/07 22:39, 1F

11/07 22:39, , 2F
看不懂你說的1~4us和1~15us的誤差是如何算出的
11/07 22:39, 2F

11/07 22:40, , 3F
所謂的誤差是?另外,30ns一個座標是指?看不懂
11/07 22:40, 3F

11/07 22:47, , 4F
我的意思是我做這CODE是接收串列資料後不處理
11/07 22:47, 4F

11/07 22:48, , 5F
然後DELAY一段時間CLR P1.1腳
11/07 22:48, 5F

11/07 22:49, , 6F
而至於怎麼知道DELAY時間的問題,因為以800*600為例
11/07 22:49, 6F

11/07 22:50, , 7F
我要定位Y=300在螢幕上的話,就送出300*30ns的delay
11/07 22:50, 7F

11/07 22:51, , 8F
線在單純只定位在我想讓滑鼠停在螢幕某點可以做到
11/07 22:51, 8F

11/07 22:53, , 9F
所以你的意思是,當滑鼠點了以後,你顯示的點和滑鼠的位置
11/07 22:53, 9F

11/07 22:53, , 10F
有誤差就是了?
11/07 22:53, 10F

11/07 22:52, , 11F
所以我只要燒玩啟動電路就知道滑鼠位置跟加部份1的結果
11/07 22:52, 11F

11/07 22:54, , 12F
再問一下,你的8051是幾T的,另外用多少MHz的Crystal
11/07 22:54, 12F

11/07 22:54, , 13F
差多少了?主要問題在這兩個放一起是否需設定什麼
11/07 22:54, 13F

11/07 22:55, , 14F
對阿...我的意思是這樣~希望可以幫我解決
11/07 22:55, 14F

11/07 22:57, , 15F
依你的條件,假設誤差要設在1us以內,則每個指令的時間需
11/07 22:57, 15F

11/07 22:57, , 16F
要小於1us,最好是每個指令能小於0.5us比較容易做
11/07 22:57, 16F

11/07 22:59, , 17F
可是現在問題點是我加了接收串列資料跟沒家結果有出入
11/07 22:59, 17F

11/07 23:00, , 18F
問題在於我不清楚這兩者加起來怎麼會干擾?
11/07 23:00, 18F

11/07 23:00, , 19F
因為我接受串列資料只是做到碰一下做一個DELAY.
11/07 23:00, 19F

11/07 23:01, , 20F
理論上應該不影響我要做的後面的DELAY部分,但結果有影響
11/07 23:01, 20F

11/07 23:04, , 21F
要確定在接收UART時,垂直訊號是否已經進來了?
11/07 23:04, 21F

11/07 23:05, , 22F
你現在是先收3bytes,然後再去檢查P1,所以如果在收UART
11/07 23:05, 22F

11/07 23:05, , 23F
時,P1的狀態已經改變的話,那麼誤差就有可能產生
11/07 23:05, 23F

11/07 23:07, , 24F
垂直訊號一直有進來...所以大大的意思是我收UART時
11/07 23:07, 24F

11/07 23:08, , 25F
有可能影響到P1的垂直訊號摟?
11/07 23:08, 25F

11/07 23:09, , 26F
那單純只看加上UART跟沒加只做DELAY的CODE
11/07 23:09, 26F

11/07 23:11, , 27F
加了以後不做什麼設定不會影響後面做DELAY嗎?
11/07 23:11, 27F

11/07 23:12, , 28F
因為垂直訊號是固定從螢幕送出來的...應該不會有問題
11/07 23:12, 28F

11/07 23:12, , 29F
我的意思是,沒有收UART的話,那垂直訊號應該不會漏掉
11/07 23:12, 29F

11/07 23:13, , 30F
如果有問題的話在我只單純做DELAY的時候就會有問題
11/07 23:13, 30F

11/07 23:13, , 31F
但加了UART後,就有可能會漏掉幾個訊號,那會不會影響結
11/07 23:13, 31F

11/07 23:13, , 32F
果不清楚
11/07 23:13, 32F

11/07 23:13, , 33F
不會等我加了URAT以後才又增大誤差(1~15us)
11/07 23:13, 33F

11/07 23:14, , 34F
那有辦法拿到漏掉的訊號嗎?減慢做UART的速度之類的
11/07 23:14, 34F

11/07 23:15, , 35F
我有試過可是沒影響
11/07 23:15, 35F

11/07 23:16, , 36F
UART不是可以用中斷去收嗎?
11/07 23:16, 36F

11/07 23:19, , 37F
用中斷就可以去掉考慮訊號漏掉的問題嗎?
11/07 23:19, 37F

11/07 23:20, , 38F
因為我後面還需要這些BYTE的資料作處理
11/07 23:20, 38F

11/07 23:21, , 39F
所以我才寫在最前面...那如果用中斷我該怎麼寫呢
11/07 23:21, 39F

11/07 23:22, , 40F
UART是只有一次,還是會一直去讀?
11/07 23:22, 40F

11/07 23:21, , 41F
把它改成副程式?然後ACALL UART副程式
11/07 23:21, 41F

11/07 23:22, , 42F
感覺也是做同樣的動作的樣子
11/07 23:22, 42F

11/07 23:22, , 43F
一直讀...因為要做定位的工作...所以一直要再同一點
11/07 23:22, 43F

11/07 23:25, , 44F
用中斷的話,在讀UART時就不用一直耗在那裡,影響會小很多
11/07 23:25, 44F

11/07 23:27, , 45F
嗯嗯..那我明天TRY看看再回報請大大幫忙
11/07 23:27, 45F

11/07 23:27, , 46F
也感謝大大不辭辛勞回答我的問題
11/07 23:27, 46F

11/07 23:28, , 47F
因為我也覺得是UART接收部分影響作DELAY部分
11/07 23:28, 47F

11/07 23:29, , 48F
你設9600,那收3個bytes至少要3.4375ms,如果訊號的速度
11/07 23:29, 48F

11/07 23:29, , 49F
比這個還慢的話,大概影響不大
11/07 23:29, 49F

11/07 23:28, , 50F
只是不清楚UART要怎麼做才不會影響作DELAY的方法
11/07 23:28, 50F

11/07 23:30, , 51F
訊號的速度大概16ms會出現一次高電位
11/07 23:30, 51F

11/07 23:31, , 52F
可惜理論跟結果出來的有出入阿...所以要假設會影響才行
11/07 23:31, 52F

11/07 23:32, , 53F
目前沒有找到書有講說類似這方面的問題
11/07 23:32, 53F

11/07 23:33, , 54F
有多的IO的話,在讀UART時設成high,然後和訊號做比較
11/07 23:33, 54F

11/07 23:33, , 55F
看會不會打架
11/07 23:33, 55F

11/07 23:33, , 56F
如果你有示波器或LA的話
11/07 23:33, 56F

11/07 23:34, , 57F
我都有...那我也會測試看看...先建立副程式然後再做這動作
11/07 23:34, 57F

11/07 23:35, , 58F
恩?可是我的P1.1就是設為HIGH然後做比較耶
11/07 23:35, 58F

11/07 23:37, , 59F
現在我就有用到3個PORT 1個接收訊號做DELAY 一個UART
11/07 23:37, 59F

11/07 23:38, , 60F
一個等DALAY完立刻送低電位
11/07 23:38, 60F

11/07 23:38, , 61F
而我的IC 89C51只有三個I/O PORT ....用滿了
11/07 23:38, 61F

11/08 23:26, , 62F
做中斷結果一樣..看樣子又卡關了....
11/08 23:26, 62F
※ 編輯: tea1116 來自: 140.127.77.235 (11/09 13:51)

11/09 20:57, , 63F
解決了是很好,不過方便的話大概敘述一下原因…
11/09 20:57, 63F

11/10 00:15, , 64F
原因是uart收資料的時間影響做延遲的時間~不過加判斷式就
11/10 00:15, 64F

11/10 00:16, , 65F
好了...還是感謝大大幫忙
11/10 00:16, 65F

11/10 09:45, , 66F
就是a+b>c……還真的沒想到
11/10 09:45, 66F

11/10 09:46, , 67F
所以要調整一下b的值……
11/10 09:46, 67F

11/10 16:26, , 68F
其實用timer計時,時間到就送訊號出去,做法上會比較簡單
11/10 16:26, 68F
文章代碼(AID): #17CSil-v (ASM)
文章代碼(AID): #17CSil-v (ASM)