作者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