Advertisement
filip710

286/3 svaje 2 i 10s

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