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

 
 
 
Reply to this topicStart new topic
> провтыки внеш. прерыв STR711FR2, подскажите что делать?
maxcy
сообщение Aug 19 2010, 10:11
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 100
Регистрация: 9-04-07
Из: киев
Пользователь №: 26 895



Есть некое устройство построенное на STR711FR2, в процессе его кодинга было установлено что проц иногда теряет внешние прерывания. Используются прерывания с портов P0.2 и P0.1 оба по переднему фронту (хотя это не важно). Для доказательства этого сделали маленький проект.

настройка

int main(void)
{
XTI_Init();
XTI_LineModeConfig(XTI_Line9 | XTI_Line10, XTI_FallingEdge);
XTI_LineConfig(XTI_Line9, ENABLE);
XTI_LineConfig(XTI_Line10, ENABLE);
XTI_ModeConfig(XTI_Interrupt, ENABLE);
EIC_IRQChannelPriorityConfig(XTI_IRQChannel,1);
EIC_IRQChannelConfig(XTI_IRQChannel,ENABLE);

GPIO_Config(GPIO0,1,GPIO_OUT_PP);
GPIO_Config(GPIO0,(1<<1),GPIO_IN_TRI_CMOS);
GPIO_Config(GPIO0,(1<<2),GPIO_IN_TRI_CMOS);
GPIO_Config(GPIO1,(1<<5),GPIO_OUT_PP);
GPIO_Config(GPIO1,(1<<6),GPIO_OUT_PP);
GPIO_BitWrite(GPIO1,5,0); //--тест
GPIO_BitWrite(GPIO1,6,0); //--тест

EIC_IRQConfig(ENABLE);

while(1); /* infinite loop */
}

обработчик встроен в 71x_it.c в виде

void XTI_IRQHandler(void)
{
/* Change the first led of the GPIO0 port pins state */
u16 INT_X=0;
INT_X=XTI_InterruptLineValue();
if (INT_X & XTI_Line10)
{
GPIO_BitWrite(GPIO1,5,1);
GPIO_BitWrite(GPIO1,5,0);
}
if (INT_X & XTI_Line9)
{
GPIO_BitWrite(GPIO1,6,1);
GPIO_BitWrite(GPIO0,0,!GPIO_BitRead(GPIO0,0));
GPIO_BitWrite(GPIO1,6,0);
}
/* Clear the pending bits */
XTI_PendingBitClear(INT_X);
}
Юзаю uVision4

так вот было подмечено что когда фронты импульсов прерываний на расстоянии более 14 мкс друг от друга то всё нормально на осциллограммах мы видим оба захода (импульсы на портах), когда они входят в зону менее 14 мкс встречаются пропуски. потом когда они равняются друг к другу всё опять работает исправно.

Кто такое наблюдал, просьба рассказать как побороли, но не как обошли. Это просто очень важный момент в нашей системе.
Go to the top of the page
 
+Quote Post
maxcy
сообщение Aug 19 2010, 11:19
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 100
Регистрация: 9-04-07
Из: киев
Пользователь №: 26 895



хоть скажите сталкивался кто-то с такими аномалиями?
Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 19 2010, 12:00
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Я работал с STR710. Помню, что там контроллер прерываний какой-то кривой. Не в том смысле, что не работает, а в том, что разбирался с ним долго. Ещё была проблема с прерываниями от флэш (end-of-write interrupt). Как будто они не сделали защёлку на этот сигнал, а просто завели импульс на вход контроллера прерываний, в результате чего прерывания "терялись", если они были маскированы на входе в контроллер прерываний. Проблему с прерыванием от флэш они подтвердили. А вот объяснения описанному сбою пока не вижу.
Предлагаю просто на всякий случай совершить небольшой танец с бубном:
Код
void XTI_IRQHandler(void)
{
    /* Change the first led of the GPIO0 port pins state */
    u16 INT_X;
    INT_X=XTI_InterruptLineValue();
    while (INT_X != 0)
    {
        /* Clear the pending bits */
        XTI_PendingBitClear(INT_X);
        if (INT_X & XTI_Line10)
        {
            GPIO_BitWrite(GPIO1,5,1);
            GPIO_BitWrite(GPIO1,5,0);
        }
        if (INT_X & XTI_Line9)
        {
            GPIO_BitWrite(GPIO1,6,1);
            GPIO_BitWrite(GPIO0,0,!GPIO_BitRead(GPIO0,0));
            GPIO_BitWrite(GPIO1,6,0);
        }
        INT_X=XTI_InterruptLineValue();
    }
}
Go to the top of the page
 
+Quote Post
maxcy
сообщение Aug 19 2010, 16:27
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 100
Регистрация: 9-04-07
Из: киев
Пользователь №: 26 895



Такое делал, не помогает, более того функцию чтения пиндинг бита производитель рекомендует вызывать один раз за прерывание.
Ещё попробовал концовку так
EIC_IRQConfig(DISABLE);
INT_X=XTI_InterruptLineValue();
EIC_IRQConfig(ENABLE);
тоже нет результата.
Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 19 2010, 19:42
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Может быть, импульсы слишком короткие? Наверняка есть требование на минимальную длительность импульса по отношению к тактовой частоте. Только не знаю, где оно написано.
Go to the top of the page
 
+Quote Post
maxcy
сообщение Aug 26 2010, 07:24
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 100
Регистрация: 9-04-07
Из: киев
Пользователь №: 26 895



импульсы нормальные.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 24th July 2025 - 00:28
Рейтинг@Mail.ru


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