- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 2 von 2

Thema: falsches auslesen des eeprom

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    19.09.2008
    Beiträge
    19

    falsches auslesen des eeprom

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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);
    }

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    19.09.2008
    Beiträge
    19
    Habe es jetzt hinbekommen! Habe zwar immer noch keine Ahnung was da nicht ging aber ist jetzt auch egal.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress