Advertisement
Alan468

PM lab cyfrowy generator sygnału trapezowego

Jan 20th, 2018
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.67 KB | None | 0 0
  1. // MAIN.C
  2. #include "iodefine.h"
  3. #include "lcd.h"
  4. #include "inline.h"
  5.  
  6. #define KEYObszar 0x20001
  7.  
  8. #define KEY_data (*(volatile unsigned char *)(KEYObszar))
  9.  
  10. #define K1 0x7E
  11. #define K2 0x7D
  12. #define K3 0x7B
  13. #define K4 0x77
  14.  
  15. unsigned char napis_KENER[] = "KENER";
  16. char *stanPracy = "START";
  17. char *stanLicznika = "   ";
  18.  
  19. // Definicje zmiennych globalnych
  20. short i = 0;
  21. short amplituda = 100;
  22. short okres = 50;
  23. long temp;
  24.  
  25. void SetCounters()
  26. {
  27.     AD.ADCSR.BYTE = 0x33 // ustawienie potencjometru
  28.  
  29.     ITU.TSTR.BYTE = 0x01; // wylaczenie licznikow
  30.     ITU.TMDR.BIT.PWM3 = 1; // ustawienie kanalu 3 w fazie zliczania
  31.     ITU.TFCR.BYTE = 0xC2; // ustawienie kanalu 3 jako PWM
  32.  
  33.     ITU3.TCR.BYTE = 0xA0; // czyszczenie sygnalu przez GRA
  34.     ITU3.GRA = 4000; // wartosci poczatkowe
  35.     ITU3.GRB = 4000; //
  36.     ITU3.GRA = 4000; //
  37.     ITU3.TIOR.BIT.IOB = 0;
  38.     ITU.TSTR.BIT.STR3 = 1; // wlaczenie licznka na kanale 3
  39.     ITU3.TIER.BIT.IMIEA = 1; // wlaczenie przerwan na kanale 3
  40.  
  41.     ITU.TSTR.BIT.STR0 = 0; // wylaczenie licznika na kanale 0
  42.     ITU0.TCR.BYTE = 0xA3; // czyszzenie sygnalu przez GRA
  43.     ITU0.GRA = 1000000; // wartosc poczatkowa GRA
  44.     ITU0.TIER.BYTE = 0xF8; // wlaczenie przerwan na kanale 0
  45.     ITU.TSTR.BIT.STR0 = 1; // wlaczenie licznika na kanale 0
  46. }
  47.  
  48. // definicja funkcjido wyswietlania ciagu znakow
  49. void puts(unsigned char *napis)
  50. {
  51.     int x = 0;
  52.     while (napis[x] != '\0')
  53.     {
  54.         putchar(napis[x++]);
  55.     }
  56. }
  57.  
  58. void EkranStartowy(void)
  59. {
  60.     puts("Ekran startowy!");
  61. }
  62.  
  63. void Wyswietlacz()
  64. {
  65.     // Wyswietlanie danych
  66.     // stanPracy stanLicznika
  67. }
  68.  
  69. void PutsINT2(short x); //
  70. void PutsINT3(short x); // Wypisywanie liczb
  71. void PutsINT4(short x); //
  72.  
  73. int main()
  74. {
  75.     InitLCD();
  76.     SetCounters();
  77.  
  78.     while (1)
  79.     {
  80.         if (ITU0.TSR.BIT.IMFA == 1) // sprawdzenie czy licznik 0 skonczyl odliczanie
  81.         {
  82.             if (KEY_data == K1)  // sprawdzenie czy klawisz 1 jest nacisniety
  83.             {
  84.                 stanPracy = "START";// PUTS START
  85.                 ITU3.TIER.BIT.IMIEA = 1; // wlaczenie generatora
  86.             }
  87.             else if (KEY_data == K2)// sprawdzenie czy klawisz 2 jest nacisniety
  88.             {
  89.                 stanPracy = "STOP ";// PUTS STOP
  90.                 ITU3.TIER.BIT.IMIEA = 0; // wylaczenie generatora
  91.             }
  92.  
  93.             if (AD.ADCSR.BIT.ADF == 1) // sprawdzenie czy stan potencjometru zostal zmieniony
  94.             {
  95.                 okres = (AD.ADDRC >> 6) * 51 / 1024; // obliczenie nowej wartosci okresu
  96.                 if (okres == 0)
  97.                 {
  98.                     stanLicznika = "MIN";// PUTS MIN
  99.                 }
  100.                 else if (okres == 50)
  101.                 {
  102.                     stanLicznika = "MAX";// PUTS MAX
  103.                 }
  104.                 else
  105.                 {
  106.                     stanLicznika = "   ";// PUTS ...
  107.                 }
  108.                 AD.ADCSR.BIT.ADF = 0; // ustawienie stanu potencjometru na 0
  109.             }
  110.  
  111.             Wyswietlacz(); // WYSWIETLENIE DANYCH NA WYSWIETLACZU
  112.         }
  113.     }
  114. }
  115.  
  116. ///////////////////////////////////////////////////////////////////////////////////////////////////////
  117. /////////////////////////////////////////////////////////////////////////////////////////////////////// Inthandler.c
  118. ///////////////////////////////////////////////////////////////////////////////////////////////////////
  119.  
  120. void INT_IMIA3(void)
  121. {
  122.     if (i == 50)
  123.     {
  124.         i = 0;
  125.     }
  126.  
  127.     if (okres >= 5)
  128.     {
  129.         if (i < 25)
  130.         {
  131.             temp = (4000 / okres) * (amplituda / 100.0) * i * 2;
  132.         }
  133.         else
  134.         {
  135.             temp = (4000 / okres) * (amplituda/100.0) * (100-i*2);
  136.         }
  137.         if ((temp < (40 * amplituda)) && (temp >= 0))
  138.         {
  139.             if (temp < 2000)
  140.             {
  141.                 ITU3.BRB = temp;
  142.             }
  143.             else
  144.             {
  145.                 ITU3.GRB = temp;
  146.             }
  147.         }
  148.         else
  149.         {
  150.             ITU3.GRB = 40 * amplituda;
  151.             ITU3.BRB = 40 * amplituda;
  152.         }
  153.     }
  154.     else
  155.     {
  156.         ITU3.GRB = 40 * amplituda;
  157.         ITU3.BRB = 40 * amplituda;
  158.     }
  159.     i++;
  160.     ITU3.TSR.BIT.IMFA = 0;
  161. }
  162.  
  163. // Potencjometr -> skalowanie do 5-95 (procent nachylenia) (chyba jest)
  164. // Nachylenie = przeskalowany potencjometr/2
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement