Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define F_CPU 14745600UL
- #define rozmiar_tablicy_z_probkami 200
- #include <avr/io.h> //biblioteka wejscia - wyjscia
- #include <avr/interrupt.h> // przerwania
- #include <util/delay.h> // delaye
- #include <avr/pgmspace.h> // zapis w pamięci FLASH
- #include "uart/uart.h" // biblioteka Antystatycznego do obsługi transmisji UART
- #include <stdlib.h> //biblioteka potrzebna do zamiana stringow na inty
- #include "flash2/SPI.h"
- #include "flash2/AT45DB011.h"
- void start_timer_0(void);
- void start_timer_1(uint8_t prescaler);
- void stop_timer_1(void);
- volatile uint8_t timer0_ovf;
- volatile uint8_t liczba_zboczy;
- volatile uint8_t buffer_count;
- volatile uint8_t error_lvl; // 1-przepelnienie licznikow
- volatile uint32_t timer_overflow;
- volatile uint32_t total_ticks;
- volatile uint32_t wyniki[rozmiar_tablicy_z_probkami];
- volatile uint8_t zadany_preskaler=0;
- char char_buffer[10];
- int page_number=0;
- void setup(void)
- {
- MCUCR =0xc0; // Eneble external SRAM with wait state
- SPI_init(); // Initialize SPI
- AT45DB011_init(); // Initialize DataFlash
- }
- // Funckja odpowiedzialana za wyswietlenie napisu powitalnego
- void napis_powitalny(void)
- {
- uart_put_string_P(0, (PSTR("\r\nLicznik \r\nWykonanie: Mariusz Karasek i Mateusz Warowny\r\nData: Czerwiec 2016")));
- _delay_ms(100);
- }// koniec funckji ekran powitalny
- //funkcja przyjmuje liczbe probek do pomiaru
- long int przyjmij_liczbe_probek()
- {
- //zeruje nam tablice z probkami dla nowego pomiaru
- //for(int x=0; x<liczba_zlapanych_zboczy; x++)
- //wyniki[x]=0;
- //zeruje liczbe zboczy dla nowego pomiaru
- //liczba_zboczy=0;
- //wskaznik_przepelnienia=0;
- //wskaznik_przepelnienia1=0;
- char tablica[20]; //tworzymy tablice na znaki odczytane z UART
- uart_put_string_P(0, (PSTR("\r\n\r\nPodaj liczbe probek:")));
- //petla ktora nieskonczenie bedzie powtarzac proszenie o probki w przypadku podania niepoprawnej wartosci
- while(1)
- {
- //zerujemy pierwszy znak - jesli sie zmieni (podano liczbe probek) to wyjdziemy z petli
- tablica[0]=0;
- long int liczba_probek=0;
- int wylacznik=1;
- //petla oczekujaca danych nadeslanych z komputera
- while(wylacznik)
- {
- uart_get_string(0,tablica); // odebrane dane zapisujemy w tablica
- //jesli odebrano wartosc (zmieni się 1 znak)
- if(tablica[0]!=0)
- {
- //zmieniamy stringa na int i sprawdzamy czy >0 (dla liter =0, dla cyfr>0)
- liczba_probek = atol(tablica);//zamienia stringa na long int i zapisujemy w liczba_probek
- wylacznik = 0; //ustawiamy na 0 by wyskoczyc z petli
- }
- _delay_ms(55);
- }//koniec while do pobierania danych z komputera
- //jesli liczba probek jest liczba >0 (dla tekstu tez daje 0)
- if(liczba_probek>0)
- return liczba_probek; //wymuszamy zwracanie long inta bo normalnie zwraca inta
- else
- {
- uart_put_string_P(0, (PSTR("\r\nZła liczba próbek, sprobuj ponownie:\r\n\r\n Podaj liczbę próbek")));
- }//koniec else
- }//koniec while
- }// koniec funkcji do pryzjmowania liczby probek
- unsigned int wybierz_preskaler()
- {
- _delay_ms(50);
- char tablica[20]; //tworzymy tablice na znaki odczytane z UART
- uart_put_string_P(0, (PSTR("\r\n\r\nWybierz preskaler:")));
- uart_put_string_P(0, (PSTR("\r\n1): 1")));
- uart_put_string_P(0, (PSTR("\r\n2): 8")));
- uart_put_string_P(0, (PSTR("\r\n3): 64")));
- uart_put_string_P(0, (PSTR("\r\n4): 256")));
- uart_put_string_P(0, (PSTR("\r\n5): 1024")));
- //petla ktora nieskonczenie bedzie powtarzac proszenie o preskaler w przypadku podania niepoprawnej wartosci
- while(1)
- {
- //zerujemy pierwszy znak - jesli sie zmieni (podano liczbe probek) to wyjdziemy z petli
- tablica[0]=0;
- int preskaler=0;
- int wylacznik=1;
- //petla oczekujaca danych nadeslanych z komputera
- while(wylacznik)
- {
- uart_get_string(0,tablica); // odebrane dane zapisujemy w tablica
- //jesli odebrano wartosc (zmieni się 1 znak)
- if(tablica[0]!=0)
- {
- //zmieniamy stringa na int i sprawdzamy czy >0 (dla liter =0, dla cyfr>0)
- preskaler = atoi(tablica);//zamienia stringa na int i zapisujemy w liczba_probek
- wylacznik = 0; //ustawiamy na 0 by wyskoczyc z petli
- }
- //1, 8, 64, 256, 1024
- if(preskaler==1)
- {
- uart_put_string_P(0, (PSTR("\r\n\r\nWybrano preskaler 1 (1x)")));
- wylacznik = 0; //ustawiamy na 0 by wyskoczyc z petli
- }
- else if(preskaler==2)
- {
- uart_put_string_P(0, (PSTR("\r\n\r\n Wybrano preskaler 2 (8x)")));
- wylacznik = 0; //ustawiamy na 0 by wyskoczyc z petli
- }
- else if(preskaler==3)
- {
- uart_put_string_P(0, (PSTR("\r\n\r\n Wybrano preskaler 3 (64x)")));
- wylacznik = 0; //ustawiamy na 0 by wyskoczyc z petli
- }
- else if(preskaler==4)
- {
- uart_put_string_P(0, (PSTR("\r\n\r\n Wybrano preskaler 4 (256x)")));
- wylacznik = 0; //ustawiamy na 0 by wyskoczyc z petli
- }
- else if(preskaler==5)
- {
- uart_put_string_P(0, (PSTR("\r\n\r\n Wybrano preskaler 5 (1024x)")));
- wylacznik = 0; //ustawiamy na 0 by wyskoczyc z petli
- }
- _delay_ms(40);
- }//koniec while do pobierania danych z komputera
- //jesli liczba probek jest liczba >0 (dla tekstu tez daje 0) oraz mieści się do 5
- if(preskaler>0 && preskaler<6)
- return preskaler; //wymuszamy zwracanie long inta bo normalnie zwraca inta
- else
- {
- uart_put_string_P(0, (PSTR("\r\n Zły preskaler [wyslij cyfre od 1 do 5]:\r\n")));
- uart_put_string_P(0, (PSTR("\r\n\r\nWybierz preskaler:")));
- uart_put_string_P(0, (PSTR("\r\n1): 1")));
- uart_put_string_P(0, (PSTR("\r\n2): 8")));
- uart_put_string_P(0, (PSTR("\r\n3): 64")));
- uart_put_string_P(0, (PSTR("\r\n4): 256")));
- uart_put_string_P(0, (PSTR("\r\n5): 1024")));
- }//koniec else
- }//koniec while
- }// koniec funkcji wybierz preskaler
- // funkcja czeka na napisanie komunikatu start do mikrokontrolera
- int oczekuj_startu(void)
- {
- uart_put_string_P(0, (PSTR("\r\n\r\nwyslij 'start' aby rozpoczac"))); char tablica[20]; //tworzymy tablice na znaki odczytane z RS232
- char wzorzec[20]; //tworzymy tablice z wzorem naszego napisu
- //zapelniamy tablice 0 - bo funkcja get string zapelnia puste miejsca zerami
- for(int i=0; i<19; i++)
- {
- tablica[i]=0;
- wzorzec[i]=0;
- }
- // tworzymy napis w tablicy na ktory ma reagowac nasz program
- wzorzec[0]='s';
- wzorzec[1]='t';
- wzorzec[2]='a';
- wzorzec[3]='r';
- wzorzec[4]='t';
- //do czasu otrzymania napisu start nie wyjdziemy z petli
- while(1)
- {
- tablica[0]=0; //na pierwszt znak dajemy 0 - swiadczy to o braku odczytania napisu
- uart_get_string(0,tablica);
- _delay_ms(50);
- //jesli odczytano cos z komputera - zmieni sie pierwszy znak
- if (tablica[0] != 0)
- {
- int poprawnosc_wpisu=1;
- //porownuje literka po literce czy litery sa zgodne - jesli jeden znak sie nie zgadza to calosc sie nie zgadza
- for(int i=0; i<19; i++)
- {
- if(tablica[i]==wzorzec[i])
- poprawnosc_wpisu=poprawnosc_wpisu*1; //iloczyn wszystkich pomiarow bedzie ktorykolwiek znak sie nie zgodzi
- else
- poprawnosc_wpisu=poprawnosc_wpisu*0;
- }//koniec for
- if(poprawnosc_wpisu)
- return 1;
- else
- return 0;
- _delay_ms(100);
- }//koniec if'a
- }//koniec while
- }//koniec funkcji czekania na start
- //funkcja identyczna jak start, tylko tym razem oczekuje napisu pobierz
- int oczekuj_odbioru(void)
- {
- uart_put_string_P(0, (PSTR("\r\n\r\nAby pobrac dane wyslij 'pobierz'")));
- char tablica[20]; //tworzymy tablice na znaki odczytane z RS232
- char wzorzec[20]; //tworzymy tablice z wzorem naszego napisu
- //zapelniamy tablice 0 - bo funkcja get string zapelnia puste miejsca zerami
- for(int i=0; i<20; i++)
- {
- tablica[i]=0;
- wzorzec[i]=0;
- }//koniec for
- wzorzec[0]='p';
- wzorzec[1]='o';
- wzorzec[2]='b';
- wzorzec[3]='i';
- wzorzec[4]='e';
- wzorzec[5]='r';
- wzorzec[6]='z';
- while(1)
- {
- tablica[0]=0; //na 1 znak dajemy zero - swiadczy to o braku odczytania napisu
- uart_get_string(0,tablica);
- _delay_ms(80);
- if (tablica[0] != 0)
- {
- int poprawnosc_wpisu=1;
- //porownuje literka po literce czy litery sa zgodne
- for(int i=0; i<19; i++)
- {
- if(tablica[i]==wzorzec[i])
- poprawnosc_wpisu=poprawnosc_wpisu*1;
- else
- poprawnosc_wpisu=poprawnosc_wpisu*0;
- }//koniec for
- if(poprawnosc_wpisu)
- return 1;
- else
- return 0;
- _delay_ms(100);
- }//koniec if'a
- }//koniec while
- }//koniec funkcji czekania na zadanie odbior danych
- // funkcja przyjmuje liczbe probek, dokounje pomiaru i wyswietla podsumowanie
- void pomiar_i_wyslanie(long int liczba_probek, unsigned int wybor_preskalera){
- uart_put_string_P(0, (PSTR("\r\n\r\nrobie pomiar dla ")));
- char str[16];
- ltoa(liczba_probek,str,10); //zamienia long int int na tablice znakow by wyslac jako string
- uart_put_string(0, str);
- uart_put_string_P(0, (PSTR(" probek...")));
- buffer_count=0;
- liczba_zboczy=0;
- unsigned int wylacznik=1;
- //tutaj jako argument preskaler
- start_timer_1(wybor_preskalera);
- while (wylacznik) {
- //_delay_ms(50);
- total_ticks = timer_overflow;
- total_ticks<<=16;
- total_ticks+=TCNT1;
- //tutaj w warunku ilosc obrotow
- if(total_ticks>liczba_probek){
- stop_timer_1();
- ltoa(total_ticks,char_buffer,10);
- uart_put_string_P(0, (PSTR("\r\nLiczba obrotow: ")));
- uart_put_string(0,char_buffer);
- wylacznik=0;
- if(buffer_count>=264){
- DATAFLASH_write_mem_buffer_to_page(page_number);
- while (!(DATAFLASH_read_mem_stat() & 0x80)); // wait for DataFlash ready flag
- buffer_count=0;
- page_number++;
- }
- // while(1);
- }
- }
- //DODAC INFORMACJE O PRZEPELNIENIU LICZNIKA CZY TAM ZMIENNEJ?
- wylacznik=1;
- //petla pozwala wyslac po raz drugi poprawny napis start jakby nie wyszlo
- while(wylacznik){
- if(oczekuj_odbioru())
- {
- //kod wyslania pomiaru
- uart_put_string_P(0, (PSTR("\r\n\r\nZebrano nastepujace wyniki pomiaru:")));
- uart_put_string_P(0, (PSTR("\r\nCzestotliwosc zegara: ")));
- str[16];
- ltoa(F_CPU,str,10); //zamienia long int int na tablice znakow
- uart_put_string(0, str);
- uart_put_string_P(0, (PSTR("Hz\r\nPreskaler: ")));
- unsigned int rodzaje_preskalera[6]={0,1,8,64,256,1024};
- uart_put_int(0, rodzaje_preskalera[wybor_preskalera]);
- uart_put_string_P(0, (PSTR("x")));
- uart_put_string_P(0, (PSTR("\r\nzadana liczba impulsow: ")));
- str[16];
- ltoa(liczba_probek,str,10); //zamienia long int int na tablice znakow
- uart_put_string(0, str);
- uart_put_string_P(0, (PSTR(" probek\r\n\r\nZebrane zbocza \r\n\r\n")));
- int p=0; // zmienna sterujaca kolejnych elementwo w tablicy
- char str[16]; //tabelica dla znakow ktorymi beda wysylane liczby po UART
- //wysyla wszyskie kroki pomiarowe
- if(zadany_preskaler==1||zadany_preskaler==2)
- {
- uart_put_string_P(0, (PSTR("(wyniki z tablicy)\r\n\r\n")));
- _delay_ms(70);
- for(int x=1; x<liczba_zboczy; x++)
- {
- if(wyniki[x]>0)
- {
- ltoa(wyniki[x],str,10); //zamienia wynik pomiaru z long int na string i zapisuje w str
- uart_put_string(0, str); //wysyla moment pomiaru
- uart_put_string_P(0, (PSTR("\r\n"))); //nowa linia
- _delay_ms(20);
- p=x;
- }
- }//koniec while dla wysylania zarejestrowanych pomiarow
- }
- else
- {
- uart_put_string_P(0, (PSTR("(wyniki z FLASHA)\r\n\r\n")));
- _delay_ms(50);
- //!!!!! POTEM USUNAC podgladamy page number
- uart_put_string_P(0, (PSTR("PAGE NUMBER: ")));
- ltoa(page_number,str,10); //zamienia wynik pomiaru z long int na string i zapisuje w str
- uart_put_string(0, str); //wysyla moment pomiaru
- uart_put_string_P(0, (PSTR("\r\n\r\n\r\n"))); //nowa linia
- _delay_ms(50);
- //!!!!! POTEM USUNAC page bufer na sztywno 10
- page_number=10;
- for(int x=0; x<=page_number; x++)
- {
- uint32_t wynik=0;
- for (int y=0; y<=264; y++)
- {
- uint32_t data1, data2, data3, data4;
- data1=DATAFLASH_read_mem_main(x,y);
- y++;
- data2=DATAFLASH_read_mem_main(x,y);
- y++;
- data3=DATAFLASH_read_mem_main(x,y);
- y++;
- data4=DATAFLASH_read_mem_main(x,y);
- y++;
- wynik=data1+data2*256+data3*65535;
- //jesli wynik nie jest 0 albo wynik nie osiaga max
- if(wynik>0 && wynik<16776960){
- ltoa(wynik,str,10); //zamienia wynik pomiaru z long int na string i zapisuje w str
- uart_put_string(0, str); //wysyla moment pomiaru
- uart_put_string_P(0, (PSTR("\r\n"))); //nowa linia
- _delay_ms(30);
- }//koniec if dla wyniku >0
- }// for dla przegladania strony
- } //for dla zmiany stron
- }//koniec while dla wysylania zarejestrowanych pomiarow
- uart_put_string_P(0, (PSTR("RAZEM: ")));
- uart_put_int(0,p); //wysla liczbe pomiarow zapisana w zmiennej
- uart_put_string_P(0, (PSTR("\r\n\r\nPomiar zakończony. Dziekujemy")));
- uart_put_string_P(0, (PSTR("\r\n\r\n##################################################")));// margines od kolejnego pomiaru
- _delay_ms(100);
- wylacznik=0;
- }//koniec ifa
- else
- {
- uart_put_string_P(0, (PSTR("\r\n\r\n Niepoprawna komenda, sprobuj ponownie:")));
- _delay_ms(100);
- }//koniec else niepoprawnej komendy
- }//koniec while
- }//koniec funkcji pomiar
- //MAIN
- int main(void)
- {
- //aktywacja uart
- uart_init(0,__UBRR0);
- //aktywacja przerwan
- sei();
- setup();
- //wyswietlenie ekeranu powitalnego
- napis_powitalny();
- //funkcja while zapewniajaca ciaglosc programu - robi pomiar po pomiarze
- // while(1){
- uint32_t ilosc_probek = przyjmij_liczbe_probek();
- char str[16];
- ltoa(ilosc_probek,str,10); //zamienia long int na tablice znakow
- uart_put_string_P(0, (PSTR("\r\nZadana liczba probek to: ")));
- uart_put_string(0, str);
- _delay_ms(100);
- zadany_preskaler = wybierz_preskaler();
- unsigned int wylacznik=1;
- //petla pozwala wyslac po raz drugi poprawny napis start jakby nie wyszlo
- while(wylacznik)
- {
- if(oczekuj_startu())
- {
- pomiar_i_wyslanie(ilosc_probek,zadany_preskaler);
- wylacznik=0;
- }
- else
- {
- uart_put_string_P(0, (PSTR("\r\n\r\n Niepoprawna komenda, sprobuj ponownie:")));
- _delay_ms(100);
- }//koniec else niepoprawnej komendy
- }//koniec while
- // }//koniec nieskocznonego while do powielania pomiarow
- }//koniec main
- void start_timer_0(void){
- TCNT0 = 0;
- TIMSK = (1<<TOIE0);
- //TCCR0B =(1<<CS00);
- }
- void start_timer_1(uint8_t prescaler){
- uint8_t prescaler_values[] = {
- 0, // stop timer
- (1<<CS10), // 1
- (1<<CS11), // 8
- (1<<CS10)|(1<<CS11), // 64
- (1<<CS12), // 256
- (1<<CS12)|(1<<CS10) // 1024
- };
- TCNT1H = 0;
- TCNT1L = 0; // wyzerowanie timera
- TIMSK |= (1<<TOIE1)|(1<<TICIE1); // przerwanie przy przepelnieniu
- //TCCR1B = (1<<ICES1);
- // TCCR1B = prescaler_values[prescaler]; // wystarrowanie timera
- TCCR1B |= (1<<ICES1)|prescaler_values[prescaler];
- }
- void stop_timer_1(void){
- start_timer_1(0);
- }
- ISR(TIMER1_OVF_vect){
- timer_overflow++; // dodaj jedno przepelnienie
- }
- ISR(TIMER1_CAPT_vect){
- if(zadany_preskaler==1||zadany_preskaler==2)
- {
- if(liczba_zboczy<=rozmiar_tablicy_z_probkami)
- {
- wyniki[liczba_zboczy]= (timer_overflow<<16);
- wyniki[liczba_zboczy]+=ICR1;
- liczba_zboczy++;
- }
- }
- else
- {
- DATAFLASH_write_mem_buf(buffer_count,ICR1H);
- buffer_count++;
- DATAFLASH_write_mem_buf(buffer_count,ICR1L);
- buffer_count++;
- DATAFLASH_write_mem_buf(buffer_count,timer_overflow);
- buffer_count++;
- DATAFLASH_write_mem_buf(buffer_count,/*przepełnienia*/0);
- buffer_count++;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement