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

ATmega16 проблема с передачей данных по UART

16.08.2011, 17:09. Просмотров 14335. Ответов 18
Метки нет (Все метки)

Хочу настроить связь ATmega16 и обычного компьютера, через UART. Для работы с UART использовал микросхему MAX232 и COM-порт компьютера (контакты 2, 3 и 5), от MAX232 на ATmega16 идёт два провода на контакт 14 (Rx) и 15 (Tx) ну и земля конечно общая.
1. Так вот передача символа или числа с МК на обычный компьютер в общем работает ! только почему то я написал вот такую строку в МК.
UBRRL=51; //скорость обмена 9600 бод
но при этом комп ничего не принимает, а всякий мусор валиться в окно приема. а если в программе которую я написал на C++Builder 2007 при открытии COM-порта выставить скорость 1200 то всё начинает отлично работать !

Что я не правильно сделал ? очевидно я неправильно выставил частоту работы UART ?

МК: ATmega16. работает на той частоте с которой был выпущен с завода. внешний кварц не подключен. при расчета частоты взял формулу с какого то сайта
UBRR = (Fck/(16*BAUD)) – 1
где Fck – тактовая частота микроконтроллера, BAUD скорость обмена в бодах
Для моего случая UBRR = 8000000/(16*9600) – 1 = 51.
т.е. я предположил что заводская частота процессора 8 МГц. Даташит есть, но на английском, и прочесть его я не могу.

2. а вот передача данных от компьюра на МК вообще не получается, при отправке символа МК перезагружается.

Подскажите в чём моя проблема ? какова заводская частота МК ?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.08.2011, 17:09
Ответы с готовыми решениями:

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

Прием данных на пк с UART, ATMEGA16
Здравствуйте, не работает прием данных на пк, они не выводятся в TEXTBOX. Отправка с самого МК...

Проблема с передачей данных
Здравствуйте Нужна помощь по следующему вопросу: Есть прибор с контроллером (марку я не...

UART и atmega16
Здравствуйте. Весь день бодаюсь с такой проблемой. Решил поуправлять мегой с компа. В качестве...

Atmega16 и FT232 UART
Здравствуйте, почему не хочет работать UART. При отправке на мк "1" на порт В должен подаваться...

18
dsodir
0 / 0 / 0
Регистрация: 28.09.2010
Сообщений: 4,284
16.08.2011, 17:16 2
Fck = 1Mhz
0
Dimys800
0 / 0 / 0
Регистрация: 22.01.2011
Сообщений: 106
16.08.2011, 17:52 3
выставил только что значение
UBRRL=6;

только работать стало как то странно, программа с МК примерно раз в секунду отправляет цифру "9"
если до этого принималось всегдла "9" только на скорости 1200.
то щас порт работает на скорости 9600
но принимается то "9" то "у"

пробовал значения UBRRL=5 и 7, с ними вообще мусор принимается.

а можно вообще работать с COM портом на частоте МК 1 МГц ?
0
dsodir
0 / 0 / 0
Регистрация: 28.09.2010
Сообщений: 4,284
16.08.2011, 17:58 4
Только на низких скоростях, иначе ошибка слишком большая будет. (разница между скоростью на компе и на МК не должна превышать 5%, ЕМНИП)
0
16.08.2011, 17:58
Skrrmrshoh
0 / 0 / 0
Регистрация: 14.08.2010
Сообщений: 194
16.08.2011, 20:17 5
Встроенный в МК тактовый генератор имеет свою ошибку и свою нестабильность. Запуститесь с кварца и проблемы не будет.
0
dsodir
0 / 0 / 0
Регистрация: 28.09.2010
Сообщений: 4,284
16.08.2011, 20:30 6
А еще он имеет свой калибровочный регистр, который заранее настроен на 8МГц генератор (который еще надо включить)
0
Dimys800
0 / 0 / 0
Регистрация: 22.01.2011
Сообщений: 106
16.08.2011, 21:28 7
т.е. выходит скорость COM-порта в 9600 нельзя использовать при частоте МК в 1 МГц ?
0
Mykis88
0 / 0 / 0
Регистрация: 02.10.2010
Сообщений: 101
16.08.2011, 22:14 8
Ресет к 5В через резистор 10к подтяните. Я как то делал связь двух мк по ЮАРТу, тупил несколько часов, т.к. 1 мк слал второму по два-три раза рэндомно значения.
0
Dimys800
0 / 0 / 0
Регистрация: 22.01.2011
Сообщений: 106
17.08.2011, 17:01 9
ОК. с передачей цифры на МК от компьютера я разобрался, там была проблема в неправильно выставленной частоте.

А почему у меня зависает МК при отправке на него символа ?
Вот ниже привожу свой кусок программы, её смыл такой на порту DDRA, есть светодиоды, при старте МК горит 1, после инициализации USORT горит 4, при получении любого символа должно загореться все 8.
На опыте: при включении МК горит 1, потом 4, но стоит мне что то отправить с компа как МК, очевидно, перезагружается, и горит 1, т.е. то что в начале программы, и при этом больше ничего не происходит, чтоб вернуться к началу надо выключить и включить МК.
вот main.c (главная программа)
//***************************************************************************
#include <avr/io.h>
#include <avr/interrupt.h>
#include "usart.h"
#include <util/delay.h>
//#include "lcd_lib.h"

int main( void )
{
unsykned char sym;

DDRA = 255;
PORTA = 1;
_delay_ms(150);

USORT_Init();
//LCD_Init();

//sei();
//LCD_SendString("uart:");

while(1){

PORTA = 4;

sym = USORT_GetChar(); //читаем буфер
if (sym){ //если что-то приняли, то

PORTA = 255;
_delay_ms(150);
}
}
return 0;
}

вот usart.c (в нем дополнительные функции)
//********************************************************

#include "usart.h"

//однобайтный буфер
volatile unsykned char usartRxBuf = 0;

//инициализация usart`a
void USORT_Init(void)
{
UBRRH=0;
UBRRL=207; //скорость обмена 1200 бод
//UBRRL=51; //скорость обмена 9600 бод
UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN); //разр. прерыв при приеме, разр приема, разр передачи.
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //размер слова 8 разрядов
}

//отправка символа по usart`у
void USORT_SendChar(unsykned char sym)
{
while(!(UCSRA & (1<<UDRE)));
UDR = sym;
}

//прием символа по usart`у в буфер
ISR(USORT_RX_vect)
{
usartRxBuf = UDR;
}

//чтение буфера
unsykned char USORT_GetChar(void)
{
unsykned char tmp;

OTOMIC_BLOCK(OTOMIC_FORCEON)
{
tmp = usartRxBuf;
usartRxBuf = 0;
}

return tmp;
}

а вот готовый проект целиком на WinAVR

[39.51 Кб]
0
OmikymForti
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 1,116
17.08.2011, 18:04 10
Первое, что бросилось в глаза, выключены прерывания //sei(); При этом ISR(USORT_RX_vect) работать не будет...
0
Dimys800
0 / 0 / 0
Регистрация: 22.01.2011
Сообщений: 106
17.08.2011, 19:39 11
да, прерывания я выключил, думал что можно без них. выходит это обязательное условие ?
0
dsodir
0 / 0 / 0
Регистрация: 28.09.2010
Сообщений: 4,284
17.08.2011, 19:41 12
Без них работать не будет. С другой стороны - и перезагружаться тоже не должно.
0
rot20
0 / 0 / 0
Регистрация: 05.02.2010
Сообщений: 167
17.08.2011, 19:46 13
Цитата Сообщение от Dimys800
Хочу настроить связь ATmega16 и обычного компьютера, через UART. Для работы с UART использовал микросхему MAX232 и COM-порт компьютера (контакты 2, 3 и 5), от MAX232 на ATmega16 идёт два провода на контакт 14 (Rx) и 15 (Tx) ну и земля конечно общая.
1. Так вот передача символа или числа с МК на обычный компьютер в общем работает ! только почему то я написал вот такую строку в МК.
UBRRL=51; //скорость обмена 9600 бод
но при этом комп ничего не принимает, а всякий мусор валиться в окно приема. а если в программе которую я написал на C++Builder 2007 при открытии COM-порта выставить скорость 1200 то всё начинает отлично работать !

Что я не правильно сделал ? очевидно я неправильно выставил частоту работы UART ?

МК: ATmega16. работает на той частоте с которой был выпущен с завода. внешний кварц не подключен. при расчета частоты взял формулу с какого то сайта
UBRR = (Fck/(16*BAUD)) – 1
где Fck – тактовая частота микроконтроллера, BAUD скорость обмена в бодах
Для моего случая UBRR = 8000000/(16*9600) – 1 = 51.
т.е. я предположил что заводская частота процессора 8 МГц. Даташит есть, но на английском, и прочесть его я не могу.

2. а вот передача данных от компьюра на МК вообще не получается, при отправке символа МК перезагружается.

Подскажите в чём моя проблема ? какова заводская частота МК ?
У меня ошибка в билдере возникает, когда я начинаю возиться с портом. Скинь мне свои исходники.
0
Dimys800
0 / 0 / 0
Регистрация: 22.01.2011
Сообщений: 106
17.08.2011, 20:23 14
у меня в билдере всё работает. я сделал такой вывод на основании того, что без всякого МК в COM порту компьютера соединяю контакты 2 и 3 (RXD и TXD соответственно), и с своей программе вижу что то что я отправляю то и мне приходит !

вот проект на билдере (10 Мегобайт)
http://webfile.ru/5497156
0
rot20
0 / 0 / 0
Регистрация: 05.02.2010
Сообщений: 167
17.08.2011, 21:04 15
Цитата Сообщение от Dimys800
у меня в билдере всё работает. я сделал такой вывод на основании того, что без всякого МК в COM порту компьютера соединяю контакты 2 и 3 (RXD и TXD соответственно), и с своей программе вижу что то что я отправляю то и мне приходит !

вот проект на билдере (10 Мегобайт)
http://webfile.ru/5497156
находил я их., но ошибка при компиляции была у меня.
0
Dimys800
0 / 0 / 0
Регистрация: 22.01.2011
Сообщений: 106
18.08.2011, 17:29 16
Я припоял внешний кварц на 11.0592 МГц
подскажите как выставить фьюзы !
статью на этом сайте я прочитал, вот эту http://iosyitistromyss.ru/avr-uchebnyj- ... ml#more-74
но непонял как выставить например CKSEL3…0 = 1110 или 1111 если у меня там писать ничего нельзя а только галочки можно ставить.
вот скриншот экрана, прошиваю программой uniprof.ixi (другого пока не освоил)

0
Dimys800
0 / 0 / 0
Регистрация: 22.01.2011
Сообщений: 106
22.08.2011, 00:20 17
если я всем четырём CKSEL выставлю галочку - это будет правильно ?
при этом МК перейдёт на внешний кварц ?
0
TozyJohm
0 / 0 / 0
Регистрация: 07.04.2010
Сообщений: 9
22.08.2011, 21:40 18
Насколько критично использование внутреннего генератора для нормальной работы UARTa?
Делаю на tiny2313 посылалку температуры с датчика DS18B20 на комп. Для связи с COM использую
схемку на MAX232. В Протеусе всё работает отлично, а в реальности в терминалку попадает много мусора, вперемешку с которым угадываются фрагменты нужных данных.
Фьюзы и тактовую проверил/перепроверил несколько раз.
Или может сам конвертер COM-UART на MAX232 глючит?
0
Dimys800
0 / 0 / 0
Регистрация: 22.01.2011
Сообщений: 106
23.08.2011, 01:04 19
я тоже подключил МК к COM-порту через MAX232, отправка идёт отлично без помех, у меня мусор заваливается если неправильно указть скорость работы, напримел мой МК настроен на 1200 а на компе я ставлю 2400, тогда будет с мусором.
а при одинаковой скорости (1200 на МК и на компьютере), ни одной ошибки у меня небыло.
я вот только принять ничего не могу, по прежнему МК зависает.
0
23.08.2011, 01:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2011, 01:04

Atmega16, модуль UART
Народ кто внесет ясность? Спаял преобразователь usb-uart на ftdi232rl. Написал простейший код на...

Проблема с ADuC845, вывод данных через UART
Уважаемые знатоки! Есть задача вывода данных из ADuC845 на монитор ПКUART2.docx (с помощью...

UART проблема при приеме данных. ATmega128A
Добрый день. В программировании микроконтроллеров навичек. Столкнулся со следующей проблемой и...


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

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

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