Atmega2560 Usart Problema de interrupción

0

Cuando envío datos desde el puerto serie, los pines RX parpadean pero el ISR no se está ejecutando. Aquí está mi código.

#include <avr/io.h>
#include <string.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define F_CPU 16000000

volatile int NUMBER_OF_RECEIVED_BYTES = 0;

ISR(USART0_RX_vect)
{
    NUMBER_OF_RECEIVED_BYTES++;

}
int main(void)
{
    #define USART_BAUDRATE 9600
    #define UBRR_VALUE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)

    UBRR0H = (uint8_t)(UBRR_VALUE>>8);
    UBRR0L = (uint8_t)UBRR_VALUE;
    UCSR0B |= (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0);
    UCSR0C |= (1<<UCSZ01)|(1<<UCSZ00);
    while (NUMBER_OF_RECEIVED_BYTES == 0);
    DDRB |= (1 << DDB7);
    sei();
    while (1)
    {
        PORTB ^= (1 << PB7);
        _delay_ms(999);
    }
}
    
pregunta Zgrkpnr

1 respuesta

6

En tu código:

  1. Incrementas el NUMBER_OF_RECEIVED_BYTES solo en tu ISR.
  2. Tienes un bucle antes de sei(); , esperando que NUMBER_OF_RECEIVED_BYTES no sea 0 .
  3. Por lo tanto, su bucle será infinito, porque las interrupciones globales están deshabilitadas y no se llamará a su ISR para incrementar su variable.

Ver:

while (NUMBER_OF_RECEIVED_BYTES == 0); // <---- infinite since interrupts are disabled
DDRB |= (1 << DDB7);
sei();   //<-------- thus, this line is never reached, interrupts won't be enabled

No sé cuál es el propósito de este bucle: while (NUMBER_OF_RECEIVED_BYTES == 0); , pero debes habilitar las interrupciones antes de que empiecen.

    
respondido por el Bence Kaulics

Lea otras preguntas en las etiquetas