Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2017
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.44 KB | None | 0 0
  1. /*
  2. * interrupt_counter_tut_2B.c
  3. *
  4. * Version 1.2 Author : Edward Todirica
  5. *
  6. * Created on: Unknown
  7. * Author: Ross Elliot
  8. * Version: 1.1
  9. */
  10.  
  11. /********************************************************************************************
  12.  
  13. * VERSION HISTORY
  14. ********************************************************************************************
  15. * v1.2 - 10.11.2016
  16. * Fixed some bugs regarding Timer Interrupts and adding some
  17. * debug messages for the Timer Interrupt Handler
  18. *
  19. * v1.1 - 01/05/2015
  20. * Updated for Zybo ~ DN
  21. *
  22. * v1.0 - Unknown
  23. * First version created.
  24. *******************************************************************************************/
  25.  
  26. #include <stdio.h>
  27. #include "xparameters.h"
  28. #include "xgpio.h"
  29. #include "xtmrctr.h"
  30. #include "xscugic.h"
  31. #include "xil_exception.h"
  32. #include "xil_printf.h"
  33. #include "xtime_l.h"
  34.  
  35.  
  36.  
  37. // Parameter definitions
  38. #define INTC_DEVICE_ID XPAR_PS7_SCUGIC_0_DEVICE_ID
  39. #define TMR_DEVICE_ID XPAR_TMRCTR_0_DEVICE_ID
  40. #define BTNS_DEVICE_ID XPAR_AXI_GPIO_0_DEVICE_ID
  41. #define LEDS_DEVICE_ID XPAR_AXI_GPIO_1_DEVICE_ID
  42. #define INTC_GPIO_INTERRUPT_ID XPAR_FABRIC_AXI_GPIO_0_IP2INTC_IRPT_INTR
  43. #define INTC_TMR_INTERRUPT_ID XPAR_FABRIC_AXI_TIMER_0_INTERRUPT_INTR
  44.  
  45. #define BTN_INT XGPIO_IR_CH1_MASK
  46. //#define TMR_LOAD 0xF8000000
  47. #define TMR_LOAD 1000000
  48.  
  49.  
  50. XGpio LEDInst, BTNInst;
  51. XScuGic INTCInst;
  52. //XTmrCtr TMRInst;
  53. int led_data;
  54. int btn_value;
  55. //static int tmr_count;
  56.  
  57. XTime tStart, tEnd;
  58.  
  59. //----------------------------------------------------------------------------------
  60. // VARIABLES-----------------------------------------------------------------------
  61. //----------------------------------------------------------------------------------
  62. int milliseconds = 00;
  63. int time = 00;
  64. int minutes = 00;
  65. int seconds = 00;
  66. int sw_minutes = 00;
  67. int sw_seconds = 00;
  68. int sw_milliseconds = 00;
  69. int sw_minuteslap = 00;
  70. int sw_secondslap = 00;
  71. int sw_millisecondslap = 00;
  72. int sw_start = 0;
  73. int sw_lap = 0;
  74. char mode = 'A';
  75. int ChangeHour = 0;
  76. int ChangeMinutes = 0;
  77. int minutesChange = 0;
  78. //----------------------------------------------------------------------------------
  79. // VARIABLES DONE ------------------------------------------------------------------
  80. //----------------------------------------------------------------------------------
  81.  
  82.  
  83.  
  84.  
  85.  
  86. //----------------------------------------------------
  87. // PROTOTYPE FUNCTIONS
  88. //----------------------------------------------------
  89. void BTN_Intr_Handler(void *baseaddr_p);
  90. void TMR_Intr_Handler(void *InstancePtr, u8 TmrCtrNumber);
  91. int InterruptSystemSetup(XScuGic *XScuGicInstancePtr);
  92. int IntcInitFunction(u16 DeviceId, XTmrCtr *TmrInstancePtr, XGpio *GpioInstancePtr);
  93. //----------------------------------------------------
  94. // PROTOTYPE FUNCTIONS DONE
  95. //----------------------------------------------------
  96.  
  97. /*****************************************************************************/
  98. /**
  99. * This function should be part of the device driver for the timer device
  100. * Clears the interrupt flag of the specified timer counter of the device.
  101. * This is necessary to do in the interrupt routine after the interrupt was handled.
  102. *
  103. * @param InstancePtr is a pointer to the XTmrCtr instance.
  104. * @param TmrCtrNumber is the timer counter of the device to operate on.
  105. * Each device may contain multiple timer counters. The timer
  106. * number is a zero based number with a range of
  107. * 0 - (XTC_DEVICE_TIMER_COUNT - 1).
  108. *
  109. * @return None.
  110. *
  111. * @note None.
  112. *
  113. ******************************************************************************/
  114. void XTmrCtr_ClearInterruptFlag(XTmrCtr * InstancePtr, u8 TmrCtrNumber)
  115. {
  116. u32 CounterControlReg;
  117.  
  118. Xil_AssertVoid(InstancePtr != NULL);
  119. Xil_AssertVoid(TmrCtrNumber < XTC_DEVICE_TIMER_COUNT);
  120. Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
  121.  
  122. /*
  123. * Read current contents of the CSR register so it won't be destroyed
  124. */
  125. CounterControlReg = XTmrCtr_ReadReg(InstancePtr->BaseAddress,
  126. TmrCtrNumber, XTC_TCSR_OFFSET);
  127. /*
  128. * Reset the interrupt flag
  129. */
  130. XTmrCtr_WriteReg(InstancePtr->BaseAddress, TmrCtrNumber,
  131. XTC_TCSR_OFFSET,
  132. CounterControlReg | XTC_CSR_INT_OCCURED_MASK);
  133. }
  134.  
  135.  
  136.  
  137. //----------------------------------------------------
  138. // INTERRUPT HANDLER FUNCTIONS
  139. // - called by the timer, button interrupt, performs
  140. // - LED flashing
  141. //----------------------------------------------------
  142.  
  143.  
  144. //make led_data start with beeing 8
  145. led_data = 8;
  146.  
  147. void BTN_Intr_Handler(void *InstancePtr)
  148. {
  149.  
  150.  
  151. // Disable GPIO interrupts
  152. XGpio_InterruptDisable(&BTNInst, BTN_INT);
  153. // Ignore additional button presses
  154. if ((XGpio_InterruptGetStatus(&BTNInst) & BTN_INT) !=
  155. BTN_INT) {
  156. return;
  157. }
  158.  
  159. btn_value = XGpio_DiscreteRead(&BTNInst, 1);
  160.  
  161.  
  162.  
  163. // Everytime btn 4 is pressed, led data is divided by 2
  164.  
  165. if (btn_value == 4) {
  166. led_data = led_data/2;
  167.  
  168. btn_value = 0;
  169.  
  170.  
  171. }
  172.  
  173. // makes sure that led data shifts from 1 to 8, when btn 4 is pressed again.
  174. if (btn_value == 0 && led_data < 1) {
  175. led_data = 8;
  176.  
  177. }
  178.  
  179. // defines which mode we are in
  180. if (led_data == 4) {
  181. mode = 'B';
  182. } else if (led_data == 2) {
  183. mode = 'C';
  184. } else if (led_data == 1) {
  185. mode = 'D';
  186. } else {
  187. mode = 'A';
  188. }
  189.  
  190.  
  191.  
  192.  
  193.  
  194.  
  195.  
  196. XGpio_DiscreteWrite(&LEDInst, 1, led_data);
  197. (void)XGpio_InterruptClear(&BTNInst, BTN_INT);
  198. // Enable GPIO interrupts
  199. XGpio_InterruptEnable(&BTNInst, BTN_INT);
  200. }
  201.  
  202.  
  203. void TMR_Intr_Handler(void *InstancePtr, u8 TmrCtrNumber)
  204. {
  205.  
  206.  
  207.  
  208. //Switch case
  209. switch(mode) {
  210.  
  211. case 'A' :
  212. xil_printf("Time !\n" );
  213. printTime();
  214. break;
  215. case 'B' :
  216. xil_printf("Mode2 \n" );
  217. break;
  218. case 'C' :
  219. xil_printf(" Stopwatch \n" );
  220. stopwatch();
  221.  
  222. break;
  223. case 'D' :
  224. xil_printf("Change time \n" );
  225. changeTime();
  226. break;
  227.  
  228. default :
  229. xil_printf("Invalid mode\n" );
  230. }
  231.  
  232.  
  233. double duration;
  234. static int tmr_count;
  235. XTime_GetTime(&tEnd);
  236. XTmrCtr* pTMRInst = (XTmrCtr *) InstancePtr;
  237.  
  238.  
  239. // Clock time
  240. milliseconds++;
  241. if (milliseconds >= 99){
  242. seconds++;
  243. milliseconds = 0;
  244. }else if ( seconds >= 60 ) {
  245. minutes++;
  246. seconds = 0;
  247. } else if ( minutes >= 60 ) {
  248. time++;
  249. minutes = 0;
  250. } else if ( time >= 24) {
  251. time = 0;
  252. }
  253.  
  254. if (TmrCtrNumber==0) { //Handle interrupts generated by timer 0
  255. duration = ((double)(tEnd-tStart))/COUNTS_PER_SECOND;
  256. //xil_printf("%s\n%s\n", said[2],said[2]);
  257. tStart=tEnd;
  258.  
  259. if (XTmrCtr_IsExpired(pTMRInst,0)){
  260. // Once timer has expired 3 times, stop, increment counter
  261. // reset timer and start running again
  262.  
  263.  
  264.  
  265. if(tmr_count == 3){
  266. XTmrCtr_Stop(pTMRInst,0);
  267. tmr_count = 0;
  268.  
  269.  
  270.  
  271.  
  272. XGpio_DiscreteWrite(&LEDInst, 1, led_data);
  273. XTmrCtr_Reset(pTMRInst,0);
  274. XTmrCtr_Start(pTMRInst,0);
  275.  
  276. }
  277. else tmr_count++;
  278. }
  279. }
  280. else { //Handle interrupts generated by timer 1
  281.  
  282. }
  283.  
  284. XTmrCtr_ClearInterruptFlag(pTMRInst, TmrCtrNumber);
  285.  
  286.  
  287.  
  288. }
  289.  
  290. //-------------------------------------------------------
  291. // FUNCTIONS
  292. //-------------------------------------------------------
  293.  
  294.  
  295. // Print the current time
  296. void printTime(){
  297. xil_printf("%d:%d:%d \n",time, minutes,seconds);
  298. }
  299.  
  300.  
  301. // Function for stopwatch mode
  302. void stopwatch() {
  303. xil_printf("%d:%d:%d \n",sw_minutes, sw_seconds,sw_milliseconds);
  304.  
  305.  
  306. if(btn_value == 1 && sw_start == 0){
  307. sw_start = 1;
  308. btn_value = 0;
  309. } else if(btn_value == 1 && sw_start == 1){
  310. sw_start = 0;
  311. }
  312.  
  313. if (sw_start == 1) {
  314. sw_milliseconds++;
  315. if ( sw_milliseconds >= 100 ) {
  316. sw_seconds++;
  317. sw_milliseconds = 0;
  318. } else if ( sw_seconds >= 60 ) {
  319. sw_minutes++;
  320. sw_seconds = 0;
  321. } else if ( sw_minutes >= 60) {
  322. sw_minutes = 0;
  323. }
  324. }
  325.  
  326.  
  327. if(btn_value == 8 && sw_start == 1 && sw_lap == 0){
  328. sw_lap = 1;
  329. sw_millisecondslap = sw_milliseconds;
  330. sw_secondslap = sw_seconds;
  331. sw_minuteslap = sw_minutes;
  332. }
  333. else if(btn_value == 8 && sw_lap == 1){
  334. sw_lap = 0;
  335. }
  336.  
  337. if (sw_start == 0){
  338. if(btn_value == 8){
  339. sw_milliseconds = 0;
  340. sw_seconds = 0;
  341. sw_minutes = 0;
  342. }
  343.  
  344. }
  345. }
  346.  
  347.  
  348. // Setting the time
  349. void changeTime() {
  350. xil_printf("%d:%d:%d \n",time, minutes,seconds);
  351. if(btn_value == 1 && led_data == 1 && ChangeMinutes == 0) {
  352. ChangeHour = 1;
  353. ChangeMinutes = 0;
  354.  
  355.  
  356. }
  357.  
  358. if(ChangeHour == 1 && btn_value == 1){
  359. time++;
  360. btn_value = 0;
  361. }
  362.  
  363.  
  364. if(btn_value == 8 && led_data == 1 && ChangeMinutes == 0) {
  365. ChangeHour = 0;
  366. ChangeMinutes = 1;
  367. btn_value = 0;
  368.  
  369.  
  370. }
  371.  
  372. if(ChangeMinutes == 1 && btn_value == 1){
  373. minutes++;
  374. btn_value = 0;
  375. }
  376.  
  377.  
  378. if(btn_value == 8 && led_data == 1 && ChangeMinutes == 1) {
  379. ChangeHour = 1;
  380. ChangeMinutes = 0;
  381. btn_value = 0;
  382.  
  383.  
  384. }
  385.  
  386.  
  387.  
  388. }
  389.  
  390. //-------------------------------------------------------
  391. // FUNCTIONS DONE
  392. //-------------------------------------------------------
  393.  
  394.  
  395.  
  396.  
  397.  
  398.  
  399.  
  400.  
  401.  
  402.  
  403. //----------------------------------------------------
  404. // MAIN FUNCTION
  405. //----------------------------------------------------
  406. int main (void)
  407. {
  408. int status;
  409. XTmrCtr TMRInst;
  410. //----------------------------------------------------
  411. // INITIALIZE THE PERIPHERALS & SET DIRECTIONS OF GPIO
  412. //----------------------------------------------------
  413. // Initialise LEDs
  414. status = XGpio_Initialize(&LEDInst, LEDS_DEVICE_ID);
  415. if(status != XST_SUCCESS) return XST_FAILURE;
  416. // Initialise Push Buttons
  417. status = XGpio_Initialize(&BTNInst, BTNS_DEVICE_ID);
  418. if(status != XST_SUCCESS) return XST_FAILURE;
  419. // Set LEDs direction to outputs
  420. XGpio_SetDataDirection(&LEDInst, 1, 0x00);
  421. // Set all buttons direction to inputs
  422. XGpio_SetDataDirection(&BTNInst, 1, 0xFF);
  423.  
  424.  
  425. //----------------------------------------------------
  426. // SETUP THE TIMER
  427. //----------------------------------------------------
  428. status = XTmrCtr_Initialize(&TMRInst, TMR_DEVICE_ID);
  429. if(status != XST_SUCCESS) return XST_FAILURE;
  430. XTmrCtr_SetHandler(&TMRInst, TMR_Intr_Handler, &TMRInst);
  431. XTmrCtr_SetResetValue(&TMRInst, 0, TMR_LOAD);
  432. XTmrCtr_SetOptions(&TMRInst, 0, XTC_INT_MODE_OPTION | XTC_AUTO_RELOAD_OPTION | XTC_DOWN_COUNT_OPTION);
  433.  
  434. // Initialize interrupt controller
  435. status = IntcInitFunction(INTC_DEVICE_ID, &TMRInst, &BTNInst);
  436. if(status != XST_SUCCESS) return XST_FAILURE;
  437.  
  438. XTmrCtr_Start(&TMRInst, 0);
  439. //Here we get the time when the timer first started
  440. XTime_GetTime(&tStart);
  441.  
  442. while(1);
  443.  
  444. return 0;
  445.  
  446.  
  447.  
  448.  
  449.  
  450.  
  451.  
  452.  
  453. }
  454.  
  455. //----------------------------------------------------
  456. // INITIAL SETUP FUNCTIONS
  457. //----------------------------------------------------
  458.  
  459. int InterruptSystemSetup(XScuGic *XScuGicInstancePtr)
  460. {
  461. // Enable interrupt
  462. XGpio_InterruptEnable(&BTNInst, BTN_INT);
  463. XGpio_InterruptGlobalEnable(&BTNInst);
  464.  
  465. Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
  466. (Xil_ExceptionHandler)XScuGic_InterruptHandler,
  467. XScuGicInstancePtr);
  468. Xil_ExceptionEnable();
  469.  
  470.  
  471. return XST_SUCCESS;
  472.  
  473. }
  474.  
  475.  
  476.  
  477. int IntcInitFunction(u16 DeviceId, XTmrCtr *TmrInstancePtr, XGpio *GpioInstancePtr)
  478. {
  479. XScuGic_Config *IntcConfig;
  480. int status;
  481. u8 pri, trig;
  482.  
  483. // Interrupt controller initialisation
  484. IntcConfig = XScuGic_LookupConfig(DeviceId);
  485. status = XScuGic_CfgInitialize(&INTCInst, IntcConfig, IntcConfig->CpuBaseAddress);
  486. if(status != XST_SUCCESS) return XST_FAILURE;
  487.  
  488. // Call to interrupt setup
  489. status = InterruptSystemSetup(&INTCInst);
  490. if(status != XST_SUCCESS) return XST_FAILURE;
  491.  
  492. // Connect GPIO interrupt to handler
  493. status = XScuGic_Connect(&INTCInst,
  494. INTC_GPIO_INTERRUPT_ID,
  495. (Xil_ExceptionHandler)BTN_Intr_Handler,
  496. (void *)GpioInstancePtr);
  497. if(status != XST_SUCCESS) return XST_FAILURE;
  498.  
  499.  
  500. // Connect timer interrupt to handler
  501. status = XScuGic_Connect(&INTCInst,
  502. INTC_TMR_INTERRUPT_ID,
  503. // (Xil_ExceptionHandler)TMR_Intr_Handler,
  504. (Xil_ExceptionHandler) XTmrCtr_InterruptHandler,
  505. (void *)TmrInstancePtr);
  506. if(status != XST_SUCCESS) return XST_FAILURE;
  507.  
  508. // Enable GPIO interrupts interrupt
  509. XGpio_InterruptEnable(GpioInstancePtr, 1);
  510. XGpio_InterruptGlobalEnable(GpioInstancePtr);
  511.  
  512. // Enable GPIO and timer interrupts in the controller
  513. XScuGic_Enable(&INTCInst, INTC_GPIO_INTERRUPT_ID);
  514. XScuGic_Enable(&INTCInst, INTC_TMR_INTERRUPT_ID);
  515.  
  516. xil_printf("Getting the Timer interrupt info\n\r");
  517. XScuGic_GetPriTrigTypeByDistAddr(INTCInst.Config->DistBaseAddress, INTC_TMR_INTERRUPT_ID, &pri, &trig);
  518. xil_printf("GPIO Interrupt-> Priority:%d, Trigger:%x\n\r", pri, trig);
  519.  
  520.  
  521. //Set the timer interrupt as edge triggered
  522. //XScuGic_SetPriorityTriggerType(&INTCInst, INTC_TMR_INTERRUPT_ID, )
  523.  
  524. return XST_SUCCESS;
  525. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement