Hallo, Ich habe vor eine kleine Schaltuhr mit AVR zu bauen (mega88). Als Zeitgeber dient ein RTC mit I2C und Pufferbatterie. Die Uhr-Abfrage funktioniert bereits, d.h. die Zeit steht im RAM des AVR zur Verfügung (Abfrage jede Sekunde). Die Schaltzeiten (vorerst Stunden und Minuten) und die auszuführende Aktion stehen im EEprom. Mein Problem ist noch die Auswertung der Schaltzeiten. Erster Gedankenansatz war, dies mit aufeinanderfolgenden branches zu lösen: - Stunde der 1. Schaltzeit vergleichen, wenn gleich dann Minute vergleichen, wenn gleich dann Aktion ausführen und nächster Vergleich - Stunde der 2. Schaltzeit vergleichen u.s.w. Das scheint mir aber etwas uneffektiv. Und Problem ist, dass die Anzahl der Schaltzeiten feststehen muss. Ich möchte aber gern, dass ich eine beliebige Anzahl Zeiten (max. 30) in den EEprom schreiben kann, ohne das Programm im Rom zu ändern. Hab schon überlegt, ob man eine indexierte Mehrfachverzweigung mittels ijmp machen könnte, da wäre die Ausführungszeit für jeden vergleich wenigstens nahezu identisch. Geht hier aber nicht, da die Werte in einem weiten Bereich verstreut liegen. Macht es Sinn die Schaltzeiten nach dem Reset erstmal vom EEprom in RAM zu kopieren und dort zu sortieren? Gibt es für so eine Aufgabe evtl. sowas wie ´ne Standart-"Gerüst" oder hat jemand sowas ähnliches gemacht und könnte asm-File "zum abgucken" zur Verfügung stellen? Bin für jede Art Tipp zum Problem dankbar.
Gast wrote: > Mein Problem ist noch die Auswertung der Schaltzeiten. > Erster Gedankenansatz war, dies mit aufeinanderfolgenden branches > zu lösen: > - Stunde der 1. Schaltzeit vergleichen, wenn gleich dann Minute > vergleichen, wenn gleich dann Aktion ausführen und nächster Vergleich > - Stunde der 2. Schaltzeit vergleichen u.s.w. Klingt doch gut. > > Das scheint mir aber etwas uneffektiv. Ganz im Gegenteil. Ist doch ziemlich effektiv. > Und Problem ist, dass die Anzahl der Schaltzeiten feststehen muss. Wieso ? > Ich möchte aber gern, dass ich eine beliebige Anzahl Zeiten (max. 30) > in den EEprom schreiben kann, ohne das Programm im Rom zu ändern. Wo liegt das Problem? Leg die Abfrage in eine Schleife, die du so oft wiederholst wie deine Anzahl vorgibt. In der Schleife holst du die nächste Schaltzeit, vergleichst mit der aktuellen Zeit und führst gegebenenfalls die Aktion aus. Danach gehts in der Schleife ab zur nächsten Schaltzeit. > > Hab schon überlegt, ob man eine indexierte Mehrfachverzweigung mittels > ijmp machen könnte, da wäre die Ausführungszeit für jeden vergleich > wenigstens nahezu identisch. Es dürfte wohl relativ egal sein, wenn deine Uhr um ein paar Nanosekunden zu spät schaltet :-) OK. Wenn du die Schaltzeiten aus dem EEPROM holen musst, dann sinds ein paar Millisekunden. Dürfte aber immer noch relativ unwichtig sein, wenn deine Auslösezeit sowieso nur auf Minuten aufgelöst werden kann. > Macht es Sinn die Schaltzeiten nach dem Reset erstmal vom EEprom in RAM > zu kopieren und dort zu sortieren? Nicht wirklich. Könnte man aber machen. Verkompliziert das Ganze nur, ohne dass du einen Mehrwert bekommst. Denke nur an die Fälle, dass eine Schaltzeit hinzukommt, geändert wird, gelöscht wird. Danach muss jedesmal wieder neu sortiert werden. Was aber Sinn machen würde: Die Schaltzeiten im SRAM zu 'spiegeln'. Wird eine neue Schaltzeit angelegt oder verändert oder gelöscht, dann passiert das sowohl im SRAM als auch EEPROM. Das Backup im EEPROM dient dann nur dazu, bei einem Stromausfall die Zeiten wiederherstellen zu können. Ansonsten läuft alles andere vom SRAM weg -> schnellere Ausführungszeiten. > > Gibt es für so eine Aufgabe evtl. sowas wie ´ne Standart-"Gerüst" oder > hat jemand sowas ähnliches gemacht und könnte asm-File "zum abgucken" > zur Verfügung stellen? Bin für jede Art Tipp zum Problem dankbar. Das Stíchwort heist 'Schleife'.
Du könntest immer beim erreichen einer schaltzeit Dir die nächste suchen und Dir merken. dann brauchst Du die Uhr immer nur mit der nächsten schaltzeit zu vergleichen und mußt nicht sekündlich immerwieder raussuchen, was denn nun die nächste schaltzeit ist.
Die paar Zeiten vergleichen kann doch nicht so ein Problem sein. Nicht allzu viel drueber nachdenken, ein FOR loop drueber und gut ist.
Naja, 100 Schaltzeiten innerhalb einer Minute zu vergleichen, ist schon etwas Arbeit, da sollte der AVR schon mit mindestens 10Hz CPU-Frequenz laufen :-) Peter
.. jaja manchmal sieht man halt den Wald vor lauter Bäumen nicht und wenn einem was zu einfach erscheint, sucht man Probleme. Danke allen die mich wieder auf den richtigen Weg gebracht haben.
Hallo, man könnte sonst noch versuchen die Schaltzeiten zu sortieren, dann kann man de suche etwas beschleunigen. Eckhard
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.