Обработчик прерывания IRQ, возникающего при нажатии на одну из 4 кнопок:


static void ButtonInterrupt()

{

static char catch = 0;


int dummy;

int status;

/* clear the interrupt flag */

dummy = AT91C_BASE_PIOA->PIO_ISR;

/* try to avoid compiler warning */

dummy = dummy;

#if 0

/**************** Switch on the led ****************/

{

*(int*)0xFFFFF430 = 0xF;

if (dummy & (1<<19))

{

*(int*)0xFFFFF434 = (1<<0);

} else if (dummy & (1<<20))

{

*(int*)0xFFFFF434 = (1<<1);

} else if (dummy & (1<<15))

{

*(int*)0xFFFFF434 = (1<<2);

} else if (dummy & (1<<14))

{

*(int*)0xFFFFF434 = (1<<3);

}

}

#endif 0

#if 0

/***** Change the led state at button interrupt *****/

{

status = *(int*)0xFFFFF43C;

if (dummy & (1<<19))

{

if (status & (1<<0))

*(int*)0xFFFFF434 = (1<<0);

else

*(int*)0xFFFFF430 = (1<<0);

} else if (dummy & (1<<20))

{

if (status & (1<<1))

*(int*)0xFFFFF434 = (1<<1);

else

*(int*)0xFFFFF430 = (1<<1);

} else if (dummy & (1<<15))

{

if (status & (1<<2))

*(int*)0xFFFFF434 = (1<<2);

else

*(int*)0xFFFFF430 = (1<<2);

} else if (dummy & (1<<14))

{

if (status & (1<<3))

*(int*)0xFFFFF434 = (1<<3);

else

*(int*)0xFFFFF430 = (1<<3);

}

status = *(int*)0xFFFFF43C;

}

#endif //0


//#if 0

/***** Change the led state when button is pressed *****/

{

status = *(int*)0xFFFFF43C;

if ((dummy & (1<<19)) && !(status & (1<<19)))

{

if (status & (1<<0))

*(int*)0xFFFFF434 = (1<<0);

else

*(int*)0xFFFFF430 = (1<<0);

}else if ((dummy & (1<<20)) && !(status & (1<<20)))

{

if (status & (1<<1))

*(int*)0xFFFFF434 = (1<<1);

else

*(int*)0xFFFFF430 = (1<<1);

}else if ((dummy & (1<<15)) && !(status & (1<<15)))

{

if (status & (1<<2))

*(int*)0xFFFFF434 = (1<<2);

else

*(int*)0xFFFFF430 = (1<<2);

}else if ((dummy & (1<<14)) && !(status & (1<<14)))

{

if (status & (1<<3))

*(int*)0xFFFFF434 = (1<<3);

else

*(int*)0xFFFFF430 = (1<<3);

}

status = *(int*)0xFFFFF43C;

}

//#endif //0

}


void delay(int wait)

{

volatile int count = wait;

while (count--);

}


void main(void)

{

/* Define completion code variable. */

unsigned char cc;

int temp = 0;

/* Define action expression variable. */

SEM_ACTION_EXPRESSION_TYPE actionExpressNo;

/* Define and initialize. */

SEM_EVENT_TYPE eventNo;

InitDevice();


/* Initialize the VS System. */

SEM_InitAll();

#if (VS_REALLINKMODE == 1)

/* Initialize RealLink communication. */

RealLinkCommInit();

/* Initializing RealLink API. */

VS_RealLinkInit();

#endif

/* Initialize the VS Event queue. */

SEQ_Initialize();

/* Add SE_RESET to initialize system. */

SEQ_AddEvent(SE_RESET);

/* Do forever: */

for(;;)

{

#if (VS_REALLINKMODE == 1)

VS_WAIT();

#endif

/*

for(temp = 0; temp < 16; temp++)

{

*(int*)0xFFFFF430 = temp - 1;

delay(1000000);

*(int*)0xFFFFF434 = temp;

delay(1000000);

} */

/*

*(int*)0xFFFFF434 = 1;

delay(1000000);

/**(int*)0xFFFFF434 = 2;

delay(1000000);

*(int*)0xFFFFF430 = 1;

delay(1000000);

*(int*)0xFFFFF434 = 4;

delay(1000000);

*(int*)0xFFFFF430 = 2;

delay(1000000);

*(int*)0xFFFFF434 = 8;

delay(1000000);

*(int*)0xFFFFF430 = 4;

delay(1000000);

*(int*)0xFFFFF430 = 8;

delay(1000000);

*/

if(SEQ_RetrieveEvent(&eventNo) != UCC_QUEUE_EMPTY)

{

/* Deduct the event. */

if ((cc = SEM_Deduct(eventNo)) != SES_OKAY)

HandleError(eventNo);

/* Get resulting action expressions and execute them. */

while ((cc = SEM_GetOutput(&actionExpressNo)) == SES_FOUND)

SEM_Action(actionExpressNo);

/* Check for error. */

if (cc != SES_OKAY)

HandleError(cc);

/* Change the next state vector. */

if ((cc = SEM_NextState()) != SES_OKAY)

HandleError(cc);

}

}

}


Задачи


1. При загорании случайной лампочки надо нажать соответствующую кнопку.

После этого лампочка гаснет. Нажатие не той кнопки?

2. Нажатие кнопки на время, то есть кнопку надо нажать за определенное время.

Какие способы учитывать время?

a) После зажигания лампочки сделать задержку (delay(N)) и после

окончания задержки - проверить, нажималась ли в это время кнопка.

Информация о том, нажималась ли кнопка, хранится в переменной,

которой присваивается значение в обработчике прерывания от кнопки.

b) Запускать таймер на определенное время (настраиваемое). Когда

происходит нажатие нужной кнопки, таймер выключается.

Если же таймер сработал, то увеличивается счетчик ошибок.


Код решения должен состоять из двух частей:
1) Зажигание случайной лампочки. Этот код будет помещен в функцию main()

2) Обработка нажатия кнопки. Этот код будет помещен в функцию ButtonInterrupt()

3) В задаче 2b) код обработчика прерывания таймера (простой: просто увеличивает счетчик ошибок).