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
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.:
1
write_eeprom(0x01,actualID);
2
write_eeprom(0x02,expectedID);
3
4
delay_ms(500);
5
6
printf("\n\r Expected ID: %u",read_eeprom(0x01));
7
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?
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...
> 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 ;)
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...
>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.
>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';
> 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 ?
>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.
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.
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.
Hola Patrick
Du musst zuerst mal herausfinden, ob das Problem im Schreiben ins EEPROM
oder im Lesen aus dem EEPROM steckt.
Versuch mal Folgendes:
1
actualID=50;
2
expectedID=60;
3
4
write_eeprom(0x01,actualID);
5
write_eeprom(0x02,expectedID);
6
7
delay_ms(500);
8
9
printf("\n\r Expected ID: %u",read_eeprom(0x01));
10
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.
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...
Vielen Dank!
Also mit dem letzten Code von Holger funktionierts!
Jetzt versuche ich mal herauszufinden warum dass bei mir nicht
klappte...
Vielen Dank nochmals...
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...
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.
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.