#define This_Decoder_Address zur Laufzeit verändern

OP #5130024
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
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.
OP
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.
Gast
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.
Gast
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.