Advertisement
filip710

lv4timer+interrupt

Dec 4th, 2018
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.17 KB | None | 0 0
  1. #include <stdio.h>
  2. //***********************************************TO DO 1*************************************************//
  3. //*******************Uključiti datoteke xparameters.h, xtmrctr.h, xintc.h i xgpio.h**********************//
  4. #include "xparameters.h"
  5. #include "xtmrctr.h"
  6. #include "xintc.h"
  7. #include "xgpio.h"
  8.  
  9.  
  10.  
  11. //******************************************************************************************************//
  12.  
  13. //definiranje konstante za redni broj timera koji se koristi (unutar timer komponente postoje dva timera)
  14. #define TIMER_CNTR_0 0
  15.  
  16. //***********************************************TO DO 2************************************************//
  17. //*****************************Postaviti vrijednost konstante RESET_VALUE*******************************//
  18.  #define RESET_VALUE 49999998
  19.  
  20. //******************************************************************************************************//
  21.  
  22. /********************* Prototipi funkcija *************************/
  23. int TmrCtrIntrInit(XIntc* IntcInstancePtr,
  24.  XTmrCtr* TmrInstancePtr,
  25.  u16 TimerDeviceId,
  26.  u16 IntcDeviceId,
  27.  u16 IntrSourceId,
  28.  u8 TmrCtrNumber);
  29.  
  30. void TimerCounterHandler(void *CallBackRef, u8 TmrCtrNumber);
  31.  
  32. //***********************************************TO DO 3*************************************************//
  33. //*****Deklarirati varijable InterruptController (XIntc), TimerCounterInst (XTmrCtr) i leds (XGpio)******//
  34. XIntc InterruptController;
  35. XTmrCtr TimerCounterInst;
  36. XGpio leds;
  37.  
  38. //******************************************************************************************************//
  39.  
  40. //***********************************************TO DO 4************************************************//
  41. //***************************Deklarirati globalnu varijablu TimerExpired********************************//
  42. int volatile TimerExpired;
  43.  
  44. //******************************************************************************************************//
  45.  
  46. int main(void)
  47. {
  48.     print("-- Start of the program! --\r\n");
  49.  
  50.     int Status;
  51.  
  52.     //***********************************************TO DO 5************************************************//
  53.     //************************Inicijalizirati kontroler za komunikaciju s LE diodama************************//
  54.      XGpio_Initialize(&leds, XPAR_LEDS_8BITS_DEVICE_ID);
  55.      XGpio_SetDataDirection(&leds,1,0x00);
  56.  
  57.     //******************************************************************************************************//
  58.  
  59.     //Poziv funkcije za inicijalizaciju timera i upravljača prekidima
  60.     Status = TmrCtrIntrInit(&InterruptController,
  61.                             &TimerCounterInst,
  62.                             XPAR_DELAY_DEVICE_ID,
  63.                             XPAR_INTC_0_DEVICE_ID,
  64.                             XPAR_INTC_0_TMRCTR_0_VEC_ID,
  65.                             TIMER_CNTR_0);
  66.  
  67.     if (Status != XST_SUCCESS){
  68.         return XST_FAILURE;
  69.     }
  70.  
  71.     //***********************************************TO DO 6***********************************************//
  72.     //******************************************Pokrenuti timer********************************************//
  73.     XTmrCtr_Start(&TimerCounterInst, TIMER_CNTR_0);
  74.  
  75.     //*****************************************************************************************************//
  76.  
  77.     while (1) {
  78.  
  79.     }
  80.  
  81.     print("-- End of the program! --\r\n");
  82.     return XST_SUCCESS;
  83. }
  84.  
  85. /********************************************************************/
  86. /**
  87. * Inicijalizacija timera i upravljača prekidima.
  88. * Funkcija prima sljedeće parametre:
  89. *
  90. * @paramIntcInstancePtr - pokazivač na varijablu tipa XIntc,
  91. * @paramTmrCtrInstancePtr - pokazivač na varijablu tipa XTmrCtr,
  92. * @paramTimerDeviceId - vrijednost konstante XPAR_<TmrCtr_instance>_DEVICE_ID iz datoteke xparameters.h,
  93. * @paramIntcDeviceId - vrijednost konstante XPAR_<Intc_instance>_DEVICE_ID iz datoteke xparameters.h,
  94. * @paramIntrSourceId - vrijednost konstante XPAR_<INTC_instance>_<TmrCtr_instance>_INTERRUPT_INTR iz datoteke xparameters.h,
  95. * @paramTmrCtrNumber - redni broj timera koji se inicijalizira.
  96. *
  97. * @returnXST_SUCCESS ako je inicijalizacija uspješna, a u suprotno funkcija vraća XST_FAILURE
  98. *
  99. *********************************************************************/
  100. int TmrCtrIntrInit(XIntc* IntcInstancePtr,
  101.  XTmrCtr* TmrCtrInstancePtr,
  102.  u16 TimerDeviceId,
  103.  u16 IntcDeviceId,
  104.  u16 IntrSourceId,
  105.  u8 TmrCtrNumber)
  106. {
  107.     int Status;
  108.  
  109.     print("Init STARTED\r\n");
  110.  
  111.     //***********************************************TO DO 7************************************************//
  112.     //**********Inicijalizirati timer, povratnu vrijednost funkcije spremiti u varijablu Status************//
  113.     Status = XTmrCtr_Initialize(TmrCtrInstancePtr,TimerDeviceId );
  114.  
  115.     //*****************************************************************************************************//
  116.     if (Status != XST_SUCCESS) {
  117.         print("Timer Initialize FAILED\r\n");
  118.         return XST_FAILURE;
  119.     }
  120.     print("Timer Initialize SUCCESS\r\n");
  121.  
  122.     //**********************************************TO DO 8*************************************************//
  123.     //****Inicijalizirati upravljač prekidima, povratnu vrijednost funkcije spremiti u varijablu Status****//
  124.    Status = XIntc_Initialize(IntcInstancePtr,IntcDeviceId);
  125.  
  126.     //*****************************************************************************************************//
  127.     if (Status != XST_SUCCESS) {
  128.         print("Intc Initialize FAILED\r\n");
  129.         return XST_FAILURE;
  130.     }
  131.     print("Intc Initialize SUCCESS\r\n");
  132.  
  133.     /*
  134.      * Povezivanje upravljača prekida s rukovateljem prekida koji se
  135.      * poziva kada se dogodi prekid. Rukovatelj prekida obavlja
  136.      * specifične zadatke vezane za rukovanje prekidima.
  137.      */
  138.     Status = XIntc_Connect(IntcInstancePtr, IntrSourceId,
  139.      (XInterruptHandler)XTmrCtr_InterruptHandler,
  140.      (void *)TmrCtrInstancePtr);
  141.  
  142.     if (Status != XST_SUCCESS) {
  143.         print("Intc Connect FAILED\r\n");
  144.         return XST_FAILURE;
  145.     }
  146.     print("Intc Connect SUCCESS\r\n");
  147.  
  148.     //***********************************************TO DO 9******************************+****************//
  149.     //***Postaviti mod rada upravljača prekida, povratnu vrijednost funkcije spremiti u varijablu Status***//
  150.  
  151.    Status = XIntc_Start(IntcInstancePtr, XIN_REAL_MODE );
  152.     //*****************************************************************************************************//
  153.     if (Status != XST_SUCCESS) {
  154.         print("Intc Start FAILED\r\n");
  155.         return XST_FAILURE;
  156.     }
  157.     print("Intc Start SUCCESS\r\n");
  158.  
  159.     //**********************************************TO DO 10******************************+****************//
  160.     //*********************************Omogućiti rad upravljača prekidima**********************************//
  161.     XIntc_Enable(IntcInstancePtr,IntrSourceId);
  162.  
  163.     //*****************************************************************************************************//
  164.  
  165.     //Omogućavanje microblaze prekida.
  166.     microblaze_enable_interrupts();
  167.  
  168.     /*
  169.      * Postavljanje prekidne rutine koja će biti pozvana kada se dogodi prekid
  170.      * od strane timera. Kao parametri predaju se pokazivač na komponentu za
  171.      * koju se postavlja prekidna rutina, naziv prekidne rutine (funkcije)
  172.      * i pointer na timer, kako bi prekidna rutina mogla pristupiti timeru.
  173.      */
  174.     XTmrCtr_SetHandler(TmrCtrInstancePtr,
  175.      TimerCounterHandler,
  176.      TmrCtrInstancePtr);
  177.  
  178.     //**********************************************TO DO 11******************************+****************//
  179.     //*************************************Postaviti postavke timera***************************************//
  180.     //************Omogućiti prekide, omogućiti auto reload, odabrati brojanje prema dolje******************//
  181.     XTmrCtr_SetOptions(TmrCtrInstancePtr,TmrCtrNumber, XTC_INT_MODE_OPTION |  XTC_AUTO_RELOAD_OPTION | XTC_DOWN_COUNT_OPTION);
  182.  
  183.     //*****************************************************************************************************//
  184.  
  185.     //**********************************************TO DO 12******************************+****************//
  186.     //********************************Postaviti početnu vrijednost timera**********************************//
  187.     XTmrCtr_SetResetValue(TmrCtrInstancePtr,TmrCtrNumber,RESET_VALUE);
  188.  
  189.     //*****************************************************************************************************//
  190.  
  191.     print("Init FINISHED\r\n");
  192.     return XST_SUCCESS;
  193. }
  194.  
  195. /*
  196.  * Prekidna rutina koja se poziva kada timer generira prekid.
  197.  * Funkcija prima pokazivač na void parametar CallBackRef
  198.  * koji se cast-a na pokazivač tipa XTmrCtr.
  199.  * Ovaj parametar je napravljen kako bi se pokazao način na
  200.  * koji se unutar prekidne rutine može pristupiti timer
  201.  * komponenti i njenim funkcijama.
  202. */
  203. void TimerCounterHandler(void *CallBackRef, u8 TmrCtrNumber)
  204. {
  205.     print("Interrupt Handler!\r\n");
  206.  
  207.     XTmrCtr *InstancePtr = (XTmrCtr *)CallBackRef;
  208.  
  209.     //**********************************************TO DO 13***********************************************//
  210.     //*************************Deklarirati varijable timeMS (int) i uCount (uint)**************************//
  211.  
  212. int timeMS;
  213. uint uCount = 0;
  214.     //************************************************************************************+****************//
  215.  
  216.     //**********************************************TO DO 14***********************************************//
  217.     //*****************Brojati prekide i vrijednost prikazati na LE diodama razvojnog sustava**************//
  218. TimerExpired++;
  219. XGpio_DiscreteWrite(&leds,1,TimerExpired);
  220.     //*****************************************************************************************************//
  221.  
  222.     //**********************************************TO DO 15***********************************************//
  223.     //******Dohvatiti vrijednost brojača, izračunati vrijeme u ms i vrijednost poslati preko UART-a********//
  224. uCount = XTmrCtr_GetValue(InstancePtr,TmrCtrNumber);
  225. timeMS = (uCount+2)/50000;
  226.  
  227.     xil_printf("Elapsed time: %d ms\tcount: %d\r\n", timeMS, uCount);
  228.     //************************************************************************************+****************//
  229. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement