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

|
Цитата(aaarrr @ Jun 15 2008, 16:28)  Файлы забыли. У меня там везде понапиханы AT91F_. Хотя я отлично помню Ваши советы их не использовать. Просто времени на самом деле очень в обрез - потом сделаю по-человечески
|
|
|
|
|
Jun 15 2008, 14:56
|

Странник
   
Группа: Свой
Сообщений: 766
Регистрация: 29-08-05
Из: Екатеринбург
Пользователь №: 8 051

|
Цитата(ZAA @ Jun 13 2008, 21:52)  В конце концов вроде разобралась с ними, но к тому времени пошарила в инете и нашла FreeModbus (для слэйва). Прикрутила к FreeRTOSу. Почему версию не сообщаете? Там же вроде уже все прикручено. showfiles
--------------------
"Как много есть на свете вещей, которые мне не нужны!" Сократ
|
|
|
|
|
Jun 15 2008, 15:33
|
Частый гость
 
Группа: Участник
Сообщений: 141
Регистрация: 10-02-08
Из: Екб
Пользователь №: 34 906

|
Цитата(spf @ Jun 15 2008, 17:56)  Почему версию не сообщаете? Там же вроде уже все прикручено. showfilesДА-да, именно версия 1.4 А под словом прикручивать я имела ввиду в мэйкфайле прописать, ну и в свой проект включить некоторые файлы Цитата(aaarrr @ Jun 15 2008, 16:55)  В архив тогда можно было бы уложить. В сообщении что-то убилось. ПРисоединяю
|
|
|
|
|
Jun 15 2008, 16:54
|
Частый гость
 
Группа: Участник
Сообщений: 141
Регистрация: 10-02-08
Из: Екб
Пользователь №: 34 906

|
Цитата(aaarrr @ Jun 15 2008, 16:55)  В архив тогда можно было бы уложить. В сообщении что-то убилось. ПРисоединяю 
modbus.zip ( 86.96 килобайт )
Кол-во скачиваний: 147
Source.zip ( 307.98 килобайт )
Кол-во скачиваний: 160
|
|
|
|
|
Jun 23 2008, 16:45
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(ZAA @ Jun 23 2008, 18:36)  Уже неоднократно... Moderator: И по этой причине решили завалить вопросом весь форум? Темы объединил.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jun 24 2008, 04:21
|
Частый гость
 
Группа: Участник
Сообщений: 141
Регистрация: 10-02-08
Из: Екб
Пользователь №: 34 906

|
Цитата(aaarrr @ Jun 23 2008, 22:02)  Как именно запрещаете прерывания? Приведите кусочек кода, в котором проявляется проблема. Просто так перелопатить несколько сотен килобайт чужих исходников желающих найдется немного. Ф-ия MAIN Код int main( void ) { prvSetupHardware(); xTaskCreate( vModbus_Task, "modbus", (configMINIMAL_STACK_SIZE*6), NULL, tskIDLE_PRIORITY, NULL );
vTaskStartScheduler();
return 0; } Ф-ия разрешения прерываний по UART Код void UART_INTERRUPT_ENABLE (int RXRDY, int TXRDY) { portENTER_CRITICAL(); if ((RXRDY == 1)&&(TXRDY == 0)) { *AT91C_US0_IER = AT91C_US_RXRDY; *AT91C_US0_IDR = AT91C_US_TXRDY; } else if ((RXRDY == 0)&& (TXRDY == 1)) { *AT91C_US0_IER = AT91C_US_TXRDY; *AT91C_US0_IDR = AT91C_US_RXRDY; } portEXIT_CRITICAL(); } Обработчик прерывания по UART Код void vUART_ISR_Handler( void ) { unsigned int status;
status = AT91C_BASE_US0->US_CSR & AT91C_BASE_US0->US_IMR; if(status & AT91C_US_RXRDY) { if (counter_rcv != 4 ) { massiv[counter_rcv] = uart0_getc(); counter_rcv++; } else { counter_rcv = 0; UART_INTERRUPT_ENABLE(0,1); //Разрешаю прерывание по TXRDY } } if(status & AT91C_US_TXRDY) { if (counter_trsm !=4) { uart0_putc((char) massiv[counter_trsm]); counter_trsm++; } else { counter_trsm = 0; UART_INTERRUPT_ENABLE(1,0); //Разрешаю прерывание по RXRDY } } AT91C_BASE_AIC->AIC_EOICR = 0;
}
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|