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();
}
問題であり、Iは、USARTからいくつかの件のデータを受信したときに、私はRxFlagを設定しようとしたそのメインループ中の活性ザif文缶。しかし、_delay_ms()やprintf()のようなif文の前に関数のコメントを外すまでは機能しませんでした。
意味がありません。私が覚えているのは、これらの関数は必要なく、メイン変数に影響するグローバル変数を設定できることです。それとも、私が逃した詳細はありますか?私はそれを理解するためのいくつかの手がかりを与えてください、私は混乱しています。
外部リンクではなく、ここにコードを掲載してください。 –
ISRの中では悪い考えです...今まで...私はあなたがその形式を非割り込み駆動コードにコピーしたと思います。 – LPs
割り込みの仕組みに関するいくつかの大きな誤解があるようです。そしてコードがありません。 [ask]を読んでアドバイスに従ってください! – Olaf