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


von Markus (Gast)


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?

von Stefan (Gast)


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.

von ...HanneS... (Gast)


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

von crazy horse (Gast)


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:-)

von thkais (Gast)


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

von Peter D. (peda)


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

von Peter D. (peda)


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

von thkais (Gast)


Lesenswert?

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

von Josef (Gast)


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

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.