atmega128a单片机程序设计谈原理和重点以及如何解决串口接收数据错位
这篇文章将为大家详细讲解有关atmega128a单片机程序设计谈原理和重点以及如何解决串口接收数据错位,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
我们提供的服务有:网站设计制作、成都网站设计、微信公众号开发、网站优化、网站认证、东山ssl等。为近千家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的东山网站制作公司
atmega128a作为8位单片机中的精英,实在是低端中端产品研发的理想主控芯片。个人觉得它之所以适合这个级别的产品开发。是因为它的主频只能在16M赫兹以内。相对其他动不动就几百兆赫兹的mcu产品来说,它实在不算是高端。对于8位单片机来说,它内置128k的程序存储空间。还有4k的ROM,4k的永久存储数据的epprom,还具有各种串行开发接口。这些都是他的优点。我们的软件可以良好的运行在3大操作系统上,满足您在不同系统下的相同需要.
下面我将结合我的项目来说明几处用法和实验现象,供大家借鉴。
本项目中使用了定时器定时发送数据最低一秒钟发送一次。串口零与传感器进行数据交换,并用液晶显示接收到的传感器数据,也是一秒钟采集一次。串口一用于定时发送数据,发送频率取决于定时器在这里是最低一秒钟。项目初始化时初始化了定时器,串口儿零和串口一,然后开启全局中断。这些都是在初始化中完成的。串口进行数据接收时出现了一个奇怪的现象,这在我以前的项目中也经常出现。在这里还是一样。奇怪的现象是串口接收8个字节数据,但是有时会发生数据错位。例如发送0102030405060708,接收后变成了0801020304050607.是不是很奇怪呢?造成串口接收数据错位的主要原因是发送数据的频率过快,少于串口中断程序处理的时间。
串口来不及处理完毕就又响应了新的串口中断。有的朋友可能会说我清空串口缓冲区的数组不就可以了吗?但是你试试吧,这样是不行的。通过实验我得出的结论是,串口发送的每帧数据的每个字节儿都会产生一个中断,而每个中断产生之后都放入了单片机的串口接收缓冲区中,这个缓冲区不是udr寄存器。我从中看到的现象是,寄存器UDR读取的是单片机的串口接收缓冲区的数据。这个串口接收缓冲区应该是在单片机的内部。数据发送时所有的数据首先进入了单片机的串口接收缓冲区,然后从缓冲区中读取数据到寄存器udr,这时我们在中断程序中读取寄存器udr0或者udr1就读到了串口接收的数据。我们如何能防止?数据接收错位呢?那就是清空单片机内部串口接收缓冲区的数据即可。如何做呢?很简单。只需要将串口重新进行初始化即可,这样单片机的串口缓冲区数据就会清空,也就是忽略了错位的数据继续接收。
对于定时器和串口的初始化。各种寄存器的值该如何设置?这里我推荐一个工具。iccavr.这个小工具设置CPU后设置晶振大小,就可以对定时器定时时间,分频和串口波特率等进行寄存器设置。特别方便。
对于程序中没有用到的中断,切不可将中断标记置位写1。我在串口中初始化时,将串口的发送中断置一了。结果导致CPU复位。如果你无法检测到CPU是否复位,这时你需要在你的开发板上设计一个led指示灯。当程序初始化时,点亮指示灯。程序进入主循环运行时关闭指示灯。这样,如果你在调试的时候发生CPU运行异常。就可以通过指示灯来判断程序的运行状态。
关于atmega128a单片机程序设计谈原理和重点以及如何解决串口接收数据错位就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
网站标题:atmega128a单片机程序设计谈原理和重点以及如何解决串口接收数据错位
浏览地址:http://scyanting.com/article/godeeg.html