Forum: Mikrocontroller und Digitale Elektronik const variable ändern


von Sebastian Z. (sz1985)


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

von M. K. (sylaina)


Lesenswert?

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

Na was meinst du, kann man eine const-variable ändern? Was ist das 
eigentlich? Grundlagen C!

Für Variablen delay musst du dir selbst einen Timer krallen und 
entsprechend einstellen. die _delay_ms(time_in_ms)-Funktion aus delay.h 
kann halt nicht mit Variablen umgehen.

von Lehrmann M. (ubimbo)


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.

von Sebastian Z. (sz1985)


Lesenswert?

Unter C++ ist das mit Hilfe eines Typcast's, ... möglich!

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

von Sebastian Z. (sz1985)


Lesenswert?

Wenn ich einer Timer bzw. Interrupts nutzen könnte, würde ich ja 
sicherlich keine delay-Schleife benötigen.

von Andreas K. (derandi)


Lesenswert?

Was sind denn deine Gründe keinen Timer benutzen zu können?

von Karl H. (kbuchegg)


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.

von (prx) A. K. (prx)


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.

von Joachim S. (jstrand)


Lesenswert?

Und wenn du das selbe delay ganz einfach mehrmals wiederholst solange 
der Zustand nicht erreicht ist?

von Stephan (Gast)


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.

von Rolf Magnus (Gast)


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

von Sebastian Z. (sz1985)


Lesenswert?

Vielen dank für eure Hilfe. Werde feste Zeiten für das Delay macro 
verwenden und die Zeit über eine for Schleife variieren.

von Mark (Gast)


Lesenswert?

Sebastian Z. schrieb:
> Werde feste Zeiten für das Delay macro
> verwenden und die Zeit über eine for Schleife variieren.

Typischer lernresistenter Anfänger.
Da haben ihm die Experten tausendmal erklärt, das es für sowas Timer 
gibt, aber er weiß es natürlich besser...

von Sebastian Z. (sz1985)


Lesenswert?

Das weiß ich auch. Nur kann ich bei dieser Anwendung keinen Interrupt 
verwenden, da der Controller keine speziellen bootbereich hat. Somit 
können die Interrupt Vektoren auch nicht verschoben werden, was in 
meinem Fall aber notwendig wäre

von Mark (Gast)


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

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.