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

 
 
> Проблема с прерыванием EINT0 LPC2368, не могу прерывание по фронту реализовать
Алекс1981
сообщение Feb 21 2010, 08:25
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 33
Регистрация: 16-03-09
Из: Волгоградская обл
Пользователь №: 46 144



Здравствуйте, пытаюсь реализовать на плате SK-MLPC2368 внешнее прерывание EINT0 (нога 2.10 МК) по фронту (rising), пример взял из АппНоутов на этот чип - делаю по даташиту, никак не получается. В инете все примеры по спаду.
Привожу ниже пример кода. Инициализация прерывания:
Код
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: Инвертор на вход МК ставить не имеется возможности потому и пытаюсь решить проблему с прерыванием по фронту
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
DpInRock
сообщение Feb 21 2010, 11:47
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Не знаю что такое тэги, но в прерываниях, как уже верно заметили, использовать то, что вы используете - неправильно (это очень мягко).

Далее. Вы НЕ ЗНАЕТЕ по какому фронту происходит прерывание. Для этого вы должны в прерывании поставить некий маркер входа (ногу вздымать какую- нибудь. А по выходу опускать - кстати, заодно подивитесь на время исполнения прерывания). И вот эту ногу сравниваете с входом прерывания. Но нужен двухлучевой осциллограф.

Но в любом случае. Процессор не врет и настроен правильно. А то, что программа не работает как надо - то ТАК и ДОЛЖНО быть.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post



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

 


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


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