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

Atmega88 + UART = проблема

22.10.2012, 03:04. Просмотров 15133. Ответов 27
Метки нет (Все метки)

Приветствую!

Пытаюсь соединить два камня по USORT интерфейсу.
Для тактирования в обоих камнях используется внутренний осциллятор.
1-й камень это Atmega88-20pu, он же мастер.
2-й камень Attiny2313-20pu, соответственно слейв.
В Attiny2313 USORT настроил за 20 минут, все идеально работает.
А вот с пресловутым Atmega88-20pu никак не идет, уже 2 дня бьюсь.
На "Hello World!" на консоль получаю абра-кадабру.

Код и скрин прилагаю.


Код
#include <stdlib.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/iom88.h>
#ifndef ALIBC_OLD
#include <util/delay.h>
#else
#include <avr/delay.h>
#endif

#ifndef F_CPU
#define F_CPU 8000000UL // Clock Hz
#endif

#define RS_BAUD 9600
#define RS_UBRR F_CPU / 16 / RS_BAUD - 1

void USORT_init( uint16_t ubrr ) // функция инициализации USORT
{
// Установить скорость передачи
UBRR0H =  ( uint8_t ) ( ubrr >>  8 ) ;
UBRR0L =  ( uint8_t ) ubrr ;
// Включить передатчик и приемник
UCSR0B =  ( 1  << RXEN0 )  |  ( 1  << TXEN0 ) ;
// 8 бит данных, 1 стоп-бит, без проверки четности
UCSR0C =  ( 1  << UCSZ00 )  |  ( 1  << UCSZ01 ) ;
}

void uart_putc(uint8_t data)
{
while (!(UCSR0A & (1 << UDRE0)));
UDR0 = data;
}

void uart_puts(const char *s )
{
while (*s)
uart_putc(*s++);
}

int main(void)
{
// Init
USORT_init(RS_UBRR);

// Loop
while (1){
_delay_ms(1000);
uart_puts("Hello World!");
_delay_ms(1000);
};
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.10.2012, 03:04
Ответы с готовыми решениями:

Проблема с UART (ATmega88)
Добрый день! Уже долгое время пытаюсь разобраться с работой uart. Наваял программу, по которой мк...

Проблема с UART
Здраствуйте! Хочу общатся с МК через UART, но возникли проблемы... использую st232bn и МК...

Проблема с UART
День добрый. Продолжаю изучать AVR и наткнулся на проблему при изучении UART(работаю с платой...

Проблема с UART
Здравствуйте. Программирую МК не давно, и поэтому столкнулся с проблемой при работе через UART....

проблема с передачей по UART
Добрый день! Сейчас занимаюсь разработкой одного устройства (контроллер ATmega8535). Оно передает...

27
THI BIOST
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 1,142
22.10.2012, 04:11 2
Количество символов (12) совпадает.
Символы слегка искажены. (возьмите хекс коды своей строки и сравните).

Вывод: Слегка не совпадает скорость - калибруйте осциллятор.
0
Johmmy0007
1 / 1 / 0
Регистрация: 30.08.2011
Сообщений: 9,944
22.10.2012, 10:26 3
вообще для uart внутренние осцилляторы крайне не рекомендуются
0
podkossitmyk
0 / 0 / 0
Регистрация: 30.09.2012
Сообщений: 28
22.10.2012, 10:34 4
Цитата Сообщение от Johmmy0007
вообще для uart внутренние осцилляторы крайне не рекомендуются
это да, не поспоришь. для нормальной связи по УАРТ категорически рекомендуется ставить кварц.
0
PRS
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 3
22.10.2012, 11:08 5
Да, ну на фиг. Всегда нормально на встроенном все работало. Особенно на скорости в 9600:)
0
Johmmy0007
1 / 1 / 0
Регистрация: 30.08.2011
Сообщений: 9,944
22.10.2012, 11:17 6
не знаю, многие жалуются
0
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
22.10.2012, 11:56 7
Цитата Сообщение от PRS
Да, ну на фиг. Всегда нормально на встроенном все работало. Особенно на скорости в 9600:)
Мож и так. Но прикинь, 1 МИЛЛИсекунда на байт... И это при работе двух высокоскоростных МК на одной плате. Смысл?
Хотя, какая задача...
0
PRS
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 3
22.10.2012, 11:59 8
У меня похожая хрень с передачей была, оказалось срывало стек. Дело в ИАРе было.
0
whytimit
0 / 0 / 0
Регистрация: 30.09.2012
Сообщений: 13
22.10.2012, 16:33 9
Компилирую на winavr, прошиваю дудкой.
Второй камень Attiny работает без внешнего резонатора.
Не пойму что за хрень....(
0
ivsxx1
0 / 0 / 0
Регистрация: 18.01.2012
Сообщений: 28
22.10.2012, 16:49 10
Хрень в 90% случаев из-за настройки скорости UART проверьте число UBR, что бы ваша скорость приближалась к скорости у слейва,а если проверяете с компом, то совпадала с комповой,кроме этого проверьте флаг удвоения скорости
0
THI BIOST
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 1,142
22.10.2012, 17:31 11
Цитата Сообщение от whytimit
Компилирую на winavr, прошиваю дудкой.
Второй камень Attiny работает без внешнего резонатора.
Не пойму что за хрень....(
Я ж написал - калибруйте (и обосновал, однако)! У тиньки - попало, у 88 меги - нет. Заводская калибровка +-10% (см даташит), что, в принципе, за пределами добра и зла толерантности USORT на краях.
0
THI BIOST
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 1,142
22.10.2012, 17:37 12
Цитата Сообщение от ivsxx1
Хрень в 90% случаев из-за настройки скорости UART проверьте число UBR, что бы ваша скорость приближалась к скорости у слейва,а если проверяете с компом, то совпадала с комповой,кроме этого проверьте флаг удвоения скорости
Ну и зачем советовать - ради самого совета? Дин полный код, из которого ясно видно, что UBRR ровно 51 (что соответствует погрешности 0.2%) и никаким удвоением не пахнет?
0
swk
0 / 0 / 0
Регистрация: 22.10.2015
22.10.2012, 19:45 13
Цитата Сообщение от drvtos
Цитата Сообщение от PRS
Да, ну на фиг. Всегда нормально на встроенном все работало. Особенно на скорости в 9600:)
Мож и так. Но прикинь, 1 МИЛЛИсекунда на байт... И это при работе двух высокоскоростных МК на одной плате. Смысл?
Хотя, какая задача...
А какой смысл передать тот же байт за микросекунды, если их, может, надо переслать десяток в несколько минут? А чтение буфера что из SPI, что из USORT - по времени одинаково. USORT - чисто аппаратный, какая разница, сколько он времени этот байт передает. Освободится - скажет. Как и приемник.

А программа в это время занимается своими делами. Вряд ли кто будет ее останавливать на время приема или передачи байта. Можно, конечно, но зачем?

А зато при чтении со SPI слэва, особенно многих байт, телодвижений мастеру надо делать больше. Как минимум, убедиться, что нужный ему байт слэв уже в буфер положил...

Меня - так напротив, больше удивляет стремление некоторых без нужды задирать скорость обмена. Например, для передачи пары байт раз в несколько секунд - непременно использовать, например, скорость 115 кбод, а то и выше... Смысла в этом - никакого... 9600 - за глаза.

Невольно возникает подозрение, что такой человек просто не умеет распараллеливать выполнение своих задач в программе.
По той же причине - и использование всяких RTOS без особой на то необходимости, там, где простой флаговый автомат на порядок лучше справляется. Просто считают, видимо, что RTOS за них решит все проблемы, которые сами они решить не хотят или не умеют.

Аналогично - и критика некоторых компиляторов, за то что те плохо правят их кривой и глюкавый код... Нормальный программист и на Паскале, и даже на Бэйсике что угодно (в пределах возможностей железа) напишет. А кто не могет - так и на C++ всякой кривой херни нагородит.
0
_pv
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,515
22.10.2012, 19:56 14
Цитата Сообщение от PRS
Да, ну на фиг. Всегда нормально на встроенном все работало. Особенно на скорости в 9600:)
если частоты у приёмника и передатчика разбегутся больше чем на несколько процентов перестанет работать абсолютно не зависимо от скорости, хоть 1200 хоть 921600.

а по сути вопроса: младшие биты приходят почти правильно, очень похоже грабли в скорости.
покрутите UBRR на немного в разные стороны.

и еще, при инициализации уарта у АВРов ногу TX на выход переключать разве не надо?
0
RyshirD
0 / 0 / 0
Регистрация: 07.12.2010
Сообщений: 574
22.10.2012, 20:04 15
Цитата Сообщение от whytimit
Приветствую!

Пытаюсь соединить два камня по USORT интерфейсу.
Для тактирования в обоих камнях используется внутренний осциллятор.
1-й камень это Atmega88-20pu, он же мастер.
2-й камень Attiny2313-20pu, соответственно слейв.
В Attiny2313 USORT настроил за 20 минут, все идеально работает.
А вот с пресловутым Atmega88-20pu никак не идет, уже 2 дня бьюсь.
На "Hello World!" на консоль получаю абра-кадабру.

Код и скрин прилагаю.
Вложение:
ssreen1.jpg
[/code]

у вас режим принятия в режиме HEX, переключите в ASCII
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
22.10.2012, 20:15 16
Цитата Сообщение от whytimit
Компилирую на winavr, прошиваю дудкой.
Второй камень Attiny работает без внешнего резонатора.
Не пойму что за хрень....(
В 88й проблема может быть с фьюзом CKDIV8, смотри http://avr.roboforum.ru/calc.html?part=ATmega88P
0
_pv
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,515
22.10.2012, 20:25 17
Цитата Сообщение от tyzord66
В 88й проблема может быть с фьюзом CKDIV8, смотри http://avr.roboforum.ru/calc.html?part=ATmega88P
если бы частота в 8 раз отличалась, на компе он бы принял примерно в 8 раз больше байт.
а CKDIV8 просто меняет значение по умолчанию регистра CLKPR, его не обязательно именно через фьюзы менять:
void main(){
CLKPR = 0x80;
CLKPR = 0x00;
...
}
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
22.10.2012, 21:03 18
Цитата Сообщение от _pv
Цитата Сообщение от tyzord66
В 88й проблема может быть с фьюзом CKDIV8, смотри http://avr.roboforum.ru/calc.html?part=ATmega88P
если бы частота в 8 раз отличалась, на компе он бы принял примерно в 8 раз больше байт.
Тут сложно возразить, но проверить этот фьюз лишним не будет.
Цитата Сообщение от _pv
а CKDIV8 просто меняет значение по умолчанию регистра CLKPR, его не обязательно именно через фьюзы менять:
void main(){
CLKPR = 0x80;
CLKPR = 0x00;
...
}
Если быть до конца точным, установка CKDIV8 заносит в CLKPS3-0 значение 0b0011, что соответствует «Clock Dyvysyom Factor» -8. А установка бита CLKPCE разрешает программную модификацию значения девайдера, которую надо успеть выполнить в течении 4х машинных циклов.
0
Kymo
0 / 0 / 0
Регистрация: 01.04.2012
Сообщений: 319
22.10.2012, 23:22 19
Только что попробовал, с внешним кварцем на 16, всё отлично.

В Вашем примере изменил только это на 16.
#define F_CPU 8000000UL // Clock Hz
0
swk
0 / 0 / 0
Регистрация: 22.10.2015
23.10.2012, 01:26 20
Цитата Сообщение от Kymo
Только что попробовал, с внешним кварцем на 16, всё отлично.
Не стоит экономить на кварце. Деталь - то копеечная, и давно уже не дефицит. Я уже не раз писал об этом.

Хотя да, у AVR еще морока с программированием, в зависимости от настроек тактирования... Но на это случай у меня в программаторе кроме 5 проводков на LPT, всегда еще кварц висел. Я от внутреннего генератора вообще никогда не работаю.
0
23.10.2012, 01:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.10.2012, 01:26

Проблема с UART на Atmega128
Всем доброго времение суток, надеюсь поможете разобраться с проблемой. Предистория: устройство на...

Странная проблема uart
mega8515, от внутреннего генератора 1MHz, .include &quot;m8515def.yms&quot; ; Internal Hordware...

AVR GCC проблема с UART
решил вот лампочками помигать - ambilight сделать - и вот на грабли наткнулся -какая то неведомая...


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

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

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