Цифровые сигнальные процессоры Вопросы, связанные с применением цифровых сигнальных процессоров: программирование, отладочные средства, алгоритмы... |
12.11.2010, 17:50
|
|
Прохожий
Регистрация: 12.11.2010
Сообщений: 7
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Прерывания по таймеру ADSP 21065l
Здравствуйте форумчане!
Есть проблема: нужно, чтобы ADSP 21065l работал только по прерыванию по таймеру - то есть раз например 200 в секунду выполнял один и тот же алгоритм. Идеально бы это все на С, С++. Опыта работы у меня мало. Сам не могу разобраться
|
|
|
|
13.11.2010, 01:27
|
|
Почётный гражданин KAZUS.RU
Регистрация: 30.10.2006
Сообщений: 1,755
Сказал спасибо: 0
Сказали Спасибо 80 раз(а) в 56 сообщении(ях)
|
Re: Прерывания по таймеру ADSP 21065l
Большинство прерываний в ЦСП являются маскируемыми. Таким образом, Вы можете запретить обрабатывать процессору все прерывания, кроме необходимого Вам прерывания по таймеру.
С уважением, Алексей.
|
|
|
Сказали "Спасибо" ALEX__A
|
|
|
13.11.2010, 12:34
|
|
Прохожий
Регистрация: 12.11.2010
Сообщений: 7
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Прерывания по таймеру ADSP 21065l
Спасибо Алексей!
Я более-менее понимаю сам процесс. Незнаю просто как реализовать для моего процессора. Работаю я в Visual DSP. Может кто сталкивался и имеет фрагмент кода
|
|
|
|
15.11.2010, 17:42
|
|
Вид на жительство
Регистрация: 07.01.2007
Адрес: Ленинградская обл
Сообщений: 428
Сказал спасибо: 147
Сказали Спасибо 71 раз(а) в 56 сообщении(ях)
|
Re: Прерывания по таймеру ADSP 21065l
имею печальный опыт работы с этими процессорами. Таймер прерывает некорректно и невовремя.
Вышли из ситуации разделением программы на ветви, время исполнения которых одинаковое. Исходя из времени исполнения команд. Опрос.
Естественно, не на C
|
|
|
|
22.11.2010, 16:26
|
|
Прохожий
Регистрация: 27.01.2006
Сообщений: 7
Сказал спасибо: 2
Сказали Спасибо 4 раз(а) в 3 сообщении(ях)
|
Re: Прерывания по таймеру ADSP 21065l
По VisualDSP.
Ищите стандартный пример в папке, соответствующей Вашему процессору. Я для своего нашел:
"c:\Program Files\Analog Devices\VisualDSP 5.0\Blackfin\Examples\ADSP-BF537 EZ-Kit Lite\Services\Timers\TimerWithCallback"
Для вашего процессора работа с таймерами ничем отличаться не будет
Фрагмент кода из примера:
Код:
|
static void Callback(void *AppHandle,u32 Event,void *pArg)
{
switch ( (u32)pArg ) {
case ADI_TMR_GP_TIMER_0:
ezToggleLED(EZ_FIRST_LED);
break;
case ADI_TMR_GP_TIMER_1:
ezToggleLED(EZ_FIRST_LED+1);
break;
default:
ezToggleLED(EZ_FIRST_LED+2);
break;
}
// return
}
/************************************************** **************************
Function: Init_Timers
Set up timers for PWM mode and enale them.
************************************************** ****************************/
void InitTimers(void)
{
//Setting up command table for Timer 0
ADI_TMR_GP_CMD_VALUE_PAIR Timer0ConfigurationTable [] = {
{ ADI_TMR_GP_CMD_SET_TIMER_MODE, (void *)0x01 },
{ ADI_TMR_GP_CMD_SET_COUNT_METHOD, (void *)TRUE },
{ ADI_TMR_GP_CMD_SET_INTERRUPT_ENABLE, (void *)TRUE },
{ ADI_TMR_GP_CMD_SET_OUTPUT_PAD_DISABLE, (void *)TRUE },
{ ADI_TMR_GP_CMD_SET_PERIOD, (void *)0x08000000 },
{ ADI_TMR_GP_CMD_SET_WIDTH, (void *)0x00400000 },
{ ADI_TMR_GP_CMD_END, NULL },
};
//Setting up command table for Timer 1
ADI_TMR_GP_CMD_VALUE_PAIR Timer1ConfigurationTable [] = {
{ ADI_TMR_GP_CMD_SET_TIMER_MODE, (void *)0x01 },
{ ADI_TMR_GP_CMD_SET_COUNT_METHOD, (void *)TRUE },
{ ADI_TMR_GP_CMD_SET_INTERRUPT_ENABLE, (void *)TRUE },
{ ADI_TMR_GP_CMD_SET_OUTPUT_PAD_DISABLE, (void *)TRUE },
{ ADI_TMR_GP_CMD_SET_PERIOD, (void *)0x04000000 },
{ ADI_TMR_GP_CMD_SET_WIDTH, (void *)0x00400000 },
{ ADI_TMR_GP_CMD_END, NULL },
};
//Setting up command table for Timer 2
ADI_TMR_GP_CMD_VALUE_PAIR Timer2ConfigurationTable [] = {
{ ADI_TMR_GP_CMD_SET_TIMER_MODE, (void *)0x01 },
{ ADI_TMR_GP_CMD_SET_COUNT_METHOD, (void *)TRUE },
{ ADI_TMR_GP_CMD_SET_INTERRUPT_ENABLE, (void *)TRUE },
{ ADI_TMR_GP_CMD_SET_OUTPUT_PAD_DISABLE, (void *)TRUE },
{ ADI_TMR_GP_CMD_SET_PERIOD, (void *)0x02000000 },
{ ADI_TMR_GP_CMD_SET_WIDTH, (void *)0x00400000 },
{ ADI_TMR_GP_CMD_END, NULL },
};
//Open Timer 0 for access
adi_tmr_Open(ADI_TMR_GP_TIMER_0);
//Program timer 0 with Timer 0 table
adi_tmr_GPControl(ADI_TMR_GP_TIMER_0, ADI_TMR_GP_CMD_TABLE, Timer0ConfigurationTable);
//Open Timer 1 for access
adi_tmr_Open(ADI_TMR_GP_TIMER_1);
//Program timer 1 with Timer 1 table
adi_tmr_GPControl(ADI_TMR_GP_TIMER_1, ADI_TMR_GP_CMD_TABLE, Timer1ConfigurationTable);
//Open Timer 2 for access
adi_tmr_Open(ADI_TMR_GP_TIMER_2);
//Program timer 2 with Timer 2 table
adi_tmr_GPControl(ADI_TMR_GP_TIMER_2, ADI_TMR_GP_CMD_TABLE, Timer2ConfigurationTable);
//enable callbacks for timer 0
adi_tmr_InstallCallback(ADI_TMR_GP_TIMER_0,TRUE,(v oid *)ADI_TMR_GP_CMD_START,NULL,Callback);
//enable callbacks for timer 1
adi_tmr_InstallCallback(ADI_TMR_GP_TIMER_1,TRUE,(v oid *)ADI_TMR_GP_CMD_START,NULL,Callback);
//enable callbacks for timer 2
adi_tmr_InstallCallback(ADI_TMR_GP_TIMER_2,TRUE,(v oid *)ADI_TMR_GP_CMD_START,NULL,Callback);
//enable timer 0, timer 1 and timer 2
adi_tmr_GPGroupEnable(ADI_TMR_GP_TIMER_0 | ADI_TMR_GP_TIMER_1 | ADI_TMR_GP_TIMER_2,TRUE);
}
/************************************************** *******************
*
* Function: main
*
************************************************** *******************/
void main(void) {
u32 ResponseCount;
u32 i; //loop variable
// initialize the EZ-Kit
ezInit(1);
// initialize interrupt manager
ezErrorCheck(adi_int_Init(IntMgrData, sizeof(IntMgrData), &ResponseCount, NULL));
//Initialize the flag service, memory is not passed because callbacks are not being used
ezErrorCheck(adi_flag_Init(NULL, 0, &ResponseCount, NULL));
for (i = EZ_FIRST_LED; i ‹ EZ_NUM_LEDS; i++){
ezInitLED(i);
}
// initialize the Timer manager
ezErrorCheck(adi_tmr_Init(NULL));
//Run forever
//Initialize all of the timers
InitTimers();
while (1) {
}
// return
} |
Пояснения:
Callback - эта функция вызывается, когда срабатывает прерывание таймера. В ней вы делаете, что необходимо. Внимание: здесь заведены 2 таймера, и для обоих используеться 1 функция, в которой разбирается, какой таймер сработал. В данном случае функция моргает по таймерам светодиодами на демоплате.
InitTimers - здесь устанавливаются параметры таймеров и происходит их запуск.
Main - инициализируются прерывания, внешние порты и затем таймера. После чего она входит в вечный бездельный цикл и дальше прерывается только таймерами с вызовом Callback
Последний раз редактировалось E-Male; 22.11.2010 в 16:34.
|
|
|
|
23.11.2010, 11:45
|
|
Прохожий
Регистрация: 12.11.2010
Сообщений: 7
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Прерывания по таймеру ADSP 21065l
Спасибо E-Male, буду пробовать
|
|
|
|
26.11.2010, 11:34
|
|
Прохожий
Регистрация: 12.11.2010
Сообщений: 7
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Прерывания по таймеру ADSP 21065l
Проблема еще в том, что про у меня большое количество математических операций. Результат я вывожу через параллельный порт - потом ЦАП. Когда процессор максимально загружен - в выходном сигнале появляются провалы. То есть одна точка - результат, вторая ноль, третья - результат, четвертая - ноль и т. д. Частота такого "ШИМа" 1 кГц. При уменьшении количества операций - сигнал нормальный. Кто-нибудь сталкивался?
|
|
|
|
23.03.2011, 00:49
|
|
Прохожий
Регистрация: 30.11.2010
Сообщений: 2
Сказал спасибо: 24
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Прерывания по таймеру ADSP 21065l
У этих процессоров - два прерывания от таймера - высокого и низкого приоритета. Задействуйте прерывание высокого приоритета...
А, впрочем, это не поможет. Если других прерываний нет - то и низкого приоритета должно срабатывать железно. Скорее всего Ваш обработчик прерывания чего-то нетак делает.....
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Прерывания PIC
|
milssky |
Микроконтроллеры, АЦП, память и т.д |
12 |
10.10.2010 13:31 |
Как изменить адрес подпрограммы обработки прерывания?
|
Godzilla82 |
Микроконтроллеры, АЦП, память и т.д |
21 |
23.08.2010 09:52 |
Прерывания в прерываниях ATmega8
|
7Fantomas7 |
Микроконтроллеры, АЦП, память и т.д |
35 |
07.07.2010 10:12 |
Вложенные прерывания HITECH PIC16
|
picavr |
Микроконтроллеры, АЦП, память и т.д |
17 |
07.03.2010 17:39 |
Вход в прерывания для PIC микроконтроллеров
|
dimmich |
Микроконтроллеры, АЦП, память и т.д |
4 |
06.12.2009 17:17 |
Часовой пояс GMT +4, время: 16:33.
|
|