J'ai récemment rencontré un problème lorsque je jouais avec un ATmega2560, et je ne comprends vraiment pas ce qui ne va pas.ATmega2560 utilisant l'interruption UART pour contrôler le drapeau global
Voici mon code.
principale:
#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();
}
Le problème est, quand j'ai reçu des données de USART, j'ai essayé de mettre un RxFlag qui peut l'instruction if actif dans la boucle principale . Mais cela n'a pas fonctionné jusqu'à ce que je décommente la fonction avant if-statement qui peut être un _delay_ms() ou un printf().
Cela n'a aucun sens. Ce dont je me souviens, c'est que je n'ai pas besoin de ces fonctions et que les variables globales peuvent toujours affecter la boucle principale. Ou y a-t-il des détails que j'avais manqués? S'il vous plaît donnez-moi quelques indices pour comprendre, je suis confus.
Veuillez poster votre code ici et non via des liens externes. –
Un moment dans un ISR est la pire idée ... jamais ... Je suppose que vous avez copié cette forme d'un code non-interrompu. – LPs
On dirait qu'il y a quelques fausses conceptions sur le fonctionnement des interruptions. Et il y a un code manquant. Lisez [ask] et suivez les conseils! – Olaf