打印

串口中断种添这两句话有什么用?

[复制链接]
楼主: xlsbz
手机看帖
扫描二维码
随时随地手机跟帖
61
xlsbz|  楼主 | 2009-12-15 17:05 | 只看该作者 回帖奖励 |倒序浏览
60# 5880527

很抱歉,你的认识是错误的!:victory:

使用特权

评论回复
62
冷漠| | 2009-12-15 21:06 | 只看该作者
有意思。一口米饭的吞咽动作已经完成,下咽到胃的结果好像已经不可控了。如何让米饭不进入胃里而半途终止?

有人想了个办法:那还不好办,我给他心脏一枪,让他生命即刻中止不就完啦?聪明!可惜,难怪咱们设计不出芯片。别人是在数据流的发送器出口上设计闸门硬件,咱们是在数据流的尾巴拽住它。东、西方思维的差别,连打鬼子都是“到敌人后方去,...”

还有个疑问:这两种做法的最终后果是什么?
1、关闭发送器,经过恰当时间,再次打开时,发送缓冲器必为空。
2、停止发送时钟,经过恰当时间再次开放时钟时,发送缓冲器遗留的数据,将再次被驱动发到接收方,接收方对不完整残帧数据是会有动作的,并且会产生异常中断要求CPU来处理的。这恐怕不是发送端程序员的初衷吧。“多做之过。”

   设计芯片的人早就设想到了第2种方法可能的后果,他不会连这点后果都考虑不到吧。——你给对方接收方(适配器)造成了什么;对方的适配器硬件如何设计处理你的发送异常。
  再有一点,由于成帧发送标准都是由适配器采用同步技术按比特流发送的,所以芯片设计的关闭发送器电路是精确关闭点的;例如:它不会在停止域关闭发送器,即使这时你已经程控发出了异常停止发送指令。

   呵呵,那么咱们想到的通过停止发送时钟的方法能够精确关闭点吗?在停止位那一点突然停止了时钟,这一帧白干啦?

   再有没想到的一点,....唉,想不到的技术还多呢。同步通信技术是怎么回事还没搞清楚呢。咱们慢慢学吧。
   也许还有什么更多的我们没想到的东西?落后的差距就源于“不是做不到,而是想不到。”

使用特权

评论回复
63
冷漠| | 2009-12-15 21:34 | 只看该作者
正好刚看完一篇报道《中国军人不生疏》。意为现代战争,不怕敌强我弱,最怕对方采用的高科技武器咱们没见过,不知道性能厉害。

想当年中越反击战,小小的越南竟然能够以20:1 的弱势兵力和中国对抗。结果不但有绝对的空中优势,地面也是占尽便宜。全是美国最新武器,中国军人不但没见过,想都想不到。20个中国军人一次只能仍一颗手榴弹,扔不到50米?美国的掷弹筒百米开外,一个人一次发射一片。距离够不着对手,干挨打。最后的伤亡人数恐怕远不止20:1 了。

所以,什么事多想想可能还有什么想不到的。否则别人35,000米高空施展打击,束手无策干挨打了。

使用特权

评论回复
64
xlsbz|  楼主 | 2009-12-15 21:49 | 只看该作者
大侠高论啊!深奥!:lol

使用特权

评论回复
65
xlsbz|  楼主 | 2009-12-15 21:59 | 只看该作者
52# 冷漠

大侠很厉害!功力很深!
看看这个.........

执行下面的语句(单片机与电脑连接)
while (1) {
          SBUF = 'a';
          SBUF = 'b';
}
那么电脑能收到啥?
--------------------------
执行下面的语句(单片机与电脑连接)
while (1) {
          SBUF = 'a';
          SBUF = 'b';
          SBUF = 'c';
}
那么电脑能收到啥?
--------------------------
执行下面的语句(单片机与电脑连接)
while (1) {
          SBUF = 'a';
          SBUF = 'b';
          SBUF = 'c';
           SBUF = 'd';
}
那么电脑能收到啥?


xlsbz 发表于 2009-12-15 12:00


这个程序是我刚学单片机的串口时弄的。
也是我发现的第一个keil软件仿真不正确的程序。

最后的硬件运行结果是

SBUF = 'a';
则 上位机 收到的数据是
61 61 61 。。。。。。。。。



SBUF = 'a';
SBUF = 'b';

则上位机收到的数据是
61 62 62
61 62 62
61 62 62
.......


SBUF = 'a';
SBUF = 'b';
SBUF = 'c';
则上位机收到的数据是
63 62 61 63
63 62 61 63
63 62 61 63
63 62 61 63
63 62 61 63


用 SBUF = 'a';
SBUF = 'b';
SBUF = 'c';
SBUF = 'd';
则上位机收到的数据是
全部都是 61


可以看到  无论什么情况,第一个发送的字符a总有机会发送成功。

有一点是肯定的:就是字符完全进入移位寄存器后,是以波特率的速度发送的。

另外这两点也可能是对的:(1)字符完全移到移位寄存器外面后,其他字符才会进入到移位寄存器。(2)缓冲器的字符进入到移位寄存器是按照并行方式进入的,就是说是几乎不花时间的。

使用特权

评论回复
66
冷漠| | 2009-12-16 09:57 | 只看该作者
好题目。只是你没有得到确定的结果。这个实验换了我做,肯定会得到另一个结果。——说不清结论啦。

其实都是让中国教授写的书害的。刚看了一本美国教授写的《8051微控制器和嵌入式系统》,同样也是RI/TI 的讲述,几句话就让人——让咱们中国的8051学习者茅塞顿开。怎么中国的教授写的书就那么草根呢,连LS提出的几个问题都讲不清楚,20多年了,国人教授写的8051教材比草还多了,有一本讲清楚LS的问题了吗?  (待续)

使用特权

评论回复
67
xlsbz|  楼主 | 2009-12-16 10:08 | 只看该作者
66# 冷漠

多谢 推荐《8051微控制器和嵌入式系统》,

请问有PDF版本的《8051微控制器和嵌入式系统》么?我在网上没有找到:dizzy:

使用特权

评论回复
68
冷漠| | 2009-12-16 10:26 | 只看该作者
我是在互动出版网上买的。还有1、2本美国人写的关于8051控制器,发现别人写的就是不一样。首先讲述的是设计原理而不是使用方法。

所以,根据设计原理,你的实验结果根本不用做实验就知道结论了。——肯定是它。除非你变换了标准程序写法。

使用特权

评论回复
69
xlsbz|  楼主 | 2009-12-16 10:31 | 只看该作者
68# 冷漠



我一直想找一本讲多讲原理少讲例子的书
《8051微控制器和嵌入式系统》的PDF版我再找找看

推荐一本书《代码大全》 绝对好书。 我闲着没事就看!

使用特权

评论回复
70
5880527| | 2009-12-16 11:30 | 只看该作者
61# xlsbz
呆会我去验证一下,我总觉得它发送了半截后定时器重装值改变了波特率也就会改变,而关闭那定时器发送也就终止了

使用特权

评论回复
71
冷漠| | 2009-12-16 14:13 | 只看该作者
麻烦LS 顺便做一下:发送半截,令TI=1;看看能否中止发送。这才是中外8051教材里讲述的理论上的重要差别。也是中外教授头脑思维的差别。可以引发出很多设计原理,写一篇前人不曾写过的硕士级别的论文。

像LS提出的2种方法无疑是肯定可行的,——人为破坏波特率的稳定条件,但是“有用”吗?能证明什么理论问题?

UART的时钟在具体应用中应该视为固定不变的稳定波特率,可编程的内部时钟一旦初始化设置,显然希望像固定振荡源一样稳定可靠。——结果2个方法都不能用了。我们只能从这些方面考虑问题?

使用特权

评论回复
72
5880527| | 2009-12-16 15:32 | 只看该作者
我和楼主xlsbz的方法都是有点钻牛角尖了;P冷漠的观点是别人设计单片机硬件时已经保证了串口的足够可靠,这是正确的。
刚才试了一下,我的观点是正确的,在数据送到SBUF后延时一段时间在数据还没完全移位完成之前关闭定时器是能阻止数据的后面几位移出的

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
xlsbz + 1
73
5880527| | 2009-12-16 15:39 | 只看该作者
书本上有这样一段“方式1和方式3的波特率可变,由定时器T1的溢出率决定”,所以停止定时器自然就没了节拍信号

使用特权

评论回复
74
冷漠| | 2009-12-16 20:39 | 只看该作者
本帖最后由 冷漠 于 2009-12-17 08:50 编辑

回65楼:做这样的实验显然不能用循环发送,应该只发送一次。像这样:
// while (1) {
          SBUF = 'a';
          SBUF = 'b';
          SBUF = 'c';
         while(1);
//}

还有:下面的写法,将得到不同的结果。(只有从不同的结果中才能发现更多的东西。)
while (1) {
          TI=1;      //   关闭发送中断条件下
          SBUF = 'a';
          SBUF = 'b';
          SBUF = 'c';
         TI=0;
         while(1);
}

这正是中外教授的不同。中国的51教材上写的是“TI=1表示发送器空;通知CPU可以送入下一数据。”“TI必须软件清除为0。”

哈!为什么要软件清除?TI=0应该表示发送器不空(满),那么为什么硬件设计上不利用以发送器SBUF为目标的写脉冲(MOV  SBUF, #DATA )自动清零TI,而要把这个完全可以自动实现的操作留给用户来软件控制实施?——谁都清楚:中外教材上写的很清楚:是MOV  SBUF, #DATA 指令(写脉冲)启动了发送控制器发送开始。那么它同时自动清零TI不是很合理的设计吗?为何留给用户操作?(这里没考虑清除中断的作用。)
    这就是中国教材上20年没有讲清楚的地方。
   
所以,可以展开想象:软件CLR TI; 是有控制作用的。而不仅仅是复位中断申请信号。
SETB TI ;   //  关中断条件下
MOV  SBUF,#DATA;
会发生什么?

使用特权

评论回复
75
desert_hawk| | 2009-12-17 10:46 | 只看该作者
楼上做的这个研究有点意思,以前还真没做过类似试验,现在手头也没有51的板子,没法试了,胡乱猜测一下:看了下51的串口内部结构图,发送似乎是单缓冲,即发送SBUF即是缓冲器又是移位寄存器,所以在启动一次发送后,单片机会有一种“保护机制”保护当前正在发送的SBUF内的数据不被改写,在此期间“写SBUF”的操作是不起作用的,直到发送完成后,TI置位,用户软件对TI进行清除后,才撤销了这种保护机制,所以“TI = 0;”的作用,一是清除中断标志,二有可能就是撤销这种保护机制了。猜的,如果不对,请别拍砖,呵呵。

使用特权

评论回复
76
xlsbz|  楼主 | 2011-5-9 22:37 | 只看该作者
浮云 都是浮云啊.........

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则