Forum: Mikrocontroller und Digitale Elektronik Timer mit 12 Minuten Länge


von da_mike (Gast)


Lesenswert?

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

von Fritz Ganter (Gast)


Lesenswert?

Ist schon richtig so. Allerdings drauf achten, dass die Variable 16bit
ist und volatile, wenn du es in C machst.

von da_mike (Gast)


Lesenswert?

Cool danke!
Aber was bedeutet dieses volatile eigentlich?

von Rufus T. Firefly (Gast)


Lesenswert?

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.

von Fritz Ganter (Gast)


Lesenswert?

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

von Fritz Ganter (Gast)


Lesenswert?

Admin! Wir brauchen Semaphore fürs posten!

:-)

von Fritz Ganter (Gast)


Lesenswert?

Soll natürlich heissen:


uint16_t counter;

INTERRUPT...
{
 counter++;
}

void main(void)
{
 counter=0;

 for (;;)
 {
   if (counter>720)
     heizungaus();

 }

}

von da_mike (Gast)


Lesenswert?

Perfekt!!!

Ihr seid soo Spitze! Vielen vielen Dank. Dieses Forum ist echt super
schnelle Antworten, gute Erklärungen, und fitte Leute.

von Fritz Ganter (Gast)


Lesenswert?

> schnelle Antworten,

Nur wegen Darmgrippe!
:-(

von da_mike (Gast)


Lesenswert?

Dann werd ich mich mal ans Programmieren machen.
Gute Besserung

   Mike

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.