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

 
 
> Внешнее прерывание от ножек GPIO на LPC2478
M_Andrey
сообщение Nov 25 2009, 17:36
Сообщение #1


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

Группа: Свой
Сообщений: 158
Регистрация: 15-10-07
Из: Й-Ола
Пользователь №: 31 376



Пытаюсь запустить внешнее прерывание от ножек GPIO на LPC2478, точнее с P2[15]. Плата LPC2478STK от Olimex - там разведен разъем стандартной клавиатуры PS/2.
Вот кусок кода, но в прерывание он входить вообще не хочет. Клавиатура и ножки GPIO исправны - по опросу все работает без ошибок. Подскажите где у меня неправильно.
CODE
</P><P>void KeyboardCLK(void)
{
static unsigned char data; // Holds the received scan code

LED2SET = 1;
VICADDRESS = 0;
VICINTENCLEAR_bit.EINT3 = 1;

if (IOINTSTATUS_bit.P2INT)
{
if (IO2INTSTATF_bit.P2_15)
{
{
if ( (bitcount < 11) && (bitcount > 2) ) // Bit 3 to 10 is data. Parity bit,
{ // start and stop bits are ignored.
data = (data >> 1);
if (FIO2PIN_bit.P2_14) data = data | 0x80; // Store a '1'
}

if (--bitcount == 0)
{ // All bits received
decode(data);
bitcount = 11;
}
}
}
IO2INTCLR_bit.P2_15 = 1;
}

LED2CLR = 1;
}

void init_keyboard_ps2(void)
{
// 33222222 22221111 11111100 00000000
// 10987654 32109876 54321098 76543210
//FIOnDIR = BIN32(00000000,00000000,00000000,00000000);
FIO2DIR &= BIN32(11111111,11111111,00111111,11111111); //0 - input / 1 - output
FIO2MASK &= BIN32(11111111,11111111,00111111,11111111); //0 - read/write / 1 - no effect

PINSEL4 &= BIN32(00001111,11111111,11111111,11111111); //GPIO
PINMODE4 &= BIN32(00001111,11111111,11111111,11111111); //pull-up resistor enabled.

IO2INTENR &= BIN32(11111111,11111111,00111111,11111111);
IO2INTENF = ( IO2INTENF & BIN32(11111111,11111111,00111111,11111111) ) | BIN32(00000000,00000000,10000000,00000000);
IO2INTCLR_bit.P2_15 = 1;

PCLKSEL1_bit.PCLK_GPIO = 1;

VIC_SetVectoredIRQ(KeyboardCLK,0,VIC_EINT3);
VICINTENABLE |= 1UL << VIC_EINT3;

bitcount = 11;
}
Причина редактирования: Уменьшение видимого размера цитаты исходника.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 2)
M_Andrey
сообщение Nov 27 2009, 10:17
Сообщение #2


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

Группа: Свой
Сообщений: 158
Регистрация: 15-10-07
Из: Й-Ола
Пользователь №: 31 376



Сегодня случайно включил плату без JTAG-а и, о чудо, все заработало. Запустил под JTAG-ом - опять не работает - чудеса. Прерывание от таймера к примеру под JTAG-ом работает и отслеживается.

Сейчас правда вылезло другое (пока еще не успел поковырять) - прерывания идут непрерывно, а кто источник без JTAG-а сложно определить.

Код
корректировка
//VICINTENCLEAR_bit.EINT3 = 1;
 

Сообщение отредактировал M_Andrey - Nov 27 2009, 10:18
Go to the top of the page
 
+Quote Post
M_Andrey
сообщение Nov 27 2009, 15:52
Сообщение #3


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

Группа: Свой
Сообщений: 158
Регистрация: 15-10-07
Из: Й-Ола
Пользователь №: 31 376



Ну в общем тема закрыта, разобрался сам. Если кому интересно вот код:

CODE
void KeyboardCLK(void)
{
static unsigned char data;

LED2SET = 1;
VICADDRESS = 0;

if (IOINTSTATUS_bit.P2INT)
{
if (IO2INTSTATF_bit.P2_15)
{
{
if ( (bitcount < 11) && (bitcount > 2) )
{ // Bit 3 to 10 is data. Parity bit, start and stop bits are ignored.
data >>= 1;
if (FIO2PIN_bit.P2_14) data = data | 0x80;// Store a '1'
}
if (--bitcount == 0)// All bits received
{
decode(data);
bitcount = 11;
}
}
}
IO2INTCLR_bit.P2_15 = 1;
}
else
{
EXTINT = 0x08;
}
LED2CLR = 1;
}

void init_keyboard_ps2(void)
{
FIO2DIR &= BIN32(11111111,11111111,00111111,11111111); //0 - input / 1 - output
FIO2MASK &= BIN32(11111111,11111111,00111111,11111111); //0 - read/write / 1 - no effect

PINSEL4 &= BIN32(00001111,11111111,11111111,11111111); //GPIO
PINMODE4 &= BIN32(00001111,11111111,11111111,11111111); //pull-up resistor enabled.

IO2INTENR &= BIN32(11111111,11111111,00111111,11111111);
IO2INTENF = ( IO2INTENF & BIN32(11111111,11111111,00111111,11111111) ) | BIN32(00000000,00000000,10000000,00000000);

IO2INTCLR_bit.P2_15 = 1;

EXTINT = 0x08;
EXTMODE = 0;
INTWAKE_bit.GPIO2WAKE = 1;

PCLKSEL1_bit.PCLK_GPIO = 1; // set divider to /1

VIC_SetVectoredIRQ(KeyboardCLK,1,VIC_EINT3);

inpt = kb_buffer;// Initialize buffer
outpt = kb_buffer;
buffcnt = 0;
new_char = 0;
bitcount = 11;

VICINTENABLE_bit.EINT3 = 1;
}


Но вот поведение JTAG-а меня настораживает. Сейчас-то он работает нормально, но его неадекватное поведение привело к потере уймы времени. По крайней мере теперь если что буду его отключать.
Причина редактирования: Уменьшение видимого размера цитаты исходника.
Go to the top of the page
 
+Quote Post

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

 


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


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