Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <io.h>
- #include <system.h>
- #include "alt_types.h"
- #include "altera_avalon_pio_regs.h"
- #include "sys/alt_irq.h"
- //#include "sys/alt_timestamp.h"
- #include <unistd.h>
- #include "definitions.h"
- enum States
- {
- state0,
- state1,
- state2,
- state3,
- state4,
- state5,
- state6,
- errorState
- };
- struct interrupt_data
- {
- volatile int * leds_addr;
- volatile int * sw_adrr;
- int state;
- };
- int moveToState(int swState)
- {
- if (howManLedsAreUp(swState) > 1)
- {
- return errorState;
- }
- if (swState & LED9)
- {
- return state1;
- }
- else if (swState & LED8)
- {
- return state2;
- }
- else if (swState & LED7)
- {
- return state3;
- }
- else if (swState & LED6)
- {
- return state4;
- }
- else if (swState & LED5)
- {
- return state5;
- }
- else if (swState & LED4)
- {
- return state6;
- }
- else
- {
- return state0;
- }
- }
- int howManLedsAreUp(int swState)
- {
- int arr[6] = {LED9, LED8, LED7, LED6, LED5, LED4};
- int counter = 0;
- for (int i = 0; i < 6; ++i)
- {
- if (swState & arr[i])
- {
- counter++;
- }
- }
- return counter;
- }
- static void handle_sliders_interrupt(struct interrupt_data * data)
- {
- int swState = IORD(data->sw_adrr, 0);
- switch(data->state){
- case state0:
- data->state = moveToState(swState);
- break;
- case state1:
- IOWR(data->leds_addr, 0, LED9);
- data->state = moveToState(swState);
- break;
- case state2:
- IOWR(data->leds_addr, 0, LED8);
- data->state = moveToState(swState);
- break;
- case state3:
- IOWR(data->leds_addr, 0, LED7);
- data->state = moveToState(swState);
- break;
- case state4:
- IOWR(data->leds_addr, 0, LED6);
- data->state = moveToState(swState);
- break;
- case state5:
- IOWR(data->leds_addr, 0, LED5);
- data->state = moveToState(swState);
- break;
- case state6:
- IOWR(data->leds_addr, 0, LED4);
- data->state = moveToState(swState);
- break;
- case errorState:
- IOWR(data->leds_addr, 0, LED5);
- data->state = moveToState(swState);
- break;
- }
- }
- int main()
- {
- volatile int *leds = (int*) (LEDS_BASE);
- volatile int *sliders = (int*) (SW_SLIDERS_BASE);
- struct interrupt_data data;
- data.leds_addr = leds;
- data.sw_adrr = sliders;
- data.state = 0;
- IOWR_ALTERA_AVALON_PIO_IRQ_MASK(data.sw_adrr, 0xf);
- alt_ic_isr_register(SW_SLIDERS_IRQ_INTERRUPT_CONTROLLER_ID,SW_SLIDERS_IRQ,handle_sliders_interrupt, &data, 0x0);
- //alt_ic_isr_register(PUSHBUTTON_IRQ_INTERRUPT_CONTROLLER_ID, ..., handle_pushbuttons_interrupt, &data, 0x0);
- alt_ic_irq_enable(SW_SLIDERS_IRQ_INTERRUPT_CONTROLLER_ID, SW_SLIDERS_IRQ);
- printf("Hello from Nios II!\n");
- while(1);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement