저는 ATmega2560으로 놀고있을 때 최근에 문제를 만났습니다. 실제로 그 문제가 무엇인지 이해하지 못합니다.UART 인터럽트를 사용하여 글로벌 플래그를 제어하는 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 일부 datas를 받았을 때, 나는 RxFlag을 설정하려고하는 메인 루프에서 활성화 된 경우 문 수 . 하지만 _delay_ms() 또는 printf() 일 수있는 if 문 앞에 함수의 주석을 제거 할 때까지 작동하지 않았습니다.
의미가 없습니다. 내가 기억하는 것은 내가 그 함수들을 필요로하지 않고 여전히 전역 변수들이 메인 루프에 영향을 미치도록 설정할 수 있다는 것이다. 또는 내가 놓친 세부 사항이 있습니까? 알아내는 데 약간의 단서를주세요. 혼란 스럽습니다.
외부 링크를 사용하지 말고 여기에 코드를 게시하십시오. –
ISR에있는 동안은 더 나쁜 생각입니다 ... 혹시 ... 그 형식을 비 인터럽트 코드로 복사 한 것 같습니다. – LPs
인터럽트가 작동하는 방식에 대한 몇 가지 중요한 오해가있는 것처럼 보입니다. 코드가 누락되었습니다. [ask]를 읽고 조언을 따르십시오! – Olaf