Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * "Hello World" example.
- *
- * This example prints 'Hello from Nios II' to the STDOUT stream. It runs on
- * the Nios II 'standard', 'full_featured', 'fast', and 'low_cost' example
- * designs. It runs with or without the MicroC/OS-II RTOS and requires a STDOUT
- * device in your system's hardware.
- * The memory footprint of this hosted application is ~69 kbytes by default
- * using the standard reference design.
- *
- * For a reduced footprint version of this template, and an explanation of how
- * to reduce the memory footprint for a given application, see the
- * "small_hello_world" template.
- *
- */
- #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 "definition.h"
- #define ROOMS 5 // liczba pokoi
- #define DOORS 8 // liczba drzwi
- struct Door {
- int room1;
- int room2;
- };
- struct interrupt_data {
- volatile int leds_addr;
- volatile int sliders_addr;
- volatile int hex_addr;
- volatile int pushbuttons_addr;
- volatile int s[ROOMS];
- };
- //volatile int s[ROOMS] = { 0, 0, 0, 0, 0 }; // liczba osob w pokoju
- static void handle_sliders_interrupt(struct interrupt_data *data) {
- // int sw = IORD(data->sliders_addr, 0);
- // IOWR(data->leds_addr, 0, sw);
- int sw = IORD(data->sliders_addr, 0);
- int direction = sw & SW0;
- struct Door cd[DOORS];
- cd[0].room1 = 3; cd[0].room2 = 4;
- cd[1].room1 = 3; cd[1].room2 = 2;
- cd[2].room1 = 2; cd[2].room2 = 5;
- cd[3].room1 = 5; cd[3].room2 = 0;
- cd[4].room1 = 0; cd[4].room2 = 2;
- cd[5].room1 = 1; cd[5].room2 = 0;
- cd[6].room1 = 4; cd[6].room2 = 1;
- cd[7].room1 = 2; cd[7].room2 = 1;
- int SW[DOORS] = { SW1, SW2, SW3, SW4, SW5, SW6, SW7, SW8 };
- int LEDS[ROOMS] = { LED1, LED2, LED3, LED4, LED5 };
- int leds;
- int hex[ROOMS];
- sw = IORD(data->sliders_addr, 0);
- direction = (sw & SW0) ? 1 : 0;
- for (int i = 0; i < DOORS; ++i) {
- if (sw & SW[i]) {
- int r1 = cd[i].room1 - 1;
- if (r1 > -1) {
- data->s[r1] = (direction) ? data->s[r1] + 1 : data->s[r1] - 1;
- }
- int r2 = cd[i].room2 - 1;
- if (r2 > -1) {
- data->s[r2] = (direction) ? data->s[r2] - 1 : data->s[r2] + 1;
- }
- }
- }
- //LEDS
- leds = 0;
- if (direction) {
- leds |= LED0;
- }
- for (int i = 0; i < ROOMS; ++i) {
- if (data->s[i] > 0) {
- leds |= LEDS[i];
- }
- if (data->s[i] < 0) { // zapal LED9 gdy error
- leds |= LED9;
- }
- }
- IOWR(data->leds_addr, 0, leds);
- //HEX
- for (int i = 0; i < ROOMS; ++i) {
- hex[i] = 0;
- switch (data->s[i]) {
- case 0:
- hex[i] = ZERO;
- break;
- case 1:
- hex[i] = ONE;
- break;
- case 2:
- hex[i] = TWO;
- break;
- case 3:
- hex[i] = THREE;
- break;
- case 4:
- hex[i] = _4;
- break;
- case 5:
- hex[i] = _5;
- break;
- case 6:
- hex[i] = _6;
- break;
- case 7:
- hex[i] = _7;
- break;
- case 8:
- hex[i] = _8;
- break;
- case 9:
- hex[i] = _9;
- break;
- case 10:
- hex[i] = _A;
- break;
- case 11:
- hex[i] = _B;
- break;
- case 12:
- hex[i] = _C;
- break;
- case 13:
- hex[i] = _D;
- break;
- case 14:
- hex[i] = _E;
- break;
- case 15:
- hex[i] = _F;
- break;
- default:
- if (data->s[i] < 0) {
- hex[i] = SEGG;
- }
- break;
- }
- }
- IOWR(data->hex_addr, 0, hex[0]);
- IOWR(data->hex_addr, 1, hex[1]);
- IOWR(data->hex_addr, 2, hex[2]);
- IOWR(data->hex_addr, 3, hex[3]);
- IOWR(data->hex_addr, 4, hex[4]);
- IOWR(data->hex_addr, 5, 0x0);
- // IOWR(data->hex_addr, 4, _A);
- // IOWR(data->hex_addr, 3, _G);
- // IOWR(data->hex_addr, 2, _A);
- // IOWR(data->hex_addr, 1, _T);
- // IOWR(data->hex_addr, 0, _A);
- }
- static void handle_pushbutton_interrupt(struct interrupt_data *data) {
- int pb = IORD(data->pushbuttons_addr, 0);
- IOWR(data->hex_addr, 0, pb);
- }
- int main() {
- volatile int* leds = (int*) (LEDS_BASE);
- volatile int* sliders = (int*) (SW_SLIDERS_BASE);
- // volatile int* pushbuttons = (int*) (PUSHBUTTON_BASE);
- volatile int* hex = (int*) (HEX_BASE);
- struct interrupt_data data;
- data.leds_addr = leds;
- data.sliders_addr = sliders;
- // data.pushbuttons_addr = pushbuttons;
- data.hex_addr = hex;
- for(int i = 0; i < ROOMS; i++) {
- data.s[i] = 0;
- }
- IOWR_ALTERA_AVALON_PIO_IRQ_MASK(SW_SLIDERS_BASE, 0xff);
- // IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PUSHBUTTON_BASE, 0xff);
- if (alt_ic_isr_register(SW_SLIDERS_IRQ_INTERRUPT_CONTROLLER_ID,
- SW_SLIDERS_IRQ, handle_sliders_interrupt, &data, 0x0)) {
- printf("Error!\n");
- }
- // if (alt_ic_isr_register(PUSHBUTTON_IRQ_INTERRUPT_CONTROLLER_ID,
- // PUSHBUTTON_IRQ, handle_pushbutton_interrupt, &data, 0x0)) {
- // printf("Error!\n");
- // }
- if (alt_ic_irq_enable(SW_SLIDERS_IRQ_INTERRUPT_CONTROLLER_ID,
- SW_SLIDERS_IRQ)) {
- printf("Error!\n");
- }
- // if (alt_ic_irq_enable(PUSHBUTTON_IRQ_INTERRUPT_CONTROLLER_ID,
- // PUSHBUTTON_IRQ)) {
- // printf("Error!\n");
- // }
- printf("Hello from Nios II!\n");
- while (1) {
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement