DE1-SOC COMPUTER SYSTEM WITH NIOS II For Quartus II 15.0
#include "key_codes.h" // defines values for KEY0, KEY1, . . .
extern volatile int key_pressed, pattern, shift_dir;
/********************************************************************************
* Interval timer interrupt service routine
* Shifts a pattern being displayed on the HEX displays. The shift direction is determined
* by the external variable key_pressed.
********************************************************************************/
void interval_timer_isr( )
{
volatile int * interval_timer_ptr = (int *) 0xFF202000; // interval timer base address
volatile int * slider_switch_ptr = (int *) 0xFF200040; // SW base address
volatile int * HEX3_HEX0_ptr = (int *) 0xFF200020; // HEX3_HEX0 address
*(interval_timer_ptr) = 0; // clear the interrupt
*(HEX3_HEX0_ptr) = pattern; // display pattern on HEX3 ... HEX0
/* rotate the pattern shown on the HEX displays */
if (key_pressed == KEY0) // for KEY0 load a new pattern
pattern = *(slider_switch_ptr);
else if (key_pressed == KEY1)
shift_dir = RIGHT;
else if (key_pressed == KEY2)
shift_dir = LEFT;
else if (key_pressed == KEY3)
shift_dir = NONE;
key_pressed = NONE; // key press handled, so clear
if (shift_dir == LEFT)
if (pattern & 0x80000000)
pattern = (pattern << 1) | 1;
else
pattern = pattern << 1;
else if (shift_dir == RIGHT)
if (pattern & 0x00000001)
pattern = (pattern >> 1) | 0x80000000;
else
pattern = (pattern >> 1) & 0x7FFFFFFF;
// else don’t shift
return;
}
Figure 23. Interrupt service routine for the interval timer.
Altera Corporation - University Program
2015
29