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.
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.
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
Icke schrieb: > Uhr stromlos, Daten weg.... uhr mit goldcap oder stützbatt. stützen dann nix daten weg. stromsparenden controller verwenden.
>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.
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.
AVR - Die genaue Sekunde / RTC http://www.mikrocontroller.net/articles/Speicher#EEPROM_Schreibzugriffe_minimieren http://www.mikrocontroller.net/search?query=schaltuhr&forums[]=1&forums[]=19&forums[]=9&forums[]=10&forums[]=2&forums[]=4&forums[]=3&forums[]=6&forums[]=31&forums[]=17&forums[]=11&forums[]=8&forums[]=14&forums[]=12&forums[]=7&forums[]=5&forums[]=15&forums[]=13&forums[]=18&forums[]=16&max_age=-&sort_by_date=0
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...
ich bekomm's nicht hin, das macht mich fertig.... Hat jemand ein einfaches Programmgerüst? Benötige dringend Entwicklungshilfe. Danke
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.
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.
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
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
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
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.
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
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 ;-)
@ 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!
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.
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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.