mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC EEPROM: Falsche Daten geschrieben?


Autor: Patrick K (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallihallo!

Ich habe folgendes Problem:
Mit dem unten aufgefuehrten Code soll der EEPROM des PIC beschrieben 
werden. Danach wird die Eingabe mit dem geschriebenen Wert ueberprueft.

Wenn ich, die geschriebenen Daten auslese bekomme ich aber fuer beide 
Adressen die Werte "1" und nicht die, die ich eingetippt habe.

Ich entschuldige mich vorab fuer die Nichtkommentierung des Codes 
aufgrund von Dringlichkeit.
Kann jemand helfen?

Gruesse
void Configurate_ID (void)
{

unsigned int8 ConfigOption,ExpIDByte1,ExpIDByte2,ActIDByte2,ActIDByte1;
unsigned int8 actualID,expectedID,TimeCounter;

char c;





  printf("\n\rDo you want to change the Station IDs? Press Y or N   ");

  TimeCounter = 0;
   set_timer1(0);

   do{
      if(get_timer1() > 60000)
        {
         TimeCounter++;
         set_timer1(0);
        }
   }while((TimeCounter <= 20) && !RCIF);



   if(RCIF)
   {
      ConfigOption = ReadByte();

      if((ConfigOption == 'y') || (ConfigOption == 'Y'))
         {
            //RECEIVING EXPECTED ID
            printf("\n\rPlease type in the expected ID:  ");
            TimeCounter = 0;
            set_timer1(0);

            do{
            if(get_timer1() > 60000)
            {
               TimeCounter++;
               set_timer1(0);
            }

            }while((TimeCounter <= 20) && !RCIF);
            ExpIDByte1=ReadByte();

             TimeCounter = 0;
             set_timer1(0);

             do{
             if(get_timer1() > 60000)
               {
               TimeCounter++;
               set_timer1(0);
               }
               }while((TimeCounter <= 20) && !RCIF);
               ExpIDByte2=ReadByte();

               //RECEIVING ACTUAL ID
               printf("\n\rPlease type in the ID of the actual station:   ");
               TimeCounter = 0;
            set_timer1(0);

            do{
            if(get_timer1() > 60000)
            {
               TimeCounter++;
               set_timer1(0);
            }

            }while((TimeCounter <= 20) && !RCIF);
            ActIDByte1=ReadByte();

             TimeCounter = 0;
             set_timer1(0);

             do{
             if(get_timer1() > 60000)
               {
               TimeCounter++;
               set_timer1(0);
               }
               }while((TimeCounter <= 20) && !RCIF);
               ActIDByte2=ReadByte();


         }

         printf("\n\rAct1\t");
         WriteByte(ActIDByte1);
         printf("\n\rAct2\t");
         WriteByte(ActIDByte2);
         printf("\n\rExp1\t");
         WriteByte(ExpIDByte1);
         printf("\n\rExp2\t");
         WriteByte(ExpIDByte2);

         //CONVERT ASCII TO HEX

         ActIDByte1=ActIDByte1 && 0x0F;
         ActIDByte2=ActIDByte2 && 0x0F;
         ExpIDByte1=ExpIDByte1 && 0x0F;
         ExpIDByte2=ExpIDByte2 && 0x0F;

         ActIDByte1=swap(ActIDByte1);
         ExpIDByte1=swap(ExpIDByte1);

         actualID = ActIDByte1 || ActIDByte2;
         expectedID = ExpIDByte1 || ExpIDByte2;
         
         printf("\n");
         WriteByte(actualID);
         printf("\n");
         WriteByte(expectedID);


         //WRITING SEQUENCE

         printf("\nShould IDs be written (y)?   ");
          TimeCounter = 0;
            set_timer1(0);

            do{
            if(get_timer1() > 60000)
            {
               TimeCounter++;
               set_timer1(0);
            }

            }while((TimeCounter <= 20) && !RCIF);

             ConfigOption = ReadByte();

         if((ConfigOption == 'y') || (ConfigOption == 'Y'))
         {
            write_eeprom(0x01,actualID);
            write_eeprom(0x02,expectedID);

            delay_ms(500);


            //if(EEIF==0)    //Write completed bit
            {

               //Reading and comparing the written IDs
               if((read_eeprom(0x02)==actualID) && (read_eeprom(0x01)==expectedID))
               {
                  printf("\n\r IDs were written successful");

                  printf("\n\r Expected ID: %u", read_eeprom(0x01));
                  printf("\n\r Actual ID  : %u", read_eeprom(0x02));
               }
               else
               {
                  printf("\n\rWriting failed");

               }



            }
         }

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Patrick

Ich weiss zwar nicht, weshalb die Werte nicht korrekt ausgegeben werden, 
aber ich möchte Dir allgemeine Tipps geben:

Versuche, den Code auf das Minimum zu reduzieren, um das Problem zu 
zeigen:
z.B.:
    write_eeprom(0x01,actualID);
    write_eeprom(0x02,expectedID);

    delay_ms(500);

    printf("\n\r Expected ID: %u", read_eeprom(0x01));
    printf("\n\r Actual ID  : %u", read_eeprom(0x02));

Allerdings steckt wahrscheinlich die Knacknuss gerade in write_eeprom(), 
die Du eben nicht gepostet hast.
Stimmen die Rückgabetypen von read_eeprom() mit dem "%u" überein?

Weiter:
if(EEIF==0)    //Write completed bit
ist das nötig oder nicht? Wartet write_eeprom() bis der Schreibvorgang 
beendet ist?

Ausserdem:
Um welchen PIC handelt es sich?
Um welchen Compiler?
Hast Du das EEPROM mal mit dem Programmer (welchem?) ausgelesen?
Steht da drin was Du erwartest?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>         actualID = ActIDByte1 || ActIDByte2;
>         expectedID = ExpIDByte1 || ExpIDByte2;

         actualID = ActIDByte1 | ActIDByte2;
         expectedID = ExpIDByte1 | ExpIDByte2;

Autor: Patrick K (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Severino.

-Mit dem Programmer habe ichs schon ausgelesen (MPLAB). Und zeigt mir im 
Speicher genau 0x01 an. Komische Sache.
-Es ist ein PIC16F688.
-Ich glaube nicht dass das EEIF Flag von Noeten ist.
-Als Compiler benutze ich den PIC-C Compiler


Schon mal Danke fuer die Tipps!

Auch danke an Holger, ich glaube das koennte auch der Fehler sein...Ich 
habe das auch schon im Kopf gehabt, aber irgendwie nicht ausprobiert...

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>         actualID = ActIDByte1 || ActIDByte2;

Die Zeile mal übersetzt:

if(ActIDByte1>0 || ActIDByte2>0) actualID=1;
else actualID=0;

Na, dämmert es ?
Was du wolltest ist ein bitweises Oder
von ActIDByte1 und ActIDByte2.
Hat nicht ganz geklappt ;)

Autor: Patrick K (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Holger..ich habe das jetzt mal probiert...

Er schreibt zwar nun was anderes...aber immer noch nicht das Richtige. 
Er schreibt in beide Adressen "17", wenn ich die Zahlen 30 und 35 
eintippe...

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>wenn ich die Zahlen 30 und 35 eintippe...

Wenn du 30 eintippst sendest du zwei Bytes:
'3' und '0'

Wenn du 35 eintippst sendest du auch zwei Bytes:
'3' und '5'

Das heisst: Wenn du zwei Zahlen eintippst musst
du zwei Zeichen empfangen. Aus diesen zwei ASCII Zeichen
musst du deinen Wert zusammenbauen bevor du da
was brauchbares fürs EEPROM bekommst.

Google mal nach ASCII Code. Ein bißchen Arbeit
sollst du ja auch noch haben.

Autor: Patrick K (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja aber das habe ich doch schon alles gemacht. Hier baue Ich die zwei 
Bytes zusammen:
   printf("\n\rAct1\t");
         WriteByte(ActIDByte1);
         printf("\n\rAct2\t");
         WriteByte(ActIDByte2);
         printf("\n\rExp1\t");
         WriteByte(ExpIDByte1);
         printf("\n\rExp2\t");
         WriteByte(ExpIDByte2);

         //CONVERT ASCII TO HEX

         ActIDByte1=ActIDByte1 && 0x0F;
         ActIDByte2=ActIDByte2 && 0x0F;
         ExpIDByte1=ExpIDByte1 && 0x0F;
         ExpIDByte2=ExpIDByte2 && 0x0F;

         ActIDByte1=swap(ActIDByte1);
         ExpIDByte1=swap(ExpIDByte1);

         actualID = ActIDByte1 | ActIDByte2;
         expectedID = ExpIDByte1 | ExpIDByte2;

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ja aber das habe ich doch schon alles gemacht. Hier baue Ich die zwei
>Bytes zusammen:

Sorry, glatt mal überlesen :(

>         ActIDByte1=ActIDByte1 && 0x0F;

Schon wieder das Ding mit bitweise. Diesmal UND

        ActIDByte1=ActIDByte1 & 0x0F;


Probier doch mal:
         ActIDByte1=ActIDByte1 - '0';
         ActIDByte2=ActIDByte2 - '0';
         ExpIDByte1=ExpIDByte1 - '0';
         ExpIDByte2=ExpIDByte2 - '0';

Autor: Patrick K (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke fuer die Hilfe.

Ich habe beide Moeglichkeiten probiert, nur mit diesen wird jetzt nichts 
mehr geschrieben....

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>            write_eeprom(0x01,actualID);
>            write_eeprom(0x02,expectedID);

>              //Reading and comparing the written IDs
>               if((read_eeprom(0x02)==actualID) && 
>(read_eeprom(0x01)==expectedID))
>               {

Wie soll da auch ein Vergleich zustande kommen
wenn du die Adressen vertauscht ?

Autor: Patrick K (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das habe ich inzwischen schon behoben...habe ich selbst gemerkt. Nur die 
Zahlen die jetzt ausgegeben werden sind immer noch nicht dir Richtigen

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Nur die Zahlen die jetzt ausgegeben werden sind immer noch nicht dir >Richtigen

Wieviele Popel muss man dir aus der Nase ziehen
bevor du sagst welche Zahlen du erwartest und welche
rauskommen ?

Tschüss auf jeden Fall schon mal.
Machs doch alleine.

Autor: Patrick K (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da ich gerade ziemlich erkaelter bin sinds einige Popel.

Die Zahlen die ich erwarte sind:
Wenn ich 30 Eingebe erhalte ich als Ascii 33 und 30, dann wandel ich 
dass in Hex um. Und diese zwei bytes bringe ich wieder zusammen dass 
sich eine 30 ergibt, die dann in die Adresse geschrieben wird.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>         ActIDByte1=ActIDByte1 && 0x0F;
>         ActIDByte2=ActIDByte2 && 0x0F;
>         ActIDByte1=swap(ActIDByte1);

         ActIDByte1=ActIDByte1 -'0';
         ActIDByte2=ActIDByte2 -'0';
         ActIDByte1= 10 * ActIDByte1 + ActIDByte2;

Ist das denn soo schwer ?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ActIDByte1=ActIDByte1 -'0';
         ActIDByte2=ActIDByte2 -'0';
         ActIDByte1= 10 * ActIDByte1 + ActIDByte2;
         actualID = ActIDByte1;

Hätte ich jetzt fast vergessen :(

Autor: Patrick K (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, fuer jemanden der in Mexiko sitzt und damit so gut wie keine 
Erfahrungen hat ist das schwer.
Wenn dann auch noch die richtigen Ansprechpartner fehlen und man unter 
Zeitdruck steht ist man umso mehr froh, wenn man hier in diesem Forum 
Hilfe bekommt. Tut mir leid dass dies hier fuer die meisten keine harte 
Nuss ist, aber es gibt eben auch Weichere. Und mit der hab eben ich zu 
kaempfen...

Vielen Dank fuer die Hilfe, ich werds schon hinbekommen.

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hola Patrick

Du musst zuerst mal herausfinden, ob das Problem im Schreiben ins EEPROM 
oder im Lesen aus dem EEPROM steckt.

Versuch mal Folgendes:
    actualID = 50;
    expectedID = 60;

    write_eeprom(0x01,actualID);
    write_eeprom(0x02,expectedID);

    delay_ms(500);

    printf("\n\r Expected ID: %u", read_eeprom(0x01));
    printf("\n\r Actual ID  : %u", read_eeprom(0x02));

Durch die feste Zuweisung eines konstanten Wertes an Deine Variablen 
kannst Du mögliche Fehler durch die Konvertierung des ASCII-Strings in 
einen int ausschalten.
Natürlich kannst Du auch etwas Anderes als 50 und 60 wählen.

Und schau bitte mit dem Programmer nach, was nun im EEPROM steht.

Wenn jetzt alles stimmt, ist das Problem bei der Konvertierung des 
Strings und hat somit nichts mit dem EEPROM zu tun.

Hast Du eigentlich einen ICD2 mit einem PIC16F688-ICD Header? Damit 
könntest Du recht bequem debuggen und die Variablen auslesen.

Und welchen Compiler genau benutzt Du? Den von Hi-Tech?
Woher hast Du die xxxxx_eeprom Funktionen? Dort müsste man herausfinden, 
ob das mit dem EEIF Flag nun nötig ist oder nicht.

Autor: Patrick K (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Severino!

Also durch den Syntax von Holger und dem Auslesen habe ich 
herausgefunden dass das Schreiben funktioniert. Irgendwas stimmt also 
mit dem Auslesen nicht.

Das Problem hier ist (es ist geschaeftlich) dass ich nur den Picstart 
Plus zur Verfuegung habe. Keine Emulator, nix. Recht muehselig, das 
Ganze.

Die EEPROM Funktionen sind alle im Compiler mit dem Namen PIC-C, PCW 
Compiler C IDE. Mehr Angaben stehen mir nicht zur Verfuegung.

Das Flag brauch ich ja nicht unbedingt. Ich koennte ja auch ne kleine 
Verzoegerung einbauen von ein paar Milisekunden, da es auch 
Geschwindigkeit bei dem Prog nicht ankommt.


Ich habe hier eher das Gefuehl dass es an der Konvertierung liegt und 
ich irgendwie den Ascii "richtig" umwandeln muss...

Autor: Patrick K (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank!

Also mit dem letzten Code von Holger funktionierts!

Jetzt versuche ich mal herauszufinden warum dass bei mir nicht 
klappte...

Vielen Dank nochmals...

Autor: Patrick K (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe das ganze jetzt einwandfrei hinbekommen.

Ich moechte nur an dieser Stelle an einige Personen apellieren:

Vor Eurem Fachwissen habe ich einen grossen Respekt. Nur solltet ihr 
vielleicht ab und zu dran denken eure die charakterliche und 
zwischenmenschliche Ebene nicht mit der eines uCs zu verwechseln.
Hier schreiben immer noch Menschen, die einfach nur Tipps und Hilfe 
brauchen, keine uCs mit denen man umgehen kann wie man will.

Des Weiteren braucht ihr hier niemanden fuer dumm verkaufen wie mit 
"schonmal gegoogelt?" oder so einem Bloedsinn. Die Leute die hier ins 
Forum schreiben, wissen wohl schon warum. Und ihr habts hier auch nicht 
mit Pestalozzischuelern zu tun (ich will niemandem ggf. zu Nahe treten).

Also ein bisschen mehr Respekt. Wenn Du eine grosse Ahnung von der 
Materie hast, sei Dir das gegoennt. Leider sind die meisten auf 
wichtigeren Ebenen volle Versager...

Denkt darueber nach.

Und nochmals danke an die, die auf nette Art und Weise geholfen haben...

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Patrick

Ich finde es toll, dass Du einen Feedback gegeben hast.
Auch das gehört nämlich dazu. Viele Leute strengen sich nämlich an, 
nützliche Antworten zu liefern, und investieren auch reichlich Zeit.
Da wäre es ja nur selbstverständlich, dass der Fragesteller 
anschliessend einen Feedback (inkl. Erfolgsmeldung) gibt und sich 
bedankt.

Leider ist es in den Foren ähnlich wie im Auto: Etliche Leute werden 
unpersönlich, unmenschlich und anonym.

Allerdings gibt es leider auch Fragesteller, welche nicht nur die 
Forumsregeln missachten (z.B. Controllertyp im Betreff, überhaupt einen 
möglichst präzisen Betreff), sondern auch dermassen unspezifische Fragen 
stellen, dass man einfach nicht sinnvoll darauf antworten kann. Und dann 
gibt es halt Antworten, welche die Grenze der Ironie überschreiten und 
u.U. auch beleidigend wirken können.

Ganz zu schweigen von Fragen, auf welche z.B. Wikipedia oder auch diese 
Website ausführliche Antworten bereit halten.

Es ist wirklich nicht immer leicht, eine Frage sowohl kurz als auch 
präzise zu stellen.

Autor: maddin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hey,

das liegt wohl in der natur des menschen, wenn man selber bis zu einem 
gewissen grad in der sache steckt, dann übersieht man zu schnell die 
selbstverständlichkeiten, die dann aber fehlen.

und:

es wird einem hier im forum sehr leicht gemacht, solche fragen stellen 
zu können, dadurch das es frei zugänglich ist, und man jeden sch. 
schreiben kann.

theoretisch könnte man dem schon abhelfen, indem man bei der eröffnung 
eines neuen beitrages einen themenbereich wählen MUSS, unswar einen 
bereich aus "ALLE ARTIKEL" einfach die überschriften, mit dem hinweis 
das man dort zuvor mal gucken sollte, oder man sogar gucken muss.

m.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.