Daniel2412
27.11.2008, 20:54
Hallo!
Ich versuche mit einem PIC 16F872 ein kleines Programm zu schreiben aber es gelingt nicht richtig. Ich schreibe mit einer Funktion zwei int-werte in den eeprom. Das funktioniert auch gut(mit IC-Prog überprüft). Allerdings macht das auslesen Probleme. Beim auslesen ist das vordere Byte Hexadezimal immer um eins niedriger als es im eeprom steht. Beispiel: im speicher steht FFFF und auf dem LCD wird mir 65279 ( FEFF ) ausgegeben. meine Funktion zum auslesen muss einen Fehler habe.
Kann mir jemand helfen?
Bitte nicht über meinen Schreib stiel meckern, ich stehe am Anfang der Programmierung.
Danke
unsigned char ch;
void anzeigee(unsigned int);
unsigned int eprom_lesen(unsigned int);
unsigned short eprom_schreiben(unsigned short,unsigned int);
//void Eeprom_Write(unsigned int address, unsigned short data);
//unsigned short Eeprom_Read(unsigned int address);
void anzeigee(unsigned int x)
{
unsigned short anzeige[10] ; //9 //6
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 int aa )
{
// unsigned int aaa;
unsigned int temp3,temp2;
// aaa=0;
temp2 = (short)Eeprom_Read( aa+1 );
temp3 =(short)Eeprom_Read( aa );
temp3 = (temp3 << 8);
temp3 +=temp2;
// delay_ms(30);
return temp3;
}
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 int txt_1_int, txt_2_int,adwert_int2 , adwert_int3,j;
unsigned short wert1, wert2, enter, Schalt1_soll, Schalt2_soll;
unsigned short txt_i[1], txt_j[2], istwert1[8], istwert2[8],adwert[2],ch1; //1-->8
unsigned int txt_1, txt_2,tint,adresse, tshort;
unsigned long tlong;
unsigned short ttshort;
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 = ((ADC_Read(3)*16)/1023)*100;
tint = tlong;
// tshort = tlong/10;
// tshort = tint/10;
anzeigee(tint);
ADCON1 = 0x06; //alle digital
// wert1 = eprom_lesen( adresse );
/* if ( tshort > eprom_lesen( adresse= 0x00)) //Umschalp. cup Öffner
{
PORTB = PORTB | 0x80;
}
else
{
PORTB = PORTB & 0x7F;
}
if ( tshort < eprom_lesen( adresse= 0x01) ) //Schließer, Dossierhub cf1 unter 50 ein
{
PORTB |= 0x40;
}
else
{
PORTB &= 0xBF;
}
*/
if (Button(&PORTA, 2, 20, 1) && enter == 0 ) //Umschaltpunkt cup Öffner Soll
{
while((PORTA & 0x04)==0x04); //nach dem loslassen weiter
LCD_Cmd(LCD_CLEAR);
LCD_Out(1,1,"Umschaltpunkt");
LCD_Out(2,1,text3);
txt_1 = eprom_lesen( adresse =0x00 );
IntToStr(txt_1/10,istwert1);
Lcd_Out(2, 5,istwert1);
LCD_Chr_CP(46);
ch1 = txt_1 % 10;
LCD_Chr(2,12,48+ch1);
enter=1;
//delay_ms(5000);
}
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)
{tint += 2;}
if ((wert1 ^ wert2) == 0x02)
{tint -= 2;}
if (tint > 1600)
{tint = 2 ;}
if (tint < 1)
{tint = 1600 ;}
wert2 = wert1 ;
// delay_ms(20);
anzeigee(tint);
/*
ch1 = i / 1000;
LCD_Chr(2,12,48+ch1);
ch1 = (i / 100) % 10;
LCD_Chr_CP(48+ch1);
ch1 = (i / 10) % 10;
LCD_Chr_CP(48+ch1);
LCD_Chr_CP('.');
ch1 = i % 10;
LCD_Chr_CP(48+ch1);
*/
}
if (Button(&PORTA, 2, 20, 1) && enter == 1) //Dossierhub cf1 Schließer
{
while((PORTA & 0x04)==0x04); //nach dem loslassen weiter
// Schalt1_soll = tint;
eprom_schreiben(adresse = 0x00,tint );
// Eeprom_Write((0x00), Schalt1_soll);
LCD_Cmd(LCD_CLEAR);
LCD_Out(1,1,text1);
LCD_Out(2,1,text4);
txt_2 = eprom_lesen( adresse = 0x02);
IntToStr(txt_2/10,istwert2);
Lcd_Out(2, 5,istwert2);
LCD_Chr_CP(46);
ch1 = txt_2 % 10;
LCD_Chr(2,12,48+ch1);
// IntToStr(txt_2,istwert2);
// Lcd_Out(2,5,istwert2);
/*
ch1 = txt_2 / 100;
LCD_Chr(2,5,48+ch1);
ch1 = (txt_2 / 10) % 10;
LCD_Chr_CP(48+ch1);
ch1 = txt_2 % 10;
LCD_Chr_CP(48+ch1);
*/
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
// Schalt2_soll = tint;
eprom_schreiben(adresse = 0x02,tint );
// Eeprom_Write((0x01), Schalt2_soll);
LCD_Cmd(LCD_CLEAR);
enter=0;
delay_ms(1000);
LCD_Cmd(LCD_CLEAR);
LCD_Out(1,5,text1); //Dossierhub
LCD_Out(2,2,text2);
}
}
}
while(1);
}
Ich versuche mit einem PIC 16F872 ein kleines Programm zu schreiben aber es gelingt nicht richtig. Ich schreibe mit einer Funktion zwei int-werte in den eeprom. Das funktioniert auch gut(mit IC-Prog überprüft). Allerdings macht das auslesen Probleme. Beim auslesen ist das vordere Byte Hexadezimal immer um eins niedriger als es im eeprom steht. Beispiel: im speicher steht FFFF und auf dem LCD wird mir 65279 ( FEFF ) ausgegeben. meine Funktion zum auslesen muss einen Fehler habe.
Kann mir jemand helfen?
Bitte nicht über meinen Schreib stiel meckern, ich stehe am Anfang der Programmierung.
Danke
unsigned char ch;
void anzeigee(unsigned int);
unsigned int eprom_lesen(unsigned int);
unsigned short eprom_schreiben(unsigned short,unsigned int);
//void Eeprom_Write(unsigned int address, unsigned short data);
//unsigned short Eeprom_Read(unsigned int address);
void anzeigee(unsigned int x)
{
unsigned short anzeige[10] ; //9 //6
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 int aa )
{
// unsigned int aaa;
unsigned int temp3,temp2;
// aaa=0;
temp2 = (short)Eeprom_Read( aa+1 );
temp3 =(short)Eeprom_Read( aa );
temp3 = (temp3 << 8);
temp3 +=temp2;
// delay_ms(30);
return temp3;
}
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 int txt_1_int, txt_2_int,adwert_int2 , adwert_int3,j;
unsigned short wert1, wert2, enter, Schalt1_soll, Schalt2_soll;
unsigned short txt_i[1], txt_j[2], istwert1[8], istwert2[8],adwert[2],ch1; //1-->8
unsigned int txt_1, txt_2,tint,adresse, tshort;
unsigned long tlong;
unsigned short ttshort;
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 = ((ADC_Read(3)*16)/1023)*100;
tint = tlong;
// tshort = tlong/10;
// tshort = tint/10;
anzeigee(tint);
ADCON1 = 0x06; //alle digital
// wert1 = eprom_lesen( adresse );
/* if ( tshort > eprom_lesen( adresse= 0x00)) //Umschalp. cup Öffner
{
PORTB = PORTB | 0x80;
}
else
{
PORTB = PORTB & 0x7F;
}
if ( tshort < eprom_lesen( adresse= 0x01) ) //Schließer, Dossierhub cf1 unter 50 ein
{
PORTB |= 0x40;
}
else
{
PORTB &= 0xBF;
}
*/
if (Button(&PORTA, 2, 20, 1) && enter == 0 ) //Umschaltpunkt cup Öffner Soll
{
while((PORTA & 0x04)==0x04); //nach dem loslassen weiter
LCD_Cmd(LCD_CLEAR);
LCD_Out(1,1,"Umschaltpunkt");
LCD_Out(2,1,text3);
txt_1 = eprom_lesen( adresse =0x00 );
IntToStr(txt_1/10,istwert1);
Lcd_Out(2, 5,istwert1);
LCD_Chr_CP(46);
ch1 = txt_1 % 10;
LCD_Chr(2,12,48+ch1);
enter=1;
//delay_ms(5000);
}
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)
{tint += 2;}
if ((wert1 ^ wert2) == 0x02)
{tint -= 2;}
if (tint > 1600)
{tint = 2 ;}
if (tint < 1)
{tint = 1600 ;}
wert2 = wert1 ;
// delay_ms(20);
anzeigee(tint);
/*
ch1 = i / 1000;
LCD_Chr(2,12,48+ch1);
ch1 = (i / 100) % 10;
LCD_Chr_CP(48+ch1);
ch1 = (i / 10) % 10;
LCD_Chr_CP(48+ch1);
LCD_Chr_CP('.');
ch1 = i % 10;
LCD_Chr_CP(48+ch1);
*/
}
if (Button(&PORTA, 2, 20, 1) && enter == 1) //Dossierhub cf1 Schließer
{
while((PORTA & 0x04)==0x04); //nach dem loslassen weiter
// Schalt1_soll = tint;
eprom_schreiben(adresse = 0x00,tint );
// Eeprom_Write((0x00), Schalt1_soll);
LCD_Cmd(LCD_CLEAR);
LCD_Out(1,1,text1);
LCD_Out(2,1,text4);
txt_2 = eprom_lesen( adresse = 0x02);
IntToStr(txt_2/10,istwert2);
Lcd_Out(2, 5,istwert2);
LCD_Chr_CP(46);
ch1 = txt_2 % 10;
LCD_Chr(2,12,48+ch1);
// IntToStr(txt_2,istwert2);
// Lcd_Out(2,5,istwert2);
/*
ch1 = txt_2 / 100;
LCD_Chr(2,5,48+ch1);
ch1 = (txt_2 / 10) % 10;
LCD_Chr_CP(48+ch1);
ch1 = txt_2 % 10;
LCD_Chr_CP(48+ch1);
*/
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
// Schalt2_soll = tint;
eprom_schreiben(adresse = 0x02,tint );
// Eeprom_Write((0x01), Schalt2_soll);
LCD_Cmd(LCD_CLEAR);
enter=0;
delay_ms(1000);
LCD_Cmd(LCD_CLEAR);
LCD_Out(1,5,text1); //Dossierhub
LCD_Out(2,2,text2);
}
}
}
while(1);
}