PIC 18F87J50 USART配置和ISR故障

时间:2013-01-14 07:22:59

标签: embedded pic uart c18 usart

我在使用PIC 18F87J50的项目时遇到问题,特别是在我与其2个USART频道的协调中。

有两个主要问题。

1。)无法设置目标波特率:

我正在使用Open1USART()和Open2USART()函数初始化我正在使用的两个USART通道。我希望它们都配置为14,400波特。这些函数有2个参数。第一个是用于配置USART的位字段(异步与同步模式,8位与9位等)。第二个是SPBRG值(取决于系统时钟速率)配置USART的波特率。

我称之为:Open1USART(USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_BRGH_LOW & USART_RX_INT_ON & USART_TX_INT_OFF, 346);

在我的设置中,346,因为SPBRG似乎给了我14,400波特(在O-scope上确认一位宽度约为70us)。

问题是这仅适用于USART 2.在USART 1上,相同的SPBRG值使我的波特率为57,600。此外,在使用SPBRG值(并查看范围时间以查看实际的波特率影响)时,我看到了一些有趣的事情。

随着我将SPBRG值从0增加,波特率降低.SPBRG为87,得到57,600波特,173 - > 28,800 ......但重置大约为255.在255,我的波特率约为19,000。但是在256,我有一个非常高的波特率(~1,000,000)。然后,当我进一步移动SPBRG编号时,波特率会进一步减慢,但从不低于19,000波特率,并且永远不会一直下​​降到我需要的14,400。

好的,所以我溢出了SPBRG字节,对吧?但USART 1和2的配置完全相同,我可以使用SPBRG值> USART 2上的255.它们都具有相同的BRGH设置(低)和BRG16设置(高)。此外,根据这篇文章(No interrupts being triggered in UART Receive on PIC18F2680),似乎TRISC6-7是正确设置的重要位。我有这样的设置,如帖子所示(6低,7高)。

如果有帮助的话,我可以分享一些代码片段。

2.。)ISR不会触发每个输入字节:

我已经为USART1和2打开​​了UART RX中断。我没有以正确的波特率在USART1上说话,所以我没有收到来自我的外设的回复。但是,在USART2上,我正在以14,400波特进行通话,我的外围设备正在适当地回复(通过范围验证)。使用示波器,我可以看到我期望收到的所有16个字节,并且时序在线上看起来很棒。但是,此端口的RX中断仅触发前2个或3个字节。我需要连续接收8个字节以了解外设正在回复的内容......但我从未超过2或3。

因此中断正在触发,但并非所有字节都在触发。

我知道我需要保持我的ISR非常短,以免错过下一个输入字节的中断,但即使我将ISR剥离到其核心功能(删除调试打印输出等)我也是仍然只看到前3个字节。在范围上,我可以看到前3个字节和剩余的1个字节之间没有区别(至少在位时序中没有)。前三个字节的值始终为0xFF(这是预期的)。剩下的字节是不同的值,但这是我能看到的唯一区别,并没有真正解释为什么没有ISR触发器。上面提到的另一个问题的链接似乎也与这个问题相关。但ISR正在触发,而不是所有时间。

我们非常感谢您提供的任何帮助或见解,我会仔细检查我的客户,以确保我可以添加更多代码段。

0 个答案:

没有答案