Почему установка uart в режим двойной скорости, когда выдает правильный выход, а в обычном режиме с одинаковой скоростью передачи не работает в atmega32?

Чтобы получить правильный вывод, мне нужно было установить бит U2X на единицу, а когда я установил его на ноль и изменить значение регистра UBRR, вывод не имеет смысла. Я проверил, что я использую правильные значения из таблицы данных, но это не дает правильного вывода при U2X=0.

мой.h файл

#ifndef USRAT_TEST_H_
#define USRAT_TEST_H_

#include <avr/io.h>
void USRAT_INIT(uint16_t bd);
char USRAT_RECIEVE_CHR(void);
void USRAT_SEND_CHR(char c);
#endif /* USRAT_TEST_H_*/

мой.c файл

#include <avr/io.h>
#define F_CPU 2000000UL
#include <util/delay.h>
#include "USRAT_TEST.h"
void USRAT_INIT(uint16_t bd)
{
    UCSRA = (1<<U2X);//when removing this line and edit F_CPU/8 to F_CPU/16 things go wrong
    UCSRB|=(1<<RXEN)|(1<<TXEN);// enable send and receive
    UCSRC|=(1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);//8-bit width 
    UBRRL=(F_CPU/8/bd-1);
    UBRRH=(F_CPU/8/bd-1)>>8;
    }
char USRAT_RECIEVE_CHR()
{
    while((UCSRA&(1<<RXC))==0)
    {

    }
    return UDR;
}
void USRAT_SEND_CHR(char c)
{
while((UCSRA&(1<<UDRE))==0)
{

}
 UDR=c;


}

файл main.c

    #include <avr/io.h>
#define F_CPU 2000000UL
#include <util/delay.h>
#include "USRAT_TEST.h"
#include <stdio.h>
char data;
int main(void)
{
        USRAT_INIT(9600);
    /* Replace with your application code */
    while (1) 
    {
        data = USRAT_RECIEVE_CHR(); 
        USRAT_SEND_CHR(data); 
                    }
}

Это простая симуляция, я добавил 2 виртуальных терминала к своему AVR .... при установке U2X на 0 и записи значений из таблицы данных, когда я пишу "a" или любой символ в один из них, я получаю в другом неправильный фрахтователь.

Я взял значения UBBR прямо из спецификации, которую можно попробовать без формулы F_CPU/8/bd-1 и положите их прямо из таблицы.

Можете ли вы сказать мне, что такое эффект U2X на той же скорости БАД???? ИЛИ Когда установить U2X в единицу или в ноль??????

введите описание изображения здесь

1 ответ

Посмотрите еще раз на примеры в таблице и посмотрите, как UBRR соотносится со скоростью передачи и тактовой частотой. Вы увидите что-то вроде #define MYUBRR FOSC/16/BAUD-1, Ваш код рассчитывает деление UBRR на 8 часов вместо 16, поэтому для правильной работы UART необходимо удвоить время.

Другие вопросы по тегам