Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "iodefine.h"
- #include "lcd.h"
- #include "inline.h"
- #define klawiatura_Obszar 0x20000
- #define klawiatura_bufor (*(volatile unsigned char*)(klawiatura_Obszar+1))
- const short sin_table[360] = {
- 0x07FF,0x0822,0x0846,0x086A,0x088D,0x08B1,0x08D5,0x08F8,0x091C,0x093F,
- 0x0962,0x0985,0x09A8,0x09CB,0x09EE,0x0A11,0x0A33,0x0A55,0x0A77,0x0A99,
- 0x0ABB,0x0ADC,0x0AFE,0x0B1F,0x0B3F,0x0B60,0x0B80,0x0BA0,0x0BC0,0x0BDF,
- 0x0BFF,0x0C1D,0x0C3C,0x0C5A,0x0C78,0x0C95,0x0CB2,0x0CCF,0x0CEB,0x0D07,
- 0x0D23,0x0D3E,0x0D59,0x0D73,0x0D8D,0x0DA7,0x0DC0,0x0DD8,0x0DF0,0x0E08,
- 0x0E1F,0x0E36,0x0E4C,0x0E62,0x0E77,0x0E8C,0x0EA0,0x0EB4,0x0EC7,0x0EDA,
- 0x0EEC,0x0EFE,0x0F0F,0x0F1F,0x0F2F,0x0F3F,0x0F4D,0x0F5C,0x0F69,0x0F76,
- 0x0F83,0x0F8F,0x0F9A,0x0FA5,0x0FAF,0x0FB9,0x0FC2,0x0FCA,0x0FD2,0x0FD9,
- 0x0FDF,0x0FE5,0x0FEB,0x0FEF,0x0FF3,0x0FF7,0x0FFA,0x0FFC,0x0FFD,0x0FFE,
- 0x0FFF,0x0FFE,0x0FFD,0x0FFC,0x0FFA,0x0FF7,0x0FF3,0x0FEF,0x0FEB,0x0FE5,
- 0x0FDF,0x0FD9,0x0FD2,0x0FCA,0x0FC2,0x0FB9,0x0FAF,0x0FA5,0x0F9A,0x0F8F,
- 0x0F83,0x0F76,0x0F69,0x0F5C,0x0F4D,0x0F3F,0x0F2F,0x0F1F,0x0F0F,0x0EFE,
- 0x0EEC,0x0EDA,0x0EC7,0x0EB4,0x0EA0,0x0E8C,0x0E77,0x0E62,0x0E4C,0x0E36,
- 0x0E1F,0x0E08,0x0DF0,0x0DD8,0x0DC0,0x0DA7,0x0D8D,0x0D73,0x0D59,0x0D3E,
- 0x0D23,0x0D07,0x0CEB,0x0CCF,0x0CB2,0x0C95,0x0C78,0x0C5A,0x0C3C,0x0C1D,
- 0x0BFF,0x0BDF,0x0BC0,0x0BA0,0x0B80,0x0B60,0x0B3F,0x0B1F,0x0AFE,0x0ADC,
- 0x0ABB,0x0A99,0x0A77,0x0A55,0x0A33,0x0A11,0x09EE,0x09CB,0x09A8,0x0985,
- 0x0962,0x093F,0x091C,0x08F8,0x08D5,0x08B1,0x088D,0x086A,0x0846,0x0822,
- 0x07FF,0x07DB,0x07B7,0x0793,0x0770,0x074C,0x0728,0x0705,0x06E1,0x06BE,
- 0x069B,0x0678,0x0655,0x0632,0x060F,0x05EC,0x05CA,0x05A8,0x0586,0x0564,
- 0x0542,0x0521,0x04FF,0x04DE,0x04BE,0x049D,0x047D,0x045D,0x043D,0x041E,
- 0x03FE,0x03E0,0x03C1,0x03A3,0x0385,0x0368,0x034B,0x032E,0x0312,0x02F6,
- 0x02DA,0x02BF,0x02A4,0x028A,0x0270,0x0256,0x023D,0x0225,0x020D,0x01F5,
- 0x01DE,0x01C7,0x01B1,0x019B,0x0186,0x0171,0x015D,0x0149,0x0136,0x0123,
- 0x0111,0x00FF,0x00EE,0x00DE,0x00CE,0x00BE,0x00B0,0x00A1,0x0094,0x0087,
- 0x007A,0x006E,0x0063,0x0058,0x004E,0x0044,0x003B,0x0033,0x002B,0x0024,
- 0x001E,0x0018,0x0012,0x000E,0x000A,0x0006,0x0003,0x0001,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0001,0x0003,0x0006,0x000A,0x000E,0x0012,0x0018,
- 0x001E,0x0024,0x002B,0x0033,0x003B,0x0044,0x004E,0x0058,0x0063,0x006E,
- 0x007A,0x0087,0x0094,0x00A1,0x00B0,0x00BE,0x00CE,0x00DE,0x00EE,0x00FF,
- 0x0111,0x0123,0x0136,0x0149,0x015D,0x0171,0x0186,0x019B,0x01B1,0x01C7,
- 0x01DE,0x01F5,0x020D,0x0225,0x023D,0x0256,0x0270,0x028A,0x02A4,0x02BF,
- 0x02DA,0x02F6,0x0312,0x032E,0x034B,0x0368,0x0385,0x03A3,0x03C1,0x03E0,
- 0x03FE,0x041E,0x043D,0x045D,0x047D,0x049D,0x04BE,0x04DE,0x04FF,0x0521,
- 0x0542,0x0564,0x0586,0x05A8,0x05CA,0x05EC,0x060F,0x0632,0x0655,0x0678,
- 0x069B,0x06BE,0x06E1,0x0705,0x0728,0x074C,0x0770,0x0793,0x07B7,0x07DB
- }; // stablicowany sinus
- void Ekran_startowy(void); // utworzenie funkcji ‘Ekran startowy’
- short k=0, j=0; // zmienne służące do poruszania się po sinusie
- short count; // zmienna służąca do odliczania czasu
- short Przetwornik; // zmienna służąca do odczytu numeru kanału
- short wy_filtr = 0;// zmienna wyjścia filtru
- short reszta = 0; // inicjalizacja zmiennej reszta
- unsigned short fi = 5; // ustawienie zmiennej fi
- char stan_pracy = 0; // ustawienie stanu pracy
- short wypelnienie = 5; // ustawienie wypełnienia
- unsigned long xxx; // inicjalizacja zmiennej dla wartości potencjometru
- void przerwanie2()
- {
- // inkrementacja oraz sprawdzanie warunków do tworzenia sinusa
- k++;
- j++;
- if(k>=360)
- {
- k = 0;
- }
- if(j>=360) j -= 360;
- // Ustawienie GRB dla obydwóch kanałów ITU
- ITU2.GRB= (xxx*(((long)sin_table[j]*2800)/0x0FFF))/100;
- ITU3.GRB=(xxx*(((long)sin_table[j]*2800)/0x0FFF))/100;
- ITU3.TSR.BIT.IMFA = 0; // Wyzerowanie bitu odpowiedzialnego za obsługę przerwa-nia
- }
- void STOP_PWM3()
- {
- ITU.TSTR.BIT.STR3=0; // zatrzymanie licznika
- ITU3.GRB=ITU3.GRA; // Przepisanie wartości GRB do GRA
- ITU3.TIER.BYTE=0x00; // zablokowanie obsługi przerwań
- }
- void STOP_PWM2()
- {
- ITU.TSTR.BIT.STR2=0; // zatrzymanie licznika
- ITU2.GRB=ITU2.GRA; // Przepisanie wartości GRB do GRA
- ITU2.TIER.BYTE=0x00; // zablokowanie obsługi przerwań
- }
- void odczytaj_klawiature(void)
- {
- unsigned char sk;
- sk = klawiatura_bufor&0x7f; // odczyt klawisza
- switch(sk)
- {
- case 0x7d:stan_pracy=0;GotoXY(2,1);puts("STOP");STOP_PWM3();STOP_PWM2();break;
- // Klawisz ustawiający STOP, oraz zatrzymujący filtr
- case 0x7e:stan_pracy=1;GotoXY(2,1);puts("START");init_ITU3();init_ITU2();break;
- // Klawisz załączający START, inicjalizujący oba kanały
- case 0x77: //Klawisz zwiększania przesunięcia fazowego
- if(fi<175)
- {
- fi++;
- j=k+fi;
- GotoXY(1,11);
- putfi(fi);
- };break;
- case 0x7b: // Klawisz zmniejszania przesunięcia fazowego
- if(fi>5)
- {
- fi--;
- j=k+fi;
- GotoXY(1,11);
- putfi(fi);
- };break;
- }
- GotoXY(2,9); // Przesunięcie w dane miejsce na wyświetlaczu
- // Sprawdzanie warunków granicznych wartości przesunięcia fazowego
- if(fi <= 5)
- puts("MIN");
- else if(fi == 175)
- puts("MAX");
- else if(fi > 5 && fi <175)
- puts(" ");
- }
- void Ekran_startowy(void)
- {
- GotoXY(1,1); // Przesunięcie się w dane miejsce na wyświetlaczu
- puts("A="); // Wypisanie informacji na wyświetlaczu
- GotoXY(1,8);
- puts("Fi=");
- putfi(fi);
- GotoXY(1,14);
- puts("st");
- GotoXY(2,1);
- puts("STOP ");
- }
- void puts(char * c) // wypisanie liczby na ekran
- {
- do
- {
- putchar(*c); c++;
- }while(*c);
- }
- void putI(unsigned short i) // wypisanie liczby 0-99
- {
- putchar(i/10+'0');
- putchar(i%10+'0');
- }
- void putI2(unsigned short i) // wypisanie liczby 0-99,99
- {
- if(i/1000)putchar((i/1000)+'0');
- putchar((i/100)%10+'0');
- putchar(',');
- putchar((i/10)%10+'0');
- putchar(i%10+'0');
- }
- void putfi(unsigned short i) // wypisanie liczby od 0 - 9999
- {
- if(i/1000)putchar((i/1000)+'0');
- putchar((i/100)%10+'0');
- putchar((i/10)%10+'0');
- putchar(i%10+'0');
- }
- void puthz(unsigned short i)// Wypisanie liczby
- {
- putchar(i+'0');
- }
- void init_ITU0(void)
- {
- ITU.TSTR.BIT.STR0 = 0; // zatrzymanie licznika
- ITU0.TCR.BYTE = 0xC3; // służy do ustawiania preskalera oraz reakcji na GRA/GRB czy też zbocza w tym przypadku Preskaler jest 4
- ITU0.GRB=1999; //Ustawienie GRB na podaną wartość
- ITU.TSTR.BIT.STR0 = 1; // start licznika
- }
- void init_ITU3(void)
- {
- ITU.TMDR.BIT.PWM3 = 1; // załączanie PWM3
- ITU.TSTR.BIT.STR3 = 0; // zatrzymanie licznika
- ITU3.TCR.BYTE = 0xA1; // Preskaler 2 pod GRB
- ITU3.TIER.BYTE = 0xF9; // Obsługuje przerwania
- ITU3.TIOR.BYTE= 0xF8; // Reaguje na oba zbocza
- ITU3.GRA = 2800; // Przypisanie wartości GRA
- }
- void init_ITU2(void)
- {
- ITU.TMDR.BIT.PWM2 = 1;
- ITU.TSTR.BIT.STR2 = 0; // zatrzymanie licznika
- ITU2.TCR.BYTE = 0xA1; Preskaler 2 pod GRB
- ITU2.TIER.BYTE = 0xF8; // Przerwania zablokowane
- ITU2.TIOR.BYTE= 0xF8; // Reaguje na oba zbocza
- ITU2.GRA = 2800; // Przypisanie wartości GRA
- ITU.TSTR.BIT.STR2 = 1; // start licznika
- ITU.TSTR.BIT.STR3 = 1; // start licznika
- }
- void init_AC(char l_kanalow)
- {
- AD.ADCSR.BIT.ADF = 0; // czyści wartości
- AD.ADCSR.BIT.ADIE = 0; // obsługa przerwań wyłączona
- AD.ADCSR.BIT.SCAN = 1; // w Trybie SCAN MODE
- AD.ADCSR.BIT.CKS = 0; // Czyści bit ADST po czasie konwersji 266
- AD.ADCSR.BIT.CH = l_kanalow; // liczba kanałów
- AD.ADCSR.BIT.ADST = 1; // start
- }
- short odczyt_AC(char nr_kanalu)
- {
- if(AD.ADCSR.BIT.ADF){
- switch(nr_kanalu) // odczytywanie z wejść grupowych
- {
- case 0: Przetwornik = (AD.ADDRA>>6); break; // Przesunięcie o 6 bito-wo
- case 1: Przetwornik = (AD.ADDRB>>6); break;
- case 2: Przetwornik = (AD.ADDRC>>6); break;
- case 3: Przetwornik = (AD.ADDRD>>6); break;
- }
- }
- return Przetwornik;
- }
- void filtr_cyfrowy(short wejscie, short * wyjscie)
- {
- long temp,temp1;
- temp=(255*(long)*wyjscie) + ((255*(long)reszta)>>8) + wejscie; // odczyt popraw-nej wartości
- temp1 = (temp>>8); // przesunięcie o 8 bitowo
- *wyjscie = (short)temp1;
- reszta = (short)(temp - (temp1<<8));
- }
- void czestotliwosc_zadana()
- {
- filtr_cyfrowy(odczyt_AC(2),&wy_filtr); // Wywołanie funkcji ‘filtr cyfrowy’ o zada-nych parametrach
- xxx =2+(((long)wy_filtr*97) / 1023); // przypisanie wartości z potencjometru
- GotoXY(1,3); // przesunięcie się w podane miejsce na wyświetlaczu
- putI2(xxx); // wypisanie wartości zmiennej z potencjometru
- if(xxx == 0) xxx = 50; // ustawianie wartości potencjometru na 50 % w momencie wartości 0
- }
- //------------ wlasciwy program -----------------------------------
- int main (void)
- {
- IniLCD(); // Inicjalizacja LCD
- Ekran_startowy(); // Wykonanie funkcji ‘Ekran Startowy’
- init_ITU0(); // Inicjalizacja głównego kanału ITU
- init_AC(2); // inicjalizacja dwóch kanałów
- // zatrzymanie obu kanałów PWM
- STOP_PWM2();
- STOP_PWM3();
- ITU.TSTR.BIT.STR1=0;
- while(1) //pętla główna
- {
- if(ITU0.TSR.BIT.IMFB)
- {
- ITU0.TSR.BIT.IMFB = 0;
- count++; // zwiększanie licznika
- czestotliwosc_zadana(); // wywołanie metody
- if(count>=1000) // 1sec
- {
- count = 0; // wyzerowanie licznika
- }
- if(!(count%100)) // 100msec
- {
- odczytaj_klawiature(); // odczytywanie klawisza
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement