AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
04.07.2019, 13:20
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,841
Сказал спасибо: 2,531
Сказали Спасибо 11,764 раз(а) в 5,895 сообщении(ях)
|
Re: ATtiny441 и UART. Не могу разобраться
Deniska407, почему бы Вам было не указать в явном виде скорость обмена? Лениво мне, как-то, ковыряться в ДШ...
Откуда взяты 5мс задержки после загрузки байта в УДР ? Вообще-то, гораздо беспроигрышней отлавливать событие "передача байта окончена" по соответствующему флагу.
Вы дрыгаете ножкой направления для каждого байта. А почему бы не сделать прием-передачу через кольцевой буфер на прерываниях? В этом случае ставить на передачу можно один раз на все байты буфера, а переключать на чтение после передачи последнего байта.
У меня все работает именно так.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо akegor за это сообщение:
|
|
|
04.07.2019, 14:37
|
|
Прописка
Регистрация: 25.11.2006
Адрес: Харьков
Сообщений: 295
Сказал спасибо: 25
Сказали Спасибо 71 раз(а) в 60 сообщении(ях)
|
Re: ATtiny441 и UART. Не могу разобраться
Deniska407, не забывайте, что интерфейс RS485 является полу-дуплексным, т.е. в каждый момент направление передачи данных может быть только одно: от "мастера" к "слейву" или наоборот. Это значит, что "мастер" и "слейв" должны передавать данные строго по очереди, но не одновременно. Этот принцип присутствует в протоколе Modbus RTU, но в Вашей программе он пока не соблюдается. Насколько я понял из приведенного текста программы, передача от устройства ("слейва") активируется в главном цикле через каждые 5 сек, при этом никак не отслеживая, окончился уже прием от "мастера" или нет. Возможно в этом причина описанной "нестабильности" приема...
|
|
|
|
04.07.2019, 14:49
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,784
Сказал спасибо: 2,911
Сказали Спасибо 3,118 раз(а) в 2,109 сообщении(ях)
|
Re: ATtiny441 и UART. Не могу разобраться
Сообщение от parovoZZ
|
... не стабильная тактовая частота из-за отсутствия кварца.
|
Она достаточно стабильна, по крайней мере для "комнатных условий". На 38400 Бод работало устойчиво от внутреннего RC-генератора, откалиброванного по app. note Atmel.
А вот записан-ли байт калибровки генератора в OSCCAL - надо проверить.
__________________
Экзорцист 40-го уровня.
|
|
|
Сказали "Спасибо" ForcePoint
|
|
|
04.07.2019, 14:57
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,246
Сказал спасибо: 11,165
Сказали Спасибо 3,854 раз(а) в 2,925 сообщении(ях)
|
Re: ATtiny441 и UART. Не могу разобраться
tsb, таки они и полнодуплексными бывают (с двумя парами линий).
Собственно правило слушать линию на предмет правильности переданного никто не отменял - так и ошибки, и коллизии отлично детектируются.
Deniska407, анализ происходящего на линии нужно выполнить в первую очередь.
При этом обеспечить нормальное терминирование RS485 (даже на 0.3м). Возьмите это за правило - потом будет меньше печалей.
Осциллограф заодно покажет шумовую картину на линии.
Проверьте осциллографом потенциалы при отсутствии земли между устройствами и при ее подключении.
Какие трансиверы RS485 использованы?
Линии с отдельным внутренним питанием и заземлением изолированных трансиверов показывают лучшие характеристики по помехоустойчивости. 12V/24V с понижением на каждой плате до 5V. Для дома это будет излишеством, но…
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
04.07.2019, 15:10
|
|
Прописка
Регистрация: 25.11.2006
Адрес: Харьков
Сообщений: 295
Сказал спасибо: 25
Сказали Спасибо 71 раз(а) в 60 сообщении(ях)
|
Re: ATtiny441 и UART. Не могу разобраться
Сообщение от mike-y-k
|
tsb, таки они и полнодуплексными бывают (с двумя парами линий).
|
Чего только, "в принципе", не бывает... Но мы же рассматриваем конкретный случай:
Сообщение от Deniska407
|
Для приема в терминал использую китайский переходник с UART на RS-485 и переходник - RS-485 - USB.
|
Сообщение от mike-y-k
|
Собственно правило слушать линию на предмет правильности переданного никто не отменял - так и ошибки, и коллизии отлично детектируются.
|
Как это "правило" можно реализовать в данном конкретном случае - не совсем понятно...
|
|
|
|
04.07.2019, 15:30
|
|
Временная регистрация
Регистрация: 12.11.2008
Адрес: LT
Сообщений: 69
Сказал спасибо: 12
Сказали Спасибо 33 раз(а) в 23 сообщении(ях)
|
Re: ATtiny441 и UART. Не могу разобраться
Сообщение от Deniska407
|
Если есть у кого какие мысли
|
Есть мысль, что у Вас скорость выбрана с большой погрешностью. Получается около 8900. Если хотите 9600, то ставьте бит U2X, а делитель ставьте 12.
|
|
|
Сказали "Спасибо" usr10000
|
|
|
04.07.2019, 16:11
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,246
Сказал спасибо: 11,165
Сказали Спасибо 3,854 раз(а) в 2,925 сообщении(ях)
|
Re: ATtiny441 и UART. Не могу разобраться
tsb, полудуплексные обычно с раздельным управлением приём-передача (Rx_En, Tx_En). При передаче включаем приём и проверяем принятое после каждой передачи.
Аппаратное echo получается.
Из-за этого был вопрос по использованному чипу в конце цепочки USB-UART-RS485 и его подключению.
У ТС вполне может стоять и полнодуплексный чип. Была такая "неожиданность" пару раз при покупке плат и модулей трансиверов на aliexpress , правда у нескольких вторая пара отказалась жить
ТС для начала физический уровень привести в соответствие со стандартом стоит, а потом уже двигаться дальше. Метания в поиске причин между возможными вариантами обеспечивают слабую сходимость процесса к итогу. Тут только на повезёт можно расчитывать и только для однофакторной ошибки…
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
Последний раз редактировалось mike-y-k; 04.07.2019 в 16:36.
|
|
|
|
04.07.2019, 16:14
|
|
Почётный гражданин KAZUS.RU
Регистрация: 15.11.2010
Сообщений: 2,374
Сказал спасибо: 338
Сказали Спасибо 328 раз(а) в 253 сообщении(ях)
|
Re: ATtiny441 и UART. Не могу разобраться
Сообщение от ForcePoint
|
Она достаточно стабильна,
|
Я даже на ЛА вижу джиттер от 441/841. Разумеется, на не калиброванном осцилляторе.
|
|
|
|
04.07.2019, 17:19
|
|
Прописка
Регистрация: 25.11.2006
Адрес: Харьков
Сообщений: 295
Сказал спасибо: 25
Сказали Спасибо 71 раз(а) в 60 сообщении(ях)
|
Re: ATtiny441 и UART. Не могу разобраться
Сообщение от mike-y-k
|
tsb, полудуплексные обычно с раздельным управлением приём-передача (Rx_En, Tx_En). При передаче включаем приём и проверяем принятое после каждой передачи.
Аппаратное echo получается.
|
Это Вы говорите о контроле передачи со стороны микроконтроллера ("слейва"). Но в приведенных примерах полученных посылок от "слейва" контрольные суммы (два последних байта) - везде правильные (с учетом значений первого "нестабильного" байта). Значит у ТС искажение данных происходит на участке передачи от ПК ("мастера") к "слейву".
|
|
|
|
04.07.2019, 18:00
|
|
Прохожий
Регистрация: 03.07.2019
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Уважаемые Коллеги!
Я не ожидал что мой вопрос будет кому то интересен и кто то будет на него отвечать. Я увидел столько от ВАС ответов и советов и очень приятно удивлен! ОГРОМНОЕ ВАМ ВСЕМ СПАСИБО ЗА ПОДДЕРЖКУ!
Задачу я решил следующим образом - правильно инициализировал UART:
PHP код:
|
void USART_Init()
{
UBRR0H = 0;
UBRR0L = 12; // ‹----
UCSR0A = (1 ‹‹ U2X0); // ‹----
UCSR0B = (1‹‹RXEN0)|(1‹‹TXEN0)|(1‹‹RXCIE0);
UCSR0C = (1‹‹USBS0)|(3‹‹UCSZ00);
}
|
Ошибок больше не ловил! Буду пилить программу дальше! Теперь, когда я начал принимать без ошибок, то столкнулся со следующей трудностью:
Телеграмма ModBUS RTU состоит из (например) из Адреса устройства (0х10), Номера ф-ции (0х03), Адреса (0х01 и 0х00) и Данных (0х00 и 0х01) и заканчивается все это CRC (0хХХ и 0хХХ). Всего телеграмма состоит из 8-ми байт. Моя же программа принимает только ОДИН ...
Вопрос: как из буфера UART по прерыванию наполнить массив frame[i] 8-ю байтами. Вот код, отвечающий за прием:
PHP код:
|
ISR (USART0_RX_vect)
{
i=0;
while ( !(UCSR0A & (1‹‹RXC0)) );
do
{
frame[i] = UDR0; // ‹---
i++; // ‹---
}
while( я не знаю что тут писать за условие);
}
|
Видимо тут нужно организовать цикл и принимать в frame[i] до тех пор из буфера, пока а) что то еще принимается и б) i‹32, иначе переполнится буфер массива frame[i] ......
Вот во вложении что получилось в анализаторе ...
Последний раз редактировалось mike-y-k; 05.07.2019 в 02:05.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:29.
|
|