Hi Leute, wollte mal fragen, ob mir jemand bei meinem Timing Problem helfen kann: Ich will eine Heizung schalten (Jede Sekunde einen Temperaturwert abfragen). Falls die Temperatur dann den gewünschten Wert hat, soll die Heizung ausgeschaltet werden. Allerdings soll die Heizung höchstens 12 Minuten laufen, auch wenn der Temperaturwert nicht erreicht wird. Wie Programmiert man denn sowas? Muss ich in die ISR des Timers eine globale Variable setzen, die dann inkrementoert wird und bei 720 Durchläufen eben abschaltet. Oder hat jemand eine bessere Idee? Vielen Dank für eure Antworten Mike
Ist schon richtig so. Allerdings drauf achten, dass die Variable 16bit ist und volatile, wenn du es in C machst.
volatile bedeutet, daß der Compiler davon ausgehen soll, daß der Inhalt der Variablen sich "hinter seinem Rücken" ändern kann. Sonst könnte der Compiler beispielsweise ein Konstrukt wie while (Variable == wert) Ausdruck; dahingehend optimieren, daß "Variable == wert" nur einmal überprüft wird und danach eine schöne Endlosschleife ausgeführt wird. Ist Variable aber als volatile deklariert, wird mit Sicherheit bei jedem Schleifendurchlauf getestet.
Damit wird dem Compiler gesagt, dass diese Variable ihm "unterm Arsch" geändert werden kann, d.h. ohne dass es aus seiner Sicht logisch wäre. Der Compiler weiss nix von einem Interrupt, und wann und ob dieser aufgerufen wird. Wenn du also schreibst: uint16_t counter; main() counter=0; INTERRUPT... { counter++; } for (;;) { if (counter>720) heizungaus(); } Dann wird der Compiler beim optimieren denken: Hmm, counter wird auf 0 gesetzt, und dann im Programmverlauf nie mehr geändert (weil ja niergends ein Aufruf der Interrupt Routine steht), also kann ich den Vergleich gleich weglassen und heizungaus() immer ausführen. Oder er hält counter in einem Register, und die ISR ändert die Variable im SRAM, aber im main() wird der Wert aus dem Register weiterverwendet. Also, alle globalen Variablen (und auch lokale statische) die in einem Interrupt verwendet werden immer mit volatile deklarieren. Sonst wirst du tagelang Fehler suchen...
Soll natürlich heissen: uint16_t counter; INTERRUPT... { counter++; } void main(void) { counter=0; for (;;) { if (counter>720) heizungaus(); } }
Perfekt!!! Ihr seid soo Spitze! Vielen vielen Dank. Dieses Forum ist echt super schnelle Antworten, gute Erklärungen, und fitte Leute.
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.