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

 
 
> Проблема с прерыванием 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
Ответов (1 - 6)
zltigo
сообщение Feb 21 2010, 09:01
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Алекс1981 @ Feb 21 2010, 11:25) *
В общем в результате выполнения этого кода, прерывание срабатывает все таки по низкому уровню (по спаду) а не по фронту.

Для общего развития - у импульса ДВА фронта, а прерывания по уровню это из другой оперы и не путайте ни себя ни других поминая
о прерываниях по уровню в контексте прерываний по фронтам.
Контроллер при описанных у Вас EXTMODE=EXTPOLAR=1 запрограммирован на срабатывание по переднему фронту положительного импульса (rising), если Вас правильно понимаю, то это Вам и нужно. Посему проблема не в программировании контроллера прерывания, а в том, что нагородили в обработчиках прерываний, особенно всегда "радует" бездумное использование вложенности.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Feb 21 2010, 10:45
Сообщение #3


Гуру
******

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



Я лично фронтом называю передний фронт, а спад называю задний фронт, или просто спад. В русском языке эти слова или словосочетания совершенно однозначны.

А для вложенных прерываний лучше использовать атрибут __nested.

А как вы узнаете по какому фронту срабатывает прерывание? Ну, там осциллографом или как?
(Ну и про "нагородили" - для меня Си - совершенно чуждый язык - но так организовывать программу можно, если реальное быстродействие процессора раз в 500 больше требуемого. Причем 500 - это не метафора.).

Сообщение отредактировал DpInRock - Feb 21 2010, 10:57


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
Алекс1981
сообщение Feb 21 2010, 10:54
Сообщение #4


Участник
*

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



У меня на этой ноге подключен CLOCK камеры (осциллографом проверил - осцилляция есть) и мне нужно с переходя осциллятора с 0 на 1 по прерыванию считываб данные с камеры. Работал раньше с атмелами 8 разрядными и заведено было что переход сигнала с 0 на 1 это фронт, а с 1 на 0 это спад. В АРМах есть еще и отрицательные импульсы?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 21 2010, 11:02
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(DpInRock @ Feb 21 2010, 13:45) *
Я лично фронтом называю передний фронт, а спад называю задний фронт, или просто спад. В русском языке эти слова или словосочетания совершенно однозначны.

В русской терминологии, терминологии, а не языке, бардак sad.gif. То-же лично Ваше словосочетание "передний фронт" имеет имеет совершенно противоположные значения для "положительного" и "отрицательного" импульсов sad.gif.
Англичане тут правы - rising и falling кратки и однозначны.

Цитата(Алекс1981 @ Feb 21 2010, 13:54) *
В АРМах есть еще и отрицательные импульсы?

Они есть явление объективное и не зависящее от ARM/AVR smile.gif. Только учтите, что "отрицательный импульс" и "импульс отрицательной полярности" это разные вещи. Не путайте.

Повторяю второй раз - две строчки инициализирующие контроллер прерываний у Вас правильные. И багов в LPC23xx уже нет. Неверны Ваши выводы о причинах неработоспособности программы.
Цитата
У меня на этой ноге подключен CLOCK камеры

Ну и с какой частотой этого клока Вы мыслите обрабатывать прерывания в таком дивном обработчике IRQ (даже не FIQ) с memsеt-ами да printf-ами open-ами и прочей немыслимой лабудой.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Алекс1981
сообщение Feb 21 2010, 11:09
Сообщение #6


Участник
*

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



Код
IENABLE; /* handles nested interrupt */
......
IDISABLE;

Я только сейчас наверное понял что это разрешение/запрет вложенных прерываний. Согласен что бездумное использование этих тэгов. Просто в АппНоутах в примере обработчика внешнего прерывания сделано абсолютно также, причем никаких вложенных прерываний там не используется
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Feb 21 2010, 11:47
Сообщение #7


Гуру
******

Группа: Участник
Сообщений: 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 Текстовая версия Сейчас: 20th July 2025 - 09:27
Рейтинг@Mail.ru


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