Forum: Mikrocontroller und Digitale Elektronik Logischer Ansatz für Schaltuhr


von Icke (Gast)


Lesenswert?

Hallo Leute,

ich bräuchte einmal einen Schubs in die richtige Richtung (Idee).
Ich möchte vermöge eines AVR's eine Schaltuhr bauen, welche mir am Tag 
"beliebig viele" Ein- und Ausschaltvorgänge ermöglicht.
Diese sollten minutengenau erfolgen können.
Für den Rest der Woche bleiben diese identisch.

Ferner sollte nach einem Stromausfall der Schaltzustand wieder dem zu 
dieser Zeit gültigen entsprechen.

Mir fällt einfach kein richtiger Ansatz für eine Problemlösung ein, der 
Knoten im Kopf will sich  bisher nicht lösen ;-).
Ich programmiere also noch nicht, daher ist auch die Sprache nun nicht 
entscheidend.
Auch wo die genaue Zeit herkommt ist erst einmal egal, wir gehen davon 
aus, das diese halt zur Verfügung steht.

Hat jemand eine Idee, wie das zu realisieren ist.
Ein Pseudocode wäre toll.

Ich bin mal gespannt....

Vielen Dank im Voraus.

von HertzFrequenz (Gast)


Lesenswert?

1. Uhr ist stromlos
2. Einschalten

3. Uhrzeit einlesen

4. Aus Tabelle der Schaltzeiten den Schaltzustand herauslesen
5. Schaltzustand einstellen
6. Interne Uhr weiterstellen

7. Zu Punkt 4.

wäre mal so eine ganz einfache Vorgehensweise.

von Icke (Gast)


Lesenswert?

Uhr stromlos, Daten weg....

von RTC (Gast)


Lesenswert?


von Kai S. (kai1986)


Lesenswert?

Icke schrieb:
> Uhr stromlos, Daten weg....

Das ist ein altes Problem, die Lösung nennt sich EEPROM. Du legst die 
Daten der Schaltzeitpunkt im EEPROM des µC ab (Flash ginge auch, ist 
aber nicht so langlebig, wie der EEPROM).

Das, was HertzFrequenz geschrieben hat ist als grobe Programmstruktur 
gut. Die aktuelle Uhrzeit kannst du dir z.B. mit einem Modul über DCF77 
(Funkuhrsignal) besorgen oder alternaitv gibt es Realtimeclock ICs, die 
du mit einer Batterie oder Supercap bei Spannungsausfall weiter laufen 
lassen kannst.

Gruß Kai

von dolf (Gast)


Lesenswert?

Icke schrieb:
> Uhr stromlos, Daten weg....

uhr mit goldcap oder stützbatt. stützen dann nix daten weg.
stromsparenden controller verwenden.

von HertzFrequenz (Gast)


Lesenswert?

>Uhr stromlos, Daten weg....

Ach? Ist das so?
Aber da hat sich in den letzten 60 bis 80 Jahren doch einiges getan.

Lochkarten, Ringkernspeicher, ..., EPROM und EEPROMs, CDs, ... etcpp.

von HertzFrequenz (Gast)


Lesenswert?

Ohnehin kann sich doch das:

>Uhr stromlos, Daten weg....

nur auf die Schaltzeiten beziehen, denn der TO schrieb ja:

>Auch wo die genaue Zeit herkommt ist erst einmal egal, wir gehen davon
>aus, das diese halt zur Verfügung steht.

von Falk B. (falk)


Lesenswert?


von Icke (Gast)


Lesenswert?

Richtig, bezieht sich nur auf die Schaltzeiten, Rest ist ja ein alter 
Zopf...
Also ab damit ins Eeprom oder auch Ringkernspeicher.

Im Eeprom Array muss ich dann noch für Plausibilität der Schaltdaten 
sorgen, damit der User das nicht strubbelig machen kann, einiges an 
Arbeit...

von Icke (Gast)


Lesenswert?

ich bekomm's nicht hin, das macht mich fertig....

Hat jemand ein einfaches Programmgerüst?

Benötige dringend Entwicklungshilfe.

Danke

von Amateur (Gast)


Lesenswert?

Ob intern oder extern, um die Uhr in Schwung zu halten brauchst Du 'ne 
Batterie oder 'nen Hi-Cap.

Extra für Dich wurden in ausgewählte µP's EEPROM eingebaut.

Ob beliebig viele Datensätze gespeichert werden können ist wohl eine 
Frage der Definition.
Notfalls gibt's auch Booster (I²C-EEPROM oder so) oder wenn Du sowieso 
eine Batterie brauchst ein externes CMOS-RAM.

von Peter D. (peda)


Lesenswert?

Icke schrieb:
> "beliebig viele" Ein- und Ausschaltvorgänge ermöglicht.
> Diese sollten minutengenau erfolgen können.

Da reicht je Vorgang eine 16Bit Variable aus (1440 Minuten).
In den 1kB EEPROM des ATmega328P passen somit 512 Schaltzeiten, reicht 
Dir das?

Icke schrieb:
> Ferner sollte nach einem Stromausfall der Schaltzustand wieder dem zu
> dieser Zeit gültigen entsprechen.

Nun dann testen wir nach dem Einschalten erstmal alle 1440 Minuten 
durch, ob eine der 512 Schaltzeiten matcht.
Der MC macht sowas schneller als ein Wimpernzucken.
Danach testet er dann nur noch jede Minute.

von Karl H. (kbuchegg)


Lesenswert?

Icke schrieb:
> ich bekomm's nicht hin, das macht mich fertig....

Was genau bekommst du denn nicht hin?

Tip:
Es ist eine gute Idee, wenn man sich die Zeiten sortiert hält (und bitte 
nicht im EEPROM. Das EEPROM brauchst du nur um sie dauerhaft zu 
speichern. Wenn der µC hochfährt holt er sich die Zeiten aus dem EEPROM 
ins SRAM um dort damit arbeiten zu können. Wird eine Zeit verändert, 
dann wird sie ins EEPROM zurück geschrieben, so dass sie beim nächsten 
µC Start wieder von dort geholt werden kann. Aber gearbeitet wird mit 
den Zeiten ganz normal mit Variablen im SRAM)

> Hat jemand ein einfaches Programmgerüst?
>
> Benötige dringend Entwicklungshilfe.

Eine Schleife und 2 Vergleiche?

wenn du dir die Zeiten nicht sortiert hältst:
eine Schleife, 2 Hilfsvariablen und 2 Vergleiche?


Hinweis:
Mit Zeiten operiert es sich leichter, wenn man nicht mit Stunden und 
Minuten operiert, sondern sich die Zeiten als 'Minuten seit Mitternacht' 
ausdrückt. Dann hat man eine einfache während des Tagesablaufs 
ansteigende Zahl, mit der man ohne große Verrenkungen früher/später 
Vergleiche machen kann.

Ich würde mir 1 'Schaltereignis' in Form von
1
struct TimeEvent
2
{
3
  uint16_t time;   // ausgedrückt als Minuten seit Mitternacht
4
  uint8_t  day;
5
  uint8_t  onOff;
6
}
speichern.
VIele Schaltereignisse sind dann ein Array davon.
1
struct TimeEvent timeEvents[20];
2
uint8_t nrUsedEvents;

Im Idealfal halte ich mir dieses Array sortiert nach Wochentag und 
Minute. Mit der aktuellen Zeit geh ich dann einfach dieses Array durch 
und sobald ich auf ein Ereignis treffe, welches 'größer' (und daher 
später) als die aktuelle Zeit ist, weiß ich, das ich das letzte 
zutreffende Schaltereignis gefunden habe (wegen: die sind ja sortiert). 
AUs dem letzten Schaltereignis hol ich mir noch raus, ob der Ausgang 
jetzt ein oder ausgeschaltet werden soll. Das macht das Programm dann 
auch und legt sich wieder schlafen, bis die fortlaufende Uhr anzeigt, 
dass die nächste Minute angebracht ist und ich der Einfachheit halber 
wieder alle Ereignisse durchlaufe (was den Vorteil hat, dass es auch 
dann funktioniert, wenn die Uhr verstellt wird). Zeitproblem ist das 
sicher keines, denn die eigentliche Uhr läuft ja davon unabhängig, die 
20 Ereignisse (oder auch 200 davon) sind in 0 komma Nix durchsucht und 
wenn der Ausgang mal 1 Sekunde zu spät schaltet wird das auch kein 
Beinbruch sein.

Wie machst du es denn händisch mit nichts weiter als Papier, Bleistift 
und einer Armbanduhr? Auf dem Papier notierst du dir alle Zeiten und was 
jeweils dabei zu geschehen hat. Und alle 'heiligen Zeiten' gehts du die 
Liste durch und siehst nach, was davon jetzt gerade zutrifft. Wenn man 
ein Programm schreiben will, ist es immer eine gute Idee, sich erst mal 
zu fragen: Wie würde ich persönlich, mit der Hand, genau dieses Problem 
lösen? Erst dann, wenn man das weiß, dann kann man auch ein Programm 
schreiben, indem man sich selbst beobachtet, wie man das Problem löst 
und sich daraus die Regeln, den Algorithmus, ableitet. Du kannst viel 
mehr als du denkst. Du bist dir nur nicht bewusst, dass du es kannst. 
Programmieren lehrt dich, dir selbst über die Schulter zu schauen, wie 
du eigentlich konkrete Probleme löst.


PS: wenn du den Wochentag nicht brauchst, weil alle Zeiten an allen 
Tagen identisch sind, dann fliegt der natürlich raus.

: Bearbeitet durch User
von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

Icke schrieb:
> Hallo Leute,
>
> ich bräuchte einmal einen Schubs in die richtige Richtung (Idee).
> Ich möchte vermöge eines AVR's eine Schaltuhr bauen, welche mir am Tag
> "beliebig viele" Ein- und Ausschaltvorgänge ermöglicht.
>
Weiß nicht mehr genau was hier realisiert wurde, aber da es sich um ein 
DIY - Projekt handelt, kannst Du dir vielleicht ein paar Informationen 
daraus entnehmen.

Beitrag "Re: Zeitschaltuhr mit LCD und AVR-µC in Assembler"

Bernd_Stein

von Icke (Gast)


Lesenswert?

Lieber Karl Heinz,

vielen Dank für Deine Hilfe und vor allem für die motivierenden Worte.
Als Gelegenheitsbastler und "alter Mann" ist das für mich nicht einfach, 
daher freut mich Dein Zuspruch insbesondere.

Ich gehe in der Regel genau so vor wie Du es beschrieben hast; mit einem 
Bleistift und weißem Blatt Papier.

Wenn einem gewisse Dinge im Kopf nicht klar sind, dann hilft keine EDV 
(Prozessor) der Welt und auch keine noch so schlaue Programmiersprache.
Bitte entschuldige schon jetzt, dass ich nur sporadisch Zeit habe um 
mich zu melden, resp. um die Umsetzung zu kümmern.
Es ist mir vieles Andere wichtiger....

Dennoch hat mich der Ehrgeiz gepackt.

Da ich als Gelegenheitsprogrammierer Bascom bevorzuge fehlt mier hier 
eine Konstrukt wie "Struct".

Ich würde in einem Array gern die Sekunden des Tages als Integer 
darstellen, gleichzeitig aber mit der Info ob angeschaltet oder 
abgeschaltet werden soll.

Da hänge ich momentan, denke aber weiter darüber nach.

Ich hoffe Neujahr wieder etwas Zeit zu finden.
Dir einen guten Rutsch und Gesundheit für 2014!

DS

von L. R. (keyboard)


Lesenswert?

hei,

Interesanntes Thema. Je nach Anforderung auch nicht einfach.

Habe 1980 auch eine Schaltuhr mit 128 Ausgänge geplant und gebaut. 
Damals alles noch in TTL Technik. Umgebung, Industrie. Daten im CMos Ram 
mit Batterie. War mehr als 25 Jahre im Dauereinsatz. Lief über die 
gesamte Zeit ohne Ausfall.

Schönen Abend und einen guten Rutsch ins neue Jahr.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Icke schrieb:
> Da ich als Gelegenheitsprogrammierer Bascom bevorzuge fehlt mier hier
> eine Konstrukt wie "Struct".

Die logische Struktur hat doch Karl Heinz schon vorgeschlagen:

Karl Heinz schrieb:
> Ich würde mir 1 'Schaltereignis' in Form vonstruct TimeEvent
> {
>   uint16_t time;   // ausgedrückt als Minuten seit Mitternacht
>   uint8_t  day;
>   uint8_t  onOff;
> }
> speichern.
> VIele Schaltereignisse sind dann ein Array davon.

> struct TimeEvent timeEvents[20];
> uint8_t nrUsedEvents;


Icke schrieb:
> Ich würde in einem Array gern die Sekunden des Tages als Integer
> darstellen, gleichzeitig aber mit der Info ob angeschaltet oder
> abgeschaltet werden soll.
>
> Da hänge ich momentan, denke aber weiter darüber nach.

Woran hängt es denn?  Ich kann kein Bascom, aber vom Bauch her würde ich 
annehmen: Wenn du nicht eine "struct" bzw. eine arry von sructs 
definieren kannst:  Was spricht denn dagegen, das "getrennt" abzulegen? 
(Datentypen und Befehle bitte an Bascom anpassen)

also erzeugst du dir in Bascom 3 Arrys gleicher Größe, z.B.
uint_16_t array [20] time
uint8_t   array [20] day
uint8_t   arrya [20] onOff

einen "Laufindex", welches Array- bzw. Struct-Element du für einen 
konkreten Zeitschaltpunkt grade nutzen mußt, brauchst du ja sowieso ..


Neben den Datenstrukturen und Algorithmen für die Schaltzeitpunkte: Hast 
du dir denn auch schon überlegt, wie du die Daten in diese Struktur 
hinein bekommst? (Tastatur, serielle Schnittstelle, Magie....)

: Bearbeitet durch User
von kopfkratzer (Gast)


Lesenswert?

Icke schrieb:
> Da ich als Gelegenheitsprogrammierer Bascom bevorzuge fehlt mier hier
> eine Konstrukt wie "Struct".
>
> Ich würde in einem Array gern die Sekunden des Tages als Integer
> darstellen, gleichzeitig aber mit der Info ob angeschaltet oder
> abgeschaltet werden soll.
>
> Da hänge ich momentan, denke aber weiter darüber nach.

kopfkratz
Also eine STRUCTURE gibt's auch in BASIC ist zwar ewig her aber Du 
bräuchtest sowas:
1
...
2
STRUCTURE sTimeEvent
3
 DIM wTimestamp AS WORD '16bit Variable
4
 DIM cDay AS CHAR
5
 DIM bOnOff AS BOOLEAN
6
ENDSTRUCTURE
7
8
DIM sMyTimeEventList (0 to 20) AS sTimeEvent
Wenn das denn BASCOM hergibt ?
Ansonten müßtest Du halt jeweils 20 Arrays der einzelnen Variablen 
erzeugen und dafür sorgen das da keine falschen Indizes auftauchen 
können.
Kann Bascom auch Objekte wie aktuelle Windows-Basic-Varianten ?
Damit wäre es noch schöner zu lösen ;-)
Was auch immer sinnvoll ist sich erstmal mit Stift und Blatt Papier den 
Programmablauf aufzumalen bzw. bei Dir gleich eine FiniteStateMachine 
aufzumalen.
Also die einzelnen Zustände Deiner Schaltuhr in Kreise schreiben und an 
die Übergangspfeile die Übergangsbedingungen.
Wenn Du das hast läßt sich das dann idR auf einen switch/case 
herunterbrechen.
Also mal erstmal auf Papier und werde Dir klar was Du konkret umsetzen 
möchtest.
Viel Spaß beim grübeln und guten Rutsch an alle ;-)

von Falk B. (falk)


Lesenswert?

@ Icke (Gast)

>Als Gelegenheitsbastler und "alter Mann" ist das für mich nicht einfach,
>daher freut mich Dein Zuspruch insbesondere.

>Bitte entschuldige schon jetzt, dass ich nur sporadisch Zeit habe um
>mich zu melden, resp. um die Umsetzung zu kümmern.
>Es ist mir vieles Andere wichtiger....

>Dennoch hat mich der Ehrgeiz gepackt.

Kleiner Widerspruch in sich.

Wenn du sehr wenig Vorkenntnisse und wenig Zeit UND wenig Priorität für 
das Projekt hast, dann vergiss es!

von Icke (Gast)


Lesenswert?

Falk Brunner schrieb:
> @ Icke (Gast)
>
>>Als Gelegenheitsbastler und "alter Mann" ist das für mich nicht einfach,
>>daher freut mich Dein Zuspruch insbesondere.
>
>>Bitte entschuldige schon jetzt, dass ich nur sporadisch Zeit habe um
>>mich zu melden, resp. um die Umsetzung zu kümmern.
>>Es ist mir vieles Andere wichtiger....
>
>>Dennoch hat mich der Ehrgeiz gepackt.
>
> Kleiner Widerspruch in sich.
>
> Wenn du sehr wenig Vorkenntnisse und wenig Zeit UND wenig Priorität für
> das Projekt hast, dann vergiss es!

Vorkenntnisse habe ich sehr viel, wahrscheinlich nicht weniger als 
Du;-)...
Den Widerspruch sehe ich überhaupt nicht,
Leistung ist Arbeit pro Zeit, ich benötige halt etwas mehr von der Zeit.
Oder meinst Du gar, das man als "alter Mann"  nicht mehr genug Zeit hat?
Das wäre wohl etwas zuviel des Sarkasmus.

von Peter D. (peda)


Lesenswert?

Icke schrieb:
> Ich würde in einem Array gern die Sekunden des Tages als Integer
> darstellen

Wozu?
Du wolltest doch in Minuten schalten.

Gehe schrittweise vor und nicht alles zugleich.
Z.B.:
- Uhr
- Uhr einstellen
- eine Weckzeit
- Weckzeit einstellen
- je eine Ein- und Auszeit
- diese einstellen
- diese im EEPROM speichern
usw.

von Karl H. (kbuchegg)


Lesenswert?

Icke schrieb:

>> Wenn du sehr wenig Vorkenntnisse und wenig Zeit UND wenig Priorität für
>> das Projekt hast, dann vergiss es!
>
> Vorkenntnisse habe ich sehr viel, wahrscheinlich nicht weniger als
> Du;-)...

relevante Vorkentnisse?
Mit Verlaub, aber das glaub ich nicht.

Denn sonst würde deine Uhr längst stehen. Ein Falk braucht nicht in 
einem Forum nachfragen um eine Zeitschaltuhr zu bauen. So wie die 
meisten Profis hier, ist das bei ihm in weniger als 1 Vormittag fertig - 
ohne in einem Forum gefragt haben zu müssen.

Zum Thema BASCOM: dazu kenn ich BASCOM zu wenig. Ich verwende es nicht, 
eben weil die Möglichkeiten der Datenmodellierung mir zu schwach sind. 
Und ausserdem nervt mich das auseinanderdröseln-müssen von 
arithmetischen Ausdrücken. BASCOM ist IMHO nett für kleine Spielereien, 
in denen man die Vorteile der lesbaren Konfiguration von Komponenten 
ausspielen kann. Aber für alles darüber hinausgehende, nehme ich lieber 
C.

: Bearbeitet durch User
von Icke (Gast)


Lesenswert?

Lieber Karl Heinz,

ich bedauere sehr, dass hier nun über Vorkenntnisse geredet wird.
Das wirkt auf mich auch etwas despektierlich, wenngleich nach Paul 
Watzlawick ja die "Nachricht beim Empfänger" entsteht ;-).

Nach Radio FS Ausbildung in den frühen Siebzigern und erfolgreichem 
Studium der E- Technik sind diese vielleicht nach fast 40 Jahren 
veraltet.
Vor allem wenn man sich schon  so lange beruflich völlig vom Thema 
entfernt hat.

Dennoch Danke an alle konstruktiven Anregungen und die meist 
konstruktive Unterstützung.

Ich hatte übrigens gestern beim Waldspaziergang noch einmal in Ruhe 
drüber nachgedacht.
Und sogar ohne Papier und Bleistift dann einen funktionierenden Ansatz 
gefunden.
Ich bin zufrieden, auch wenn es hier Könner gibt, die das sogar in einer 
Stunde komplett zur Reife bringen.

Im Kopf geht das ohne konkrete Programmiersprache.
Ob das nun Bascom wird oder was Anderes spielt keine wirkliche Rolle,
schade das auch das zum Thema wird.
Ich werde den in der Natur üblichen Weg des geringsten "Widerstandes" 
gehen.

Kennengelernt hatte ich von Fortran über COBOL und Basic schon so 
manches, aber das ist wie gesagt schon ein fast halbes Jahrhundert her, 
traurig aber wahr.

Allen viel Gesundheit für ein glückliches 2014

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Icke schrieb:
> Im Kopf geht das ohne konkrete Programmiersprache.
> Ob das nun Bascom wird oder was Anderes spielt keine wirkliche Rolle,
> schade das auch das zum Thema wird.

Thematisiert hast du es eigentlich selbst, indem du den Einwand 
brachtest, daß das in Bascom (möglicherweise) nicht vorhanden ist was 
dir KHB (als konkrete Datenstruktur) vorgeschlagen hatte.

Aber Datenstrukturen (z.B. ein Array eines Datentyps welches Zahlen 
aufnehmen kann) sind erst mal "übergreifend". Ob das Ding nun x oder y 
heißt oder so order anders definiert wird, ist unerheblich. DAS für de 
Abspeicherung von z.B. 20 Schaltzeitpunkten 20 Objekte irgendwo 
vorgehalten werden müssen, ist hingegen offensichtlich. Auch daß die 
Zahlen die da reingelangen nicht per Feen-Staub dort hinein gelangen ist 
offensichtlich.

Zu DIEESN Themen (wann du wie und womit auf was zugreifst, d.h. deine 
konkreten Ein- und Ausgabe-Strukturen - sowohl Software als auch 
Hardware) hattest du aber noch nichts vorgestellt. bzw. dich noch nicht 
dazu geäußert.

Icke schrieb:
> Und sogar ohne Papier und Bleistift dann einen funktionierenden Ansatz
> gefunden.

Prima, dann hat sich die Blockade doch noch gelöst:

Icke schrieb:
> Mir fällt einfach kein richtiger Ansatz für eine Problemlösung ein, der
> Knoten im Kopf will sich  bisher nicht lösen ;-).

und nun läßt du das Auditorium hier mit diesem Statement einfach 
"hängen"?  Wie war denn jetzt dei Entknotung?

Das wäre schön, wenn du deinen Ansatz einfach mal darstellst. Vielleicht 
ergeben sich ja anregende Diskussionen daraus.





Wenn nicht: Schön, daß wir drüber gesprochen haben und dir helfen 
konnten.

: Bearbeitet durch User
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.