const variable ändern

OP #2221028
Lesenswert?

Hallo zusammen,

ich schreibe gerade ein Programm, in dem ich mit delay Schleifen 
arbeiten muss um auf bestimmte Zustände zu warten. Da sich aber das 
zeitliche Verhalten verändert, würde ich gerne z.B. eine 
_delay_ms(variable) nutzen. Das Problem ist, das in diesem Fall die 
variable als const deklariert sein muss.

Gibt es eine Möglichkeit eine const Variable im Programm zu ändern?

Ich habe bereits das Tutorial angeschaut. Da ist leider nur beschrieben, 
wie man aus dem Flash ein Byte lesen kann, aber nicht wie man nur ein 
Byte ( der const Variablen) schreiben kann.

Vielen Dank für eure Hilfe!

Gruss

Sebastian
#2221031
Lesenswert?

Sebastian Z. schrieb:
> ich schreibe gerade ein Programm, in dem ich mit delay Schleifen
> arbeiten muss um auf bestimmte Zustände zu warten.

Dafür verwendet man Timer.

Sebastian Z. schrieb:
> Gibt es eine Möglichkeit eine const Variable im Programm zu ändern?

const = KONSTANT das heißt fester, unveränderlicher Wert (lat. 
constans „beständig, fest“). Ergo: nicht veränderbar.

Lösung: Timer verwenden oder eine andere Library verwenden die keinen 
const. Input verlangt.

Schon reines Nachdenken führt zu dieser Lösung - man erklärt dem 
C-Kompiler ja nicht aus Witz oder weil einem langweilig ist, dass diese 
Variable konstant ist.
#2221060
Lesenswert?

Sebastian Z. schrieb:
> Unter C++ ist das mit Hilfe eines Typcast's, ... möglich!

Es ist NIE eine gute Idee, seinen Compiler zu belügen!

Wenn etwas const ist, dann ist es konstant - unveränderlich.
Punkt

Der Compiler benutzt diese Information um den Code zu vereinfachen. WEnn 
du ihn dann anlügst und das was du const machst, ist dann nicht 
konstant, was glaubst du, wird/kann wohl alles passieren?

> Und wo soll ich mir deiner Meinung nach den Timer krallen?

Den Umgang mit Timern lernen.


Alternativ einfach mal ein wenig den Grips auspacken.

Wenn man x mal jeweils _delay_ms(1) warten lässt, dann hat man in Summe 
auch x Millisekunden gewartet. Nur dass jetzt das x variabel ist, und 
_delay_ms immer noch seine gewünschte Konstante 1 bekommen hat. 
Schleifen sind schon erfunden.
#2221067
Lesenswert?

Sebastian Z. schrieb:

> _delay_ms(variable) nutzen. Das Problem ist, das in diesem Fall die
> variable als const deklariert sein muss.

Es muss sich um eine lexikalische Konstante handeln, weil nur dann die 
damit verbundene Fliesskommarechnung im Compiler statt zur Laufzeit 
durchgeführt wird. Sowas kannst du aber nicht nachträglich ändern.

In C ist "const" keine Konstante, sondern eine vom Programm nicht zu 
verändernde Variable. Ob "const" oder nicht ist in diesem Zusammenhang 
daher irrelevant, du kriegst eine Fliesskommarechnung zur Laufzeit.

In C++ ist "const" bei Skalaren wie eine lexikalische Konstante, sofern 
dem Compiler der Wert bekannt ist. Und ist dann verwendbar - aber die 
kannst du dann natürlich auch nicht mehr zur Laufzeit ändern. Falls es 
dir mit Tricks und Casts gelingt, hast du dennoch nichts gewonnen.
Gast #2221139
Lesenswert?

A. K. schrieb:
> ... du kriegst eine Fliesskommarechnung zur Laufzeit.

Und genau das ist in Zusammenhang mit _delay_ms keine gute Idee, weil 
sich der Code durch die Fließkommarechnung übel aufbläht (wenn sie nicht 
sowieso verwendet wird).
Falls du, aus welchen Gründen auch immer, keinen Timer verwenden 
möchtest, ist die nächstbessere Lösung daher eine for-Schleife innerhalb 
der _delay_ms mit einem festen Wert aufgerufen wird.
Gast #2221257
Lesenswert?

Sebastian Z. schrieb:
> Hallo zusammen,
>
> ich schreibe gerade ein Programm, in dem ich mit delay Schleifen
> arbeiten muss um auf bestimmte Zustände zu warten. Da sich aber das
> zeitliche Verhalten verändert, würde ich gerne z.B. eine
> _delay_ms(variable) nutzen. Das Problem ist, das in diesem Fall die
> variable als const deklariert sein muss.

Der springende Punkt bei _delay_ms ist nicht, daß der  übergebene 
Parameter const sein muß, sondern daß dessen Wert dem Compiler bekannt 
sein, also eben bereits zur Compilezeit feststehen muß.
Gast #2221671
Lesenswert?

Sebastian Z. schrieb:
> Nur kann ich bei dieser Anwendung keinen Interrupt
> verwenden, da der Controller keine speziellen bootbereich hat.

Was hat das eine mit dem anderen zu tun?

> Somit
> können die Interrupt Vektoren auch nicht verschoben werden, was in
> meinem Fall aber notwendig wäre

Vielleicht solltest du deinen ganzen Programmansatz nochmal 
überdenken...

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