为什么当在该行设置断点时我的 Xmega 上的比较会工作,但通常 运行 时不会?

Why would comparisons on my Xmega work when a breakpoint is set on that line, but not when running normally?

我正在使用 Xmega384C3,我想做的就是将信号发送到输出端口并在输入端口读取它。我将 PORTC 设置为输出端口,将 PORTA 设置为输入端口。每个端口上的相应引脚短接在一起(PortA 引脚 0 到 PortC 引脚 0,等等)。

我的问题出现在以下代码中:

uint8_t i;
int count = 0;

for(i=2; i<8; i++) {
    PORTC.OUT = (1 << i);
    if (PORTA.IN == PORTC.OUT) {
        count++;
    }
}

if (count == 6) {
    //success
}

我基本上只想读到当我在 PORTC 上的一个引脚上发送一个逻辑高电平时,我可以在 PORTA 上的相应引脚上读取它。当我让代码 运行 正常时,它找不到任何匹配项,因此永远不会增加计数。但是,如果我在 if 比较发生的行上添加一个断点,它将计算为 true 并按预期递增计数。此外,我可以在 Atmel Studio 的 I/O 视图功能中看到端口具有正确的值。有什么想法吗?

这是一个时间问题,没有足够长的时间让引脚上的值反映我在代码中设置的值。该问题已通过使用 delay.h 库中的延迟函数 _delay_us(1) 添加 1 微秒的延迟得到解决。

查看任何 XMEGA 手册 > I/O 端口 > 概述 > 常规 I/O 引脚功能

在IN寄存器之前有一个同步器,因此输入信号不会立即出现在输入寄存器中。几个时钟周期就足够等待了。