Uhr mit 7-Segment Anzeigen und Attiny2313 – Teil 2

Hier ein Bild der fertig aufgebauten Uhr, bin lediglich am überlegen ob ich noch 2 Taster zum Einstellen der Minuten und Stunden hinzufügen soll, es wären ja noch genau 2 Ports am 2313 frei ;-)

Aktuell steckt man Sie einfach zur einprogrammierten Uhrzeit ein, oder programmiert die Uhrzeit über den ISP-Port.

Uhr mit 7 Segment Anzeigen und Attiny2313 gelötet

C3/C4 fiepen beim Lenovo Thinkpad T400s & Ubuntu 9.04/9.10 64 Bit deaktivieren

Das sogenannte C3- bzw. C4-Fiepen (Ton im Hohen Frequenzbereich, welcher von vielen Menschen garnicht wahrgenommen wird ;)) tritt durch thermische Verformung von Bauteilen, hervorgerufen durch den ständig ändernden Stromverbrauch (dieser wiederum verursacht durch die Stromsparmodi C3 bzw. C4 der CPU), auf.

In diese Modi schaltet die CPU nur, wenn diese (nahezu) keine Last hat. Um zu verhindern, dass die CPU in diese Modi herunterfährt, kann man diese durch das hinzufügen der Option „processor.max_cstate=2“ zum verwendeten Kernel im Grub (/boot/grub/menu.lst) deaktivieren.

Dies kann dann z.B wie gefolgt aussehen:

kernel          /boot/vmlinuz-2.6.28-15-generic root=/dev/sda1 ro quiet splash processor.max_cstate=2

Diese Modi sind übrigens genau wegen dem beschriebenen Problem bei verschiedenen Herstellern von Haus aus schon deaktiviert.

Um zu überprüfen, ob die Modi nun auch wirklich abgeschaltet wurden, schauen wir uns noch den Inhalt der Datei „/proc/acpi/processor/CPU1/power“ an:

root@t400s:/# cat /proc/acpi/processor/CPU1/power | grep max_cstate
max_cstate:              C2

Mein T400s ist nun (dank SSD) wieder komplett lautlos – so muss es sein ;)

Kleiner Nachteil: das Notebook benötigt je nach CPU 2-4 Watt mehr, aber lieber eine um 5 Minuten verkürzte Akkulaufzeit als ein nerviges fiepen!

Der richtige Mix aus HTML und PHP

Es gibt verschiedene Möglichkeiten, PHP-Variablen und HTML-Tags miteinander zu verknüpfen. Wie ist mit sicherheit Geschmackssache und kommt ganz auf den Programmierstil des jeweiligen Programmieres an.

Variane 1:

<?php echo "Hello $user"; ?>

Variante 2:

<?php echo 'Hello '.$user; ?>

Wie jedoch verknüpft man PHP-Variablen und HTML-Tags am sinnvollsten miteinander bzw. welche Variante wird vom PHP-Interpreter schneller abgearbeitet?

Hierzu wieder 2 kleine Codeschnipsel, welche von den jeweiligen Varianten gebrauch machen und die Zeit, welche zum Abarbeiten des PHP-Scriptes benötigt wird, am Ende ausgibt:

Variane 1:

<?php
$start=microtime();
for($i=0;$i<50;$i++)
	$test[$i]="Hello Number <b>$i</b>";
$end=microtime();
echo $end-$start;
//Ausgabe: 0.000218
?>

Variane 2:

<?php
$start=microtime();
for($i=0;$i<50;$i++)
	$test[$i]='Hello Number <b>'.$i.'</b>';
$end=microtime();
echo $end-$start;
//Ausgabe: 0.000171
?>

Vergleicht man die Ausgabe der 2 Codeschnipsel miteinander, stellt man fest, dass Variante 2 geringfügig schneller abgearbeitet wird. Warum? der PHP-Interpreter muss den String nicht erst nach Variablen durchsuchen, sondern weiß durch die Trennnung von HTML-Code sowie PHP-Variablen sofort, was er auszugeben hat. Ein weiterer Grund, warum ich Variante 2 empfehlen würde ist, dass auch der Quelltext strukturierter und somit einfacher lesbar ist.

Schreibgeschwindigkeit Benchmark für USB-Stick mit dd

Erst gestern hatten ein Arbeitskollege und ich die Diskussion, welcher von zwei USB-Sticks wohl der schnellere sei. Jeder machte also seine Benchmarks, er mit einem Tool in Windows, ich mit dd in Linux, mit dem ich 100 MB von /dev/zero (if) auf meinen Corsair Voyager Mini (of) schrieb:

dd if=/dev/zero of=/media/CORSAIR/bench.dat bs=1M count=100

Ausgabe von dd:

100+0 Datensätze ein
100+0 Datensätze aus
104857600 Bytes (105 MB) kopiert, 6,81514 s, 15,4 MB/s

Über folgenden Befehl erhaltet ihr Informationen zu dd und allen Parametern:

man dd

Ergebnis: der Corsair Voyager Mini 4GB war in dem Benchmark unter Linux mit seinen 15,4 MB/s ca. 3x so schnell wie im Benchmark unter Windows (6,0 MB/s). 8-)

Uhr mit 7-Segment Anzeigen und Attiny2313

So hier hätten wir es – das erste „richtige“ Projekt in Sachen Microcontroller in diesem Blog. Eine Uhr, basierend auf einem Attiny2313 sowie sechs 7-Segement Anzeigen und 2 Tastern zum einstellen der Minuten und Stunden.

Uhr mit 7 Segment Anzeigen und Attiny2313

Auf dieser Version auf dem Breadboard wurde noch der interne Oszillator des Attiny2313 verwendet (8Mhz), dies wird sich jedoch in der finalen Version ändern, da dieser ziemlich ungenau ist. In der gelöteten Version wird dann ein externer Quarz mit 14,7456 Mhz seinen Dienst verrichten.

Der Attiny2313 ist wie geschaffen für dieses Projekt, die Ports reichen haargenau aus. :-)
Erhältlich ist dieser beispielsweise im Online-Shop element14.

An PB0-PB7 die einzelnen Segmente (a,b,c,d,e,f,g,h sowie dp), Port PD0-PD5 zur Ansteuerung der 6 Anzeigen sowie PA2 und PD6 für die Taster zum einstellen der Minuten und Stunden. An PA0 und PA1 wird in der finalen Version der Quarz seinen Platz einnehmen.

Programmiert wird der AVR mit dem bereits beschriebenen ISP-Programmieradapter und dem Programm Ponyprog.

Auf dem Breadboard wird der Attiny über den Spannungswandler 7805 mit einer 5V Spannung versorgt. In der endgültigen Uhr wird dieser dann durch 3x 1,5V Batterien ersetzt.

Breadboard 5V Spannungsversorgung 7805

Die µC der Atmega AVR Serie (ATtiny2313, Atmega8, Atmega32 usw.) haben eine Betriebsspannung von 5V. Um bei einem Versuchsaufbau auf dem Breadboard nicht immer die komplette Schlatung zur Spannungsversorgung aufbauen zu müssen, habe ich mir eine kleine Platine zusammengelötet, welche die 5V über 2 Pins an der Unterseite der Platine zur Verfügung stellt.

Die Pins werden dann einfach nur in die +/- Leiste des Breadboard gesteckt und eine gewünschte Gleichspannung zwischen 7V und 20V (Datenblatt) eingespeist. Um so höher die Eingangsspannung, um so heißer wird der 7805 Spannungswandler. Deshalb würde ich persönlich eine Spannung zwischen 7V und 12V verwenden.

Als Kühlkörper für den Spannungswandler habe ich ein Stück Metall angebracht, damit die Wärme besser an die Umgebung abgegeben werden kann.

Schaltplan:

Breadboard 5V Spannungswandler 7805 Schaltplan

Breadboard 5V Spannungswandler 7805

Breadboard 5V Spannungswandler 7805

PHP Eventcounter Image

Hier eine kleine Funktion, welches einen Eventcounter erstellt und daraus ein Bild erzeugt.

Der Funktion createeventimage() werden das Jahr, Monat, Tag, Stunde, Minute, Sekunde sowie der Name des Events und der Dateiname des zu erzeugenden Bildes übergeben. Aus diesen Daten wird dann der Eventcounter erzeugt und als Bild zurückgegeben.

<!--?php 
function createeventimage($year, $month, $day, $hour, $minute, $second, $event, $file)
{
	$countdown = mktime($hour, $minute, $second, $month, $day, $year);
	$today = time();
	$diff = $countdown - $today;
	if ($diff < 0)
		$diff = 0;
	$d = floor($diff/60/60/24);
	$h = floor(($diff - $d*60*60*24)/60/60);
	$m = floor(($diff - $d*60*60*24 - $h*60*60)/60);
	$s = floor(($diff - $d*60*60*24 - $h*60*60 - $m*60));
 
	$counter= "Noch ".$d." Tage ".$h." Stunden ".$m." Minuten ".$s." Sekunden";
 
	$picture=ImageCreate(450,75);
	$color_white=ImageColorAllocate($picture,255,255,255);
	$color_black=ImageColorAllocate($picture,0,0,0);
 
	imagefilledrectangle($picture, 0, 0, 450, 75, $color_black);
	imagefilledrectangle($picture, 5, 5, 445, 70, $color_white);
	imagefilledrectangle($picture, 10, 10, 440, 65, $color_black);
	imagestring($picture, 4, 15, 15, $counter, $color_white);
	imagestring($picture, 4,15, 35, "bis ".$event, $color_white);
 
	header("Content-type: image/jpeg");
	imagejpeg($picture, $file);
	header("Location: ".$file);
}
?-->

Benutzen der Funkion:

<!--?php 
createeventimage($_GET["Y"], $_GET["M"], $_GET["D"], $_GET["h"], $_GET["m"], $_GET["s"], $_GET["event"], $_GET["file"]);
?-->

Damit der Eventcounter immer die aktuell verbleibende Zeit bis zum gewünschten Event anzeigt, wird als Bild nicht wie gewöhnlich ein „Bild“ (z.B. ein JPG-File) eingebunden, sondern das PHP-Script (Im Beispiel die Datei „event.php“, welches die Funktion sowie den Funktionsaufruf enthält), dem die Daten für das Event übergeben werden:

<img alt="eventcounter" src="http://blog.gut-man.de/phpscripts/event.php?event=Silvester 2020&amp;Y=2020&amp;M=1&amp;D=13&amp;h=0&amp;m=0&amp;s=0&amp;file=event.jpg" />

Vorteil dieses Scriptes gegenüber z.B. einer JavaScript basierenden Lösung?

Bilder lassen sich in die meisten Gästebücher \ Portalseiten oder auch z.B. Emails einbinden, wo JavaScirpt aus Sicherheitsgründen nicht erlaubt werden kann…

LPT zu ISP Programmieradapter

Hier nun endlich mein erster Artikel zu Mikrocontrollern. Ich befasse mich hauptsächlich mit 8-Bit AVR Microcontrollern (z.B. ATtiny2313, Atmega8, Atmega32). Um diese Microcontroller programmieren zu können, habe ich mir einen Programmieradapter vom LPT-Port auf ISP-Schnittstelle gebaut.

LPD zu ISP Porgrammieradapter

Die von mir beschriebene Version des ISP-Programmierkabels benötigt an Bauteilen lediglich 2 Widerstände mit jeweils 1k.

LPD zu ISP Porgrammieradapter Schaltplan

Bei der Verwendung eines solchen Programmieradapters ist unbedingt darauf zu achten, das der ISP-Stecker immer richtig aufgesteckt wird, da ansonsten euere LPT-Schnittstelle bzw. euer Mainboard Schädem davontragen könnte. Der ISP-Adapter besteht aus den Anschlüssen GND, RESET, MOSI, MISO und SCK, welche sich auch auf den Datenblättern der oben genannten µC wiederfinden. Wie der Microcontroller letztendlich mit dem ISP-Adapter verbunden wird und über welches Programm dieser dann beschrieben werden kann, folgt in einem weiteren Artikel.

Gehäuselüfter Recycling – Tischventilator

Der Sommer steht schon fast vor der Tür und in meinem Dachgeschosszimmer wird es wieder unerträglich heiß werden. Abhilfe schaft absofort mein selbstgebauter Tisch- ventilator, welcher aus 3x 90mm PC-Gehäuselüftern besteht.

Tischventilator

Betrieben werden die Lüfter parallel an 12V. Über einen regelbaren Vorwiderstand kann die Drehzahl geregelt werden.Tischventilator