(English version) Um endlich mal ein kompaktes, abgeschlossenes Projekt mit ATmega8 und DS18S20 zu haben, habe ich heute aus den beiden Teilen ein Thermometer gebaut. Das Ergebnis:
Für das Projekt benötigt man: 1 Steckbrett, 1 ATmega8, 1 DS18S20, 3 7-Segment-Anzeigen mit Decoder, einen Quarz (nicht notwendig) für den ATmega und viele, viele Kabel.
Fangen wir unten an: Der ATmega ließt die Temperatur des DS18S20 aus, genau wie hier: ATmega - Temperaturmessung mit dem DS18S20. Die Verkabelung direkt am ATmega sieht folgendermaßen aus:
An PORTD0 und PORTD1 hängt der mittlere Fuß des DS18S20, PORTD0 ist Ausgang, PORTD1 ist Eingang. Danach rechnet der ATmega die Temperatur in die 3 Stellen um und gibt das entsprechend an die 7-Segment-Decoder weiter, welche das dann wiederum weiter an die Anzeige geben.
So sah das Steckbrett am Anfang aus, ohne die vielen Kabel. Zu beachten ist, dass ich zwischen den 7-Segment-Anzeigen nachträglich eine Reihe frei gelassen habe. Der Code für den ATmega kann hier heruntergeladen werden: Quellcode. Die Ausgänge sind folgendermaßen: PORTC0..3: Zehner, PORTB0..3: Einer, PORTD4..7: Nachkommastelle. Diese werden einfach an die 7-Segment-Decoder (bei mir: 74HC4543) gelegt.
Von dort gehen 7 Kabel je Decoder weiter an die Anzeigen. Da das mit einzelnen Kabeln etwas nervig wäre habe ich mir vor einiger Zeit spezielle "Adapter"-Kabel gebaut, welche gleich den benötigten Vorwiderstand (220 Ohm) beinhalten. Das Zusammenlöten war ein gutes Stück Arbeit, im Nachhinein lohnt es sich aber. Falls jemand weitere Fragen zu diesen Kabeln hat, einfach bei den Kommentaren melden. Das Kabel sieht so aus:
Eine Sammlung von meinen Projekten aus den Bereichen Physik, Elektronik, Informatik und sogar ein bisschen Botanik. Dieser Blog soll einerseits Hilfestellung bei Problemen geben aber andererseits auch als Anregung für weitere Projekte dienen. Falls es zu einem Thema Fragen oder Anregungen gibt: Einfach schnell einen Kommentar schreiben oder das Kontaktformular rechts unten benutzen, ich beantworte das normalerweise innerhalb von einem Tag.
AdSense
Donnerstag, 11. Juli 2013
Mittwoch, 10. Juli 2013
C# - Auf SQL-Datenbank zugreifen
(English version) Eine SQL-Datenbank ist etwas ziemlich mächtiges. Für einen SQL-Server gibt es kostenlose Software (z.B. MySQL) welche auch nicht sonderlich schwer einzurichten ist. Ich gehe davon aus, dass man sich mit SQL auskennt, und weiß was man dem Server senden möchte und wie das mit SQL geht. Um von C# dann auf diesen Server zuzugreifen geht man folgendermaßen vor:
string server = "serverName";
string database = "databaseName;
string uid = "userName";
string password = "password;
string table = "tableName;
string connectionString = "SERVER=" + server + ";" + "DATABASE=" +
database + ";" + "UID=" + uid + ";" + "PASSWORD=" + password + ";";
MySqlConnection connection = new MySqlConnection(connectionString);
connection.Open();
string query = "some SQL query";
MySqlCommand cmd = new MySqlCommand(query, connection);
try
{
cmd.ExecuteNonQuery();
}
catch (Exception)
{}
Kategorien:
C#
Montag, 8. Juli 2013
C# - Klasse in xml-Datei serialisieren
(English version) Um Klassenstrukturen in eine Datei zu schreiben ohne sich dabei um das Dateiformat kümmern zu müssen gibt es bei C# einen Serializer. Dieser kann ganz einfach komplette Klassen (welche durchaus auch Unterklassen beinhalten dürfen). In einer Klasse muss jedes Objekt, welches mit abgespeichert werden soll, markiert werden. Das sieht dann so aus:
Man muss also vor die Klasse
Um nun z.B. die Klasse
Die produzierte Datei sieht dann folgendermaßen aus:
Man kann also sofort auf einen Blick sehen, welchen Wert welches Objekt hat, was beim Serialisieren in eine Datei im binary-Format nicht möglich ist.
Um nun die Datei wieder einzulesen geht man folgendermaßen vor:
[DataContract()]
public class TestClass
{
[DataMember()]
public int testInt = 5;
[DataMember()]
public string testString = "Test";
}Man muss also vor die Klasse
[DataContract()] schreiben und dann vor jedes Objekt, welches abgespeichert werden soll [DataMember()]. Ich musste bei mir in den Verweisen von Visual Studio noch System.Runtime.Serialization hinzufügen.Um nun z.B. die Klasse
testClass welche vom Typ TestClass ist abzuspeichern, benötigt man 5 Zeilen Code. Das sieht dann so aus:var writer = new FileStream("outputFileName.xml", FileMode.Create);
Type type = testClass.GetType();
DataContractSerializer serializer = new DataContractSerializer(type);
serializer.WriteObject(writer, testClass);
writer.Close();Die produzierte Datei sieht dann folgendermaßen aus:
<?xml version="1.0"?>
<TestClass xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/SerializeTest">
<test1>5</test1>
<test2>Test</test2>
</TestClass>Man kann also sofort auf einen Blick sehen, welchen Wert welches Objekt hat, was beim Serialisieren in eine Datei im binary-Format nicht möglich ist.
Um nun die Datei wieder einzulesen geht man folgendermaßen vor:
var reader = new FileStream("outputFileName.xml", FileMode.Open);
Type type = testClass.GetType();
DataContractSerializer deSerializer = new DataContractSerializer(type);
testClass = (TestClass)deSerializer.ReadObject(reader);
reader.Close();
Kategorien:
C#
Sonntag, 7. Juli 2013
Kleiner Helfer beim Löten
(English version) Wer schon mal gelötet hat kennt das Problem sicher: Irgendwie muss man den Lötkolben, den Lötzinn, Bauteil A und Bauteil B in die Hand nehmen. Dummerweise hat man dafür viel zu wenig Hände. Meistens genügt es aber schon, wenn man ein Bauteil irgendwie fixieren kann. Dafür gibt es ja so "Dritte Hände" oder Schraubstöcke. Wer so etwas aber gerade nicht zur Hand hat muss auch nicht verzweifeln. Eine normale Zange und ein Gummi lösen das Problem schon komplett:
Das Gummi simuliert praktisch eine Hand, die die Zange zudrückt. Vorne kann man also Bautel A (z.B. eine Stiftleiste) hineinstecken. Für die verbleibenden drei Sachen müssten die zwei Hände nun reichen (bzw. es sollte zumindest deutlich einfacher sein, als davor).
Das Gummi simuliert praktisch eine Hand, die die Zange zudrückt. Vorne kann man also Bautel A (z.B. eine Stiftleiste) hineinstecken. Für die verbleibenden drei Sachen müssten die zwei Hände nun reichen (bzw. es sollte zumindest deutlich einfacher sein, als davor).
Visual Studio - Profiler
(English version) Jeder, der immer wieder zeitkritische bzw. lang dauernde Sachen programmiert wird sich sicherlicht gefragt haben, welche Teile des Programms den Großteil der Zeit brauchen, um eventuelle unnötige bzw. umständliche Sachen geschickter zu lösen.
Eine Möglichkeit, dies zu tun ist natürlich einfach eine Zeitmessung im Code. Das kann jedoch ziemlich nervig sein und auch viel Zeit brauchen. Daher gibt es bei Visual Studio den sogenannten Profiler. Ich werde im Folgenden nur auf den Profiler von Visual Studio 2012 eingehen.
Den Profiler kann man ganz einfach über "ANALYSIEREN" - Leistungsanalyse Starten (bzw. Alt + F2). Danach wird das Programm gestartet und Visual Studio schreibt fleißig mit. Wenn das Programm beendet wird, generiert Visual Studio einen Bericht, das kann einige Augenblicke dauern.
Sobald dieser fertig generiert ist sieht man die Übersicht. Hier ist dann gleich die CPU-Auslastung angezeigt und darunter die Funktionen, welche am meisten Zeit benötigt haben. In dem CPU-Auslastung-Diagramm kann man dann einen Bereich auswählen und auf "Nach Auswahl filtern" klicken, nun werden nur die Auslastungen aus diesem Bereich gezeigt. Darunter kann man sehen, welche Funktionen am meisten Zeit benötigen (und sich von oben bis nach ganz unten durchhangeln).
Eine Möglichkeit, dies zu tun ist natürlich einfach eine Zeitmessung im Code. Das kann jedoch ziemlich nervig sein und auch viel Zeit brauchen. Daher gibt es bei Visual Studio den sogenannten Profiler. Ich werde im Folgenden nur auf den Profiler von Visual Studio 2012 eingehen.
Den Profiler kann man ganz einfach über "ANALYSIEREN" - Leistungsanalyse Starten (bzw. Alt + F2). Danach wird das Programm gestartet und Visual Studio schreibt fleißig mit. Wenn das Programm beendet wird, generiert Visual Studio einen Bericht, das kann einige Augenblicke dauern.
Sobald dieser fertig generiert ist sieht man die Übersicht. Hier ist dann gleich die CPU-Auslastung angezeigt und darunter die Funktionen, welche am meisten Zeit benötigt haben. In dem CPU-Auslastung-Diagramm kann man dann einen Bereich auswählen und auf "Nach Auswahl filtern" klicken, nun werden nur die Auslastungen aus diesem Bereich gezeigt. Darunter kann man sehen, welche Funktionen am meisten Zeit benötigen (und sich von oben bis nach ganz unten durchhangeln).
Kategorien:
C#
Samstag, 6. Juli 2013
AntMe
(English version) Da bin ich neulich auf etwas cooles gestoßen: AntMe. Das ist eine Ameisen-Simulation, welche in den Grundzügen lediglich aus Ameisen besteht, die nichts tun. Nun kann man im C#-Code direkt einprogrammieren, was die Ameisen tun sollen. Das sieht dann z.B. so aus:
public override void ZielErreicht(Zucker zucker)
{
Nimm(zucker);
GeheZuBau();
}
Das ist kein Pseudocode, so einfach wird das programmiert. Natürlich kann das deutlich komplexer werden, Ameisen setzen Duftmarken und können dadurch mit anderen Ameisen kommunizieren (z.B. "Hier drüben gibt es Zucker!"). Das ganze ist prinzipiell ziemlich einfach, wird jedoch recht schnell komplex, wenn man sich effiziente Strategieen überlegt um möglichst schnell viel Nahrung zu bekommen und den Gegner möglichst klein zu halten.
Direkt im Spiel kann man nicht eingreifen, man schaut sich einfach die Simulation an, programmiert dann weiter und schaut es sich wieder an. Dieses Projekt ist für jeden der gerne C# programmiert geeignet, egal ob Anfänger oder Fortgeschrittener.
public override void ZielErreicht(Zucker zucker)
{
Nimm(zucker);
GeheZuBau();
}
Das ist kein Pseudocode, so einfach wird das programmiert. Natürlich kann das deutlich komplexer werden, Ameisen setzen Duftmarken und können dadurch mit anderen Ameisen kommunizieren (z.B. "Hier drüben gibt es Zucker!"). Das ganze ist prinzipiell ziemlich einfach, wird jedoch recht schnell komplex, wenn man sich effiziente Strategieen überlegt um möglichst schnell viel Nahrung zu bekommen und den Gegner möglichst klein zu halten.
Direkt im Spiel kann man nicht eingreifen, man schaut sich einfach die Simulation an, programmiert dann weiter und schaut es sich wieder an. Dieses Projekt ist für jeden der gerne C# programmiert geeignet, egal ob Anfänger oder Fortgeschrittener.
Kategorien:
C#
Mittwoch, 3. Juli 2013
ATmega - JTAG ausschalten
(English version) Wer schonmal einen ATmega16A oder einem ähnlichen Microcontroller programmiert hat kennt das Problem schon: Die Kanäle PC2..5 funktionieren nicht wie sie sollen. Der Grund dafür ist "JTAG", welches diese Kanäle blockiert. JTAG auszuschalten ist jedoch ganz simpel, man muss einfach
in das Programm einfügen und schon ist es abgeschaltet. Aus (irgendwelchen) Sicherheitsgründen muss man den Befehl jedoch zwei mal direkt hintereinander ausführen, damit man JTAG nicht aus versehen abschaltet. Danach lassen sich die Kanäle PC2..5 wie (fast) alle anderen Kanäle ansteuern.
MCUCSR = (1<<JTD);
MCUCSR = (1<<JTD);in das Programm einfügen und schon ist es abgeschaltet. Aus (irgendwelchen) Sicherheitsgründen muss man den Befehl jedoch zwei mal direkt hintereinander ausführen, damit man JTAG nicht aus versehen abschaltet. Danach lassen sich die Kanäle PC2..5 wie (fast) alle anderen Kanäle ansteuern.
Kategorien:
ATmega
Abonnieren
Posts (Atom)




