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!
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.
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.
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
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 | }
|
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
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.
Hallo Michael, auf einem Controller wuerde ich eher auf % verzichten, und mit > arbeiten. Gruss Udo
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 | }
|
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.
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 ;-)
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.