#define This_Decoder_Address zur Laufzeit verändern

OP #5130024
Lesenswert?

Hallo
Wie kann ich am einfachsten This_Decoder_Address
zur Laufzeit oder im Setup verändern?

#define This_Decoder_Address 4

struct CVPair
{
  uint16_t  CV;
  uint8_t   Value;
};

CVPair FactoryDefaultCVs [] =
{
  // The CV Below defines the Short DCC Address
  {CV_MULTIFUNCTION_PRIMARY_ADDRESS, This_Decoder_Address},

  // These two CVs define the Long DCC Address
  {CV_MULTIFUNCTION_EXTENDED_ADDRESS_MSB, 0},
  {CV_MULTIFUNCTION_EXTENDED_ADDRESS_LSB, This_Decoder_Address},

// ONLY uncomment 1 CV_29_CONFIG line below as approprate
//  {CV_29_CONFIG,                                      0}, // Short 
Address 14 Speed Steps
  {CV_29_CONFIG,                       CV29_F0_LOCATION}, // Short 
Address 28/128 Speed Steps
//  {CV_29_CONFIG, CV29_EXT_ADDRESSING | CV29_F0_LOCATION}, // Long 
Address 28/128 Speed Steps
};
Gast #5130049
Lesenswert?

guestabc schrieb:
> statt define einfach int verwenden

Das ist natürlich Quatsch, da die Initialisierung nicht dynamisch mit 
einer Änderung der Variable aktualisiert wird.
Ich würde vorschlagen, eine Funktion zu schreiben, die als Argument den 
Adreßparameter entgegennimmt und alle Elemente des Arrays anfaßt. Oder 
aber Du definierst die Adresse in den einzelnen Elementen als Zeiger auf 
eine Variable, die den aktuellen Wert enthält.
Gast #5130180
Lesenswert?

Anscheinend weißt Du nicht viel über C oder uC

Daher ist es schwer zu sehen, was Dein Problem ist:

Einen Wert überhaupt zur Laufzeit zu ändern? Task, main-loop, ISR, davon 
abhängige Initialisierungen, Abhängigkeiten?

Den neuen wert vorzugeben? Also per Tastendruck, serieller 
Schnittstelle, Debugger, Dip Schalter?

Ist das Dein Code?
Gast #5130186
Lesenswert?

Al. K. schrieb:
> Das sieht schon einfacher aus,aber bestimmt nur verständlich welche sich
> schon damit beschäftigt haben.

So ist das. Ganz ohne Grundlagen geht es nicht.

Übersichtlicher würde die Sache schon mal, wenn du hier im Forum für 
deinen Code die Code-Tags verwendest ( "[ C ]" bzw. "[ /C ]" ohne 
Leerzeichen). Dann würden deine Code-Kommentar nicht so wild rumstreuen 
und Syntax-Highlightning würde auch funktionieren ...

Bsp.
1
struct CVPair
2
{
3
  uint16_t  CV;
4
  uint8_t   Value;
5
};
6
...
7
// ONLY uncomment 1 CV_29_CONFIG line below as approprate
8
//  {CV_29_CONFIG,                                      0}, // Short Address 14 Speed Steps
9
  {CV_29_CONFIG,                       CV29_F0_LOCATION}, // Short Address 28/128 Speed Steps
10
//  {CV_29_CONFIG, CV29_EXT_ADDRESSING | CV29_F0_LOCATION}, // Long Address 28/128 Speed Steps
Beitrag #5130193 wurde von einem Moderator gelöscht.
Gast #5130252
Lesenswert?

Al. K. schrieb:
> Wie kann ich am einfachsten This_Decoder_Address
> zur Laufzeit oder im Setup verändern

Es ist das Grundprinzip in   sass ein define zur Compilezeit fest ist 
und nicht im Programmlauf geändert werdrn kann.

Aber du verwendest den Wert in 2 Initialisierungen. Eine Initialisierung 
eines statischen Wertes erfolgt vor deinem Programmlauf, kann also nur 
nachträglich überschrieben werden, wie Detlev zeigte

FactoryDefaultCVs[0].value = FactoryDefaultCVs[2].value = newAddress;

Wenn der Wert nicht in unveränderlichem ROM liegt, wie das bei manchen 
uC Dialekten möglich wäre.
OP #5130266
Lesenswert?

Haarbürste schrieb:
> Doch, du musst den Wert des Dip Schalters bei jedem Start einlesen und
> damit je nach Schalterstellung deine Adresse initialisieren.

Das einlesen eines Wertes,im Setup ist doch nicht das Problem.
Danach soll der Wert in das Struct.
... ja in C habe ich sehr wenig Ahnung, wollte nie ein Klammeraffe 
werden.Trotzdem bin ich auf dem Weg dahin.



Edit:
FactoryDefaultCVs[0].value = FactoryDefaultCVs[2].value = newAddress;
Hatte dies Gestern schon getestet.war eben schon sehr spät.

Jetzt nochmals zum Test und sofort bemerkt:
FactoryDefaultCVs[0].Value = FactoryDefaultCVs[2].Value = 44;

Im setup alte Adr. überschrieben.
Mit dem DCC Monitor lässt sich dies gut überprüfen.
Danke für die Hilfe!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren