Например TDA7294

Форум РадиоКот • Просмотр темы - avr modbus вопросы
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 16, 2024 10:45:19

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 85 ]    , , 3, ,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: avr modbus вопросы
СообщениеДобавлено: Пн окт 03, 2016 05:44:00 
Потрогал лапой паяльник
Аватар пользователя

Карма: 19
Рейтинг сообщений: 8
Зарегистрирован: Чт окт 31, 2013 10:54:32
Сообщений: 381
Рейтинг сообщения: 0
Начал реализовывать задуманное :)) :) 8)

Датчик температуры прикрутил, сделал простое меню, uart настроил. Теперь идет вопрос с реализацией сети.

Alkul, чуть выше вы писали про прием и обработку пакета в течении 1,5t приема пакета. А как быть с передачей? Т.е. мастер должен учитывать это время или как?

Передавать собираюсь бинарные данные, выше была мысль использовать начальный символ пакета, например 0x01, по приему которого будет начинаться прием пакета. Можно ли сделать такой алгоритм, вместо подсчета времени? + Добавить еще последний стоповый байт.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: avr modbus вопросы
СообщениеДобавлено: Пн окт 03, 2016 06:32:21 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2690
Откуда: г. Чайковский
Рейтинг сообщения: 1
Медали: 1
Получил миской по аватаре (1)
Я делал очень простой протокол обмена. Два или три стартовых байта типа 0xAA, затем данные фиксированной длины, потом стоповые байты 0х55. Вроде как сбоев протокола не было, но можно же еще контрольную сумму добавить.

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: avr modbus вопросы
СообщениеДобавлено: Пн окт 03, 2016 11:14:16 
Друг Кота
Аватар пользователя

Карма: 62
Рейтинг сообщений: 840
Зарегистрирован: Вт апр 24, 2007 07:45:40
Сообщений: 5592
Откуда: Minsk
Рейтинг сообщения: 1
alex38779 писал(а):
бинарные данные, выше была мысль использовать начальный символ пакета, например 0x01, по приему которого будет начинаться прием пакета.

А что будете делать, если в данных байт совпадет со стартовым или стоповым ?

_________________
Изображение


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: avr modbus вопросы
СообщениеДобавлено: Пн окт 03, 2016 11:32:30 
Потрогал лапой паяльник
Аватар пользователя

Карма: 19
Рейтинг сообщений: 8
Зарегистрирован: Чт окт 31, 2013 10:54:32
Сообщений: 381
Рейтинг сообщения: 0
Jack_A писал(а):
если в данных байт совпадет со стартовым или стоповым ?


Берем 3 одинаковых стартовых байта, далее посылка и контрольная сумма, 2 одинаковых стоповых байта.
По приему каждого байта инкриментируем счетчик. И проверяем первые 3 байта, если равны приняли верно, проверяем стоповые байты. Считаем контрольную сумму - если она верна - посылка принята верно. Еще проверяем длину посылки, она будет заранее известна. Мастер будет слать например 10 байтовые посылки, слейв - 7.

Алгоритм вижу таким.

А что будет если совпадет.. То сорвется обмен пакетами...

Но после 3 стартовых байт идет адрес слейва, и его можно сделать что бы он не был равен стартовому, как и стоповому, исключить эти 2 числа из нумерации адресов слейвов.


Вернуться наверх
 
Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: avr modbus вопросы
СообщениеДобавлено: Пн окт 03, 2016 11:36:28 
Опытный кот

Карма: 1
Рейтинг сообщений: 52
Зарегистрирован: Чт мар 12, 2009 16:31:05
Сообщений: 804
Рейтинг сообщения: 0
Разница во времени между передачей байта в массиве и передачей массива.


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: avr modbus вопросы
СообщениеДобавлено: Пн окт 03, 2016 12:38:02 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2690
Откуда: г. Чайковский
Рейтинг сообщения: 1
Медали: 1
Получил миской по аватаре (1)
Jack_A писал(а):
А что будете делать, если в данных байт совпадет со стартовым или стоповым ?
alex38779 писал(а):
Алгоритм вижу таким.
Пускай в пакете полезных данных 16 байт, в него же включены байт (ы) контрольной суммы, так же в пакете три стартовых 0xAA и три стоповых0x55.

Счетчик принятых данных инициализирован нулем.
Приходит байт данных:
- Если счетчик меньше 3, то проверяется что пришло, если 0хАА , то счетчик инкрементируется, иначе обнуляется.
- Если 3<=счетчик<=18, то данные кладутся во временный массив. TempMass[счетчик-3]=Data. Счетчик инкрементируется.
- Если 19<=счетчик<=20, то проверяется что пришло, если 0х55 , то счетчик инкрементируется, иначе обнуляется.
- Если 20<счетчик, счетчик обнуляется, проверяется что пришло, если 0х55 , то проверяется контрольная сумма. Если сумма в порядке, данные из временного массива копируются в массив принятых данных, выставляется флаг (или еще что-то) об успешном приеме пакета.

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: avr modbus вопросы
СообщениеДобавлено: Пн окт 03, 2016 20:02:22 
Держит паяльник хвостом

Карма: 25
Рейтинг сообщений: 375
Зарегистрирован: Ср апр 13, 2011 11:09:20
Сообщений: 933
Откуда: Екатеринбург
Рейтинг сообщения: 5
alex38779 писал(а):
Alkul, чуть выше вы писали про прием и обработку пакета в течении 1,5t приема пакета. А как быть с передачей? Т.е. мастер должен учитывать это время или как?

Нет, конечно, мастер передает байты подряд, без учета этого времени.
Суть вот в чем - мастер начал передавать байт, по окончании стоп-бита у слейва вызовется прерывание по приему байта. Он берет принятый байт из буфера, инициализирует таймер на время, равное полуторному приему байта, затем обрабатывает полученный байт (помещает принятый байт в буфер приема, если нужно - корректирует длину пакета и т.д.) Тем временем мастер уже начал передавать следующий байт. Когда слейв примет этот следующий байт, он перезапустит таймер снова на полуторное время. После приема последнего байта пакета слейв должен принудительно остановить таймер. Таким образом, при нормальном приеме обработчик прерывания таймера никогда не будет вызван. Вызывается обработчик прерывания таймера только в случае, если после приема байта в течение полуторного времени не был принят ни один байт, что возможно только в случае, если прием байта у слейва был вызван ошибочно - например, при помехе на линии. В обработчике прерывания таймера по сути достаточно обнулить счетчик принятых байт и остановить таймер.

alex38779 писал(а):
Передавать собираюсь бинарные данные, выше была мысль использовать начальный символ пакета, например 0x01, по приему которого будет начинаться прием пакета. Можно ли сделать такой алгоритм, вместо подсчета времени? + Добавить еще последний стоповый байт.

Если Вы передаете бинарные данные, то никаких символов пакета использовать нельзя - они могут встретиться в самих данных.
Подсчет времени на самом деле - это и есть самый простой алгоритм. Всего-то надо запустить таймер, а в обработчике его прерывания обнулить переменную. Это очень просто и, главное, надежно.

alex38779 писал(а):
А что будет если совпадет.. То сорвется обмен пакетами...

А зачем самому закладывать вероятность сбоя? Как сказал в свое время мой препод в универе - зачем самому подкладывать ёжика себе на стул?
Что Вас не устраивает или смущает в предложенном мной алгоритме?

Я могу дать Вам пример программы, но только на ассемблере.

Z_h_e писал(а):
так же в пакете три стартовых 0xAA и три стоповых0x55.

На мой взгляд, совершенно лишний "наворот", не дающий никакого преимущества по сравнению с предлагаемым мной способом.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: avr modbus вопросы
СообщениеДобавлено: Пн окт 03, 2016 21:59:59 
Друг Кота
Аватар пользователя

Карма: 62
Рейтинг сообщений: 840
Зарегистрирован: Вт апр 24, 2007 07:45:40
Сообщений: 5592
Откуда: Minsk
Рейтинг сообщения: 6
Alkul писал(а):
Если Вы передаете бинарные данные, то никаких символов пакета использовать нельзя - они могут встретиться в самих данных.

"Вот иманно" © :) Называем топик Модбас, а дальше идет самопал, с Модбас'ом мало общего имеющий.
У Модбас'а 2 режима : Modbus RTU И Modbus ASCII . Первый передает бинарные данные, конец пакета - по тайм-ауту. Второй - бинарные данные кодируются двумя HEX-символами, и действительно есть стартовый символ : , но уже внутри пакета : не встретится. Бери и пользуйся.
А уж если так невтерпеж старт-стопы влимонить, то будьте бобры прмиенить байтстаффинг с ESC-последовательностью, чтобы приемник не сбивать с толку - а оно вам надо ?
Пример использования : https://ru.wikipedia.org/wiki/HDLC

_________________
Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: avr modbus вопросы
СообщениеДобавлено: Пн окт 03, 2016 22:55:32 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2690
Откуда: г. Чайковский
Рейтинг сообщения: 1
Медали: 1
Получил миской по аватаре (1)
Я так понял, что ТСу модбас и не нужен.
Alkul писал(а):
На мой взгляд, совершенно лишний "наворот", не дающий никакого преимущества по сравнению с предлагаемым мной способом.
Преимущество в том, что нет привязки ко времени. Это упрощает программу, как для передатчика, так и для приемника. А про байтстафинг, который упоминает Jack_A, я не знал, хорошая вещь.

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: avr modbus вопросы
СообщениеДобавлено: Вт окт 04, 2016 04:40:29 
Держит паяльник хвостом

Карма: 25
Рейтинг сообщений: 375
Зарегистрирован: Ср апр 13, 2011 11:09:20
Сообщений: 933
Откуда: Екатеринбург
Рейтинг сообщения: 2
Z_h_e писал(а):
Преимущество в том, что нет привязки ко времени.

Это не преимущество, а недостаток. Допустим, у Вас сеть с одним мастером и несколькими слейвами.
В процессе передачи пакета мастер прервал передачу (питание пропало, завис, не суть важно). Слейвы будут "висеть" в ожидании продолжения бесконечно, ибо время, отведенное на передачу байта в частности и пакета в целом, никак не контролируется. Когда мастер "придет в себя" и начнет передавать пакет заново, эти первые три байта 0xAA не будут распознаны как начало нового пакета, а будут приняты за продолжение байт данных предыдущего пакета. Даже если Вы в теле пакета передаете его длину, это ничего не значит - передача может остановиться сразу после передачи трех префиксных байт, при этом в качестве длины пакета может быть взят первый (или второй) префиксный байт. В итоге сеть восстановит работоспособность только тогда, когда:
1. счетчик принятых байт досчитает до нуля, при этом, скорее всего, текущий принимаемый пакет будет будет где-нибудь на середине. Ваш алгоритм остановит прием пакета по длине пакета (в качестве которой был взят "мусор", как мы помним). Ваш алгоритм должен будет отбросить этот пакет, поскольку длина исчерпана, а завершающих постфиксных байт не было, и перейти в ожидание следующего пакета
2. Но текущий-то передаваемый пакет продолжает приниматься, поэтому вместо трех префиксных байт Вы получите продолжение тела пакета. Этот пакет Вы тоже отбросите, потому что префикса не было.
3. И только после этого сеть восстановит работу. Если же Вы, надеясь только на свои префиксные и постфиксные байты не используете длину пакета вообще, то сеть никогда не восстановит работу после описанного мной сбоя. Вам придется перегружать всех - и мастера, и слейвов.

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

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

Если же делать жесткий контроль длины пакета на уровне алгоритма приема, то это (ничуть не упростив программу) лишает протокол обмена гибкости - возможности использовать пакеты переменной длины.

Z_h_e писал(а):
Это упрощает программу, как для передатчика, так и для приемника.

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

Кстати, например, в протоколе TCP/IP делается контроль времени приема в виде параметра "время жизни дейтаграмм".


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: avr modbus вопросы
СообщениеДобавлено: Вт окт 04, 2016 08:23:51 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2690
Откуда: г. Чайковский
Рейтинг сообщения: 1
Медали: 1
Получил миской по аватаре (1)
Alkul, Вы неудачно процитировали меня. Оба предложения - это одна мысль. Их нельзя было разделять на цитаты. Алгоритм приема/передачи действительно очень простой. Несомненно, данный протокол очень не идеален и в ответственных системах, например, где сбой работы влечет угрозу здоровью, применять бы я его и сам не стал. Применение таймера, тоже не сложно. Но Вы, возможно, заметили в этом форуме, что многие коты теряются, когда надо применять несколько периферийных устройств для одной задачи, иногда даже не пытаются это сделать.
Alkul писал(а):
Если же Вы, надеясь только на свои префиксные и постфиксные байты не используете длину пакета вообще, то сеть никогда не восстановит работу после описанного мной сбоя.
Нет, Вы тут ошибаетесь. Теряется кривой пакет (само-собой) и нормальный последующий, после чего все восстанавливается. Если сбой - это исключение (а именно так должно быть), то в целом это не проблема. У меня есть устройство, которое передает данные уже несколько лет, выключаясь только летом. Протокол еще убогее, чем я предложил. Два старта и два стопа, нет контроля целостности данных. Данные передаются через "блюпуп". Еще не было ни одного сбоя, но если бы были, то в том устройстве не страшно.

Я ни разу не говорил, что Вы что-то неудачное предлагаете, но на всякий случай обозначу это. Я не считаю, что Вы предлагаете неудачный вариант. Ну чтобы не возникло никчемной дискуссии. ТС пускай сам себе выбирает, что ему лучше.

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: avr modbus вопросы
СообщениеДобавлено: Вт окт 04, 2016 08:48:19 
Друг Кота
Аватар пользователя

Карма: 62
Рейтинг сообщений: 840
Зарегистрирован: Вт апр 24, 2007 07:45:40
Сообщений: 5592
Откуда: Minsk
Рейтинг сообщения: 1
Z_h_e писал(а):
А про байтстафинг я не знал, хорошая вещь.

Я с ним знаком только "тетеритически" :) , применять не приходилось. В "раньших" проектах применял ASCII mode, бинарные кодировал 2 шестн. цифрами, потому : в данных не мог встречаться. Но избыточность была гигантская, перешел на RTU mode.
Насчет таймингов есть одна засада. Если обмен меж двумя МК, мастер при передаче может сосредоточиться именно на ней, ложных тайм-аутов не будет. А если обмен с ПК - Винда вообще-то не реалтаймовая, и какой-нибудь более приоритетный процесс может тормознуть передачу. Потому я окончания передачи пакета ждал не 1,5 байта, а несколько миллисекунд. Рекордных скоростей обмена не получишь, но мне хватало, т.к. остальными участниками системы были еще более медленные компоненты - люди . :)

_________________
Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: avr modbus вопросы
СообщениеДобавлено: Вт окт 04, 2016 08:57:14 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2690
Откуда: г. Чайковский
Рейтинг сообщения: 1
Медали: 1
Получил миской по аватаре (1)
Я свой "мега протокол" придумал лет двадцать назад. И для моих нужд вполне устраивал, в некоторых вариациях. Байтстафинг явно бы его улучшил, но догадаться или наткнуться на книгу про него, как то мозгов не хватило. :)

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: avr modbus вопросы
СообщениеДобавлено: Вт окт 04, 2016 09:16:27 
Держит паяльник хвостом

Карма: 25
Рейтинг сообщений: 375
Зарегистрирован: Ср апр 13, 2011 11:09:20
Сообщений: 933
Откуда: Екатеринбург
Рейтинг сообщения: 1
Z_h_e писал(а):
Применение таймера, тоже не сложно. Но Вы, возможно, заметили в этом форуме, что многие коты теряются, когда надо применять несколько периферийных устройств для одной задачи

Поскольку я программирую на ассемблере, то у меня выработался свой стиль, ускоряющий работу, а именно - максимальная стандартизация алгоритмов и подпрограмм с целью использования их во всех проектах. Изменения в отлаженные подпрограммы и алгоритмы вносятся только тогда, когда этого требует задача. Исходя из этого, правильней сразу освоить и в дальнейшем использовать более стабильную/лучшую версию алгоритма, чем перерабатывать его коренным образом под каждую задачу.
Что же касается котов-новичков... на моей памяти, еще ни одному "котенку" не отказали в помощи, если он действительно хочет научиться и докопаться до истины.
И тредстартеру никто (ни я, ни, надеюсь, Вы) не откажет в помощи, если он попросит показать ему, как в данном случае одновременно использовать USART и таймер.

Z_h_e писал(а):
Нет, Вы тут ошибаетесь. Теряется кривой пакет (само-собой) и нормальный последующий, после чего все восстанавливается.

Если понятия "длина пакета" нет вообще, то сеть не восстановится. В предлагаемом Вами алгоритме это понятие есть, но но оно жестко определено алгоритмом, поэтому, действительно потеряется "кривой" пакет плюс следующий за ним один нормальный.

Z_h_e писал(а):
Протокол еще убогее, чем я предложил. Два старта и два стопа, нет контроля целостности данных. Данные передаются через "блюпуп". Еще не было ни одного сбоя, но если бы были, то в том устройстве не страшно.

Бесспорно, реализация зависит от задачи. Но, на мой взгляд, если мы говорим об упрощении, то в бОльшей степени упрощение делается не в случае некритичной задачи, а в случае ограничений "железа".
Например, делаете Вы уличный термометр-"показомер", замену спиртового градусника. Если при ежесекундном обновлении данных (которое для термометра-"показомера" просто не нужно, достаточно раз в 10 секунд) даже каждый 10-й замер будет "битым" - ничего страшного. При этом, если у Вас есть отлаженный программный модуль обмена данными с переменной длиной пакета, контролем времени передачи и т.д., то почему бы не использовать его? Однако, если у Вас выбран МК с малым количеством программной памяти, и задача такова, что её реализация "впритык" умещается в памяти, то допустимо упростить протокол обмена, если потеря какой-то части данных не критична.

Z_h_e писал(а):
Я ни разу не говорил, что Вы что-то неудачное предлагаете, но на всякий случай обозначу это. Я не считаю, что Вы предлагаете неудачный вариант. Ну чтобы не возникло никчемной дискуссии.

Я понял. Без проблем :))

Z_h_e писал(а):
ТС пускай сам себе выбирает, что ему лучше.

Последнее слово, бесспорно, за ТС.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: avr modbus вопросы
СообщениеДобавлено: Вт окт 04, 2016 11:30:04 
Потрогал лапой паяльник
Аватар пользователя

Карма: 19
Рейтинг сообщений: 8
Зарегистрирован: Чт окт 31, 2013 10:54:32
Сообщений: 381
Рейтинг сообщения: 0
Спасибо за помощь коты :) :) :) :) :) :beer: !!!

Выбираю реализацию обмена при помощи прерывания от таймера.

Как вижу я его :idea: , исходя из прочитанного выше.



Код:
/*отсчитываем время*/
ISR(таймер, по переполнению на t времени)
{
  /*если возникло прерывание, то делаем что то - например ставим флаг ошибки*/
}

/*Действия по приему байта*/
ISR(юарт)
{
    /*инициализируем таймер - обнуляем счетный регистр*/
   TCNTx = 0;
   /*помещаем байт в приемник*/
    data[i] = UDR //
    /*функция обработки байта*/
    obrabotka();
    /*если байт последний то останавливаем таймер*/
    if (байт == последний)
    {
       выставляем биты CSxx в 0.
       TIMSK &= ~(выкл. прерывание);
    }
}



Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: avr modbus вопросы
СообщениеДобавлено: Вт окт 04, 2016 12:49:09 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2690
Откуда: г. Чайковский
Рейтинг сообщения: 3
Медали: 1
Получил миской по аватаре (1)
Вы, я так понимаю, сейчас про приемник.

i - глобальная переменная, я бы ей дал другое имя.


В прерывании от UART.

Первым делом, data[i] = UDR, чтобы освободить буфер. И массив, скорее всего, у меня был бы буферный (временный).


После этого.
Если i==0, сбрасываете и запускаете остановленный таймер.
i++
Если i == "усё". Остановить таймер.; i=0; Если данные целые и по адресу, скопировать из буферного массива, в постоянный массив полезные данные. Как то, просемафорить основной проге, о принятых данных.

Прерывание от Таймера (Лучший режим CTC, преывание совпадение с регистром OCR).

Остановить таймер,
i=0
просемафорить проге о сбое кадра (если это надо).


Как-то так наверное.

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: avr modbus вопросы
СообщениеДобавлено: Вт окт 04, 2016 18:03:28 
Держит паяльник хвостом

Карма: 25
Рейтинг сообщений: 375
Зарегистрирован: Ср апр 13, 2011 11:09:20
Сообщений: 933
Откуда: Екатеринбург
Рейтинг сообщения: 1
Z_h_e писал(а):
После этого.
Если i==0, сбрасываете и запускаете остановленный таймер.

Не совсем так. Перезапускать таймер нужно после получения каждого байта на время, равное полуторному времени приема байта. Например, при скорости 19200, 8-ми битах данных, одном старт-бите и одном стоп-бите время приема байта будет равно 10/19200 = 0,53 мс, а задержку надо взять равной 0,8 мс. Тут я сделаю оговорку, и сошлюсь на уважаемого Jack_A, который совершенно справедливо заметил, что для случая, когда МК ведет обмен с виндой или другой не реалтаймовой ОС, это время надо увеличить. Если же обмен ведут два МК, тогда считать время задержки именно так, как я показал.

Приняли байт в data[i], и сразу же перезапускайте таймер. Для перезапуска надо его остановить, обнулив биты CSx2...CSx0 регистра TCCRxB, занести в соответствующий регистр TCNTx новое значение и снова запустить таймер, установив необходимую комбинацию битов CSx2...CSx0 регистра TCCRxB. буквой "х" в данном случае я обозначаю цифры 0...2 в зависимости от того таймера, который будет использован.

Z_h_e писал(а):
Если i == "усё". Остановить таймер.; i=0; Если данные целые и по адресу, скопировать из буферного массива, в постоянный массив полезные данные. Как то, просемафорить основной проге, о принятых данных.

Желательно после этого еще и вычислить CRC. alex38779, если нужен алгоритм расчета CRC-16 на Си - их есть у меня :)

Z_h_e писал(а):
Прерывание от Таймера (Лучший режим CTC, преывание совпадение с регистром OCR).

Не в данном случае, на мой взгляд. Если бы нужно было периодически вызывать таймер для отсчета времени, тогда да, CTC самый удобный для этого режим.
А у нас однократные вызовы, так что вполне можно использовать режим normal.


alex38779, Вы не ответили, нужен ли Вам пример работы с USART на ассемблере.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: avr modbus вопросы
СообщениеДобавлено: Вт окт 04, 2016 18:35:33 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2690
Откуда: г. Чайковский
Рейтинг сообщения: 1
Медали: 1
Получил миской по аватаре (1)
Alkul писал(а):
Перезапускать таймер нужно после получения каждого байта
Да, так будет лучше. В моем предложенном варианте, таймер должен был настраиваться на время передачи всего пакета, а это замедлит пропускную способность линии. Была бы у меня фактическая практика с модбасом, сразу бы дошло.
Alkul писал(а):
Для перезапуска надо его остановить
Да наверное его даже и не надо останавливать, лишь обновить значение, особенно если использовать прерывание по переполнению.
Alkul писал(а):
Желательно после этого еще и вычислить CRC.
Z_h_e писал(а):
...Если данные целые и по адресу...


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

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: avr modbus вопросы
СообщениеДобавлено: Ср окт 05, 2016 04:51:42 
Потрогал лапой паяльник
Аватар пользователя

Карма: 19
Рейтинг сообщений: 8
Зарегистрирован: Чт окт 31, 2013 10:54:32
Сообщений: 381
Рейтинг сообщения: 0
Alkul писал(а):
. alex38779, если нужен алгоритм расчета CRC-16 на Си - их есть у меня :)

alex38779, Вы не ответили, нужен ли Вам пример работы с USART на ассемблере.


Алгоритм расчета CRC-16 нужен!
Насчет примера на ассемблере, думаю можно глянуть и попробовать разобраться. На ассемблере могу и что-то знаю.

Z_h_e писал(а):
Лучше кончено будет не копировать данные из буферного в другой массив. А просто переключать их - двойная буферизация.


А как сделать эту двойную буферизацию? С таким не сталкивался.


Посчитал таймер Т2, 8 битный, прерывание по переполнению в 0,8с:
частота 8МГц
предделитель 256

256/8000000 = 0,032мс
0,8/0,032 = 25
Начальное значение TCNT = 256-25 = 231

Правильно?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: avr modbus вопросы
СообщениеДобавлено: Ср окт 05, 2016 06:21:09 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2690
Откуда: г. Чайковский
Рейтинг сообщения: 1
Медали: 1
Получил миской по аватаре (1)
alex38779 писал(а):
А как сделать эту двойную буферизацию? С таким не сталкивался.
Один массив буферный, другой основной. Как только в буфер легли правильные данные, назначение массивов меняется местами. Для этого используйте указатели. Если скорости передачи и обработки принятого позволяют, то можно обойтись и без буферного массива.
alex38779 писал(а):
Правильно?
Параметры UART еще надо знать, т.е. время передачи одного байта.

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 85 ]    , , 3, ,  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: akl, Demiurg и гости: 31


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y