Hallo, Zuerst einmal, ich weiß das mein Code nicht grade schön ist, was an meinen sher begrenzten Programmierkenntnissen liegt. Ich habe auch nicht den Anspruch "schönen" Code zu schreiben, für meine Zwecke reicht es wenn es überhaupt funktiert. Und zwar habe ich mir etwas für einen Geocache gebastelt. Eine Box mit 2 Tastern und einer Sieben-Segment-Anzeige. Die Box hat folgende Funktion: Über zwei Taster soll ein Lösungscode eingegeben werden. Ist dieser Code richtig sollen wiederrum GPS-Koordinaten ausgegeben werden. Weitere Funktionen: - Ändern der Koordinaten - Ändern des Lösungscodes Nachdem ich es jetzt endlich geschafft habe das die Box richtig funktioniert habe ich noch ein Problem mit dem Ändern des Lösungscodes bzw der Koordinaten. Diese sind beide im EEPROM gespeichert, wenn ich sie jedoch mit eeprom_update_block überschreibe wird nach jeder zahl eine null gespeichert. Beispiel: Wenn ich z.B. 1234 speichern will, wird 1020 in den Speicher geschrieben. Ss muss meiner Meinung nach an eeprom_update_block liegen, denn wenn ich den eingeben Code nach dem eingeben ausgeben lasse ist er korrekt, nach dem Speichern im EEPROM ist er dann jedoch wieder mit Nullen gespickt. Hat jemand vll eine Idee woran es liegt? Der komplette Code ist im Anhang zu finden.
Du hast da ein ziemliches Durcheinander mit den Datentypen angestellt Ich greif mir mal den Bereich des Codes/Lösung raus
1 | uint8_t EEMEM loesung[] = {1,2,3}; |
2 | ...
|
3 | int code[LAENGECODE]={0}; |
das Array loesung ist 3 Bytes lang. Das Array code ist aber 6 Bytes lang, weil ein int nun mal aus 2 Bytes besteht. Wenn du hier also liest
1 | eeprom_read_block (( void *) loesungBuffer , ( const void *) loesung, LAENGECODE) ; |
dann liest du 3 Bytes, nämlich die 3 korrekten Bytes, aus dem EEPROM. Wenn du hier allerdings schreibst
1 | eeprom_update_block ( (const void *) code , (void *) loesung , sizeof(loesung)); |
dann schreibst du nur die ersten 3 Bytes des 6 Byte langen Arrays 'code'. Und da jeder einzelne Array Eintrag aus 2 Bytes (wegen int) besteht, tauchen da dazwischen die 0-er auf, die eben die High-Bytes der jeweiligen ints sind. Anregung: Bereinige deine Datentypen. Und zwar komplett und quer durch das ganze Programm. EInen int für eine for-Schleife zu nehmen, die von 1 bis 3 zählt ist Beschäftigungstherapie für den µC und sonst gar nichts. Gut. In dem Fall hast du nur sinnloserweise Rechenzeit verbrutzelt (das wirst du verschmerzen können), aber hier bei den I/O Funktionen auf externen Speicher (hier das EEPROM), beisst dich dein inkonsequentes Vorgehen in den Datentypen so richtig ins Bein.
> Ich habe auch nicht den Anspruch "schönen" Code zu schreiben, für meine Zwecke
reicht es wenn es überhaupt funktiert.
Dazu gibt es eine interessante Beobachtung:
Diejenigen mit dem grauslichsten Code sind meistens auch diejenigen mit
den dümmsten Fehlern.
Sollte uns das zu denken geben?
Ich denke: ja!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.