Современные технологии автоматизации» («СТА») —  журнал для квалифицированных специалистов по промышленной автоматизации Форум СТА — современные технологии автоматизации Домашняя страница
Домашняя страница форума CTA Домашняя страница форума CTA > II. АСУТП и SCADA > ПЛК и микроконтроллеры
  Активные темы Активные темы
  FAQ FAQ  Искать в форуме   Зарегистрироваться Зарегистрироваться  Вход в систему Вход в систему

Медленная работа ADAM5510

 Ответить Ответить
Автор
Сообщение
Andrey_5510E Смотреть выпадающим
Новичок
Новичок
Аватар

Присоединился: 30 Июнь 2011
Online Status: Offline
Публикации: 5
Свойства публикации Свойства публикации   Ответить, цитируя автора - Andrey_5510E Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Тема сообщения: Медленная работа ADAM5510
    Опубликовано: 30 Июнь 2011 14:54
Пишу программу для адама которая крутится в жестком цикле 17 мс. Само наполнение программы выполняется чуть быстрее и далее в холостую цикл выравнивается до 17. Залил программу на 4 лабораторных адама и увидел что один из адамов никак не вписывался в 17 мс. Написал простую програму в которой адам тупо гоняется по пустым циклам много раз и снова замерил на всех адамах. В итоге получилось что проблемный работал в 2 раза медленнее. На всех стоят r8800. Но судя по маркировке 3ое из 4 адамов принадлежат одной партии, а проблемный другой.
Стыковался с Адвантехом, те перенаправили к китайцам, китайцы запросили прогу, я отослал. В итоге:
Время 1 цикла:
3 адама: 13.6 мс
1 адам : 25.3 мс
Китайские тесты: 21.7 мс

(При запущенной программе результаты печатаются на консоль и мигает светодиод.)

Китайцы  больше ничего не отвечали.
Это нормально что имеется такой разброс в производительности?

Вот программа замера времени:
#include "5510DRV.H"
#include <stdlib.H>
#include <stdio.H>
#include <conio.H>
#include <dos.H>

#ifdef __cplusplus
#define __CPPARGS ...
#else
#define __CPPARGS
#endif
#define T1_CA 0x0FF5A
#define T1_CB 0x0FF5C
#define T1_CON 0x0FF5E
#define T1_CNT 0x0FF58

unsigned int __gl_CurTick=0;
unsigned char was=0;

void interrupt time(__CPPARGS)
{

    __gl_CurTick++;

    outport(0xFF22,0x0012);
    was = inportb(0xFF2C);
    was&=0xFE;
   
    outportb(0xFF2C,was);
   
   
}

int main()
{
    LED_init();
 
    LED_OFF(PWR);
    LED_OFF(RUN);
   
    // (40 000 000 / 4) / 1 000 = 10 000 срабатываний в 1 сек или 10 сраб в 1 мс
    outport(T1_CA,1000);
    setvect(0xFF12,time);
    outport(T1_CON,0xE001);
   
   
    while(1)
    {
        LED_OFF(PWR);
       
        __gl_CurTick = 0;
        for(unsigned int i=0; i<0xFF; i++)
        for(unsigned int i=0; i<0xFF; i++);
       
        LED_ON(PWR);

        for( i=0; i<0xFF; i++)
        for(unsigned int i=0; i<0xFF; i++);
       
        unsigned int end = __gl_CurTick;
        printf("%d\n" ,end);
       
       
    }
   
    return 0;
}
Наверх
KozlovKS Смотреть выпадающим
Prosoft.ru
Prosoft.ru


Присоединился: 21 Июнь 2003
Online Status: Offline
Публикации: 432
Свойства публикации Свойства публикации   Ответить, цитируя автора - KozlovKS Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 30 Июнь 2011 15:29
Кварцы одинаковые на всех платах стоят?
У них там BIOS и системный диск на флешке в колодке стоит. Если снять с рабочего и поставить в проблемный что-нибудь изменится?
Наверх
Andrey_5510E Смотреть выпадающим
Новичок
Новичок
Аватар

Присоединился: 30 Июнь 2011
Online Status: Offline
Публикации: 5
Свойства публикации Свойства публикации   Ответить, цитируя автора - Andrey_5510E Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 30 Июнь 2011 15:51
Еще не знаю, но хорошая мысля приходит опосля. Не успел я поменять флешки. Отобрал у меня ADAMы другой отдел, но скоро вернутся, возможно в эту пятницу, то есть завтра, тогда и проверим. Хотя почему-то надежды на плохой BIOS мало.
Наверх
kuzulis Смотреть выпадающим
Участник
Участник


Присоединился: 04 Декабрь 2008
Категория: Russian Federation
Online Status: Offline
Публикации: 81
Свойства публикации Свойства публикации   Ответить, цитируя автора - kuzulis Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 30 Июнь 2011 16:41
2 Andrey_5510E

а с чего вы взяли, что у вас цикл будет ровно 17мс?

Многое зависит от флагов оптимизации и пр.
Тем более, вы как то странно перехватываете вектор и перегружаете таймер и обрабатываете прерывание.




Наверх
Andrey_5510E Смотреть выпадающим
Новичок
Новичок
Аватар

Присоединился: 30 Июнь 2011
Online Status: Offline
Публикации: 5
Свойства публикации Свойства публикации   Ответить, цитируя автора - Andrey_5510E Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 30 Июнь 2011 17:35
Первоначально опубликовано kuzulis


а с чего вы взяли, что у вас цикл будет ровно 17мс?

Цикл 17 мс не относится к написанной выше программе. Это в другой. Приведенная выше программа просто замеряет цикл пустой беготни в for.

Первоначально опубликовано kuzulis


Многое зависит от флагов оптимизации и пр.

Что за флаги оптимизации? Вы имеете ввиду компилятор? Если да, то это единственная программа просто скопированная на разные контроллеры.

Первоначально опубликовано kuzulis


Тем более, вы как то странно перехватываете вектор

Я его не перехватываю, а заменяю на свой.

Первоначально опубликовано kuzulis


и перегружаете таймер

что значит перегружаю?

Первоначально опубликовано kuzulis


и обрабатываете прерывание.


Да извините выложил не поглядев, там остался лишний мусор должно быть так
void interrupt timevect(__CPPARGS)
{
     __gl_CurTick++;
    outport(0xFF22,0x0012);
}
  Но согласен, смешно было пытаться записать чтото в read-only регистр обслуживания прерывания 0x2С  Big smile

Наверх
Andrey_5510E Смотреть выпадающим
Новичок
Новичок
Аватар

Присоединился: 30 Июнь 2011
Online Status: Offline
Публикации: 5
Свойства публикации Свойства публикации   Ответить, цитируя автора - Andrey_5510E Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 30 Июнь 2011 17:45
Первоначально опубликовано Andrey_5510E


Да извините выложил не поглядев, там остался лишний мусор должно быть так
void interrupt timevect(__CPPARGS)
{
     __gl_CurTick++;
    outport(0xFF22,0x0012);
}
  Но согласен, смешно было пытаться записать чтото в read-only регистр обслуживания прерывания 0x2С  Big smile



А нет, неправ, забыл что он read-only только в Slave режиме. Тогда все было верно должно быт так :
void interrupt timevect(__CPPARGS)
{
   
    __gl_CurTick++;

    outport(0xFF22,0x0012);
    was = inportb(0xFF2C);
    was&=0xFE;
    // регистор обслуживания
    outportb(0xFF2C,was);
   
}

Big smile я попутал и себя и народ!
Наверх
kuzulis Смотреть выпадающим
Участник
Участник


Присоединился: 04 Декабрь 2008
Категория: Russian Federation
Online Status: Offline
Публикации: 81
Свойства публикации Свойства публикации   Ответить, цитируя автора - kuzulis Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 01 Июль 2011 08:51
Не, я не про то.
Судя по коду перегрузки таймера 1 из библиотеки utilityX.lib (функция Timer_Init),
китайцы вообще по-другому перегружают таймер.
Правда они грузят на тики в 200Гц.

Вот листинг:
[code=asm]
_TEXT:0897                 public _Timer_Init
_TEXT:0897 _Timer_Init     proc near
_TEXT:0897                 push    bp
_TEXT:0898                 mov     bp, sp
_TEXT:089A                 push    si
_TEXT:089B ; #line 746
_TEXT:089B                 cmp     ds:word_10A7B, 1
_TEXT:08A0                 jnz     short loc_108A7
_TEXT:08A2 ; #line 747
_TEXT:08A2                 mov     ax, 1
_TEXT:08A5
_TEXT:08A5 loc_108A5:                              ; CODE XREF: _Timer_Init+71j
_TEXT:08A5                 jmp     short loc_1090A
_TEXT:08A7 ; ---------------------------------------------------------------------------
_TEXT:08A7 ; #line 751
_TEXT:08A7
_TEXT:08A7 loc_108A7:                              ; CODE XREF: _Timer_Init+9j
_TEXT:08A7                 push    12h
_TEXT:08A9                 call    _getvect
_TEXT:08AC                 pop     cx
_TEXT:08AD                 mov     word_10EDC, dx
_TEXT:08B1                 mov     _oldT1_vector, ax
_TEXT:08B4 ; #line 753
_TEXT:08B4                 push    seg _TEXT
_TEXT:08B7                 push    offset _timer_irq_handle
_TEXT:08BA                 call    _timerSetTimer1Vect
_TEXT:08BD                 add     sp, 4
_TEXT:08C0 ; #line 754
_TEXT:08C0                 mov     dx, 0FF5Eh
_TEXT:08C3                 mov     ax, 6003h
_TEXT:08C6                 out     dx, ax
_TEXT:08C7 ; #line 755
_TEXT:08C7                 mov     dx, 0FF5Ah
_TEXT:08CA                 mov     ax, 0C350h
_TEXT:08CD                 out     dx, ax
_TEXT:08CE ; #line 756
_TEXT:08CE                 mov     dx, 0FF5Ch
_TEXT:08D1                 mov     ax, 0C350h
_TEXT:08D4                 out     dx, ax
_TEXT:08D5 ; #line 757
_TEXT:08D5                 mov     dx, 0FF58h
_TEXT:08D8                 xor     ax, ax
_TEXT:08DA                 out     dx, ax
_TEXT:08DB ; #line 758
_TEXT:08DB                 mov     dx, 0FF2Ch
_TEXT:08DE                 in      ax, dx
_TEXT:08DF                 mov     si, ax
_TEXT:08E1 ; #line 759
_TEXT:08E1                 mov     ax, si
_TEXT:08E3                 and     ax, 7FEh
_TEXT:08E6                 mov     dx, 0FF2Ch
_TEXT:08E9                 out     dx, ax
_TEXT:08EA ; #line 761
_TEXT:08EA                 mov     dx, 0FF28h
_TEXT:08ED                 in      ax, dx
_TEXT:08EE                 mov     si, ax
_TEXT:08F0 ; #line 762
_TEXT:08F0                 mov     ax, si
_TEXT:08F2                 and     ax, 7FEh
_TEXT:08F5                 mov     dx, 0FF28h
_TEXT:08F8                 out     dx, ax
_TEXT:08F9 ; #line 764
_TEXT:08F9                 mov     dx, 0FF5Eh
_TEXT:08FC                 mov     ax, 0E003h
_TEXT:08FF                 out     dx, ax
_TEXT:0900 ; #line 766
_TEXT:0900                 mov     ds:word_10A7B, 1
_TEXT:0906 ; #line 768
_TEXT:0906                 xor     ax, ax
_TEXT:0908                 jmp     short loc_108A5
_TEXT:090A ; ---------------------------------------------------------------------------
_TEXT:090A ; #line 769
_TEXT:090A
_TEXT:090A loc_1090A:                              ; CODE XREF: _Timer_Init:loc_108A5j
_TEXT:090A                 pop     si
_TEXT:090B                 pop     bp
_TEXT:090C                 retn
_TEXT:090C _Timer_Init     endp
[/code]

И код обработчика:
[code=asm]
....
....
_TEXT:0886 ; #line 724
_TEXT:0886                 mov     dx, 0FF22h
_TEXT:0889                 mov     ax, 8
_TEXT:088C                 out     dx, ax
....
....
[/code]

Найдите отличия в вашем коде и их ;)

Только непонятно, зачем они у таймера 1 делают режим двойного счета для регистров A и В и загружают их числом 0C350h (50000), если можно было загрузить один регистр А этим числом и настроить таймер в режим одинарного счета (т.е. как у Вас).



Наверх
Andrey_5510E Смотреть выпадающим
Новичок
Новичок
Аватар

Присоединился: 30 Июнь 2011
Online Status: Offline
Публикации: 5
Свойства публикации Свойства публикации   Ответить, цитируя автора - Andrey_5510E Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 01 Июль 2011 10:05
Мне показалось проще и надежнее использовать свое где возможно, чем полагаться на разработчиков, тем более китайцев. Да и их таймер более грубый.
Наверх
 Ответить Ответить

Переход на форум Права доступа на форуме Смотреть выпадающим

Bulletin Board Software by Web Wiz Forums® version 9.64
Powered by Web Wiz Forums Free Express Edition
Copyright ©2001-2009 Web Wiz