Недавно я столкнулся с проблемой, когда играл с ATmega2560, и я действительно не понимаю, что с ним не так.ATmega2560 с использованием прерывания UART для управления глобальным флагом
Вот мой код.
главная:
#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-statement, который может быть _delay_ms() или printf().
Это не имеет никакого смысла. Я помню, что мне не нужны эти функции, и он все равно может заставить глобальные переменные влиять на основной цикл. Или есть какие-то подробности, которые я пропустил? Пожалуйста, дайте мне подсказку, чтобы понять это, я смущен.
Пожалуйста, разместите здесь свой код, а не внешние ссылки. –
В то время как ISR является худшей идеей ... когда-либо ... Думаю, вы скопировали эту форму, не приводящую к прерыванию код. – LPs
Похоже, есть некоторые основные недоразумения о том, как работают прерывания. И код отсутствует. Прочтите [ask] и следуйте советам! – Olaf