Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "Uart1.h"
- //#include "DS18B20.h"
- #include "HD44780.h"
- #include "uart.h"
- #define UART_BAUD_RATE 9600 //powoli, mi sie nie spieszy :P
- char linia1[16], linia2[16], linia3[16], linia4[16];
- uint8_t sekunda=0;
- uint8_t Ssekundy=0;
- volatile int szklarnia=-1;
- uint8_t odbierz=0;
- int ekran=0;
- int TEST[10]; // do testow
- int czas_p1=0, czas_p2=0, czas_p3=0, czas_p4=0, czas_p5=0;
- char tmp[5];
- char tmp2[5];
- uint8_t nastawianie=0;
- char temp1[5]="0000";
- char temp2[5]="0000";
- char temp3[5]="0000";
- char temp4[5]="0000";
- char temp5[5]="0000";
- char temp6[5]="0000";
- char temp7[5]="0000";
- char temp8[5]="0000";
- char temp9[5]="0000";
- struct alarm { //struktora pamietajaca ostatnie 10 probek oraz prog ponizej ktorego wlaczy sie alarm
- int prog;
- int pamiec[10];
- } * tab_alarmow[10];
- void odczytaj (char tab[]); //odebranie z uartu 4bajtów temperatury.
- void dopisz (alarm &ktory, char tab[]); // przesuniecie tablicy probek w prawo o 1 i dopisanie nowej probki
- uint8_t spr_alarm(alarm **tab); // sprawdzanie czy spelniony jest warunek alarmu (zwraca numer obiektu alarmujacego)
- uint8_t spr_poprawnosc(char tab[]); //sprawdza czy z transmisjii otrzymano 3bajty z ktorych kazdy jest cyfra
- char* dodaj_przecinek (char tab[]);
- char* alarm_do_string (int &wartosc);
- void nastaw_alarm();
- int main(void)
- {
- //tablica wskaźników na strukturę alarmów
- alarm pierwszy, drugi, trzeci, czwarty, piaty, szosty,
- siodmy, osmy, dziewiaty, dziesiaty; //struktury alarmow
- /* PROGI ALARMOWE! */
- pierwszy.prog=0;
- drugi.prog=0;
- trzeci.prog=200;
- czwarty.prog=0;
- piaty.prog=0;
- szosty.prog=0;
- siodmy.prog=0;
- osmy.prog=0;
- dziewiaty.prog=0;
- dziesiaty.prog=0;
- /* KONIEC PROGOW ALARMOWYCH */
- /* PRZYPISANIE ADRESOW ALARMOW DO TABLICY WSKAZNIKOW */
- tab_alarmow[0] = &pierwszy;
- tab_alarmow[1] = &drugi;
- tab_alarmow[2] = &trzeci;
- tab_alarmow[3] = &czwarty;
- tab_alarmow[4] = &piaty;
- tab_alarmow[5] = &szosty;
- tab_alarmow[6] = &siodmy;
- tab_alarmow[7] = &osmy;
- tab_alarmow[8] = &dziewiaty;
- tab_alarmow[9] = &dziesiaty;
- DDRB=0x00;
- PORTB=0xFF;
- DDRD |= _BV(6);
- DDRD |= _BV(5);
- PORTD |= _BV(6);
- PORTD |= _BV(5);
- DDRD |= _BV(4);
- PORTD |= _BV(4);
- /*
- * Initialize UART library, pass baudrate and AVR cpu clock
- * with the macro
- * UART_BAUD_SELECT() (normal speed mode )
- * or
- * UART_BAUD_SELECT_DOUBLE_SPEED() ( double speed mode)
- */
- uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
- sei(); // Zezwolenie globalne na przerwania
- //8-bit timer dla wyswietlacza
- TCCR0 |= (1 << CS00) | (1 << CS02); // preskaler /1024 (do 255 zliczy w 32ms przy 8MHz)
- TIMSK |= (1 << TOIE0); // przerwanie od przepelnienia
- /*
- ADMUX |=(1<<REFS0)|(1<<REFS1); // odniesienie wewnetrzne 2.56V
- ADMUX |= (1<<MUX1)|(1<<MUX2);
- ADCSRA |=(1<<ADPS0)|(1<<ADPS1)|(1<<ADPS2);
- ADCSRA |=(1<<ADEN)|(1<<ADSC)|(1<<ADATE);
- */
- //do testow
- for(int i=0; i<10; i++)
- {
- trzeci.pamiec[i]=190;
- }
- LCD_Initalize(); // uruchomienie LCD 4x16 (zmodyfikowana biblioteka!)
- uint8_t tmp_sek=0;
- tmp_sek=Ssekundy; //poprzednia wartosc zmiennej Ssekundy -> (co 3 sekundy jest inkrementowana)
- for(;;)
- {
- //do testow
- for(int i=0; i<10;i++)
- {
- TEST[i]=trzeci.pamiec[i];
- }
- if(odbierz==0 && tmp_sek!=Ssekundy)
- {
- tmp_sek=Ssekundy;
- switch (szklarnia) // sekwencja nadania prawa do nadawania, odczyt, sprawdzenie poprawnosci, dopisanie do pamieci
- {
- case 0:
- odbierz=1;
- uart_putc('a');
- _delay_ms(50);
- odczytaj(temp1);
- if(spr_poprawnosc(temp1)==1)
- dopisz(pierwszy, temp1);
- PORTD &=~_BV(5);
- break;
- case 1:
- odbierz=2;
- uart_putc('b');
- _delay_ms(50);
- odczytaj(temp2);
- if(spr_poprawnosc(temp2)==1)
- dopisz(drugi, temp2);
- PORTD |=_BV(5);
- break;
- case 2:
- odbierz=3;
- uart_putc('c');
- _delay_ms(50);
- odczytaj(temp3);
- if(spr_poprawnosc(temp3)==1)
- dopisz(trzeci, temp3);
- break;
- case 3:
- odbierz=4;
- uart_putc('d');
- _delay_ms(50);
- odczytaj(temp4);
- if(spr_poprawnosc(temp4)==1)
- dopisz(czwarty, temp4);
- break;
- case 4:
- odbierz=5;
- uart_putc('e');
- _delay_ms(50);
- odczytaj(temp5);
- if(spr_poprawnosc(temp5)==1)
- dopisz(piaty, temp5);
- break;
- case 5:
- odbierz=6;
- uart_putc('f');
- _delay_ms(50);
- odczytaj(temp6);
- if(spr_poprawnosc(temp6)==1)
- dopisz(szosty, temp6);
- break;
- case 6:
- odbierz=7;
- uart_putc('g');
- _delay_ms(50);
- odczytaj(temp7);
- if(spr_poprawnosc(temp7)==1)
- dopisz(siodmy, temp7);
- break;
- case 7:
- odbierz=8;
- uart_putc('h');
- _delay_ms(50);
- odczytaj(temp8);
- if(spr_poprawnosc(temp8)==1)
- dopisz(osmy, temp8);
- break;
- case 8:
- odbierz=9;
- uart_putc('i');
- _delay_ms(50);
- odczytaj(temp9);
- if(spr_poprawnosc(temp9)==1)
- dopisz(dziewiaty, temp9);
- break;
- }//koniec switcha
- }//koniec ifa
- if(spr_alarm(tab_alarmow)!=0) //zwraca nr obiektu z alarmem
- {
- PORTD &=~_BV(6);
- }
- else
- PORTD |=_BV(6);
- }//koniec petli glownej
- }//koniec maiana
- ISR (TIMER0_OVF_vect)
- {
- //PRZYCISKI DO PRZESUWANIA EKRANU RECZNIE 1
- if(bit_is_set(PINB,2))
- czas_p1=0;
- if(bit_is_clear(PINB,2)) // przesuwanie w gore
- {
- czas_p1++;
- if(czas_p1>8)
- {
- ekran++;
- if(ekran>8)
- ekran=0;
- Ssekundy=0;
- czas_p1=0;
- }
- }
- //PRZYCISKI DO PRZESUWANIA EKRANU RECZNIE 2
- if(bit_is_set(PINB,1))
- czas_p2=0;
- if(bit_is_clear(PINB,1)) // przesuwanie w dol
- {
- czas_p2++;
- if(czas_p2>8)
- {
- ekran--;
- if(ekran<0)
- ekran=8;
- Ssekundy=0;
- czas_p2=0;
- }
- }
- // SRODKOWY PRZYCISK DO USTAWIANIA ALARMOW
- if(bit_is_set(PINB,3))
- czas_p3=0;
- if(bit_is_clear(PINB,3)) // przesuwanie w dol
- {
- czas_p3++;
- if(czas_p3>8)
- {
- czas_p3=0;
- }
- }
- sekunda++;
- if(sekunda==32)
- {
- sekunda=0;
- Ssekundy++;
- szklarnia++;
- if(szklarnia==9)
- szklarnia=0;
- if(Ssekundy==3)
- {
- Ssekundy=0;
- ekran++; // ma byc ++
- if(ekran>8)
- ekran=0;
- }
- }
- if(nastawianie==0)
- {
- switch (ekran)
- {
- case 0:
- LCD_Clear();
- LCD_GoTo(0,0);
- sprintf(linia1,"dom: %s",dodaj_przecinek(temp1));
- LCD_WriteText(linia1);
- LCD_GoTo(0,1);
- sprintf(linia2,"mnozarka: %s",dodaj_przecinek(temp2));
- LCD_WriteText(linia2);
- LCD_GoTo(0,2);
- sprintf(linia3,"dmuchana: %s",dodaj_przecinek(temp3));
- LCD_WriteText(linia3);
- LCD_GoTo(0,3);
- sprintf(linia4,"pierwsza 6: %s",dodaj_przecinek(temp4));
- //sprintf(linia4, "t: %d %d %d %d",TEST[0],TEST[1],TEST[2],TEST[3]);
- LCD_WriteText(linia4);
- break;
- case 1:
- LCD_Clear();
- LCD_GoTo(0,0);
- sprintf(linia1,"mnozarka: %s",dodaj_przecinek(temp2));
- LCD_WriteText(linia1);
- LCD_GoTo(0,1);
- sprintf(linia2,"dmuchana: %s",dodaj_przecinek(temp3));
- LCD_WriteText(linia2);
- LCD_GoTo(0,2);
- sprintf(linia3,"pierwsza 6: %s",dodaj_przecinek(temp4));
- LCD_WriteText(linia3);
- LCD_GoTo(0,3);
- sprintf(linia4,"druga 6: %s",dodaj_przecinek(temp5));
- LCD_WriteText(linia4);
- break;
- case 2:
- LCD_Clear();
- LCD_GoTo(0,0);
- sprintf(linia1,"dmuchana: %s",dodaj_przecinek(temp3));
- LCD_WriteText(linia1);
- LCD_GoTo(0,1);
- sprintf(linia2,"pierwsza 6: %s",dodaj_przecinek(temp4));
- LCD_WriteText(linia2);
- LCD_GoTo(0,2);
- sprintf(linia3,"druga 6: %s",dodaj_przecinek(temp5));
- LCD_WriteText(linia3);
- LCD_GoTo(0,3);
- sprintf(linia4,"dziewiatka: %s",dodaj_przecinek(temp6));
- LCD_WriteText(linia4);
- break;
- case 3:
- LCD_Clear();
- LCD_GoTo(0,0);
- sprintf(linia1,"pierwsza 6: %s",dodaj_przecinek(temp4));
- LCD_WriteText(linia1);
- LCD_GoTo(0,1);
- sprintf(linia2,"druga 6: %s",dodaj_przecinek(temp5));
- LCD_WriteText(linia2);
- LCD_GoTo(0,2);
- sprintf(linia3,"dziewiatka: %s",dodaj_przecinek(temp6));
- LCD_WriteText(linia3);
- LCD_GoTo(0,3);
- sprintf(linia4,"sliwka: %s",dodaj_przecinek(temp7));
- LCD_WriteText(linia4);
- break;
- case 4:
- LCD_Clear();
- LCD_GoTo(0,0);
- sprintf(linia1,"druga 6: %s",dodaj_przecinek(temp5));
- LCD_WriteText(linia1);
- LCD_GoTo(0,1);
- sprintf(linia2,"dziewiatka: %s",dodaj_przecinek(temp6));
- LCD_WriteText(linia2);
- LCD_GoTo(0,2);
- sprintf(linia3,"sliwka: %s",dodaj_przecinek(temp7));
- LCD_WriteText(linia3);
- LCD_GoTo(0,3);
- sprintf(linia4,"dol: %s",dodaj_przecinek(temp8));
- LCD_WriteText(linia4);
- break;
- case 5:
- LCD_Clear();
- LCD_GoTo(0,0);
- sprintf(linia1,"dziewiatka: %s",dodaj_przecinek(temp6));
- LCD_WriteText(linia1);
- LCD_GoTo(0,1);
- sprintf(linia2,"sliwka: %s",dodaj_przecinek(temp7));
- LCD_WriteText(linia2);
- LCD_GoTo(0,2);
- sprintf(linia3,"dol: %s",dodaj_przecinek(temp8));
- LCD_WriteText(linia3);
- LCD_GoTo(0,3);
- sprintf(linia4,"piec: %s",dodaj_przecinek(temp9));
- LCD_WriteText(linia4);
- break;
- case 6:
- LCD_Clear();
- LCD_GoTo(0,0);
- sprintf(linia1,"sliwka: %s",dodaj_przecinek(temp7));
- LCD_WriteText(linia1);
- LCD_GoTo(0,1);
- sprintf(linia2,"dol: %s",dodaj_przecinek(temp8));
- LCD_WriteText(linia2);
- LCD_GoTo(0,2);
- sprintf(linia3,"piec: %s",dodaj_przecinek(temp9));
- LCD_WriteText(linia3);
- LCD_GoTo(0,3);
- sprintf(linia4,"dom: %s",dodaj_przecinek(temp1));
- LCD_WriteText(linia4);
- break;
- case 7:
- LCD_Clear();
- LCD_GoTo(0,0);
- sprintf(linia1,"dol: %s",dodaj_przecinek(temp8));
- LCD_WriteText(linia1);
- LCD_GoTo(0,1);
- sprintf(linia2,"piec: %s",dodaj_przecinek(temp9));
- LCD_WriteText(linia2);
- LCD_GoTo(0,2);
- sprintf(linia3,"dom: %s",dodaj_przecinek(temp1));
- LCD_WriteText(linia3);
- LCD_GoTo(0,3);
- sprintf(linia4,"mnozarka: %s",dodaj_przecinek(temp2));
- LCD_WriteText(linia4);
- break;
- case 8:
- LCD_Clear();
- LCD_GoTo(0,0);
- sprintf(linia1,"piec: %s",dodaj_przecinek(temp9));
- LCD_WriteText(linia1);
- LCD_GoTo(0,1);
- sprintf(linia2,"dom: %s",dodaj_przecinek(temp1));
- LCD_WriteText(linia2);
- LCD_GoTo(0,2);
- sprintf(linia3,"mnozarka: %s",dodaj_przecinek(temp2));
- LCD_WriteText(linia3);
- LCD_GoTo(0,3);
- sprintf(linia4,"dmuchana: %s",dodaj_przecinek(temp3));
- LCD_WriteText(linia4);
- break;
- }
- }
- else
- {
- char chuj[5];
- strcpy(chuj, alarm_do_string(tab_alarmow[1]->prog));
- //tu wyswietlanie nastawiania.
- }
- }
- uint8_t spr_poprawnosc(char tab[])
- {
- if(isdigit(tab[0])&&isdigit(tab[1])&&isdigit(tab[2]))
- {
- return 1;
- }
- else
- return 0;
- }
- void odczytaj (char tab[])
- {
- unsigned int c=0;
- for(int i=0; i<4; i++)
- {
- c = uart_getc();
- tab[i]=c;
- if(i==3)
- {
- tab[4]='\0';
- odbierz=0;
- break;
- }
- }
- }
- void dopisz (alarm &ktory, char tab[])
- {
- int pom=atoi(tab);
- for(int i=8; i>=0; i--)
- {
- ktory.pamiec[i+1]=ktory.pamiec[i];// przesuniecie tablicy w prawo o 1
- }
- ktory.pamiec[0]=pom; // wpisnie na miejsce 0 nowej temperatury
- }
- uint8_t spr_alarm(alarm **tab)
- {
- PORTD |=_BV(4);
- uint8_t wynik=0;
- uint8_t pom=0;
- for(int i=2; i<3; i++)// tu popraw po testach
- {
- for(int j=0; j<10; j++)
- {
- if(tab[i]->pamiec[j]<tab[i]->prog)
- {
- pom++;
- PORTD &=~_BV(4);
- }
- }
- if(pom>8)
- {
- wynik=i+1;
- }
- pom=0;
- }
- return wynik;
- }
- char* dodaj_przecinek(char tab[])
- {
- char pom;
- for(int i=0; i<5; i++)
- {
- tmp[i]=tab[i];
- }
- if(tab[0]!='0')
- {
- pom=tab[2];
- tmp[2]='.';
- tmp[3]=pom;
- tmp[4]='\0';
- return tmp; //tmp jest globalne, zwracamy adres tej tablicy
- }
- else
- {
- tmp[0]=tmp[1];
- tmp[1]=tmp[2];
- tmp[2]='.';
- return tmp;
- }
- }
- char* alarm_do_string (int &wartosc)
- {
- char aaa[5]="abcd";
- strcpy(tmp2, aaa);
- return tmp2;
- }
- /*
- if(bit_is_set(PINB,2))
- czas2=0;
- if(bit_is_clear(PINB,2))
- {
- czas2++;
- if(czas2>1000)
- {
- uart_putc('b');
- sprintf(linia2,"Wyslano b");
- odbierz=1;
- czas2=0;
- }
- }*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement