Tengo un problema, encontrado tanto en ATMEGA1284P como en ATMEGA2560.
He configurado un temporizador de 16 bits en CTC (probé Timer1 y Timer5) para dar una interrupción cada 1 ms, por lo que puedo incrementar una variable de tiempo volátil de 32 bits. Al mismo tiempo, estoy enviando y recibiendo datos usando UART1 y UART2.
Esto funciona durante algún tiempo, sin embargo, después de exactamente 1 minuto y 6 segundos (~ 65500 ms ~ = 2 ^ 16 ms), mi UART1 deja de funcionar. UART2 y todo lo demás sigue funcionando como se esperaba. Cuando desactivo mi temporizador, UART1 sigue funcionando.
Apreciaría cualquier ayuda. He publicado mi código de inicialización, avíseme si puedo proporcionar algo más para encontrar una solución.
Código de inicio UART1:
#define F_CPU 16000000UL
// (I have also tried disabling the 16 MHz clock and fall back
// to the 8 MHz clock, setting OCR1A to 0x03EF, with no success)
void uart1_init() {
uint16_t baudrate = UART_BAUD_SELECT(BAUD485, F_CPU));
UBRR1H = (uint8_t)(baudrate>>8);
UBRR1L = (uint8_t) baudrate;
// Clear USART Transmit complete flag, normal USART transmission speed
UCSR1A = (1 << TXC1) | (0 << U2X1);
// Enable receiver, transmitter and receive interrupt
UCSR1B = (1 << RXEN1) | (1 << TXEN1) | (1 << RXCIE1);
// Asynchronous mode, no parity, 1 stop bit, character size = 8-bit
UCSR1C = (1 << UCSZ11) | (1 << UCSZ10) | (0 << UCPOL1);
}
// somewhere later: sei();
Código Timer1:
volatile uint32_t time = 0;
void timer_init(void) {
// This code sets up Timer1 for a 1ms @ 16Mhz Clock (mode 4)
OCR1A = 0x07CF;
// Mode 4, CTC on OCR1A
TCCR1B |= (1 << WGM12);
// Set interrupt on output compare match
TIMSK1 |= (1 << OCIE1A);
// Set prescaler to 8 and start the timer
TCCR1B |= (1 << CS11) ;
}
ISR(TIMER1_COMPA_vect) {
// Action to be done every 1 ms
// Problem also occurs with empty interrupt
// What I should have here: time++;
}