Цитата(SALOME @ Jan 22 2008, 06:52)

Фрагмент настройки EBIU (извеняюсь - вертик черточки не совпали с цифрами)
Надо делать так:
Код
*pEBIU_AMBCTL0 = 0xF644F644; //управление АЦП-банк_0 (один цикл - 7,5нс)
// 1111 0110 0100 0100 - регистр управления АМС банков_0 и 1
// |||| |||! |||| |||| |||| |||! |||| |||+-B0RDYEN=1-разрешение сигнала ARDY банка_0 (in)
// |||| |||! |||| |||| |||| |||! |||| ||+--B0RDYPOL=1-полярность сигнала ARDY банка_0
// |||| |||! |||| |||| |||| |||! |||| ++---B0TT=01-время переключения банка_0(1цикл)
// |||| |||! |||| |||| |||| |||! ||++------B0ST=00-время установки банка_0 (до ARE)(4цикл)
// |||| |||! |||| |||| |||| |||! ++--------B0HT=01-время удержания банка_0 (после ARE) (1цикл)
// |||| |||! |||| |||| |||| ++++-----------B0RAT=0100-время доступа при чтении банка_0 (ARE) (6циклов)
// |||| |||! |||| |||| ++++----------------B0WAT=1010-время доступа при записи банка_0 (10циклов)
Тайный смысл чёрточек и крестиков постигнуть, однакож, не удалось...
Хорошо, теперь дайте соответствие выводов BF и платы, схему которой Вы привели. Интересуют только сигналы управления АЦП.
Цитата(SALOME @ Jan 22 2008, 06:52)

...Момент считывания находится во время действия ARE и находится явно дальше 5нс.
Другое дело, что на осцилограмме пина CS видно, что первый импульс считывания боле_мене привязан к DRDY от АЦП, хотя его дрожание определяется асинхронностью захвата DRDY. А вот интересный нам второй импульс считывания гуляет шибче. Я отношу это за счет команды SSYNC, время действия которой так и не удалось установить. Эмпирически она длится где-то 30 нс и меняет свю длительность. Может вы скажите, какова длительность SSYNC?
Минимум 10 тактов, если склероз не изменяет. Только нафиг она Вам нужна во всех местах, также уразуметь неполучаецца.
Вообще-то, гулять сильно не должно...
Теперь по существу программного фрагмента из Вашего поста №42.
Делать чтение АЦП таким ужасным способом нельзя - проц только этим и будет заниматься.
Для подобных целей существуют автоматический ввод через PPI с DMA, или, на худой конец, прерывания. Организуйте его по запросу от сигнала DRDY, при вызове считывайте данные с АЦП и курите бамбук всё остальное время.
Только учтите, что макросы EX_INTERRUPT_HANDLER будут сильно тормозить - там в стэке весь контекст сохраняется, а потом восстанавливается. Так что писать прерывание нужно на асме.
А прерывания запрещены во время считывания? Если нет, временно запретите.
Цитата(SALOME @ Jan 22 2008, 06:52)

...Полность с Вами согласная. У меня на ассемблере и лучше получается. Однако сделать ассемблерную вставку прооцедуры пока не умею. Была бы благодарно за простой рабочий пример.
Лехко:
Код
/********************************************************************************
***********
Description : This function performs FIR filter operation on given input.
Input: R0-current address of input circular buffer, R1-address of coeff. vector,
R2-number of taps*2.
Output: R0-next address of input circular buffer.
Prototype: fract16* FIR_fract(fract16*, fract16*, u32).
*/
#include "Tru_def.h"
#include <defBF534.h>
.extern _Host_MC_Out; //output array
.section program;
.global _FIR_fract;
.align 8;
//-----------------------------------------------------------------------------------
_FIR_fract:
L0=INPUT_LEN*2(Z); // L0 = length of input buffer in bytes
L1=R2; // L1 = length of coeff buffer in bytes
I0=R0; // set up input pointer
................................
БЛА-БЛА-БЛА
................................
L0=0; // Clear modulo registers
L1=0;
RTS;
_FIR_fract.end:
Вызывается как обычная сишная функция с тремя входными параметрами и одним выходным, передавая их наиболее простым и быстрым способом - через регистры, не используя стек.
Обработчики прерываний писать на асме ещё проще.
Вообще, читайте хэлп к вижуалдиэспи, там всё очень подробно прописано. Начните с глав:
C/C++ Compiler Language Extensions,
C/C++ Run-Time Model and Environment,
C/C++ and Assembly Interface.