Daniel2412
28.11.2008, 14:16
Hallo!
Kann mir jemand ein paar Tipps geben wie ich mein Programmcode optimieren kann. Es passt zwar alles rein aber kleiner und besser strukturiert kann es ja immer sein. ZB wie man einen long-wert in einen int-wert ohne explizite Umwandlung umwandelt. Würde bestimmt eine Menge Speicher sparen. Bin für jeden Anregung dankbar.
Der Code ist mit mikroC geschrieben. Benutze einen PIC 16f872.
unsigned char ch;
unsigned short j=0;
void anzeigee(unsigned int);
unsigned int eprom_lesen(unsigned short);
unsigned short eprom_schreiben(unsigned short,unsigned int);
void anzeigee(unsigned int x)
{
unsigned short anzeige[10] ;
IntToStr(x/10,anzeige);
Lcd_Out(2,5,anzeige);
LCD_Chr_CP(46);
ch = x % 10;
LCD_Chr(2,12,48+ch);
}
unsigned int eprom_lesen(unsigned short vv)
{
int dit;
unsigned short temp;
unsigned short istwert1[8],ch1;
temp = Eeprom_Read(vv);
dit = temp;
dit = dit <<8;
temp = Eeprom_Read(vv+1);
dit = dit + temp;
if(j==1)
{
IntToStr(dit/10,istwert1);
Lcd_Out(2, 5,istwert1);
LCD_Chr_CP(46);
ch1 = dit % 10;
LCD_Chr(2,12,48+ch1);
}
}
unsigned short eprom_schreiben(unsigned short xxx,unsigned int xxxx )
{
unsigned int temp;
temp = xxxx;
Eeprom_Write ( xxx+1,temp );
temp = (xxxx>>8);
Eeprom_Write ( xxx,((short)temp) );
}
void main()
{
char *text1 = "Dossierhub";
char *text2 = "cfx";
char *text3 = "cup";
char *text4 = "cf1";
unsigned short wert1, wert2, enter;
unsigned int txt_1, txt_2,tint,adresse,i=800;
unsigned long tlong;
TRISC = 0;
PORTC = 0;
TRISB = 0;
PORTB = 0;
enter = 0;
wert2 = 0;
Lcd_Config(&PORTC, 3, 1, 2, 7, 6, 5, 4);
LCD_Cmd(LCD_CLEAR);
LCD_Cmd(LCD_CURSOR_OFF );
LCD_Out(1,4,text1);
LCD_Out(2,2,text2);
do
{
ADCON1 = 0x00; //alle analog
TRISA = 0xff;
tlong = ((long)ADC_Read(3)*1600)/1023; //cfx-wert 0-160.0mm
tint = tlong;
anzeigee(tint);
ADCON1 = 0x06; //alle digital
j=0;
if ( tint > eprom_lesen(0x00)) //Umschalp. cup Öffner
{
PORTB = PORTB | 0x80;
}
else
{
PORTB = PORTB & 0x7F;
}
if ( tint < eprom_lesen(0x02)) //Schließer, Dossierhub cf1 unter 50 ein
{
PORTB |= 0x40;
}
else
{
PORTB &= 0xBF;
}
if (Button(&PORTA, 2, 30, 1) && enter == 0 ) //Umschaltpunkt cup Öffner Soll
{
while((PORTA & 0x04)==0x04); //nach dem loslassen weiter
j=1;
LCD_Cmd(LCD_CLEAR);
delay_ms(30);
LCD_Out(1,1,"Umschaltpunkt");
LCD_Out(2,1,text3);
eprom_lesen(0x00);
enter=1;
}
while(enter == 1 || enter == 2)
{
wert1 = (PORTA & 0x03); //aktuelle stellung nach wert1
if ((wert1 ^ wert2) > 0) //wurde der Rotary bewegt oder wert1 = wert2
{
wert2 = (wert2 << 1 ); //verschieben des zweiten aufgenommenden wertes
if ((wert1 ^ wert2) == 0x01)
{i += 1;}
if ((wert1 ^ wert2) == 0x02)
{i -= 1;}
if (i > 1600)
{i = 2 ;}
if (i <= 1)
{i = 1600 ;}
delay_ms(10);
wert2 = wert1 ;
anzeigee(i);
}
if (Button(&PORTA, 2, 30, 1) && enter == 1) //Dossierhub cf1 Schließer
{
while((PORTA & 0x04)==0x04); //nach dem loslassen weiter
eprom_schreiben(adresse = 0x00,tint );
LCD_Cmd(LCD_CLEAR);
LCD_Out(1,1,text1);
LCD_Out(2,1,text4);
eprom_lesen(0x02);
enter=2;
delay_ms(250);
}
if (Button(&PORTA, 2, 20, 1) && enter == 2) //enter und speichern
{ //von Schalt2 Soll
while((PORTA & 0x04)==0x04); //nach dem loslassen weiter
eprom_schreiben(adresse = 0x02,tint );
enter=0;
LCD_Cmd(LCD_CLEAR);
delay_ms(1000);
LCD_Out(1,4,text1); //Dossierhub
LCD_Out(2,2,text2);
}
}
}
while(1);
}
jetzt auch mit Programm #-o
Kann mir jemand ein paar Tipps geben wie ich mein Programmcode optimieren kann. Es passt zwar alles rein aber kleiner und besser strukturiert kann es ja immer sein. ZB wie man einen long-wert in einen int-wert ohne explizite Umwandlung umwandelt. Würde bestimmt eine Menge Speicher sparen. Bin für jeden Anregung dankbar.
Der Code ist mit mikroC geschrieben. Benutze einen PIC 16f872.
unsigned char ch;
unsigned short j=0;
void anzeigee(unsigned int);
unsigned int eprom_lesen(unsigned short);
unsigned short eprom_schreiben(unsigned short,unsigned int);
void anzeigee(unsigned int x)
{
unsigned short anzeige[10] ;
IntToStr(x/10,anzeige);
Lcd_Out(2,5,anzeige);
LCD_Chr_CP(46);
ch = x % 10;
LCD_Chr(2,12,48+ch);
}
unsigned int eprom_lesen(unsigned short vv)
{
int dit;
unsigned short temp;
unsigned short istwert1[8],ch1;
temp = Eeprom_Read(vv);
dit = temp;
dit = dit <<8;
temp = Eeprom_Read(vv+1);
dit = dit + temp;
if(j==1)
{
IntToStr(dit/10,istwert1);
Lcd_Out(2, 5,istwert1);
LCD_Chr_CP(46);
ch1 = dit % 10;
LCD_Chr(2,12,48+ch1);
}
}
unsigned short eprom_schreiben(unsigned short xxx,unsigned int xxxx )
{
unsigned int temp;
temp = xxxx;
Eeprom_Write ( xxx+1,temp );
temp = (xxxx>>8);
Eeprom_Write ( xxx,((short)temp) );
}
void main()
{
char *text1 = "Dossierhub";
char *text2 = "cfx";
char *text3 = "cup";
char *text4 = "cf1";
unsigned short wert1, wert2, enter;
unsigned int txt_1, txt_2,tint,adresse,i=800;
unsigned long tlong;
TRISC = 0;
PORTC = 0;
TRISB = 0;
PORTB = 0;
enter = 0;
wert2 = 0;
Lcd_Config(&PORTC, 3, 1, 2, 7, 6, 5, 4);
LCD_Cmd(LCD_CLEAR);
LCD_Cmd(LCD_CURSOR_OFF );
LCD_Out(1,4,text1);
LCD_Out(2,2,text2);
do
{
ADCON1 = 0x00; //alle analog
TRISA = 0xff;
tlong = ((long)ADC_Read(3)*1600)/1023; //cfx-wert 0-160.0mm
tint = tlong;
anzeigee(tint);
ADCON1 = 0x06; //alle digital
j=0;
if ( tint > eprom_lesen(0x00)) //Umschalp. cup Öffner
{
PORTB = PORTB | 0x80;
}
else
{
PORTB = PORTB & 0x7F;
}
if ( tint < eprom_lesen(0x02)) //Schließer, Dossierhub cf1 unter 50 ein
{
PORTB |= 0x40;
}
else
{
PORTB &= 0xBF;
}
if (Button(&PORTA, 2, 30, 1) && enter == 0 ) //Umschaltpunkt cup Öffner Soll
{
while((PORTA & 0x04)==0x04); //nach dem loslassen weiter
j=1;
LCD_Cmd(LCD_CLEAR);
delay_ms(30);
LCD_Out(1,1,"Umschaltpunkt");
LCD_Out(2,1,text3);
eprom_lesen(0x00);
enter=1;
}
while(enter == 1 || enter == 2)
{
wert1 = (PORTA & 0x03); //aktuelle stellung nach wert1
if ((wert1 ^ wert2) > 0) //wurde der Rotary bewegt oder wert1 = wert2
{
wert2 = (wert2 << 1 ); //verschieben des zweiten aufgenommenden wertes
if ((wert1 ^ wert2) == 0x01)
{i += 1;}
if ((wert1 ^ wert2) == 0x02)
{i -= 1;}
if (i > 1600)
{i = 2 ;}
if (i <= 1)
{i = 1600 ;}
delay_ms(10);
wert2 = wert1 ;
anzeigee(i);
}
if (Button(&PORTA, 2, 30, 1) && enter == 1) //Dossierhub cf1 Schließer
{
while((PORTA & 0x04)==0x04); //nach dem loslassen weiter
eprom_schreiben(adresse = 0x00,tint );
LCD_Cmd(LCD_CLEAR);
LCD_Out(1,1,text1);
LCD_Out(2,1,text4);
eprom_lesen(0x02);
enter=2;
delay_ms(250);
}
if (Button(&PORTA, 2, 20, 1) && enter == 2) //enter und speichern
{ //von Schalt2 Soll
while((PORTA & 0x04)==0x04); //nach dem loslassen weiter
eprom_schreiben(adresse = 0x02,tint );
enter=0;
LCD_Cmd(LCD_CLEAR);
delay_ms(1000);
LCD_Out(1,4,text1); //Dossierhub
LCD_Out(2,2,text2);
}
}
}
while(1);
}
jetzt auch mit Programm #-o