Advertisement
Guest User

Untitled

a guest
Feb 19th, 2019
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.12 KB | None | 0 0
  1. #include "iodefine.h"
  2. #include "lcd.h"
  3. #include "inline.h"
  4. #define klawiatura_Obszar 0x20000
  5. #define klawiatura_bufor (*(volatile unsigned char*)(klawiatura_Obszar+1))
  6.  
  7. const short sin_table[360] = {
  8. 0x07FF,0x0822,0x0846,0x086A,0x088D,0x08B1,0x08D5,0x08F8,0x091C,0x093F,
  9. 0x0962,0x0985,0x09A8,0x09CB,0x09EE,0x0A11,0x0A33,0x0A55,0x0A77,0x0A99,
  10. 0x0ABB,0x0ADC,0x0AFE,0x0B1F,0x0B3F,0x0B60,0x0B80,0x0BA0,0x0BC0,0x0BDF,
  11. 0x0BFF,0x0C1D,0x0C3C,0x0C5A,0x0C78,0x0C95,0x0CB2,0x0CCF,0x0CEB,0x0D07,
  12. 0x0D23,0x0D3E,0x0D59,0x0D73,0x0D8D,0x0DA7,0x0DC0,0x0DD8,0x0DF0,0x0E08,
  13. 0x0E1F,0x0E36,0x0E4C,0x0E62,0x0E77,0x0E8C,0x0EA0,0x0EB4,0x0EC7,0x0EDA,
  14. 0x0EEC,0x0EFE,0x0F0F,0x0F1F,0x0F2F,0x0F3F,0x0F4D,0x0F5C,0x0F69,0x0F76,
  15. 0x0F83,0x0F8F,0x0F9A,0x0FA5,0x0FAF,0x0FB9,0x0FC2,0x0FCA,0x0FD2,0x0FD9,
  16. 0x0FDF,0x0FE5,0x0FEB,0x0FEF,0x0FF3,0x0FF7,0x0FFA,0x0FFC,0x0FFD,0x0FFE,
  17. 0x0FFF,0x0FFE,0x0FFD,0x0FFC,0x0FFA,0x0FF7,0x0FF3,0x0FEF,0x0FEB,0x0FE5,
  18. 0x0FDF,0x0FD9,0x0FD2,0x0FCA,0x0FC2,0x0FB9,0x0FAF,0x0FA5,0x0F9A,0x0F8F,
  19. 0x0F83,0x0F76,0x0F69,0x0F5C,0x0F4D,0x0F3F,0x0F2F,0x0F1F,0x0F0F,0x0EFE,
  20. 0x0EEC,0x0EDA,0x0EC7,0x0EB4,0x0EA0,0x0E8C,0x0E77,0x0E62,0x0E4C,0x0E36,
  21. 0x0E1F,0x0E08,0x0DF0,0x0DD8,0x0DC0,0x0DA7,0x0D8D,0x0D73,0x0D59,0x0D3E,
  22. 0x0D23,0x0D07,0x0CEB,0x0CCF,0x0CB2,0x0C95,0x0C78,0x0C5A,0x0C3C,0x0C1D,
  23. 0x0BFF,0x0BDF,0x0BC0,0x0BA0,0x0B80,0x0B60,0x0B3F,0x0B1F,0x0AFE,0x0ADC,
  24. 0x0ABB,0x0A99,0x0A77,0x0A55,0x0A33,0x0A11,0x09EE,0x09CB,0x09A8,0x0985,
  25. 0x0962,0x093F,0x091C,0x08F8,0x08D5,0x08B1,0x088D,0x086A,0x0846,0x0822,
  26. 0x07FF,0x07DB,0x07B7,0x0793,0x0770,0x074C,0x0728,0x0705,0x06E1,0x06BE,
  27. 0x069B,0x0678,0x0655,0x0632,0x060F,0x05EC,0x05CA,0x05A8,0x0586,0x0564,
  28. 0x0542,0x0521,0x04FF,0x04DE,0x04BE,0x049D,0x047D,0x045D,0x043D,0x041E,
  29. 0x03FE,0x03E0,0x03C1,0x03A3,0x0385,0x0368,0x034B,0x032E,0x0312,0x02F6,
  30. 0x02DA,0x02BF,0x02A4,0x028A,0x0270,0x0256,0x023D,0x0225,0x020D,0x01F5,
  31. 0x01DE,0x01C7,0x01B1,0x019B,0x0186,0x0171,0x015D,0x0149,0x0136,0x0123,
  32. 0x0111,0x00FF,0x00EE,0x00DE,0x00CE,0x00BE,0x00B0,0x00A1,0x0094,0x0087,
  33. 0x007A,0x006E,0x0063,0x0058,0x004E,0x0044,0x003B,0x0033,0x002B,0x0024,
  34. 0x001E,0x0018,0x0012,0x000E,0x000A,0x0006,0x0003,0x0001,0x0000,0x0000,
  35. 0x0000,0x0000,0x0000,0x0001,0x0003,0x0006,0x000A,0x000E,0x0012,0x0018,
  36. 0x001E,0x0024,0x002B,0x0033,0x003B,0x0044,0x004E,0x0058,0x0063,0x006E,
  37. 0x007A,0x0087,0x0094,0x00A1,0x00B0,0x00BE,0x00CE,0x00DE,0x00EE,0x00FF,
  38. 0x0111,0x0123,0x0136,0x0149,0x015D,0x0171,0x0186,0x019B,0x01B1,0x01C7,
  39. 0x01DE,0x01F5,0x020D,0x0225,0x023D,0x0256,0x0270,0x028A,0x02A4,0x02BF,
  40. 0x02DA,0x02F6,0x0312,0x032E,0x034B,0x0368,0x0385,0x03A3,0x03C1,0x03E0,
  41. 0x03FE,0x041E,0x043D,0x045D,0x047D,0x049D,0x04BE,0x04DE,0x04FF,0x0521,
  42. 0x0542,0x0564,0x0586,0x05A8,0x05CA,0x05EC,0x060F,0x0632,0x0655,0x0678,
  43. 0x069B,0x06BE,0x06E1,0x0705,0x0728,0x074C,0x0770,0x0793,0x07B7,0x07DB
  44. }; // stablicowany sinus
  45.  
  46. void Ekran_startowy(void); // utworzenie funkcji ‘Ekran startowy’
  47.  
  48. short k=0, j=0; // zmienne służące do poruszania się po sinusie
  49. short count; // zmienna służąca do odliczania czasu
  50. short Przetwornik; // zmienna służąca do odczytu numeru kanału
  51. short wy_filtr = 0;// zmienna wyjścia filtru
  52. short reszta = 0; // inicjalizacja zmiennej reszta
  53. unsigned short fi = 5; // ustawienie zmiennej fi
  54. char stan_pracy = 0; // ustawienie stanu pracy
  55. short wypelnienie = 5; // ustawienie wypełnienia
  56. unsigned long xxx; // inicjalizacja zmiennej dla wartości potencjometru
  57.  
  58.  
  59.  
  60. void przerwanie2()
  61. {
  62. // inkrementacja oraz sprawdzanie warunków do tworzenia sinusa
  63. k++;
  64. j++;
  65. if(k>=360)
  66. {
  67. k = 0;
  68. }
  69.  
  70.  
  71. if(j>=360) j -= 360;
  72. // Ustawienie GRB dla obydwóch kanałów ITU
  73. ITU2.GRB= (xxx*(((long)sin_table[j]*2800)/0x0FFF))/100;
  74. ITU3.GRB=(xxx*(((long)sin_table[j]*2800)/0x0FFF))/100;
  75. ITU3.TSR.BIT.IMFA = 0; // Wyzerowanie bitu odpowiedzialnego za obsługę przerwa-nia
  76. }
  77.  
  78. void STOP_PWM3()
  79. {
  80. ITU.TSTR.BIT.STR3=0; // zatrzymanie licznika
  81. ITU3.GRB=ITU3.GRA; // Przepisanie wartości GRB do GRA
  82. ITU3.TIER.BYTE=0x00; // zablokowanie obsługi przerwań
  83. }
  84.  
  85. void STOP_PWM2()
  86. {
  87.  
  88. ITU.TSTR.BIT.STR2=0; // zatrzymanie licznika
  89. ITU2.GRB=ITU2.GRA; // Przepisanie wartości GRB do GRA
  90. ITU2.TIER.BYTE=0x00; // zablokowanie obsługi przerwań
  91. }
  92.  
  93. void odczytaj_klawiature(void)
  94. {
  95. unsigned char sk;
  96. sk = klawiatura_bufor&0x7f; // odczyt klawisza
  97. switch(sk)
  98. {
  99. case 0x7d:stan_pracy=0;GotoXY(2,1);puts("STOP");STOP_PWM3();STOP_PWM2();break;
  100. // Klawisz ustawiający STOP, oraz zatrzymujący filtr
  101. case 0x7e:stan_pracy=1;GotoXY(2,1);puts("START");init_ITU3();init_ITU2();break;
  102. // Klawisz załączający START, inicjalizujący oba kanały
  103.  
  104. case 0x77: //Klawisz zwiększania przesunięcia fazowego
  105. if(fi<175)
  106. {
  107. fi++;
  108. j=k+fi;
  109. GotoXY(1,11);
  110. putfi(fi);
  111. };break;
  112. case 0x7b: // Klawisz zmniejszania przesunięcia fazowego
  113. if(fi>5)
  114. {
  115. fi--;
  116. j=k+fi;
  117. GotoXY(1,11);
  118. putfi(fi);
  119. };break;
  120. }
  121.  
  122. GotoXY(2,9); // Przesunięcie w dane miejsce na wyświetlaczu
  123. // Sprawdzanie warunków granicznych wartości przesunięcia fazowego
  124. if(fi <= 5)
  125. puts("MIN");
  126. else if(fi == 175)
  127. puts("MAX");
  128. else if(fi > 5 && fi <175)
  129. puts(" ");
  130. }
  131.  
  132.  
  133.  
  134.  
  135. void Ekran_startowy(void)
  136. {
  137. GotoXY(1,1); // Przesunięcie się w dane miejsce na wyświetlaczu
  138. puts("A="); // Wypisanie informacji na wyświetlaczu
  139. GotoXY(1,8);
  140. puts("Fi=");
  141. putfi(fi);
  142. GotoXY(1,14);
  143. puts("st");
  144. GotoXY(2,1);
  145. puts("STOP ");
  146. }
  147. void puts(char * c) // wypisanie liczby na ekran
  148. {
  149. do
  150. {
  151. putchar(*c); c++;
  152. }while(*c);
  153. }
  154. void putI(unsigned short i) // wypisanie liczby 0-99
  155. {
  156. putchar(i/10+'0');
  157. putchar(i%10+'0');
  158. }
  159. void putI2(unsigned short i) // wypisanie liczby 0-99,99
  160. {
  161. if(i/1000)putchar((i/1000)+'0');
  162. putchar((i/100)%10+'0');
  163. putchar(',');
  164. putchar((i/10)%10+'0');
  165. putchar(i%10+'0');
  166. }
  167.  
  168. void putfi(unsigned short i) // wypisanie liczby od 0 - 9999
  169. {
  170. if(i/1000)putchar((i/1000)+'0');
  171. putchar((i/100)%10+'0');
  172. putchar((i/10)%10+'0');
  173. putchar(i%10+'0');
  174. }
  175.  
  176. void puthz(unsigned short i)// Wypisanie liczby
  177. {
  178. putchar(i+'0');
  179. }
  180.  
  181. void init_ITU0(void)
  182. {
  183. ITU.TSTR.BIT.STR0 = 0; // zatrzymanie licznika
  184. ITU0.TCR.BYTE = 0xC3; // służy do ustawiania preskalera oraz reakcji na GRA/GRB czy też zbocza w tym przypadku Preskaler jest 4
  185. ITU0.GRB=1999; //Ustawienie GRB na podaną wartość
  186. ITU.TSTR.BIT.STR0 = 1; // start licznika
  187. }
  188.  
  189. void init_ITU3(void)
  190. {
  191. ITU.TMDR.BIT.PWM3 = 1; // załączanie PWM3
  192. ITU.TSTR.BIT.STR3 = 0; // zatrzymanie licznika
  193. ITU3.TCR.BYTE = 0xA1; // Preskaler 2 pod GRB
  194. ITU3.TIER.BYTE = 0xF9; // Obsługuje przerwania
  195. ITU3.TIOR.BYTE= 0xF8; // Reaguje na oba zbocza
  196. ITU3.GRA = 2800; // Przypisanie wartości GRA
  197. }
  198.  
  199. void init_ITU2(void)
  200. {
  201. ITU.TMDR.BIT.PWM2 = 1;
  202. ITU.TSTR.BIT.STR2 = 0; // zatrzymanie licznika
  203. ITU2.TCR.BYTE = 0xA1; Preskaler 2 pod GRB
  204. ITU2.TIER.BYTE = 0xF8; // Przerwania zablokowane
  205. ITU2.TIOR.BYTE= 0xF8; // Reaguje na oba zbocza
  206. ITU2.GRA = 2800; // Przypisanie wartości GRA
  207. ITU.TSTR.BIT.STR2 = 1; // start licznika
  208. ITU.TSTR.BIT.STR3 = 1; // start licznika
  209. }
  210. void init_AC(char l_kanalow)
  211. {
  212. AD.ADCSR.BIT.ADF = 0; // czyści wartości
  213. AD.ADCSR.BIT.ADIE = 0; // obsługa przerwań wyłączona
  214. AD.ADCSR.BIT.SCAN = 1; // w Trybie SCAN MODE
  215. AD.ADCSR.BIT.CKS = 0; // Czyści bit ADST po czasie konwersji 266
  216. AD.ADCSR.BIT.CH = l_kanalow; // liczba kanałów
  217. AD.ADCSR.BIT.ADST = 1; // start
  218. }
  219.  
  220. short odczyt_AC(char nr_kanalu)
  221. {
  222. if(AD.ADCSR.BIT.ADF){
  223. switch(nr_kanalu) // odczytywanie z wejść grupowych
  224. {
  225. case 0: Przetwornik = (AD.ADDRA>>6); break; // Przesunięcie o 6 bito-wo
  226. case 1: Przetwornik = (AD.ADDRB>>6); break;
  227. case 2: Przetwornik = (AD.ADDRC>>6); break;
  228. case 3: Przetwornik = (AD.ADDRD>>6); break;
  229. }
  230. }
  231. return Przetwornik;
  232. }
  233.  
  234. void filtr_cyfrowy(short wejscie, short * wyjscie)
  235. {
  236. long temp,temp1;
  237. temp=(255*(long)*wyjscie) + ((255*(long)reszta)>>8) + wejscie; // odczyt popraw-nej wartości
  238. temp1 = (temp>>8); // przesunięcie o 8 bitowo
  239. *wyjscie = (short)temp1;
  240. reszta = (short)(temp - (temp1<<8));
  241. }
  242.  
  243. void czestotliwosc_zadana()
  244. {
  245. filtr_cyfrowy(odczyt_AC(2),&wy_filtr); // Wywołanie funkcji ‘filtr cyfrowy’ o zada-nych parametrach
  246. xxx =2+(((long)wy_filtr*97) / 1023); // przypisanie wartości z potencjometru
  247. GotoXY(1,3); // przesunięcie się w podane miejsce na wyświetlaczu
  248. putI2(xxx); // wypisanie wartości zmiennej z potencjometru
  249. if(xxx == 0) xxx = 50; // ustawianie wartości potencjometru na 50 % w momencie wartości 0
  250.  
  251. }
  252.  
  253.  
  254. //------------ wlasciwy program -----------------------------------
  255.  
  256. int main (void)
  257. {
  258. IniLCD(); // Inicjalizacja LCD
  259. Ekran_startowy(); // Wykonanie funkcji ‘Ekran Startowy’
  260. init_ITU0(); // Inicjalizacja głównego kanału ITU
  261. init_AC(2); // inicjalizacja dwóch kanałów
  262. // zatrzymanie obu kanałów PWM
  263. STOP_PWM2();
  264. STOP_PWM3();
  265. ITU.TSTR.BIT.STR1=0;
  266.  
  267. while(1) //pętla główna
  268. {
  269. if(ITU0.TSR.BIT.IMFB)
  270. {
  271. ITU0.TSR.BIT.IMFB = 0;
  272. count++; // zwiększanie licznika
  273. czestotliwosc_zadana(); // wywołanie metody
  274. if(count>=1000) // 1sec
  275. {
  276. count = 0; // wyzerowanie licznika
  277. }
  278. if(!(count%100)) // 100msec
  279. {
  280. odczytaj_klawiature(); // odczytywanie klawisza
  281. }
  282. }
  283. }
  284. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement