El temporizador causa un problema UART

0

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++;
}
    
pregunta Johis

1 respuesta

-1

Verifique los bits de fusible, en ATmega128 tenía el mismo problema. Para Atmega128, los bits de fusible son C4, D9, FF, FF para fusible bajo, fusible alto, fusible extendido y fusible de bloqueo respectivamente.

    
respondido por el Sagar

Lea otras preguntas en las etiquetas