Advertisement
Guest User

Untitled

a guest
Oct 21st, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.88 KB | None | 0 0
  1. /*
  2. * "Hello World" example.
  3. *
  4. * This example prints 'Hello from Nios II' to the STDOUT stream. It runs on
  5. * the Nios II 'standard', 'full_featured', 'fast', and 'low_cost' example
  6. * designs. It runs with or without the MicroC/OS-II RTOS and requires a STDOUT
  7. * device in your system's hardware.
  8. * The memory footprint of this hosted application is ~69 kbytes by default
  9. * using the standard reference design.
  10. *
  11. * For a reduced footprint version of this template, and an explanation of how
  12. * to reduce the memory footprint for a given application, see the
  13. * "small_hello_world" template.
  14. *
  15. */
  16.  
  17. #include <stdio.h>
  18. #include <io.h>
  19. #include <system.h>
  20. #include "alt_types.h"
  21. #include "altera_avalon_pio_regs.h"
  22. #include "sys/alt_irq.h"
  23. #include "definition.h"
  24.  
  25. #define ROOMS 5 // liczba pokoi
  26. #define DOORS 8 // liczba drzwi
  27.  
  28. struct Door {
  29. int room1;
  30. int room2;
  31. };
  32.  
  33. struct interrupt_data {
  34. volatile int leds_addr;
  35. volatile int sliders_addr;
  36. volatile int hex_addr;
  37. volatile int pushbuttons_addr;
  38. volatile int s[ROOMS];
  39. };
  40.  
  41. //volatile int s[ROOMS] = { 0, 0, 0, 0, 0 }; // liczba osob w pokoju
  42.  
  43. static void handle_sliders_interrupt(struct interrupt_data *data) {
  44. // int sw = IORD(data->sliders_addr, 0);
  45. // IOWR(data->leds_addr, 0, sw);
  46.  
  47. int sw = IORD(data->sliders_addr, 0);
  48.  
  49. int direction = sw & SW0;
  50.  
  51. struct Door cd[DOORS];
  52. cd[0].room1 = 3; cd[0].room2 = 4;
  53. cd[1].room1 = 3; cd[1].room2 = 2;
  54. cd[2].room1 = 2; cd[2].room2 = 5;
  55. cd[3].room1 = 5; cd[3].room2 = 0;
  56. cd[4].room1 = 0; cd[4].room2 = 2;
  57. cd[5].room1 = 1; cd[5].room2 = 0;
  58. cd[6].room1 = 4; cd[6].room2 = 1;
  59. cd[7].room1 = 2; cd[7].room2 = 1;
  60.  
  61. int SW[DOORS] = { SW1, SW2, SW3, SW4, SW5, SW6, SW7, SW8 };
  62. int LEDS[ROOMS] = { LED1, LED2, LED3, LED4, LED5 };
  63.  
  64. int leds;
  65. int hex[ROOMS];
  66.  
  67. sw = IORD(data->sliders_addr, 0);
  68.  
  69. direction = (sw & SW0) ? 1 : 0;
  70.  
  71. for (int i = 0; i < DOORS; ++i) {
  72. if (sw & SW[i]) {
  73. int r1 = cd[i].room1 - 1;
  74. if (r1 > -1) {
  75. data->s[r1] = (direction) ? data->s[r1] + 1 : data->s[r1] - 1;
  76. }
  77.  
  78. int r2 = cd[i].room2 - 1;
  79. if (r2 > -1) {
  80. data->s[r2] = (direction) ? data->s[r2] - 1 : data->s[r2] + 1;
  81. }
  82. }
  83. }
  84.  
  85. //LEDS
  86. leds = 0;
  87. if (direction) {
  88. leds |= LED0;
  89. }
  90. for (int i = 0; i < ROOMS; ++i) {
  91. if (data->s[i] > 0) {
  92. leds |= LEDS[i];
  93. }
  94. if (data->s[i] < 0) { // zapal LED9 gdy error
  95. leds |= LED9;
  96. }
  97. }
  98. IOWR(data->leds_addr, 0, leds);
  99.  
  100. //HEX
  101. for (int i = 0; i < ROOMS; ++i) {
  102. hex[i] = 0;
  103. switch (data->s[i]) {
  104. case 0:
  105. hex[i] = ZERO;
  106. break;
  107. case 1:
  108. hex[i] = ONE;
  109. break;
  110. case 2:
  111. hex[i] = TWO;
  112. break;
  113. case 3:
  114. hex[i] = THREE;
  115. break;
  116. case 4:
  117. hex[i] = _4;
  118. break;
  119. case 5:
  120. hex[i] = _5;
  121. break;
  122. case 6:
  123. hex[i] = _6;
  124. break;
  125. case 7:
  126. hex[i] = _7;
  127. break;
  128. case 8:
  129. hex[i] = _8;
  130. break;
  131. case 9:
  132. hex[i] = _9;
  133. break;
  134. case 10:
  135. hex[i] = _A;
  136. break;
  137. case 11:
  138. hex[i] = _B;
  139. break;
  140. case 12:
  141. hex[i] = _C;
  142. break;
  143. case 13:
  144. hex[i] = _D;
  145. break;
  146. case 14:
  147. hex[i] = _E;
  148. break;
  149. case 15:
  150. hex[i] = _F;
  151. break;
  152. default:
  153. if (data->s[i] < 0) {
  154. hex[i] = SEGG;
  155. }
  156. break;
  157. }
  158. }
  159.  
  160. IOWR(data->hex_addr, 0, hex[0]);
  161. IOWR(data->hex_addr, 1, hex[1]);
  162. IOWR(data->hex_addr, 2, hex[2]);
  163. IOWR(data->hex_addr, 3, hex[3]);
  164. IOWR(data->hex_addr, 4, hex[4]);
  165. IOWR(data->hex_addr, 5, 0x0);
  166.  
  167. // IOWR(data->hex_addr, 4, _A);
  168. // IOWR(data->hex_addr, 3, _G);
  169. // IOWR(data->hex_addr, 2, _A);
  170. // IOWR(data->hex_addr, 1, _T);
  171. // IOWR(data->hex_addr, 0, _A);
  172. }
  173.  
  174. static void handle_pushbutton_interrupt(struct interrupt_data *data) {
  175. int pb = IORD(data->pushbuttons_addr, 0);
  176. IOWR(data->hex_addr, 0, pb);
  177. }
  178.  
  179. int main() {
  180. volatile int* leds = (int*) (LEDS_BASE);
  181. volatile int* sliders = (int*) (SW_SLIDERS_BASE);
  182. // volatile int* pushbuttons = (int*) (PUSHBUTTON_BASE);
  183. volatile int* hex = (int*) (HEX_BASE);
  184.  
  185. struct interrupt_data data;
  186.  
  187. data.leds_addr = leds;
  188. data.sliders_addr = sliders;
  189. // data.pushbuttons_addr = pushbuttons;
  190. data.hex_addr = hex;
  191. for(int i = 0; i < ROOMS; i++) {
  192. data.s[i] = 0;
  193. }
  194.  
  195. IOWR_ALTERA_AVALON_PIO_IRQ_MASK(SW_SLIDERS_BASE, 0xff);
  196. // IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PUSHBUTTON_BASE, 0xff);
  197.  
  198. if (alt_ic_isr_register(SW_SLIDERS_IRQ_INTERRUPT_CONTROLLER_ID,
  199. SW_SLIDERS_IRQ, handle_sliders_interrupt, &data, 0x0)) {
  200. printf("Error!\n");
  201. }
  202.  
  203. // if (alt_ic_isr_register(PUSHBUTTON_IRQ_INTERRUPT_CONTROLLER_ID,
  204. // PUSHBUTTON_IRQ, handle_pushbutton_interrupt, &data, 0x0)) {
  205. // printf("Error!\n");
  206. // }
  207.  
  208. if (alt_ic_irq_enable(SW_SLIDERS_IRQ_INTERRUPT_CONTROLLER_ID,
  209. SW_SLIDERS_IRQ)) {
  210. printf("Error!\n");
  211. }
  212.  
  213. // if (alt_ic_irq_enable(PUSHBUTTON_IRQ_INTERRUPT_CONTROLLER_ID,
  214. // PUSHBUTTON_IRQ)) {
  215. // printf("Error!\n");
  216. // }
  217.  
  218. printf("Hello from Nios II!\n");
  219.  
  220. while (1) {
  221. }
  222.  
  223. return 0;
  224. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement