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
Code:
  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);
}