Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*****************************************************************
- program testowy, zadawanie czestotliwosci z potencjometry 100Hz - 5kHz z dokladnoscia do 10 Hz
- ustawianie wypelnienia 5-95 z klawiatury, podobnie z klawiatury start i stop ukladu
- *****************************************************************/
- #include "iodefine.h"
- #include "lcd.h"
- #include "inline.h"
- #include <math.h>
- #define klawiatura_Obszar 0x20000
- #define klawiatura_bufor (* (volatile unsigned char*)(klawiatura_Obszar+1) )
- extern short index; // zmienna udostpeniona z pliku inthandler - przerwanie nadaje wartosc indexu w tablicy sinusy
- unsigned char napis1[] = "TEST";
- char stan_pracy = 0;
- short Fzadane = 8000;
- short wypelnienie = 50;
- short readValue = 0;
- short Azadane = 10;
- short przesuniecie_fazowe = 20;
- short sinusy[500]; //generujemy tablice sinusów
- //deklaracje funkcji z main
- void Ekran_startowy(void);
- void generator_ON(char kanaly);
- void generator_OFF();
- short odczyt_AC(char channel);
- short count;
- short przetwornik;
- void showAC(short value);
- void showAC_def();
- void odczytaj_klawiature();
- void amplituda();
- void stopPWM();
- void startPWM();
- short * gen_tab_sin();
- //------------ wlasciwy program -----------------------------------
- /*
- klawiatura - wyppelnieinie przebiegu
- GRA -> powiazana z czestotliwoscia sygnalu
- GRB > GBA aktywazja trybu PWM wygenerowanie sygnalu
- D(0-100)
- f(10-999)
- 0,10-9,99kHZ
- fo = ft/(GRA+1)PR
- GRB = GRA*D/100
- */
- int main (void)
- {
- gen_tab_sin();
- generator_ON(0x03);
- IniLCD(); //przygotowuje wyswietlaczdo pracy
- //ClrScr - restart wyswietlacza - szybsze niz IniLCD
- //Ekran_startowy();
- //liczniki
- ITU.TSTR.BIT.STR0 =0;
- ITU0.TCR.BYTE = 0xA2;
- ITU0.TIOR.BYTE = 0x88;
- ITU0.TIER.BYTE = 0xF8;
- ITU0.TCNT = 0;
- ITU0.GRA = 3999;
- ITU.TSTR.BIT.STR0 = 1;
- int counter = 0;
- showAC_def();
- while(1) //petla glowna
- {
- if(ITU0.TSR.BIT.IMFA == 1){
- ITU0.TSR.BIT.IMFA = 0;
- counter++;
- if(counter % 10 == 0){
- //PB.DR.BYTE ^= 0x01;//sygnalizacja na LED
- readValue = odczyt_AC(2);
- amplituda(); // przeliczenie amplitudy
- }
- if(counter % 100 == 0){
- //PB.DR.BYTE ^= 0x01;//sygnalizacja na LED
- //short readValue = odczyt_AC(2);
- //showAC(readValue);
- odczytaj_klawiature();
- }
- if(counter % 1000 == 0){
- counter = 0;
- // PB.DR.BYTE ^= 0x01;//sygnalizacja na LED
- }
- }
- }
- }
- void amplituda(){
- if(stan_pracy == 0){
- long variable = readValue;
- GotoXY(1,2);
- Azadane = ((96*variable)/1023) + 2; // odcyt jest od 0-1023-variable ;przeliczenie na zakres 2-98
- bin_bcd(Azadane,0); //TODO nie wyświetla się 98 zadanej, przy < 10 wyświetla się np 06
- }
- }
- void startPWM(){
- long GRA = 2000000/2000 - 1; // f - to bedzie 8khz czestotliwosc generatora stala
- ITU.TSTR.BIT.STR3 =0; //wylaczenie licznika
- ITU.TMDR.BYTE = 0x98; //s 310, USTAWIAMY pwm3 i pwm4 - kanaly 3 i 4
- ITU3.TCR.BYTE = 0xA3; //preskaler - 8
- ITU3.TIOR.BYTE = 0x88; // i/o register -default 0x88
- ITU3.TIER.BYTE = 0xF9; // zablokowanie przerwan oprócz IMIEA, odpowiedzialnego za sprawdzanie IMFA3 (resetowanie w porownaniu z wartoscia GRA)
- ITU3.TCNT = 0; //wartosc poczatkowa timer'a
- ITU3.GRA = GRA;
- short calcualte_GRB = GRA/2;// + Azadane/100 * GRA/2 * (sinusy[index]/1000);//TODO ??
- ITU3.GRB = calcualte_GRB; // wpisz do ITU GRB
- /*
- ITU.TSTR.BIT.STR4 =0; //wylaczenie licznika
- ITU4.TCR.BYTE = 0xA3; //preskaler - 8
- ITU4.TIOR.BYTE = 0x88; // i/o register -default 0x88
- ITU4.TIER.BYTE = 0xF9; // zablokowanie przerwan oprócz IMIEA, odpowiedzialnego za sprawdzanie IMFA3 (resetowanie w porownaniu z wartoscia GRA)
- ITU4.TCNT = 0; //wartosc poczatkowa timer'a
- ITU4.GRA = GRA;
- short calcualte_GRB2 = ITU3.GRB * przesuniecie_fazowe;
- ITU4.GRB = calcualte_GRB2; // wpisz do ITU GRB
- ITU.TSTR.BIT.STR3 = 1;
- */
- ITU.TSTR.BIT.STR3 = 1;
- }
- void stopPWM(){
- ITU.TSTR.BIT.STR3 =0; //wylaczenie licznika
- ITU.TMDR.BYTE = 0x80; //s 310, USTAWIAMY wszystkie pwm na 0
- ITU3.TCR.BYTE = 0xA3; //preskaler - 8
- ITU3.TIOR.BYTE = 0x88; // i/o register -default 0x88
- ITU3.TIER.BYTE = 0xF8; // zablokowanie przerwan
- ITU3.TCNT = 0; //wartosc poczatkowa timer'a
- ITU3.GRB = ITU3.GRA;
- //ITU.TSTR.BIT.STR3 = 1;
- }
- void odczytaj_klawiature(){
- unsigned char stan = klawiatura_bufor&0x7f;
- switch(stan){
- case 0x7e:
- //1 przycisk
- //włączenie generatora
- startPWM();
- //generator_ON(0x02);
- GotoXY(2,1);
- puts("START");
- /*if(wypelnienie < 95){wypelnienie=wypelnienie+1;
- GotoXY(2,11);
- bin_bcd(wypelnienie,2);}*/
- break;
- case 0x7d :
- //2 przycisk
- //wyłączenie generatora
- stopPWM();
- //generator_OFF();
- GotoXY(2,1);
- puts("STOP ");
- /*
- if(wypelnienie > 5){
- wypelnienie=wypelnienie-1;
- GotoXY(2,11);
- bin_bcd(wypelnienie,2);
- }
- */
- break;
- case 0x7b:
- //3 przycisk
- //zwiększenie przesunięcia fazowego
- if(przesuniecie_fazowe < 160){
- przesuniecie_fazowe+=5;
- //wyświetlanie przesunięcia
- GotoXY(1,11);
- bin_bcd(przesuniecie_fazowe,0);
- }
- if(przesuniecie_fazowe == 160)
- { //wyświetlanie osiągnięcia maksymalnej wartości przesunięcia fazowego
- GotoXY(2,12);
- puts("MAX");
- }else
- { //nie jest osiągnięta wartość minimalna więc wpisujemy puste pole
- GotoXY(2,12);
- puts(" ");
- }
- break;
- case 0x77:
- //4 przycisk
- //zmniejszenie przesunięcia fazowego
- if(przesuniecie_fazowe > 20){
- przesuniecie_fazowe-=5;
- //wyświetlanie przesunięcia
- GotoXY(1,11);
- bin_bcd(przesuniecie_fazowe,0);
- }
- if(przesuniecie_fazowe == 20)
- { //wyświetlanie osiągnięcia minimalnej wartości przesunięcia fazowego
- GotoXY(2,12);
- puts("MIN");
- }else
- { //nie jest osiągnięta wartość minimalna więc wpisujemy puste pole
- GotoXY(2,12);
- puts(" ");
- }
- break;
- }
- }
- void showAC(short value){
- GotoXY(2,2);
- bin_bcd(value,3);
- }
- void showAC_def(){
- //funkcja wyświetlająca szablon naszego wyświetlacza
- GotoXY(1,1);
- puts("A=");
- GotoXY(1,8);
- puts("Fi=");
- GotoXY(2,1);
- puts("STOP "); //TODO tutaj wpiszemy początkowy stan pracy ale nie wiem jaki
- GotoXY(1,14);
- puts("st");
- }
- short odczyt_AC(char channel){
- unsigned short result = 0;
- while(AD.ADCSR.BIT.ADF == 0);
- switch((int)channel){
- case 0:
- result = AD.ADDRA;
- break;
- case 1:
- result = AD.ADDRB;
- break;
- case 2:
- result = AD.ADDRC;
- break;
- case 3:
- result = AD.ADDRD;
- break;
- }
- return (result>>6);
- }
- void generator_ON(char kanaly){
- //manual s. 528
- //wlaczenie generatora i ustawienie na jakich kanalach bedzie nadawać
- AD.ADCSR.BIT.ADST = 0;
- AD.ADCSR.BYTE = 0x10 + kanaly;
- AD.ADCSR.BIT.ADST = 1;
- }
- void generator_OFF()
- {
- AD.ADCSR.BIT.ADST = 0;
- }
- //------- ekran startowy po wlaczeniu ukladu
- void Ekran_startowy(void)
- {
- GotoXY(1,1); //x - wiersz (1,2), y - kolumna(1,16)
- putchar('a');
- GotoXY(2,3);
- putchar('b');
- }
- short i = 0;
- short * gen_tab_sin()
- {
- //generowanie tablicy sinusów co 1 stopień od 0 do 360
- //potem przy odczycie bierzemy sinusy[i] / 1000
- for(i; i < 500; ++i)
- {
- sinusy[i] = 1000 * sin((i * 2 * M_PI)/500); //TODO zmienić pi na stałą
- }
- return 1; //todo zmienic na void
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement