Проблема с прерыванием EINT0
galex1981
Регистрация: 15.08.2009
Пол: Мужчина
Из: Волгоградская обл.
Здравствуйте, пытаюсь реализовать на плате SK-MLPC2368 внешнее прерывание EINT0 (нога 2.10 МК) по фронту (rising), пример взял из АппНоутов на этот чип - делаю по даташиту, никак не получается. В инете все примеры по спаду.
galex1981
Регистрация: 15.08.2009
Пол: Мужчина
Из: Волгоградская обл.
Неужели никто не работал с внешними прерываниями, а только в Линуксе?
Jury093
Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата Здравствуйте, пытаюсь реализовать на плате SK-MLPC2368 внешнее прерывание EXT0 (нога 2.10 МК) по фронту (rising), пример взял из АппНоутов на этот чип - делаю по даташиту, никак не получается. В инете все примеры по спаду.
Немного не в тему (неоднократно зарекался, но все же скажу).. :)
Ну кто так ставит вопрос? Почему бы не развернуть примерно так:
- вот код как я настраиваю внешнее прерывание
- вот обработчик кода
- вот лог загрузки в части работы с прерыванием
- вот чего я хочу
- вот тут оно валится или вот тут должна зажечься лампочка..
Не работает - пропишите все как аппноте, проверьте работоспособность кода, потом меняйте "под себя". Как мне кажется при активном сигнале прерывания Low разумно отрабатывать falling front, может инвертор спасет ситуацию?
На любой вопрос есть любой ответ.
galex1981
Регистрация: 15.08.2009
Пол: Мужчина
Из: Волгоградская обл.
Извиняюсь, но скорее всего действительно не так вопрос поставил. Привожу ниже пример кода. Инициализация прерывания:
Код
DWORD EINTInit( void )
{
PINSEL4 = 0x00100000; /* set P2.10 as EINT0 and
P2.0~7 GPIO output */
FIO2DIR = 0x000000FF; /* port 2, bit 0~7 only */
FIO2CLR = 0x000000FF; /* turn off LEDs */
IO2_INT_EN_R = 0x200; /* Port2.10 is rising edge. */
EXTMODE = 1; /* INT0 edge trigger */
EXTPOLAR = 1; /* INT0 is rising edge by default */
EXTINT = 0xf; /* clear all external interrupts */
if ( install_irq( EINT0_INT, (void *)EINT0_Handler, HIGHEST_PRIORITY ) == FALSE )
{
return (FALSE);
}
return( TRUE );
}
В обработчике прерывания я считываю данные с камеры TCMD8240
Код
//Get the cam data handler
void EINT0_Handler (void) __irq
{
BYTE res_data;
EXTINT = EINT0; /* clear interrupt */
IENABLE; /* handles nested interrupt */
eint0_counter++;
if ( (eint0_counter < MAX_FILE_SIZE)& isIrq ) /* less then max size of file */
{
/*we need to observe that VBLK and HBLK = 1*/
/*
0x08000000; P1.27=VBLK
0x10000000; P1.28=HBLK
//////////////////////////
0x00040000; P1.18=D0
0x00080000; P1.19=D1
0x00100000; P1.20=D2
0x00200000; P1.21=D3
0x00400000; P1.22=D4
0x00800000; P1.23=D5
0x01000000; P1.24=D6
0x02000000; P1.25=D7
*/
if(((FIO1PIN & 0x08000000)>>27)& ((FIO1PIN & 0x10000000)>>28))//reseive data
{
res_data = (BYTE)((FIO1PIN >>18) & 0xFF);
memset(Buff, res_data, 1);
res_1 = f_write(&file1, Buff, 1, &s2_1);
}
}
else if ( (eint0_counter >= MAX_FILE_SIZE)& isIrq ) /* we'll need close the file*/
{
put_rc(f_close(&file1));
isIrq = 0;
xputs("\nWritten OK!!!");
}
IDISABLE;
VICVectAddr = 0; /* Acknowledge Interrupt */
}
В общем в результате выполнения этого кода, прерывание срабатывает все таки по низкому уровню (по спаду) а не по фронту.
PS: Инвертор на вход МК ставить не имеется возможности потому и пытаюсь решить проблему с прерыванием по фронту