Как использовать последовательный rx/tx на моем atmega2560

#c #atmega

Вопрос:

 #include <atmel_start.h>
#include <util/delay.h>
#include <avr/io.h>
#define F_CPU   8000000
#define BAUD    9600
#define BRC     ((F_CPU/(16UL * BAUD)) - 1)
void USART_Transmit_2( unsigned char data )
        {
            /* Wait for empty transmit buffer */
            while ( !( UCSR2A amp; (1<<UDRE2)) )
            ;
            
            UDR2 = data;/* Put data into buffer, sends the data */
            PORTB = 0b00100000; /* Turn on first LED bit/pin in PORTB */
            _delay_ms(500); /* wait */
            PORTB = 0b00000000; /* Turn off all B pins, including LED */
            _delay_ms(500);
        }
void USART_init_2(void){
        UBRR2H = (BRC >> 8);
        UBRR2L = BRC;
        
        UCSR2B = (1 << TXEN2) | (1 << RXEN2);
        UCSR2C = (1 << UCSZ21) | (1 << UCSZ20);
}
int main(void)
{
    
    /* Initializes MCU, drivers and middleware */
    //atmel_start_init();
    
    USART_init_2();
    DDRB = 0b00000001;
    /* Replace with your application code */
    while (1) {
        
        USART_Transmit_2('h');
        _delay_ms(1000);
        
    }
}
 

Это мой код barebone, я не могу понять, почему с pin-кода не поступает сигнал. На TX сигнал всегда высокий.

индикаторы в USART_Transmit_2 действительно включаются и выключаются.

Любая помощь будет очень признательна.

Комментарии:

1. раскомментировать atmel_start_init(); ?

2. на данный момент я им не пользуюсь, даже без комментариев это мало что меняет

3. @displayer Включите светодиод ровно на 500 мс, а затем на 500 мс выключите? Если нет, то это может быть возможно из-за неправильной настройки байтов предохранителя. В режиме по умолчанию (отправка) запрограммирован внутренний генератор 8 МГц с предустановкой 8 ( CKDIV8 ). Таким образом, у вас есть только 1 МГц, а процедуры задержки занимают больше 500 мс. Также UART не работает с неверными значениями UBRR. Пожалуйста, вы можете проверить эти настройки?

4. Я проверил, и светодиод включается на 250 мс и выключается на 250 мс, значения UBRR правильные.

5. мои предохранители таковы: extended=0xFD , HIGH=0xD0 , LOW=0xFF

Ответ №1:

так что я полный дурак, почему-то я не проверял правильный канал, код работает так, как на rx/tx 3, а не на rx/tx 2. не совсем уверен, почему, поскольку в таблице данных говорится об обратном, но, эй, теперь он работает.