TLDR ATmega4809, ISR mal etiquetado en iom4809.h. ¿Cómo puedo definir un ISR sin usar estos valores predefinidos mal etiquetados de iom4809?
Utilizando la placa de evaluación ATmega4809 Xplained Pro, estoy configurando la transmisión asíncrona de USART, usando el registro de datos de interrupción en vacío para enviar siempre el siguiente byte disponible. Si no hay más bytes para enviar, deshabilito la interrupción. Estoy usando el proyecto USART de ejemplo de MicroChip, directamente del generador de proyectos de Atmel Studio.
/* Interrupt service routine for Data Register Empty */
ISR(USART1_DRE_vect)
{
// I need to handle this interrupt.
}
int8_t USART_0_init()
{
USART1.BAUD = (uint16_t)USART1_BAUD_RATE(9600); /* set baud rate register */
USART1.CTRLA = 0 << USART_ABEIE_bp /* Auto-baud Error Interrupt Enable: disabled */
| 0 << USART_DREIE_bp /* Data Register Empty Interrupt Enable: disabled */
| 0 << USART_LBME_bp /* Loop-back Mode Enable: disabled */
| USART_RS485_OFF_gc /* RS485 Mode disabled */
| 0 << USART_RXCIE_bp /* Receive Complete Interrupt Enable: enabled */
| 0 << USART_RXSIE_bp /* Receiver Start Frame Interrupt Enable: disabled */
| 0 << USART_TXCIE_bp; /* Transmit Complete Interrupt Enable: disabled */
USART1.CTRLB = 0 << USART_MPCM_bp /* Multi-processor Communication Mode: disabled */
| 0 << USART_ODME_bp /* Open Drain Mode Enable: disabled */
| 0 << USART_RXEN_bp /* Reciever enable: disabled */
| USART_RXMODE_NORMAL_gc /* Normal mode */
| 0 << USART_SFDEN_bp /* Start Frame Detection Enable: disabled */
| 1 << USART_TXEN_bp; /* Transmitter Enable: enabled */
USART1.CTRLC = USART_CMODE_ASYNCHRONOUS_gc /* Asynchronous Mode */
| USART_CHSIZE_8BIT_gc /* Character size: 8 bit */
| USART_PMODE_DISABLED_gc /* No Parity */
| USART_SBMODE_1BIT_gc; /* 1 stop bit */
}
No importa lo que haya intentado, parece que no pude hacer que el registro de datos esté vacío. Me di cuenta de que había una incoherencia entre la hoja de datos y la biblioteca que define el vector de interrupción.
De la hoja de datos 4809:
26 0x1A 0x34 USART1 - Recepción completa
27 0x1B 0x36 USART1 - Registro de datos vacío
28 0x1C 0x38 USART1 - Transmisión completa
Desde iom4809.h
¡Esto no coincide! Es la interrupción número 27 en la hoja de datos y la interrupción número 26 en la biblioteca iom4809.
#define USART1_DRE_vect_num 26
#define USART1_DRE_vect _VECTOR(26)
#define USART1_RXC_vect_num 27
#define USART1_RXC_vect _VECTOR(27)
#define USART1_TXC_vect_num 28
#define USART1_TXC_vect _VECTOR(28)
¿Cómo puedo definir un ISR sin usar estos valores predefinidos mal etiquetados de iom4809?