Forum: Mikrocontroller und Digitale Elektronik Fehler beim Lesen/Schreiben des Attiny2313 EEPROM


von Kuseng (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

>  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!

von Kuseng (Gast)


Lesenswert?

Vielen Dank, es funktioniert!

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
Noch kein Account? Hier anmelden.