Forum: Mikrocontroller und Digitale Elektronik #define This_Decoder_Address zur Laufzeit verändern


von Al. K. (alterknacker)


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
};

von guestabc (Gast)


Lesenswert?

ganz einfach ... statt define einfach int verwenden

von Al. K. (alterknacker)


Lesenswert?

ja, das habe ich jetzt auch gefunden.
Aber wie bekomme ich den Wert in das Struct??

von Blitzi (Gast)


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.

von Al. K. (alterknacker)


Lesenswert?

Das liest sich sehr gut an, aber zu meinen Verständnis sollte es 
einfacher
Darstellbar sein.

von Detlev T. (detlevt)


Lesenswert?

So?
1
FactoryDefaultCVs[0].value = FactoryDefaultCVs[2].value = newAddress;

von Al. K. (alterknacker)


Lesenswert?

Detlev T. schrieb:
> FactoryDefaultCVs[0].value = FactoryDefaultCVs[2].value = newAddress;

Das sieht schon einfacher aus,aber bestimmt nur verständlich welche sich 
schon damit beschäftigt haben.
Es ist zwar nicht zwingend notwendig, aber wegen einer Adressänderung 
immer wieder den Prozessor laden ist auch nicht das Beste.

von Doppel ( º )( º ) D (Gast)


Lesenswert?

Mach halt nen DIP-Schalter an die Beine.

von Al. K. (alterknacker)


Lesenswert?

Doppel ( º )( º ) D schrieb:
> Mach halt nen DIP-Schalter an die Beine.

auch das löst das Problem nicht.;-)))

von Haarbürste (Gast)


Lesenswert?

Al. K. schrieb:
> Doppel ( º )( º ) D schrieb:
> Mach halt nen DIP-Schalter an die Beine.
>
> auch das löst das Problem nicht.;-)))

Doch, du musst den Wert des Dip Schalters bei jedem Start einlesen und 
damit je nach Schalterstellung deine Adresse initialisieren.

von A. S. (Gast)


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?

von Forist (Gast)


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 vom Autor gelöscht.
von MaWin (Gast)


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.

von Al. K. (alterknacker)


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!

: 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.