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 };
ganz einfach ... statt define einfach int verwenden
ja, das habe ich jetzt auch gefunden. Aber wie bekomme ich den Wert in das Struct??
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.
Das liest sich sehr gut an, aber zu meinen Verständnis sollte es einfacher Darstellbar sein.
So?
1 | FactoryDefaultCVs[0].value = FactoryDefaultCVs[2].value = newAddress; |
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.
Doppel ( º )( º ) D schrieb: > Mach halt nen DIP-Schalter an die Beine. auch das löst das Problem nicht.;-)))
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.
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?
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.