Работа с UART на AVR, регистры

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
AngelicQuasar
Родился
Сообщения: 11
Зарегистрирован: Ср фев 08, 2023 01:13:37

Работа с UART на AVR, регистры

Сообщение AngelicQuasar »

Я хочу разобраться, как работает UART в AVR и научиться его применять. Для этого я написал такой код, который использует регистры:

Код: Выделить всё

#define F_CPU 8000000UL

#include <avr/io.h>
#include <util/delay.h>

void uart_init()
{
	UBRR0H = 0;
	UBRR0L = 129;
	
	UCSR0A=0b00000000;
	UCSR0B=0b00011000;
	UCSR0C=0b10000110;
}

void uart_send(unsigned char c)
{
	while (!(UCSR0A & (1 << UDRE0))) {}
	UDR0 = c;
}

void uart_send_str(const unsigned char *s)
{
	while (*s != 0)
	{
		uart_send(*s++);
	}
}

int main(void)
{
    uart_init();
	
    while (1) 
    {
		uart_send_str("Hello!");
		_delay_ms(500);
    }
}
Проблема в том, что когда я принимаю данные на компьютере при помощи монитора Arduino IDE, то в консоль приходит мусор вместо строчки "hello". Что я сделал не так? Почему мусор?
Реклама
veso74
Поставщик валерьянки для Кота
Сообщения: 1906
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: Работа с UART на AVR, регистры

Сообщение veso74 »

На какую скорость bps предполагаете, что запрограммировали UART?
Реклама
AngelicQuasar
Родился
Сообщения: 11
Зарегистрирован: Ср фев 08, 2023 01:13:37

Re: Работа с UART на AVR, регистры

Сообщение AngelicQuasar »

[uquote="veso74",url="/forum/viewtopic.php?p=4368815#p4368815"]На какую скорость bps предполагаете, что запрограммировали UART?[/uquote]
Скорость 9600, стандартная.
veso74
Поставщик валерьянки для Кота
Сообщения: 1906
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: Работа с UART на AVR, регистры

Сообщение veso74 »

В помощь:

Код: Выделить всё

#define F_CPU 8000000
#define BAUD 9600
#define RATE ((F_CPU / 16 / BAUD) - 1)

UBRRH |= (RATE >> 8);
UBRRL |= RATE;
Реклама
Эиком - электронные компоненты и радиодетали
AngelicQuasar
Родился
Сообщения: 11
Зарегистрирован: Ср фев 08, 2023 01:13:37

Re: Работа с UART на AVR, регистры

Сообщение AngelicQuasar »

[uquote="veso74",url="/forum/viewtopic.php?p=4368846#p4368846"]В помощь:

Код: Выделить всё

#define F_CPU 8000000
#define BAUD 9600
#define RATE ((F_CPU / 16 / BAUD) - 1)

UBRRH |= (RATE >> 8);
UBRRL |= RATE;
[/uquote]

Все равно печатаются такие символы: Р)ббщяР)ббщяР)ббщяР)

Программирую AVR ATmega 328p

Код: Выделить всё

#define F_CPU 20000000UL
#define BAUD 9600
#define RATE ((F_CPU / 16 / BAUD) - 1)

#include <avr/io.h>
#include <util/delay.h>

void uart_init()
{
	UBRR0H |= RATE >> 8;
	UBRR0L |= RATE;
	
	UCSR0A = 0b00000000;
	UCSR0B = (1 << RXEN0) | (1 << TXEN0); // 0b00011000;
	UCSR0C = 0b10000110;
}

void uart_send(char c)
{
	while (!(UCSR0A & (1 << UDRE0))) {}
	UDR0 = c;
}

char uart_receive(void)
{
	return ((UCSR0A >> RXC0) & 1) ? UDR0 : 0;
}

void uart_send_str(const char *s)
{
	while (*s != 0)
	{
		uart_send(*s++);
	}
}

int main(void)
{
    uart_init();
	
    while (1) 
    {
		uart_send_str("hello");
		_delay_ms(500);
		
		char c = uart_receive();
		_delay_ms(500);
    }
}


Кстати, почему здесь регистры названы не как в книге Ревича (UDR, UBRR и т.д.), а с нулем на конце?
Реклама
veso74
Поставщик валерьянки для Кота
Сообщения: 1906
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: Работа с UART на AVR, регистры

Сообщение veso74 »

В качестве рекомендации: следите информацией в pdf-ом.
Подробности о выбранном режиме есть, смотрите коэффициенты в pdf.
Asynchronous normal mode (U2Xn = 0), Asynchronous double speed mode (U2Xn = 1), Synchronous master mode

Установлены ли фюзы для этой F_CPU? (или они по умолчанию).
Реклама
AngelicQuasar
Родился
Сообщения: 11
Зарегистрирован: Ср фев 08, 2023 01:13:37

Re: Работа с UART на AVR, регистры

Сообщение AngelicQuasar »

[uquote="veso74",url="/forum/viewtopic.php?p=4368852#p4368852"]В качестве рекомендации: следите информацией в pdf-ом.
Подробности о выбранном режиме есть, смотрите коэффициенты в pdf.
Asynchronous normal mode (U2Xn = 0), Asynchronous double speed mode (U2Xn = 1), Synchronous master mode

Установлены ли фюзы для этой F_CPU? (или они по умолчанию).[/uquote]

pdf это даташит?
Аватара пользователя
VNS
Говорящий с текстолитом
Сообщения: 1615
Зарегистрирован: Пт дек 10, 2021 12:48:46
Откуда: Тюмень

Re: Работа с UART на AVR, регистры

Сообщение VNS »

Тестовая прошивка для проверки работы USART ATmega328P и терминалки ПК… МК тактируется на частоте 8 МГц от внутреннего генератора… если прижать вывод РВ1 к GND то МК будет слать по UART шесть байт (ASCII = Hello!), через каждые две секунды…
(9600, данные 8, паритет N, стоп бит 1.)
test UART.hex
(942 байт) 174 скачивания
Аватара пользователя
Starichok51
Модератор
Сообщения: 19046
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Работа с UART на AVR, регистры

Сообщение Starichok51 »

ему не хекс нужно, а исходник дать, чтобы видел, как нужно правильно делать.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
AngelicQuasar
Родился
Сообщения: 11
Зарегистрирован: Ср фев 08, 2023 01:13:37

Re: Работа с UART на AVR, регистры

Сообщение AngelicQuasar »

А каким компилятором лучше компилировать проекты? Я пишу в Michrochip Studio, там GCC и нет которых макросов и констант (например, _BV, который есть во многих примерах) и константы многие там названы по-другому.
veso74
Поставщик валерьянки для Кота
Сообщения: 1906
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: Работа с UART на AVR, регистры

Сообщение veso74 »

AngelicQuasar, с 16 MHz, через Arduino Serial, ваш код работает. Наверное вам нужно настроить программу для визуализации.
Вложения
uart.zip
(501 байт) 195 скачиваний
Untitled-1.jpg
(122.21 КБ) 179 скачиваний
Аватара пользователя
VNS
Говорящий с текстолитом
Сообщения: 1615
Зарегистрирован: Пт дек 10, 2021 12:48:46
Откуда: Тюмень

Re: Работа с UART на AVR, регистры

Сообщение VNS »

[uquote="Starichok51",url="/forum/viewtopic.php?p=4369000#p4369000"]ему не хекс нужно, а исходник дать[/uquote]
Я не пишу на Си… мой исходник для него как текст на китайском… без перевода не поймёт… а прошивка позволит понять работает ли аппаратная часть или нет… если всё заработает, то аппаратная часть со стороны железа выполнена верно и тогда останется разобраться только лишь с программной частью… ну а примеры на Си есть в даташите (параграф 24 USART).
https://static.chipdip.ru/lib/549/DOC001549488.pdf
AngelicQuasar
Родился
Сообщения: 11
Зарегистрирован: Ср фев 08, 2023 01:13:37

Re: Работа с UART на AVR, регистры

Сообщение AngelicQuasar »

Проблема решена. Дело было в том, что я нагуглил, что частота МК ATmega 328p 20 МГц и прописал в исходнике ее, а на самом деле частота была 16 МГц.
Ответить

Вернуться в «Разные вопросы по МК»