Advertisement
Guest User

imp CV3

a guest
Nov 23rd, 2017
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.83 KB | None | 0 0
  1. /***********************************************************************************/
  2. /*                                                                                 */
  3. /* Laboratorni uloha c. 3 z predmetu IMP                                           */
  4. /*                                                                                 */
  5. /* Demonstrace rizeni jasu/barvy RGB LED pomoci PWM signalu generovaneho casovacem */
  6. /*                                                                                 */
  7. /* Reseni vytvoril(a) a odevzdava: (jmeno, login)                                  */
  8. /*                                                                                 */
  9. /***********************************************************************************/
  10.  
  11. #include "MKL05Z4.h"
  12.  
  13. /* Funkce zpozdeni - funkce skonci po nastavenem poctu cyklu */
  14. void delay(long long bound) {
  15.  
  16.   long long i;
  17.   for(i=0;i<bound;i++);
  18. }
  19.  
  20. void MCUInit(void)  // Initialize hodin MCU, zastaveni Watchdogu (COP)
  21. {
  22.     MCG->C4 |= ( MCG_C4_DMX32_MASK | MCG_C4_DRST_DRS(0x01) );
  23.     SIM->CLKDIV1 |= SIM_CLKDIV1_OUTDIV1(0x00);
  24.     SIM->COPC = SIM_COPC_COPT(0x00);
  25. }
  26.  
  27. void SysInit(void)  // Povoleni hodin do modulu, ktere budou pouzivany:
  28. {
  29.     SIM->SOPT2 |= SIM_SOPT2_TPMSRC(0x01); // zdroj hodin do casovace TPM
  30.     SIM->SCGC5 |= SIM_SCGC5_PORTB_MASK; // povoleni hodin do portu B (pro RGB LED)
  31.     SIM->SCGC6 |= SIM_SCGC6_TPM0_MASK; // povoleni hodin do casovace TPM0
  32. }
  33.  
  34. // Inicializace portu s RGB LED jednotlive barevne slozky LED
  35. // budou rizeni prislusnymi kanalovymi vystupy casovace TPM0
  36. // a to konkretne signalem PWM, krery bude casovacem generovan.
  37. // Cisla kanalu pro LED vizte schema laboratorniho pripravku.
  38. void PortInit(void)
  39. {
  40.     PORTB->PCR[9] = PORT_PCR_MUX(0x02);  //  PTB9: TPM0_CH2 -> red
  41.     PORTB->PCR[10] = PORT_PCR_MUX(0x02); // PTB10: TPM0_CH1 -> green
  42.     PORTB->PCR[11] = PORT_PCR_MUX(0x02); // PTB11: TPM0_CH0 -> blue
  43. }
  44.  
  45. // UKOLY K DOPLNENI JSOU OZNACENY CISLOVANYMI KOMENTARI  // 1.   // 2.  ATD.
  46.  
  47. // Doporucena hodnota preteceni casovace
  48. #define OVERFLOW 0xFF
  49.  
  50. void Timer0Init(void)
  51. {
  52.    TPM0_CNT = 0x00;
  53.    TPM0_MOD = 0xFF;
  54.    TPM0_C2SC = 0x28;
  55.    TPM0_SC = 0x0B;
  56.  
  57.  
  58.     // 1. Vynulujte registr citace (Counter) casovace TPM0
  59.  
  60.     // 2. Nastavte hodnotu preteceni do Modulo registru TPM0 (doporucena hodnota
  61.     //    je definovana vyse uvedenou konstantou OVERFLOW, pripadne experimentujte
  62.     //    s jinymi hodnotami v pripustnem rozsahu zmenou hodnoty teto konstanty).
  63.  
  64.     // 3. Nastavte rezim generovani PWM na zvolenem kanalu (n) casovace v ridicim
  65.     //    registru TPM0_CnSC tohoto kanalu, konkretne:
  66.     //    Edge-aligned PWM: High-true pulses (clear Output on match, set Output on reload),
  67.     //    preruseni ani DMA requests nebudou vyuzivany.
  68.  
  69.     // 4. Nastavte konfiguraci casovace v jeho stavovem a ridicim registru (SC):
  70.     //    (up counting mode pro Edge-aligned PWM, Clock Mode Selection (01),
  71.     //    Prescale Factor Selection (Divide by 8), bez vyuziti preruseni ci DMA.
  72.     //    POZN.: !!!!! Budete-li masky v SC registru nastavovat postupne, je NUTNO
  73.     //    toto provadet pri Clock Mode Selection = 00 (tj. v rezimu TPM disabled).
  74.  
  75.     // Dalsi ukoly k doplneni jsou uvedeny v hlavni smycce.
  76. }
  77.  
  78. int main(void)
  79. {
  80.     int increment = 1; // Priznak zvysovani (1) ci snizovani (0) hodnoty compare
  81.     unsigned int compare = 0; // Hodnota pro komparacni registr (urcujici stridu PWM).
  82.  
  83.     MCUInit();
  84.     SysInit();
  85.     PortInit();
  86.     Timer0Init();
  87.  
  88.     while (1) {
  89.         if (increment)  // Zvysuj stridu (compare), dokud neni dosazeno zvolene
  90.                         // maximalni hodnoty (postupne zvysovani jasu LED).
  91.                         // Po negaci priznaku increment bude strida snizovana.
  92.         {
  93.             compare++;
  94.             increment = !(compare >= OVERFLOW);
  95.         }
  96.         else  // Snizuj stridu (compare), dokud neni dosazeno nulove hodnoty
  97.               // (postupne snizovani jasu LED), nasledne bude strida opet zvysovana.
  98.         {
  99.             compare--;
  100.             increment = (compare == 0x00);
  101.         }
  102.  
  103.         TPM0_C2V = compare;
  104.         delay(10000);
  105.  
  106.  
  107.         // 5. Priradte aktualni hodnotu compare do komparacniho registru zvoleneho kanalu
  108.         //    casovace TPM0 (napr. kanal c. 2 pro manipulaci s cervenou slozkou RGB LED).
  109.  
  110.         // 6. LEDku nechte urcity cas svitit dle aktualni hodnoty stridy. Ve skutecnosti
  111.         //    LED velmi rychle blika, pricemz vhodnou frekvenci signalu PWM (danou hodnotou
  112.         //    modulo registru casovace) zajistime, ze blikani neni pro lidske oko patrne
  113.         //    a LEDka se tak jevi, ze sviti intenzitou odpovidajici aktualni stride PWM.
  114.         //    ZDE VYUZIJTE PRIPRAVENOU FUNKCI delay, EXPERIMENTALNE NASTAVTE HODNOTU
  115.         //    CEKANI TAK, ABY BYLY PLYNULE ZMENY JASU LED DOBRE PATRNE.
  116.  
  117.     }
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement