NULL 原创文章/义县游学电子科技有限公司www.yxzhw.cn
首页
技术分享
公司简介
产品展示
人才招聘
联系我们
义县游学电子科技
原创编程技术
标题: atmega128a单片机程序设计谈原理和重点,解决串口接收数据错位
原创作者:义县游学电子科技有限公司
发布时间:2019-11-08 11:04:36


atmega128a作为8位单片机中的精英,实在是低端中端产品研发的理想主控芯片。个人觉得它之所以适合这个级别的产品开发。是因为它的主频只能在16M赫兹以内。相对其他动不动就几百兆赫兹的mcu产品来说,它实在不算是高端。对于8位单片机来说,它内置128k的程序存储空间。还有4k的ROM,4k的永久存储数据的epprom,还具有各种串行开发接口。这些都是他的优点。

下面我将结合我的项目来说明几处用法和实验现象,供大家借鉴。

本项目中使用了定时器定时发送数据最低一秒钟发送一次。串口零与传感器进行数据交换,并用液晶显示接收到的传感器数据,也是一秒钟采集一次。串口一用于定时发送数据,发送频率取决于定时器在这里是最低一秒钟。项目初始化时初始化了定时器,串口儿零和串口一,然后开启全局中断。这些都是在初始化中完成的。串口进行数据接收时出现了一个奇怪的现象,这在我以前的项目中也经常出现。在这里还是一样。奇怪的现象是串口接收8个字节数据,但是有时会发生数据错位。例如发送0102030405060708,接收后变成了0801020304050607.是不是很奇怪呢?造成串口接收数据错位的主要原因是发送数据的频率过快,少于串口中断程序处理的时间。

串口来不及处理完毕就又响应了新的串口中断。有的朋友可能会说我清空串口缓冲区的数组不就可以了吗?但是你试试吧,这样是不行的。通过实验我得出的结论是,串口发送的每帧数据的每个字节儿都会产生一个中断,而每个中断产生之后都放入了单片机的串口接收缓冲区中,这个缓冲区不是udr寄存器。我从中看到的现象是,寄存器UDR读取的是单片机的串口接收缓冲区的数据。这个串口接收缓冲区应该是在单片机的内部。数据发送时所有的数据首先进入了单片机的串口接收缓冲区,然后从缓冲区中读取数据到寄存器udr,这时我们在中断程序中读取寄存器udr0或者udr1就读到了串口接收的数据。我们如何能防止?数据接收错位呢?那就是清空单片机内部串口接收缓冲区的数据即可。如何做呢?很简单。只需要将串口重新进行初始化即可,这样单片机的串口缓冲区数据就会清空,也就是忽略了错位的数据继续接收。

对于定时器和串口的初始化。各种寄存器的值该如何设置?这里我推荐一个工具。iccavr.这个小工具设置CPU后设置晶振大小,就可以对定时器定时时间,分频和串口波特率等进行寄存器设置。特别方便。

对于程序中没有用到的中断,切不可将中断标记置位写1。我在串口中初始化时,将串口的发送中断置一了。结果导致CPU复位。如果你无法检测到CPU是否复位,这时你需要在你的开发板上设计一个led指示灯。当程序初始化时,点亮指示灯。程序进入主循环运行时关闭指示灯。这样,如果你在调试的时候发生CPU运行异常。就可以通过指示灯来判断程序的运行状态。很实用的,对不对

如果你也用avr进行项目开发或者想学习,可以联系我带你入avr群115398391或者关注我。我会继续将学习过程中的心得体会经验分享给大家。这里是义县游学电子科技,祝愿各位工作顺利,身体健康,学习进步。

上一页 返回目录 没有了