Forum: Mikrocontroller und Digitale Elektronik Sehr lange Zeitspannen?


von Konsolenexperte (Gast)


Lesenswert?

Hallo liebe Leute!

Ich habe mal eine Frage wie man folgendes Problem mit einem 
Mikrocontroller (atmega16) lösen kann.

Gehen wir mal von dem Beispiel aus, ich möchte meine Rolläden jeden Tag 
um 18 Uhr herunterfahren lassen. Wie kann man den Mikrocontroller eine 
so lange Zeit "warten" lassen, während er nichts zu tun hat?

Ich weiß es zum Beispiel von Lichtschranken-Messungen, dass bereits 10 
sekunden eine ewig lange Zeit sind, die man umständlich herunterteilen 
muss (Prescaler, usw. selbst bei einer "geringen" TaktFrequenz von 1 
MHz).

Wie lässt man den dann alle 24 Stunden EINMAL kurz einschalten?


Danke!

von Brummel (Gast)


Lesenswert?

schließ eine RTC an. z.B. DS1339

von Brummel (Gast)


Angehängte Dateien:

Lesenswert?

Kannst dort die z.B. die Alarmregister nutzen.

Datenblatt:

von Konsolenexperte (Gast)


Lesenswert?

ok Vielen Dank für die schnelle Antwort :)

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Sekundentakt im Controller erzeugen (Timer mit Prescaler und CTC + 
Zählvariable), bei 60 Sekunden übertrag auf 1er Minuten, bei 10 Minuten 
Übertrag auf 10er Minuten, bei 60 Minuten Übertrag auf 1er Stunden, bei 
10 Stunden Übertrag auf 10er Stunden, nach 24 Stunden alles löschen. Für 
jedes "Digit" wird ein Byte als Zähler genutzt. Bei Verwendung von sehr 
genauen Uhrenquarzen (4,194304 Mhz oder 32,768 kHz) geht die Uhr dann 
auch entsprechend genau. Alternativ kann die Schaltung durch ein 
DCF-Modul aufgewertet werden, wodurch außerdem das Umstellen von Winter- 
auf Sommerzeit und umgekehrt entfällt.

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Du kannst mit recht einfachen Mitteln eine Uhr programmieren. Die musst 
halt beim Einschalten auch einmal stellen. Und dann kannst z.B. nen 
Timer installieren, der die Uhr jede Sekunde erhoeht und dort pruefen, 
ob fuer die Aktuelle Zeit z.B. ein Ereignis auszuloesen ist.

von Andreas B. (bitverdreher)


Lesenswert?

Hi,
Du machst einen Timerinterrupt mit 100 Hz. (Vorteiler 1024, Preload 155 
bei 16Mhz)
Darin zählst Du eine 64 Bit Variable hoch. Bei 8640000 hast Du dann 1 
Tag.

Gruß
Andy

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Ach was benutze eine Datenstruktur:
1
typedef struct 
2
{
3
  uint8_t seconds;
4
  uint8_t minutes;
5
  uint8_t hours;
6
} daytime;
7
8
// ...
9
10
static daytime _time;
11
12
if ((_time.seconds = (++_time.seconds)%60) == 0)
13
{
14
   if ((_time.minutes = (++_time.minutes)%60) == 0)  
15
   {
16
      _time.hours = (++_time.hours)%24;
17
   }
18
}

von Peter D. (peda)


Lesenswert?

Konsolenexperte wrote:

> Ich weiß es zum Beispiel von Lichtschranken-Messungen, dass bereits 10
> sekunden eine ewig lange Zeit sind, die man umständlich herunterteilen
> muss (Prescaler, usw. selbst bei einer "geringen" TaktFrequenz von 1
> MHz).

Das erzeugen langer Zeiten ist mit einem MC überhaupt kein Problem.

Du läßt einen 16Bit-Timer den Quarztakt zählen (z.B. 8MHz).
Und im Overflowinterrupt zählt Du ganz profan Variablen runter, wenn 
eine durch 0 geht, die nächste usw.
Und wenn die letzte durch 0 geht, machst Du Dein Ding und setzt sie alle 
wieder auf den benötigten Startwert.
In C kann man auch Mehrbytevariablen nehmen (int, long oder long long).

Mit nur 8 Byte lassen sich Zeiten bis zu mehreren Giga-Jahren zählen, 
das sollte ja wohl reichen.


Peter

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Man kann natuerlich auch einfach mit relativen Zeiten arbeiten. Fuer 
eine Rolladensteuerung halte ich das aber nicht fuer ausreichend, da man 
hier ja nach Tageszeit arbeitet. Ansonsten kann man natuerlich sagen, 
wenn in 10 Minuten ein Ereignis auszueloesen ist, initialisiere eine 
entsprechende Variable mit 600, dekrementiere im Sekundentakt und loese 
das Ereignis beim Eintreten der 0 aus.

von uCler (Gast)


Lesenswert?

Hallo Michael,

auf einem Controller wuerde ich eher auf % verzichten, und mit > 
arbeiten.

Gruss Udo

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

So hab ich das z.B. mit meiner Relaiskarte gemacht:
1
  /* update and evaluate all active timers */
2
  for (i=0; i<=5; i++)
3
  {
4
    if (timers[i].active)
5
    {
6
      switch (timers[i].type)
7
      {
8
        case TIMER_TYPE_ON:
9
          if (--(timers[i].units) == 0)
10
          {
11
            relay_control((1 << i), RELAYOP_ON);
12
            timers[i].active = 0;
13
          }  
14
          break;
15
  
16
        case TIMER_TYPE_OFF:
17
          if (--(timers[i].units) == 0)
18
          {
19
            relay_control((1 << i), RELAYOP_OFF);
20
            timers[i].active = 0;
21
          }
22
          break;
23
  
24
        case TIMER_TYPE_CYCLIC:
25
          if (--(timers[i].units) == 0)
26
          {
27
            relay_control((1 << i), RELAYOP_TOGGLE);
28
      
29
            timers[i].units = timers[i].reset_value;
30
          }
31
          break;
32
  
33
        default:
34
          break;
35
      }
36
    }
37
  }

von peter-neu-ulm (Gast)


Lesenswert?

Viel schöner und logischer ist es, wenn man den Rollladen von der 
Tageshelligkeit her steuert. Dazu reicht ein Fototransistor, eventuell 
mit Plexiglas-Lichtleiter.
Das Schöne dabei ist, man bekommt über die Tageshelligkeit in Form der 
Rollladenfahrt den Jahreslauf richtig mit.
Man kann sogar zwischendurch den Kontroller in den sleep modus stellen 
und ihn per Schmitt-Trigger am Fototransistor nur kurzzeitig aufwecken.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Einziger Nachteil dabei (aus eigener Erfahrung): man weiß nie genau, 
wann der Rolladen herunter kommt und muß somit immer Obacht geben, daß 
sich in dem Moment keine Dinge und / oder Lebewesen auf der Fensterbank 
befinden ;-)

von Karl H. (kbuchegg)


Lesenswert?

uCler wrote:
> Hallo Michael,
>
> auf einem Controller wuerde ich eher auf % verzichten, und mit >
> arbeiten.
>

:-)
Der Controller dreht 24 Stunden Däumchen, und du machst dir
Sorgen wegen 100 Nanosekunden?
:-)

Man könnte auch 2 Controller nehmen:
Einen hängt man an einer Schnur auf und benutzt ihn als
Pendel.
Der 2.Controller hat dann die Aufgabe das Pendel regelmässig
anzusteuern und die Schwingung in Gang zuhalten UND die Anzahl
der Schwingungen zu zählen. Bei einer bestimmten Anzahl ist
dann ein Tag rum.
Dann hätte der zweite Controller wenigstens was zu tun anstatt
nur stumpfsinnig die Zeit runterzuzählen.

von Johnny Maxwell (Gast)


Lesenswert?

Das erinnert mich an die schöne (und nicht authentische :) Geschichte 
von Niels Bohr und seiner Prüfungsfrage, wie man mit einem Barometer die 
Höhe eines Hause vermessen kann:

 http://www.snopes.com/college/exam/barometer.asp

von uCler (Gast)


Lesenswert?

Hallo Karl heinz,

da gebe ich Dir prinzipiell Recht - wenn es um Rolladen geht. Im 
Automotive Bereich gibt es vergleichbare Anwendungsfälle. Und meistens 
dann, wenn der Motor nicht laeuft. Und dann kaempft man um jedes uA.

Mittlerweile kommt bei mir der Strom auch aus der Steckdose - aber es 
ist halt noch tief drin...

Gruss Udo

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.