Advertisement
Guest User

Untitled

a guest
Jan 28th, 2020
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.29 KB | None | 0 0
  1. /*****************************************************************
  2. program testowy, zadawanie czestotliwosci z potencjometry 100Hz - 5kHz z dokladnoscia do 10 Hz
  3. ustawianie wypelnienia 5-95 z klawiatury, podobnie z klawiatury start i stop ukladu
  4.  
  5. *****************************************************************/
  6.  
  7. #include "iodefine.h"
  8. #include "lcd.h"
  9. #include "inline.h"
  10. #include <math.h>
  11.  
  12.  
  13. #define klawiatura_Obszar 0x20000
  14. #define klawiatura_bufor (* (volatile unsigned char*)(klawiatura_Obszar+1) )
  15.  
  16. extern short index; // zmienna udostpeniona z pliku inthandler - przerwanie nadaje wartosc indexu w tablicy sinusy
  17.  
  18.  
  19. unsigned char napis1[] = "TEST";
  20. char stan_pracy = 0;
  21. short Fzadane = 8000;
  22. short wypelnienie = 50;
  23. short readValue = 0;
  24. short Azadane = 10;
  25. short przesuniecie_fazowe = 20;
  26. short sinusy[500]; //generujemy tablice sinusów
  27. //deklaracje funkcji z main
  28.  
  29. void Ekran_startowy(void);
  30. void generator_ON(char kanaly);
  31. void generator_OFF();
  32. short odczyt_AC(char channel);
  33. short count;
  34. short przetwornik;
  35. void showAC(short value);
  36. void showAC_def();
  37. void odczytaj_klawiature();
  38. void amplituda();
  39. void stopPWM();
  40. void startPWM();
  41. short * gen_tab_sin();
  42.  
  43.  
  44. //------------ wlasciwy program -----------------------------------
  45.  
  46.  
  47. /*
  48. klawiatura - wyppelnieinie przebiegu
  49. GRA -> powiazana z czestotliwoscia sygnalu
  50. GRB > GBA aktywazja trybu  PWM  wygenerowanie sygnalu
  51. D(0-100)
  52. f(10-999)
  53. 0,10-9,99kHZ
  54. fo = ft/(GRA+1)PR
  55. GRB = GRA*D/100
  56. */
  57.  
  58.  
  59. int main (void)
  60. {
  61.     gen_tab_sin();
  62.     generator_ON(0x03);
  63.     IniLCD(); //przygotowuje wyswietlaczdo pracy
  64.     //ClrScr - restart wyswietlacza - szybsze niz IniLCD
  65.     //Ekran_startowy();
  66.     //liczniki
  67.     ITU.TSTR.BIT.STR0 =0;
  68.     ITU0.TCR.BYTE = 0xA2;
  69.     ITU0.TIOR.BYTE = 0x88;
  70.     ITU0.TIER.BYTE = 0xF8;
  71.     ITU0.TCNT = 0;
  72.     ITU0.GRA = 3999;
  73.     ITU.TSTR.BIT.STR0 = 1;
  74.     int counter = 0;
  75.     showAC_def();
  76.     while(1)                        //petla glowna
  77.     {
  78.        
  79.         if(ITU0.TSR.BIT.IMFA == 1){
  80.             ITU0.TSR.BIT.IMFA = 0;
  81.             counter++;                 
  82.             if(counter % 10 == 0){
  83.                 //PB.DR.BYTE ^= 0x01;//sygnalizacja na LED
  84.                 readValue = odczyt_AC(2);      
  85.                 amplituda(); // przeliczenie amplitudy
  86.             }  
  87.             if(counter % 100 == 0){
  88.                 //PB.DR.BYTE ^= 0x01;//sygnalizacja na LED
  89.                 //short readValue = odczyt_AC(2);
  90.                 //showAC(readValue);           
  91.                 odczytaj_klawiature();         
  92.             }                  
  93.             if(counter % 1000 == 0){
  94.                 counter = 0;   
  95.     //          PB.DR.BYTE ^= 0x01;//sygnalizacja na LED
  96.             }          
  97.         }
  98.     }  
  99. }
  100.  
  101. void amplituda(){
  102.     if(stan_pracy == 0){
  103.         long variable = readValue;
  104.         GotoXY(1,2);
  105.         Azadane = ((96*variable)/1023) + 2; // odcyt jest od 0-1023-variable ;przeliczenie na zakres 2-98
  106.         bin_bcd(Azadane,0);  //TODO nie wyświetla się 98 zadanej, przy < 10 wyświetla się np 06
  107.     }
  108. }
  109.  
  110.  
  111. void startPWM(){   
  112.     long GRA = 2000000/2000 - 1; // f  - to bedzie 8khz czestotliwosc generatora stala
  113.     ITU.TSTR.BIT.STR3 =0; //wylaczenie licznika
  114.     ITU.TMDR.BYTE = 0x98; //s 310, USTAWIAMY pwm3 i pwm4 - kanaly 3 i 4
  115.     ITU3.TCR.BYTE = 0xA3; //preskaler - 8
  116.     ITU3.TIOR.BYTE = 0x88; // i/o register -default 0x88
  117.     ITU3.TIER.BYTE = 0xF9; // zablokowanie przerwan oprócz IMIEA, odpowiedzialnego za sprawdzanie IMFA3 (resetowanie w porownaniu z wartoscia GRA)
  118.     ITU3.TCNT = 0; //wartosc poczatkowa timer'a
  119.     ITU3.GRA = GRA;
  120.     short calcualte_GRB = GRA/2;// + Azadane/100 * GRA/2 * (sinusy[index]/1000);//TODO ??
  121.     ITU3.GRB = calcualte_GRB; // wpisz do ITU GRB
  122.  
  123.     /*
  124.     ITU.TSTR.BIT.STR4 =0; //wylaczenie licznika
  125.     ITU4.TCR.BYTE = 0xA3; //preskaler - 8
  126.     ITU4.TIOR.BYTE = 0x88; // i/o register -default 0x88
  127.     ITU4.TIER.BYTE = 0xF9; // zablokowanie przerwan oprócz IMIEA, odpowiedzialnego za sprawdzanie IMFA3 (resetowanie w porownaniu z wartoscia GRA)
  128.     ITU4.TCNT = 0; //wartosc poczatkowa timer'a
  129.     ITU4.GRA = GRA;
  130.     short calcualte_GRB2 = ITU3.GRB * przesuniecie_fazowe;
  131.     ITU4.GRB = calcualte_GRB2; // wpisz do ITU GRB
  132.  
  133.        
  134.  
  135.     ITU.TSTR.BIT.STR3 = 1;
  136.     */
  137.     ITU.TSTR.BIT.STR3 = 1;
  138. }
  139.  
  140. void stopPWM(){
  141.     ITU.TSTR.BIT.STR3 =0; //wylaczenie licznika        
  142.     ITU.TMDR.BYTE = 0x80; //s 310, USTAWIAMY wszystkie pwm na 0
  143.     ITU3.TCR.BYTE = 0xA3; //preskaler - 8
  144.     ITU3.TIOR.BYTE = 0x88; // i/o register -default 0x88
  145.     ITU3.TIER.BYTE = 0xF8; // zablokowanie przerwan
  146.     ITU3.TCNT = 0; //wartosc poczatkowa timer'a
  147.     ITU3.GRB = ITU3.GRA;
  148.     //ITU.TSTR.BIT.STR3 = 1;   
  149. }
  150.  
  151. void odczytaj_klawiature(){
  152.     unsigned char stan = klawiatura_bufor&0x7f;
  153.     switch(stan){
  154.         case 0x7e:
  155.         //1 przycisk           
  156.         //włączenie generatora
  157.         startPWM();
  158.         //generator_ON(0x02);      
  159.         GotoXY(2,1);
  160.         puts("START");         
  161.                 /*if(wypelnienie < 95){wypelnienie=wypelnienie+1;
  162.                 GotoXY(2,11);
  163.                 bin_bcd(wypelnienie,2);}*/         
  164.             break; 
  165.         case 0x7d :
  166.         //2 przycisk
  167.         //wyłączenie generatora
  168.         stopPWM();
  169.         //generator_OFF();
  170.         GotoXY(2,1);
  171.         puts("STOP ");
  172.             /*
  173.             if(wypelnienie > 5){
  174.                 wypelnienie=wypelnienie-1;
  175.                 GotoXY(2,11);
  176.                 bin_bcd(wypelnienie,2);
  177.             }
  178.             */
  179.             break;
  180.         case 0x7b:
  181.         //3 przycisk
  182.         //zwiększenie przesunięcia fazowego
  183.             if(przesuniecie_fazowe < 160){
  184.                 przesuniecie_fazowe+=5;
  185.                 //wyświetlanie przesunięcia
  186.                 GotoXY(1,11);
  187.                 bin_bcd(przesuniecie_fazowe,0);
  188.             }
  189.             if(przesuniecie_fazowe == 160)
  190.             { //wyświetlanie osiągnięcia maksymalnej wartości przesunięcia fazowego  
  191.                 GotoXY(2,12);
  192.                 puts("MAX");
  193.             }else
  194.             { //nie jest osiągnięta wartość minimalna więc wpisujemy puste pole
  195.                 GotoXY(2,12);
  196.                 puts("   ");
  197.             }
  198.             break;
  199.         case 0x77:
  200.         //4 przycisk
  201.         //zmniejszenie przesunięcia fazowego
  202.             if(przesuniecie_fazowe > 20){
  203.                 przesuniecie_fazowe-=5;
  204.                 //wyświetlanie przesunięcia
  205.                 GotoXY(1,11);
  206.                 bin_bcd(przesuniecie_fazowe,0);
  207.             }
  208.             if(przesuniecie_fazowe == 20)
  209.             { //wyświetlanie osiągnięcia minimalnej wartości przesunięcia fazowego  
  210.                 GotoXY(2,12);
  211.                 puts("MIN");
  212.             }else
  213.             { //nie jest osiągnięta wartość minimalna więc wpisujemy puste pole
  214.                 GotoXY(2,12);
  215.                 puts("   ");
  216.             }
  217.             break; 
  218.     }
  219. }
  220.  
  221. void showAC(short value){
  222.     GotoXY(2,2);
  223.     bin_bcd(value,3);
  224. }
  225.  
  226. void showAC_def(){
  227.     //funkcja wyświetlająca szablon naszego wyświetlacza
  228.     GotoXY(1,1);
  229.     puts("A=");
  230.     GotoXY(1,8);
  231.     puts("Fi=");
  232.     GotoXY(2,1);
  233.     puts("STOP "); //TODO tutaj wpiszemy początkowy stan pracy ale nie wiem jaki
  234.     GotoXY(1,14);
  235.     puts("st");
  236. }
  237.  
  238. short odczyt_AC(char channel){
  239.         unsigned short result = 0;
  240.         while(AD.ADCSR.BIT.ADF == 0);  
  241.         switch((int)channel){
  242.             case 0:
  243.                 result = AD.ADDRA;
  244.                 break; 
  245.             case 1:
  246.                 result = AD.ADDRB;
  247.                 break;
  248.             case 2:
  249.                 result = AD.ADDRC;
  250.                 break;
  251.             case 3:
  252.                 result = AD.ADDRD;
  253.                 break; 
  254.         }          
  255.         return (result>>6);
  256. }
  257.  
  258. void generator_ON(char kanaly){
  259.     //manual s. 528
  260.     //wlaczenie generatora i ustawienie na jakich kanalach bedzie nadawać
  261.     AD.ADCSR.BIT.ADST = 0;
  262.     AD.ADCSR.BYTE = 0x10 + kanaly;
  263.     AD.ADCSR.BIT.ADST = 1; 
  264. }
  265.  
  266. void generator_OFF()
  267. {
  268.     AD.ADCSR.BIT.ADST = 0; 
  269. }
  270.  
  271. //------- ekran startowy po wlaczeniu ukladu
  272.  
  273. void Ekran_startowy(void)
  274. {
  275.     GotoXY(1,1); //x - wiersz (1,2), y - kolumna(1,16)
  276.     putchar('a');
  277.     GotoXY(2,3);
  278.     putchar('b');  
  279. }
  280.  
  281. short i = 0;
  282. short * gen_tab_sin()
  283. {
  284.     //generowanie tablicy sinusów co 1 stopień od 0 do 360
  285.     //potem przy odczycie bierzemy sinusy[i] / 1000
  286.     for(i; i < 500; ++i)
  287.     {
  288.         sinusy[i] = 1000 * sin((i * 2 * M_PI)/500); //TODO zmienić pi na stałą
  289.     }
  290.     return 1; //todo zmienic na void
  291. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement