为什么当在该行设置断点时我的 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寄存器之前有一个同步器,因此输入信号不会立即出现在输入寄存器中。几个时钟周期就足够等待了。
我正在使用 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寄存器之前有一个同步器,因此输入信号不会立即出现在输入寄存器中。几个时钟周期就足够等待了。