Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
VladKr
0 / 0 / 0
Регистрация: 06.02.2017
Сообщений: 3
1

UART (ATMega328)

06.02.2017, 06:17. Просмотров 1032. Ответов 4
Метки нет (Все метки)

Добрый день всем.
Я не могу добиться нормальной работы UART Atmega 328p. (Для Atmega8 разобрался и все и работает нормально.)
Тестирую свой код в Proteus.
Исходный код был взят с Datasheet. Задача простая чтобы в UART выводился символ. Символ то выводится, но не правильный. Я думаю, что проблема с несогласованностью частот.
На этом форуме нашел пост об этом но ничего не получается. Совсем выбился из сил.
Настройки в proteus:
Микро контроллер: CLKDIV8 (0) Programed или Unprogramed
Baund Rate: 9600
Терминал: Data Bits: 8
Stop Bits: 1
При Baund Rate: 9600 ничего на выводится. Если только в терминале установить 4800 то выводит символ но неправильно.
За любую информацию спасибо.

Мой код

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
 
#define FOSC 1843200 // Clock Speed
#define BAUD 9600
#define MYUBRR FOSC/16/BAUD-1
 
void USORT_Init(unsigned int ubrr){
    UBRR0H = (unsigned char)(ubrr>>8);
    UBRR0L = (unsigned char)ubrr;
    /*Enable receiver and transmitter */
    UCSR0B = (1<<RXEN0)|(1<<TXEN0);
    /* Set frame format: 8data, 2stop*/
    UCSR0C = (1<<USBS0)|(3<<UCSZ00);
}
 
void USORT_Transmit( unsigned char data )
{
    /* Wait for empty transmit buffer */
    while ( !( UCSR0A & (1<<UDRE0)) );
    /* Put data into buffer, sends the data */
    UDR0 = data;
}
 
void main( void ){
    USORT_Init(MYUBRR);
    while(1){
        USORT_Transmit(0xff);
        _delay_ms(50);
    }
}

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2017, 06:17
Ответы с готовыми решениями:

Работа с UART (ATMega328)
Всем привет. Сижу мучаю атмегу и понять не могу что не так. Мне надо сделать uart c ехом. Но это...

SPI в Atmega328
Помогите разобраться с SPI! Схему собрал и проверил загрузив Ардуиновский код - все работает. А вот...

Atmega328-PU прошить
Собрал намедни ардуино совместимую плату с Atmego328-PU. При прошивке его &quot;параллельным&quot;...

ATmega328 и proteus
Привет, только начал осваивать proteus, сделал схему ATmega328 + LED. void loop() { ...

Фьюзы atmega328
Долгое время игрался с ардуино(otmyko328). Сейчас решил углубиться в изучение данного...

4
ValeryS
Модератор
7747 / 5756 / 748
Регистрация: 14.02.2011
Сообщений: 19,709
Завершенные тесты: 1
06.02.2017, 06:38 2
Цитата Сообщение от VladKr Посмотреть сообщение
Микро контроллер: CLKDIV8 (0) Programed или Unprogramed
Цитата Сообщение от VladKr Посмотреть сообщение
#define F_CPU 16000000UL
Цитата Сообщение от VladKr Посмотреть сообщение
#define FOSC 1843200 // Clock Speed
Цитата Сообщение от VladKr Посмотреть сообщение
#define MYUBRR FOSC/16/BAUD-1
вот эти строчки прокомментируйте

Добавлено через 14 минут
Цитата Сообщение от VladKr Посмотреть сообщение
/* Set frame format: 8data, 2stop*/
Цитата Сообщение от VladKr Посмотреть сообщение
Stop Bits: 1
как это согласуется?
0
VladKr
0 / 0 / 0
Регистрация: 06.02.2017
Сообщений: 3
12.02.2017, 02:11  [ТС] 3
Я знаю нужно подбирать значения в регистрах UBRR0H и UBRR0L. Я напрямую подставлял значения с Baud Rate Calculator http://wormfood.net/avrbaudcalc.php не работает.

Я использую Arduino uno на плате стоит кварц 16 мГгц. Если я правильно понимаю микроконтроллер работает на частоте 16 мГц. Тестирую все это в Proteuse.

CKDIV8 Включает делитель тактовой частоты на 8. (У меня стоит программно значит частота 16мГц )
F_CPU используется для _delay_ms()
FOSC (Frequency of the OSCillator) Генератор для USORT масштабируется от CPU
#define MYUBRR FOSC/16/BAUD-1 формула для расчета Baud Rate
Стоп биты — это просто описка у меня стоит 2

За любою информацию спасибо.
0
paskal
455 / 303 / 29
Регистрация: 15.08.2011
Сообщений: 943
12.02.2017, 18:53 4
Если не можете понять на какую частоту настроились, выведите в порт 0х55, и посмотрите осциллографом какая приблизительно частота получилась.
Если хотите чтоб тактовая была 16 МГц, то CKDIV8 должен быть Unprogrammed (=1).
0
VladKr
0 / 0 / 0
Регистрация: 06.02.2017
Сообщений: 3
12.02.2017, 20:05  [ТС] 5
Спасибо! Я думаю это то что нужно.
0
12.02.2017, 20:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.02.2017, 20:05

Начало работы с atmega328
Здравствуйте, помогите подобрать программатор для прошивки otmyko328P. Интересует, сколько стоит,...

Atmega328, проблемы с АЦП
Здравствуйте, народ. Какие могут быть идеи по следующим симптомам: - всегда 1023 - сам МК...

Условия в прерываниях ATmega328
Доброго времени суток! Очень странно работают условия во внешнем прерывании. Вот код: ISR...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru