PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : falsches auslesen des eeprom



Daniel2412
27.11.2008, 19: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);
}

Daniel2412
28.11.2008, 13:06
Habe es jetzt hinbekommen! Habe zwar immer noch keine Ahnung was da nicht ging aber ist jetzt auch egal.