mikrocontroller.net

Forum: Compiler & IDEs verschiedene Bytes über Bus zuordnen


Autor: Zeroeightfifteen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
ich habe über I2C einen Master und einen Slave verbunden. Auf beiden 
habe ich ca 50 Variablen. Nun will ich über den Master auf dem Slave 
immer nur gezielte Variablen verändern. Wie geht das am besten?
Ich habe dies nun so gelöst.
void variablenzuweisung (zuweisung)
{

switch (steuerbyte)
{
case großX:
kleinx = zuweisung;
break;
case großY:
kleiny = zuweisung;
break;
case großZ:
kleinz = zuweisung;
break;

so bekomme ich halt einen ewig langen text zusammen.
habe mir schon gedacht ob ich dies mit einem array mache.
doch meine variablen sind teilweise int unsigned int und char.

im Grunde funktioniert mein Code so ganz gut, bin damit aber nicht 
zufrieden.

Habt ihr da eine bessere Lösung?

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>doch meine variablen sind teilweise int unsigned int und char.
Wie machst du das denn dann bei deinem obigen Beispiel? Von welchem Typ 
ist denn 'zuweisung'?

Autor: Zeroeightfifteen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zuweisung inst ein int.
wenn ich aber nun schreibe
char1 = variablenzuweisung(zuweisung);

void variablenzuweisung(zuweisung)
{
char2 = zuweisung;
}
dann wird hier ein char in ein char geschrieben.
zuweisung ist ja nur eine zwischenvariable.

Autor: Zeroeightfifteen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab mich verschrieben.
in diesem Beispiel rufe ich variablenzuweisung(zuweisung) nur so auf 
ohne char1 =

Autor: Bernd M. (bernd_m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi!

ich geh mal davon aus, dass du in deinem übertragungsprotokoll jeder 
variablen eine identifikation zugeordnet hast (enum).

typedef enum {
  eVar1 = 0,
  eVar2,
...
  eMaxVars
} eVars



dann kannst du eine tabelle in der art

typedef pointer_auf_schreib_func ...;
typedef pointer_auf_lese_func ...;

typedef struct {
   pointer_auf_schreib_func write;
   pointer_auf_lese_func read;
   pointer_auf_variable adr;
} zugriff_t;


void func_fuer_byte_write (adr von var, wert)
void func_fuer_word_write (adr von var, wert)
byte func_fuer_byte_read (adr von var)
word func_fuer_word_read (adr von var)


const zugriff_t zugriff_tab[eMaxVars] = {
{&func_fuer_byte_write, &func_fuer_byte_read, &var1};
{&func_fuer_word_write, &func_fuer_word_read, &var2};
....
}

if (steuerbyte < eMaxVars) {
   zugriff_tab[steuerbyte].write(zugriff_tab[steuerbyte].adr, 
neuer_wert);
}

bzw:
if (steuerbyte < eMaxVars) {
   retval = zugriff_tab[steuerbyte].read(zugriff_tab[steuerbyte].adr);
}


aufbauen. einzelheiten bitte noch entsprechend ausprogrammieren.
damit beschreibst du die zugriffsmethode auf die jeweilige
variable.

oder du baust die tabelle um auf variablen adresse und variablen länge. 
dann brauchst du nur eine lese und eine schreib funktion.


typedef struct {
   pointer_auf_variable adr;
   länge_der_variable len;
} varinfo_t;

const varinfo_t varinfo_tab[eMaxVars] = {
{&var1, sizeof(var1)};
{&var2, sizeof(var2)};
....
}


if (steuerbyte < eMaxVars) {
   memcpy(varinfo_tab[steuerbyte].adr, neuer_wert, 
varinfo_tab[steuerbyte].len)
}

bzw anders herum.

die letzte idee scheint mir kompakter.

gruss bernd

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.