【发布时间】:2017-01-09 13:55:45
【问题描述】:
我最近在玩ATmega2560的时候遇到了一个问题,我真的不明白这是怎么回事。
这是我的代码。
主要:
#include "Definitions.h"
int main(void) {
Initialization();
while (1) {
//_delay_ms(1); // or printf...
//wait for RXC flag
if (RxFlag) {
//wait for new byte in
//PORTB &= ~(1 << PB7);
PORTB |= (1 << PB7);
rxcount = 0;
UDR0 = 'R';
RxFlag = false;
TxFlag = false;
}
}
}
IRQ:
#include "Definitions.h"
ISR(USART0_RX_vect) {
while(!(UCSR0A & (1 << RXC0)))
//wait for RXC flag
;
/* Loop-back test */
//PORTB |= (1 << PB7);
//test_data = UDR0;
TxFlag = true;
//enableUDRI0();
//PORTB &= ~(1 << PB7);
//PORTB |= (1 << PB7);
RxBuffer[rxcount++] = UDR0;
if(!(rxcount < RX_BUF_SZ)) {
//rxcount = 0;
PORTB |= (1 << PB7);
RxFlag = true;
}
}
ISR(USART0_UDRE_vect) {
while(!(UCSR0A & (1 << UDRE0)))
//wait for udr to be empty
;
/* Loop-back test */
UDR0 = 0x30 + rxcount;
disableUDRI0();
}
问题是,当我从 USART 收到一些数据时,我试图设置一个 RxFlag 来激活主循环中的 if 语句。但是直到我在 if 语句之前取消注释该函数(可能是 _delay_ms() 或 printf()),它才起作用。
这毫无意义。我记得的是我不需要这些函数,它仍然可以设置全局变量来影响主循环。或者我错过了什么细节?请给我一些线索来弄清楚,我很困惑。
【问题讨论】:
-
请在此处发布您的代码,而不是通过外部链接。
-
进入 ISR 是更糟糕的主意......永远......我猜你是从非中断驱动代码中复制的。
-
看起来对中断的工作方式存在一些重大误解。并且缺少代码。阅读How to Ask 并听从建议!
-
@MichaelWalz 抱歉,我是新来的,对如何解释我遇到的事情感到有点紧张。下次我会做得更好。谢谢。
-
@LPs 是的,我确实误解了非中断驱动的示例代码......感谢您的意见!
标签: c arduino uart interrupt-handling atmega