Forum: Mikrocontroller und Digitale Elektronik Problem: Rechnen mit Werten aus EEPROM


von Sven (Gast)


Lesenswert?

Hallo.

Vorne weg: Ich nutze einen ATmega32 und AVRStudio 4.18

Ich habe folgendes Problem:

Mit einer Matrizenrechnung berechne ich Sensorwerte. Dazu verwende ich 
ein mehrdimensionales Array
1
 double matrix[4][3];

Wenn ich matrix[4][3] bereits mit Werten vorbelege und compiliere 
funktioniert auch alles einwandfrei.

Nun möchte ich aber über HTerm mittels RS-232 die einzelnen matrix-Werte 
an matrix[4][3] übergeben.Diese sollen im EEPROM abgelegt werden.

Der Ablauf ist dabei folgender:
1
 double eeprom_array[12] EEMEM; // ist mein Eeprom-Array

- alle 12 Werte werden über UART RX Interrupt empfangen und in
1
 double copy_array[12]
 abgelegt.
- sind alle übermittelt wurden, dann
1
eeprom_write_block(&copy_array[i++],&eeprom_array[i++],sizeof(copy_array));

Dann hole ich mir die Werte mittels
1
eeprom_read_block(&matrix[s][t],&eeprom_array[i++],sizeof(matrix));

(s,t,i werden natürlich entsprechend hochgezählt)

In matrix[4][3] stehen dann auch die Werte genauso drin, wie ich sie 
über HTerm übergeben habe.Das Problem ist nur, wenn ich nun meine 
Berechnungen mit der Matrix durchführe, kommen total irrsinnige Werte 
bzw. auch -1.#QNAN raus.
Ich muss dazu aber noch erwähnen, dass es sich bei den Matrixwerten um 
Gleitkommawerte mit teilweise Potenz 1E-7 handelt.
Eine Berechnung sieht dann z.B. so aus:
1
 sensorX = x * matrix[0][0] + y * matrix[0][1] + z * matrix[0][2];

Muss ich etwa den Datentyp der arrays auf float ändern??Wäre jetzt eine 
Vermutung von mir.

Vielen Dank schonmal,Sven

von Peter D. (peda)


Lesenswert?

Du mußt sicherstellen, daß double auf Quell- und Ziel-CPU das gleiche 
Format (z.B. IEEE 754), die gleiche Länge und die gleiche Byte-Order 
haben.


Peter

von Sascha W. (sascha-w)


Lesenswert?

Sven schrieb:
> ...
> Der Ablauf ist dabei folgender:
>
>
1
 double eeprom_array[12] EEMEM; // ist mein Eeprom-Array
>
> - alle 12 Werte werden über UART RX Interrupt empfangen und in
>
1
 double copy_array[12]
 abgelegt.
> - sind alle übermittelt wurden, dann
>
1
eeprom_write_block(&copy_array[i++],&eeprom_array[i++],sizeof(copy_array));
i wird hier 2x hochgezählt

> Dann hole ich mir die Werte mittels
>
1
eeprom_read_block(&matrix[s][t],&eeprom_array[i++],sizeof(matrix));
2
>
>
> (s,t,i werden natürlich entsprechend hochgezählt)
>
> In matrix[4][3] stehen dann auch die Werte genauso drin, wie ich sie
> über HTerm übergeben habe.
sicher? - woher weißt du das?
lass doch die Werte mal ausgeben (Display vorhanden?)

Sascha

von Jens (Gast)


Lesenswert?

Hallo Sven,

eines kommt mir komisch vor:

Du verwendest zum Kopieren offensichtlich eine Schleife, die die 
einzelnen Element der Matrix kopiert - als Größe gibst Du aber 
sizeof(array) an.

Ohne ganz sicher zu sein - das wird in die Hose gehen, weil der 
Copy-Bereich viel größer ist als ein Element. Und das könnte zu 
seltsamen Randeffekten führen, weil Du im Speicher rumgeisterst.

Gruß
Jens

von Sven (Gast)


Lesenswert?

Jens wrote:

>Du verwendest zum Kopieren offensichtlich eine Schleife, die die
>einzelnen Element der Matrix kopiert - als Größe gibst Du aber
>sizeof(array) an.

Versteh ich grad nicht ganz: beide Array´s (copy_array und eeprom_array) 
bestehen aus [12] Feldern.

Sascha Weber wrote:
>i wird hier 2x hochgezählt
sorry,war falsch abgeschrieben worden.

Aber danke für den Tipp mit dem ausgeben lassen. Ich werde dies mal 
tun.Wenn dann Mist heraus kommt, deckt sich das mit der Annahme von 
Peter Dannegger, dass double unterschiedliche Formate hat,oder?

Nur als kleiner Nachtrag: Ich hatte vor einer Weile schonmal ein 
Programm geschrieben und eeprom_write/read_block verwendet. Dabei hatte 
ich eindimensionale Arrays verwendet und es lief problemlos.Deswegen 
macht mich das alles hier etwas stutzig.

von Jens (Gast)


Lesenswert?

Hallo Sven,

nach meiner Kenntnis liefert sizeof(array) die Größe des gesamten Arrays 
in Bytes. Hier also Double*12. Du brauchst aber an der Stelle eigentlich 
sizeof(double) oder wie man manchmal nutzt sizeof(array[0]).

Alternativ geht auch
1
eeprom_write_block(copy_array,eeprom_array,sizeof(copy_array));
ganz ohne Schleife.

Die unterschiedlichen Float-Formate machen nur ein Problem, wenn Du die 
Zahlen im Binar-Format austauscht. Per HTerm hast Du sie ja vermutlich 
als ganz normale Zahl 42.0815 eingetippt.

Gruß
Jens

von Sven (Gast)


Lesenswert?

Sascha Weber wrote:

> lass doch die Werte mal ausgeben (Display vorhanden?)

hab die Werte nachdem ich sie über HTerm eingegeben, mit 
eeprom_write_block abgelegt und eeprom_read_block in matrix[4][3] 
geschrieben habe wieder auf dem HTerm ausgeben lassen und die stimmen 
genau mit den eingegebenen überein. Daran liegt es also nicht.

Jens wrote:

> Du brauchst aber an der Stelle eigentlich
>sizeof(double) oder wie man manchmal nutzt sizeof(array[0]).

Danke.Das werde ich mal probieren.

von Sven (Gast)


Lesenswert?

edit: muss ich dann in eeprom_read_block auch sizeof(double) schreiben?

von Sven (Gast)


Lesenswert?

ich habe mal sizeof(double) in der eeprom_write/read_block()-Fkt. 
geschrieben und dabei hat es nur die ersten 4 Werte in das Array 
geschrieben, obwohl ich von HTerm 12 übergeben habe?!?

von Sven (Gast)


Lesenswert?

Letzten Post von mir bitte als nichtig ansehen,es hatte sich ein 
falscher Variablenwert eingeschlichen ;-)

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.