Forum: Mikrocontroller und Digitale Elektronik C Funktionsaufruf mit 2D Array


von Paul B. (paule201)


Lesenswert?

Hallo zusammen,

ich beschäftige mich gerade mit dem LT6813. Dazu gibts ein EVAL Board.
Für die schnelle Inbetriebnahme wollte ich auf den Code von LT 
zurückgreifen, der für den LINDUINO geschrieben ist. Eine Art Arduino 
von LT.

https://github.com/analogdevicesinc/Linduino/blob/master/LTSketchbook/Part%20Number/6000/6813/DC2350AB/DC2350AB.ino

In Zeile 166 steht
1
cell_asic BMS_IC[TOTAL_IC]; //!< Global Battery Variable

Angeblich ein 2D Array, aber damit komme ich nicht klar. Welchen Typ 
hast das Array? uint8_t? char? Ich nutzt die CubeIDE von ST, aber selbst 
der Arduino Compiler kann damit nichts anfangen.


Nehmen wir an, ich will den Funktionsblock ab Zeile 277 aufrufen, wie 
müsste ich dafür "BMS_IC" übergeben? Wie sieht das Konstrukt aus, 
welches ich in die Funktion übergeben kann? Wie sieht dessen 
Initialisierung aus?
1
error = LTC6813_rdcv(SEL_ALL_REG,TOTAL_IC,BMS_IC); // Set to read back all cell voltage registers

Ich habe schon herausgefunden das man "TOTAL_IC" über ein #define setzen 
muss statt als "const uint8_t" aber selbst dann komm ich nicht auf einen 
grünen Zweig.

EDIT: Das lesen von einem Byte via SPI klappt schon, inklusive korrekter 
Prüfsumme.

Danke!

: Bearbeitet durch User
von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Paul B. schrieb:
> LINDUINO
Kenne ich nicht

Paul B. schrieb:
> Welchen Typ hast das Array?

Offensichtlich ein Array of cell_asic
Aber was cell_asic ist, hältst du geheim

Beitrag #7448687 wurde vom Autor gelöscht.
von Εrnst B. (ernst)


Lesenswert?

Arduino F. schrieb:
> Aber was cell_asic ist, hältst du geheim
1
/*! Cell variable structure */
2
typedef struct
3
{
4
  ic_register config;
5
  ic_register configb;
6
  cv  cells;
7
  ax  aux;
8
  st  stat;
9
  ic_register com;
10
  ic_register pwm;
11
  ic_register pwmb;
12
  ic_register sctrl;
13
  ic_register sctrlb;
14
  uint8_t sid[6];
15
  bool isospi_reverse;
16
  pec_counter crc_count;
17
  register_cfg ic_reg;
18
  long system_open_wire;
19
} cell_asic;

und weiter ins Kaninchenloch:
1
typedef struct
2
{
3
  uint8_t cell_channels; //!< Number of Cell channels
4
  uint8_t stat_channels; //!< Number of Stat channels
5
  uint8_t aux_channels;  //!< Number of Aux channels
6
  uint8_t num_cv_reg;    //!< Number of Cell voltage register
7
  uint8_t num_gpio_reg;  //!< Number of Aux register
8
  uint8_t num_stat_reg;  //!< Number of  Status register
9
} register_cfg;
...
1
/*! IC register structure. */
2
typedef struct
3
{
4
  uint8_t tx_data[6];  //!< Stores data to be transmitted 
5
  uint8_t rx_data[8];  //!< Stores received data 
6
  uint8_t rx_pec_match; //!< If a PEC error was detected during most recent read cmd
7
} ic_register;
8
9
/*! PEC error counter structure. */
10
typedef struct
11
{
12
  uint16_t pec_count; //!< Overall PEC error count
13
  uint16_t cfgr_pec;  //!< Configuration register data PEC error count
14
  uint16_t cell_pec[6]; //!< Cell voltage register data PEC error count
15
  uint16_t aux_pec[4];  //!< Aux register data PEC error count
16
  uint16_t stat_pec[2]; //!< Status register data PEC error count
17
} pec_counter;


und noch weiter zu "cv", "st", "ax"...
Ein Hoch auf eine IDE, die einem das bei Mouse-Over direkt aufdröselt.

: Bearbeitet durch User
von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Schau an...
Der Datentype ist damit klar, somit auch der Zugriff.


> C Funktionsaufruf mit 2D Array
Arduino ist C++, dein LINDUINO wohl auch.

von Sophie T. (sophie_t)


Lesenswert?

Zeig doch mal den Funktionsheader von LTC6813_rdcv

von Marco H. (damarco)


Lesenswert?

Dem Fragesteller fehlt einfach das wissen wie man auf Array aus 
Strukturen zugreift. 
https://openbook.rheinwerk-verlag.de/c_von_a_bis_z/015_c_strukturen_006.htm

von Rolf M. (rmagnus)


Lesenswert?

Paul B. schrieb:
> Angeblich ein 2D Array, aber damit komme ich nicht klar. Welchen Typ
> hast das Array? uint8_t? char? Ich nutzt die CubeIDE von ST, aber selbst
> der Arduino Compiler kann damit nichts anfangen.

Was heißt "kann damit nichts anfangen"? Und wie sieht der Code konkret 
aus, mit dem du es versucht hast?

> Nehmen wir an, ich will den Funktionsblock ab Zeile 277 aufrufen, wie
> müsste ich dafür "BMS_IC" übergeben?

Das kommt auf die Funktion an. Die ist in diesem Code nirgends 
definiert.

Arduino F. schrieb:
> Arduino ist C++, dein LINDUINO wohl auch.

Wobei das hier schon eher nach C klingt:

Paul B. schrieb:
> Ich habe schon herausgefunden das man "TOTAL_IC" über ein #define setzen
> muss statt als "const uint8_t"

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Rolf M. schrieb:
> Wobei das hier schon eher nach C klingt:

Ja, wie ein Programmierer, der C gelernt hat, und jetzt mit Arduino 
arbeitet.
So sieht das ganze Programm aus.
bzw. halbherzig übertragen Software, Richtung Arduino.
Nicht hübsch, aber wird wohl tun...

von Veit D. (devil-elec)


Lesenswert?

Hallo,

wenn man den Link vom Eingangsthread rückwärts folgt kommt man zu den 
eingebundenen Libs.

https://github.com/analogdevicesinc/Linduino/tree/master/LTSketchbook/libraries/Linduino

https://github.com/analogdevicesinc/Linduino/tree/master/LTSketchbook/libraries/LTC681x

https://github.com/analogdevicesinc/Linduino/tree/master/LTSketchbook/libraries/LTC6813

die struct Definition 'cell_asic' stammt aus der LTC681x.h
Das sollte helfen.

@ TO: Besser ist es keine Auszüge posten sondern immer den Link zum 
Gesamten.

: Bearbeitet durch User
von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Marco H. schrieb:
> Dem Fragesteller fehlt einfach das wissen wie man auf Array aus
> Strukturen zugreift.
> https://openbook.rheinwerk-verlag.de/c_von_a_bis_z/015_c_strukturen_006.htm

Ich habe da mal etwas reingelesen..

Erstens:
Ein C Buch, wir sind hier in C++, da Arduino Derivat.
Gerade in Punkto struct, hat sich mit C++ recht viel geändert.

Zweitens:
Genau aus dem gezeigten Kapitel.
1
void Sort(struct adres sort[], int nr) {
2
   int i,j;
3
   struct adres *temp;
4
5
   temp = malloc(sizeof(struct adres *));
6
   if(NULL == temp) {
7
      printf("Konnte keinen Speicher reservieren...\n");
8
      return;
9
   }
10
   for(i = 0; i < nr; i++) {
11
      for(j=i+1;j<nr;j++) {
12
         if(strcmp(sort[i].nname, sort[j].nname) > 0) {
13
            *temp=sort[j];
14
            sort[j]=sort[i];
15
            sort[i]=*temp;
16
         }
17
      }
18
   }
19
   printf(".....Sortiert!!\n\n");
20
}
Sehe ich hier wirklich ein malloc() ohne free()?
Gruselig.
An anderer Stelle sehe ich, wie Zeiger auf lokale Arrays zurückgegeben 
werden.


Mein Fazit:
Bücher sind gut!
Dieses nicht.
Ein Grundlagenbuch, wo perfide Fehler eingestreut sind, welche man ohne 
Detail Wissen schwerlich findet.

Das C++ Buch aus der gleichen Reihe ist übrigens deutlich besser, soweit 
ich das einschätzen kann.

: Bearbeitet durch User
von Wilhelm M. (wimalopaan)


Lesenswert?

Arduino F. schrieb:
> Sehe ich hier wirklich ein malloc() ohne free()?
> Gruselig.
> An anderer Stelle sehe ich, wie Zeiger auf lokale Arrays zurückgegeben
> werden.

V.a. ist das vollkommen unnötig.

Vllt ist diese Beispiel aus dem Kontext gerissen, aber das Snippet ist 
wirklich schlimm.

von Rolf M. (rmagnus)


Lesenswert?

Arduino F. schrieb:
> Sehe ich hier wirklich ein malloc() ohne free()?

Insbesondere eins, das nicht Platz für die struct, sondern nur für einen 
Zeiger darauf bereitstellt. Immerhin wurde aber gepüft, ob die 
Allokation erfolgreich war.

von Harald K. (kirnbichler)


Lesenswert?

Rolf M. schrieb:
> Insbesondere eins, das nicht Platz für die struct, sondern nur für einen
> Zeiger darauf bereitstellt.

Das ist wirklich beeindruckend schwachsinnig. Nicht, daß man "temp" 
nicht für genau den gleichen Zweck verwenden könnte ...

von Monk (roehrmond)


Lesenswert?

Arduino F. schrieb:
> Bücher sind gut!
> Dieses nicht.

Das finde ich sehr schade, weil das Buch übersichtlich aufgebaut und gut 
verständlich ist. Das Buch gibt es schon so viele Jahre, da wäre genug 
Zeit gewesen, Fehler zu korrigieren. Ich habe da mal einen (anderen) 
Fehler gemeldet, aber meine Anfrage blieb unbeantwortet.

: Bearbeitet durch User
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.