реклама на сайте
подробности

 
 
> Непонятный глюк с прерыванием во Freemodbus
ZAA
сообщение Jun 13 2008, 15:52
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 141
Регистрация: 10-02-08
Из: Екб
Пользователь №: 34 906



Нужно реализовать протокол Modbus RTU (в режиме мастера) на AT91SAM7x256. Поначалу пробовала писать свои функции отправки и приема. Но долго мучилась с прерываниями по таймеру и уарту. В конце концов вроде разобралась с ними, но к тому времени пошарила в инете и нашла FreeModbus (для слэйва). Прикрутила к FreeRTOSу. Все отлично работало. Контроллер и принимал, и отсылал назад фрэймы. И прием и передача там организованы на основе перываний от RxD и TxD. Потом стала пытаться преобразовать код для мастера, то бишь сначала отправлять сообщение, а потом ждать ответа. При таком раскладе происходило прерывание на передачу, но только ОДИН раз (и контроллер зависал). Дело, похоже, в том что вызов ф-ии отправки в исходном коде происходит только после приема фрэйма, и массив там используется один, короче, штука вся в указателях... Но не в этом глюк. В один "прекрасный" момент при попытке вернуть все в исходное состояние (то есть обратно в исходный режим слэйва) контроллер стал зависать и после приема фрэйма, то есть там, где раньше работал отлично.
Может, кто-то сталкивался с подобным? Может кто-нить пользовался FreeModbus'ом или переделывал его под себя. А использовать его удобно, т к ф-ии все есть и организовано в виде TASK отдельного!
ЛЮДИ, ПОМОГИТЕ!!! ВРЕМЯ УТЕКАЕТ, А ПРОБЛЕМА ОСТАЕТСЯ. crying.gif

Сообщение отредактировал ZAA - Jun 13 2008, 15:53
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
MrYuran
сообщение Jun 14 2008, 05:39
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Я колупался с freemodbus.

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

Насколько я понял, по приёму байта он просто пишется в буфер. По таймауту приёма (переполнение таймера) вызывается функция первичного анализа фрейма, по результату выставляются флаги.

Потом вы вызываете функцию poll() , которая обрабатывает пакет, вызывает соответствующие функции (read/write register/coil etc.), формирует ответный пакет и запускает передачу.

Мастер я не делал, но там всё должно быть несколько по другому. Отправляете пакет, запоминаете какой и кому. по приёму пакета опять та же первичная обработка (CRC и структура пакета), вызов poll(), которую надо переделать. она должна анализировать ответ на предмет соответствия запросу (адрес, команда), и если всё нормально, производить необходимые действия.

В целом, ИМХО, нужно переделать только poll() и добавить функцию отправки мастер-пакета. Ну и ещё учесть тайм-аут приёма пакета.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
ZAA
сообщение Jun 15 2008, 13:24
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 141
Регистрация: 10-02-08
Из: Екб
Пользователь №: 34 906



Цитата(MrYuran @ Jun 14 2008, 08:39) *


Дело в том, что я понимаю, как работает эта штука, и все работало, а щас виснет в одном и том же место - по-моему, в прерывании на передачу. То есть фрэйм принимается, обрабатыватся, а вот обратно передаваться не хочет - пишет только первый байт, то бишь адрес, и капут - контроллер зависает. С контроллером ничего не могло произойти - это конечно глупое предположение, но мало ли crying.gif
А может, тут конфликт с прерываниями FreeRTOSа?

Цитата(Amper25 @ Jun 14 2008, 00:45) *
Боже, неужели девушки этим занимаются? smile.gif

Для полноты оказываемой помощи желательно хотябы привести код.


Код я собственно и не меняла - как был в исходниках, так и остался, потому что дело дальше не пошло из-за описанного выше глюка. Привожу 4 файла - main.c, где собственно запускается задача опроса, mb.c, где эта ф-ия (poll) написана, mbrtu - там ф-ии посылки-приема, portserial - настройка UART и обработчики прерывания
Простите за длинные выкладки - что-то файлики не хотят присоединяться((

Moderator:
Обширные включения кода исключены. Учитесь пользоваться архиваторами.

Сообщение отредактировал zltigo - Jun 15 2008, 15:39
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ZAA   Непонятный глюк с прерыванием во Freemodbus   Jun 13 2008, 15:52
- - Amper25   Боже, неужели девушки этим занимаются? Для полно...   Jun 13 2008, 21:45
- - aaarrr   Файлы забыли.   Jun 15 2008, 13:28
|- - ZAA   Цитата(aaarrr @ Jun 15 2008, 16:28) Файлы...   Jun 15 2008, 13:44
- - aaarrr   Цитата(ZAA @ Jun 15 2008, 17:24) Простите...   Jun 15 2008, 13:55
|- - ZAA   Цитата(aaarrr @ Jun 15 2008, 16:55) В арх...   Jun 15 2008, 16:54
- - spf   Цитата(ZAA @ Jun 13 2008, 21:52) В конце ...   Jun 15 2008, 14:56
|- - ZAA   Цитата(spf @ Jun 15 2008, 17:56) Почему в...   Jun 15 2008, 15:33
- - ZAA   Товарищи!!! Уже неоднократно поднимала...   Jun 23 2008, 16:36
|- - zltigo   Цитата(ZAA @ Jun 23 2008, 18:36) Уже неод...   Jun 23 2008, 16:45
|- - aaarrr   Цитата(ZAA @ Jun 23 2008, 20:36) ...Если ...   Jun 23 2008, 19:02
|- - ZAA   Цитата(aaarrr @ Jun 23 2008, 22:02) Как и...   Jun 24 2008, 04:21
- - MrYuran   ну а зачем прерывания-то дёргать? пусть себе живут...   Jun 23 2008, 16:41
- - aaarrr   Несмотря на некоторую общую кривизну идеи (уж прос...   Jun 24 2008, 04:44
|- - ZAA   Цитата(aaarrr @ Jun 24 2008, 07:44) Несмо...   Jun 24 2008, 07:35
- - Цырен   Народ помогите! Если вы смогли победить free...   Jun 30 2008, 09:35


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 18:31
Рейтинг@Mail.ru


Страница сгенерированна за 0.01328 секунд с 7
ELECTRONIX ©2004-2016