搜索
bottom↓
回复: 20

avr单片机的发送中断有一点疑惑?希望各位大侠指点指点?

[复制链接]
头像被屏蔽

出0入0汤圆

发表于 2011-12-16 16:24:09 | 显示全部楼层 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2012-1-11 14:33:42 | 显示全部楼层
“我看了很多的视频啊 上面都是说这个发送中断很少用,不是很明白呀 ”

     视频上说的老师骗人的话。当做成实际产品时,接收肯定要使用“接收中断”数据,改送要使用“发送中断”发送数据。

      下面是改送中断实例:

     1、串口配置
        UCSR1B = (1 << RXEN1) | (1 << RXCIE1) | (1 << TXEN1) | (1 << TXCIE1);
     2、启动发送中断

         事先把数据放到发送缓冲区 USART1_send_buffer[],同时在主程序中发送“发送缓冲区 USART1_send_buffer”中的第1个字节。
        void USART1_Begin_Send(void)
       {
        RS485_SEND_enable();
        NOP();                                                //        --------|
        NOP();                                                //                        |
        NOP();                                                //                        |-----------等待总线释放
        NOP();                                                //                        |
        NOP();                                                //        --------|
        USART1_sendPosi = 0;
         UDR1 = USART1_send_buffer[USART1_sendPosi++];
       }

    3、在发送中断中发送剩余字节


#pragma interrupt_handler USART1_TX_ISR:iv_USART1_TX
void USART1_TX_ISR(void)
{
    if (USART1_sendPosi < USART1_sendCount)
                UDR1 = USART1_send_buffer[USART1_sendPosi++];
        else
                RS485_RECIVE_enable();
}

出0入0汤圆

发表于 2012-1-11 16:27:11 | 显示全部楼层
如果想进一步提高发送速度,对于RS485还可以 “发送空中断”和“发送完成中断”配合使用。
头像被屏蔽

出0入0汤圆

 楼主| 发表于 2012-1-12 21:02:11 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2012-1-13 11:16:10 | 显示全部楼层
回复【楼主位】taocongrong 从戎
请问马老师:怎么理解发送中断 我看过很多的资料中 一般发送中断很少 因为发送的时间很短,并且在写上位机与下位机通讯的程序中 一般都是接受中断,很多程序功能是在接受中断处理的,我看了马老师的410页的例子,对这个发送中断还是有点疑惑,比如我一个di电平触发信号,该信号传送给单片机,然后单片机其实就直接通过发送程序发送给电脑主机 就可以了,还要发送中断干什么,接受了就立即发送,这样来采集信号啊,难道还有很多信号接受后还要等一段时间,才可以处理吗?不是很明白 请马老师讲解一下 ,我看了很多的视频啊 上面都是说这个发送中断很少用,不是很明白呀 。
-----------------------------------------------------------------------

首先你需要明白硬件串口发送的过程和时间。
    MCU的UART发送是硬件完成的,从软件角度看,只要把发送数据写入发送数据寄存器就可以了,硬件将自动完成将并行的8位数据一位一位的串出(加上必要的起始位、停止位等)。串出一个8位数据的时间则与设置使用的BPS有关,假如使用9600bps,可以进行简单的估算;每秒可串出   9600/10 = 960  个字节,此时串出一个字节需要1ms多一点的时间。

    1ms对于人的反应可能是非常短了,但对于工作在几十M的MCU讲,1ms则可以几千到上万条指令了!

    如果你的应用中,只是间断的发送一个字节数据,当然可以不用发送中断的,程序把数据写入发送数据寄存器就可以了,发送的事情由硬件完成,软件可以继续做后面的事情。

    但是你如果一次需要发送一个数据包,比如10个字节,你不使用发送中断的话,就只能采用轮询等待的方式:写完一个字节,就需要轮询更待1ms,然后才能写第2个字节。。。。发送10个字节需要11ms,此时MCU其它的事情都不能做,时间白白浪费,效率就被拉下来了。
头像被屏蔽

出0入0汤圆

 楼主| 发表于 2012-9-10 09:56:21 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
头像被屏蔽

出0入0汤圆

 楼主| 发表于 2012-10-6 11:16:28 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2012-10-6 11:25:54 来自手机 | 显示全部楼层
实际的产品肯定要合理应用中断来提高软件效率

出0入264汤圆

发表于 2012-10-6 15:06:12 来自手机 | 显示全部楼层
taocongrong 发表于 2012-10-6 11:16
马老师节日快乐:

马老师您好:我最近做了一个关于发送中断的工程,关于串口发送中断有一些疑问,我的部 ...

看来你单片机编程完全没有入门。搜索我的帖子,从单片机初学者迈向单片机工程师里面有讲到如何释放cpu. 就你的问题来说,如果是查询发送,cpu一直在等待发送完成,在这期间其它事情都处理不了。如果用中断发送,则将数据扔到缓冲区之后马上就可以做其它事了。效率肯定高几个数量级。
头像被屏蔽

出0入0汤圆

 楼主| 发表于 2012-10-6 16:13:25 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2012-10-6 18:16:28 | 显示全部楼层
machao mcu_lover 两位高人什么感觉?

我突然想起大学时实验室的同学。他有疑惑,你给讲了半天,最后也不知道他真明白还是不知所以然能用就行。
还有,我很讨厌你跟他讲一个问题时,他总是在关注另一个问题,就像你给他讲中断,外部模块,释放CPU,最后他说,哈,波特率一样示波器上看到的就一样嘛。

我不是针对人,而只是想表达,这种感觉不大好。

希望有问题的,最后能给答复你的人一个积极的反馈,我懂了,我哪哪还没懂,甚至我没懂,但我不想再去研究了。懂了最好也用自己的语言简单描述一下,征得别人的肯定,万一你理解的是错的呢,说出来,错了有人会给你指正。
对于第二个问题,我认为你是还没理解,否则不会这么逻辑混乱了。

--------------
打完我觉得这样发出去可能有些不妥,或许是我想的太多了。
头像被屏蔽

出0入0汤圆

 楼主| 发表于 2012-10-7 18:09:14 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
头像被屏蔽

出0入0汤圆

 楼主| 发表于 2012-10-7 18:09:59 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2012-10-8 08:33:54 | 显示全部楼层
taocongrong 发表于 2012-10-7 18:09
这个问题傻孩子老师已经给我解答了,很详细,你说的也对,要真正的明白,我提出的问题那个mcu love没有直 ...

先说声对不起。后来想了想,这个场合说出这个话实在不应该,如果另发个帖子作为一个建议的话要好些。
当时我是突然联想起一些事,很想说些话,也考虑过是不是不妥,不过头脑一热就发出去了。很容易产生针对人的误解,而且是没有经过调查妄加评判。
抱歉了各位。

出0入42汤圆

发表于 2012-10-8 09:04:20 | 显示全部楼层
本帖最后由 jimmy_xt 于 2012-10-8 09:12 编辑
taocongrong 发表于 2012-10-7 18:09
这个问题傻孩子老师已经给我解答了,很详细,你说的也对,要真正的明白,我提出的问题那个mcu love没有直 ...


mcu love当然也回答了这个问题。不能因为说的没有傻孩子精彩,就说他答非所问吧。

如果是查询发送,cpu一直在等待发送完成,在这期间其它事情都处理不了。如果用中断发送,则将数据扔到缓冲区之后马上就可以做其它事了。效率肯定高几个数量级。

这句话,虽然说的没有傻孩子那么专业(毕竟傻孩子-其实叫王老师比较好-是软件专业的),但基本上是同样意思。

PS:其实马老师说的就已经很清楚了。

PS:个人不建议一个项目中开过多中断,尤其是一些实时性要求高的项目。
如果USART发送数据量非常大的话,建议参考这个帖子
http://www.amobbs.com/forum.php? ... ghlight=avr%2Busart
以保证缓冲区最大化。

出0入0汤圆

发表于 2012-10-8 15:31:07 | 显示全部楼层
mcu_lover 发表于 2012-10-6 15:06
看来你单片机编程完全没有入门。搜索我的帖子,从单片机初学者迈向单片机工程师里面有讲到如何释放cpu.  ...

阁下难道是传说中的红金龙吸味?

出0入0汤圆

发表于 2012-10-8 15:32:07 | 显示全部楼层
machao 发表于 2012-1-13 11:16
回复【楼主位】taocongrong 从戎
请问马老师:怎么理解发送中断 我看过很多的资料中 一般发送中断很少 因为 ...

现在像stm32这种高端的控制器已经具备了DMA功能的USART接口,据说效率要比中断加环形队列还高,马老师能否写一篇教程呢?最好是485通信的

出0入264汤圆

发表于 2012-10-8 20:09:39 | 显示全部楼层
sbk100 发表于 2012-10-8 15:31
阁下难道是传说中的红金龙吸味?

呵呵,是的。换马甲了。

出0入264汤圆

发表于 2012-10-8 20:26:10 | 显示全部楼层
taocongrong 发表于 2012-10-7 18:09
这个问题傻孩子老师已经给我解答了,很详细,你说的也对,要真正的明白,我提出的问题那个mcu love没有直 ...

之前手机回帖不方便,现在在电脑上面回你。

好像你有个问题没有搞清楚。不管是中断+缓冲方式  还是直接等待发送这种方式,这个效率不是你用示波器测波特率能够测出来的。
对于指定的波特率,难道你能够测出来两种波形???


好了,下面重点讲讲效率的问题。

假设系统中有一个主机, N个从机,通信方式为主机主动发起,从机应答。每个命令包长度为10个字节。
假定波特率9600 bps

则一个命令包长度发送完毕耗时约为 11 ms

采用查询方式发送:

//伪代码,下面函数发送指定 字节, 采用等待方式发送
SendCmdPacket(uint8 * pBuffer, uint8 u8Length)

//伪代码,下面函数发送指定 字节, 采用中断+缓冲方式
SendCmdPacketToBuffer(uint8 * pBuffer, uint8 u8Length)


则调用SendCmdPacket()发送时候,该函数会阻塞 11ms 直到发送完毕

相反,调用SendCmdPacketToBuffer()发送时候,该函数将数据包复制到缓冲区后,立即返回,耗时可能只有不到 0.1 ms 时间
加上中断处理时间 整个数据包发送完毕消耗CPU时间约为 1ms

相比查询方式,中断方式可以多出10ms 时间用来处理其它任务,这10 ms 就是效率!!!
而且通信数据包长度越长,优势越明显。


你的主机系统不可能只有通信任务,如果还有按键,显示等等其它任务,则用中断+缓冲能够提高整个系统的实时性!

明白否?
头像被屏蔽

出0入0汤圆

 楼主| 发表于 2012-10-8 22:49:07 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2012-10-19 21:38:08 | 显示全部楼层
mcu_lover 发表于 2012-10-8 20:26
之前手机回帖不方便,现在在电脑上面回你。

好像你有个问题没有搞清楚。不管是中断+缓冲方式  还是直接 ...

解释非常好,现在市面充斥非常多的“名人”的教科书,按键消抖用软件延时(前天我上研究生课,一个学生拿出书,还是“实战应用”),我劝他说:丢掉垃圾箱吧。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 15:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表