mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Schaltuhr programmieren - AVR Assembler


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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'.

Autor: mr kondensator (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: 2920 (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Eckhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

man könnte sonst noch versuchen die Schaltzeiten zu sortieren, dann kann 
man de suche etwas beschleunigen.


Eckhard

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.