Forum: Mikrocontroller und Digitale Elektronik Schaltuhr programmieren - AVR Assembler


von Gast (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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'.

von mr kondensator (Gast)


Lesenswert?

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.

von 2920 (Gast)


Lesenswert?

Die paar Zeiten vergleichen kann doch nicht so ein Problem sein. Nicht 
allzu viel drueber nachdenken, ein FOR loop drueber und gut ist.

von Peter D. (peda)


Lesenswert?

Naja, 100 Schaltzeiten innerhalb einer Minute zu vergleichen, ist schon 
etwas Arbeit, da sollte der AVR schon mit mindestens 10Hz CPU-Frequenz 
laufen :-)


Peter

von Gast (Gast)


Lesenswert?

.. 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.

von Eckhard (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.