<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>eBlog - Elvizz Blog &#187; Binäruhr</title>
	<atom:link href="http://blog.elvizz.net/category/projekte/binaeruhr/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.elvizz.net</link>
	<description>- Hier bloggt der Chef noch selbst -</description>
	<lastBuildDate>Tue, 28 Sep 2010 06:53:42 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>Ein paar Erkenntnisse</title>
		<link>http://blog.elvizz.net/2006/06/18/ein-paar-erkenntnisse/</link>
		<comments>http://blog.elvizz.net/2006/06/18/ein-paar-erkenntnisse/#comments</comments>
		<pubDate>Sun, 18 Jun 2006 19:48:20 +0000</pubDate>
		<dc:creator>Elvizz</dc:creator>
				<category><![CDATA[Binäruhr]]></category>

		<guid isPermaLink="false">http://blog.elvizz.net/?p=42</guid>
		<description><![CDATA[Nachdem der DCF77-Empfang nach einer erfolgreichen Synchronisation nun erstmal &#8220;ausgeschaltet&#8221; wird, habe ich etwas Interessantes entdeckt: Die Bin&#228;ruhr springt nicht mehr wild durch die Modi Scheinbar verursacht der Interrupt oder dessen Auswertung einen Fehler. Ich bin allerdings noch nicht dahinter gekommen, wo und wie das passiert. Ich habe jetzt zus&#228;tzlich eine &#220;berpr&#252;fung eingebaut, die testet, [...]]]></description>
			<content:encoded><![CDATA[<p>Nachdem der DCF77-Empfang nach einer erfolgreichen Synchronisation nun erstmal &#8220;ausgeschaltet&#8221; wird, habe ich etwas Interessantes entdeckt: <span id="more-42"></span>Die Bin&#228;ruhr springt nicht mehr wild durch die Modi <img src='http://blog.elvizz.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Scheinbar verursacht der Interrupt oder dessen Auswertung einen Fehler. Ich bin allerdings noch nicht dahinter gekommen, wo und wie das passiert.</p>
<p>Ich habe jetzt zus&#228;tzlich eine &#220;berpr&#252;fung eingebaut, die testet, ob der DCF77-Empfang l&#228;nger als 10 Minuten l&#228;uft und diesen dann abschaltet. Wenn nach 10 Minuten keine 2 brauchbaren Signale empfangen wurden, wird das in n&#228;chster Zeit wohl auch nix mehr. Nach 3 Stunden wird dann wieder versucht das Signal sauber zu empfangen &#8211; mit etwas Gl&#252;ck klappt es ja dann <img src='http://blog.elvizz.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Demn&#228;chst werde ich die Uhr in ihr Geh&#228;use einbauen. Daf&#252;r m&#246;chte ich aber erst eine Folie entwerfen, die ich dann auf die Front aufkleben kann, so dass die verschiedenen Kn&#246;pfe und Anzeigen (Alarm 1/2, DCF77-Empfang) auch beschriftet sind. Ich bin noch auf der Suche nach einer selbstklebenden, bedruckbaren Transparenzfolie. Mal sehen, ob es sowas gibt&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.elvizz.net/2006/06/18/ein-paar-erkenntnisse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>M&#246;&#246;&#246;&#246;&#246;&#246;&#246;p</title>
		<link>http://blog.elvizz.net/2006/06/13/moeoeoeoeoeoeoep/</link>
		<comments>http://blog.elvizz.net/2006/06/13/moeoeoeoeoeoeoep/#comments</comments>
		<pubDate>Tue, 13 Jun 2006 20:32:57 +0000</pubDate>
		<dc:creator>Elvizz</dc:creator>
				<category><![CDATA[Binäruhr]]></category>

		<guid isPermaLink="false">http://blog.elvizz.net/?p=39</guid>
		<description><![CDATA[So langsam n&#228;hert sich die Bin&#228;ruhr der Vollendung Als eines der letzten gro&#223;en Features habe ich jetzt eine Weckfunktion implementiert. Als Lautsprecher benutze ich im Moment einen alten PC-Speaker. Diesen m&#246;chte ich aber noch gegen etwas kleineres tauschen, da das Ganze so nicht in das Geh&#228;use passen wird. Um den Lautsprecher m&#246;glichst einfach tauschen zu [...]]]></description>
			<content:encoded><![CDATA[<p>So langsam n&#228;hert sich die Bin&#228;ruhr der Vollendung <img src='http://blog.elvizz.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Als eines der letzten gro&#223;en Features habe ich jetzt eine Weckfunktion implementiert.<span id="more-39"></span></p>
<p>Als Lautsprecher benutze ich im Moment einen alten PC-Speaker. Diesen m&#246;chte ich aber noch gegen etwas kleineres tauschen, da das Ganze so nicht in das Geh&#228;use passen wird. Um den Lautsprecher m&#246;glichst einfach tauschen zu k&#246;nnen, habe ich ihn nicht fest auf die Platine gel&#246;tet. Stattdessen habe ich eine kleine zweipolige Stiftleiste benutzt, an die der Lautsprecher dann angesteckt wird. Um die Lautst&#228;rke zu begrenzen, benutze ich einen 470 Ohm Widerstand. Die resultierende Lautst&#228;rke d&#252;rfte morgens eigentlich ganz in Ordnung sein.</p>
<p>Sobald die Uhrzeit die voreingestellte Weckzeit erreicht (und der Alarm nat&#252;rlich aktiviert ist), wechselt die Uhr in einen neuen Modus (bisher gab es &#8220;Zeit anzeigen&#8221;, &#8220;Alarm 1 einstellen&#8221;, &#8220;Alarm 2 einstellen&#8221; und &#8220;Uhrzeit einstellen&#8221;), den man normalerweise nicht erreichen kann. Hier wird ganz normal die Uhrzeit angezeigt. Zus&#228;tzlich wird aber auch auf einem Ausgang ein Soundsignal erzeugt. Wird eine (beliebige) Taste gedr&#252;ckt, ist der Alarm vorbei und die Uhr wechselt zur&#252;ck in den &#8220;Zeit anzeigen&#8221; Modus. Der Wecker bleibt gestellt.</p>
<p>Um die eingestellten Weckzeiten auch &#252;ber einen Stromausfall (egal welcher Art) hinweg zu behalten, werden diese nun im EEPROM des µC gespeichert. Um den EEPROM nicht unn&#246;tig zu belasten (er ist nur f&#252;r etwa 100.000 Schreibvorg&#228;nge pro Speicherzelle ausgelegt), wird die Weckzeit nur gespeichert, falls sie auch wirklich ge&#228;ndert wurde. Sobald der µC sein Programm startet, l&#228;dt er die gespeicherten Weckzeiten aus dem EEPROM.</p>
<p>Das Problem, dass die Uhr pl&#246;tzlich (ohne Tastendruck) den Modus wechselt, habe ich mittlerweile zusammen mit ein paar anderen l&#246;sen k&#246;nnen: Ich habe den Anschluss f&#252;r das Netzteil ausgetauscht und nochmal sauber (und stabil) verl&#246;tet. Jetzt wackelt nix mehr und die Spannungsversorgung scheint wirklich stabil zu sein. Jedenfalls springt der µC (bisher) nicht mehr durch die verschiedenen Modi und auch der DCF77-Empfang funktioniert viel besser.</p>
<p>Als letztes neues Feature habe ich nun noch eingebaut, dass sich die Bin&#228;ruhr nach einem erfolgreichen DCF-Empfang erstmal nicht neu synchronisieren will, sondern dies nur alle 3 Stunden tut. Das sollte f&#252;r eine genaue Zeitanzeige auf jeden Fall genug sein und evtl. noch ein paar Ressourcen des µC f&#252;r zuk&#252;nftige Features frei halten.</p>
<p>Ok, als letztes gibt es jetzt noch den <a href="http://blog.elvizz.net/wp-content/uploads/2006/06/main.c" id="p40" class="liinternal">Sourcecode</a> und den aktualisierten Schaltplan. Achtung: Der Schaltplan ist doch etwas un&#252;bersichtlich geworden &#8211; ich hoffe, man kann noch alles erkennen. Evtl. werde ich demn&#228;chst noch eine etwas aufger&#228;umtere Version online stellen.<br />
<a class="imagelink" title="Schematic for the complete binary clock" href="http://blog.elvizz.net/wp-content/uploads/2006/06/complete.png" rel="lightbox"><img width="602" height="387" id="image41" alt="Schematic for the complete binary clock" src="http://blog.elvizz.net/wp-content/uploads/2006/06/complete.png" /><br />
[Klick f&#252;r gr&#246;&#223;ere Version]<br />
</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.elvizz.net/2006/06/13/moeoeoeoeoeoeoep/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wer misst, misst Mist&#8230;</title>
		<link>http://blog.elvizz.net/2006/06/01/wer-misst-misst-mist/</link>
		<comments>http://blog.elvizz.net/2006/06/01/wer-misst-misst-mist/#comments</comments>
		<pubDate>Thu, 01 Jun 2006 20:52:43 +0000</pubDate>
		<dc:creator>Elvizz</dc:creator>
				<category><![CDATA[Binäruhr]]></category>

		<guid isPermaLink="false">http://blog.elvizz.net/?p=38</guid>
		<description><![CDATA[Jaja, messen m&#252;sste man k&#246;nnen: Nachdem sich die Bin&#228;ruhr nun mittels des DCF77-Signals auf eine genaue Uhrzeit einstellen kann, ist mir aufgefallen, dass nicht etwa die Bin&#228;ruhr pro 24 Stunden eine Sekunde falsch geht, sondern meine Referenzuhr *g*&#8230; wahrscheinlich ist da eine Batterie leer. Das bedeutet nun, dass sogar ohne DCF-Synchronisation die Ganggenauigkeit der Bin&#228;ruhr [...]]]></description>
			<content:encoded><![CDATA[<p>Jaja, messen m&#252;sste man k&#246;nnen: Nachdem sich die Bin&#228;ruhr nun mittels des DCF77-Signals auf eine genaue Uhrzeit einstellen kann, ist mir aufgefallen, dass nicht etwa die Bin&#228;ruhr pro 24 Stunden eine Sekunde falsch geht, sondern meine Referenzuhr *g*&#8230; wahrscheinlich ist da eine Batterie leer. Das bedeutet nun, dass sogar ohne DCF-Synchronisation die Ganggenauigkeit der Bin&#228;ruhr schon sehr gut ist <img src='http://blog.elvizz.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Ich habe jetzt damit begonnen, ein paar Weckerfunktionen zu implementieren. <span id="more-38"></span>Daf&#252;r habe ich der Uhr einen Taster zum Wechsel zwischen den verschiedenen Modi und noch zwei zus&#228;tzliche (rote) LEDs spendiert, die den Alarmstatus (ja, genau: zwei LEDs = zwei Weckzeiten) anzeigen: Leuchtet die erste rote LED, ist Alarm 1 aktiviert. Blinkt diese, stellt man gerade die erste Weckzeit ein. Wenn sie langsamer blinkt, ist der Alarm aktiv. Genauso funktioniert die zweite LED. Blinken beide LEDs, kann man die Uhrzeit &#228;ndern. Daf&#252;r habe ich einen eigenen Modus gew&#228;hlt, damit im &#8220;normalen&#8221; Modus die Zeit nicht verstellt wird und die beiden anderen Taster zum Aktivieren der beiden Alarme genutzt werden k&#246;nnen.</p>
<p>Momentan verh&#228;lt sich die Uhr etwas merkw&#252;rdig: Sie springt ab und zu unmotiviert von einem Modus in den n&#228;chsten ohne dass eine Taste gedr&#252;ckt worden w&#228;re. Merkw&#252;rdig&#8230; ich muss wohl nochmal auf die Suche nach einem Kurzschluss oder Wackelkontakt gehen.</p>
<p>Au&#223;erdem habe ich einen 12 Ohm Serienwiderstand, der den Strom f&#252;r alle LEDs begrenzt hat, gegen einen Transistor getauscht. Dieser wird &#252;ber einen Fotowiderstand gesteuert, um die LEDs bei Dunkelheit etwas zu dimmen, damit bei Nacht nicht das ganze Zimmer beleuchtet wird <img src='http://blog.elvizz.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Den aktualisierten Schaltplan dazu gibt es demn&#228;chst, wenn alles so klappt, wie es soll&#8230;</p>
<p>Ich habe auch mal mit der Sounderzeugung mit Hilfe des AVR experimentiert: Wieder &#252;ber einen Transistor habe ich einen Lautsprecher angeschlossen. Der Transistor wird diesmal von einem Port des AVR gesteuert, der mit einer bestimmten Frequenz ein- und ausgeschaltet wird. Im Moment benutze ich eine &#220;berlagerung von 1000 und 440Hz. Dadurch entsteht ein Ger&#228;usch, das einen bestimmt wach kriegt, aber auch nicht zu fies klingt.</p>
<p>Ich habe den Lautsprecher noch nicht an die Bin&#228;ruhr angeschlossen, da ich erst einmal das Problem der springenden Modi l&#246;sen m&#246;chte, bevor ich die n&#228;chste Baustelle anfange. Au&#223;erdem wei&#223; ich auch noch nicht genau, wie ich die Sounderzeugung sinnvoll in den Code der Uhr einf&#252;ge, aber das wird sich schon noch l&#246;sen lassen&#8230;  auf jeden Fall gibt es deswegen aber auch keinen neuen Code f&#252;r euch.<br />
Ach ja: Ich kann nur empfehlen, das DCF-Modul mit der Antenne auf einen starren Streifen Pappe zu kleben. Seitdem ich das gemacht habe, habe ich viel weniger Probleme damit. <img src='http://blog.elvizz.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.elvizz.net/2006/06/01/wer-misst-misst-mist/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jetzt funkt&#8217;s</title>
		<link>http://blog.elvizz.net/2006/05/27/jetzt-funkts/</link>
		<comments>http://blog.elvizz.net/2006/05/27/jetzt-funkts/#comments</comments>
		<pubDate>Sat, 27 May 2006 16:20:45 +0000</pubDate>
		<dc:creator>Elvizz</dc:creator>
				<category><![CDATA[Binäruhr]]></category>

		<guid isPermaLink="false">http://blog.elvizz.net/?p=35</guid>
		<description><![CDATA[Nachdem ich die Ganggenauigkeit der Bin&#228;ruhr zuletzt mit einem Uhrenquarz erh&#246;ht habe, hatte sie nur noch einen Fehler von ca. 1 Sekunde pro 24 Stunden. Das ist im Vergleich zu vorher schon fast nichts mehr. Aber f&#252;r eine Uhr irgendwie doch zuviel&#8230; deswegen habe ich jetzt ein Funkmodul von Reichelt angeschlossen, mit dem sich der [...]]]></description>
			<content:encoded><![CDATA[<p>Nachdem ich die Ganggenauigkeit der Bin&#228;ruhr zuletzt mit einem Uhrenquarz erh&#246;ht habe, hatte sie nur noch einen Fehler von ca. 1 Sekunde pro 24 Stunden. Das ist im Vergleich zu vorher schon fast nichts mehr. Aber f&#252;r eine Uhr irgendwie doch zuviel&#8230; deswegen habe ich jetzt ein Funkmodul von Reichelt angeschlossen, mit dem sich der AVR &#252;ber das DCF77-Signal auf Normzeit einstellen kann. <img src='http://blog.elvizz.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <span id="more-35"></span></p>
<p>Aber bis es soweit war, gab es noch einige Probleme:</p>
<ul>
<li>Die Spannung war f&#252;r das Funkmodul nicht stabil genug und musste stabilisiert werden.</li>
<li>Das d&#252;rftige &#8220;Handbuch&#8221; des Funkmoduls musste verstanden werden</li>
<li>und zu guter Letzt ist nat&#252;rlich auch noch die Antenne des Modules abgerissen, so dass ich sie auch erstmal wieder anl&#246;ten musste</li>
</ul>
<p>In dem Handbuch zum Funkmodul wird &#8211; in Worten &#8211; erkl&#228;rt, wie das Modul zu beschalten ist. Leider ist ein nicht ganz unwichtiger Punkt aber etwas schwammig formuliert: Das Modul l&#228;sst sich anscheinend in eine Art Schlafmodus versetzen. Dazu muss einer der vier Anschl&#252;sse auf hohes Potential gelegt werden. Zum Einschalten soll er auf GND liegen. Soweit die Theorie. In der Praxis hat sich jetzt gezeigt, dass dieser Anschluss wohl intern bereits auf GND liegt und eine externe Beschaltung Probleme bereitet. Jedenfalls habe ich diesen Anschluss jetzt unbeschaltet gelassen und so scheint es zu funktionieren. Die anderen Anschl&#252;sse sind +5V, GND und DCF. An DCF liegt das (invertierte) Signal an, das das Modul empf&#228;ngt.</p>
<p>Normalerweise besteht das DCF77-Signal aus einem High-Pegel, der zu Beginn jeder Sekunde auf 25% der Leistung abgesenkt wird. 100ms f&#252;r eine logische 0 und 200ms f&#252;r eine logische 1. (Weitere Details gibt es <a href="http://de.wikipedia.org/wiki/DCF77" target="_blank" rel="nofollow" class="liwikipedia">hier</a>.) Die Inversion bewirkt jetzt, dass das Signal an DCF grunds&#228;tzlich auf niedrigem Potential liegt und zu Beginn jeder Sekunde f&#252;r 100 bzw. 200ms auf +5V gezogen wird.</p>
<p>F&#252;r einen &#8220;sauberen&#8221; Betrieb des Funkmoduls wird eine Spannung zwischen 1,2 und 5V ben&#246;tigt, die im Betrieb allerdings um weniger als 0,1V schwanken darf. Bisher konnte ich meine Schaltungen einfach mit einem 5V Netzteil betreiben ohne Probleme zu kriegen. Aber f&#252;r das Modul schien das nicht mehr zu reichen, so dass ich einen 7805-Baustein zusammen mit 3 Kondensatoren (2x100nF KerKo, 1&#215;10µF ELKO) einbauen musste. Dieser erzeugt nun aus 7V Eingangsspannung eine stabilisierte Spannung von 5V, die auch dem m&#228;keligen Funkmodul gen&#252;gt. <img src='http://blog.elvizz.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Bei dem nun folgenden h&#228;ufigen Programmieren und damit verbundenem Bewegen der Schaltung, habe ich wohl die Antenne etwas zu viel und falsch bewegt, so dass sie sich schlie&#223;lich vom Funkmodul gel&#246;st hat. Mit etwas Arbeit lie&#223; sie sich aber wieder anl&#246;ten, was sich aber schon recht schwierig gestaltet hat, da die d&#252;nnen Anschlusskabel die W&#228;rme des L&#246;tzinns nicht richtig ableiten konnten und so der Zinn nicht abk&#252;hlen konnte um zu erstarren&#8230; naja, schlie&#223;lich und endlich hat es aber geklappt.</p>
<p>Den Code f&#252;r die Auswertung des DCF-Signals habe ich von <a href="http://www.mikrocontroller.net/articles/DCF77-Funkwecker_mit_AVR" target="_blank" class="liexternal">dieser</a> Seite teilweise &#252;bernommen und angepasst. Meinen Code gibt&#8217;s dann auch <a href="http://www-users.rwth-aachen.de/marcodanielpascal.lierfeld/wordpress/wp-admin/dcf77.c" id="p36" title="hier" rel="nofollow" class="liexternal">hier</a>. Die Funktionalit&#228;t wurde nur um die DCF77-Routinen erweitert.</p>
<p>Auch das neue Schaltbild gibt es nat&#252;rlich:<br />
<a href="http://www-users.rwth-aachen.de/marcodanielpascal.lierfeld/wordpress/wp-content/uploads/2006/05/dcf77.png" class="imagelink" title="Schaltplan f&#252;r DCF77" rel="lightbox"><img width="717" height="467" id="image37" alt="Schaltplan f&#252;r DCF77" src="http://www-users.rwth-aachen.de/marcodanielpascal.lierfeld/wordpress/wp-content/uploads/2006/05/dcf77.png" /></a><br />
Hier sind auch alle Neuerungen eingetragen. Ich musste die Anschl&#252;sse f&#252;r die Stundenanzeige ver&#228;ndern, da ich den Pin f&#252;r den externen Interrupt vorher belegt hatte.</p>
<p>F&#252;r die Zukunft steht jetzt noch ein Summer/Lautsprecher an, mit dem dann eine Weckfunktionalit&#228;t hinzukommen kann. Ich werde mal ein wenig experimentieren, was sich da so machen l&#228;sst. Ein Geh&#228;use habe ich mittlerweile auch, allerdings werde ich die Uhr vorerst da noch nicht einbauen.</p>
<p>Im Moment scheint der Anschluss des DCF-Moduls einen Wackelkontakt zu haben, denn ab und zu empf&#228;ngt die Uhr die aktuelle Zeit nicht <img src='http://blog.elvizz.net/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  Eventuell befestige ich das Modul und die Antenne noch auf einem starren St&#252;ckchen Pappe oder so um zus&#228;tzliche Bewegung und somit Belastung f&#252;r die eh schon schlechte Verbindung zu vermeiden&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.elvizz.net/2006/05/27/jetzt-funkts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Was eine Sekunde ist</title>
		<link>http://blog.elvizz.net/2006/05/20/was-eine-sekunde-ist/</link>
		<comments>http://blog.elvizz.net/2006/05/20/was-eine-sekunde-ist/#comments</comments>
		<pubDate>Sat, 20 May 2006 20:33:16 +0000</pubDate>
		<dc:creator>Elvizz</dc:creator>
				<category><![CDATA[Binäruhr]]></category>

		<guid isPermaLink="false">http://blog.elvizz.net/?p=33</guid>
		<description><![CDATA[Eine Sekunde wird derzeit folgenderma&#223;en definiert: Eine Sekunde ist definitionsgem&#228;&#223; das 9.192.631.770-fache der Periode einer Mikrowelle, die mit einem ausgew&#228;hlten Niveau&#252;bergang im Caesiumatom in Resonanz ist. Anders gesagt: das 9.192.631.770-fache der Periodendauer der dem &#220;bergang zwischen den beiden Hyperfeinstrukturniveaus des Grundzustandes von Atomen des Nuklids 133Cs entsprechenden Strahlung. http://de.wikipedia.org/wiki/Sekunde Von all dem wei&#223; der AVR [...]]]></description>
			<content:encoded><![CDATA[<p>Eine Sekunde wird derzeit folgenderma&#223;en definiert:</p>
<blockquote><p>Eine Sekunde ist definitionsgem&#228;&#223; das 9.192.631.770-fache der <a href="http://de.wikipedia.org/wiki/Periode" title="Periode" rel="nofollow" class="liwikipedia">Periode</a> einer <a href="http://de.wikipedia.org/wiki/Mikrowelle" title="Mikrowelle" rel="nofollow" class="liwikipedia">Mikrowelle</a>, die mit einem ausgew&#228;hlten Niveau&#252;bergang im <a href="http://de.wikipedia.org/wiki/Caesium" title="Caesium" rel="nofollow" class="liwikipedia">Caesiumatom</a> in <a href="http://de.wikipedia.org/wiki/Resonanz" title="Resonanz" rel="nofollow" class="liwikipedia">Resonanz</a> ist. Anders gesagt: das 9.192.631.770-fache der <a href="http://de.wikipedia.org/wiki/Periodendauer" title="Periodendauer" rel="nofollow" class="liwikipedia">Periodendauer</a> der dem <a href="http://de.wikipedia.org/wiki/%C3%9Cbergang" title="&#220;bergang" rel="nofollow" class="liwikipedia">&#220;bergang</a> zwischen den beiden <a href="http://de.wikipedia.org/wiki/Hyperfeinstruktur" title="Hyperfeinstruktur" rel="nofollow" class="liwikipedia">Hyperfeinstruktur</a>niveaus des <a href="http://de.wikipedia.org/wiki/Grundzustand" title="Grundzustand" rel="nofollow" class="liwikipedia">Grundzustandes</a> von <a href="http://de.wikipedia.org/wiki/Atom" title="Atom" rel="nofollow" class="liwikipedia">Atomen</a> des <a href="http://de.wikipedia.org/wiki/Nuklid" title="Nuklid" rel="nofollow" class="liwikipedia">Nuklids</a> <sup>133</sup>Cs entsprechenden <a href="http://de.wikipedia.org/wiki/Strahlung" title="Strahlung" rel="nofollow" class="liwikipedia">Strahlung</a>.<br />
<a href="http://de.wikipedia.org/wiki/Sekunde" target="_blank" rel="nofollow" class="liwikipedia"><em>http://de.wikipedia.org/wiki/Sekunde</em></a></p></blockquote>
<p>Von all dem wei&#223; der AVR aber nichts. Gem&#228;&#223; seinem internen Takt von 1MHz besteht eine Sekunde aus einer Millionen Takte. Da der interne Takt aber recht ungenau ist, ist auch eine Sekunde f&#252;r den AVR nicht so genau definiert. M&#246;chte man den AVR aber z.B. als Uhr benutzen, ist das sehr unpraktisch. Abhilfe muss also her.</p>
<p><span id="more-33"></span>Deswegen wollte ich &#8211; schon bevor ich die falschen Fuse-Bits gesetzt habe &#8211; einen externen Quarz-Kristall mit dem AVR verbinden, um ein stabiles Taktsignal zu haben. Da ich in dem Datenblatt etwas &#252;ber einen externen 32.768kHz Kristall gelesen hatte, f&#252;r den der AVR ausgelegt sei, hatte ich diesen zuerst versehentlich f&#252;r einen Ersatz zum internen Taktgeber gehalten. Daher auch der Artikel &#8220;<a href="http://blog.elvizz.net/?p=31" target="_blank" class="liinternal">Fuse-Bits sind b&#246;se&#8230;</a>&#8220;.</p>
<p>Nachdem ich diesen Fehler wieder hingebogen habe, habe ich den externen Kristall mit den korrekten Eing&#228;ngen TOSC1 und TOSC2 verbunden. Nachdem ich dann noch den zweiten Timer so eingestellt habe, dass er den externen Resonator auch verwendet, hatte ich pl&#246;tzlich ein recht stabiles Signal von 32.768kHz zur Verf&#252;gung.</p>
<p>Auch wenn diese Zahl auf den ersten Blick recht unhandlich aussieht, f&#228;llt auf, dass sie sich prima durch z.B. 1024 teilen l&#228;sst &#8211; eine Zahl, die der AVR auch mag <img src='http://blog.elvizz.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Also benutze ich einen Vorteiler von 1024 und l&#246;se alle 32768/1024 = 32 Takte einen Interrupt aus &#8211; also genau 1 Mal pro Sekunde.</p>
<p>Dieser Takt ist bedeutend genauer als der Takt des AVR. Mit diesem hatte ich innerhalb von 24 Stunden einen Fehler von mehr als 5 Minuten. Mit dem Uhrenquarz hatte ich in 12 Stunden einen Fehler kleiner als eine Sekunde. Wenn das mal kein Unterschied ist <img src='http://blog.elvizz.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Hier noch einige ausgew&#228;hlte Code-Schnipsel, die das eben gesagte verdeutlichen sollen:</p>
<blockquote><p>void main(){<br />
//&#8230;<br />
ASSR |= 1< TCCR2 = (1<<<<br />
TIMSK |= 1<<br />
//...<br />
}<br />
SIGNAL (SIG_OVERFLOW2){<br />
TCNT0 = -32;    // 1s: Prescaler 1024, resonator freq. 32.768kHz<br />
// ...<br />
}</p></blockquote>
<p>Der Rest des Codes sollte eigentlich recht unver&#228;ndert geblieben sein. Ich stelle ihn trotzdem mal zum <a href="http://blog.elvizz.net/wp-admin/main.c" id="p34" title="Binary Clock with external resonator" rel="nofollow" class="liinternal">Download</a>, damit ihr einen Gesamteindruck kriegt <img src='http://blog.elvizz.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Mein n&#228;chster Plan ist jetzt, den AVR noch mit einem Funkmodul auszustatten, &#252;ber das er sich die aktuelle Atomzeit besorgen kann, um auch den kleinen Gangunterschied des Quarzes zu korrigieren&#8230;</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.elvizz.net/2006/05/20/was-eine-sekunde-ist/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ein paar Verbesserungen und Gedanken</title>
		<link>http://blog.elvizz.net/2006/04/28/ein-paar-verbesserungen-und-gedanken/</link>
		<comments>http://blog.elvizz.net/2006/04/28/ein-paar-verbesserungen-und-gedanken/#comments</comments>
		<pubDate>Fri, 28 Apr 2006 16:33:00 +0000</pubDate>
		<dc:creator>Elvizz</dc:creator>
				<category><![CDATA[Binäruhr]]></category>

		<guid isPermaLink="false">http://blog.elvizz.net/?p=30</guid>
		<description><![CDATA[Nachdem ich gestern die Bin&#228;ruhr in Betrieb genommen habe, sind mir noch ein paar Dinge ein- und aufgefallen, die man verbessern kann&#8230; Die LEDs leuchten bei mir so hell, dass man die Zeit nicht richtig ablesen kann, weil man geblendet wird. Au&#223;erdem k&#246;nnte man die Uhr nachts sogar als Lampe benutzen Das macht also keinen [...]]]></description>
			<content:encoded><![CDATA[<p>Nachdem ich gestern die Bin&#228;ruhr in Betrieb genommen habe, sind mir noch ein paar Dinge ein- und aufgefallen, die man verbessern kann&#8230;<span id="more-30"></span></p>
<p>Die LEDs leuchten bei mir so hell, dass man die Zeit nicht richtig ablesen kann, weil man geblendet wird. Au&#223;erdem k&#246;nnte man die Uhr nachts sogar als Lampe benutzen <img src='http://blog.elvizz.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Das macht also keinen Sinn. Ich habe mir erstmal so geholfen, dass ich einen zus&#228;tzlichen 12 Ohm Widerstand in den gemeinsamen Masseanschluss aller LEDs gel&#246;tet habe. Die Anzeige ist dadurch schon etwas angenehmer geworden. Aber wahrscheinlich werde ich den Widerstandswert noch etwas erh&#246;hen.</p>
<p>Au&#223;erdem habe ich gemerkt, dass es sehr unpraktisch ist, wenn ich jedes Mal den µC ausbauen muss, wenn ich ihn umprogrammieren will. Daher habe ich einen Anschluss f&#252;r das Programmierinterface auf die Platine gel&#246;tet und passend verdrahtet. Bisher hatte ich den AVR immer auf meinem Breadboard programmiert. Der Programmieradapter besteht aus einem Anschluss f&#252;r den Parallelport des PC, einem Kabel, zwei Widerst&#228;nden und einer f&#252;nfpoligen Stiftleiste (gem&#228;&#223; dieser <a href="http://s-huehn.de/elektronik/avr-prog/avr-prog.htm" target="_blank" class="liexternal">Anleitung</a>). Ich habe also einfach noch eine f&#252;nfpolige Stiftleiste auf die Platine gel&#246;tet und mit dem µC verbunden. Jetzt kann ich den AVR also auch direkt in der Uhr programmieren &#8211; ein netter Nebeneffekt des Ganzen ist, dass beim Programmieren einige LEDs aufleuchten, da sie an demselben Port wie das Programmierinterface h&#228;ngen <img src='http://blog.elvizz.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Mir ist auch aufgefallen, dass meine erste Idee, n&#228;mlich die LEDs als Matrix zu verkabeln &#8211; was die Anzahl der n&#246;tigen I/O-Pins und den Verdahtungsaufwand drastisch reduziert h&#228;tte &#8211; auch m&#246;glich gewesen w&#228;re. Ich hatte diese M&#246;glichkeit aber anfangs ausgeschlossen, da ich dachte, dass ich dann nicht jede beliebige Kombination an LEDs zum Leuchten bringen k&#246;nnte. Aber das ist ja auch gar nicht n&#246;tig: Die LEDs m&#252;ssen nicht st&#228;ndig leuchten, d.h. ich h&#228;tte einen Zeitmultiplex anwenden k&#246;nnen&#8230; naja, die jetzige Variante hat den Vorteil, dass die Programmierung recht einfach ist. Also: Wer fit mit dem L&#246;tkolben ist und ausreichend I/O-Ports hat, kann meine Verkabelung nutzen &#8211; wer das nicht ist/kann/will, benutzt eine Matrixverdrahtung und muss den Code dann nur noch etwas anpassen.</p>
<p>Im Moment spiele ich mit dem Gedanken, ein DCF77-Modul (z.B. von Reichelt oder Conrad) in die Schaltung zu integrieren. Das h&#228;tte einige Vorteile:</p>
<ul>
<li>Da der interne Oszillator des AVR nicht sehr genau ist, treten nach einiger Zeit schon Gangunterschiede auf &#8211; ok, das lie&#223;e sich in Software noch ein wenig ausbessern, aber eben nur bis zu einem bestimmten Punkt.</li>
<li>Man spart sich das l&#228;stige Einstellen der Uhrzeit</li>
<li>und zu guter Letzt ist es doch einfach ziemlich cool, oder? <img src='http://blog.elvizz.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </li>
</ul>
<p>Als zus&#228;tzliche Feature habe ich mir &#252;berlegt, noch einen Summer und einen zus&#228;tzlichen Taster einzubauen, um eine Weckerfunktionalit&#228;t zu erzeugen. Die zus&#228;tzliche Taste w&#228;re n&#246;tig, um den Modus zu wechseln: Entweder Taste nicht gedr&#252;ckt, dann stellt man mit den anderen beiden Tasten die normale Uhrzeit ein oder Taste gedr&#252;ckt, dann stellt man die Alarmzeit ein. Au&#223;erdem w&#228;re dann noch eine LED n&#252;tzlich, die den aktuellen Alarmzustand (ein/aus) anzeigt, damit man nicht aus Versehen geweckt wird <img src='http://blog.elvizz.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
In Kombination mit dem Funkmodul lie&#223;e sich der zus&#228;tzliche Taster einsparen, da man die Uhrzeit wahrscheinlich nicht mehr verstellen m&#246;chte. Den gesparten Taster k&#246;nnte man gegen noch eine LED austauschen, die zus&#228;tzliche Alarmmodi anzeigt: Ich denke da z.B. an einen Alarmmodus, der nur in der Woche klingelt &#8211; oder mehrere Weckzeiten &#8211; auch wenn das dann doch noch zus&#228;tzliche Taster erfordern w&#252;rde&#8230; die M&#246;glichkeiten sind doch recht umfangreich.</p>
<p>Falls ich das DCF77-Funkmodul nicht dazubaue, werde ich auf jeden Fall einen externen Quarzoszilliator hinzuf&#252;gen, um einen genaueren Takt zu erhalten. Bis ich den habe, werde ich mal sehen, was sich an der Software noch optimieren l&#228;sst&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.elvizz.net/2006/04/28/ein-paar-verbesserungen-und-gedanken/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bin&#228;ruhr</title>
		<link>http://blog.elvizz.net/2006/04/27/binaeruhr/</link>
		<comments>http://blog.elvizz.net/2006/04/27/binaeruhr/#comments</comments>
		<pubDate>Thu, 27 Apr 2006 21:09:33 +0000</pubDate>
		<dc:creator>Elvizz</dc:creator>
				<category><![CDATA[Binäruhr]]></category>

		<guid isPermaLink="false">http://blog.elvizz.net/?p=22</guid>
		<description><![CDATA[Vor Kurzem habe ich im Internet ein Angebot f&#252;r eine Bin&#228;ruhr gesehen. Allerdings waren 20$ (zzgl. Versand) meiner Meinung nach doch etwas zu viel. So bin ich auf die Idee gekommen, selbst eine Bin&#228;ruhr zu bauen. Die n&#246;tigen Komponenten hatte ich zum Gl&#252;ck alle zu Hause. Hier folg also nun meine Anleitung zum Bau einer [...]]]></description>
			<content:encoded><![CDATA[<p>Vor Kurzem habe ich im Internet ein Angebot f&#252;r eine Bin&#228;ruhr gesehen. Allerdings waren 20$ (zzgl. Versand) meiner Meinung nach doch etwas zu viel. So bin ich auf die Idee gekommen, selbst eine Bin&#228;ruhr zu bauen. Die n&#246;tigen Komponenten hatte ich zum Gl&#252;ck alle zu Hause.<br />
Hier folg also nun meine Anleitung zum Bau einer Bin&#228;ruhr:<span id="more-22"></span></p>
<p>Ihr ben&#246;tigt folgende Komponenten:</p>
<ul>
<li>20 blaue LEDs</li>
<li>20 12 Ohm Widerst&#228;nde</li>
<li>2 10k Ohm Widerst&#228;nde</li>
<li>1 Streifenrasterplatine  (10cmx10cm)</li>
<li>8adriges Flachbandkabel</li>
<li>2 Kurzhubtaster</li>
<li>Anschlussklemme f&#252;r DC-Netzteil</li>
<li>40-Pin Sockel f&#252;r Microcontroller</li>
<li>Microcontroller (z.B. ATMega32)<a href="http://blog.elvizz.net/wp-content/uploads/2006/04/bauteile.jpg" title="Bauteile" class="imagelink" rel="lightbox"><img width="474" height="344" alt="Bauteile" id="image21" src="http://blog.elvizz.net/wp-content/uploads/2006/04/bauteile.jpg" /></a></li>
</ul>
<p>Ich habe einen Schaltplan erstellt nach dem ihr die Schaltung aufbauen k&#246;nnt.<br />
<a href="http://blog.elvizz.net/wp-content/uploads/2006/04/binaryclock.png" class="imagelink" title="Schaltplan der Bin&#228;ruhr" rel="lightbox"><img width="128" height="87" id="image28" alt="Schaltplan der Bin&#228;ruhr" src="http://blog.elvizz.net/wp-content/uploads/2006/04/binaryclockVorschaubild.png" /></a></p>
<p>Als erstes habe ich alle Bauteile auf die Platine gesetzt, um zu sehen, wo ich die Leiterbahnen der Streifenrasterplatine durchtrennen muss, um die n&#246;tigen &#8220;Isolationen&#8221; zwischen den Bauteilen zu erzeugen. Wichtig ist hierbei besonders, die einzelnen Pins des Sockels f&#252;r den Microcontroller voneinander zu isolieren. Auch die Anoden der LEDs m&#252;ssen voneinander getrennt sein, damit es m&#246;glich ist, sie einzeln anzusteuern. Die Kathoden habe ich zeilenweise auf gleiches Potential gelegt. Auch die Schalter m&#252;ssen voneinander isoliert sein, um einen eindeutigen Schaltvorgang zu erhalten.<br />
<a href="http://blog.elvizz.net/wp-content/uploads/2006/04/lochraster1.JPG" title="Streifenrasterplatine mit eingef&#252;gten Unterbrechungen" class="imagelink" rel="lightbox"><img alt="Streifenrasterplatine mit eingef&#252;gten Unterbrechungen" id="image23" style="width: 496px; height: 375px" src="http://blog.elvizz.net/wp-content/uploads/2006/04/lochraster1.JPG" /></a></p>
<p>Dann habe ich die 20 12 Ohm Widerst&#228;nde auf die Platine gesteckt und angel&#246;tet. Im Anschluss habe ich die 2 Schalter, die 10k Ohm Widerst&#228;nde und den Sockel an ihre vorgesehenen Positionen gel&#246;tet. Das Ganze sah dann in etwa so aus:<br />
<a href="http://blog.elvizz.net/wp-content/uploads/2006/04/schalter.jpg" title="Widerst&#228;nde, Schalter und Sockel" class="imagelink" rel="lightbox"><img width="632" height="540" alt="Widerst&#228;nde, Schalter und Sockel" id="image24" src="http://blog.elvizz.net/wp-content/uploads/2006/04/schalter.jpg" /></a><br />
Nun geht es daran, die LEDs auf der Platine zu befestigen. Hierbei ist es wichtig, die Polarit&#228;t der Dioden zu beachten. Ich habe die Kathoden auf die gemeinsame Leiterbahn gesetzt, so dass nur ein Masseanschluss pro Zeile n&#246;tig ist.<br />
<a href="http://blog.elvizz.net/wp-content/uploads/2006/04/leds.jpg" title="LEDs auf der Platine" class="imagelink" rel="lightbox"><img width="631" height="482" alt="LEDs auf der Platine" id="image25" src="http://blog.elvizz.net/wp-content/uploads/2006/04/leds.jpg" /></a></p>
<p>Jetzt kommt nochmal ein etwas schwierigerer Teil: Da unsere Platine nur einseitig bedruckt ist, muss die restliche Verdrahtung zwischen Microcontroller und den LEDs “fliegend” erfolgen. Dazu habe ich das achtadrige Flachbandkabel verwendet und in je 2 vieradrige Teile geteilt, so dass immer eine Zeile verkabelt wird. Wenn man die Verkabelung hier sinnvoll macht, spart man sich hinterher eine Menge Arbeit beim Programmieren des Microcontrollers <img class="wp-smiley" alt=";)" src="http://blog.elvizz.net/wp-includes/images/smilies/icon_wink.gif" />  Tipp: Es ist sinnvoll die LEDs entsprechend ihrer Wertigkeit mit den Ausg&#228;ngen des Microcontrollers zu verbinden.</p>
<p>Au&#223;erdem muss nat&#252;rlich auch f&#252;r die Spannungsversorung des AVR gesorgt sein, die Schalter m&#252;ssen angeschlossen werden und die Masseanschl&#252;sse der LEDs m&#252;ssen verbunden sein… so sieht’s bei mir aus:<br />
<a href="http://blog.elvizz.net/wp-content/uploads/2006/04/verkabelung.jpg" title="Fliegende Verdrahtung" class="imagelink" rel="lightbox"><img width="624" height="543" alt="Fliegende Verdrahtung" id="image26" src="http://blog.elvizz.net/wp-content/uploads/2006/04/verkabelung.jpg" /></a></p>
<p>Als Letztes fehlt noch die Anschlussklemme f&#252;r die Spannungsversorgung, die auf die daf&#252;r vorgesehenen Leiterbahnen gel&#246;tet wird. Bei mir gab es ein kleines Problem mit der Spannungsversorgung (Wackelkontakt), so dass ich noch eine Kontroll-LED mit Vorwiderstand (12k Ohm) eingebaut habe, um zu sehen, ob die Schaltung mit Strom versorgt wird. Und auch hiervon gibt es wieder ein nettes Bildchen:<br />
<a href="http://blog.elvizz.net/wp-content/uploads/2006/04/fertig.jpg" class="imagelink" title="Die fertige Bin&#228;ruhr" rel="lightbox"><img width="634" height="566" id="image27" alt="Die fertige Bin&#228;ruhr" src="http://blog.elvizz.net/wp-content/uploads/2006/04/fertig.jpg" /></a><br />
Auf dem Bild fehlt noch der Microcontroller und das hat auch seinen Sinn, denn bisher fehlt ja noch die n&#246;tige Software f&#252;r unsere Uhr:</p>
<blockquote><p>#include &lt;avr/io.h&gt;<br />
#include &lt;avr/interrupt.h&gt;<br />
#include &lt;util/delay.h&gt;</p>
<p>typedef unsigned char    u8;<br />
typedef signed short    s16;</p>
<p>#define    XTAL        1e6        // 1MHz = 1 * 10^6</p>
<p>#define KEY_PIN        PINC<br />
#define HOURS PORTD<br />
#define MINS PORTB<br />
#define SECS PORTA<br />
#define BUT_PORT PORTC<br />
#define BUT_HOUR PINC0<br />
#define BUT_MIN PINC1</p>
<p>#define REPEAT_MASK    (1&lt;&lt;BUT_HOUR^1&lt;&lt;BUT_MIN)<br />
#define REPEAT_START    50        // after 500ms<br />
#define REPEAT_NEXT    20        // every 200ms</p>
<p>u8 key_state;                // debounced and inverted key state:<br />
// bit = 1: key pressed<br />
u8 key_press;                // key press detect</p>
<p>u8 key_rpt;                // key long press and repeat</p>
<p>static unsigned int count = 0;</p>
<p>static u8 hours_1st = 0, hours_2nd = 0;<br />
static u8 minutes_1st = 0, minutes_2nd = 0;<br />
static u8 seconds_1st = 0, seconds_2nd = 0;</p>
<p>SIGNAL (SIG_OVERFLOW0)            // every 10ms<br />
{<br />
static u8 ct0, ct1, rpt/*, hours, minutes, seconds */;<br />
/* static unsigned int count; */<br />
u8 i;</p></blockquote>
<blockquote><p>TCNT0 = (u8)(s16)-(XTAL / 1024 * 10e-3 + 0.5);    // preload for 10ms</p>
<p>i = key_state ^ ~KEY_PIN;        // key changed ?<br />
ct0 = ~( ct0 &#038; i );            // reset or count ct0<br />
ct1 = ct0 ^ (ct1 &#038; i);        // reset or count ct1<br />
i &#038;= ct0 & ct1;            // count until roll over ?<br />
key_state ^= i;            // then toggle debounced state<br />
key_press |= key_state & i;        // 0->1: key press detect</p>
<p>if( (key_state &#038; REPEAT_MASK) == 0 )    // check repeat function</p>
<p>rpt = REPEAT_START;        // start delay<br />
if( &#8211;rpt == 0 ){<br />
rpt = REPEAT_NEXT;            // repeat delay<br />
key_rpt |= key_state &#038; REPEAT_MASK;<br />
}</p></blockquote>
<blockquote><p>count++;<br />
if (count >= 100){<br />
seconds_2nd++;<br />
count = 0;<br />
if (seconds_2nd >= 10){<br />
seconds_1st++;<br />
seconds_2nd = 0;<br />
if (seconds_1st >= 6){<br />
minutes_2nd++;<br />
seconds_1st = 0;<br />
if (minutes_2nd >= 10){<br />
minutes_1st++;<br />
minutes_2nd = 0;<br />
if (minutes_1st >= 6){<br />
hours_2nd++;<br />
minutes_1st = 0;<br />
if (hours_2nd >= 10){<br />
hours_1st++;<br />
hours_2nd = 0;<br />
if (hours_1st >= 2 &#038;&#038; hours_2nd >= 4){<br />
hours_1st = 0;<br />
hours_2nd = 0;<br />
}<br />
}<br />
}<br />
}<br />
}<br />
}<br />
}<br />
}</p>
<p>u8 get_key_press( u8 key_mask )<br />
{<br />
cli();                    // read and clear atomic !<br />
key_mask &#038;= key_press;                        // read key(s)<br />
key_press ^= key_mask;                        // clear key(s)<br />
sei();<br />
return key_mask;<br />
}</p>
<p>u8 get_key_short( u8 key_mask )<br />
{<br />
cli();            // read key state and key press atomic !<br />
return get_key_press( ~key_state &#038; key_mask );<br />
}</p>
<p>u8 get_key_long( u8 key_mask )<br />
{<br />
return get_key_press( get_key_rpt( key_mask ));<br />
}</p>
<p>int main( void )<br />
{<br />
u8 x;</p>
<p>unsigned int flicker = 0;</p>
<p>DDRA = 0xff;<br />
DDRB = 0xff;<br />
DDRC = 0&#215;00;<br />
DDRD = 0xff;</p>
<p>PORTA = 0&#215;00;<br />
PORTB = 0&#215;00;<br />
PORTD = 0&#215;00;</p>
<p>for (x=0; x&lt;7; x++){<br />
SECS = (1< _delay_ms(500);<br />
}<br />
SECS = 0x00;</p>
<p>for (x=0; x&lt;7; x++){<br />
MINS = (1<<br />
_delay_ms(500);<br />
}<br />
MINS = 0x00;</p>
<p>for (x=0; x&lt;6; x++){<br />
HOURS = (1<<br />
_delay_ms(500);<br />
}<br />
HOURS = 0x00;</p>
<p>TCCR0 = 1<<<br />
TIMSK = 1<</p>
<p>sei();</p>
<p>for(;;){                    // main loop</p>
<p>flicker++;<br />
if (flicker < 50){<br />
HOURS = (hours_1st<&lt;4)|(hours_2nd);<br />
MINS = (minutes_1st<&lt;4)|(minutes_2nd);<br />
SECS = (seconds_1st<&lt;4)|(seconds_2nd);<br />
} else if (flicker > 50 &#038;&#038; flicker < 100){<br />
HOURS = 0x00;<br />
MINS = 0x00;<br />
SECS = 0x00;<br />
flicker = 0;<br />
}</p>
<p>// short press<br />
if( get_key_short( 1<<br />
hours_2nd++;<br />
seconds_1st = 0;<br />
seconds_2nd = 0;<br />
if (hours_2nd >= 10){<br />
hours_1st++;<br />
hours_2nd = 0;<br />
if (hours_1st >= 2 &#038;&#038; hours_2nd >= 4){<br />
hours_1st = 0;<br />
hours_2nd = 0;<br />
}<br />
}<br />
}</p>
<p>// long press<br />
if( get_key_long( 1< hours_2nd += 2;<br />
seconds_1st = 0;<br />
seconds_2nd = 0;<br />
if (hours_2nd >= 10){<br />
hours_1st++;<br />
hours_2nd = 0;<br />
if (hours_1st >= 2 &#038;&#038; hours_2nd >= 4){<br />
hours_1st = 0;<br />
hours_2nd = 0;<br />
}<br />
}<br />
}</p>
<p>// short press<br />
if( get_key_short( 1< minutes_2nd++;<br />
seconds_1st = 0;<br />
seconds_2nd = 0;<br />
if (minutes_2nd >= 10){<br />
minutes_1st++;<br />
minutes_2nd = 0;<br />
if (minutes_1st >= 6){<br />
hours_2nd++;<br />
minutes_1st = 0;<br />
if (hours_2nd >= 10){<br />
hours_1st++;<br />
hours_2nd = 0;<br />
if (hours_1st >= 2 &#038;&#038; hours_2nd >= 4){<br />
hours_1st = 0;<br />
hours_2nd = 0;<br />
}<br />
}<br />
}<br />
}<br />
}</p>
<p>// long press<br />
if( get_key_long( 1< minutes_2nd+=5;<br />
seconds_1st = 0;<br />
seconds_2nd = 0;<br />
if (minutes_2nd >= 10){<br />
minutes_1st++;<br />
minutes_2nd = 0;<br />
if (minutes_1st >= 6){<br />
hours_2nd++;<br />
minutes_1st = 0;<br />
if (hours_2nd >= 10){<br />
hours_1st++;<br />
hours_2nd = 0;<br />
if (hours_1st >= 2 &#038;&#038; hours_2nd >= 4){<br />
hours_1st = 0;<br />
hours_2nd = 0;<br />
}<br />
}<br />
}<br />
}<br />
}<br />
}<br />
}</p></blockquote>
<p><a href="http://blog.elvizz.net/wp-admin/main1.c" title="Der Code f&#252;r die Bin&#228;ruhr" id="p29" rel="nofollow" class="liinternal">Den Code f&#252;r die Bin&#228;ruhr</a> gibt es auch hier nochmal etwas ordentlicher formatiert zum Download.</p>
<p>Die Software funktioniert soweit vollst&#228;ndig. Bei mir zeigt sie allerdings zu Beginn ein merkw&#252;rdiges Verhalten: Nachdem die Anzeige drei Sekunden anzeigt, springt die Zeit pl&#246;tzlich auf 2 Stunden und 5 Minuten vor&#8230; da ist also noch irgendwo ein Bug <img src='http://blog.elvizz.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Sch&#246;n finde ich das Feature, bei einem l&#228;ngeren Tastendruck einen &#8220;schnellen Vorlauf&#8221; zu haben. Das spart etwas Zeit, wenn man eine etwas sp&#228;tere Stunde (oder besonders Minute) einstellen will. Allerdings w&#228;re es hier noch sinnvoll, die Zeit f&#252;r &#8220;lang&#8221; auf ein paar Sekunden zu erh&#246;hen, da sonst nur sehr selten ein kurzer Druck erkannt wird. Der Code hierf&#252;r stammt gr&#246;&#223;tenteils von <a href="http://www.mikrocontroller.net/articles/Entprellung" target="_blank" class="liexternal">hier</a>.<br />
Interessant ist vielleicht auch noch, dass die LEDs eigentlich nur die H&#228;lfte der Zeit &#252;berhaupt an sind. Das spart eine Menge Strom und besonder Abw&#228;rme <img src='http://blog.elvizz.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Und f&#252;r das Auge ist aufgrund der hohen Frequenz nicht mal ein Flackern wahrnehmbar.</p>
<p>Als n&#228;chstes m&#246;chte ich evtl. noch ein passendes Geh&#228;use f&#252;r die Uhr finden &#8211; dann sieht das ganze gleich nach viel mehr aus <img src='http://blog.elvizz.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Au&#223;erdem st&#246;rt dann die Verkabelung hinten nicht mehr so sehr.</p>
<blockquote>
<blockquote /></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.elvizz.net/2006/04/27/binaeruhr/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

