Почему установка 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 необходимо удвоить время.