请教一个485收发转换的问题(相当迷糊)

[复制链接]
2912|3
 楼主| kanprin 发表于 2008-12-5 17:00 | 显示全部楼层 |阅读模式
单片机用avr&nbsp;的mega64,相关的操作如下:<br /><br />#define&nbsp;SERIAL1_SEND&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;PORTG&nbsp;|=&nbsp;(1&nbsp;&lt&lt&nbsp;PG4))<br />#define&nbsp;SERIAL1_RECEIVE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;PORTG&nbsp;&=&nbsp;~(1&nbsp;&lt&lt&nbsp;PG4))<br /><br />void&nbsp;uart1_printf(u8_t&nbsp;*p,u8_t&nbsp;length)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;SERIAL1_SEND;//发送使能<br />&nbsp;&nbsp;&nbsp;&nbsp;cli();<br />&nbsp;&nbsp;&nbsp;&nbsp;uart1TxWrite&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;uart1TxRead&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(length--)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uart1TxBuf[uart1TxWrite++]&nbsp;=&nbsp;*p++;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;sei();<br />&nbsp;&nbsp;&nbsp;&nbsp;UCSR1B&nbsp;|=&nbsp;(1&lt&ltUDRIE1);&nbsp;&nbsp;&nbsp;&nbsp;//开始发送<br />}<br /><br />ISR(USART1_UDRE_vect)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;UCSR1A&nbsp;|=&nbsp;(1&nbsp;&lt&lt&nbsp;TXC1);<br />&nbsp;&nbsp;&nbsp;&nbsp;UDR1&nbsp;=&nbsp;uart1TxBuf[uart1TxRead++];<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(uart1TxRead&nbsp;&gt=&nbsp;uart1TxWrite)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;uart1TxRead&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;uart1TxWrite&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;UCSR1B&nbsp;&=&nbsp;~(1&lt&ltUDRIE1);<br />&nbsp;&nbsp;&nbsp;&nbsp;UCSR1B&nbsp;|=&nbsp;(1&lt&ltTXCIE1);//发送完最后一个字节开启TX完成中断<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />ISR(USART1_TX_vect)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;UCSR1A&nbsp;|=&nbsp;(1&nbsp;&lt&lt&nbsp;TXC1);<br />&nbsp;&nbsp;&nbsp;&nbsp;UCSR1B&nbsp;&=&nbsp;~(1&lt&ltTXCIE1);&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;关闭TX中断<br />&nbsp;&nbsp;&nbsp;&nbsp;SERIAL1_RECEIVE;<br />}<br /><br /><br /><b>现在碰到的问题是:通信一段时间后,485的发送脚会一直处在高电平状态,导致通信无法继续下去(无法接收到数据)</b><br /><br />于是我在发送的时候,同时用一个IO接灯来显示发送状态,亮表示发送,灭表示接收:(共阳接法)<br />#define&nbsp;SERIAL1_SEND&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;PORTG&nbsp;|=&nbsp;(1&nbsp;&lt&lt&nbsp;PG4);PORTF&nbsp;&=&nbsp;~(1&nbsp;&lt&lt&nbsp;PF4);)<br />#define&nbsp;SERIAL1_RECEIVE&nbsp;&nbsp;(&nbsp;PORTG&nbsp;&=&nbsp;~(1&nbsp;&lt&lt&nbsp;PG4);PORTF&nbsp;|=&nbsp;(1&nbsp;&lt&lt&nbsp;PF4);)<br /><br /><b>发现,当485一直处于之前提到的错误状态时,我的发送灯是灭的,也就是程序已经退出了发送状态,而发送脚却还在发送状态(为何?)</b><br /><br />糊涂之中,恳请高人解答,谢谢。<br />
chunyang 发表于 2008-12-5 17:58 | 显示全部楼层

在理解器件工作过程的基础上,绘制出你的详细程序流程

如此很容易找到问题,关键是养成良好的习惯,编程前就应首先制定详细的程序流程。
xwj 发表于 2008-12-5 18:02 | 显示全部楼层

把你的485收发控制脚接那个灯的控制脚上:-)

  
 楼主| kanprin 发表于 2008-12-5 23:44 | 显示全部楼层

re:

多谢两位的支持。<br />关于流程图,我知道这是一个很好的习惯。<br />只是觉得麻烦,基本都不写。<br />不过我一般都是先整理好思路后再写程序的。<br /><br />to:&nbsp;xwj,如果用485控制的脚直接接灯,好像没啥用吧?<br />因为出现这个状态的时候,我用万用表和示波器都量过了,<br />该控制脚是高电平的,而平时的波形正常。<br /><br />程序简单流程:<br /><br />uart1_printf();<br />//将485切为发送状态<br />//函数把需要发送到数据堆到发送缓冲区,<br />//当所需发送的数据准备充分后,开启UART1的数据寄存器空中断,开始发送数据<br /><br />ISR(USART1_UDRE_vect)<br />//UART1的发送中断,只要uart1TxRead小于uart1TxWrite,即还有数据没发送<br />//即把数据往发送寄存器上送,同时读指针加1<br />//当发送读指针与写指针相等时,即数据发送完成,关闭寄存器为空中断,开启发送完成中断,准备结束发送<br /><br />ISR(USART1_TX_vect)<br />//将发送完成中断关闭,把485切换为接收状态<br /><br /><b>对于流程方面(思路)还有什么不对的,还请chunyang前辈指出,我现在只能是怀疑硬件方面会不会有什么问题?&nbsp;谢谢大家关注</b>
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

343

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部