Już za kilka dni muszę oddać moją pracę dyplomową. Moim problemem jest zbyt duży rozmiar kodu i jeśli nie zoptymalizuje programu to nie umieszczę w nim wszystkich założonych funkcji. Czy ktoś ma pomysł jak zaoszczędzić trochę pamięci patrząc na mój kod? (na program skłąda się jeszcze biblioteka do obsługi wyświetlacza z Nokii)
#define _MAIN_MOD_ 1
#define Histereza 6
#define ILOSC_PROBEK 100
#define ESC 0x02 // PA1
#define BOK 0x04 // PA2
#define GORA 0x08 // PA3
#define ENTER 0x10 // PA4
#define LADOWANIE 0x20 //PA5
#define DIODA 0x40 //PA6
#define BUZZER 0x80 //PA7
// pliki dołączone ( include ) :
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
//#include <stdio.h>
#include <stdlib.h>
#include <STRING.H>
#include "NokiaLCD.h"
// dane :
char klawisz;
unsigned char Str[12];
unsigned char licznik_probek=0;
unsigned char z=0,y=0, x=0;
unsigned int okres=0;
unsigned int liczba_uderzen;
unsigned int tetno;
//unsigned char bufor_tetno=0;
unsigned int prog;
unsigned int wynik[15];
unsigned char tablica[100];
enum Faza
{
wzrost = 0,
spadek = 1
}FazaPrzebiegu;
//Faza FazaPrzebiegu;
// funkcje :
void USART_Init(unsigned char) ;
void USART_Transmit( unsigned char);
//====================
//przetwornik a/c, wejscie analogowe ADC0
char *komunikat[]={" Start"," Alarm "," Opcje"," Wyniki"," Zeruj "," Stop " };
char *komunikat1[]={" Czas "," T.min "," T.max ", "Kalorie"};
char *komunikat2[]={" Czas "," Tetno ","Kalorie"};
char *wyswietl;
struct time
{
unsigned int setne;
unsigned int sekundy;
unsigned int minuty;
unsigned int godziny;
};
struct time czas;
struct time alarm_czas;
struct time bufor_alarm_czas;
/**************************************************************************************************/
void zwieksz_czas()
{
czas.setne++;
if(czas.setne==100)
{
czas.setne=0;
czas.sekundy++;
}
if(czas.sekundy==60)
{
czas.sekundy=0;
czas.minuty++;
}
if(czas.minuty==60)
{
czas.minuty=0;
czas.godziny++;
}
if(czas.godziny==24)
{
czas.godziny=0;
}
}
/**************************************************************************************************/
void wyswietl_czas()
{
LcdGotoXY(3,6);
itoa(czas.godziny/10,&Str[0],10);
itoa(czas.godziny%10,&Str[1],10);
Str[2]=':';
itoa(czas.minuty/10,&Str[3],10);
itoa(czas.minuty%10,&Str[4],10);
Str[5]=':';
itoa(czas.sekundy/10,&Str[6],10);
itoa(czas.sekundy%10,&Str[7],10);
Str[8]=':';
itoa(czas.setne/10,&Str[9],10);
itoa(czas.setne%10,&Str[10],10);
Str[11]=' ';
LcdStr(1,&Str[0]);
}
/**************************************************************************************************/
int main(void)
{
PORTD=0xff;
DDRD=0x13; //ustawienie całego portu D jako wyjscia
ADCSRA=ADCSRA | 1<<ADEN; //włączenie przetwornika
ADMUX=ADMUX | 1<<ADLAR; //w
ADCSRA|= (1<<ADATE)|(1<<ADSC)|(1<< ADPS2)|(1<< ADPS1)|(1<< ADPS0); //wynik równany do lewej - 8 bitów w ADCH i 2 w ADCL,free running mode ,start pojedynczej konwersji (bit zerowany po jej zakończeniu)zegar ADC/128 =62,5kHz
USART_Init(51); //prędkosc transmisji dla 8MHz 9600 BAUD (błąd 0.2%)
TCCR1B|=(1<<CS11)|(1<<CS10); //preskaler XTAL/64=8us
TCNT1=65536-1250; //8us*1250=10ms
TIMSK=1<<TOIE1; //odblokowanie przerwania od timera1
LcdInit();
LcdClear();
DDRA=LADOWANIE;
PORTA=LADOWANIE;
DDRA=0xC0;
PORTA=0x9f; //pa0-4 wejscie, pa5 w stan wysokiej impedancji,p6-7 wjscie stan wysoki
wyswietl=komunikat[z];
sei(); //odblokowanie globalnej maski przerwan
PORTA^=DIODA;
while(1)
{Delay(250);}
while(1)
{
PORTA=PORTA|BUZZER;
klawisz=(~PINA)&0x1E;
if(klawisz!=0) Delay(250);
if((SREG&0x80)==0) //brak pomiaru tetna, globalna maska przerwań wyzerowana
{
if(klawisz==ESC){}
if(klawisz==BOK){}
if(klawisz==GORA)
{
if(++z==5)z=0;
wyswietl=komunikat[z];
}
if(klawisz==ENTER)
{
do
{
klawisz=(~PINA)&0x1E;
if(klawisz!=0) Delay(250);
if(z==0)
{
PORTA^=DIODA;
wyswietl=komunikat[5];
sei();
}
if(z==1)
{
if(klawisz==GORA)if(++y==4)y=0;
wyswietl=komunikat1[y];
if(klawisz==ENTER)
{
if(y==0)//ustawienie czasu
{
do
{
// wyswietl_alarm();
LcdUpdate();
while((klawisz=(~PINA)&0x1E)==0){}
Delay(250);
if(klawisz==BOK)
{
if(++x==5)x=0;
}
if(klawisz==GORA)
{
if(x==0){if(++bufor_alarm_czas.godziny==10)bufor_alarm_czas.godziny=0;}
if(x==1)
{
bufor_alarm_czas.minuty+=10;
if(bufor_alarm_czas.minuty>59)bufor_alarm_czas.minuty=0;
}
if(x==2){if(++bufor_alarm_czas.minuty>59)bufor_alarm_czas.minuty=0;}
if(x==3)
{
bufor_alarm_czas.sekundy+=10;
if(bufor_alarm_czas.sekundy>59)bufor_alarm_czas.sekundy=0;
}
if(x==4) if(++bufor_alarm_czas.sekundy>59)bufor_alarm_czas.sekundy=0;
}
// wyswietl_alarm();
LcdUpdate();
//LcdClear();
}
while(klawisz==GORA || klawisz==BOK);
if(klawisz==ESC)
{
bufor_alarm_czas.godziny=alarm_czas.godziny;
bufor_alarm_czas.minuty=alarm_czas.minuty;
bufor_alarm_czas.sekundy=alarm_czas.sekundy;
}
if(klawisz==ENTER)
{
alarm_czas.godziny=bufor_alarm_czas.godziny;
alarm_czas.minuty=bufor_alarm_czas.minuty;
alarm_czas.sekundy=bufor_alarm_czas.sekundy;
}
LcdClear();
wyswietl=komunikat[z];
x=0;
klawisz=0x00;
}
if(y==1) //ustawienie tetna minimalnego
{
do
{
}
while(klawisz==GORA || klawisz==BOK);
if(klawisz==ESC)
{
}
if(klawisz==ENTER)
{
}
LcdClear();
wyswietl=komunikat[z];
x=0;
klawisz=0x00;
}
if(y==2){}
if(y==3){}
}
}
if(z==2){}
if(z==3){}
if(z==4){}
LcdGotoXY(1,2);
LcdStr(2,wyswietl);
//LcdStr(2,komunikat[z]);
LcdUpdate();
}
while(klawisz!=ESC && (SREG&0x80)==0);
}
LcdGotoXY(1,2);
LcdStr(2,wyswietl);
//LcdStr(2,komunikat[z]);
LcdUpdate();
}
else
{
}
}
return(0);
}
/***********************obsługa przerwania timera 0****************************************************************************/
SIGNAL(SIG_OVERFLOW1)
{
TCNT1=65536-1250; //załadowanie licznika 8us*1250=10ms
tablica[licznik_probek]=ADCH;
USART_Transmit(tablica[licznik_probek]);
for(char i=0;i<ILOSC_PROBEK;i++)
{
prog+=tablica[i];
}
prog/=(ILOSC_PROBEK);
if(++licznik_probek==ILOSC_PROBEK)licznik_probek=0;
okres++;
zwieksz_czas();
if(FazaPrzebiegu==spadek && tablica[licznik_probek]>prog-Histereza && ((licznik_probek!=0 && tablica[licznik_probek-1]<=prog-Histereza) ||(licznik_probek==0 && tablica[ILOSC_PROBEK-1]<=prog-Histereza)))
{
FazaPrzebiegu=wzrost;
tetno=0;
for(char i=0;i<14;i++)
{
wynik[i]=wynik[i+1];
}
wynik[14]=okres;
for(char i=0;i<15;i++)
{
tetno+=wynik[i];
}
tetno=400/(tetno) ; //(6000/15)
liczba_uderzen++;
okres=0;
}
if(tablica[licznik_probek]<prog+Histereza && tablica[licznik_probek-1]>=prog+Histereza && FazaPrzebiegu==wzrost)
{
FazaPrzebiegu=spadek;
}
if(okres==300) //brak pulsu przez 3s lub tetno za niskie
{
okres=0;
tetno=0;
LcdGotoXY(1,4);
LcdStr(2,"000");
for(char i=0;i<15;i++)
{
wynik[i]=0;
}
}
else
{
if(tetno<100 && tetno>29)
{
LcdGotoXY(1,4);
LcdStr(2,"0");
LcdGotoXY(3,4);
LcdStr(2,itoa(tetno,&Str[0],10));
}
else if(tetno<240 && tetno>=100)
{
LcdGotoXY(1,4);
LcdStr(2,itoa(tetno,&Str[0],10));
}
LcdGotoXY(7,4);
LcdStr(2,"/min");
}
LcdGotoXY(3,6);
itoa(czas.godziny/10,&Str[0],10);
itoa(czas.godziny%10,&Str[1],10);
Str[2]=':';
itoa(czas.minuty/10,&Str[3],10);
itoa(czas.minuty%10,&Str[4],10);
Str[5]=':';
itoa(czas.sekundy/10,&Str[6],10);
itoa(czas.sekundy%10,&Str[7],10);
Str[8]=':';
itoa(czas.setne/10,&Str[9],10);
itoa(czas.setne%10,&Str[10],10);
Str[11]=' ';
LcdStr(1,&Str[0]);
LcdGotoXY(8,5);
LcdStr(1,itoa(liczba_uderzen,&Str[0],10));
LcdUpdate();
}
/***************************************************************************************************/
void USART_Init( unsigned char baud )
{
//UBRRH = (unsigned char)(baud>>8);
UBRRL = (unsigned char)baud;
/* Enable receiver and transmitter */
UCSRB = (1<<RXEN)|(1<<TXEN);
/* Set frame format: 8data, 1stop bit Asynchronous mode*/
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}
/***************************************************************************************************/
void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) );
/* Put data into buffer, sends the data */
UDR = data;
}
#define _MAIN_MOD_ 1
#define Histereza 6
#define ILOSC_PROBEK 100
#define ESC 0x02 // PA1
#define BOK 0x04 // PA2
#define GORA 0x08 // PA3
#define ENTER 0x10 // PA4
#define LADOWANIE 0x20 //PA5
#define DIODA 0x40 //PA6
#define BUZZER 0x80 //PA7
// pliki dołączone ( include ) :
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
//#include <stdio.h>
#include <stdlib.h>
#include <STRING.H>
#include "NokiaLCD.h"
// dane :
char klawisz;
unsigned char Str[12];
unsigned char licznik_probek=0;
unsigned char z=0,y=0, x=0;
unsigned int okres=0;
unsigned int liczba_uderzen;
unsigned int tetno;
//unsigned char bufor_tetno=0;
unsigned int prog;
unsigned int wynik[15];
unsigned char tablica[100];
enum Faza
{
wzrost = 0,
spadek = 1
}FazaPrzebiegu;
//Faza FazaPrzebiegu;
// funkcje :
void USART_Init(unsigned char) ;
void USART_Transmit( unsigned char);
//====================
//przetwornik a/c, wejscie analogowe ADC0
char *komunikat[]={" Start"," Alarm "," Opcje"," Wyniki"," Zeruj "," Stop " };
char *komunikat1[]={" Czas "," T.min "," T.max ", "Kalorie"};
char *komunikat2[]={" Czas "," Tetno ","Kalorie"};
char *wyswietl;
struct time
{
unsigned int setne;
unsigned int sekundy;
unsigned int minuty;
unsigned int godziny;
};
struct time czas;
struct time alarm_czas;
struct time bufor_alarm_czas;
/**************************************************************************************************/
void zwieksz_czas()
{
czas.setne++;
if(czas.setne==100)
{
czas.setne=0;
czas.sekundy++;
}
if(czas.sekundy==60)
{
czas.sekundy=0;
czas.minuty++;
}
if(czas.minuty==60)
{
czas.minuty=0;
czas.godziny++;
}
if(czas.godziny==24)
{
czas.godziny=0;
}
}
/**************************************************************************************************/
void wyswietl_czas()
{
LcdGotoXY(3,6);
itoa(czas.godziny/10,&Str[0],10);
itoa(czas.godziny%10,&Str[1],10);
Str[2]=':';
itoa(czas.minuty/10,&Str[3],10);
itoa(czas.minuty%10,&Str[4],10);
Str[5]=':';
itoa(czas.sekundy/10,&Str[6],10);
itoa(czas.sekundy%10,&Str[7],10);
Str[8]=':';
itoa(czas.setne/10,&Str[9],10);
itoa(czas.setne%10,&Str[10],10);
Str[11]=' ';
LcdStr(1,&Str[0]);
}
/**************************************************************************************************/
int main(void)
{
PORTD=0xff;
DDRD=0x13; //ustawienie całego portu D jako wyjscia
ADCSRA=ADCSRA | 1<<ADEN; //włączenie przetwornika
ADMUX=ADMUX | 1<<ADLAR; //w
ADCSRA|= (1<<ADATE)|(1<<ADSC)|(1<< ADPS2)|(1<< ADPS1)|(1<< ADPS0); //wynik równany do lewej - 8 bitów w ADCH i 2 w ADCL,free running mode ,start pojedynczej konwersji (bit zerowany po jej zakończeniu)zegar ADC/128 =62,5kHz
USART_Init(51); //prędkosc transmisji dla 8MHz 9600 BAUD (błąd 0.2%)
TCCR1B|=(1<<CS11)|(1<<CS10); //preskaler XTAL/64=8us
TCNT1=65536-1250; //8us*1250=10ms
TIMSK=1<<TOIE1; //odblokowanie przerwania od timera1
LcdInit();
LcdClear();
DDRA=LADOWANIE;
PORTA=LADOWANIE;
DDRA=0xC0;
PORTA=0x9f; //pa0-4 wejscie, pa5 w stan wysokiej impedancji,p6-7 wjscie stan wysoki
wyswietl=komunikat[z];
sei(); //odblokowanie globalnej maski przerwan
PORTA^=DIODA;
while(1)
{Delay(250);}
while(1)
{
PORTA=PORTA|BUZZER;
klawisz=(~PINA)&0x1E;
if(klawisz!=0) Delay(250);
if((SREG&0x80)==0) //brak pomiaru tetna, globalna maska przerwań wyzerowana
{
if(klawisz==ESC){}
if(klawisz==BOK){}
if(klawisz==GORA)
{
if(++z==5)z=0;
wyswietl=komunikat[z];
}
if(klawisz==ENTER)
{
do
{
klawisz=(~PINA)&0x1E;
if(klawisz!=0) Delay(250);
if(z==0)
{
PORTA^=DIODA;
wyswietl=komunikat[5];
sei();
}
if(z==1)
{
if(klawisz==GORA)if(++y==4)y=0;
wyswietl=komunikat1[y];
if(klawisz==ENTER)
{
if(y==0)//ustawienie czasu
{
do
{
// wyswietl_alarm();
LcdUpdate();
while((klawisz=(~PINA)&0x1E)==0){}
Delay(250);
if(klawisz==BOK)
{
if(++x==5)x=0;
}
if(klawisz==GORA)
{
if(x==0){if(++bufor_alarm_czas.godziny==10)bufor_alarm_czas.godziny=0;}
if(x==1)
{
bufor_alarm_czas.minuty+=10;
if(bufor_alarm_czas.minuty>59)bufor_alarm_czas.minuty=0;
}
if(x==2){if(++bufor_alarm_czas.minuty>59)bufor_alarm_czas.minuty=0;}
if(x==3)
{
bufor_alarm_czas.sekundy+=10;
if(bufor_alarm_czas.sekundy>59)bufor_alarm_czas.sekundy=0;
}
if(x==4) if(++bufor_alarm_czas.sekundy>59)bufor_alarm_czas.sekundy=0;
}
// wyswietl_alarm();
LcdUpdate();
//LcdClear();
}
while(klawisz==GORA || klawisz==BOK);
if(klawisz==ESC)
{
bufor_alarm_czas.godziny=alarm_czas.godziny;
bufor_alarm_czas.minuty=alarm_czas.minuty;
bufor_alarm_czas.sekundy=alarm_czas.sekundy;
}
if(klawisz==ENTER)
{
alarm_czas.godziny=bufor_alarm_czas.godziny;
alarm_czas.minuty=bufor_alarm_czas.minuty;
alarm_czas.sekundy=bufor_alarm_czas.sekundy;
}
LcdClear();
wyswietl=komunikat[z];
x=0;
klawisz=0x00;
}
if(y==1) //ustawienie tetna minimalnego
{
do
{
}
while(klawisz==GORA || klawisz==BOK);
if(klawisz==ESC)
{
}
if(klawisz==ENTER)
{
}
LcdClear();
wyswietl=komunikat[z];
x=0;
klawisz=0x00;
}
if(y==2){}
if(y==3){}
}
}
if(z==2){}
if(z==3){}
if(z==4){}
LcdGotoXY(1,2);
LcdStr(2,wyswietl);
//LcdStr(2,komunikat[z]);
LcdUpdate();
}
while(klawisz!=ESC && (SREG&0x80)==0);
}
LcdGotoXY(1,2);
LcdStr(2,wyswietl);
//LcdStr(2,komunikat[z]);
LcdUpdate();
}
else
{
}
}
return(0);
}
/***********************obsługa przerwania timera 0****************************************************************************/
SIGNAL(SIG_OVERFLOW1)
{
TCNT1=65536-1250; //załadowanie licznika 8us*1250=10ms
tablica[licznik_probek]=ADCH;
USART_Transmit(tablica[licznik_probek]);
for(char i=0;i<ILOSC_PROBEK;i++)
{
prog+=tablica[i];
}
prog/=(ILOSC_PROBEK);
if(++licznik_probek==ILOSC_PROBEK)licznik_probek=0;
okres++;
zwieksz_czas();
if(FazaPrzebiegu==spadek && tablica[licznik_probek]>prog-Histereza && ((licznik_probek!=0 && tablica[licznik_probek-1]<=prog-Histereza) ||(licznik_probek==0 && tablica[ILOSC_PROBEK-1]<=prog-Histereza)))
{
FazaPrzebiegu=wzrost;
tetno=0;
for(char i=0;i<14;i++)
{
wynik[i]=wynik[i+1];
}
wynik[14]=okres;
for(char i=0;i<15;i++)
{
tetno+=wynik[i];
}
tetno=400/(tetno) ; //(6000/15)
liczba_uderzen++;
okres=0;
}
if(tablica[licznik_probek]<prog+Histereza && tablica[licznik_probek-1]>=prog+Histereza && FazaPrzebiegu==wzrost)
{
FazaPrzebiegu=spadek;
}
if(okres==300) //brak pulsu przez 3s lub tetno za niskie
{
okres=0;
tetno=0;
LcdGotoXY(1,4);
LcdStr(2,"000");
for(char i=0;i<15;i++)
{
wynik[i]=0;
}
}
else
{
if(tetno<100 && tetno>29)
{
LcdGotoXY(1,4);
LcdStr(2,"0");
LcdGotoXY(3,4);
LcdStr(2,itoa(tetno,&Str[0],10));
}
else if(tetno<240 && tetno>=100)
{
LcdGotoXY(1,4);
LcdStr(2,itoa(tetno,&Str[0],10));
}
LcdGotoXY(7,4);
LcdStr(2,"/min");
}
LcdGotoXY(3,6);
itoa(czas.godziny/10,&Str[0],10);
itoa(czas.godziny%10,&Str[1],10);
Str[2]=':';
itoa(czas.minuty/10,&Str[3],10);
itoa(czas.minuty%10,&Str[4],10);
Str[5]=':';
itoa(czas.sekundy/10,&Str[6],10);
itoa(czas.sekundy%10,&Str[7],10);
Str[8]=':';
itoa(czas.setne/10,&Str[9],10);
itoa(czas.setne%10,&Str[10],10);
Str[11]=' ';
LcdStr(1,&Str[0]);
LcdGotoXY(8,5);
LcdStr(1,itoa(liczba_uderzen,&Str[0],10));
LcdUpdate();
}
/***************************************************************************************************/
void USART_Init( unsigned char baud )
{
//UBRRH = (unsigned char)(baud>>8);
UBRRL = (unsigned char)baud;
/* Enable receiver and transmitter */
UCSRB = (1<<RXEN)|(1<<TXEN);
/* Set frame format: 8data, 1stop bit Asynchronous mode*/
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}
/***************************************************************************************************/
void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) );
/* Put data into buffer, sends the data */
UDR = data;
}