Forum: Mikrocontroller und Digitale Elektronik Interrupt - Variable speichern


von Niine (Gast)


Lesenswert?

Hey,

also ich hab nur eine kurze Frage, ob ich mir das richtig Vorstelle wie 
ich es in C Umsetze:

Ich will eine Lampe z.b. 8h lang leuchten lassen, aber wenn ich per 
Interrupt einen Schalter umlege, soll die Lampe an sein, egal was ist.
Wenn er wieder umgelegt wird, soll die restliche Zeit bis zu 8h 
weiterlaufen.

Nun dacht ich mir ich nehm eine _delay_ms Schleife mit 1ms und lass es 
laufen. Und wenn ich dann Abbreche, speichert es den Wert in einer 
globalen Variablen. Die ich bei zurücklegen wieder nehme und die 
restlichen Durchläufe nehme.

Ist das so die beste Lösung, oder habt ihr zufällig bessere Ansätze 
dafür?

Danke,

Lg Niine

von Karl H. (kbuchegg)


Lesenswert?

Niine schrieb:

> Nun dacht ich mir ich nehm eine _delay_ms Schleife mit 1ms und lass es
> laufen. Und wenn ich dann Abbreche, speichert es den Wert in einer
> globalen Variablen.

Was willst du da speichern?

> Ist das so die beste Lösung, oder habt ihr zufällig bessere Ansätze
> dafür?

Interrupt braucht es doch gar nicht dafür.
Wenn deine Hauptschleife eine Durchlaufdauer von ca. 1ms hat, dann ist 
das schnell genug, dass du da drinnen auch einen Schalter abfragen 
kannst.

Dein Konzept hat noch einen wunden Punkt: wie startest du die 8 Stunden?

Ich geh mal davon aus, dass die 8 Stunden nach dem Einschalten des µC 
laufen sollen
1
    Sekunden = 8L * 60L * 60L;    // 8 stunden als Sekunden ausgedrückt
2
    Millisekunden = 0;
3
    Schaltausgang auf ein;
4
5
    while( 1 ) {
6
7
      if( Schalter auf aus ) {   // d.h. die Uhr soll zählen
8
        Millisekunden++;
9
        if( Millisekunden == 1000 ) {
10
          if( Sekunden > 0 ) {
11
            Sekunden--;
12
            if( Sekunden == 0 )
13
              Schaltausgang auf aus;
14
          }
15
        }
16
      }
17
18
      _delay_ms( 1 );
19
    }

Die Zeit wird nicht ganz genau stimmen. Wenn es genauer sein soll, 
müsste man einen Timer im CTC Modus benutzen und den auf den Quarz 
einstellen, so dass man exakte Zeitpulse kriegt und nicht nur 
ungefähres, so wie mit _delay_ms

von Niine (Gast)


Lesenswert?

Hallo kbuchegg,

danke für deine Tipps.
Werde es so umsetzen.

Die 8 Stunden sollen nicht genau sein. Geht darum eine LED Aquariumlampe 
zu steuern, so mit Sonnenaufgang, -untergang per PWM für die Fische zu 
machen.

Das An und Ausschalten übernimmmt eine Zeitschaltuhr, da eine direkte 
Uhr mit zu implementieren würde mein Projekt sprengen.

Also quasi so An -> Sonnenaufgang 15min -> 12h Anbleiben 100% -> 
Sonnenuntergang 15min -> Aus - Fertig und wenn Aus und An geht, geht das 
Spiel von vorn los.

Von daher ist es jetzt nicht so schlimm wenn es 12h 35min anbleibt.

Danke nochmal.

Lg Niine

von Karl H. (kbuchegg)


Lesenswert?

Niine schrieb:

> Das An und Ausschalten übernimmmt eine Zeitschaltuhr, da eine direkte
> Uhr mit zu implementieren würde mein Projekt sprengen.

Na ja.
So schwer ist das auch wieder nicht. An den µC kommt ein Quarz, damit du 
eine einigermassen stabile Zeitbasis hast und fürs erste reicht das 
schon. Wenn man die Uhr alle paar Monate mal nachstellt, ist das ja 
nicht weiter schlimm. Und da Stromausfälle bei uns eher selten sind, ist 
das auch kein Drama, wenn man danach die Uhr einstellen muss.

Dann sollte allerdings ein LCD mit rann und ein paar Taster, damit man 
die Zeiten auch alle einstellen kann. So gesehen ist das dann schon 
aufwändiger.

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz Buchegger schrieb:

> Na ja.
> So schwer ist das auch wieder nicht. An den µC kommt ein Quarz, damit du
> eine einigermassen stabile Zeitbasis hast und fürs erste reicht das
> schon. Wenn man die Uhr alle paar Monate mal nachstellt, ist das ja
> nicht weiter schlimm. Und da Stromausfälle bei uns eher selten sind, ist
> das auch kein Drama, wenn man danach die Uhr einstellen muss.

Weil ich sie gerade in einem anderen Thread gesehen habe

http://www.avr-projekte.de/tinyclock.htm

Die Temperatur musst du ja nicht bestücken. Auf der anderen Seite, warum 
nicht. Und ein Pin für die Beleuchtung ist auch noch fei.

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.