Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года


Управляющая программа для ADPS-2185(Plata L-783)

Вы не вошли.

 Поиск | Регистрация | Вход 

OT
14.07.2010 11:02:30
#26

Гость

Re: Управляющая программа для ADPS-2185(Plata L-783)

"И что именно у Вас не получилось? Исходный код не откомпилировался?"
Откомпилировалось всё, но данные, которые зносятся в ФИФО буфер такого вида:
....
16363
16277
16232
16245
16311
21
106
151
138
72
16363
16277
16232
16245
16311
....
а входные данные(которые надо поделить)
....
526
244
-130
-455
-609
-526
-244
131
455
607
526
244
-130
-456
-608
-526
-244
131
455
607
...
На вход АЦП приходит синусоидальный сигнал с частотой 100кГЦ, и амплитудой (-1.5В +1.5В)

14.07.2010 12:20:24
#27

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,495

Re: Управляющая программа для ADPS-2185(Plata L-783)

1.  По поводу Вашего текущего кода ...
Чем вызвано столь необычный метод деления на 64? Не проще ли было написАть так:
SR = ASHIFT MR1 BY -6 (LO);
DM(I3, M3) = SR0;
2. По поводу примитивов деления ...
В книге приведён полностью рабочий код. Если что не так - ищите ошибки у себя.

OT
14.07.2010 12:45:14
#28

Гость

Re: Управляющая программа для ADPS-2185(Plata L-783)

"1. По поводу Вашего текущего кода ..."
Мы работаем и с знаковыми числами, с беззнаковыми я так же как и вы работаю:
positive:
AR = AX0;
SR = LSHIFT AR BY -6(LO);
AR = SR0;
а если мне попалась знаковое число, то такой код использую:
negative:
AR = AX0;
AR = CLRBIT 15 OF AR;
SR = LSHIFT AR BY -6(LO);
AR = SR0;
AR = SETBIT 15 OF AR;
AR = SETBIT 14 OF AR;
AR = SETBIT 13 OF AR;
AR = SETBIT 12 OF AR;
AR = SETBIT 11 OF AR;
AR = SETBIT 10 OF AR;
AR = SETBIT 9 OF AR;
JUMP registering;

OT
14.07.2010 12:48:43
#29

Гость

Re: Управляющая программа для ADPS-2185(Plata L-783)

Извините уточню...
AR = TSTBIT 15 OF AR;
IF NE JUMP negative;
JUMP positive;
Здесья  проверяю меньше ли число 0 или нет, елси меньше, то перехожу на метку negative:
если больше нуля, то метка positive:

14.07.2010 13:03:42
#30

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,495

Re: Управляющая программа для ADPS-2185(Plata L-783)

Вы не заметили, что я использую инструкцию арифметического сдвига (ASHIFT), а Вы логического сдвига (LSHIFT).

OT
15.07.2010 08:21:07
#31

Гость

Re: Управляющая программа для ADPS-2185(Plata L-783)

Да, не заметил, спасибо за помощь, так гораздо лучше

OT
27.07.2010 09:26:14
#32

Гость

Re: Управляющая программа для ADPS-2185(Plata L-783)

Доброе утро!
возникла такая проблема, необходимо создать скользящий фильт, усредняющий по 4-м значениям.
Я обрабатываю данные непосредственно из регистра MR1, куда из области ввода//вывода приодят данные с АЦП.
Пишу код в файле ADC.H
под меткой

OT
27.07.2010 09:33:14
#33

Гость

Re: Управляющая программа для ADPS-2185(Plata L-783)

Доброе утро!
возникла такая проблема, необходимо создать скользящий фильт, усредняющий по 4-м значениям.
Я обрабатываю данные непосредственно из регистра MR1, куда из области ввода//вывода приодят данные с АЦП.
Пишу код в файле ADC.H
под меткой "GetAdcDataLowFreq:"
сразу после
{ кладём скорректированный результат в буфер АЦП                        }
пишу:
filter:
    AX0 = DM(filter_count);
    AY0 = 1;
    AR = AX0 - AY0;
    IF LE JUMP filter_1st;
   
    AX0 = DM(filter_count);
    AY0 = 2;
    AR = AX0 - AY0;   
    IF LE JUMP filter_2nd;
   
    AX0 = DM(filter_count);
    AY0 = 3;
    AR = AX0 - AY0;   
    IF LE JUMP filter_3rd;

    AX0 = DM(filter_count);
    AY0 = 4;
    AR = AX0 - AY0;   
    IF LE JUMP filter_4th;
   
    AX0 = DM(filter_count);
    AY0 = 5;
    AR = AX0 - AY0;   
    IF LE JUMP filter_5th;
    JUMP registering;
   
filter_1st:
    DM(filter_1) = MR1;
    AX0 = DM(filter_count);
    AR = AX0 + 1;
    DM(filter_count) = AR;
    JUMP registering;
filter_2nd:
    DM(filter_2) = MR1;
    AX0 = DM(filter_count);
    AR = AX0 + 1;
    DM(filter_count) = AR;
    JUMP registering;
filter_3rd:
    DM(filter_3) = MR1;
    AX0 = DM(filter_count);
    AR = AX0 + 1;
    DM(filter_count) = AR;
    JUMP registering;
filter_4th:
    DM(filter_4) = MR1;
    AX0 = DM(filter_count);
    AR = AX0 + 1;
    DM(filter_count) = AR;
    JUMP registering;
filter_5th:
    AX0 = DM(filter_2);
    DM(filter_1) = AX0;
    AX0 = DM(filter_3);
    DM(filter_2) = AX0;
    AX0 = DM(filter_4);
    DM(filter_3) = AX0;
    DM(filter_4) = MR1;
    JUMP registering;


registering:

    DM(I3, M3) = MR1;


DM(filter_1),DM(filter_2),DM(filter_3),DM(filter_4) - это я выделил просто ячейки памяти, под приходящие значения.
DM(filter_count) - счетчик выясняющий, какую ячейку нам над заполнить, если он равен 1, то первую, и прибавляем +1 к этому счетчику, следующий отчет он будет равен 2, и сл-но во вторую ячейку занесет данные(filter_2)
и если счетчик будет больше или равно 5, то значит все данные смещаем влево, (из filter_2 в filter_1, filter_3 в filter_2, filter_4 в filter_3) а в filter_4 заносим новые данные из АЦП.
Так вот, при выполнениии функции startldevice();
приложение завистает, ненадолго, и данные с АЦП не приходят, можете сказать в чем проблема???
заранее спасибо!

OT
27.07.2010 10:14:50
#34

Гость

Re: Управляющая программа для ADPS-2185(Plata L-783)

Конечно удобнее использовать циклические буферы DM(I,M), но какой буфер в вашей программе не используется, что бы потом эти данные были в нём сохранены, и не изменялись без моего ведома?

27.07.2010 10:40:16
#35

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,495

Re: Управляющая программа для ADPS-2185(Plata L-783)

На какой частоте работает АЦП?

OT
27.07.2010 10:51:29
#36

Гость

Re: Управляющая программа для ADPS-2185(Plata L-783)

1000 Кгц

OT
27.07.2010 10:55:15
#37

Гость

Re: Управляющая программа для ADPS-2185(Plata L-783)

Под этой меткой всё отлично обрабатывается, и подсчет импульсов, и дллина импульсов итд... но вот именно этот скользящий фильтр, а конкретнее под меткой filter_5th:
AX0 = DM(filter_2);
DM(filter_1) = AX0;
AX0 = DM(filter_3);
DM(filter_2) = AX0;
AX0 = DM(filter_4);
DM(filter_3) = AX0;
DM(filter_4) = MR1;
JUMP registering;
если туда добавить несколько команд NOP;(или любых жругих), то возникает зависание, если не писать, то всё хорошо...исключительно под этой меткой....
под другими(например filter_3rd:) могу хоть 50 раз написать любые команды, и всё пойдёт нормально....

27.07.2010 11:09:19
#38

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,495

Re: Управляющая программа для ADPS-2185(Plata L-783)

Попробуйте подсчитать сколько инструкций содержит Ваш обработчик прерываний. Одна инструкция - один такт DSP, т.е. 25 нс. При частоте АЦП 1000 кГц, общее время нахождения в обработчике прерываний не должно превышать 1 мкс.

OT
27.07.2010 12:49:42
#39

Гость

Re: Управляющая программа для ADPS-2185(Plata L-783)

извините, обработчик прерывания от АЦП?
мне стоит подсчитать сколько инструкций выполняется после метки "GetAdcDataLowFreq:"?
если да, то я могу после этой метки поставить много-много инструкций, и таких проблем не будет.
такая проблема возникает, именно когда много операций под меткой filter_5th:
может это какой-то брак процессора при производстве, и стоит реализовать свою задачу другим алгоритмом?

OT
27.07.2010 12:54:25
#40

Гость

Re: Управляющая программа для ADPS-2185(Plata L-783)

Извините, вы правы, всё таки надо ограничиться количетсвом инструкций, попробую реализовать это дургим способом.
Скажите, буфер Dm(I4,M4) свободен, можно будет мне его использовать для хранения 4-х значений?
В программе используется только АЦП.

27.07.2010 13:18:19
#41

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,495

Re: Управляющая программа для ADPS-2185(Plata L-783)

Для меня не совсем понятна фраза "буфер Dm(I4,M4) свободен". Обычно под буфером понимается некий объём памяти данных DSP, который Вы выделяете под свои задачи. Причём здесь указатель I4?

OT
27.07.2010 14:03:32
#42

Гость

Re: Управляющая программа для ADPS-2185(Plata L-783)

Извините, я предполагал, что это отдетльные циклические буфера, где в регистрах L,M,I - это характеристики этого буфера(Длина, шаг, и текущее положение маркера)

OT
28.07.2010 10:28:27
#43

Гость

Re: Управляющая программа для ADPS-2185(Plata L-783)

Доброе утро! Возникла такая проблема: Процессор недостаточно быстрый, что бы выполнить все операции за 1 мкс. редактирую ваш файл ADC.H, под меткой
GetAdcDataLowFreq:
Можно ли убрать некторые команды, которые были вами ранее написаны?
GetAdcDataLowFreq:
{ перейдем на второй банк регистров                                                    }
    ENA SEC_REG;

{ установим очередной канал                                                            }
    IO(SET_ADC_CHANNEL) = SI;

{ чтение данных с АЦП                                                                    }
    AR = IO(READ_ADC);
{ корректировка смещения                                                                }
    AR = AR + AY1, AY1 = DM(I0, M1);
{ корректировка масштаба                                                                }
    MR = AR * MY1(SU), MY1 = DM(I0, M1);
{ округление полученного результата и подготовка следующего канала        }
    MR = MR(RND), SI = DM(I1, M1);

{ кладём скорректированный результат в буфер АЦП                                }   

.....
.....
.....
/*    MODIFY(I3, M3);*/
   
{    для обычного сбора (без покадровой синхронизации):                            }
{        - если нет межкадровой задержки     - RTI                                        }
{         - если есть межкадровая задержка - AF = AF - 0x1                        }
IrqELowFreqLab0:
    AF = AF - 0x1;
    IF NE RTI;

{ для межкадровой задержки надо прописать код I1 = ^ControlTable            }
{ а для покадровой синхронизации код JUMP EnableSynchroPulseLowFreq        }
IrqELowFreqLab1:
    I1 = DM(ControlTableAddr);
{ AF кол-во клоков межкадровой задержки, а также подготовим первый канал}
    AF = PASS AX1, SI = DM(I1, M1);
{ перезапишем первый канал                                                                }
    IO(SET_ADC_CHANNEL) = SI;   
{ указатель I7 на обработчик прерываний для межкадровой задержки            }
    I7 = DM(InterKadrDelayLowFreqAddr);

{ выходим из обработчика прерываний                                                    }
    RTI;

Какие можно убрать команды, учитывая, что в далнейшем придется считывать данные с нескольких каналов???
МОжно ли убрать команды:
    AR = AR + AY1, AY1 = DM(I0, M1);
    MR = AR * MY1(SU), MY1 = DM(I0, M1);
а в буфер АЦП заносить данные с регистра AR(На сколько я понял, в него записываются данные из области ввода вывода...)?

28.07.2010 15:27:42
#44

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,495

Re: Управляющая программа для ADPS-2185(Plata L-783)

1. Если Вам не нужна корректировка данных с АЦП, то вполне можно выбросить следующие строки:
{ корректировка смещения }
    AR = AR + AY1, AY1 = DM(I0, M1);
{ корректировка масштаба }
    MR = AR * MY1(SU), MY1 = DM(I0, M1);
{ округление полученного результата и подготовка следующего канала }
    MR = MR(RND), SI = DM(I1, M1);

OT
29.07.2010 08:45:09
#45

Гость

Re: Управляющая программа для ADPS-2185(Plata L-783)

Спасибо, это очень помогло!
Извините, ещё такой вопрос, возхможно ли как0нибудь оптимизировать данный код?
filter_5th:
    AX0 = DM(filter_2);
    DM(filter_1) = AX0;
    AY0 = DM(filter_3);
    DM(filter_2) = AY0;
    AR = AX0 + AY0;
    DM(filter_sred) = AR;
    AX0 = DM(filter_4);
    DM(filter_3) = AX0;
    DM(filter_4) = MR1;
    AY0 = MR1;
    AR = AX0 + AY0;
    AX0 = DM(filter_sred);
    AY0 = AR;
    AR = AX0 + AY0;
    DM(filter_sred) = AR;
    NOP;NOP;NOP;NOP;NOP;NOP;NOP;
    JUMP registering;
Я знаю, что у процессора есть возможность одновременного считывания информации, пытался выполнить такой распорядок команд:
.....
    AX0 = DM(filter_sred);
    AY0 = AR,AR = AX0 + AY0;
    DM(filter_sred) = AR;
.....
В итоге реззультат не тот. И наоборот делал
AR = AX0 + AY0,    AY0 = AR;
В итоге не тот результат получается....
как можно оптимизировать?
Заранее спасибо

30.07.2010 18:03:36
#46

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,495

Re: Управляющая программа для ADPS-2185(Plata L-783)

1. Первое что бросается в глаза - это убрать NOP.
2. Трудновато что-то конкретно советовать не зная полной картины алгоритма. А на счёт многофункциональных инструкций, то как в книжке написано - так и работает. Если что-то не получается - читать книжку до тех пор, пока не получится. В Вашем сообщении от 28.07.10 11:28 приводится пример использования многофункциональных инструкций типа
AR = AR + AY1, AY1 = DM(I0, M1).

30.07.2010 18:05:57
#47

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,495

Re: Управляющая программа для ADPS-2185(Plata L-783)

В догонку...
Со 2 августа я в отпуске. Появлюсь не раньше 22 августа.