En ATMEGA168PA tengo problemas con la recepción de caracteres controlada por interrupciones a través de UART. Cuando incluyo la línea setup_interrupt()
, parece que la ejecución del programa se detiene después de una iteración en el ciclo while (un parpadeo y un "HOWDY"). Opcionalmente ejecuta interrupciones continuas.
El uC se detiene en el sentido de que parece no estar haciendo nada. No parpadeo No se envió "HOWDY" en la UART.
El UART funciona. He verificado que puede enviar y recibir caracteres (recibir mediante sondeo).
La misma recepción controlada por interrupciones funcionó bien en ATMEGA64.
¿Qué puede hacer que el programa detenga la ejecución? Cualquier ayuda apreciada.
#include "project.h"
#include "drivers.h"
#include <stdlib.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include "uart.h"
#include "util.h"
#include "leds.h"
// Parameters for serial port
#define BAUD 2400
#define MYUBRR F_CPU/16/BAUD-1
// Parameters for menu
volatile char action = 0;
// Global debug flag
uint8_t debug_global = 1;
int main(void)
{
setup_portb();
green_off();
cli();
uart_init( MYUBRR );
setup_interrupt();
while ( 1 )
{
blink_025_sec();
UART_sendLine("HOWDY!");
}
}
ISR( USART_RX_vect )
{
blink_05_sec();
char receivedByte;
receivedByte = UDR0; // Fetch the received byte value into the variable "ByteReceived"
if ( debug_global )
{
UART_sendChar( receivedByte ); // Echo the received byte back to the computer
}
action = receivedByte;
}
void setup_interrupt()
{
//EIMSK |= _BV(INT0); // Enable INT0
// Set Global interrupt ENABLE flag
sei();
}
Mi inicio de UART tiene este aspecto:
#include <avr/io.h>
#include "drivers.h"
void uart_init(unsigned int ubrr)
{
// Set baud rate
UBRR0H = (unsigned char)(ubrr>>8);
UBRR0L = (unsigned char)ubrr;
// Enable receiver and transmitter; enable RX interrupt
UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0);
}
¿La ejecución se detiene incluso si no hay datos en la línea UART RX (no se dispara ninguna interrupción)? - Bence Kaulics hace 5 horas
-Sí. No reacciona a los caracteres entrantes del puerto serie.
ACTUALIZACIÓN:
El comentario de "user57709" fue la clave: comenté la línea EIMSK |= _BV(INT0); // Enable INT0
Eso hizo que el programa funcionara como se esperaba. Si entiendo la hoja de datos correctamente, no es necesario habilitar ninguna interrupción externa como esta cuando se utiliza el indicador RXCIE en el UART. El pin específico no está conectado a nada.
Aparentemente, la uC se atascó al ejecutar interrupciones continuas debido a esto.
Gracias por la ayuda, "user57709"