- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
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

    Praxistest und DIY Projekte
    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
  •  

Solar Speicher und Akkus Tests