Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ADSP-2181 EzKIT
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
InvisibleFed
Здравствуйте. В универе сел разбираться с EzKIT Lite на ADSP-2181. Установил VisualDSP 3.5. И вот тут стою собственно. smile.gif. Хочу написать простенькую программу на C: цифрует сигнал с кодека и пинает отсчеты в COM-порт. Есть несколько вопросов. Во-первых, перерыл весь хелп на VisualDSP, но не нашел никаких предопределений (#define) регистров (например для настройки последовательного порта для работы c COM) именно для ADSP-2181. Или это все самому? Во-вторых, как поумному настроить SPORT для работы "аля" COM? Я решил примерно так для режима 8бит данных, один стоповый, без паритета (итого 10 бит): пишу функцию, в которую передаю байт, а на выходе получаю два байта. В первом байте содержится стартовый бит и семь бит данных. А во втором - оставшийся бит данных, стоповый бит и остальные "1". Я новичек в цифровых процессорах Изучаю то что есть. Буду благодарен за любую помощь. И на чем стоит писать на этой железке - на C или сразу на асме? Обрадуют и примеры простых программ. Спасибо.
uriy
Вы хотите исползьзовть SPORT в качестве UART?
Тогда идите на сайт www.analog.com и ищите ЕЕ-60
Simulating an RS-232 UART using the Synchronous Serial Ports on the ADSP-21xx Family DSPs
Alhen
К сожелению у этого процессора очень скудная периферия, и для организации т.н. СОМ порта на основе SPORT именно для приема необходимо тратить код и время. А для передачи надо настроить соответсвующие регистры на нужный формат. У меня наработок по С нет, но есть проектик под Ассемблер. В нем передача данных происходит автоматически из циклического буфера. Может чем поможет.
bve
В VisualDSP есть примеры, в том числе и по работе с последовательными портами.
В них Вы сможете заметить некие #includ, которые подключают файл определений регистров, бит и т.д.
Sir Jon
Мой совет: не забивайте себе голову старьем типа 2181. Намучаетесь и с симуляцией UART и со стыковкой с перефирией и с макетками. Возьмите сразу лучше простенький Blackfin и вперед навстречу победам. wink.gif
InvisibleFed
Спасибо всем за помощь. Разбираюсь потихоньку. Взялся бы за более современное что-нить, да пока этого на руках нет... Надо будет подсуетиться...
InvisibleFed
Ух... Прочитал докуму про настройку порта... Чтоб он сгнил этот проц! Такой гемор моему поколению не нужен! =) Я пользуюсь сейчас Visual DSP 3.5. Более страшие версии поддерживают этот проц, и стоит ли их ставить?
bve
Цитата(InvisibleFed @ Nov 26 2007, 13:05) *
Ух... Прочитал докуму про настройку порта... Чтоб он сгнил этот проц! Такой гемор моему поколению не нужен! =) Я пользуюсь сейчас Visual DSP 3.5. Более страшие версии поддерживают этот проц, и стоит ли их ставить?

Более старшие его не держат....
InvisibleFed
Не могли бы подсказать еще по одному вопросу. Нигде не могу найти даже примера (может плохо ищу...) с подключение программных модулей к основному проекту. Скажем, есть у меня .MODULE на ассемблере. Как мне его интегрировать в основную программу, как подключить, и как осуществляется вызов нужных мне функций, обращение к данным модуля? Может у кого найдется проетик? Или совет?
uriy
Вот посмотрите может поможет. Не стоит рассчитывать что там все верно сделано, проект был написан когда я еще был студентом в железе ничего не проверялось.
InvisibleFed
Цитата
Вот посмотрите может поможет. Не стоит рассчитывать что там все верно сделано, проект был написан когда я еще был студентом в железе ничего не проверялось.


Правильно ли я понял что в версии 3.5 VisualDSP при обявлении модулей используется .section, а в старом VisualDSP - .MODULE?
uriy
Смотря что вы понимаете под модулем. Ключевое слово .section служит для размещения кода в определенном участке памяти. Память расшивается в файле *.ldf, вот кусок из моего примера
Код
MEMORY
{
    seg_inttab { TYPE(PM RAM) START(0x00000) END(0x0002f) WIDTH(24) }
    seg_code   { TYPE(PM RAM) START(0x00030) END(0x02fff) WIDTH(24) }
    seg_pmda   { TYPE(PM RAM) START(0x03000) END(0x03fff) WIDTH(24) }

    seg_data1  { TYPE(DM RAM) START(0x00000) END(0x00fff) WIDTH(16) }
    seg_data2  { TYPE(DM RAM) START(0x01000) END(0x01fff) WIDTH(16) }
//   seg_heap   { TYPE(DM RAM) START(0x02000) END(0x02fff) WIDTH(16) }
//   seg_stack  { TYPE(DM RAM) START(0x03000) END(0x03fdf) WIDTH(16) }
}

Ниже в этом же файле этим сегментам сопоставляются символьные имена: interrupts, program, data1, data2, pm_da.

Дальше в программе пишем .section/dm означает что следующий дальше код будет размещен в памяти данных в сегменте data1, в данном случае это переменные.
Код
.section/dm data1;
.var/circ Xn[1]={0x1234};    //Эти отсчеты должны быть отличны от нулЯ при старте
.var/circ Yn[1]={0x1234};    //
.var A=0x1D1B;                //коэффициент в формате 4.12 равен 1,81912dec
.var sigma=0x1333;            //коэффициент в формате 4.12 равен 1,2dec

Дальше начинается программа. Соответсвенно размещяем ее в памяти программ, в сегменте program
Код
.section/pm  program;

CosSinGenerate:
            ax1=dm(Xn);
            ay1=dm(Yn);
            mx0=dm(A);
            my0=ay1;

А для чего используется ключевое слово .MODULE честно говоря я даже не помню, в моем примере оно используется в файле sin.dsp. Да и не забудье что не следует использовать букву "я" в коментариях, если уж очень хочется русские коментарии, используйте букву "Я" (большую).
Может быть вам нужна русскоязычная литература по этому процессору? у меня вроде есть чем поделиться, могу поискать.
InvisibleFed
Про секции кода, данных я понял, пасибо. Интересовало именно нафиг нужно .MODULE. Пошарися в нете и нашел безответный пост на одном из форумов, в котором говорится, что мол .MODULE - это только для старых VisualDSP (до 3.5), а в новых все тупо распинывается по секциям.

Цитата
Да и не забудье что не следует использовать букву "я" в коментариях, если уж очень хочется русские коментарии, используйте букву "Я" (большую).


А это почему? =)

Цитата
Может быть вам нужна русскоязычная литература по этому процессору? у меня вроде есть чем поделиться, могу поискать.


У меня есть официальный перевод архитектуры на всю серию (многостраничный pdf) и перевод доки по ассемблеру (не полный, правда). Да и с английским проблем не много. Просто инфы кипа, толку от нее порой мало (потому как часто она тупо без примеров использования (это что касается кода), и без Ваших исходников и еще нескольких добрых людей с форума, разобраться не сразу получается даже в простом. Но если есть полезная инфа - прошу.
uriy
По-моему ASCII код буквы "я" совпадает с символом конца файла (0xFF), правда мне не удалось найти этот символ WinHex'ом. Такая проблема с этой буквой наблюдается только в ASCII файлах и актуальна для P-CAD, MATLAB, VisualDSP ну и наверно других примеров куча. А насчет документации наверно все то же самое что и у вас.
InvisibleFed
Цитата
Смотря что вы понимаете под модулем. Ключевое слово .section служит для размещения кода в определенном участке памяти. Память расшивается в файле *.ldf...


Это VisualDSP сам делает? А то я вот пишу вроде правильно, в модуле экспортируемые функции (метки) пишу с .global (ну не сами функции, а только их название - сами функции описаны ниже в этом же файле). Потом в файле main.asm (главном) пишу .extern имя_метки. Ну и вызываю в программе. В результате, на каждую экспортируемую функцию:

Код
[Warning ea1121] ".\218x UART\UartParity\21xxUart.dsp":404 UartRx:
-g assembly with global function without ending label.
Use 'UartRx.end' or 'UartRx.END' to mark
the ending boundary of the function for debugging information for
automated statistical profiling of assembly functions.


Как применять эти Имя_функции.END не знаю - попытался просто в конце написать - ошибка синтаксическая.
А в конце концов еще и error:

Код
[Error li1021]  The following symbols referenced in processor 'p0' could not be resolved:
        '_main' referenced from '218x_hdr.doj'


Если не пишу в главный файл .extern для всех используемых функций - варнингов нет, только тот же error. В main.asm подключаю #include "def2181.h".

Где собака зарыта? Могу выложить проектик, если есть возможность помочь.
uriy
Проверить ваш проект, нет большого желания т.к. щас использую VisualDSP 4.5 разные версии не совместимы, мне придется сносить эту, ставить версию ниже, а потом обратно. Может если вы определяете .global то .extern уже писать не надо. *.ldf файл по-моему тоже можно создать по умолчанию, наверно он даже есть в каталоге с установленным VisualDSP, там скорее всего будет только две секции - память данных и память программ. Думаю вас это устроит. Вы не пробовали компилить проект, который я вам дал, если компилится может с него начать писать свою программу.
TanT
Привет InvisibleFed! на счёт вызова функций: каждая вызываемая функция должна выглядеть примерно так

#define N 64

.section/pm bitrev;
.extern inputreal, inplacereal;
.global start_bitrev;

start_bitrev: <-начало
M0=0x0100; L0=0; I0=inplacereal; // для 64 М0=0х0100 // для 8 М0=0х0800
M4=1; L4=0; I4=inputreal;
CNTR=N;
ENA BIT_REV;
DO brev UNTIL CE;
AY1=DM(I4,M4);
brev: DM(I0,M0)=AY1;
DIS BIT_REV;
RTS;
start_bitrev.end: <-конец

visualDSP сначала тоже ругался что нет start_bitrev.end, потом просто дописал и всё прошло. проверь правильность объявления сегментов в памяти. или выложи кусок кода, может что и увижу smile.gif

Теперь мой вопрос. С visualDSP я совладал там прога работает, достал макетку ADSP 2181 сижу и думаю как перелить из visualDSP в железку мою прогу???
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.