реклама на сайте
подробности

 
 
> как связать прерывание написанное на .asm с основным кодом на с
Stanislav
сообщение Jan 22 2008, 22:57
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 4 363
Регистрация: 13-05-05
Из: Москва
Пользователь №: 4 987



Цитата(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циклов)
smile.gif
Тайный смысл чёрточек и крестиков постигнуть, однакож, не удалось... sad.gif
Хорошо, теперь дайте соответствие выводов 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.

smile.gif


--------------------
Самонадеянность слепа. Сомнения - спутник разума. (с)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aduduka
сообщение Aug 3 2010, 08:30
Сообщение #2





Группа: Новичок
Сообщений: 6
Регистрация: 3-07-09
Пользователь №: 50 882



Цитата(Stanislav @ Jan 23 2008, 02:57) *
Код
/********************************************************************************
***********
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:
Вызывается как обычная сишная функция с тремя входными параметрами и одним выходным, передавая их наиболее простым и быстрым способом - через регистры, не используя стек.
Обработчики прерываний писать на асме ещё проще.



Здравствуйте. Подскажите пожалуйста, как связать прерывание написанное на .asm с основным кодом на с. Не пойму, какие параметры у функции должны быть? Прототип FIR_fract(fract16*, fract16*, u32), а как и куда они передаются в _FIR_fract: ?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 4 2010, 07:07
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (aduduka @ Aug 3 2010, 11:30) *
Не пойму, какие параметры у функции должны быть?

Читайте соглашение компилятора о передаче параметров. Соответствующий раздел имеет место быть в документации на любой компилятор.
QUOTE (aduduka @ Aug 4 2010, 09:04) *
Спасибо, просто пример, который приведен в цитате был взят из той темы.

Admin:
Это не причина мусорить где попало и в последствии флеймить по поводу того, что кто-то взял на себя труд за Вами убирать.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 2nd August 2025 - 05:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01301 секунд с 7
ELECTRONIX ©2004-2016