mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik schoolbell mit ATMega 8. Geht das?


Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich möchte so etwas wie eine Schulklingel mit einem ATMega 8
Programieren. D.h. Als Basis sollte eine Uhr existieren -> was nicht
besonders schwer ist.
Das grössere Problem ist dass ich irgendwo die Zeiten (nur Stunden und
Minuten, Sekunden sind nicht entscheindend), zu dennen es klingeln soll
(etwa 20 - 30 mal) irgendwo abspeichern muss:
z.B.

bell_time_1 = 10:00
bell_time_2 = 10:45
bell_time_3 = 10:50
...

Und dass grösste Problem sehe ich darin wie ich bestimmen kann welcher
von den 20-30 Klingelzeiten der jetzigen Zeit (current time) am
"nähsten grösser" ist und wie gross die Differenz zwichen ihnen ist
(Sekundengenau).

z.B.
current time :  12:04:30
next bell time: 12:05

In einem Register soll dann stehen:

h_to_bell = 0
min_to_bell = 0
sec_to_bell = 30

Es waere viel leichter hätte ich mehr als 8 bit zur Verfügung.
Also kennt jemand eine möglichtst einfache (und vieleicht auch noch
effiziennte) Lösung?
um dieses zu realisieren.
-> Bitte nur Assemblercode!
Für wie viele Vergleichszeiten (ein reg für stunden und einer für
minuten) haben eigentlich Platz im ATMega 8?

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du kannst die Klingelzeiten ja im EEPROM abspeichern, da sollte fuer die
paar Zeiten genug Platz sein.
mach doch einen zaehler, der immer auf die nächste Alarmzeit-Position
im EEPROM zeigt, und wenn es dann geklingelt hat, dann erhoechst du den
Zaehler immer um einen, so dass er auf die naechste Alarmzeit zeigt. Ist
die naechste Alarmzeit beispielsweise "0", dann springt der Zaehler
wieder auf die erste Position.
Ob der Alarm ausgeloest wird, ueberpruefst du immer, wenn die Uhr auf
die naechste volle Minute wechselt und vergleichst da dann die Zeit mit
der Alarmzeit:
1. Alarmzeit abweichend von aktueller Zeit -> nichts
2. Alarmzeit entspricht aktueller Zeit -> Alarm, Zaehler + 1
2.1. Wert auf den der zaehler zeigt ist 0 -> zaehler auf 0 setzen
und das ganze dann in einer Endlosschleife.
Zum Code kann ich dir leider nicht helfen, Assembler ist nicht mein
Gebiet.

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi...

Die Zeiten kannst du gut im Flash in einer Tabelle ablegen.
 .db Stunde,Minute
Nun iss der Mega8 ja nicht gerade lahm. Daher kannst du es dir leisten,
jede volle Minute die gesamte Tabelle zu scannen und jeweils Stunde und
Minute mit der aktuellen Zeit zu vergleichen.
Ist die Zeit aus der Tabelle kleiner als die aktuelle Zeit, dann wird
der nächste "Datensatz" geholt. Ist sie größer, kannst du die
Differenz ermitteln und als Count-Down anzeigen. Ist sie gleich, dann
wird eben mal gebimmelt...

<grins> Übrigens wird sich niemand für deine Uhrzeit interessieren,
denn in Schulen gelten die Schuluhren... - Oder? </grins>

...HanneS...

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn die Uhr halbwegs genau sein soll, kommst du mit den üblichen
MC-Quarzen und Softwareuhr nicht allzuweit (den absoluten
Frequenzfehler kann man zwar korrigieren, aber die Quarze sind auch
recht temperaturanfällig.
Sehr schön geht das ganze mit I2C-RTC, z.B. RX-8581 von Epson. Bietet
neben der Uhr- und Kalenderfunktion auch die Möglichkeit, Alarmzeiten
zu programmieren.
Nächste Alarmzeit programmieren, MC schlafen legen. Wenn gebimmelt
werden soll, wird er per Int wieder geweckt, macht ein bisschen was und
darf sich gleich wieder hinlegen.
MC müsste man sein:-)

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bezüglich der Ganggenauigkeit würde ich prinzipiell crazy horse
beipflichten, das ist die eleganteste Methode.
Wenns aber um die reine Ausführung im Controller geht: Warum die Zeiten
im hh:mm - Format ablegen? Das macht doch alles nur komplizierter.
Ich würde alles in Minuten ab Mitternacht rechnen, so kann man den
Vergleich <aktuelle Zeit> mit <Alarmzeit> wesentlich einfacher
gestalten. D.h.: 12 Uhr Mittags entspricht der Zahl 720. Hoppla, das
ist ja eine Zahl >8 Bit!?
Aber, keine Angst, ein ATMega kann auch mit größeren Zahlen...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich habe mit fertigen RTC sehr schlechte Erfahrungen gemacht:

DS1994: >10min/Jahr

Ich rate daher zum DCF-77.

Man kann dann den internen Quarz damit kalibrieren, dann ist er selbst
bei wochenlangen Ausfall des DCF-77 auf wenige Sekunden genau.
Die hochfrequenten MC-Quarze (z.B. 7,372MHz) sind nämlich sehr
temperaturstabil.

Oder nimm einen TXCO, z.B. der DS32kHz soll auf 1min/Jahr genau sein.


Peter

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@thkais,

"D.h.: 12 Uhr Mittags entspricht der Zahl 720. Hoppla, das
ist ja eine Zahl >8 Bit!?"


Hmm, also ich konvertiere hh:mm in min, damit ich statt 2 Byte nur 2
Byte vergleichen muß.
Ich habe also zusätzlichen Konvertierungsaufwand, aber nichts
gewonnen.


Peter

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter: Hast schon recht. Ist alles eine Frage des Standpunkts, mir
persönlich scheint es logischer - ist aber kein richtiger Vorteil
dabei.

Autor: Josef (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Würde die Zeiten in der RTC (DS1307) im gleichen Format wie sie die Uhr
benützt, ablegen. Diese hat ein Ram, das auch bei Stromausfall ihre
Daten behält. EE geht natürlich auch. Die Uhr benützt das BCD-Format.
Pro Schaltzeit brauchst du 2 Byte. Gerade Speicherplätze sind
Einschaltzeiten und ungerade Ausschaltzeiten.

SG Josef

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.