|
|
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В)
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,495
|
Re: Управляющая программа для ADPS-2185(Plata L-783)
1. По поводу Вашего текущего кода ...
Чем вызвано столь необычный метод деления на 64? Не проще ли было написАть так:
SR = ASHIFT MR1 BY -6 (LO);
DM(I3, M3) = SR0;
2. По поводу примитивов деления ...
В книге приведён полностью рабочий код. Если что не так - ищите ошибки у себя.
|
|
|
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;
|
|
|
Re: Управляющая программа для ADPS-2185(Plata L-783)
Извините уточню...
AR = TSTBIT 15 OF AR;
IF NE JUMP negative;
JUMP positive;
Здесья проверяю меньше ли число 0 или нет, елси меньше, то перехожу на метку negative:
если больше нуля, то метка positive:
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,495
|
Re: Управляющая программа для ADPS-2185(Plata L-783)
Вы не заметили, что я использую инструкцию арифметического сдвига (ASHIFT), а Вы логического сдвига (LSHIFT).
|
|
|
Re: Управляющая программа для ADPS-2185(Plata L-783)
Да, не заметил, спасибо за помощь, так гораздо лучше
|
|
|
Re: Управляющая программа для ADPS-2185(Plata L-783)
Доброе утро!
возникла такая проблема, необходимо создать скользящий фильт, усредняющий по 4-м значениям.
Я обрабатываю данные непосредственно из регистра MR1, куда из области ввода//вывода приодят данные с АЦП.
Пишу код в файле ADC.H
под меткой
|
|
|
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();
приложение завистает, ненадолго, и данные с АЦП не приходят, можете сказать в чем проблема???
заранее спасибо!
|
|
|
Re: Управляющая программа для ADPS-2185(Plata L-783)
Конечно удобнее использовать циклические буферы DM(I,M), но какой буфер в вашей программе не используется, что бы потом эти данные были в нём сохранены, и не изменялись без моего ведома?
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,495
|
Re: Управляющая программа для ADPS-2185(Plata L-783)
На какой частоте работает АЦП?
|
|
|
Re: Управляющая программа для ADPS-2185(Plata L-783)
|
|
|
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 раз написать любые команды, и всё пойдёт нормально....
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,495
|
Re: Управляющая программа для ADPS-2185(Plata L-783)
Попробуйте подсчитать сколько инструкций содержит Ваш обработчик прерываний. Одна инструкция - один такт DSP, т.е. 25 нс. При частоте АЦП 1000 кГц, общее время нахождения в обработчике прерываний не должно превышать 1 мкс.
|
|
|
Re: Управляющая программа для ADPS-2185(Plata L-783)
извините, обработчик прерывания от АЦП?
мне стоит подсчитать сколько инструкций выполняется после метки "GetAdcDataLowFreq:"?
если да, то я могу после этой метки поставить много-много инструкций, и таких проблем не будет.
такая проблема возникает, именно когда много операций под меткой filter_5th:
может это какой-то брак процессора при производстве, и стоит реализовать свою задачу другим алгоритмом?
|
|
|
Re: Управляющая программа для ADPS-2185(Plata L-783)
Извините, вы правы, всё таки надо ограничиться количетсвом инструкций, попробую реализовать это дургим способом.
Скажите, буфер Dm(I4,M4) свободен, можно будет мне его использовать для хранения 4-х значений?
В программе используется только АЦП.
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,495
|
Re: Управляющая программа для ADPS-2185(Plata L-783)
Для меня не совсем понятна фраза "буфер Dm(I4,M4) свободен". Обычно под буфером понимается некий объём памяти данных DSP, который Вы выделяете под свои задачи. Причём здесь указатель I4?
|
|
|
Re: Управляющая программа для ADPS-2185(Plata L-783)
Извините, я предполагал, что это отдетльные циклические буфера, где в регистрах L,M,I - это характеристики этого буфера(Длина, шаг, и текущее положение маркера)
|
|
|
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(На сколько я понял, в него записываются данные из области ввода вывода...)?
|
|
- Сотрудник "Л Кард"
- Здесь с 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);
|
|
|
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;
В итоге не тот результат получается....
как можно оптимизировать?
Заранее спасибо
|
|
- Сотрудник "Л Кард"
- Здесь с 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).
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,495
|
Re: Управляющая программа для ADPS-2185(Plata L-783)
В догонку...
Со 2 августа я в отпуске. Появлюсь не раньше 22 августа.
|