Forum: PC-Programmierung Messwerte aufnehmen Funktion einfach aber ich schaffs nict.


von Timo (Gast)


Lesenswert?

Hi,

ich schaff es irgendwie nicht! Wie kann ich bitte in C (stm32) eine 
Anzahl von Messwerten aufnehmen und abrufen?

Es sind neun Werte:
1
Accel[3] Gyro[3] Mag[3] 
2
3
Accel X Y Z GYRO X Y Z  MAG X Y Z
4
5
Messung_1[9]
6
Messung_2[9]
7
Messung_3[9]
8
.
9
.
10
Messung_n[9]

im Prinzip eine Matrix oder ein 2D Array auf das man dann spaeter 
zugreifen kann.

kann mir jemand bitte mal die Schleife schreiben?

Ich hatte das so versucht:
1
int col[9];
2
int row[5000]; 
3
4
while (pbuttonstate == false) //abbruch wenn taster gedrueckt
5
{
6
7
8
   for (i=0; i<5000; i++) //oder abbruch wenn 5000 werte aufgezeichnet
9
10
   {
11
   //aktuelle Messwerte in collum array laden
12
   col[]={accel[1],[accel[2],accel[3],Gyro[1],Gyro[2],Gyro[3],Mag[1],Mag[2],Mag[3]}; 
13
   
14
   //col array in row array schreiben
15
   row[i]= col[];
16
   
17
   } 
18
19
20
}


Viele Gruesse
Timo

von Mark B. (markbrandis)


Lesenswert?

[obligatory]
Kauf Dir ein C-Buch
[/obligatory]

;)

von Miška (Gast)


Lesenswert?

Stichwort "Mehrdimensionales Array".
Das sollte doch auch der STM32-C-Compiler können, oder?
Übersichtlicher (und eindimensional) wär's aber sicherlich mit 
Strukturen,
z.B. in der Form:
1
typedef struct Data_s {
2
   int accel[3];
3
   int gyro[3];
4
   int mag[3];
5
} Data;

Die for ()-Schleife und das C-Buch bleiben als Hausaufgabe.

von Timo (Gast)


Lesenswert?

ja so eine struktur hab ich bereits :)
1
typedef struct
2
{
3
4
  s16 sAcc[3];
5
  s16 sGyro[3];
6
  s16 sMag[3];
7
  
8
  float uGain[9];      /*AccX AccY AccZ - GyroX GyroY GyroZ - MagnX MagnY MagnZ */
9
  s16 sOffset[9];      /*AccX AccY AccZ - GyroX GyroY GyroZ - MagnX MagnY MagnZ */
10
  
11
#ifdef AHRS_MOD
12
  IMU100_QUAT          m_quat;
13
  IMU100_SENSORDATA    m_sensorData;
14
  IMU100_EULER_ANGLES  m_angle;
15
#endif   
16
} IMU100_DATA;



ok - ihr seid gemein :(  ... jetzt muss ich hier herumexperimentieren 
und kann nicht in expandebles 2

von troll (Gast)


Lesenswert?

Timo schrieb:
> ok - ihr seid gemein :(  ... jetzt muss ich hier herumexperimentieren
> und kann nicht in expandebles 2
Du kannst C nicht auf die Schnelle anhand irgendwelcher Tutorials 
lernen. Wirklich nicht.

von Karl H. (kbuchegg)


Lesenswert?

Solange du sowas schreibst

>    col[]={accel[1],[accel[2],accel[3],Gyro[1],Gyro[2],Gyro[3],Mag[1],Mag[2] 
,Mag[3]};

sind nicht wir es, die gemein sind. Sondern du bist gemein, weil du bar 
jeglichen C-Basiswissens dich an der Programmierung versuchst und dann 
meinst, du könntest das in 10 Minuten.

von Helmut L. (helmi1)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Sondern du bist gemein, weil du bar
> jeglichen C-Basiswissens dich an der Programmierung versuchst und dann
> meinst, du könntest das in 10 Minuten.

Karl Heinz das Kino faengt doch um 17 Uhr an und er will doch den Film 
kucken :=)

von Timo (Gast)


Lesenswert?

col[]={accel[1],[accel[2],accel[3],Gyro[1],Gyro[2],Gyro[3],Mag[1],Mag[2]

das war pseudo code!

von troll (Gast)


Lesenswert?

Timo schrieb:
> das war pseudo code!
Nein, das ist der Beweis dass du kein C kannst.

Buchtipp: Kernighan und Ritchie, Programmieren in C

von Karl H. (kbuchegg)


Lesenswert?

Timo schrieb:
> col[]={accel[1],[accel[2],accel[3],Gyro[1],Gyro[2],Gyro[3],Mag[1],Mag[2]
>
> das war pseudo code!

Ach?
Darum schreibst du auch
> Ich hatte das so versucht:
drüber.

Es hilft nichts. Du brauchst ein C-Buch.

Arrays sind in C Bastarde, die anders funktionieren als alle anderen 
Datentypen/Datenstrukturen. Deren Regeln muss man kennen. Und dann gibt 
es in deinem C Buch noch tausende andere Dinge, die dir alle neu sein 
werden und die du noch nicht kennst, die du aber alle kennen musst um 
erfolgreich Programm schreiben zu können.

von Timo (Gast)


Lesenswert?

ok ich habs :D   Kino ich kann kommen :)

Meine Loesung und sogar verstaendlich fuer alle anderen timos auf der 
welt.
1
int zeilen = 5000;
2
int spalten = 9;
3
int Messmatrix[zeilen][spalten];
4
5
6
while(bedingung == true) //aus wenn taster gedrueckt
7
{
8
9
 for (i=0; i<5000; i++) //oder abbruch wenn 5000 werte aufgezeichnet mit 100hz
10
11
   {
12
//Messwerte aktualisieren und in globale variablen schreiben
13
getSensorData();
14
15
//Daten in Zeile i fuellen
16
   Messmatrix[i][spalten]={ {accel[1],[accel[2],accel[3],Gyro[1],Gyro[2],Gyro[3],Mag[1],Mag[2],Mag[3]} };
17
 
18
 Delay(10) //Delay in ms , 10 = 100hz
19
 } 
20
21
}

von Karl H. (kbuchegg)


Lesenswert?

Timo schrieb:
> ok ich habs :D   Kino ich kann kommen :)

Sorry. Kino wird noch warten müssen.


Ein Hinweis:
Arrays sind in C Bastarde.
Es gibt keine Operation (ausser der Initialisierung), bei der du mit 
einem Array ALS GANZES etwas machen könntest. Alle Array Operationen 
laufen in C IMMER über den Weg, das du eine Schleife über das Array 
legen musst und die Operation EINZELN auf die ARRAY-Elemente ausführen 
musst (bzw. sonst irgendwie dafür sorgst, dass die einzelnen Elemente 
angesprochen werden)

Ein Array in ein anderes umkopieren funktioniert nicht so

    ziel = quelle;

sondern so

    for( i = 0; i < Grösse_des_Arrays; i++ )
      ziel[i] = quelle[i];

Und das ist bei ALLEN Array-Operationen so. Egal welche Operation. Sei 
es das Umkopieren in ein anderes Arrays, sei es das vergleichen mit 
einem anderen Array, sei es die Anwendung einer Rechenvorschrift auf das 
Array, sei es .... Man kann in C nichts mit einem Array als Ganzes 
anfangen, sondern muss immer alles auf die einzelnen Elemente 
runterbrechen. Und in den meisten Fällen bedeutet das: eine Schleife 
drüber legen.

Und bei einem 2D Array sind es dann eben 2 Schleifen. Die eine Schleife 
wählt die eine Dimension aus, die darin steckende die andere

   for( i = 0; i < die_eine_Grösse_des_Arrays; i++ )
     for( j = 0; j < die_andere_Grösse_des_Arrays; j++ )
       Array[i][j] = .....

oder manchmal dann auch schon mal so

   for( i = 0; i < die_eine_Grösse_des_Arrays; i++ )
   {
     Array[i][0] = .....
     Array[i][1] = .....
     Array[i][2] = .....
...
   }


So. Und jetzt geh in die nächste Buchhandlung und such dir ein C-Buch 
aus, mit dessen Stil du klarkommst.

von spontan (Gast)


Lesenswert?

Klar geht das so, war doch Pseudo-Code ;-))))

von Richie (Gast)


Lesenswert?

So müsste das gehen Timo:
1
int myArray[100][9]= { 0 }; 
2
3
   for (int row=0; row < 100; row++) {
4
      for (int col=0; col < 9; col++) {
5
 myArray[row][0] = sAcc[0];
6
 myArray[row][1] = sAcc[1];
7
 myArray[row][2] = sAcc[2];
8
 myArray[row][3] = sGyro[0];
9
 myArray[row][4] = sGyro[1];
10
 myArray[row][5] = sGyro[2];
11
 myArray[row][6] = sMag[0];
12
 myArray[row][7] = sMag[1];
13
 myArray[row][8] = sMag[2];
14
}
15
}

von Richie (Gast)


Lesenswert?

sorry das col muss natürlich weg, also die zweite schleife

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.