|
Непонятный глюк с прерыванием во Freemodbus |
|
|
|
Jun 13 2008, 15:52
|
Частый гость
 
Группа: Участник
Сообщений: 141
Регистрация: 10-02-08
Из: Екб
Пользователь №: 34 906

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

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

|
Я колупался с freemodbus. Действительно, очень удобная штука, вешается на что угодно (я вешал на msp430) и написана очень грамотно (для себя много почерпнул). Цитата Дело, похоже, в том что вызов ф-ии отправки в исходном коде происходит только после приема фрэйма Насколько я понял, по приёму байта он просто пишется в буфер. По таймауту приёма (переполнение таймера) вызывается функция первичного анализа фрейма, по результату выставляются флаги. Потом вы вызываете функцию poll() , которая обрабатывает пакет, вызывает соответствующие функции (read/write register/coil etc.), формирует ответный пакет и запускает передачу. Мастер я не делал, но там всё должно быть несколько по другому. Отправляете пакет, запоминаете какой и кому. по приёму пакета опять та же первичная обработка (CRC и структура пакета), вызов poll(), которую надо переделать. она должна анализировать ответ на предмет соответствия запросу (адрес, команда), и если всё нормально, производить необходимые действия. В целом, ИМХО, нужно переделать только poll() и добавить функцию отправки мастер-пакета. Ну и ещё учесть тайм-аут приёма пакета.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Jun 15 2008, 13:24
|
Частый гость
 
Группа: Участник
Сообщений: 141
Регистрация: 10-02-08
Из: Екб
Пользователь №: 34 906

|
Цитата(MrYuran @ Jun 14 2008, 08:39)  Дело в том, что я понимаю, как работает эта штука, и все работало, а щас виснет в одном и том же место - по-моему, в прерывании на передачу. То есть фрэйм принимается, обрабатыватся, а вот обратно передаваться не хочет - пишет только первый байт, то бишь адрес, и капут - контроллер зависает. С контроллером ничего не могло произойти - это конечно глупое предположение, но мало ли А может, тут конфликт с прерываниями FreeRTOSа? Цитата(Amper25 @ Jun 14 2008, 00:45)  Боже, неужели девушки этим занимаются?  Для полноты оказываемой помощи желательно хотябы привести код. Код я собственно и не меняла - как был в исходниках, так и остался, потому что дело дальше не пошло из-за описанного выше глюка. Привожу 4 файла - main.c, где собственно запускается задача опроса, mb.c, где эта ф-ия (poll) написана, mbrtu - там ф-ии посылки-приема, portserial - настройка UART и обработчики прерывания Простите за длинные выкладки - что-то файлики не хотят присоединяться(( Moderator: Обширные включения кода исключены. Учитесь пользоваться архиваторами.
Сообщение отредактировал zltigo - Jun 15 2008, 15:39
|
|
|
|
Сообщений в этой теме
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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|