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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Непонятный глюк с прерыванием во 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
Amper25
сообщение Jun 13 2008, 21:45
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 215
Регистрация: 10-04-07
Пользователь №: 26 929



Боже, неужели девушки этим занимаются? smile.gif

Для полноты оказываемой помощи желательно хотябы привести код.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jun 14 2008, 05:39
Сообщение #3


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

Группа: Свой
Сообщений: 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
Сообщение #4


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

Группа: Участник
Сообщений: 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
aaarrr
сообщение Jun 15 2008, 13:28
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Файлы забыли.
Go to the top of the page
 
+Quote Post
ZAA
сообщение Jun 15 2008, 13:44
Сообщение #6


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

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



Цитата(aaarrr @ Jun 15 2008, 16:28) *
Файлы забыли.

У меня там везде понапиханы AT91F_. Хотя я отлично помню Ваши советы их не использовать. Просто времени на самом деле очень в обрез - потом сделаю по-человечески
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 15 2008, 13:55
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(ZAA @ Jun 15 2008, 17:24) *
Простите за длинные выкладки - что-то файлики не хотят присоединяться((

В архив тогда можно было бы уложить. В сообщении что-то убилось.

Цитата(ZAA @ Jun 15 2008, 17:44) *
У меня там везде понапиханы AT91F_. Хотя я отлично помню Ваши советы их не использовать. Просто времени на самом деле очень в обрез - потом сделаю по-человечески

Ну ничего, иногда это простительно smile.gif
Go to the top of the page
 
+Quote Post
spf
сообщение Jun 15 2008, 14:56
Сообщение #8


Странник
****

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



Цитата(ZAA @ Jun 13 2008, 21:52) *
В конце концов вроде разобралась с ними, но к тому времени пошарила в инете и нашла FreeModbus (для слэйва). Прикрутила к FreeRTOSу.

Почему версию не сообщаете?
Там же вроде уже все прикручено.
showfiles


--------------------
"Как много есть на свете вещей, которые мне не нужны!" Сократ
Go to the top of the page
 
+Quote Post
ZAA
сообщение Jun 15 2008, 15:33
Сообщение #9


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

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



Цитата(spf @ Jun 15 2008, 17:56) *
Почему версию не сообщаете?
Там же вроде уже все прикручено.
showfiles

ДА-да, именно версия 1.4
А под словом прикручивать я имела ввиду в мэйкфайле прописать, ну и в свой проект включить некоторые файлы

Цитата(aaarrr @ Jun 15 2008, 16:55) *
В архив тогда можно было бы уложить. В сообщении что-то убилось.

ПРисоединяюsmile.gif
Go to the top of the page
 
+Quote Post
ZAA
сообщение Jun 15 2008, 16:54
Сообщение #10


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

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



Цитата(aaarrr @ Jun 15 2008, 16:55) *
В архив тогда можно было бы уложить. В сообщении что-то убилось.

ПРисоединяюsmile.gifПрикрепленный файл  modbus.zip ( 86.96 килобайт ) Кол-во скачиваний: 147

Прикрепленный файл  Source.zip ( 307.98 килобайт ) Кол-во скачиваний: 160
Go to the top of the page
 
+Quote Post
ZAA
сообщение Jun 23 2008, 16:36
Сообщение #11


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

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



Товарищи!!! Уже неоднократно поднимала эту тему (в посте "Непонятный глюк с прерываниями во FreeModbus"). Ну не могу я косяк найти в программе.
Крутится задача модбаса (фактически ф-ия Poll в цикле). Если контроллеру разрешить прерывания по TxRDY, и что-нить в обработчике прерывания делать - ну например поставить счетчик, отправлять байты и отсчитывать кол-во отправленных байтов, то постоянно происходят прерывания и в буфер пишется все, что нужно. Если же при отправке определенного кол-ва байт запрещаю прерывания по TXRDY и разрешаю по RXRDY, то происходит следующее. Контроллер принимает байты (определенное кол-во - например по счетчику, к-рый инкрементируется при каждом прерывании), затем я запрещаю прерывание на прием и снова разрешаю на передачу. И вот тут-то вместо отправки всего сообщения контролллер отправляет один байт и намертво виснет.
Были подозрения, что как-то конфликтуют эти прерывания с FreeRTOSовскими. Хотя вроде в самой системе кроме счётчика тиков (PIT-таймер) больше ничего и не используется. А может я ошибаюсь?

Чем может быть вызвана подобная проблема!!! Буду рада любым советам!
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jun 23 2008, 16:41
Сообщение #12


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

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



ну а зачем прерывания-то дёргать? пусть себе живут, принимают и отправляют байты


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


Гуру
******

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



Цитата(ZAA @ Jun 23 2008, 18:36) *
Уже неоднократно...

Moderator:
И по этой причине решили завалить вопросом весь форум?
Темы объединил.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 23 2008, 19:02
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(ZAA @ Jun 23 2008, 20:36) *
...Если же при отправке определенного кол-ва байт запрещаю прерывания по TXRDY и разрешаю по RXRDY, то происходит следующее. Контроллер принимает байты (определенное кол-во - например по счетчику, к-рый инкрементируется при каждом прерывании), затем я запрещаю прерывание на прием и снова разрешаю на передачу. И вот тут-то вместо отправки всего сообщения контролллер отправляет один байт и намертво виснет.

Как именно запрещаете прерывания? Приведите кусочек кода, в котором проявляется проблема.
Просто так перелопатить несколько сотен килобайт чужих исходников желающих найдется немного.
Go to the top of the page
 
+Quote Post
ZAA
сообщение Jun 24 2008, 04:21
Сообщение #15


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

Группа: Участник
Сообщений: 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;  

}
Go to the top of the page
 
+Quote Post

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

 


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


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