【问题标题】:PIC18F locking up if sending data to quicklyPIC18F 发送数据快速锁定
【发布时间】:2010-11-13 23:24:37
【问题描述】:

我正在使用 PIC18F 并尝试通过超级终端发送数据。当我通过每半秒按下一个键以慢速发送数据时,它会接收数据并正确回显它,但是当我开始以更快的速度按下键时,MCU 会锁定。不知道是什么原因造成的。

while(index<length){
    while(PIR1bits.RCIF==0); // Wait till char recieved
    sendData(str2,9); // confirm reception

    Delay1KTCYx(5); //delay because without it, it messes up.
    rxData[index]= RCREG; //char array
    index++;
}

在 PIC 和超级终端上的波特率都是 2400。

这是我们的接收循环。 sendData 只是我们发送说“已收到”的调试代码。这是我们知道它何时冻结的方式。

它不会每次都以相同数量的循环冻结,这仅取决于我们输入数据的速度。

【问题讨论】:

  • 你怎么知道PIC被锁定了?代码来自您的 ISR?或者您是否有额外的 ISR 用于接收字节?
  • 这是在中断服务程序中吗?不要循环,不要发送,不要延迟。

标签: c pic


【解决方案1】:

(我确实在 MCU 上工作,但没有处理 PIC,所以我会尝试帮助解决常见问题)

  1. 您不检查任何接收器错误标志。接收器可能会锁定在溢出错误状态并且不会进一步接收,直到您清除溢出标志。添加错误条件检查并根据 PIC 文档解决它们。

  2. 良好的做法是尽早读取接收到的字节,尽可能在指示接收完成时,因此尝试在while(PIR1bits.RCIF==0); 之后立即移动rxData[index]= RCREG;。这降低了可能性

  3. 您没有显示 sendData 的代码。可能会错过对 TX 就绪状态和错误条件的检查,因此它也可能被锁定。

  4. 无动机的延迟表明您已经在某个地方出错了。尝试删除它,然后调试代码。

  5. 您应该分别测试您的接收和传输。首先,检查发送器:尝试通过UART输出长行文本,没有任何接收。 (比如说,写“Hello world!”程序:))

  6. 单独检查接收器代码:从程序中删除传输,将 LED(电压表,示波器,无论你有什么)连接到空闲的 GPIO 引脚,然后让它在每次接收到一个字节时切换它的逻辑电平。是否只需要几个时钟滴答,它不应该干预接收或锁定。

【讨论】:

    【解决方案2】:

    也许当您在忙于发送“已接收”的同时发送 2 个字符时,其中一个被丢弃并且您永远无法到达您的length

    【讨论】:

      【解决方案3】:

      在大多数微控制器上,UART 接收器溢出会导致新接收到的字节被丢弃并设置一个标志,但接收器将继续正常运行。在 PIC 上,接收器溢出将导致 UART 死机,直到 CREN 位被清除并重新设置。

      【讨论】:

        猜你喜欢
        • 2019-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-07
        • 2018-12-06
        • 1970-01-01
        • 1970-01-01
        • 2014-04-04
        相关资源
        最近更新 更多