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

 
 
 
Reply to this topicStart new topic
> Проблемы с прерываниями от SSC и PIT, не работают совместно прерывания
Евгений_222
сообщение Jun 22 2007, 08:13
Сообщение #1





Группа: Участник
Сообщений: 13
Регистрация: 11-10-06
Пользователь №: 21 202



Проблема такая , нужно отсылать\принимать данные по SSC через определенный интервал, для осчета интервалов использую интервальный таймер, инициализация следующая:
для SSC -

void SSC_Init (void) {

AT91PS_SSC pSSC = AT91C_BASE_SSC;

//* Configure PIO controllers to periph mode
AT91F_SSC_CfgPIO ();

// Enable the clock
AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1<<AT91C_ID_SSC);

// SSC Configure
AT91F_SSC_Configure(pSSC, MCK,SSC_BaudRate,SSC_clock_rx,SSC_mode_rx,SSC_clock_tx,SSC_mode_tx);

// Enable SSC

AT91F_SSC_EnableIt (pSSC,AT91C_SSC_RXRDY|AT91C_SSC_ENDTX);
//Set Usart IRQ Handler
AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,AT91C_ID_SSC,AT91C_AIC_PRIOR_HIGHEST,
AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL,SSC_IRQ_Handler);
//Interrupt Sources
//pSSC->SSC_PTCR = (AT91C_SSC_RXEN|AT91C_SSC_TXEN);

AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_SSC);
//pSSC->SSC_CR =AT91C_SSC_TXDIS;
}


для PIT-

void InitSysTimer(void)
{
AT91PS_PITC pPITC = AT91C_BASE_PITC;
unsigned int mask;

AT91F_PITC_CfgPMC ();
AT91F_PITInit (pPITC,2000,MCK/16);
AT91C_BASE_AIC->AIC_EOICR = 0x0;
AT91F_AIC_ConfigureIt (AT91C_BASE_AIC, //base adr
AT91C_ID_SYS, //int number
AT91C_AIC_PRIOR_HIGHEST, //priority
AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE, //int source type
ih_fromPIT //handler
);
AT91F_AIC_Trig (AT91C_BASE_AIC,AT91C_ID_SYS);
AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_SYS);
AT91F_PITEnableInt (pPITC);
mask = AT91F_PITGetPIVR (pPITC);
mask=mask;

}

по отдельности прерывания обрабатываются нормально, вместе либо от одного либо от другого смотря что первым настраивается.

Кучу времени уже убил, не могу разобраться.
Помогите плззз.

Да забыл использую AT91SAM7S64 компилятор IAR
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Jun 22 2007, 08:18
Сообщение #2


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



Трудно понять в чем проблема только по инциализации.
А приоритеты разные прерываниям ставить не пробовали?


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
Евгений_222
сообщение Jun 22 2007, 09:15
Сообщение #3





Группа: Участник
Сообщений: 13
Регистрация: 11-10-06
Пользователь №: 21 202



Похоже дело в обработчике прерывания на SSC, он срабатывает 2 раза и зацикливается, похоже не выходит из обработчика

void SSC_IRQ_Handler(void)
{
AT91PS_SSC pSSC=AT91C_BASE_SSC;
unsigned int status,mask;
mask = pSSC->SSC_IMR;
status=pSSC->SSC_SR;
if (status&AT91C_SSC_ENDTX) {

//--------------

}
if (status&AT91C_SSC_RXRDY) {
//-----------------------
}
}

Без прерывания данные передаются и принимаются нормально

Похоже дело в обработчике прерывания на SSC, он срабатывает 2 раза и зацикливается, похоже не выходит из обработчика

void SSC_IRQ_Handler(void)
{
AT91PS_SSC pSSC=AT91C_BASE_SSC;
unsigned int status,mask;
mask = pSSC->SSC_IMR;
status=pSSC->SSC_SR;
if (status&AT91C_SSC_ENDTX) {

//--------------

}
if (status&AT91C_SSC_RXRDY) {
//-----------------------
}
}

Без прерывания данные передаются и принимаются нормально
Go to the top of the page
 
+Quote Post
AlexBoy
сообщение Jun 22 2007, 12:09
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 205
Регистрация: 19-12-05
Из: Kiev
Пользователь №: 12 394



Цитата(Евгений_222 @ Jun 22 2007, 12:15) *
Похоже дело в обработчике прерывания на SSC, он срабатывает 2 раза и зацикливается, похоже не выходит из обработчика
...
Без прерывания данные передаются и принимаются нормально

А контроллеру прерываний говоришь что прерывание закончено?
*AT91C_AIC_EOICR = 0; // Признак завершения обработчика
это должно быть в конце каждого хандлера.
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Jun 25 2007, 07:42
Сообщение #5


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



Это как раз должно быть в общем хандлере в стартапе судя по всему.
А если общего обработчика нет, функции обработчиков должны быть описаны как прерывания.


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
Евгений_222
сообщение Jun 26 2007, 03:43
Сообщение #6





Группа: Участник
Сообщений: 13
Регистрация: 11-10-06
Пользователь №: 21 202



Как я понимаю функция
AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,AT91C_ID_SSC,8,
AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL,SSC_IRQ_Handler);
указывает handler для каждого прерывания.
Каждый обработчик прерывания у меня заканчивается записью
AT91C_BASE_AIC->AIC_EOICR =0;
(в одном забыл но сейчас исправил).
И все равно работать не хотят.
Виснет когда при инициализации SSC включаю функцию
AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_SSC);
без нее нормально только прерывания не срабатывают.
Go to the top of the page
 
+Quote Post
strannyi
сообщение Aug 1 2007, 07:03
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 8-07-07
Из: Ярославль
Пользователь №: 28 962



Аналогичная проблема.

Приходится по окончании обработчика прерывания сбрасывать SSC

Мож кто нить знает как решить проблему?
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Aug 1 2007, 21:10
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Цитата(Евгений_222 @ Jun 26 2007, 07:43) *
Каждый обработчик прерывания у меня заканчивается записью
AT91C_BASE_AIC->AIC_EOICR =0;


Как уже сказал SpiritDance все зависит от общего хандлера. Если у Вас и там и там запись в AT91C_BASE_AIC->AIC_EOICR, то могут быть проблемы.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 09:50
Рейтинг@Mail.ru


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