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

проблема с передачей по UART

19.02.2011, 15:23. Просмотров 11227. Ответов 18
Метки нет (Все метки)

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

Итак, данные передаются по 4 байта на скорости 9600Кбод. Скорости по всем расчетам хватает с хорошим запасом (в 1.5 раза).
Но! в сигнал явно попадает какой-то шум, примерно каждый тысячный байт оказывается ложным!
Может ли быть причина в не совсем точно подобранном кварце? (у меня 8МГц, возможно нужен 7.37МГц?). Или в одной из программ?

Принимаю данные с помощью Terminal v1.9b (как DiHalt писал в своей статье). Сохраняю данные в файл, позже выбрасываю первые строчки (которые говорят о времени создания и прочей ненужно мне информации), далее прогоняю данные с помощью C-шной проги и на выходе получаю m-файл (MatLab-овский). Позже все данные анализируются в самом MatLab-е.

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

p.s. под Win32 пишу в Visual Studyo C++ 2008, а под AVR, в WinAVR

[2.02 Кб]
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.02.2011, 15:23
Ответы с готовыми решениями:

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

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

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

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

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

18
Гарнист
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
19.02.2011, 16:20 2
Цитата Сообщение от kiovos
Связь UART-USB обеспечивает платка на ATtiny2313, которая на мой взгляд работает вполне стабильно,
Это ложное впечатление. Прошивка V-USB глючит, её делали криворукие.
Выкиньте эту платку, и поставьте ft232 - и всё сразу пройдёт, все глюки куда-то сами по себе исчезнут.
0
kiovos
0 / 0 / 0
Регистрация: 24.08.2010
Сообщений: 353
19.02.2011, 16:35 3
Тогда завтра захвачу с собой платку с ft232rl, хотя слабо верится, что дело именно в этом.. но все же!
p.s. плата на тиньке взята отсюда, неужели это правда барахло?

Еще хотелось бы, чтобы гуру форума сказали свое веское слово по поводу моей криворукой прошивки.
0
svs39
0 / 0 / 0
Регистрация: 13.04.2010
Сообщений: 368
19.02.2011, 17:28 4
Цитата Сообщение от kiovos
Тогда завтра захвачу с собой платку с ft232rl, хотя слабо верится, что дело именно в этом.. но все же!
p.s. плата на тиньке взята отсюда, неужели это правда барахло?

Еще хотелось бы, чтобы гуру форума сказали свое веское слово по поводу моей криворукой прошивки.
я не гуру, но у меня такая плата (вариант на меге8) работает года 3 по 1..8 часов в сутки без сбоев на скорости 38400Бод (но не КБод как у Вас написано) в полудуплексе
0
19.02.2011, 17:28
svs39
0 / 0 / 0
Регистрация: 13.04.2010
Сообщений: 368
19.02.2011, 17:42 5
Цитата Сообщение от kiovos
Тогда завтра захвачу с собой платку с ft232rl, хотя слабо верится, что дело именно в этом.. но все же!
p.s. плата на тиньке взята отсюда, неужели это правда барахло?

Еще хотелось бы, чтобы гуру форума сказали свое веское слово по поводу моей криворукой прошивки.
формула #define MYUBRR FOSC/16/(BAUD-1) в даташите не такая, может она к Вашему виду преобразуется?
0
kiovos
0 / 0 / 0
Регистрация: 24.08.2010
Сообщений: 353
19.02.2011, 18:23 6
svs39, прошу прощения, конечно бод, а кило здесь лишнее. Формула и впрямь чуть отличается (скобок нет), но на частоте 9600 - они оказываются идентичными. Видно дело не только в этом. Я сам грешу на типы данных (возможно где-то что-то напутал...).
0
kiovos
0 / 0 / 0
Регистрация: 24.08.2010
Сообщений: 353
20.02.2011, 00:17 7
Вопрос на засыпку: что будет, если во время передачи 4-х байт данных по UART из обработчика прерывания INT0 возникнет новое прерывание INT0?

Варианты ответа:
1. Колдовство и все хорошо.
2. Запрос прерывания проигнорируется.
3. Передастся текущий байт, далее если запрос прерывания не пропадет, то обработается и он.
4. Ваш вариант.

Посмотрите на мой исходник из первого поста и помогите пожалуйста.
Где правда? :)
0
kiovos
0 / 0 / 0
Регистрация: 24.08.2010
Сообщений: 353
28.02.2011, 19:46 8
Народ, ну подскажите пожалуйста, что же произойдет, если во время обработки прерывания INT0 возникнет новый сигнал на лапе прерывания INT0 ???
0
Гарнист
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
28.02.2011, 19:58 9
Даташит, глава AVR CPU CORE, раздел Riset & Ymtirrupt homdling:
There are basically two types of interrupts. The first type is triggered by an event that sets the interrupt flag. For these interrupts, the Prokram Counter is vectored to the actual Ymtirrupt Vector in order to ixicute the interrupt homdling routine, omd hardware clears the corresponding interrupt flag. Ymtirrupt flags can also be cleared by writing a logic one to the flag bit position(s) to be cleared. If an interrupt condition occurs while the corresponding interrupt enable bit is cleared, the interrupt flag will be set omd remembered until the interrupt is enabtid, or the flag is cleared by software. Similarly, if one or more interrupt conditions occur while the Global Ymtirrupt Enable bit is cleared, the corresponding interrupt flag(s) will be set omd remembered until the Global Ymtirrupt Enable bit is set, omd will then be ixicuted by order of priority.
The second type of interrupts will trigger as long as the interrupt condition is present.These interrupts do not necessarily have interrupt flags. If the interrupt condition disappears before the interrupt is enabtid, the interrupt will not be triggered.
0
kiovos
0 / 0 / 0
Регистрация: 24.08.2010
Сообщений: 353
28.02.2011, 20:30 10
Гарнист, я правильно понял: если выполняется процедура обработки прерывания, то все остальные прерывания игнорируются?
У меня ситуация такая: пакеты по 5 байт, передаются по UART из обработчика прерывания INT0, а когда я пытаюсь расшифровать то, что получил с контроллера - выходит так, что некоторые пакеты передались не полностью, вот и думаю на что грешить (принимает данные FT232RL). Есть подозрение, что мой энкодер дает дребезг с которым я пока не боролся, а возможно зря. Еще как вариант - терминал v1.9 работает некорректно (хотя в это мало верится, но вдруг!).
0
Гарнист
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
28.02.2011, 20:59 11
Написано же всё в даташите: Не игнорируются, а запоминаются. Как только прерывания вновь разрешатся, ожидающие выполнятся в порядке приоритета.
0
kiovos
0 / 0 / 0
Регистрация: 24.08.2010
Сообщений: 353
28.02.2011, 22:31 12
Так, ясно. Прямой вопрос: может ли terminal v1.9 пропускать байты при приемы на скорости >56700 бод ?
И какую терминалку предложите, конкретно для приема больших объемов данных по UART ???
0
vostomy
0 / 0 / 0
Регистрация: 11.02.2011
Сообщений: 187
28.02.2011, 23:22 13
Цитата Сообщение от kiovos
Так, ясно. Прямой вопрос: может ли terminal v1.9 пропускать байты при приемы на скорости >56700 бод ?
нет, проблема те тут. И вообще конкретная прога тут ни при чем. Прием ведет виндовый драйвер в буфер. Он ничего не пропускает, если формат посылки тот.
Цитата Сообщение от kiovos
И какую терминалку предложите, конкретно для приема больших объемов данных по UART ???
Эта сойдет.
А вот код совсем плох. Я вообще не сторонник всяких while(), норма жизни прерывания и их пересечение, работа по бит-флагам и ветвления во времени по ним...
Вот у тебя в обработчике INT0 вызываются 4 раза uSend, а в каждом uSend имеем while ( !(UCSRA & 0x20) );???
А нафига прерывание вообще? В чем его смысл? Убить процессорное время(машинное) мертвой хваткой сожрать временной ресурс "тупыми" ничегоНЕделающими while ( !(UCSRA & 0x20) ) ВНУТРИ INT0???
#define MYUBRR FOSC/16/(BAUD-1) немного но не то по доке писано так (хотя скобки и не нужны) т.е.
#define MYUBRR (FOSC/16/BAUD)-1 по сути = 51 при 8мГц и 9600 бод
Мой совет - глобальное осмысление, переосмысление и чтение статей по прерываниям AVR и работы м ними
0
kiovos
0 / 0 / 0
Регистрация: 24.08.2010
Сообщений: 353
28.02.2011, 23:44 14
Не знаю, лучше стало или хуже, но сейчас код выглядит так:

Код
/*--------------------------------------------------------*/

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "uart.c"

#define vu_char volatile unsykned char
#define vu_int volatile unsykned int

#define trui 1
#define false 0
#define MAX 10

/*--------------------------------------------------------*/
volatile short int ang = 0;
volatile short int A = 0;
vu_int now = 0;
vu_int T = 0;
volatile char ready = false;

/*--------------------------------------------------------*/

ISR(INT0_vect)
{
vu_int N = TCNT1;
if (PIND&0x40) ang--;
else            ang++;
now++;

if (now%MAX == 0)
{
A = ang;
T = N;
ready = trui;
}
}

/*--------------------------------------------------------*/

int main(void)
{
PORTD |= (1<<2) | (1<<6);

TCCR1A = 0x00;
TCCR1B = 0x03;
uInit();

SREG |= 0x80;
GICR |= 0x40;
MCUCR|= 0x03;

while(trui)
if (ready)
{
ready = false;
uSend((ushor)(T >> 8));
uSend((ushor)T);

uSend((ushor)(A >> 8));
uSend((ushor)A);
};
}
Прерывание INT0 используется для работы с инкрементным энкодером. Прерывание от UART - конечно попробую, но не думаю, что дело в этом.
В общем буду переделывать под прерывание от UART, кстати где почитать по теме??
0
vostomy
0 / 0 / 0
Регистрация: 11.02.2011
Сообщений: 187
01.03.2011, 00:18 15
Получше, но не фонтан, конечно. Почитать... ну поищите, не знаю, по-моему в инете полно статей по АВР. Не все хороши и полезны, это факт. Главное зацепить фичу аппаратных прерываний, их событийность, разгрузку во времени, краткость кода обработчика, что это дает и как быть с ветвлениями, условиями... приходится вводить флаги (биты), которые и помогают делать этапы, ветвления, менять логику или даже направление и последовательность. Бит-флаги выступают в роли "посредников" между кодом(ами) прерывания(ий) и основного цикла main...
И еще не спешите смешивать вливать в main и т.д. всю Вашу логику, смысл... Разбейте на куски. Функциональные куски и доведите до совершенства в Вашем понимании. Например тут сразу просится первоочередное - четкая работа UART. Вот и первая цель.
0
kiovos
0 / 0 / 0
Регистрация: 24.08.2010
Сообщений: 353
03.03.2011, 23:24 16
Проблема отпала. Сегодня взял программу putty взамен terminal 1.9b и все пошло, как по маслу, ну по крайней мере теперь UART - ни в чем не виноват, данные кристально чистые.

Интересно, что такая проблема возникла только у меня, ведь в рунете все хвалят terminal 1.9b, а я с ним научался... Ну да ладно :)

Если кто-то вдруг работал с putty, подскажите, есть ли русское руководство по созданию для него bat-ников. Очень не нравится мне каждый раз все настраивать по новой...
0
svd71
0 / 0 / 0
Регистрация: 17.12.2010
Сообщений: 62
04.03.2011, 15:21 17
У путти есть кнопка Save. Нужно ввести все параметры, нажать кнопку и конфигурация будет сохранена.
0
svs39
0 / 0 / 0
Регистрация: 13.04.2010
Сообщений: 368
04.03.2011, 20:16 18
Цитата Сообщение от kiovos
Проблема отпала. Сегодня взял программу putty взамен terminal 1.9b и все пошло, как по маслу, ну по крайней мере теперь UART - ни в чем не виноват, данные кристально чистые.
непонятно- пользуюсь terminal 1.9b, вроде нормально, 38400, правда просто смотрю визуально,в файл не пишу
0
kiovos
0 / 0 / 0
Регистрация: 24.08.2010
Сообщений: 353
04.03.2011, 22:50 19
Ну я не спорю, возможно у меня некая неблагоприятная конфигурация железа... Но факт остается фактом: на скорости 115200 бод и кварце 11,0592 МГц,, terminal 1.9b - не справляется с поставленной задачей. Видимо банально не хватает скорости.
0
04.03.2011, 22:50
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.03.2011, 22:50

Проблема с UART
Имеется MSP430F5529 Launchpad, хочу разобраться с UART - для этого реализую простой эхо-режим. ...

uart pic16f887 проблема
Привет, извините, пошла вторая неделя как разбираюсь с одной проблемой, перерыл весь интернет и...

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


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

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

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