mikrocontroller.net

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


Autor: da_mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Fritz Ganter (Gast)
Datum:

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

Autor: da_mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Cool danke!
Aber was bedeutet dieses volatile eigentlich?

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Admin! Wir brauchen Semaphore fürs posten!

:-)

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Soll natürlich heissen:


uint16_t counter;

INTERRUPT...
{
 counter++;
}

void main(void)
{
 counter=0;

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

 }

}

Autor: da_mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Perfekt!!!

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

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> schnelle Antworten,

Nur wegen Darmgrippe!
:-(

Autor: da_mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann werd ich mich mal ans Programmieren machen.
Gute Besserung

   Mike

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.