mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Sehr lange Zeitspannen?


Autor: Konsolenexperte (Gast)
Datum:

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

Autor: Brummel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schließ eine RTC an. z.B. DS1339

Autor: Brummel (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Kannst dort die z.B. die Alarmregister nutzen.

Datenblatt:

Autor: Konsolenexperte (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok Vielen Dank für die schnelle Antwort :)

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

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

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

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

Autor: Andreas B. (bitverdreher)
Datum:

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

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach was benutze eine Datenstruktur:
typedef struct 
{
  uint8_t seconds;
  uint8_t minutes;
  uint8_t hours;
} daytime;

// ...

static daytime _time;

if ((_time.seconds = (++_time.seconds)%60) == 0)
{
   if ((_time.minutes = (++_time.minutes)%60) == 0)  
   {
      _time.hours = (++_time.hours)%24;
   }
}



Autor: Peter Dannegger (peda)
Datum:

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

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

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

Autor: uCler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Michael,

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

Gruss Udo

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So hab ich das z.B. mit meiner Relaiskarte gemacht:
  /* update and evaluate all active timers */
  for (i=0; i<=5; i++)
  {
    if (timers[i].active)
    {
      switch (timers[i].type)
      {
        case TIMER_TYPE_ON:
          if (--(timers[i].units) == 0)
          {
            relay_control((1 << i), RELAYOP_ON);
            timers[i].active = 0;
          }  
          break;
  
        case TIMER_TYPE_OFF:
          if (--(timers[i].units) == 0)
          {
            relay_control((1 << i), RELAYOP_OFF);
            timers[i].active = 0;
          }
          break;
  
        case TIMER_TYPE_CYCLIC:
          if (--(timers[i].units) == 0)
          {
            relay_control((1 << i), RELAYOP_TOGGLE);
      
            timers[i].units = timers[i].reset_value;
          }
          break;
  
        default:
          break;
      }
    }
  }

Autor: peter-neu-ulm (Gast)
Datum:

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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Johnny Maxwell (Gast)
Datum:

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

Autor: uCler (Gast)
Datum:

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

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.