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
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.
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.
Unter C++ ist das mit Hilfe eines Typcast's, ... möglich! Und wo soll ich mir deiner Meinung nach den Timer krallen?
Wenn ich einer Timer bzw. Interrupts nutzen könnte, würde ich ja sicherlich keine delay-Schleife benötigen.
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.
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.
Und wenn du das selbe delay ganz einfach mehrmals wiederholst solange der Zustand nicht erreicht ist?
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.
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ß.
Vielen dank für eure Hilfe. Werde feste Zeiten für das Delay macro verwenden und die Zeit über eine for Schleife variieren.
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...
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.