<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Odiwan</id>
	<title>Mikrocontroller.net - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Odiwan"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Odiwan"/>
	<updated>2026-04-23T09:11:23Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=71588</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=71588"/>
		<updated>2013-02-01T15:11:37Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Einleitung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows eigener HID Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem aktuellen PC-System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im Laufe der Jahre durch die Unterstützung seitens der Hersteller von Mikrocontrollern und der OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die System Treiber für die Ansteuerung der USB Geräte bei einem Windows System, stellen nach wie vor eine deutliche Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Möchte man nicht den Weg einer RS-232/USB Kommunikation gehen, bietet sich eine Klasse von Geräten an, die bei Hobby Projekten bisher nicht sehr oft betrachtet wurde nämlich die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
In der Regel denken Benutzer bei Thema HID Geräten sofort an eine PC-Maus oder eine Tastatur. Der USB Standard sieht in seiner Definition aber auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Projektes ist die Konstruktion eines kleinen und relativ genauen Temperatur Moduls, dass als USB HID Gerät sehr leicht an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Als weiterer Punkt soll das USB HID Gerät explizit mit Windows 7 x64 Systeme zu betreiben sein und die Anwendungssoftware soll mit c# erstellt werden.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung besteht, wie aus dem Schaltplan ersichtlich ist, nur aus wenigen Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ &#039;&#039;&#039;Atmel Tiny85-20&#039;&#039;&#039; ist. Als Temperatursensor wird ein &#039;&#039;&#039;Dallas DS18B20&#039;&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mit der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet harmoniert.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt der Schutzwiderstände (R1 und R3). Die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig ist der Mikrocontroller aber schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 kann auch ein Dallas DS18S20 oder ein Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|900px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit der V-USB Software realisiert und hat einen speziell für dieses Gerät definierten HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware, welche USB Endpoints es gibt und wie mit ihnen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier ReportIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln den während des letzten Messzyklus ermittelten und zwischengespeicherten Wert des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature Report IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! ReportID || Aktion || Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein kompletter Messzyklus wird mit Hilfe einer State Maschine alle 10s durchlaufen. Die State Maschine läuft dabei unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Temperatur Sensor Zeit sich zu erholen, um nicht durch zu häufige Abfragen sich selbst zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Die USB Kommunikation dagegen ist zeitlich völlig frei darin wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert die eigenen HID System Treiber automatisch beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Kern der Software ist dabei die usbGenericHIDDevice Library aus [9] die die Windows HID API Funktionen in einer leicht nutzbaren Weise kapseln und zur eigenen Verwendung bereitstellen.&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von der Basisklasse &#039;&#039;&#039;usbGenericHidCommunication&#039;&#039;&#039; wird eine eigene USB Device Klasse erstellt, die das reale Gerät widerspiegelt und fertig implementiert alle seine möglichen Eigenschaften in Service Methoden abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die zentrale Klasse &#039;usbDevice&#039; für das HiDTemp Gerät sieht so aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Werten &#039;&#039;&#039;VID = 0x16c0&#039;&#039;&#039; für die Vendor ID und &#039;&#039;&#039;PID = 0x05df&#039;&#039;&#039; für die Produkt ID abgefragt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass kein anderer Hardware Hersteller und seine USB Geräte davon beeinträchtigt wird.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur für den DS18B20 Sensors kann im Bereich von -55°C bis +125°C liegen. Der Temperatur Wert wird dabei als Vorzeichen behaftete ganze Zahl im Bereich von -550000 bis 1250000 abgebildet.&lt;br /&gt;
&lt;br /&gt;
Ein Temperaturwert wird in 4 Byte gespeichert und übertragen. Auf dem Zielsystem muss dieser Wert dann nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat gemäß Datenblatt eine Grundgenauigkeit von +/- 0,5°C. Die Auflösung für einen DS18B20 ist dabei 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung und die Software für das HiDTemp Gerät arbeitet auf meinem Windows 7 x64 Systemen schon länger stabil und ohne Probleme. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach gestaltet, dass sie sehr sicher und problemlos  nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen. Aus diesem Grund stelle ich meine eigenen Sources auch unter die [http://www.gnu.org/licenses/gpl.html GNU General Public License (GPL)].&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* [1] [http://de.wikipedia.org/wiki/Human_Interface_Device Def. Human Interface Device]&lt;br /&gt;
* [2] [http://www.usb.org/developers/hidpage/ HID Information]&lt;br /&gt;
* [3] [http://www.obdev.at/products/vusb/index-de.html V-USB]&lt;br /&gt;
* [4] [http://de.wikipedia.org/wiki/Universal_Serial_Bus Universal Serial Bus]&lt;br /&gt;
* [5] [http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf DS18B20 Programmable Resolution 1-Wire Digital Thermometer]&lt;br /&gt;
* [6] [http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html DS18X20 with AVR]&lt;br /&gt;
* [7] [http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm USB-Deskriptoren]&lt;br /&gt;
* [8] [http://www.microsoft.com/germany/express/products/windows.aspx Visual Studio 2010 Express]&lt;br /&gt;
* [9] [http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows Open Source Framework for USB Generic HID devices]&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:USB]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=71483</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=71483"/>
		<updated>2013-01-30T11:47:02Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows eigener HID Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem aktuellen PC-System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im Laufe der Jahre durch die Unterstützung seitens der Hersteller von Mikrocontrollern und der OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die System Treiber für die Ansteuerung der USB Geräte bei einem Windows System, stellen nach wie vor eine deutliche Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Möchte man nicht den Weg einer RS-232/USB Kommunikation gehen, bietet sich eine Klasse von Geräten an, die bei Hobby Projekten bisher nicht sehr oft betrachtet wurde nämlich die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
In der Regel denken Benutzer bei Thema HID Geräten sofort an eine PC-Maus und eine Tastatur. Der USB Standard sieht in seiner Definition aber auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Projektes ist die Konstruktion eines kleinen und relativ genauen Temperatur Moduls, dass als USB HID Gerät sehr leicht an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Als weiterer Punkt soll das USB HID Gerät explizit mit Windows 7 x64 Systeme zu betreiben sein und die Anwendungssoftware soll mit c# erstellt werden.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung besteht, wie aus dem Schaltplan ersichtlich ist, nur aus wenigen Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ &#039;&#039;&#039;Atmel Tiny85-20&#039;&#039;&#039; ist. Als Temperatursensor wird ein &#039;&#039;&#039;Dallas DS18B20&#039;&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mit der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet harmoniert.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt der Schutzwiderstände (R1 und R3). Die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig ist der Mikrocontroller aber schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 kann auch ein Dallas DS18S20 oder ein Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|900px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit der V-USB Software realisiert und hat einen speziell für dieses Gerät definierten HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware, welche USB Endpoints es gibt und wie mit ihnen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier ReportIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln den während des letzten Messzyklus ermittelten und zwischengespeicherten Wert des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature Report IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! ReportID || Aktion || Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein kompletter Messzyklus wird mit Hilfe einer State Maschine alle 10s durchlaufen. Die State Maschine läuft dabei unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Temperatur Sensor Zeit sich zu erholen, um nicht durch zu häufige Abfragen sich selbst zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Die USB Kommunikation dagegen ist zeitlich völlig frei darin wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert die eigenen HID System Treiber automatisch beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Kern der Software ist dabei die usbGenericHIDDevice Library aus [9] die die Windows HID API Funktionen in einer leicht nutzbaren Weise kapseln und zur eigenen Verwendung bereitstellen.&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von der Basisklasse &#039;&#039;&#039;usbGenericHidCommunication&#039;&#039;&#039; wird eine eigene USB Device Klasse erstellt, die das reale Gerät widerspiegelt und fertig implementiert alle seine möglichen Eigenschaften in Service Methoden abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die zentrale Klasse &#039;usbDevice&#039; für das HiDTemp Gerät sieht so aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Werten &#039;&#039;&#039;VID = 0x16c0&#039;&#039;&#039; für die Vendor ID und &#039;&#039;&#039;PID = 0x05df&#039;&#039;&#039; für die Produkt ID abgefragt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass kein anderer Hardware Hersteller und seine USB Geräte davon beeinträchtigt wird.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur für den DS18B20 Sensors kann im Bereich von -55°C bis +125°C liegen. Der Temperatur Wert wird dabei als Vorzeichen behaftete ganze Zahl im Bereich von -550000 bis 1250000 abgebildet.&lt;br /&gt;
&lt;br /&gt;
Ein Temperaturwert wird in 4 Byte gespeichert und übertragen. Auf dem Zielsystem muss dieser Wert dann nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat gemäß Datenblatt eine Grundgenauigkeit von +/- 0,5°C. Die Auflösung für einen DS18B20 ist dabei 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung und die Software für das HiDTemp Gerät arbeitet auf meinem Windows 7 x64 Systemen schon länger stabil und ohne Probleme. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach gestaltet, dass sie sehr sicher und problemlos  nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen. Aus diesem Grund stelle ich meine eigenen Sources auch unter die [http://www.gnu.org/licenses/gpl.html GNU General Public License (GPL)].&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* [1] [http://de.wikipedia.org/wiki/Human_Interface_Device Def. Human Interface Device]&lt;br /&gt;
* [2] [http://www.usb.org/developers/hidpage/ HID Information]&lt;br /&gt;
* [3] [http://www.obdev.at/products/vusb/index-de.html V-USB]&lt;br /&gt;
* [4] [http://de.wikipedia.org/wiki/Universal_Serial_Bus Universal Serial Bus]&lt;br /&gt;
* [5] [http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf DS18B20 Programmable Resolution 1-Wire Digital Thermometer]&lt;br /&gt;
* [6] [http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html DS18X20 with AVR]&lt;br /&gt;
* [7] [http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm USB-Deskriptoren]&lt;br /&gt;
* [8] [http://www.microsoft.com/germany/express/products/windows.aspx Visual Studio 2010 Express]&lt;br /&gt;
* [9] [http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows Open Source Framework for USB Generic HID devices]&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:USB]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=71473</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=71473"/>
		<updated>2013-01-30T08:37:03Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Schaltung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem aktuellen PC-System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im Laufe der Jahre durch die Unterstützung seitens der Hersteller von Mikrocontrollern und der OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die System Treiber für die Ansteuerung der USB Geräte bei einem Windows System, stellen nach wie vor eine deutliche Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Möchte man nicht den Weg einer RS-232/USB Kommunikation gehen, bietet sich eine Klasse von Geräten an, die bei Hobby Projekten bisher nicht sehr oft betrachtet wurde nämlich die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
In der Regel denken Benutzer bei Thema HID Geräten sofort an eine PC-Maus und eine Tastatur. Der USB Standard sieht in seiner Definition aber auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Projektes ist die Konstruktion eines kleinen und relativ genauen Temperatur Moduls, dass als USB HID Gerät sehr leicht an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Als weiterer Punkt soll das USB HID Gerät explizit mit Windows 7 x64 Systeme zu betreiben sein und die Anwendungssoftware soll mit c# erstellt werden.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung besteht, wie aus dem Schaltplan ersichtlich ist, nur aus wenigen Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ &#039;&#039;&#039;Atmel Tiny85-20&#039;&#039;&#039; ist. Als Temperatursensor wird ein &#039;&#039;&#039;Dallas DS18B20&#039;&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mit der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet harmoniert.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt der Schutzwiderstände (R1 und R3). Die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig ist der Mikrocontroller aber schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 kann auch ein Dallas DS18S20 oder ein Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|900px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit der V-USB Software realisiert und hat einen speziell für dieses Gerät definierten HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware, welche USB Endpoints es gibt und wie mit ihnen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier ReportIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln den während des letzten Messzyklus ermittelten und zwischengespeicherten Wert des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature Report IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! ReportID || Aktion || Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein kompletter Messzyklus wird mit Hilfe einer State Maschine alle 10s durchlaufen. Die State Maschine läuft dabei unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Temperatur Sensor Zeit sich zu erholen, um nicht durch zu häufige Abfragen sich selbst zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Die USB Kommunikation dagegen ist zeitlich völlig frei darin wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert die eigenen HID System Treiber automatisch beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Kern der Software ist dabei die usbGenericHIDDevice Library aus [9] die die Windows HID API Funktionen in einer leicht nutzbaren Weise kapseln und zur eigenen Verwendung bereitstellen.&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von der Basisklasse &#039;&#039;&#039;usbGenericHidCommunication&#039;&#039;&#039; wird eine eigene USB Device Klasse erstellt, die das reale Gerät widerspiegelt und fertig implementiert alle seine möglichen Eigenschaften in Service Methoden abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die zentrale Klasse &#039;usbDevice&#039; für das HiDTemp Gerät sieht so aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Werten &#039;&#039;&#039;VID = 0x16c0&#039;&#039;&#039; für die Vendor ID und &#039;&#039;&#039;PID = 0x05df&#039;&#039;&#039; für die Produkt ID abgefragt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass kein anderer Hardware Hersteller und seine USB Geräte davon beeinträchtigt wird.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur für den DS18B20 Sensors kann im Bereich von -55°C bis +125°C liegen. Der Temperatur Wert wird dabei als Vorzeichen behaftete ganze Zahl im Bereich von -550000 bis 1250000 abgebildet.&lt;br /&gt;
&lt;br /&gt;
Ein Temperaturwert wird in 4 Byte gespeichert und übertragen. Auf dem Zielsystem muss dieser Wert dann nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat gemäß Datenblatt eine Grundgenauigkeit von +/- 0,5°C. Die Auflösung für einen DS18B20 ist dabei 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung und die Software für das HiDTemp Gerät arbeitet auf meinem Windows 7 x64 Systemen schon länger stabil und ohne Probleme. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach gestaltet, dass sie sehr sicher und problemlos  nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen. Aus diesem Grund stelle ich meine eigenen Sources auch unter die [http://www.gnu.org/licenses/gpl.html GNU General Public License (GPL)].&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* [1] [http://de.wikipedia.org/wiki/Human_Interface_Device Def. Human Interface Device]&lt;br /&gt;
* [2] [http://www.usb.org/developers/hidpage/ HID Information]&lt;br /&gt;
* [3] [http://www.obdev.at/products/vusb/index-de.html V-USB]&lt;br /&gt;
* [4] [http://de.wikipedia.org/wiki/Universal_Serial_Bus Universal Serial Bus]&lt;br /&gt;
* [5] [http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf DS18B20 Programmable Resolution 1-Wire Digital Thermometer]&lt;br /&gt;
* [6] [http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html DS18X20 with AVR]&lt;br /&gt;
* [7] [http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm USB-Deskriptoren]&lt;br /&gt;
* [8] [http://www.microsoft.com/germany/express/products/windows.aspx Visual Studio 2010 Express]&lt;br /&gt;
* [9] [http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows Open Source Framework for USB Generic HID devices]&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:USB]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=71472</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=71472"/>
		<updated>2013-01-30T08:36:35Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Einleitung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem aktuellen PC-System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im Laufe der Jahre durch die Unterstützung seitens der Hersteller von Mikrocontrollern und der OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die System Treiber für die Ansteuerung der USB Geräte bei einem Windows System, stellen nach wie vor eine deutliche Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Möchte man nicht den Weg einer RS-232/USB Kommunikation gehen, bietet sich eine Klasse von Geräten an, die bei Hobby Projekten bisher nicht sehr oft betrachtet wurde nämlich die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
In der Regel denken Benutzer bei Thema HID Geräten sofort an eine PC-Maus und eine Tastatur. Der USB Standard sieht in seiner Definition aber auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Projektes ist die Konstruktion eines kleinen und relativ genauen Temperatur Moduls, dass als USB HID Gerät sehr leicht an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Als weiterer Punkt soll das USB HID Gerät explizit mit Windows 7 x64 Systeme zu betreiben sein und die Anwendungssoftware soll mit c# erstellt werden.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung besteht, wie aus dem Schaltplan ersichtlich ist, nur aus wenigen Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ &#039;&#039;&#039;Atmel Tiny85-20&#039;&#039;&#039; ist. Als Temperatursensor wird ein &#039;&#039;&#039;Dallas DS18B20&#039;&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mit der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet harmoniert.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt der Schutzwiderstände (R1 und R3). Die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig ist der Mikrocontroller aber schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 kann auch ein Dallas DS18S20 oder ein Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|900px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit der V-USB Software realisiert und hat einen speziell für dieses Gerät definierten HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware, welche USB Endpoints es gibt und wie mit ihnen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier ReportIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln den während des letzten Messzyklus ermittelten und zwischengespeicherten Wert des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature Report IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! ReportID || Aktion || Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein kompletter Messzyklus wird mit Hilfe einer State Maschine alle 10s durchlaufen. Die State Maschine läuft dabei unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Temperatur Sensor Zeit sich zu erholen, um nicht durch zu häufige Abfragen sich selbst zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Die USB Kommunikation dagegen ist zeitlich völlig frei darin wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert die eigenen HID System Treiber automatisch beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Kern der Software ist dabei die usbGenericHIDDevice Library aus [9] die die Windows HID API Funktionen in einer leicht nutzbaren Weise kapseln und zur eigenen Verwendung bereitstellen.&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von der Basisklasse &#039;&#039;&#039;usbGenericHidCommunication&#039;&#039;&#039; wird eine eigene USB Device Klasse erstellt, die das reale Gerät widerspiegelt und fertig implementiert alle seine möglichen Eigenschaften in Service Methoden abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die zentrale Klasse &#039;usbDevice&#039; für das HiDTemp Gerät sieht so aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Werten &#039;&#039;&#039;VID = 0x16c0&#039;&#039;&#039; für die Vendor ID und &#039;&#039;&#039;PID = 0x05df&#039;&#039;&#039; für die Produkt ID abgefragt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass kein anderer Hardware Hersteller und seine USB Geräte davon beeinträchtigt wird.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur für den DS18B20 Sensors kann im Bereich von -55°C bis +125°C liegen. Der Temperatur Wert wird dabei als Vorzeichen behaftete ganze Zahl im Bereich von -550000 bis 1250000 abgebildet.&lt;br /&gt;
&lt;br /&gt;
Ein Temperaturwert wird in 4 Byte gespeichert und übertragen. Auf dem Zielsystem muss dieser Wert dann nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat gemäß Datenblatt eine Grundgenauigkeit von +/- 0,5°C. Die Auflösung für einen DS18B20 ist dabei 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung und die Software für das HiDTemp Gerät arbeitet auf meinem Windows 7 x64 Systemen schon länger stabil und ohne Probleme. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach gestaltet, dass sie sehr sicher und problemlos  nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen. Aus diesem Grund stelle ich meine eigenen Sources auch unter die [http://www.gnu.org/licenses/gpl.html GNU General Public License (GPL)].&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* [1] [http://de.wikipedia.org/wiki/Human_Interface_Device Def. Human Interface Device]&lt;br /&gt;
* [2] [http://www.usb.org/developers/hidpage/ HID Information]&lt;br /&gt;
* [3] [http://www.obdev.at/products/vusb/index-de.html V-USB]&lt;br /&gt;
* [4] [http://de.wikipedia.org/wiki/Universal_Serial_Bus Universal Serial Bus]&lt;br /&gt;
* [5] [http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf DS18B20 Programmable Resolution 1-Wire Digital Thermometer]&lt;br /&gt;
* [6] [http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html DS18X20 with AVR]&lt;br /&gt;
* [7] [http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm USB-Deskriptoren]&lt;br /&gt;
* [8] [http://www.microsoft.com/germany/express/products/windows.aspx Visual Studio 2010 Express]&lt;br /&gt;
* [9] [http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows Open Source Framework for USB Generic HID devices]&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:USB]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=71471</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=71471"/>
		<updated>2013-01-30T08:36:02Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Einleitung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem aktuellen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im Laufe der Jahre durch die Unterstützung seitens der Hersteller von Mikrocontrollern und der OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die System Treiber für die Ansteuerung der USB Geräte bei einem Windows System, stellen nach wie vor eine deutliche Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Möchte man nicht den Weg einer RS-232/USB Kommunikation gehen, bietet sich eine Klasse von Geräten an, die bei Hobby Projekten bisher nicht sehr oft betrachtet wurde nämlich die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
In der Regel denken Benutzer bei Thema HID Geräten sofort an eine PC-Maus und eine Tastatur. Der USB Standard sieht in seiner Definition aber auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Projektes ist die Konstruktion eines kleinen und relativ genauen Temperatur Moduls, dass als USB HID Gerät sehr leicht an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Als weiterer Punkt soll das USB HID Gerät explizit mit Windows 7 x64 Systeme zu betreiben sein und die Anwendungssoftware soll mit c# erstellt werden.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung besteht, wie aus dem Schaltplan ersichtlich ist, nur aus wenigen Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ &#039;&#039;&#039;Atmel Tiny85-20&#039;&#039;&#039; ist. Als Temperatursensor wird ein &#039;&#039;&#039;Dallas DS18B20&#039;&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mit der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet harmoniert.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt der Schutzwiderstände (R1 und R3). Die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig ist der Mikrocontroller aber schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 kann auch ein Dallas DS18S20 oder ein Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|900px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit der V-USB Software realisiert und hat einen speziell für dieses Gerät definierten HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware, welche USB Endpoints es gibt und wie mit ihnen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier ReportIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln den während des letzten Messzyklus ermittelten und zwischengespeicherten Wert des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature Report IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! ReportID || Aktion || Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein kompletter Messzyklus wird mit Hilfe einer State Maschine alle 10s durchlaufen. Die State Maschine läuft dabei unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Temperatur Sensor Zeit sich zu erholen, um nicht durch zu häufige Abfragen sich selbst zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Die USB Kommunikation dagegen ist zeitlich völlig frei darin wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert die eigenen HID System Treiber automatisch beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Kern der Software ist dabei die usbGenericHIDDevice Library aus [9] die die Windows HID API Funktionen in einer leicht nutzbaren Weise kapseln und zur eigenen Verwendung bereitstellen.&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von der Basisklasse &#039;&#039;&#039;usbGenericHidCommunication&#039;&#039;&#039; wird eine eigene USB Device Klasse erstellt, die das reale Gerät widerspiegelt und fertig implementiert alle seine möglichen Eigenschaften in Service Methoden abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die zentrale Klasse &#039;usbDevice&#039; für das HiDTemp Gerät sieht so aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Werten &#039;&#039;&#039;VID = 0x16c0&#039;&#039;&#039; für die Vendor ID und &#039;&#039;&#039;PID = 0x05df&#039;&#039;&#039; für die Produkt ID abgefragt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass kein anderer Hardware Hersteller und seine USB Geräte davon beeinträchtigt wird.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur für den DS18B20 Sensors kann im Bereich von -55°C bis +125°C liegen. Der Temperatur Wert wird dabei als Vorzeichen behaftete ganze Zahl im Bereich von -550000 bis 1250000 abgebildet.&lt;br /&gt;
&lt;br /&gt;
Ein Temperaturwert wird in 4 Byte gespeichert und übertragen. Auf dem Zielsystem muss dieser Wert dann nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat gemäß Datenblatt eine Grundgenauigkeit von +/- 0,5°C. Die Auflösung für einen DS18B20 ist dabei 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung und die Software für das HiDTemp Gerät arbeitet auf meinem Windows 7 x64 Systemen schon länger stabil und ohne Probleme. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach gestaltet, dass sie sehr sicher und problemlos  nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen. Aus diesem Grund stelle ich meine eigenen Sources auch unter die [http://www.gnu.org/licenses/gpl.html GNU General Public License (GPL)].&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* [1] [http://de.wikipedia.org/wiki/Human_Interface_Device Def. Human Interface Device]&lt;br /&gt;
* [2] [http://www.usb.org/developers/hidpage/ HID Information]&lt;br /&gt;
* [3] [http://www.obdev.at/products/vusb/index-de.html V-USB]&lt;br /&gt;
* [4] [http://de.wikipedia.org/wiki/Universal_Serial_Bus Universal Serial Bus]&lt;br /&gt;
* [5] [http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf DS18B20 Programmable Resolution 1-Wire Digital Thermometer]&lt;br /&gt;
* [6] [http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html DS18X20 with AVR]&lt;br /&gt;
* [7] [http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm USB-Deskriptoren]&lt;br /&gt;
* [8] [http://www.microsoft.com/germany/express/products/windows.aspx Visual Studio 2010 Express]&lt;br /&gt;
* [9] [http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows Open Source Framework for USB Generic HID devices]&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:USB]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=71470</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=71470"/>
		<updated>2013-01-30T08:35:19Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Firmware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im Laufe der Jahre durch die Unterstützung seitens der Hersteller von Mikrocontrollern und der OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die System Treiber für die Ansteuerung der USB Geräte bei einem Windows System, stellen nach wie vor eine deutliche Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Möchte man nicht den Weg einer RS-232/USB Kommunikation gehen, bietet sich eine Klasse von Geräten an, die bei Hobby Projekten bisher nicht sehr oft betrachtet wurde nämlich die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
In der Regel denken Benutzer bei Thema HID Geräten sofort an eine PC-Maus und eine Tastatur. Der USB Standard sieht in seiner Definition aber auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Projektes ist die Konstruktion eines kleinen und relativ genauen Temperatur Moduls, dass als USB HID Gerät sehr leicht an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Als weiterer Punkt soll das USB HID Gerät explizit mit Windows 7 x64 Systeme zu betreiben sein und die Anwendungssoftware soll mit c# erstellt werden.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung besteht, wie aus dem Schaltplan ersichtlich ist, nur aus wenigen Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ &#039;&#039;&#039;Atmel Tiny85-20&#039;&#039;&#039; ist. Als Temperatursensor wird ein &#039;&#039;&#039;Dallas DS18B20&#039;&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mit der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet harmoniert.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt der Schutzwiderstände (R1 und R3). Die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig ist der Mikrocontroller aber schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 kann auch ein Dallas DS18S20 oder ein Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|900px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit der V-USB Software realisiert und hat einen speziell für dieses Gerät definierten HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware, welche USB Endpoints es gibt und wie mit ihnen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier ReportIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln den während des letzten Messzyklus ermittelten und zwischengespeicherten Wert des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature Report IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! ReportID || Aktion || Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein kompletter Messzyklus wird mit Hilfe einer State Maschine alle 10s durchlaufen. Die State Maschine läuft dabei unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Temperatur Sensor Zeit sich zu erholen, um nicht durch zu häufige Abfragen sich selbst zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Die USB Kommunikation dagegen ist zeitlich völlig frei darin wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert die eigenen HID System Treiber automatisch beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Kern der Software ist dabei die usbGenericHIDDevice Library aus [9] die die Windows HID API Funktionen in einer leicht nutzbaren Weise kapseln und zur eigenen Verwendung bereitstellen.&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von der Basisklasse &#039;&#039;&#039;usbGenericHidCommunication&#039;&#039;&#039; wird eine eigene USB Device Klasse erstellt, die das reale Gerät widerspiegelt und fertig implementiert alle seine möglichen Eigenschaften in Service Methoden abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die zentrale Klasse &#039;usbDevice&#039; für das HiDTemp Gerät sieht so aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Werten &#039;&#039;&#039;VID = 0x16c0&#039;&#039;&#039; für die Vendor ID und &#039;&#039;&#039;PID = 0x05df&#039;&#039;&#039; für die Produkt ID abgefragt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass kein anderer Hardware Hersteller und seine USB Geräte davon beeinträchtigt wird.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur für den DS18B20 Sensors kann im Bereich von -55°C bis +125°C liegen. Der Temperatur Wert wird dabei als Vorzeichen behaftete ganze Zahl im Bereich von -550000 bis 1250000 abgebildet.&lt;br /&gt;
&lt;br /&gt;
Ein Temperaturwert wird in 4 Byte gespeichert und übertragen. Auf dem Zielsystem muss dieser Wert dann nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat gemäß Datenblatt eine Grundgenauigkeit von +/- 0,5°C. Die Auflösung für einen DS18B20 ist dabei 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung und die Software für das HiDTemp Gerät arbeitet auf meinem Windows 7 x64 Systemen schon länger stabil und ohne Probleme. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach gestaltet, dass sie sehr sicher und problemlos  nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen. Aus diesem Grund stelle ich meine eigenen Sources auch unter die [http://www.gnu.org/licenses/gpl.html GNU General Public License (GPL)].&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* [1] [http://de.wikipedia.org/wiki/Human_Interface_Device Def. Human Interface Device]&lt;br /&gt;
* [2] [http://www.usb.org/developers/hidpage/ HID Information]&lt;br /&gt;
* [3] [http://www.obdev.at/products/vusb/index-de.html V-USB]&lt;br /&gt;
* [4] [http://de.wikipedia.org/wiki/Universal_Serial_Bus Universal Serial Bus]&lt;br /&gt;
* [5] [http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf DS18B20 Programmable Resolution 1-Wire Digital Thermometer]&lt;br /&gt;
* [6] [http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html DS18X20 with AVR]&lt;br /&gt;
* [7] [http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm USB-Deskriptoren]&lt;br /&gt;
* [8] [http://www.microsoft.com/germany/express/products/windows.aspx Visual Studio 2010 Express]&lt;br /&gt;
* [9] [http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows Open Source Framework for USB Generic HID devices]&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:USB]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=71469</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=71469"/>
		<updated>2013-01-30T08:34:20Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Fazit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im Laufe der Jahre durch die Unterstützung seitens der Hersteller von Mikrocontrollern und der OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die System Treiber für die Ansteuerung der USB Geräte bei einem Windows System, stellen nach wie vor eine deutliche Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Möchte man nicht den Weg einer RS-232/USB Kommunikation gehen, bietet sich eine Klasse von Geräten an, die bei Hobby Projekten bisher nicht sehr oft betrachtet wurde nämlich die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
In der Regel denken Benutzer bei Thema HID Geräten sofort an eine PC-Maus und eine Tastatur. Der USB Standard sieht in seiner Definition aber auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Projektes ist die Konstruktion eines kleinen und relativ genauen Temperatur Moduls, dass als USB HID Gerät sehr leicht an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Als weiterer Punkt soll das USB HID Gerät explizit mit Windows 7 x64 Systeme zu betreiben sein und die Anwendungssoftware soll mit c# erstellt werden.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung besteht, wie aus dem Schaltplan ersichtlich ist, nur aus wenigen Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ &#039;&#039;&#039;Atmel Tiny85-20&#039;&#039;&#039; ist. Als Temperatursensor wird ein &#039;&#039;&#039;Dallas DS18B20&#039;&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mit der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet harmoniert.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt der Schutzwiderstände (R1 und R3). Die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig ist der Mikrocontroller aber schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 kann auch ein Dallas DS18S20 oder ein Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|900px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit der V-USB Software realisiert und hat einen speziell für dieses Gerät definierten HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware, welche USB Endpoints es gibt und wie mit ihnen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier ReportIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln den während des letzten Messzyklus ermittelten und zwischengespeicherten Wert des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature Report IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! ReportID || Aktion || Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein kompletter Messzyklus wird mit Hilfe einer State Maschine alle 10s durchlaufen. Die State Maschine läuft dabei unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Temperatur Sensor Zeit sich zu erholen, um nicht durch zu häufige Abfragen sich selbst zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Die USB Kommunikation dagegen ist zeitlich völlig frei darin wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert die eigenen HID System Treiber automatisch beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Kern der Software ist dabei die usbGenericHIDDevice Library aus [9] die die Windows HID API Funktionen in einer leicht nutzbaren Weise kapseln und zur eigenen Verwendung bereitstellen.&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von der Basisklasse &#039;&#039;&#039;usbGenericHidCommunication&#039;&#039;&#039; wird eine eigene USB Device Klasse erstellt, die das reale Gerät widerspiegelt und fertig implementiert alle seine möglichen Eigenschaften in Service Methoden abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die zentrale Klasse &#039;usbDevice&#039; für das HiDTemp Gerät sieht so aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Werten &#039;&#039;&#039;VID = 0x16c0&#039;&#039;&#039; für die Vendor ID und &#039;&#039;&#039;PID = 0x05df&#039;&#039;&#039; für die Produkt ID abgefragt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass kein anderer Hardware Hersteller und seine USB Geräte davon beeinträchtigt wird.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur für den DS18B20 Sensors kann im Bereich von -55°C bis +125°C liegen. Der Temperatur Wert wird dabei als Vorzeichen behaftete ganze Zahl im Bereich von -550000 bis 1250000 abgebildet.&lt;br /&gt;
&lt;br /&gt;
Ein Temperaturwert wird in 4 Byte gespeichert und übertragen. Auf dem Zielsystem muss dieser Wert dann nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat gemäß Datenblatt eine Grundgenauigkeit von +/- 0,5°C. Die Auflösung für einen DS18B20 ist dabei 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung und die Software für das HiDTemp Gerät arbeitet auf meinem Windows 7 x64 Systemen schon länger stabil und ohne Probleme. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach gestaltet, dass sie sehr sicher und problemlos  nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen. Aus diesem Grund stelle ich meine eigenen Sources auch unter die [http://www.gnu.org/licenses/gpl.html GNU General Public License (GPL)].&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* [1] [http://de.wikipedia.org/wiki/Human_Interface_Device Def. Human Interface Device]&lt;br /&gt;
* [2] [http://www.usb.org/developers/hidpage/ HID Information]&lt;br /&gt;
* [3] [http://www.obdev.at/products/vusb/index-de.html V-USB]&lt;br /&gt;
* [4] [http://de.wikipedia.org/wiki/Universal_Serial_Bus Universal Serial Bus]&lt;br /&gt;
* [5] [http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf DS18B20 Programmable Resolution 1-Wire Digital Thermometer]&lt;br /&gt;
* [6] [http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html DS18X20 with AVR]&lt;br /&gt;
* [7] [http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm USB-Deskriptoren]&lt;br /&gt;
* [8] [http://www.microsoft.com/germany/express/products/windows.aspx Visual Studio 2010 Express]&lt;br /&gt;
* [9] [http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows Open Source Framework for USB Generic HID devices]&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:USB]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=71370</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=71370"/>
		<updated>2013-01-29T11:57:45Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Einleitung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im Laufe der Jahre durch die Unterstützung seitens der Hersteller von Mikrocontrollern und der OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die System Treiber für die Ansteuerung der USB Geräte bei einem Windows System, stellen nach wie vor eine deutliche Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Möchte man nicht den Weg einer RS-232/USB Kommunikation gehen, bietet sich eine Klasse von Geräten an, die bei Hobby Projekten bisher nicht sehr oft betrachtet wurde nämlich die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
In der Regel denken Benutzer bei Thema HID Geräten sofort an eine PC-Maus und eine Tastatur. Der USB Standard sieht in seiner Definition aber auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Projektes ist die Konstruktion eines kleinen und relativ genauen Temperatur Moduls, dass als USB HID Gerät sehr leicht an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Als weiterer Punkt soll das USB HID Gerät explizit mit Windows 7 x64 Systeme zu betreiben sein und die Anwendungssoftware soll mit c# erstellt werden.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung besteht, wie aus dem Schaltplan ersichtlich ist, nur aus wenigen Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ &#039;&#039;&#039;Atmel Tiny85-20&#039;&#039;&#039; ist. Als Temperatursensor wird ein &#039;&#039;&#039;Dallas DS18B20&#039;&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mit der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet harmoniert.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt der Schutzwiderstände (R1 und R3). Die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig ist der Mikrocontroller aber schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 kann auch ein Dallas DS18S20 oder ein Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|900px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit der V-USB Software realisiert und hat einen speziell für dieses Gerät definierten HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware, welche USB Endpoints es gibt und wie mit ihnen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier ReportIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln den während des letzten Messzyklus ermittelten und zwischengespeicherten Wert des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature Report IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! ReportID || Aktion || Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein kompletter Messzyklus wird mit Hilfe einer State Maschine alle 10s durchlaufen. Die State Maschine läuft dabei unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Temperatur Sensor Zeit sich zu erholen, um nicht durch zu häufige Abfragen sich selbst zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Die USB Kommunikation dagegen ist zeitlich völlig frei darin wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert die eigenen HID System Treiber automatisch beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Kern der Software ist dabei die usbGenericHIDDevice Library aus [9] die die Windows HID API Funktionen in einer leicht nutzbaren Weise kapseln und zur eigenen Verwendung bereitstellen.&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von der Basisklasse &#039;&#039;&#039;usbGenericHidCommunication&#039;&#039;&#039; wird eine eigene USB Device Klasse erstellt, die das reale Gerät widerspiegelt und fertig implementiert alle seine möglichen Eigenschaften in Service Methoden abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die zentrale Klasse &#039;usbDevice&#039; für das HiDTemp Gerät sieht so aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Werten &#039;&#039;&#039;VID = 0x16c0&#039;&#039;&#039; für die Vendor ID und &#039;&#039;&#039;PID = 0x05df&#039;&#039;&#039; für die Produkt ID abgefragt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass kein anderer Hardware Hersteller und seine USB Geräte davon beeinträchtigt wird.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur für den DS18B20 Sensors kann im Bereich von -55°C bis +125°C liegen. Der Temperatur Wert wird dabei als Vorzeichen behaftete ganze Zahl im Bereich von -550000 bis 1250000 abgebildet.&lt;br /&gt;
&lt;br /&gt;
Ein Temperaturwert wird in 4 Byte gespeichert und übertragen. Auf dem Zielsystem muss dieser Wert dann nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat gemäß Datenblatt eine Grundgenauigkeit von +/- 0,5°C. Die Auflösung für einen DS18B20 ist dabei 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung und die Software für das HiDTemp Gerät arbeitet auf meinem Windows 7 x64 Systemen schon länger stabil und ohne Probleme. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr sicher und problemlos  nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen. Aus diesem Grund stelle ich meine eigenen Sources auch unter die [http://www.gnu.org/licenses/gpl.html GNU General Public License (GPL)].&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* [1] [http://de.wikipedia.org/wiki/Human_Interface_Device Def. Human Interface Device]&lt;br /&gt;
* [2] [http://www.usb.org/developers/hidpage/ HID Information]&lt;br /&gt;
* [3] [http://www.obdev.at/products/vusb/index-de.html V-USB]&lt;br /&gt;
* [4] [http://de.wikipedia.org/wiki/Universal_Serial_Bus Universal Serial Bus]&lt;br /&gt;
* [5] [http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf DS18B20 Programmable Resolution 1-Wire Digital Thermometer]&lt;br /&gt;
* [6] [http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html DS18X20 with AVR]&lt;br /&gt;
* [7] [http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm USB-Deskriptoren]&lt;br /&gt;
* [8] [http://www.microsoft.com/germany/express/products/windows.aspx Visual Studio 2010 Express]&lt;br /&gt;
* [9] [http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows Open Source Framework for USB Generic HID devices]&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:USB]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=71368</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=71368"/>
		<updated>2013-01-29T11:56:56Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Einleitung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im Laufe der Jahre durch die Unterstützung seitens der Hersteller von Mikrocontrollern und der OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die System Treiber für die Ansteuerung der USB Geräte bei einem Windows System, stellen nach wie vor eine deutliche Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Möchte man nicht den Weg einer RS-232/USB Kommunikation gehen, bietet sich eine Klasse von Geräten an, die bei Hobby Projekten bisher nicht sehr oft betrachtet wurde nämlich die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
In der Regel denken Benutzer bei Thema HID Geräten, sofort eine PC-Maus und eine Tastatur aber der USB Standard sieht in seiner Definition auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Projektes ist die Konstruktion eines kleinen und relativ genauen Temperatur Moduls, dass als USB HID Gerät sehr leicht an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Als weiterer Punkt soll das USB HID Gerät explizit mit Windows 7 x64 Systeme zu betreiben sein und die Anwendungssoftware soll mit c# erstellt werden.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung besteht, wie aus dem Schaltplan ersichtlich ist, nur aus wenigen Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ &#039;&#039;&#039;Atmel Tiny85-20&#039;&#039;&#039; ist. Als Temperatursensor wird ein &#039;&#039;&#039;Dallas DS18B20&#039;&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mit der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet harmoniert.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt der Schutzwiderstände (R1 und R3). Die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig ist der Mikrocontroller aber schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 kann auch ein Dallas DS18S20 oder ein Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|900px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit der V-USB Software realisiert und hat einen speziell für dieses Gerät definierten HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware, welche USB Endpoints es gibt und wie mit ihnen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier ReportIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln den während des letzten Messzyklus ermittelten und zwischengespeicherten Wert des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature Report IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! ReportID || Aktion || Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein kompletter Messzyklus wird mit Hilfe einer State Maschine alle 10s durchlaufen. Die State Maschine läuft dabei unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Temperatur Sensor Zeit sich zu erholen, um nicht durch zu häufige Abfragen sich selbst zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Die USB Kommunikation dagegen ist zeitlich völlig frei darin wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert die eigenen HID System Treiber automatisch beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Kern der Software ist dabei die usbGenericHIDDevice Library aus [9] die die Windows HID API Funktionen in einer leicht nutzbaren Weise kapseln und zur eigenen Verwendung bereitstellen.&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von der Basisklasse &#039;&#039;&#039;usbGenericHidCommunication&#039;&#039;&#039; wird eine eigene USB Device Klasse erstellt, die das reale Gerät widerspiegelt und fertig implementiert alle seine möglichen Eigenschaften in Service Methoden abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die zentrale Klasse &#039;usbDevice&#039; für das HiDTemp Gerät sieht so aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Werten &#039;&#039;&#039;VID = 0x16c0&#039;&#039;&#039; für die Vendor ID und &#039;&#039;&#039;PID = 0x05df&#039;&#039;&#039; für die Produkt ID abgefragt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass kein anderer Hardware Hersteller und seine USB Geräte davon beeinträchtigt wird.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur für den DS18B20 Sensors kann im Bereich von -55°C bis +125°C liegen. Der Temperatur Wert wird dabei als Vorzeichen behaftete ganze Zahl im Bereich von -550000 bis 1250000 abgebildet.&lt;br /&gt;
&lt;br /&gt;
Ein Temperaturwert wird in 4 Byte gespeichert und übertragen. Auf dem Zielsystem muss dieser Wert dann nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat gemäß Datenblatt eine Grundgenauigkeit von +/- 0,5°C. Die Auflösung für einen DS18B20 ist dabei 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung und die Software für das HiDTemp Gerät arbeitet auf meinem Windows 7 x64 Systemen schon länger stabil und ohne Probleme. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr sicher und problemlos  nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen. Aus diesem Grund stelle ich meine eigenen Sources auch unter die [http://www.gnu.org/licenses/gpl.html GNU General Public License (GPL)].&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* [1] [http://de.wikipedia.org/wiki/Human_Interface_Device Def. Human Interface Device]&lt;br /&gt;
* [2] [http://www.usb.org/developers/hidpage/ HID Information]&lt;br /&gt;
* [3] [http://www.obdev.at/products/vusb/index-de.html V-USB]&lt;br /&gt;
* [4] [http://de.wikipedia.org/wiki/Universal_Serial_Bus Universal Serial Bus]&lt;br /&gt;
* [5] [http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf DS18B20 Programmable Resolution 1-Wire Digital Thermometer]&lt;br /&gt;
* [6] [http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html DS18X20 with AVR]&lt;br /&gt;
* [7] [http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm USB-Deskriptoren]&lt;br /&gt;
* [8] [http://www.microsoft.com/germany/express/products/windows.aspx Visual Studio 2010 Express]&lt;br /&gt;
* [9] [http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows Open Source Framework for USB Generic HID devices]&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:USB]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=71269</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=71269"/>
		<updated>2013-01-27T08:26:07Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Firmware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im Laufe der Jahre durch die Unterstützung seitens der Hersteller von Mikrocontrollern und der OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die System Treiber für die Ansteuerung der USB Geräte bei einem typischen Windows System, stellen nach wie vor eine deutliche Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Möchte man nicht den Weg einer RS-232/USB Kommunikation gehen, bietet sich eine Klasse von Geräten an, die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde nämlich die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Projektes ist die Konstruktion eines kleinen und relativ genauen Temperatur Moduls, dass als USB HID Gerät sehr leicht an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Als weiterer Punkt soll das USB HID Gerät explizit mit Windows 7 x64 Systeme zu betreiben sein und die Anwendungssoftware soll mit c# erstellt werden.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung besteht, wie aus dem Schaltplan ersichtlich ist, nur aus wenigen Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ &#039;&#039;&#039;Atmel Tiny85-20&#039;&#039;&#039; ist. Als Temperatursensor wird ein &#039;&#039;&#039;Dallas DS18B20&#039;&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mit der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet harmoniert.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt der Schutzwiderstände (R1 und R3). Die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig ist der Mikrocontroller aber schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 kann auch ein Dallas DS18S20 oder ein Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|900px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit der V-USB Software realisiert und hat einen speziell für dieses Gerät definierten HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware, welche USB Endpoints es gibt und wie mit ihnen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier ReportIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln den während des letzten Messzyklus ermittelten und zwischengespeicherten Wert des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature Report IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! ReportID || Aktion || Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein kompletter Messzyklus wird mit Hilfe einer State Maschine alle 10s durchlaufen. Die State Maschine läuft dabei unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Temperatur Sensor Zeit sich zu erholen, um nicht durch zu häufige Abfragen sich selbst zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Die USB Kommunikation dagegen ist zeitlich völlig frei darin wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert die eigenen HID System Treiber automatisch beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Kern der Software ist dabei die usbGenericHIDDevice Library aus [9] die die Windows HID API Funktionen in einer leicht nutzbaren Weise kapseln und zur eigenen Verwendung bereitstellen.&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von der Basisklasse &#039;&#039;&#039;usbGenericHidCommunication&#039;&#039;&#039; wird eine eigene USB Device Klasse erstellt, die das reale Gerät widerspiegelt und fertig implementiert alle seine möglichen Eigenschaften in Service Methoden abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die zentrale Klasse &#039;usbDevice&#039; für das HiDTemp Gerät sieht so aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Werten &#039;&#039;&#039;VID = 0x16c0&#039;&#039;&#039; für die Vendor ID und &#039;&#039;&#039;PID = 0x05df&#039;&#039;&#039; für die Produkt ID abgefragt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass kein anderer Hardware Hersteller und seine USB Geräte davon beeinträchtigt wird.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur für den DS18B20 Sensors kann im Bereich von -55°C bis +125°C liegen. Der Temperatur Wert wird dabei als Vorzeichen behaftete ganze Zahl im Bereich von -550000 bis 1250000 abgebildet.&lt;br /&gt;
&lt;br /&gt;
Ein Temperaturwert wird in 4 Byte gespeichert und übertragen. Auf dem Zielsystem muss dieser Wert dann nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat gemäß Datenblatt eine Grundgenauigkeit von +/- 0,5°C. Die Auflösung für einen DS18B20 ist dabei 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung und die Software für das HiDTemp Gerät arbeitet auf meinem Windows 7 x64 Systemen schon länger stabil und ohne Probleme. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr sicher und problemlos  nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen. Aus diesem Grund stelle ich meine eigenen Sources auch unter die [http://www.gnu.org/licenses/gpl.html GNU General Public License (GPL)].&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* [1] [http://de.wikipedia.org/wiki/Human_Interface_Device Def. Human Interface Device]&lt;br /&gt;
* [2] [http://www.usb.org/developers/hidpage/ HID Information]&lt;br /&gt;
* [3] [http://www.obdev.at/products/vusb/index-de.html V-USB]&lt;br /&gt;
* [4] [http://de.wikipedia.org/wiki/Universal_Serial_Bus Universal Serial Bus]&lt;br /&gt;
* [5] [http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf DS18B20 Programmable Resolution 1-Wire Digital Thermometer]&lt;br /&gt;
* [6] [http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html DS18X20 with AVR]&lt;br /&gt;
* [7] [http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm USB-Deskriptoren]&lt;br /&gt;
* [8] [http://www.microsoft.com/germany/express/products/windows.aspx Visual Studio 2010 Express]&lt;br /&gt;
* [9] [http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows Open Source Framework for USB Generic HID devices]&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:USB]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=71268</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=71268"/>
		<updated>2013-01-27T08:24:43Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Schaltung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im Laufe der Jahre durch die Unterstützung seitens der Hersteller von Mikrocontrollern und der OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die System Treiber für die Ansteuerung der USB Geräte bei einem typischen Windows System, stellen nach wie vor eine deutliche Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Möchte man nicht den Weg einer RS-232/USB Kommunikation gehen, bietet sich eine Klasse von Geräten an, die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde nämlich die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Projektes ist die Konstruktion eines kleinen und relativ genauen Temperatur Moduls, dass als USB HID Gerät sehr leicht an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Als weiterer Punkt soll das USB HID Gerät explizit mit Windows 7 x64 Systeme zu betreiben sein und die Anwendungssoftware soll mit c# erstellt werden.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung besteht, wie aus dem Schaltplan ersichtlich ist, nur aus wenigen Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ &#039;&#039;&#039;Atmel Tiny85-20&#039;&#039;&#039; ist. Als Temperatursensor wird ein &#039;&#039;&#039;Dallas DS18B20&#039;&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mit der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet harmoniert.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt der Schutzwiderstände (R1 und R3). Die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig ist der Mikrocontroller aber schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 kann auch ein Dallas DS18S20 oder ein Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|900px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit der V-USB Software realisiert und hat einen speziell für dieses Gerät definierten HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware, welche USB Endpoints es gibt und wie mit ihnen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier ReportIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln den während des letzten Messzyklus ermittelten und zwischengespeicherten Wert des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! ReportID || Aktion || Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein kompletter Messzyklus wird mit Hilfe einer State Maschine alle 10s durchlaufen. Die State Maschine läuft dabei unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Temperatur Sensor Zeit sich zu erholen, um nicht durch zu häufige Abfragen sich selbst zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Die USB Kommunikation dagegen ist zeitlich völlig frei darin wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert die eigenen HID System Treiber automatisch beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Kern der Software ist dabei die usbGenericHIDDevice Library aus [9] die die Windows HID API Funktionen in einer leicht nutzbaren Weise kapseln und zur eigenen Verwendung bereitstellen.&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von der Basisklasse &#039;&#039;&#039;usbGenericHidCommunication&#039;&#039;&#039; wird eine eigene USB Device Klasse erstellt, die das reale Gerät widerspiegelt und fertig implementiert alle seine möglichen Eigenschaften in Service Methoden abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die zentrale Klasse &#039;usbDevice&#039; für das HiDTemp Gerät sieht so aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Werten &#039;&#039;&#039;VID = 0x16c0&#039;&#039;&#039; für die Vendor ID und &#039;&#039;&#039;PID = 0x05df&#039;&#039;&#039; für die Produkt ID abgefragt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass kein anderer Hardware Hersteller und seine USB Geräte davon beeinträchtigt wird.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur für den DS18B20 Sensors kann im Bereich von -55°C bis +125°C liegen. Der Temperatur Wert wird dabei als Vorzeichen behaftete ganze Zahl im Bereich von -550000 bis 1250000 abgebildet.&lt;br /&gt;
&lt;br /&gt;
Ein Temperaturwert wird in 4 Byte gespeichert und übertragen. Auf dem Zielsystem muss dieser Wert dann nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat gemäß Datenblatt eine Grundgenauigkeit von +/- 0,5°C. Die Auflösung für einen DS18B20 ist dabei 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung und die Software für das HiDTemp Gerät arbeitet auf meinem Windows 7 x64 Systemen schon länger stabil und ohne Probleme. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr sicher und problemlos  nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen. Aus diesem Grund stelle ich meine eigenen Sources auch unter die [http://www.gnu.org/licenses/gpl.html GNU General Public License (GPL)].&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* [1] [http://de.wikipedia.org/wiki/Human_Interface_Device Def. Human Interface Device]&lt;br /&gt;
* [2] [http://www.usb.org/developers/hidpage/ HID Information]&lt;br /&gt;
* [3] [http://www.obdev.at/products/vusb/index-de.html V-USB]&lt;br /&gt;
* [4] [http://de.wikipedia.org/wiki/Universal_Serial_Bus Universal Serial Bus]&lt;br /&gt;
* [5] [http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf DS18B20 Programmable Resolution 1-Wire Digital Thermometer]&lt;br /&gt;
* [6] [http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html DS18X20 with AVR]&lt;br /&gt;
* [7] [http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm USB-Deskriptoren]&lt;br /&gt;
* [8] [http://www.microsoft.com/germany/express/products/windows.aspx Visual Studio 2010 Express]&lt;br /&gt;
* [9] [http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows Open Source Framework for USB Generic HID devices]&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:USB]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=71225</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=71225"/>
		<updated>2013-01-25T16:19:12Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Einleitung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im Laufe der Jahre durch die Unterstützung seitens der Hersteller von Mikrocontrollern und der OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die System Treiber für die Ansteuerung der USB Geräte bei einem typischen Windows System, stellen nach wie vor eine deutliche Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Möchte man nicht den Weg einer RS-232/USB Kommunikation gehen, bietet sich eine Klasse von Geräten an, die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde nämlich die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Projektes ist die Konstruktion eines kleinen und relativ genauen Temperatur Moduls, dass als USB HID Gerät sehr leicht an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Als weiterer Punkt soll das USB HID Gerät explizit mit Windows 7 x64 Systeme zu betreiben sein und die Anwendungssoftware soll mit c# erstellt werden.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung besteht, wie aus dem Schaltplan ersichtlich ist, nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ &#039;&#039;&#039;Atmel Tiny85-20&#039;&#039;&#039; ist. Als Temperatursensor wird ein &#039;&#039;&#039;Dallas DS18B20&#039;&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mit der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet harmoniert.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt der Schutzwiderstände (R1 und R3). Die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig ist der Mikrocontroller aber schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 kann auch ein Dallas DS18S20 oder ein Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|900px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit der V-USB Software realisiert und hat einen speziell für dieses Gerät definierten HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware, welche USB Endpoints es gibt und wie mit ihnen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier ReportIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln den während des letzten Messzyklus ermittelten und zwischengespeicherten Wert des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! ReportID || Aktion || Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein kompletter Messzyklus wird mit Hilfe einer State Maschine alle 10s durchlaufen. Die State Maschine läuft dabei unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Temperatur Sensor Zeit sich zu erholen, um nicht durch zu häufige Abfragen sich selbst zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Die USB Kommunikation dagegen ist zeitlich völlig frei darin wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert die eigenen HID System Treiber automatisch beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Kern der Software ist dabei die usbGenericHIDDevice Library aus [9] die die Windows HID API Funktionen in einer leicht nutzbaren Weise kapseln und zur eigenen Verwendung bereitstellen.&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von der Basisklasse &#039;&#039;&#039;usbGenericHidCommunication&#039;&#039;&#039; wird eine eigene USB Device Klasse erstellt, die das reale Gerät widerspiegelt und fertig implementiert alle seine möglichen Eigenschaften in Service Methoden abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die zentrale Klasse &#039;usbDevice&#039; für das HiDTemp Gerät sieht so aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Werten &#039;&#039;&#039;VID = 0x16c0&#039;&#039;&#039; für die Vendor ID und &#039;&#039;&#039;PID = 0x05df&#039;&#039;&#039; für die Produkt ID abgefragt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass kein anderer Hardware Hersteller und seine USB Geräte davon beeinträchtigt wird.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur für den DS18B20 Sensors kann im Bereich von -55°C bis +125°C liegen. Der Temperatur Wert wird dabei als Vorzeichen behaftete ganze Zahl im Bereich von -550000 bis 1250000 abgebildet.&lt;br /&gt;
&lt;br /&gt;
Ein Temperaturwert wird in 4 Byte gespeichert und übertragen. Auf dem Zielsystem muss dieser Wert dann nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat gemäß Datenblatt eine Grundgenauigkeit von +/- 0,5°C. Die Auflösung für einen DS18B20 ist dabei 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung und die Software für das HiDTemp Gerät arbeitet auf meinem Windows 7 x64 Systemen schon länger stabil und ohne Probleme. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr sicher und problemlos  nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen. Aus diesem Grund stelle ich meine eigenen Sources auch unter die [http://www.gnu.org/licenses/gpl.html GNU General Public License (GPL)].&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* [1] [http://de.wikipedia.org/wiki/Human_Interface_Device Def. Human Interface Device]&lt;br /&gt;
* [2] [http://www.usb.org/developers/hidpage/ HID Information]&lt;br /&gt;
* [3] [http://www.obdev.at/products/vusb/index-de.html V-USB]&lt;br /&gt;
* [4] [http://de.wikipedia.org/wiki/Universal_Serial_Bus Universal Serial Bus]&lt;br /&gt;
* [5] [http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf DS18B20 Programmable Resolution 1-Wire Digital Thermometer]&lt;br /&gt;
* [6] [http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html DS18X20 with AVR]&lt;br /&gt;
* [7] [http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm USB-Deskriptoren]&lt;br /&gt;
* [8] [http://www.microsoft.com/germany/express/products/windows.aspx Visual Studio 2010 Express]&lt;br /&gt;
* [9] [http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows Open Source Framework for USB Generic HID devices]&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:USB]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=71194</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=71194"/>
		<updated>2013-01-23T15:04:31Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Anwendung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Projektes ist die Konstruktion eines kleinen und relativ genauen Temperatur Moduls, dass als USB HID Gerät sehr leicht an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Als weiterer Punkt soll das USB HID Gerät explizit mit Windows 7 x64 Systeme zu betreiben sein und die Anwendungssoftware soll mit c# erstellt werden.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung besteht, wie aus dem Schaltplan ersichtlich ist, nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ &#039;&#039;&#039;Atmel Tiny85-20&#039;&#039;&#039; ist. Als Temperatursensor wird ein &#039;&#039;&#039;Dallas DS18B20&#039;&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mit der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet harmoniert.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt der Schutzwiderstände (R1 und R3). Die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig ist der Mikrocontroller aber schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 kann auch ein Dallas DS18S20 oder ein Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|900px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit der V-USB Software realisiert und hat einen speziell für dieses Gerät definierten HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware, welche USB Endpoints es gibt und wie mit ihnen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier ReportIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln den während des letzten Messzyklus ermittelten und zwischengespeicherten Wert des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! ReportID || Aktion || Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein kompletter Messzyklus wird mit Hilfe einer State Maschine alle 10s durchlaufen. Die State Maschine läuft dabei unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Temperatur Sensor Zeit sich zu erholen, um nicht durch zu häufige Abfragen sich selbst zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Die USB Kommunikation dagegen ist zeitlich völlig frei darin wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert die eigenen HID System Treiber automatisch beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Kern der Software ist dabei die usbGenericHIDDevice Library aus [9] die die Windows HID API Funktionen in einer leicht nutzbaren Weise kapseln und zur eigenen Verwendung bereitstellen.&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von der Basisklasse &#039;&#039;&#039;usbGenericHidCommunication&#039;&#039;&#039; wird eine eigene USB Device Klasse erstellt, die das reale Gerät widerspiegelt und fertig implementiert alle seine möglichen Eigenschaften in Service Methoden abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die zentrale Klasse &#039;usbDevice&#039; für das HiDTemp Gerät sieht so aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Werten &#039;&#039;&#039;VID = 0x16c0&#039;&#039;&#039; für die Vendor ID und &#039;&#039;&#039;PID = 0x05df&#039;&#039;&#039; für die Produkt ID abgefragt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass kein anderer Hardware Hersteller und seine USB Geräte davon beeinträchtigt wird.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur für den DS18B20 Sensors kann im Bereich von -55°C bis +125°C liegen. Der Temperatur Wert wird dabei als Vorzeichen behaftete ganze Zahl im Bereich von -550000 bis 1250000 abgebildet.&lt;br /&gt;
&lt;br /&gt;
Ein Temperaturwert wird in 4 Byte gespeichert und übertragen. Auf dem Zielsystem muss dieser Wert dann nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat gemäß Datenblatt eine Grundgenauigkeit von +/- 0,5°C. Die Auflösung für einen DS18B20 ist dabei 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung und die Software für das HiDTemp Gerät arbeitet auf meinem Windows 7 x64 Systemen schon länger stabil und ohne Probleme. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr sicher und problemlos  nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen. Aus diesem Grund stelle ich meine eigenen Sources auch unter die [http://www.gnu.org/licenses/gpl.html GNU General Public License (GPL)].&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* [1] [http://de.wikipedia.org/wiki/Human_Interface_Device Def. Human Interface Device]&lt;br /&gt;
* [2] [http://www.usb.org/developers/hidpage/ HID Information]&lt;br /&gt;
* [3] [http://www.obdev.at/products/vusb/index-de.html V-USB]&lt;br /&gt;
* [4] [http://de.wikipedia.org/wiki/Universal_Serial_Bus Universal Serial Bus]&lt;br /&gt;
* [5] [http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf DS18B20 Programmable Resolution 1-Wire Digital Thermometer]&lt;br /&gt;
* [6] [http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html DS18X20 with AVR]&lt;br /&gt;
* [7] [http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm USB-Deskriptoren]&lt;br /&gt;
* [8] [http://www.microsoft.com/germany/express/products/windows.aspx Visual Studio 2010 Express]&lt;br /&gt;
* [9] [http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows Open Source Framework for USB Generic HID devices]&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:USB]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=71027</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=71027"/>
		<updated>2013-01-18T12:04:14Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Fazit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Projektes ist die Konstruktion eines kleinen und relativ genauen Temperatur Moduls, dass als USB HID Gerät sehr leicht an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Als weiterer Punkt soll das USB HID Gerät explizit mit Windows 7 x64 Systeme zu betreiben sein und die Anwendungssoftware soll mit c# erstellt werden.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung besteht, wie aus dem Schaltplan ersichtlich ist, nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ &#039;&#039;&#039;Atmel Tiny85-20&#039;&#039;&#039; ist. Als Temperatursensor wird ein &#039;&#039;&#039;Dallas DS18B20&#039;&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mit der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet harmoniert.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt der Schutzwiderstände (R1 und R3). Die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig ist der Mikrocontroller aber schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 kann auch ein Dallas DS18S20 oder ein Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|900px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit der V-USB Software realisiert und hat einen speziell für dieses Gerät definierten HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware, welche USB Endpoints es gibt und wie mit ihnen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier ReportIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln den während des letzten Messzyklus ermittelten und zwischengespeicherten Wert des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! ReportID || Aktion || Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein kompletter Messzyklus wird mit Hilfe einer State Maschine alle 10s durchlaufen. Die State Maschine läuft dabei unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Temperatur Sensor Zeit sich zu erholen, um nicht durch zu häufige Abfragen sich selbst zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Die USB Kommunikation dagegen ist zeitlich völlig frei darin wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert die eigenen HID System Treiber automatisch beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Kern der Software ist dabei die usbGenericHIDDevice Library aus [9] die die Windows HID API Funktionen in einer leicht nutzbaren Weise kapseln und zur eigenen Verwendung bereitstellen.&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von der Basisklasse &#039;&#039;&#039;usbGenericHidCommunication&#039;&#039;&#039; wird eine eigene USB Device Klasse erstellt, die das realen Gerät widerspiegelt und fertig implementiert alle seine möglichen Eigenschaften in Service Methoden abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die zentrale Klasse &#039;usbDevice&#039; für das HiDTemp Gerät sieht so aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Werten &#039;&#039;&#039;VID = 0x16c0&#039;&#039;&#039; für die Vendor ID und &#039;&#039;&#039;PID = 0x05df&#039;&#039;&#039; für die Produkt ID abgefragt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass kein anderer Hardware Hersteller und seine USB Geräte davon beeinträchtigt wird.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur für den DS18B20 Sensors kann im Bereich von -55°C bis +125°C liegen. Der Temperatur Wert wird dabei als Vorzeichen behaftete ganze Zahl im Bereich von -550000 bis 1250000 abgebildet.&lt;br /&gt;
&lt;br /&gt;
Ein Temperaturwert wird in 4 Byte gespeichert und übertragen. Auf dem Zielsystem muss dieser Wert dann nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat gemäß Datenblatt eine Grundgenauigkeit von +/- 0,5°C. Die Auflösung für einen DS18B20 ist dabei 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung und die Software für das HiDTemp Gerät arbeitet auf meinem Windows 7 x64 Systemen schon länger stabil und ohne Probleme. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr sicher und problemlos  nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen. Aus diesem Grund stelle ich meine eigenen Sources auch unter die [http://www.gnu.org/licenses/gpl.html GNU General Public License (GPL)].&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* [1] [http://de.wikipedia.org/wiki/Human_Interface_Device Def. Human Interface Device]&lt;br /&gt;
* [2] [http://www.usb.org/developers/hidpage/ HID Information]&lt;br /&gt;
* [3] [http://www.obdev.at/products/vusb/index-de.html V-USB]&lt;br /&gt;
* [4] [http://de.wikipedia.org/wiki/Universal_Serial_Bus Universal Serial Bus]&lt;br /&gt;
* [5] [http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf DS18B20 Programmable Resolution 1-Wire Digital Thermometer]&lt;br /&gt;
* [6] [http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html DS18X20 with AVR]&lt;br /&gt;
* [7] [http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm USB-Deskriptoren]&lt;br /&gt;
* [8] [http://www.microsoft.com/germany/express/products/windows.aspx Visual Studio 2010 Express]&lt;br /&gt;
* [9] [http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows Open Source Framework for USB Generic HID devices]&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:USB]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70839</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70839"/>
		<updated>2013-01-13T12:56:47Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Anwendung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Projektes ist die Konstruktion eines kleinen und relativ genauen Temperatur Moduls, dass als USB HID Gerät sehr leicht an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Als weiterer Punkt soll das USB HID Gerät explizit mit Windows 7 x64 Systeme zu betreiben sein und die Anwendungssoftware soll mit c# erstellt werden.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung besteht, wie aus dem Schaltplan ersichtlich ist, nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ &#039;&#039;&#039;Atmel Tiny85-20&#039;&#039;&#039; ist. Als Temperatursensor wird ein &#039;&#039;&#039;Dallas DS18B20&#039;&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mit der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet harmoniert.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt der Schutzwiderstände (R1 und R3). Die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig ist der Mikrocontroller aber schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 kann auch ein Dallas DS18S20 oder ein Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|900px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit der V-USB Software realisiert und hat einen speziell für dieses Gerät definierten HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware, welche USB Endpoints es gibt und wie mit ihnen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier ReportIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln den während des letzten Messzyklus ermittelten und zwischengespeicherten Wert des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! ReportID || Aktion || Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein kompletter Messzyklus wird mit Hilfe einer State Maschine alle 10s durchlaufen. Die State Maschine läuft dabei unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Temperatur Sensor Zeit sich zu erholen, um nicht durch zu häufige Abfragen sich selbst zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Die USB Kommunikation dagegen ist zeitlich völlig frei darin wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert die eigenen HID System Treiber automatisch beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Kern der Software ist dabei die usbGenericHIDDevice Library aus [9] die die Windows HID API Funktionen in einer leicht nutzbaren Weise kapseln und zur eigenen Verwendung bereitstellen.&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von der Basisklasse &#039;&#039;&#039;usbGenericHidCommunication&#039;&#039;&#039; wird eine eigene USB Device Klasse erstellt, die das realen Gerät widerspiegelt und fertig implementiert alle seine möglichen Eigenschaften in Service Methoden abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die zentrale Klasse &#039;usbDevice&#039; für das HiDTemp Gerät sieht so aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Werten &#039;&#039;&#039;VID = 0x16c0&#039;&#039;&#039; für die Vendor ID und &#039;&#039;&#039;PID = 0x05df&#039;&#039;&#039; für die Produkt ID abgefragt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass kein anderer Hardware Hersteller und seine USB Geräte davon beeinträchtigt wird.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur für den DS18B20 Sensors kann im Bereich von -55°C bis +125°C liegen. Der Temperatur Wert wird dabei als Vorzeichen behaftete ganze Zahl im Bereich von -550000 bis 1250000 abgebildet.&lt;br /&gt;
&lt;br /&gt;
Ein Temperaturwert wird in 4 Byte gespeichert und übertragen. Auf dem Zielsystem muss dieser Wert dann nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat gemäß Datenblatt eine Grundgenauigkeit von +/- 0,5°C. Die Auflösung für einen DS18B20 ist dabei 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung und die Software für das HiDTemp Gerät arbeitet auf meinem Windows 7 x64 Systemen schon länger stabil und ohne Probleme. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr sicher und problemlos  nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen. Aus diesem Grund stelle ich meine eigenen Sources auch unter die GPL V3 Lizenz.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* [1] [http://de.wikipedia.org/wiki/Human_Interface_Device Def. Human Interface Device]&lt;br /&gt;
* [2] [http://www.usb.org/developers/hidpage/ HID Information]&lt;br /&gt;
* [3] [http://www.obdev.at/products/vusb/index-de.html V-USB]&lt;br /&gt;
* [4] [http://de.wikipedia.org/wiki/Universal_Serial_Bus Universal Serial Bus]&lt;br /&gt;
* [5] [http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf DS18B20 Programmable Resolution 1-Wire Digital Thermometer]&lt;br /&gt;
* [6] [http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html DS18X20 with AVR]&lt;br /&gt;
* [7] [http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm USB-Deskriptoren]&lt;br /&gt;
* [8] [http://www.microsoft.com/germany/express/products/windows.aspx Visual Studio 2010 Express]&lt;br /&gt;
* [9] [http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows Open Source Framework for USB Generic HID devices]&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:USB]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70818</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70818"/>
		<updated>2013-01-12T11:57:21Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Downloads */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Projektes ist die Konstruktion eines kleinen und relativ genauen Temperatur Moduls, dass als USB HID Gerät sehr leicht an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Als weiterer Punkt soll das USB HID Gerät explizit mit Windows 7 x64 Systeme zu betreiben sein und die Anwendungssoftware soll mit c# erstellt werden.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung besteht, wie aus dem Schaltplan ersichtlich ist, nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ &#039;&#039;&#039;Atmel Tiny85-20&#039;&#039;&#039; ist. Als Temperatursensor wird ein &#039;&#039;&#039;Dallas DS18B20&#039;&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mit der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet harmoniert.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt der Schutzwiderstände (R1 und R3). Die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig ist der Mikrocontroller aber schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 kann auch ein Dallas DS18S20 oder ein Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|900px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit der V-USB Software realisiert und hat einen speziell für dieses Gerät definierten HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware, welche USB Endpoints es gibt und wie mit ihnen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier ReportIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln den während des letzten Messzyklus ermittelten und zwischengespeicherten Wert des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! ReportID || Aktion || Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein kompletter Messzyklus wird mit Hilfe einer State Maschine alle 10s durchlaufen. Die State Maschine läuft dabei unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Temperatur Sensor Zeit sich zu erholen, um nicht durch zu häufige Abfragen sich selbst zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Die USB Kommunikation dagegen ist zeitlich völlig frei darin wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert die eigenen HID System Treiber automatisch beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Kern der Software ist dabei die usbGenericHIDDevice Library aus [9] die die Windows HID API Funktionen in einer leicht nutzbaren Weise kapseln und zur eigenen Verwendung bereitstellen.&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von der Basisklasse &#039;&#039;&#039;usbGenericHidCommunication&#039;&#039;&#039; wird eine eigene USB Device Klasse erstellt, die das realen Gerät widerspiegelt und fertig implementiert alle seine möglichen Eigenschaften in Service Methoden abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die zentrale Klasse &#039;usbDevice&#039; für das HiDTemp Gerät sieht so aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Werten &#039;&#039;&#039;VID = 0x16c0&#039;&#039;&#039; für die Vendor ID und &#039;&#039;&#039;PID = 0x05df&#039;&#039;&#039; für die Produkt ID abgefragt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass kein anderer Hardware Hersteller und seine USB Geräte davon beeinträchtigt wird.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur für den DS18B20 Sensors kann im Bereich von -55°C bis +125°C liegen. Der Temperatur Wert wird dabei als Vorzeichen behaftete ganze Zahl im Bereich von -550000 bis 1250000 abgebildet.&lt;br /&gt;
&lt;br /&gt;
Ein Temperaturwert wird in 4 Byte gespeichert und übertragen. Auf dem Zielsystem muss dieser Wert dann nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat gemäß Datenblatt eine Grundgenauigkeit von +/- 0,5°C. Die Auflösung für einem DS18B20 ist dabei 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung und die Software für das HiDTemp Gerät arbeitet auf meinem Windows 7 x64 Systemen schon länger stabil und ohne Probleme. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr sicher und problemlos  nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen. Aus diesem Grund stelle ich meine eigenen Sources auch unter die GPL V3 Lizenz.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* [1] [http://de.wikipedia.org/wiki/Human_Interface_Device Def. Human Interface Device]&lt;br /&gt;
* [2] [http://www.usb.org/developers/hidpage/ HID Information]&lt;br /&gt;
* [3] [http://www.obdev.at/products/vusb/index-de.html V-USB]&lt;br /&gt;
* [4] [http://de.wikipedia.org/wiki/Universal_Serial_Bus Universal Serial Bus]&lt;br /&gt;
* [5] [http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf DS18B20 Programmable Resolution 1-Wire Digital Thermometer]&lt;br /&gt;
* [6] [http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html DS18X20 with AVR]&lt;br /&gt;
* [7] [http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm USB-Deskriptoren]&lt;br /&gt;
* [8] [http://www.microsoft.com/germany/express/products/windows.aspx Visual Studio 2010 Express]&lt;br /&gt;
* [9] [http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows Open Source Framework for USB Generic HID devices]&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:USB]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70810</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70810"/>
		<updated>2013-01-12T09:57:39Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Ziel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Projektes ist die Konstruktion eines kleinen und relativ genauen Temperatur Moduls, dass als USB HID Gerät sehr leicht an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Als weiterer Punkt soll das USB HID Gerät explizit mit Windows 7 x64 Systeme zu betreiben sein und die Anwendungssoftware soll mit c# erstellt werden.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung besteht, wie aus dem Schaltplan ersichtlich ist, nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ &#039;&#039;&#039;Atmel Tiny85-20&#039;&#039;&#039; ist. Als Temperatursensor wird ein &#039;&#039;&#039;Dallas DS18B20&#039;&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mit der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet harmoniert.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt der Schutzwiderstände (R1 und R3). Die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig ist der Mikrocontroller aber schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 kann auch ein Dallas DS18S20 oder ein Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|900px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit der V-USB Software realisiert und hat einen speziell für dieses Gerät definierten HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware, welche USB Endpoints es gibt und wie mit ihnen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier ReportIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln den während des letzten Messzyklus ermittelten und zwischengespeicherten Wert des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! ReportID || Aktion || Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein kompletter Messzyklus wird mit Hilfe einer State Maschine alle 10s durchlaufen. Die State Maschine läuft dabei unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Temperatur Sensor Zeit sich zu erholen, um nicht durch zu häufige Abfragen sich selbst zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Die USB Kommunikation dagegen ist zeitlich völlig frei darin wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert die eigenen HID System Treiber automatisch beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Kern der Software ist dabei die usbGenericHIDDevice Library aus [9] die die Windows HID API Funktionen in einer leicht nutzbaren Weise kapseln und zur eigenen Verwendung bereitstellen.&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von der Basisklasse &#039;&#039;&#039;usbGenericHidCommunication&#039;&#039;&#039; wird eine eigene USB Device Klasse erstellt, die das realen Gerät widerspiegelt und fertig implementiert alle seine möglichen Eigenschaften in Service Methoden abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die zentrale Klasse &#039;usbDevice&#039; für das HiDTemp Gerät sieht so aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Werten &#039;&#039;&#039;VID = 0x16c0&#039;&#039;&#039; für die Vendor ID und &#039;&#039;&#039;PID = 0x05df&#039;&#039;&#039; für die Produkt ID abgefragt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass kein anderer Hardware Hersteller und seine USB Geräte davon beeinträchtigt wird.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur für den DS18B20 Sensors kann im Bereich von -55°C bis +125°C liegen. Der Temperatur Wert wird dabei als Vorzeichen behaftete ganze Zahl im Bereich von -550000 bis 1250000 abgebildet.&lt;br /&gt;
&lt;br /&gt;
Ein Temperaturwert wird in 4 Byte gespeichert und übertragen. Auf dem Zielsystem muss dieser Wert dann nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat gemäß Datenblatt eine Grundgenauigkeit von +/- 0,5°C. Die Auflösung für einem DS18B20 ist dabei 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung und die Software für das HiDTemp Gerät arbeitet auf meinem Windows 7 x64 Systemen schon länger stabil und ohne Probleme. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr sicher und problemlos  nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen. Aus diesem Grund stelle ich meine eigenen Sources auch unter die GPL V3 Lizenz.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* [1] [http://de.wikipedia.org/wiki/Human_Interface_Device Def. Human Interface Device]&lt;br /&gt;
* [2] [http://www.usb.org/developers/hidpage/ HID Information]&lt;br /&gt;
* [3] [http://www.obdev.at/products/vusb/index-de.html V-USB]&lt;br /&gt;
* [4] [http://de.wikipedia.org/wiki/Universal_Serial_Bus Universal Serial Bus]&lt;br /&gt;
* [5] [http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf DS18B20 Programmable Resolution 1-Wire Digital Thermometer]&lt;br /&gt;
* [6] [http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html DS18X20 with AVR]&lt;br /&gt;
* [7] [http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm USB-Deskriptoren]&lt;br /&gt;
* [8] [http://www.microsoft.com/germany/express/products/windows.aspx Visual Studio 2010 Express]&lt;br /&gt;
* [9] [http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows Open Source Framework for USB Generic HID devices]&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Bitte nicht blind die folgenden Kategorien kopieren ;-)&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70568</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70568"/>
		<updated>2013-01-04T13:52:56Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Anwendung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt hat zum Ziel den Bau einen relativ genauen Temperatur Moduls das sehr leicht durch die Verwendung als HID Gerät an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Dazu gehört auch der Wunsch das Gerät explizit mit Windows x64 Systeme zu betreiben und die Anwendungssoftware in c# erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung besteht, wie aus dem Schaltplan ersichtlich ist, nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ &#039;&#039;&#039;Atmel Tiny85-20&#039;&#039;&#039; ist. Als Temperatursensor wird ein &#039;&#039;&#039;Dallas DS18B20&#039;&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mit der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet harmoniert.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt der Schutzwiderstände (R1 und R3). Die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig ist der Mikrocontroller aber schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 kann auch ein Dallas DS18S20 oder ein Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|900px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit der V-USB Software realisiert und hat einen speziell für dieses Gerät definierten HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware, welche USB Endpoints es gibt und wie mit ihnen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier ReportIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln den während des letzten Messzyklus ermittelten und zwischengespeicherten Wert des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! ReportID || Aktion || Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein kompletter Messzyklus wird mit Hilfe einer State Maschine alle 10s durchlaufen. Die State Maschine läuft dabei unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Temperatur Sensor Zeit sich zu erholen, um nicht durch zu häufige Abfragen sich selbst zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Die USB Kommunikation dagegen ist zeitlich völlig frei darin wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert die eigenen HID System Treiber automatisch beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Kern der Software ist dabei die usbGenericHIDDevice Library aus [9] die die Windows HID API Funktionen in einer leicht nutzbaren Weise kapseln und zur eigenen Verwendung bereitstellen.&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von der Basisklasse &#039;&#039;&#039;usbGenericHidCommunication&#039;&#039;&#039; wird eine eigene USB Device Klasse erstellt, die das realen Gerät widerspiegelt und fertig implementiert alle seine möglichen Eigenschaften in Service Methoden abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die zentrale Klasse &#039;usbDevice&#039; für das HiDTemp Gerät sieht so aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Werten &#039;&#039;&#039;VID = 0x16c0&#039;&#039;&#039; für die Vendor ID und &#039;&#039;&#039;PID = 0x05df&#039;&#039;&#039; für die Produkt ID abgefragt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass kein anderer Hardware Hersteller und seine USB Geräte davon beeinträchtigt wird.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur für den DS18B20 Sensors kann im Bereich von -55°C bis +125°C liegen. Der Temperatur Wert wird dabei als Vorzeichen behaftete ganze Zahl im Bereich von -550000 bis 1250000 abgebildet.&lt;br /&gt;
&lt;br /&gt;
Ein Temperaturwert wird in 4 Byte gespeichert und übertragen. Auf dem Zielsystem muss dieser Wert dann nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat gemäß Datenblatt eine Grundgenauigkeit von +/- 0,5°C. Die Auflösung für einem DS18B20 ist dabei 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung und die Software für das HiDTemp Gerät arbeitet auf meinem Windows 7 x64 Systemen schon länger stabil und ohne Probleme. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr sicher und problemlos  nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen. Aus diesem Grund stelle ich meine eigenen Sources auch unter die GPL V3 Lizenz.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* [1] [http://de.wikipedia.org/wiki/Human_Interface_Device Def. Human Interface Device]&lt;br /&gt;
* [2] [http://www.usb.org/developers/hidpage/ HID Information]&lt;br /&gt;
* [3] [http://www.obdev.at/products/vusb/index-de.html V-USB]&lt;br /&gt;
* [4] [http://de.wikipedia.org/wiki/Universal_Serial_Bus Universal Serial Bus]&lt;br /&gt;
* [5] [http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf DS18B20 Programmable Resolution 1-Wire Digital Thermometer]&lt;br /&gt;
* [6] [http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html DS18X20 with AVR]&lt;br /&gt;
* [7] [http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm USB-Deskriptoren]&lt;br /&gt;
* [8] [http://www.microsoft.com/germany/express/products/windows.aspx Visual Studio 2010 Express]&lt;br /&gt;
* [9] [http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows Open Source Framework for USB Generic HID devices]&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Bitte nicht blind die folgenden Kategorien kopieren ;-)&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70489</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70489"/>
		<updated>2013-01-02T14:51:54Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Schaltung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt hat zum Ziel den Bau einen relativ genauen Temperatur Moduls das sehr leicht durch die Verwendung als HID Gerät an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Dazu gehört auch der Wunsch das Gerät explizit mit Windows x64 Systeme zu betreiben und die Anwendungssoftware in c# erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung besteht, wie aus dem Schaltplan ersichtlich ist, nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ &#039;&#039;&#039;Atmel Tiny85-20&#039;&#039;&#039; ist. Als Temperatursensor wird ein &#039;&#039;&#039;Dallas DS18B20&#039;&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mit der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet harmoniert.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt der Schutzwiderstände (R1 und R3). Die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig ist der Mikrocontroller aber schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 kann auch ein Dallas DS18S20 oder ein Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|900px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit der V-USB Software realisiert und hat einen speziell für dieses Gerät definierten HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware, welche USB Endpoints es gibt und wie mit ihnen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier ReportIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln den während des letzten Messzyklus ermittelten und zwischengespeicherten Wert des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! ReportID || Aktion || Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein kompletter Messzyklus wird mit Hilfe einer State Maschine alle 10s durchlaufen. Die State Maschine läuft dabei unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Temperatur Sensor Zeit sich zu erholen, um nicht durch zu häufige Abfragen sich selbst zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Die USB Kommunikation dagegen ist zeitlich völlig frei darin wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert die eigenen HID System Treiber automatisch beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Kern der Software ist dabei die usbGenericHIDDevice Library aus [9] die die Windows HID API Funktionen in einer leicht nutzbaren Weise kapseln und zur eigenen Verwendung bereitstellen.&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von der Basisklasse &#039;&#039;&#039;usbGenericHidCommunication&#039;&#039;&#039; wird eine eigene USB Device Klasse erstellt, die das realen Gerät widerspiegelt und fertig implementiert alle seine möglichen Eigenschaften in Service Methoden abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die zentrale Klasse &#039;usbDevice&#039; für das HiDTemp Gerät sieht so aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Werten &#039;&#039;&#039;VID = 0x16c0&#039;&#039;&#039; für die Vendor ID und &#039;&#039;&#039;PID = 0x05df&#039;&#039;&#039; für die Produkt ID abgefragt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass kein anderer Hardware Hersteller und seine USB Geräte davon beeinträchtigt wird.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur für den DS18B20 Sensors kann im Bereich von -55°C bis +125°C liegen. Der Temperatur Wert wird dabei als Vorzeichen behaftete ganze Zahl im Bereich von -55000 bis 125000 abgebildet.&lt;br /&gt;
&lt;br /&gt;
Ein Temperaturwert wird in 4 Byte gespeichert und übertragen. Auf dem Zielsystem muss dieser Wert dann nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat gemäß Datenblatt eine Grundgenauigkeit von +/- 0,5°C. Die Auflösung für einem DS18B20 ist dabei 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung und die Software für das HiDTemp Gerät arbeitet auf meinem Windows 7 x64 Systemen schon länger stabil und ohne Probleme. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr sicher und problemlos  nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen. Aus diesem Grund stelle ich meine eigenen Sources auch unter die GPL V3 Lizenz.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* [1] [http://de.wikipedia.org/wiki/Human_Interface_Device Def. Human Interface Device]&lt;br /&gt;
* [2] [http://www.usb.org/developers/hidpage/ HID Information]&lt;br /&gt;
* [3] [http://www.obdev.at/products/vusb/index-de.html V-USB]&lt;br /&gt;
* [4] [http://de.wikipedia.org/wiki/Universal_Serial_Bus Universal Serial Bus]&lt;br /&gt;
* [5] [http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf DS18B20 Programmable Resolution 1-Wire Digital Thermometer]&lt;br /&gt;
* [6] [http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html DS18X20 with AVR]&lt;br /&gt;
* [7] [http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm USB-Deskriptoren]&lt;br /&gt;
* [8] [http://www.microsoft.com/germany/express/products/windows.aspx Visual Studio 2010 Express]&lt;br /&gt;
* [9] [http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows Open Source Framework for USB Generic HID devices]&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Bitte nicht blind die folgenden Kategorien kopieren ;-)&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70382</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70382"/>
		<updated>2012-12-29T15:31:27Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Firmware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt hat zum Ziel den Bau einen relativ genauen Temperatur Moduls das sehr leicht durch die Verwendung als HID Gerät an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Dazu gehört auch der Wunsch das Gerät explizit mit Windows x64 Systeme zu betreiben und die Anwendungssoftware in c# erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung besteht, wie aus dem Schaltplan ersichtlich ist, nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ &#039;&#039;&#039;Atmel Tiny85-20&#039;&#039;&#039; ist. Als Temperatursensor wird ein &#039;&#039;&#039;Dallas DS18B20&#039;&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mir der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet passt.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt Schutzwiderstände (R1 und R3) die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig ist der Mikrocontroller aber schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 kann auch ein Dallas DS18S20 oder ein Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|900px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit der V-USB Software realisiert und hat einen speziell für dieses Gerät definierten HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware, welche USB Endpoints es gibt und wie mit ihnen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier ReportIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln den während des letzten Messzyklus ermittelten und zwischengespeicherten Wert des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! ReportID || Aktion || Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen Input/Output 1 Byte Format: x || (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein kompletter Messzyklus wird mit Hilfe einer State Maschine alle 10s durchlaufen. Die State Maschine läuft dabei unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Temperatur Sensor Zeit sich zu erholen, um nicht durch zu häufige Abfragen sich selbst zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Die USB Kommunikation dagegen ist zeitlich völlig frei darin wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert die eigenen HID System Treiber automatisch beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Kern der Software ist dabei die usbGenericHIDDevice Library aus [9] die die Windows HID API Funktionen in einer leicht nutzbaren Weise kapseln und zur eigenen Verwendung bereitstellen.&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von der Basisklasse &#039;&#039;&#039;usbGenericHidCommunication&#039;&#039;&#039; wird eine eigene USB Device Klasse erstellt, die das realen Gerät widerspiegelt und fertig implementiert alle seine möglichen Eigenschaften in Service Methoden abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die zentrale Klasse &#039;usbDevice&#039; für das HiDTemp Gerät sieht so aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Werten &#039;&#039;&#039;VID = 0x16c0&#039;&#039;&#039; für die Vendor ID und &#039;&#039;&#039;PID = 0x05df&#039;&#039;&#039; für die Produkt ID abgefragt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass kein anderer Hardware Hersteller und seine USB Geräte davon beeinträchtigt wird.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur für den DS18B20 Sensors kann im Bereich von -55°C bis +125°C liegen. Der Temperatur Wert wird dabei als Vorzeichen behaftete ganze Zahl im Bereich von -55000 bis 125000 abgebildet.&lt;br /&gt;
&lt;br /&gt;
Ein Temperaturwert wird in 4 Byte gespeichert und übertragen. Auf dem Zielsystem muss dieser Wert dann nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat gemäß Datenblatt eine Grundgenauigkeit von +/- 0,5°C. Die Auflösung für einem DS18B20 ist dabei 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung und die Software für das HiDTemp Gerät arbeitet auf meinem Windows 7 x64 Systemen schon länger stabil und ohne Probleme. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr sicher und problemlos  nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen. Aus diesem Grund stelle ich meine eigenen Sources auch unter die GPL V3 Lizenz.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* [1] [http://de.wikipedia.org/wiki/Human_Interface_Device Def. Human Interface Device]&lt;br /&gt;
* [2] [http://www.usb.org/developers/hidpage/ HID Information]&lt;br /&gt;
* [3] [http://www.obdev.at/products/vusb/index-de.html V-USB]&lt;br /&gt;
* [4] [http://de.wikipedia.org/wiki/Universal_Serial_Bus Universal Serial Bus]&lt;br /&gt;
* [5] [http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf DS18B20 Programmable Resolution 1-Wire Digital Thermometer]&lt;br /&gt;
* [6] [http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html DS18X20 with AVR]&lt;br /&gt;
* [7] [http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm USB-Deskriptoren]&lt;br /&gt;
* [8] [http://www.microsoft.com/germany/express/products/windows.aspx Visual Studio 2010 Express]&lt;br /&gt;
* [9] [http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows Open Source Framework for USB Generic HID devices]&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Bitte nicht blind die folgenden Kategorien kopieren ;-)&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70375</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70375"/>
		<updated>2012-12-29T12:13:49Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Firmware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt hat zum Ziel den Bau einen relativ genauen Temperatur Moduls das sehr leicht durch die Verwendung als HID Gerät an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Dazu gehört auch der Wunsch das Gerät explizit mit Windows x64 Systeme zu betreiben und die Anwendungssoftware in c# erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung besteht, wie aus dem Schaltplan ersichtlich ist, nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ &#039;&#039;&#039;Atmel Tiny85-20&#039;&#039;&#039; ist. Als Temperatursensor wird ein &#039;&#039;&#039;Dallas DS18B20&#039;&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mir der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet passt.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt Schutzwiderstände (R1 und R3) die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig ist der Mikrocontroller aber schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 kann auch ein Dallas DS18S20 oder ein Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|900px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit der V-USB Software Stack realisiert und hat einen für speziell für dieses Gerät definierten USB HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware, welche USB Endpoints es gibt und wie mit ihnen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier ReportIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln den während des letzten Messzyklus ermittelten und zwischengespeicherten Wert des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! ReportID || Aktion&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein Messzyklus wird mit Hilfe einer State Maschine in 10s durchlaufen. Die State Maschine läuft unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Sensor auf der einen Seite Zeit sich zu erholen um nicht durch zu häufige Abfragen sich selber zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Seite ist die USB Kommunikation zeitlich völlig frei wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert die eigenen HID System Treiber automatisch beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Kern der Software ist dabei die usbGenericHIDDevice Library aus [9] die die Windows HID API Funktionen in einer leicht nutzbaren Weise kapseln und zur eigenen Verwendung bereitstellen.&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von der Basisklasse &#039;&#039;&#039;usbGenericHidCommunication&#039;&#039;&#039; wird eine eigene USB Device Klasse erstellt, die das realen Gerät widerspiegelt und fertig implementiert alle seine möglichen Eigenschaften in Service Methoden abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die zentrale Klasse &#039;usbDevice&#039; für das HiDTemp Gerät sieht so aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Werten &#039;&#039;&#039;VID = 0x16c0&#039;&#039;&#039; für die Vendor ID und &#039;&#039;&#039;PID = 0x05df&#039;&#039;&#039; für die Produkt ID abgefragt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass kein anderer Hardware Hersteller und seine USB Geräte davon beeinträchtigt wird.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur für den DS18B20 Sensors kann im Bereich von -55°C bis +125°C liegen. Der Temperatur Wert wird dabei als Vorzeichen behaftete ganze Zahl im Bereich von -55000 bis 125000 abgebildet.&lt;br /&gt;
&lt;br /&gt;
Ein Temperaturwert wird in 4 Byte gespeichert und übertragen. Auf dem Zielsystem muss dieser Wert dann nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat gemäß Datenblatt eine Grundgenauigkeit von +/- 0,5°C. Die Auflösung für einem DS18B20 ist dabei 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung und die Software für das HiDTemp Gerät arbeitet auf meinem Windows 7 x64 Systemen schon länger stabil und ohne Probleme. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr sicher und problemlos  nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen. Aus diesem Grund stelle ich meine eigenen Sources auch unter die GPL V3 Lizenz.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* [1] [http://de.wikipedia.org/wiki/Human_Interface_Device Def. Human Interface Device]&lt;br /&gt;
* [2] [http://www.usb.org/developers/hidpage/ HID Information]&lt;br /&gt;
* [3] [http://www.obdev.at/products/vusb/index-de.html V-USB]&lt;br /&gt;
* [4] [http://de.wikipedia.org/wiki/Universal_Serial_Bus Universal Serial Bus]&lt;br /&gt;
* [5] [http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf DS18B20 Programmable Resolution 1-Wire Digital Thermometer]&lt;br /&gt;
* [6] [http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html DS18X20 with AVR]&lt;br /&gt;
* [7] [http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm USB-Deskriptoren]&lt;br /&gt;
* [8] [http://www.microsoft.com/germany/express/products/windows.aspx Visual Studio 2010 Express]&lt;br /&gt;
* [9] [http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows Open Source Framework for USB Generic HID devices]&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Bitte nicht blind die folgenden Kategorien kopieren ;-)&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70315</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70315"/>
		<updated>2012-12-27T15:50:07Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Fazit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt hat zum Ziel den Bau einen relativ genauen Temperatur Moduls das sehr leicht durch die Verwendung als HID Gerät an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Dazu gehört auch der Wunsch das Gerät explizit mit Windows x64 Systeme zu betreiben und die Anwendungssoftware in c# erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung besteht, wie aus dem Schaltplan ersichtlich ist, nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ &#039;&#039;&#039;Atmel Tiny85-20&#039;&#039;&#039; ist. Als Temperatursensor wird ein &#039;&#039;&#039;Dallas DS18B20&#039;&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mir der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet passt.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt Schutzwiderstände (R1 und R3) die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig ist der Mikrocontroller aber schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 kann auch ein Dallas DS18S20 oder ein Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|900px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit V-USB realisiert. Der entschiedenen Punkt bei der Firmware ist die Definition des USB HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware welche sogenannten Endpoints es für die Kommunikation gibt und wie mit diesen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier RequestIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln die während des letzten Messzyklus ermittelte und  zwischengespeicherten Werte des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! RequestID || Aktion&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein Messzyklus wird mit Hilfe einer State Maschine in 10s durchlaufen. Die State Maschine läuft unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Sensor auf der einen Seite Zeit sich zu erholen um nicht durch zu häufige Abfragen sich selber zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Seite ist die USB Kommunikation zeitlich völlig frei wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert die eigenen HID System Treiber automatisch beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Kern der Software ist dabei die usbGenericHIDDevice Library aus [9] die die Windows HID API Funktionen in einer leicht nutzbaren Weise kapseln und zur eigenen Verwendung bereitstellen.&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von der Basisklasse &#039;&#039;&#039;usbGenericHidCommunication&#039;&#039;&#039; wird eine eigene USB Device Klasse erstellt, die das realen Gerät widerspiegelt und fertig implementiert alle seine möglichen Eigenschaften in Service Methoden abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die zentrale Klasse &#039;usbDevice&#039; für das HiDTemp Gerät sieht so aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Werten &#039;&#039;&#039;VID = 0x16c0&#039;&#039;&#039; für die Vendor ID und &#039;&#039;&#039;PID = 0x05df&#039;&#039;&#039; für die Produkt ID abgefragt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass kein anderer Hardware Hersteller und seine USB Geräte davon beeinträchtigt wird.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur für den DS18B20 Sensors kann im Bereich von -55°C bis +125°C liegen. Der Temperatur Wert wird dabei als Vorzeichen behaftete ganze Zahl im Bereich von -55000 bis 125000 abgebildet.&lt;br /&gt;
&lt;br /&gt;
Ein Temperaturwert wird in 4 Byte gespeichert und übertragen. Auf dem Zielsystem muss dieser Wert dann nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat gemäß Datenblatt eine Grundgenauigkeit von +/- 0,5°C. Die Auflösung für einem DS18B20 ist dabei 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung und die Software für das HiDTemp Gerät arbeitet auf meinem Windows 7 x64 Systemen schon länger stabil und ohne Probleme. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr sicher und problemlos  nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen. Aus diesem Grund stelle ich meine eigenen Sources auch unter die GPL V3 Lizenz.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* [1] [http://de.wikipedia.org/wiki/Human_Interface_Device Def. Human Interface Device]&lt;br /&gt;
* [2] [http://www.usb.org/developers/hidpage/ HID Information]&lt;br /&gt;
* [3] [http://www.obdev.at/products/vusb/index-de.html V-USB]&lt;br /&gt;
* [4] [http://de.wikipedia.org/wiki/Universal_Serial_Bus Universal Serial Bus]&lt;br /&gt;
* [5] [http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf DS18B20 Programmable Resolution 1-Wire Digital Thermometer]&lt;br /&gt;
* [6] [http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html DS18X20 with AVR]&lt;br /&gt;
* [7] [http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm USB-Deskriptoren]&lt;br /&gt;
* [8] [http://www.microsoft.com/germany/express/products/windows.aspx Visual Studio 2010 Express]&lt;br /&gt;
* [9] [http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows Open Source Framework for USB Generic HID devices]&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Bitte nicht blind die folgenden Kategorien kopieren ;-)&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70229</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70229"/>
		<updated>2012-12-26T08:36:41Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Schaltung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt hat zum Ziel den Bau einen relativ genauen Temperatur Moduls das sehr leicht durch die Verwendung als HID Gerät an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Dazu gehört auch der Wunsch das Gerät explizit mit Windows x64 Systeme zu betreiben und die Anwendungssoftware in c# erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung besteht, wie aus dem Schaltplan ersichtlich ist, nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ &#039;&#039;&#039;Atmel Tiny85-20&#039;&#039;&#039; ist. Als Temperatursensor wird ein &#039;&#039;&#039;Dallas DS18B20&#039;&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mir der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet passt.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt Schutzwiderstände (R1 und R3) die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig ist der Mikrocontroller aber schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 kann auch ein Dallas DS18S20 oder ein Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|900px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit V-USB realisiert. Der entschiedenen Punkt bei der Firmware ist die Definition des USB HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware welche sogenannten Endpoints es für die Kommunikation gibt und wie mit diesen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier RequestIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln die während des letzten Messzyklus ermittelte und  zwischengespeicherten Werte des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! RequestID || Aktion&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein Messzyklus wird mit Hilfe einer State Maschine in 10s durchlaufen. Die State Maschine läuft unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Sensor auf der einen Seite Zeit sich zu erholen um nicht durch zu häufige Abfragen sich selber zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Seite ist die USB Kommunikation zeitlich völlig frei wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert die eigenen HID System Treiber automatisch beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Kern der Software ist dabei die usbGenericHIDDevice Library aus [9] die die Windows HID API Funktionen in einer leicht nutzbaren Weise kapseln und zur eigenen Verwendung bereitstellen.&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von der Basisklasse &#039;&#039;&#039;usbGenericHidCommunication&#039;&#039;&#039; wird eine eigene USB Device Klasse erstellt, die das realen Gerät widerspiegelt und fertig implementiert alle seine möglichen Eigenschaften in Service Methoden abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die zentrale Klasse &#039;usbDevice&#039; für das HiDTemp Gerät sieht so aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Werten &#039;&#039;&#039;VID = 0x16c0&#039;&#039;&#039; für die Vendor ID und &#039;&#039;&#039;PID = 0x05df&#039;&#039;&#039; für die Produkt ID abgefragt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass kein anderer Hardware Hersteller und seine USB Geräte davon beeinträchtigt wird.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur für den DS18B20 Sensors kann im Bereich von -55°C bis +125°C liegen. Der Temperatur Wert wird dabei als Vorzeichen behaftete ganze Zahl im Bereich von -55000 bis 125000 abgebildet.&lt;br /&gt;
&lt;br /&gt;
Ein Temperaturwert wird in 4 Byte gespeichert und übertragen. Auf dem Zielsystem muss dieser Wert dann nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat gemäß Datenblatt eine Grundgenauigkeit von +/- 0,5°C. Die Auflösung für einem DS18B20 ist dabei 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung des HiDTemp Gerätes arbeitet zusammen mit der c# Software auf einen Windows 7 x64 System seit Wochen zur vollsten Zufriedenheit. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr sicher und problemlos  nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen. Aus diesem Grund stelle ich meine eigenen Sources auch unter die GPL V3 Lizenz.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* [1] [http://de.wikipedia.org/wiki/Human_Interface_Device Def. Human Interface Device]&lt;br /&gt;
* [2] [http://www.usb.org/developers/hidpage/ HID Information]&lt;br /&gt;
* [3] [http://www.obdev.at/products/vusb/index-de.html V-USB]&lt;br /&gt;
* [4] [http://de.wikipedia.org/wiki/Universal_Serial_Bus Universal Serial Bus]&lt;br /&gt;
* [5] [http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf DS18B20 Programmable Resolution 1-Wire Digital Thermometer]&lt;br /&gt;
* [6] [http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html DS18X20 with AVR]&lt;br /&gt;
* [7] [http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm USB-Deskriptoren]&lt;br /&gt;
* [8] [http://www.microsoft.com/germany/express/products/windows.aspx Visual Studio 2010 Express]&lt;br /&gt;
* [9] [http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows Open Source Framework for USB Generic HID devices]&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Bitte nicht blind die folgenden Kategorien kopieren ;-)&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70218</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70218"/>
		<updated>2012-12-25T15:15:01Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Schaltung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt hat zum Ziel den Bau einen relativ genauen Temperatur Moduls das sehr leicht durch die Verwendung als HID Gerät an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Dazu gehört auch der Wunsch das Gerät explizit mit Windows x64 Systeme zu betreiben und die Anwendungssoftware in c# erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung besteht, wie aus dem Schaltplan ersichtlich ist, nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ &#039;&#039;&#039;Atmel Tiny85-20&#039;&#039;&#039; ist. Als Temperatursensor wird ein &#039;&#039;&#039;Dallas DS18B20&#039;&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mir der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet passt.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt Schutzwiderstände (R1 und R3) die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig ist der Mikrocontroller aber schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 kann auch ein Dallas DS18S20 oder ein Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit V-USB realisiert. Der entschiedenen Punkt bei der Firmware ist die Definition des USB HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware welche sogenannten Endpoints es für die Kommunikation gibt und wie mit diesen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier RequestIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln die während des letzten Messzyklus ermittelte und  zwischengespeicherten Werte des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! RequestID || Aktion&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein Messzyklus wird mit Hilfe einer State Maschine in 10s durchlaufen. Die State Maschine läuft unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Sensor auf der einen Seite Zeit sich zu erholen um nicht durch zu häufige Abfragen sich selber zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Seite ist die USB Kommunikation zeitlich völlig frei wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert die eigenen HID System Treiber automatisch beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Kern der Software ist dabei die usbGenericHIDDevice Library aus [9] die die Windows HID API Funktionen in einer leicht nutzbaren Weise kapseln und zur eigenen Verwendung bereitstellen.&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von der Basisklasse &#039;&#039;&#039;usbGenericHidCommunication&#039;&#039;&#039; wird eine eigene USB Device Klasse erstellt, die das realen Gerät widerspiegelt und fertig implementiert alle seine möglichen Eigenschaften in Service Methoden abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die zentrale Klasse &#039;usbDevice&#039; für das HiDTemp Gerät sieht so aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Werten &#039;&#039;&#039;VID = 0x16c0&#039;&#039;&#039; für die Vendor ID und &#039;&#039;&#039;PID = 0x05df&#039;&#039;&#039; für die Produkt ID abgefragt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass kein anderer Hardware Hersteller und seine USB Geräte davon beeinträchtigt wird.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur für den DS18B20 Sensors kann im Bereich von -55°C bis +125°C liegen. Der Temperatur Wert wird dabei als Vorzeichen behaftete ganze Zahl im Bereich von -55000 bis 125000 abgebildet.&lt;br /&gt;
&lt;br /&gt;
Ein Temperaturwert wird in 4 Byte gespeichert und übertragen. Auf dem Zielsystem muss dieser Wert dann nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat gemäß Datenblatt eine Grundgenauigkeit von +/- 0,5°C. Die Auflösung für einem DS18B20 ist dabei 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung des HiDTemp Gerätes arbeitet zusammen mit der c# Software auf einen Windows 7 x64 System seit Wochen zur vollsten Zufriedenheit. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr sicher und problemlos  nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen. Aus diesem Grund stelle ich meine eigenen Sources auch unter die GPL V3 Lizenz.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* [1] [http://de.wikipedia.org/wiki/Human_Interface_Device Def. Human Interface Device]&lt;br /&gt;
* [2] [http://www.usb.org/developers/hidpage/ HID Information]&lt;br /&gt;
* [3] [http://www.obdev.at/products/vusb/index-de.html V-USB]&lt;br /&gt;
* [4] [http://de.wikipedia.org/wiki/Universal_Serial_Bus Universal Serial Bus]&lt;br /&gt;
* [5] [http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf DS18B20 Programmable Resolution 1-Wire Digital Thermometer]&lt;br /&gt;
* [6] [http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html DS18X20 with AVR]&lt;br /&gt;
* [7] [http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm USB-Deskriptoren]&lt;br /&gt;
* [8] [http://www.microsoft.com/germany/express/products/windows.aspx Visual Studio 2010 Express]&lt;br /&gt;
* [9] [http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows Open Source Framework for USB Generic HID devices]&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Bitte nicht blind die folgenden Kategorien kopieren ;-)&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70217</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70217"/>
		<updated>2012-12-25T15:09:25Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Fazit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt hat zum Ziel den Bau einen relativ genauen Temperatur Moduls das sehr leicht durch die Verwendung als HID Gerät an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Dazu gehört auch der Wunsch das Gerät explizit mit Windows x64 Systeme zu betreiben und die Anwendungssoftware in c# erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung bestehet wie aus dem Schaltplan ersichtlich ist nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ Atmel Tiny85-20 ist. Als Temperatursensor wird ein Dallas DS18B20 verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mir der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet passt.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt Schutzwiderstände (R1 und R3) die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig aber ist er schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 können auch Dallas DS18S20 oder Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit V-USB realisiert. Der entschiedenen Punkt bei der Firmware ist die Definition des USB HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware welche sogenannten Endpoints es für die Kommunikation gibt und wie mit diesen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier RequestIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln die während des letzten Messzyklus ermittelte und  zwischengespeicherten Werte des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! RequestID || Aktion&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein Messzyklus wird mit Hilfe einer State Maschine in 10s durchlaufen. Die State Maschine läuft unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Sensor auf der einen Seite Zeit sich zu erholen um nicht durch zu häufige Abfragen sich selber zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Seite ist die USB Kommunikation zeitlich völlig frei wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert die eigenen HID System Treiber automatisch beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Kern der Software ist dabei die usbGenericHIDDevice Library aus [9] die die Windows HID API Funktionen in einer leicht nutzbaren Weise kapseln und zur eigenen Verwendung bereitstellen.&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von der Basisklasse &#039;&#039;&#039;usbGenericHidCommunication&#039;&#039;&#039; wird eine eigene USB Device Klasse erstellt, die das realen Gerät widerspiegelt und fertig implementiert alle seine möglichen Eigenschaften in Service Methoden abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die zentrale Klasse &#039;usbDevice&#039; für das HiDTemp Gerät sieht so aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Werten &#039;&#039;&#039;VID = 0x16c0&#039;&#039;&#039; für die Vendor ID und &#039;&#039;&#039;PID = 0x05df&#039;&#039;&#039; für die Produkt ID abgefragt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass kein anderer Hardware Hersteller und seine USB Geräte davon beeinträchtigt wird.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur für den DS18B20 Sensors kann im Bereich von -55°C bis +125°C liegen. Der Temperatur Wert wird dabei als Vorzeichen behaftete ganze Zahl im Bereich von -55000 bis 125000 abgebildet.&lt;br /&gt;
&lt;br /&gt;
Ein Temperaturwert wird in 4 Byte gespeichert und übertragen. Auf dem Zielsystem muss dieser Wert dann nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat gemäß Datenblatt eine Grundgenauigkeit von +/- 0,5°C. Die Auflösung für einem DS18B20 ist dabei 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung des HiDTemp Gerätes arbeitet zusammen mit der c# Software auf einen Windows 7 x64 System seit Wochen zur vollsten Zufriedenheit. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr sicher und problemlos  nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen. Aus diesem Grund stelle ich meine eigenen Sources auch unter die GPL V3 Lizenz.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* [1] [http://de.wikipedia.org/wiki/Human_Interface_Device Def. Human Interface Device]&lt;br /&gt;
* [2] [http://www.usb.org/developers/hidpage/ HID Information]&lt;br /&gt;
* [3] [http://www.obdev.at/products/vusb/index-de.html V-USB]&lt;br /&gt;
* [4] [http://de.wikipedia.org/wiki/Universal_Serial_Bus Universal Serial Bus]&lt;br /&gt;
* [5] [http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf DS18B20 Programmable Resolution 1-Wire Digital Thermometer]&lt;br /&gt;
* [6] [http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html DS18X20 with AVR]&lt;br /&gt;
* [7] [http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm USB-Deskriptoren]&lt;br /&gt;
* [8] [http://www.microsoft.com/germany/express/products/windows.aspx Visual Studio 2010 Express]&lt;br /&gt;
* [9] [http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows Open Source Framework for USB Generic HID devices]&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Bitte nicht blind die folgenden Kategorien kopieren ;-)&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70216</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70216"/>
		<updated>2012-12-25T15:08:30Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Fazit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt hat zum Ziel den Bau einen relativ genauen Temperatur Moduls das sehr leicht durch die Verwendung als HID Gerät an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Dazu gehört auch der Wunsch das Gerät explizit mit Windows x64 Systeme zu betreiben und die Anwendungssoftware in c# erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung bestehet wie aus dem Schaltplan ersichtlich ist nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ Atmel Tiny85-20 ist. Als Temperatursensor wird ein Dallas DS18B20 verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mir der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet passt.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt Schutzwiderstände (R1 und R3) die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig aber ist er schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 können auch Dallas DS18S20 oder Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit V-USB realisiert. Der entschiedenen Punkt bei der Firmware ist die Definition des USB HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware welche sogenannten Endpoints es für die Kommunikation gibt und wie mit diesen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier RequestIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln die während des letzten Messzyklus ermittelte und  zwischengespeicherten Werte des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! RequestID || Aktion&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein Messzyklus wird mit Hilfe einer State Maschine in 10s durchlaufen. Die State Maschine läuft unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Sensor auf der einen Seite Zeit sich zu erholen um nicht durch zu häufige Abfragen sich selber zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Seite ist die USB Kommunikation zeitlich völlig frei wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert die eigenen HID System Treiber automatisch beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Kern der Software ist dabei die usbGenericHIDDevice Library aus [9] die die Windows HID API Funktionen in einer leicht nutzbaren Weise kapseln und zur eigenen Verwendung bereitstellen.&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von der Basisklasse &#039;&#039;&#039;usbGenericHidCommunication&#039;&#039;&#039; wird eine eigene USB Device Klasse erstellt, die das realen Gerät widerspiegelt und fertig implementiert alle seine möglichen Eigenschaften in Service Methoden abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die zentrale Klasse &#039;usbDevice&#039; für das HiDTemp Gerät sieht so aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Werten &#039;&#039;&#039;VID = 0x16c0&#039;&#039;&#039; für die Vendor ID und &#039;&#039;&#039;PID = 0x05df&#039;&#039;&#039; für die Produkt ID abgefragt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass kein anderer Hardware Hersteller und seine USB Geräte davon beeinträchtigt wird.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur für den DS18B20 Sensors kann im Bereich von -55°C bis +125°C liegen. Der Temperatur Wert wird dabei als Vorzeichen behaftete ganze Zahl im Bereich von -55000 bis 125000 abgebildet.&lt;br /&gt;
&lt;br /&gt;
Ein Temperaturwert wird in 4 Byte gespeichert und übertragen. Auf dem Zielsystem muss dieser Wert dann nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat gemäß Datenblatt eine Grundgenauigkeit von +/- 0,5°C. Die Auflösung für einem DS18B20 ist dabei 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung des HiDTemp Gerätes arbeitet zusammen mit der c# Software auf einen Windows 7 x64 System seit Wochen zur vollsten Zufriedenheit. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr sicher und problemlos  nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Grund stelle ich meine eigenen Sources auch unter die GPL V3 Lizenz.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* [1] [http://de.wikipedia.org/wiki/Human_Interface_Device Def. Human Interface Device]&lt;br /&gt;
* [2] [http://www.usb.org/developers/hidpage/ HID Information]&lt;br /&gt;
* [3] [http://www.obdev.at/products/vusb/index-de.html V-USB]&lt;br /&gt;
* [4] [http://de.wikipedia.org/wiki/Universal_Serial_Bus Universal Serial Bus]&lt;br /&gt;
* [5] [http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf DS18B20 Programmable Resolution 1-Wire Digital Thermometer]&lt;br /&gt;
* [6] [http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html DS18X20 with AVR]&lt;br /&gt;
* [7] [http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm USB-Deskriptoren]&lt;br /&gt;
* [8] [http://www.microsoft.com/germany/express/products/windows.aspx Visual Studio 2010 Express]&lt;br /&gt;
* [9] [http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows Open Source Framework for USB Generic HID devices]&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Bitte nicht blind die folgenden Kategorien kopieren ;-)&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70215</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70215"/>
		<updated>2012-12-25T15:02:33Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Referenzen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt hat zum Ziel den Bau einen relativ genauen Temperatur Moduls das sehr leicht durch die Verwendung als HID Gerät an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Dazu gehört auch der Wunsch das Gerät explizit mit Windows x64 Systeme zu betreiben und die Anwendungssoftware in c# erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung bestehet wie aus dem Schaltplan ersichtlich ist nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ Atmel Tiny85-20 ist. Als Temperatursensor wird ein Dallas DS18B20 verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mir der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet passt.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt Schutzwiderstände (R1 und R3) die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig aber ist er schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 können auch Dallas DS18S20 oder Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit V-USB realisiert. Der entschiedenen Punkt bei der Firmware ist die Definition des USB HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware welche sogenannten Endpoints es für die Kommunikation gibt und wie mit diesen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier RequestIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln die während des letzten Messzyklus ermittelte und  zwischengespeicherten Werte des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! RequestID || Aktion&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein Messzyklus wird mit Hilfe einer State Maschine in 10s durchlaufen. Die State Maschine läuft unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Sensor auf der einen Seite Zeit sich zu erholen um nicht durch zu häufige Abfragen sich selber zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Seite ist die USB Kommunikation zeitlich völlig frei wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert die eigenen HID System Treiber automatisch beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Kern der Software ist dabei die usbGenericHIDDevice Library aus [9] die die Windows HID API Funktionen in einer leicht nutzbaren Weise kapseln und zur eigenen Verwendung bereitstellen.&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von der Basisklasse &#039;&#039;&#039;usbGenericHidCommunication&#039;&#039;&#039; wird eine eigene USB Device Klasse erstellt, die das realen Gerät widerspiegelt und fertig implementiert alle seine möglichen Eigenschaften in Service Methoden abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die zentrale Klasse &#039;usbDevice&#039; für das HiDTemp Gerät sieht so aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Werten &#039;&#039;&#039;VID = 0x16c0&#039;&#039;&#039; für die Vendor ID und &#039;&#039;&#039;PID = 0x05df&#039;&#039;&#039; für die Produkt ID abgefragt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass kein anderer Hardware Hersteller und seine USB Geräte davon beeinträchtigt wird.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur für den DS18B20 Sensors kann im Bereich von -55°C bis +125°C liegen. Der Temperatur Wert wird dabei als Vorzeichen behaftete ganze Zahl im Bereich von -55000 bis 125000 abgebildet.&lt;br /&gt;
&lt;br /&gt;
Ein Temperaturwert wird in 4 Byte gespeichert und übertragen. Auf dem Zielsystem muss dieser Wert dann nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat gemäß Datenblatt eine Grundgenauigkeit von +/- 0,5°C. Die Auflösung für einem DS18B20 ist dabei 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung des HiDTemp Gerätes arbeitet zusammen mit der c# Software auf einen Windows 7 x64 System seit Wochen zur vollsten Zufriedenheit. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr einfach nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Grund stelle ich meine eigenen Sources auch unter GPL V3, alle anderen Bestandteile sind wie ihr ursprünglicher Autor es vorsieht.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* [1] [http://de.wikipedia.org/wiki/Human_Interface_Device Def. Human Interface Device]&lt;br /&gt;
* [2] [http://www.usb.org/developers/hidpage/ HID Information]&lt;br /&gt;
* [3] [http://www.obdev.at/products/vusb/index-de.html V-USB]&lt;br /&gt;
* [4] [http://de.wikipedia.org/wiki/Universal_Serial_Bus Universal Serial Bus]&lt;br /&gt;
* [5] [http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf DS18B20 Programmable Resolution 1-Wire Digital Thermometer]&lt;br /&gt;
* [6] [http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html DS18X20 with AVR]&lt;br /&gt;
* [7] [http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm USB-Deskriptoren]&lt;br /&gt;
* [8] [http://www.microsoft.com/germany/express/products/windows.aspx Visual Studio 2010 Express]&lt;br /&gt;
* [9] [http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows Open Source Framework for USB Generic HID devices]&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Bitte nicht blind die folgenden Kategorien kopieren ;-)&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70213</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70213"/>
		<updated>2012-12-25T13:07:48Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Anwendung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt hat zum Ziel den Bau einen relativ genauen Temperatur Moduls das sehr leicht durch die Verwendung als HID Gerät an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Dazu gehört auch der Wunsch das Gerät explizit mit Windows x64 Systeme zu betreiben und die Anwendungssoftware in c# erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung bestehet wie aus dem Schaltplan ersichtlich ist nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ Atmel Tiny85-20 ist. Als Temperatursensor wird ein Dallas DS18B20 verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mir der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet passt.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt Schutzwiderstände (R1 und R3) die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig aber ist er schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 können auch Dallas DS18S20 oder Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit V-USB realisiert. Der entschiedenen Punkt bei der Firmware ist die Definition des USB HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware welche sogenannten Endpoints es für die Kommunikation gibt und wie mit diesen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier RequestIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln die während des letzten Messzyklus ermittelte und  zwischengespeicherten Werte des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! RequestID || Aktion&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein Messzyklus wird mit Hilfe einer State Maschine in 10s durchlaufen. Die State Maschine läuft unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Sensor auf der einen Seite Zeit sich zu erholen um nicht durch zu häufige Abfragen sich selber zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Seite ist die USB Kommunikation zeitlich völlig frei wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert die eigenen HID System Treiber automatisch beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Kern der Software ist dabei die usbGenericHIDDevice Library aus [9] die die Windows HID API Funktionen in einer leicht nutzbaren Weise kapseln und zur eigenen Verwendung bereitstellen.&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von der Basisklasse &#039;&#039;&#039;usbGenericHidCommunication&#039;&#039;&#039; wird eine eigene USB Device Klasse erstellt, die das realen Gerät widerspiegelt und fertig implementiert alle seine möglichen Eigenschaften in Service Methoden abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die zentrale Klasse &#039;usbDevice&#039; für das HiDTemp Gerät sieht so aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Werten &#039;&#039;&#039;VID = 0x16c0&#039;&#039;&#039; für die Vendor ID und &#039;&#039;&#039;PID = 0x05df&#039;&#039;&#039; für die Produkt ID abgefragt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass kein anderer Hardware Hersteller und seine USB Geräte davon beeinträchtigt wird.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur für den DS18B20 Sensors kann im Bereich von -55°C bis +125°C liegen. Der Temperatur Wert wird dabei als Vorzeichen behaftete ganze Zahl im Bereich von -55000 bis 125000 abgebildet.&lt;br /&gt;
&lt;br /&gt;
Ein Temperaturwert wird in 4 Byte gespeichert und übertragen. Auf dem Zielsystem muss dieser Wert dann nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat gemäß Datenblatt eine Grundgenauigkeit von +/- 0,5°C. Die Auflösung für einem DS18B20 ist dabei 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung des HiDTemp Gerätes arbeitet zusammen mit der c# Software auf einen Windows 7 x64 System seit Wochen zur vollsten Zufriedenheit. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr einfach nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Grund stelle ich meine eigenen Sources auch unter GPL V3, alle anderen Bestandteile sind wie ihr ursprünglicher Autor es vorsieht.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* (1) http://de.wikipedia.org/wiki/Human_Interface_Device&lt;br /&gt;
* (2) http://www.usb.org/developers/hidpage/&lt;br /&gt;
* (3) http://www.obdev.at/products/vusb/index-de.html&lt;br /&gt;
* (4) http://de.wikipedia.org/wiki/Universal_Serial_Bus&lt;br /&gt;
* (5) http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf&lt;br /&gt;
* (6) http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html&lt;br /&gt;
* (7) http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm&lt;br /&gt;
* (8) http://www.microsoft.com/germany/express/products/windows.aspx&lt;br /&gt;
* (9) http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Bitte nicht blind die folgenden Kategorien kopieren ;-)&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70211</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70211"/>
		<updated>2012-12-25T08:56:22Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Anwendung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt hat zum Ziel den Bau einen relativ genauen Temperatur Moduls das sehr leicht durch die Verwendung als HID Gerät an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Dazu gehört auch der Wunsch das Gerät explizit mit Windows x64 Systeme zu betreiben und die Anwendungssoftware in c# erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung bestehet wie aus dem Schaltplan ersichtlich ist nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ Atmel Tiny85-20 ist. Als Temperatursensor wird ein Dallas DS18B20 verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mir der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet passt.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt Schutzwiderstände (R1 und R3) die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig aber ist er schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 können auch Dallas DS18S20 oder Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit V-USB realisiert. Der entschiedenen Punkt bei der Firmware ist die Definition des USB HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware welche sogenannten Endpoints es für die Kommunikation gibt und wie mit diesen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier RequestIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln die während des letzten Messzyklus ermittelte und  zwischengespeicherten Werte des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! RequestID || Aktion&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein Messzyklus wird mit Hilfe einer State Maschine in 10s durchlaufen. Die State Maschine läuft unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Sensor auf der einen Seite Zeit sich zu erholen um nicht durch zu häufige Abfragen sich selber zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Seite ist die USB Kommunikation zeitlich völlig frei wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert die eigenen HID System Treiber automatisch beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Kern der Software ist dabei die usbGenericHIDDevice Library aus [9] die die Windows API Funktionen in einer leicht Nutzbaren weise kapselt.&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von der Basisklasse &#039;&#039;&#039;usbGenericHidCommunication&#039;&#039;&#039; wird eine eigene USB Device Klasse erstellt, die das realen Gerät widerspiegelt und fertig implementiert alle seine möglichen Eigenschaften in Service Methoden abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die zentrale Klasse &#039;usbDevice&#039; für das HiDTemp Gerät sieht so aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Werten &#039;&#039;&#039;VID = 0x16c0&#039;&#039;&#039; für die Vendor ID und &#039;&#039;&#039;PID = 0x05df&#039;&#039;&#039; für die Produkt ID abgefragt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass kein anderer Hardware Hersteller und seine USB Geräte davon beeinträchtigt wird.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur für den DS18B20 Sensors kann im Bereich von -55°C bis +125°C liegen. Der Temperatur Wert wird dabei als Vorzeichen behaftete ganze Zahl im Bereich von -55000 bis 125000 abgebildet.&lt;br /&gt;
&lt;br /&gt;
Ein Temperaturwert wird in 4 Byte gespeichert und übertragen. Auf dem Zielsystem muss dieser Wert dann nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat gemäß Datenblatt eine Grundgenauigkeit von +/- 0,5°C. Die Auflösung für einem DS18B20 ist dabei 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung des HiDTemp Gerätes arbeitet zusammen mit der c# Software auf einen Windows 7 x64 System seit Wochen zur vollsten Zufriedenheit. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr einfach nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Grund stelle ich meine eigenen Sources auch unter GPL V3, alle anderen Bestandteile sind wie ihr ursprünglicher Autor es vorsieht.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* (1) http://de.wikipedia.org/wiki/Human_Interface_Device&lt;br /&gt;
* (2) http://www.usb.org/developers/hidpage/&lt;br /&gt;
* (3) http://www.obdev.at/products/vusb/index-de.html&lt;br /&gt;
* (4) http://de.wikipedia.org/wiki/Universal_Serial_Bus&lt;br /&gt;
* (5) http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf&lt;br /&gt;
* (6) http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html&lt;br /&gt;
* (7) http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm&lt;br /&gt;
* (8) http://www.microsoft.com/germany/express/products/windows.aspx&lt;br /&gt;
* (9) http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Bitte nicht blind die folgenden Kategorien kopieren ;-)&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70210</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70210"/>
		<updated>2012-12-25T08:46:21Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Anwendung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt hat zum Ziel den Bau einen relativ genauen Temperatur Moduls das sehr leicht durch die Verwendung als HID Gerät an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Dazu gehört auch der Wunsch das Gerät explizit mit Windows x64 Systeme zu betreiben und die Anwendungssoftware in c# erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung bestehet wie aus dem Schaltplan ersichtlich ist nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ Atmel Tiny85-20 ist. Als Temperatursensor wird ein Dallas DS18B20 verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mir der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet passt.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt Schutzwiderstände (R1 und R3) die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig aber ist er schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 können auch Dallas DS18S20 oder Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit V-USB realisiert. Der entschiedenen Punkt bei der Firmware ist die Definition des USB HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware welche sogenannten Endpoints es für die Kommunikation gibt und wie mit diesen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier RequestIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln die während des letzten Messzyklus ermittelte und  zwischengespeicherten Werte des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! RequestID || Aktion&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein Messzyklus wird mit Hilfe einer State Maschine in 10s durchlaufen. Die State Maschine läuft unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Sensor auf der einen Seite Zeit sich zu erholen um nicht durch zu häufige Abfragen sich selber zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Seite ist die USB Kommunikation zeitlich völlig frei wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert die eigenen HID System Treiber automatisch beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Kern der Software ist dabei die usbGenericHIDDevice Library aus [9] die die Windows API Funktionen in einer leicht Nutzbaren weise kapselt.&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von der Basisklasse &#039;&#039;&#039;usbGenericHidCommunication&#039;&#039;&#039; wird eine eigene USB Device Klasse erstellt, die das realen Gerät widerspiegelt und fertig implementiert alle seine möglichen Eigenschaften in Service Methoden abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die zentrale Klasse &#039;usbDevice&#039; für das HiDTemp Gerät sieht so aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Werten &#039;&#039;&#039;VID = 0x16c0&#039;&#039;&#039; für die Vendor ID und &#039;&#039;&#039;PID = 0x05df&#039;&#039;&#039; für die Produkt ID abgefragt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass kein anderer Hardware Hersteller und seine USB Geräte davon beeinträchtigt wird.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur des DS18B20 Sensors im Bereich von -55°C bis +125°C wird dabei als Vorzeichen behaftete ganze Zahl übertragen.&lt;br /&gt;
&lt;br /&gt;
Der Wert kann also bequem in 4 Byte gespeichert werden und muss auf dem Zielsystem nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat laut Datenblatt eine Grundgenauigkeit von +/- 0,5°C, die Auflösung für einem DS18B20 ist 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung des HiDTemp Gerätes arbeitet zusammen mit der c# Software auf einen Windows 7 x64 System seit Wochen zur vollsten Zufriedenheit. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr einfach nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Grund stelle ich meine eigenen Sources auch unter GPL V3, alle anderen Bestandteile sind wie ihr ursprünglicher Autor es vorsieht.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* (1) http://de.wikipedia.org/wiki/Human_Interface_Device&lt;br /&gt;
* (2) http://www.usb.org/developers/hidpage/&lt;br /&gt;
* (3) http://www.obdev.at/products/vusb/index-de.html&lt;br /&gt;
* (4) http://de.wikipedia.org/wiki/Universal_Serial_Bus&lt;br /&gt;
* (5) http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf&lt;br /&gt;
* (6) http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html&lt;br /&gt;
* (7) http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm&lt;br /&gt;
* (8) http://www.microsoft.com/germany/express/products/windows.aspx&lt;br /&gt;
* (9) http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Bitte nicht blind die folgenden Kategorien kopieren ;-)&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70209</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70209"/>
		<updated>2012-12-25T08:45:09Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Anwendung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt hat zum Ziel den Bau einen relativ genauen Temperatur Moduls das sehr leicht durch die Verwendung als HID Gerät an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Dazu gehört auch der Wunsch das Gerät explizit mit Windows x64 Systeme zu betreiben und die Anwendungssoftware in c# erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung bestehet wie aus dem Schaltplan ersichtlich ist nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ Atmel Tiny85-20 ist. Als Temperatursensor wird ein Dallas DS18B20 verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mir der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet passt.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt Schutzwiderstände (R1 und R3) die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig aber ist er schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 können auch Dallas DS18S20 oder Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit V-USB realisiert. Der entschiedenen Punkt bei der Firmware ist die Definition des USB HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware welche sogenannten Endpoints es für die Kommunikation gibt und wie mit diesen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier RequestIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln die während des letzten Messzyklus ermittelte und  zwischengespeicherten Werte des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! RequestID || Aktion&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein Messzyklus wird mit Hilfe einer State Maschine in 10s durchlaufen. Die State Maschine läuft unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Sensor auf der einen Seite Zeit sich zu erholen um nicht durch zu häufige Abfragen sich selber zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Seite ist die USB Kommunikation zeitlich völlig frei wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert die eigenen HID System Treiber automatisch beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Kern der Software ist dabei die usbGenericHIDDevice Library aus [9] die die Windows API Funktionen in einer leicht Nutzbaren weise kapselt.&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von der Basisklasse &#039;&#039;&#039;usbGenericHidCommunication&#039;&#039;&#039; wird eine eigene USB Device Klasse erstellt, die das realen Gerät widerspiegelt und fertig implementiert alle seine möglichen Eigenschaften in Service Methoden abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die zentrale Klasse &#039;usbDevice&#039; für das HiDTemp Gerät sieht so aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Werten &#039;&#039;&#039;VID = 0x16c0&#039;&#039;&#039; für die Vendor ID und &#039;&#039;&#039;PID = 0x05df&#039;&#039;&#039; für die Produkt ID abgefragt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass kein anderer Hardware Hersteller und seine Geräte davon beeinträchtigt werden.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur des DS18B20 Sensors im Bereich von -55°C bis +125°C wird dabei als Vorzeichen behaftete ganze Zahl übertragen.&lt;br /&gt;
&lt;br /&gt;
Der Wert kann also bequem in 4 Byte gespeichert werden und muss auf dem Zielsystem nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat laut Datenblatt eine Grundgenauigkeit von +/- 0,5°C, die Auflösung für einem DS18B20 ist 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung des HiDTemp Gerätes arbeitet zusammen mit der c# Software auf einen Windows 7 x64 System seit Wochen zur vollsten Zufriedenheit. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr einfach nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Grund stelle ich meine eigenen Sources auch unter GPL V3, alle anderen Bestandteile sind wie ihr ursprünglicher Autor es vorsieht.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* (1) http://de.wikipedia.org/wiki/Human_Interface_Device&lt;br /&gt;
* (2) http://www.usb.org/developers/hidpage/&lt;br /&gt;
* (3) http://www.obdev.at/products/vusb/index-de.html&lt;br /&gt;
* (4) http://de.wikipedia.org/wiki/Universal_Serial_Bus&lt;br /&gt;
* (5) http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf&lt;br /&gt;
* (6) http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html&lt;br /&gt;
* (7) http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm&lt;br /&gt;
* (8) http://www.microsoft.com/germany/express/products/windows.aspx&lt;br /&gt;
* (9) http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Bitte nicht blind die folgenden Kategorien kopieren ;-)&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70208</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70208"/>
		<updated>2012-12-25T08:44:23Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Anwendung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt hat zum Ziel den Bau einen relativ genauen Temperatur Moduls das sehr leicht durch die Verwendung als HID Gerät an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Dazu gehört auch der Wunsch das Gerät explizit mit Windows x64 Systeme zu betreiben und die Anwendungssoftware in c# erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung bestehet wie aus dem Schaltplan ersichtlich ist nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ Atmel Tiny85-20 ist. Als Temperatursensor wird ein Dallas DS18B20 verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mir der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet passt.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt Schutzwiderstände (R1 und R3) die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig aber ist er schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 können auch Dallas DS18S20 oder Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit V-USB realisiert. Der entschiedenen Punkt bei der Firmware ist die Definition des USB HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware welche sogenannten Endpoints es für die Kommunikation gibt und wie mit diesen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier RequestIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln die während des letzten Messzyklus ermittelte und  zwischengespeicherten Werte des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! RequestID || Aktion&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein Messzyklus wird mit Hilfe einer State Maschine in 10s durchlaufen. Die State Maschine läuft unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Sensor auf der einen Seite Zeit sich zu erholen um nicht durch zu häufige Abfragen sich selber zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Seite ist die USB Kommunikation zeitlich völlig frei wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert die eigenen HID System Treiber automatisch beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Kern der Software ist dabei die usbGenericHIDDevice Library aus [9] die die Windows API Funktionen in einer leicht Nutzbaren weise kapselt.&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von der Basisklasse &#039;&#039;&#039;usbGenericHidCommunication&#039;&#039;&#039; wird eine eigene USB Device Klasse erstellt, die das realen Gerät widerspiegelt und fertig implementiert alle seine möglichen Eigenschaften in Service Methoden abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die zentrale Klasse &#039;usbDevice&#039; für das HiDTemp Gerät sieht so aus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Werten &#039;&#039;&#039;VID = 0x16c0&#039;&#039;&#039; für die Vendor Id und &#039;&#039;&#039;PID = 0x05df&#039;&#039;&#039; für die Produkt Id abgefragt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass kein anderer Hardware Hersteller und seine Geräte davon beeinträchtigt werden.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur des DS18B20 Sensors im Bereich von -55°C bis +125°C wird dabei als Vorzeichen behaftete ganze Zahl übertragen.&lt;br /&gt;
&lt;br /&gt;
Der Wert kann also bequem in 4 Byte gespeichert werden und muss auf dem Zielsystem nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat laut Datenblatt eine Grundgenauigkeit von +/- 0,5°C, die Auflösung für einem DS18B20 ist 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung des HiDTemp Gerätes arbeitet zusammen mit der c# Software auf einen Windows 7 x64 System seit Wochen zur vollsten Zufriedenheit. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr einfach nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Grund stelle ich meine eigenen Sources auch unter GPL V3, alle anderen Bestandteile sind wie ihr ursprünglicher Autor es vorsieht.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* (1) http://de.wikipedia.org/wiki/Human_Interface_Device&lt;br /&gt;
* (2) http://www.usb.org/developers/hidpage/&lt;br /&gt;
* (3) http://www.obdev.at/products/vusb/index-de.html&lt;br /&gt;
* (4) http://de.wikipedia.org/wiki/Universal_Serial_Bus&lt;br /&gt;
* (5) http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf&lt;br /&gt;
* (6) http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html&lt;br /&gt;
* (7) http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm&lt;br /&gt;
* (8) http://www.microsoft.com/germany/express/products/windows.aspx&lt;br /&gt;
* (9) http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Bitte nicht blind die folgenden Kategorien kopieren ;-)&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70207</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70207"/>
		<updated>2012-12-25T08:38:40Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Treiber */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt hat zum Ziel den Bau einen relativ genauen Temperatur Moduls das sehr leicht durch die Verwendung als HID Gerät an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Dazu gehört auch der Wunsch das Gerät explizit mit Windows x64 Systeme zu betreiben und die Anwendungssoftware in c# erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung bestehet wie aus dem Schaltplan ersichtlich ist nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ Atmel Tiny85-20 ist. Als Temperatursensor wird ein Dallas DS18B20 verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mir der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet passt.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt Schutzwiderstände (R1 und R3) die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig aber ist er schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 können auch Dallas DS18S20 oder Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit V-USB realisiert. Der entschiedenen Punkt bei der Firmware ist die Definition des USB HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware welche sogenannten Endpoints es für die Kommunikation gibt und wie mit diesen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier RequestIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln die während des letzten Messzyklus ermittelte und  zwischengespeicherten Werte des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! RequestID || Aktion&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein Messzyklus wird mit Hilfe einer State Maschine in 10s durchlaufen. Die State Maschine läuft unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Sensor auf der einen Seite Zeit sich zu erholen um nicht durch zu häufige Abfragen sich selber zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Seite ist die USB Kommunikation zeitlich völlig frei wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert die eigenen HID System Treiber automatisch beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Kern der Software ist die usbGenericHIDDevice Komponente aus [9].&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von einer Basisklasse wird eine eigene USB Device Klasse erstellt, die dem realen Gerät entspricht und alle seine möglichen Eigenschaften abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die entscheidende Klasse für das HiDTemp Gerät sieht so aus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Werten &#039;&#039;&#039;VID = 0x16c0&#039;&#039;&#039; für die Vendor Id und &#039;&#039;&#039;PID = 0x05df&#039;&#039;&#039; für die Produkt Id abgefragt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass kein anderer Hardware Hersteller und seine Geräte davon beeinträchtigt werden.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur des DS18B20 Sensors im Bereich von -55°C bis +125°C wird dabei als Vorzeichen behaftete ganze Zahl übertragen.&lt;br /&gt;
&lt;br /&gt;
Der Wert kann also bequem in 4 Byte gespeichert werden und muss auf dem Zielsystem nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat laut Datenblatt eine Grundgenauigkeit von +/- 0,5°C, die Auflösung für einem DS18B20 ist 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung des HiDTemp Gerätes arbeitet zusammen mit der c# Software auf einen Windows 7 x64 System seit Wochen zur vollsten Zufriedenheit. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr einfach nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Grund stelle ich meine eigenen Sources auch unter GPL V3, alle anderen Bestandteile sind wie ihr ursprünglicher Autor es vorsieht.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* (1) http://de.wikipedia.org/wiki/Human_Interface_Device&lt;br /&gt;
* (2) http://www.usb.org/developers/hidpage/&lt;br /&gt;
* (3) http://www.obdev.at/products/vusb/index-de.html&lt;br /&gt;
* (4) http://de.wikipedia.org/wiki/Universal_Serial_Bus&lt;br /&gt;
* (5) http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf&lt;br /&gt;
* (6) http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html&lt;br /&gt;
* (7) http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm&lt;br /&gt;
* (8) http://www.microsoft.com/germany/express/products/windows.aspx&lt;br /&gt;
* (9) http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Bitte nicht blind die folgenden Kategorien kopieren ;-)&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70191</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70191"/>
		<updated>2012-12-24T08:28:01Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Anwendung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt hat zum Ziel den Bau einen relativ genauen Temperatur Moduls das sehr leicht durch die Verwendung als HID Gerät an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Dazu gehört auch der Wunsch das Gerät explizit mit Windows x64 Systeme zu betreiben und die Anwendungssoftware in c# erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung bestehet wie aus dem Schaltplan ersichtlich ist nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ Atmel Tiny85-20 ist. Als Temperatursensor wird ein Dallas DS18B20 verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mir der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet passt.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt Schutzwiderstände (R1 und R3) die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig aber ist er schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 können auch Dallas DS18S20 oder Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit V-USB realisiert. Der entschiedenen Punkt bei der Firmware ist die Definition des USB HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware welche sogenannten Endpoints es für die Kommunikation gibt und wie mit diesen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier RequestIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln die während des letzten Messzyklus ermittelte und  zwischengespeicherten Werte des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! RequestID || Aktion&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein Messzyklus wird mit Hilfe einer State Maschine in 10s durchlaufen. Die State Maschine läuft unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Sensor auf der einen Seite Zeit sich zu erholen um nicht durch zu häufige Abfragen sich selber zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Seite ist die USB Kommunikation zeitlich völlig frei wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Da das HiDTemp Gerät als HiD Device erkannt wird, installiert Windows seine eigenen HID System Treiber automatisch. &lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert Treiber automatisch einmalig beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Kern der Software ist die usbGenericHIDDevice Komponente aus [9].&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von einer Basisklasse wird eine eigene USB Device Klasse erstellt, die dem realen Gerät entspricht und alle seine möglichen Eigenschaften abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die entscheidende Klasse für das HiDTemp Gerät sieht so aus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Werten &#039;&#039;&#039;VID = 0x16c0&#039;&#039;&#039; für die Vendor Id und &#039;&#039;&#039;PID = 0x05df&#039;&#039;&#039; für die Produkt Id abgefragt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass kein anderer Hardware Hersteller und seine Geräte davon beeinträchtigt werden.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur des DS18B20 Sensors im Bereich von -55°C bis +125°C wird dabei als Vorzeichen behaftete ganze Zahl übertragen.&lt;br /&gt;
&lt;br /&gt;
Der Wert kann also bequem in 4 Byte gespeichert werden und muss auf dem Zielsystem nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat laut Datenblatt eine Grundgenauigkeit von +/- 0,5°C, die Auflösung für einem DS18B20 ist 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung des HiDTemp Gerätes arbeitet zusammen mit der c# Software auf einen Windows 7 x64 System seit Wochen zur vollsten Zufriedenheit. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr einfach nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Grund stelle ich meine eigenen Sources auch unter GPL V3, alle anderen Bestandteile sind wie ihr ursprünglicher Autor es vorsieht.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* (1) http://de.wikipedia.org/wiki/Human_Interface_Device&lt;br /&gt;
* (2) http://www.usb.org/developers/hidpage/&lt;br /&gt;
* (3) http://www.obdev.at/products/vusb/index-de.html&lt;br /&gt;
* (4) http://de.wikipedia.org/wiki/Universal_Serial_Bus&lt;br /&gt;
* (5) http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf&lt;br /&gt;
* (6) http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html&lt;br /&gt;
* (7) http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm&lt;br /&gt;
* (8) http://www.microsoft.com/germany/express/products/windows.aspx&lt;br /&gt;
* (9) http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Bitte nicht blind die folgenden Kategorien kopieren ;-)&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70190</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70190"/>
		<updated>2012-12-24T08:26:27Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Anwendung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt hat zum Ziel den Bau einen relativ genauen Temperatur Moduls das sehr leicht durch die Verwendung als HID Gerät an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Dazu gehört auch der Wunsch das Gerät explizit mit Windows x64 Systeme zu betreiben und die Anwendungssoftware in c# erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung bestehet wie aus dem Schaltplan ersichtlich ist nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ Atmel Tiny85-20 ist. Als Temperatursensor wird ein Dallas DS18B20 verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mir der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet passt.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt Schutzwiderstände (R1 und R3) die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig aber ist er schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 können auch Dallas DS18S20 oder Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit V-USB realisiert. Der entschiedenen Punkt bei der Firmware ist die Definition des USB HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware welche sogenannten Endpoints es für die Kommunikation gibt und wie mit diesen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier RequestIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln die während des letzten Messzyklus ermittelte und  zwischengespeicherten Werte des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! RequestID || Aktion&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein Messzyklus wird mit Hilfe einer State Maschine in 10s durchlaufen. Die State Maschine läuft unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Sensor auf der einen Seite Zeit sich zu erholen um nicht durch zu häufige Abfragen sich selber zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Seite ist die USB Kommunikation zeitlich völlig frei wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Da das HiDTemp Gerät als HiD Device erkannt wird, installiert Windows seine eigenen HID System Treiber automatisch. &lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert Treiber automatisch einmalig beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Kern der Software ist die usbGenericHIDDevice Komponente aus [9].&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von einer Basisklasse wird eine eigene USB Device Klasse erstellt, die dem realen Gerät entspricht und alle seine möglichen Eigenschaften abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die entscheidende Klasse für das HiDTemp Gerät sieht so aus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Werten &#039;&#039;&#039;VID = 0x16c0&#039;&#039;&#039; für die Vendor Id und &#039;&#039;&#039;PID = 0x05df&#039;&#039;&#039; für die Produkt Id abgefragt.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass keine anderen Hardware Hersteller und ihre Geräte davon beeinträchtigt werden.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur des DS18B20 Sensors im Bereich von -55°C bis +125°C wird dabei als Vorzeichen behaftete ganze Zahl übertragen.&lt;br /&gt;
&lt;br /&gt;
Der Wert kann also bequem in 4 Byte gespeichert werden und muss auf dem Zielsystem nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat laut Datenblatt eine Grundgenauigkeit von +/- 0,5°C, die Auflösung für einem DS18B20 ist 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung des HiDTemp Gerätes arbeitet zusammen mit der c# Software auf einen Windows 7 x64 System seit Wochen zur vollsten Zufriedenheit. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr einfach nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Grund stelle ich meine eigenen Sources auch unter GPL V3, alle anderen Bestandteile sind wie ihr ursprünglicher Autor es vorsieht.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* (1) http://de.wikipedia.org/wiki/Human_Interface_Device&lt;br /&gt;
* (2) http://www.usb.org/developers/hidpage/&lt;br /&gt;
* (3) http://www.obdev.at/products/vusb/index-de.html&lt;br /&gt;
* (4) http://de.wikipedia.org/wiki/Universal_Serial_Bus&lt;br /&gt;
* (5) http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf&lt;br /&gt;
* (6) http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html&lt;br /&gt;
* (7) http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm&lt;br /&gt;
* (8) http://www.microsoft.com/germany/express/products/windows.aspx&lt;br /&gt;
* (9) http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Bitte nicht blind die folgenden Kategorien kopieren ;-)&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70189</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70189"/>
		<updated>2012-12-24T08:24:00Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Firmware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt hat zum Ziel den Bau einen relativ genauen Temperatur Moduls das sehr leicht durch die Verwendung als HID Gerät an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Dazu gehört auch der Wunsch das Gerät explizit mit Windows x64 Systeme zu betreiben und die Anwendungssoftware in c# erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung bestehet wie aus dem Schaltplan ersichtlich ist nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ Atmel Tiny85-20 ist. Als Temperatursensor wird ein Dallas DS18B20 verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mir der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet passt.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt Schutzwiderstände (R1 und R3) die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig aber ist er schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 können auch Dallas DS18S20 oder Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit V-USB realisiert. Der entschiedenen Punkt bei der Firmware ist die Definition des USB HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware welche sogenannten Endpoints es für die Kommunikation gibt und wie mit diesen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier RequestIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln die während des letzten Messzyklus ermittelte und  zwischengespeicherten Werte des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! RequestID || Aktion&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein Messzyklus wird mit Hilfe einer State Maschine in 10s durchlaufen. Die State Maschine läuft unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID &amp;quot;4&amp;quot; kann die USB Software nun die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Sensor auf der einen Seite Zeit sich zu erholen um nicht durch zu häufige Abfragen sich selber zu erwärmen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Seite ist die USB Kommunikation zeitlich völlig frei wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Da das HiDTemp Gerät als HiD Device erkannt wird, installiert Windows seine eigenen HID System Treiber automatisch. &lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert Treiber automatisch einmalig beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Kern der Software ist die usbGenericHIDDevice Komponente aus [9].&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von einer Basisklasse wird eine eigene USB Device Klasse erstellt, die dem realen Gerät entspricht und alle seine möglichen Eigenschaften abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die entscheidende Klasse für das HiDTemp Gerät sieht so aus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Parametern &#039;&#039;&#039;VID = 0x16c0 und PID = 0x05df&#039;&#039;&#039; initialisiert.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass keine anderen Hardware Hersteller und ihre Geräte davon beeinträchtigt werden.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur des DS18B20 Sensors im Bereich von -55°C bis +125°C wird dabei als Vorzeichen behaftete ganze Zahl übertragen.&lt;br /&gt;
&lt;br /&gt;
Der Wert kann also bequem in 4 Byte gespeichert werden und muss auf dem Zielsystem nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat laut Datenblatt eine Grundgenauigkeit von +/- 0,5°C, die Auflösung für einem DS18B20 ist 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung des HiDTemp Gerätes arbeitet zusammen mit der c# Software auf einen Windows 7 x64 System seit Wochen zur vollsten Zufriedenheit. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr einfach nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Grund stelle ich meine eigenen Sources auch unter GPL V3, alle anderen Bestandteile sind wie ihr ursprünglicher Autor es vorsieht.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* (1) http://de.wikipedia.org/wiki/Human_Interface_Device&lt;br /&gt;
* (2) http://www.usb.org/developers/hidpage/&lt;br /&gt;
* (3) http://www.obdev.at/products/vusb/index-de.html&lt;br /&gt;
* (4) http://de.wikipedia.org/wiki/Universal_Serial_Bus&lt;br /&gt;
* (5) http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf&lt;br /&gt;
* (6) http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html&lt;br /&gt;
* (7) http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm&lt;br /&gt;
* (8) http://www.microsoft.com/germany/express/products/windows.aspx&lt;br /&gt;
* (9) http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Bitte nicht blind die folgenden Kategorien kopieren ;-)&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70188</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70188"/>
		<updated>2012-12-24T08:18:17Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Firmware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt hat zum Ziel den Bau einen relativ genauen Temperatur Moduls das sehr leicht durch die Verwendung als HID Gerät an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Dazu gehört auch der Wunsch das Gerät explizit mit Windows x64 Systeme zu betreiben und die Anwendungssoftware in c# erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung bestehet wie aus dem Schaltplan ersichtlich ist nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ Atmel Tiny85-20 ist. Als Temperatursensor wird ein Dallas DS18B20 verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mir der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet passt.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt Schutzwiderstände (R1 und R3) die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig aber ist er schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 können auch Dallas DS18S20 oder Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit V-USB realisiert. Der entschiedenen Punkt bei der Firmware ist die Definition des USB HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware welche sogenannten Endpoints es für die Kommunikation gibt und wie mit diesen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier RequestIDs (1-4) mit unterschiedlich langen Informationsblöcken (1-10 Byte), die jeweils als Feature Report realisiert sind.&lt;br /&gt;
&lt;br /&gt;
Ein Feature Report ist zum schreiben und lesen von Daten konzipiert, da er Einstellungen (Features) abfragen oder einstellen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs &amp;quot;1&amp;quot; und &amp;quot;2&amp;quot; können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID &amp;quot;3&amp;quot; kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID &amp;quot;4&amp;quot; übermitteln die während des letzten Messzyklus ermittelte und  zwischengespeicherten Werte des Temperatur Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! RequestID || Aktion&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein Messzyklus wird mit Hilfe einer State Maschine in 10s durchlaufen. Die State Maschine läuft unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID 4 kann nun die USB Software die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host System direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Sensor auf der einen Seite Zeit sich zu erholen um nicht durch zu häufige Abfragen selber zu erhitzen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Seite ist die USB Kommunikation zeitlich völlig frei wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Da das HiDTemp Gerät als HiD Device erkannt wird, installiert Windows seine eigenen HID System Treiber automatisch. &lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert Treiber automatisch einmalig beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Kern der Software ist die usbGenericHIDDevice Komponente aus [9].&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von einer Basisklasse wird eine eigene USB Device Klasse erstellt, die dem realen Gerät entspricht und alle seine möglichen Eigenschaften abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die entscheidende Klasse für das HiDTemp Gerät sieht so aus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Parametern &#039;&#039;&#039;VID = 0x16c0 und PID = 0x05df&#039;&#039;&#039; initialisiert.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass keine anderen Hardware Hersteller und ihre Geräte davon beeinträchtigt werden.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur des DS18B20 Sensors im Bereich von -55°C bis +125°C wird dabei als Vorzeichen behaftete ganze Zahl übertragen.&lt;br /&gt;
&lt;br /&gt;
Der Wert kann also bequem in 4 Byte gespeichert werden und muss auf dem Zielsystem nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat laut Datenblatt eine Grundgenauigkeit von +/- 0,5°C, die Auflösung für einem DS18B20 ist 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung des HiDTemp Gerätes arbeitet zusammen mit der c# Software auf einen Windows 7 x64 System seit Wochen zur vollsten Zufriedenheit. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr einfach nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Grund stelle ich meine eigenen Sources auch unter GPL V3, alle anderen Bestandteile sind wie ihr ursprünglicher Autor es vorsieht.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* (1) http://de.wikipedia.org/wiki/Human_Interface_Device&lt;br /&gt;
* (2) http://www.usb.org/developers/hidpage/&lt;br /&gt;
* (3) http://www.obdev.at/products/vusb/index-de.html&lt;br /&gt;
* (4) http://de.wikipedia.org/wiki/Universal_Serial_Bus&lt;br /&gt;
* (5) http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf&lt;br /&gt;
* (6) http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html&lt;br /&gt;
* (7) http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm&lt;br /&gt;
* (8) http://www.microsoft.com/germany/express/products/windows.aspx&lt;br /&gt;
* (9) http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Bitte nicht blind die folgenden Kategorien kopieren ;-)&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70187</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70187"/>
		<updated>2012-12-24T08:14:06Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Firmware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt hat zum Ziel den Bau einen relativ genauen Temperatur Moduls das sehr leicht durch die Verwendung als HID Gerät an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Dazu gehört auch der Wunsch das Gerät explizit mit Windows x64 Systeme zu betreiben und die Anwendungssoftware in c# erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung bestehet wie aus dem Schaltplan ersichtlich ist nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ Atmel Tiny85-20 ist. Als Temperatursensor wird ein Dallas DS18B20 verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mir der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet passt.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt Schutzwiderstände (R1 und R3) die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig aber ist er schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 können auch Dallas DS18S20 oder Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit V-USB realisiert. Der entschiedenen Punkt bei der Firmware ist die Definition des USB HID Descriptor [7].&lt;br /&gt;
&lt;br /&gt;
Der Descriptor definiert für die USB Hostsoftware welche sogenannten Endpoints es für die Kommunikation gibt und wie mit diesen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor des HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier RequestIDs, die als Feature Report an das Gerät realisiert sind.&lt;br /&gt;
Ein Feature Report sind grundsätzlich zum schreiben und lesen von Daten konzipiert da er Einstellungen (Features) vornehmen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs 1 und 2 können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID 3 kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID 4 übermitteln die während des letzten Messzyklus gemessene und  zwischengespeicherten letzte Temperatur des Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! RequestID || Aktion&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein Messzyklus wird mit Hilfe einer State Maschine in 10s durchlaufen. Die State Maschine läuft unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID 4 kann nun die USB Software die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host System direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Sensor auf der einen Seite Zeit sich zu erholen um nicht durch zu häufige Abfragen selber zu erhitzen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Seite ist die USB Kommunikation zeitlich völlig frei wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Da das HiDTemp Gerät als HiD Device erkannt wird, installiert Windows seine eigenen HID System Treiber automatisch. &lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert Treiber automatisch einmalig beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Kern der Software ist die usbGenericHIDDevice Komponente aus [9].&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von einer Basisklasse wird eine eigene USB Device Klasse erstellt, die dem realen Gerät entspricht und alle seine möglichen Eigenschaften abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die entscheidende Klasse für das HiDTemp Gerät sieht so aus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Parametern &#039;&#039;&#039;VID = 0x16c0 und PID = 0x05df&#039;&#039;&#039; initialisiert.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass keine anderen Hardware Hersteller und ihre Geräte davon beeinträchtigt werden.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur des DS18B20 Sensors im Bereich von -55°C bis +125°C wird dabei als Vorzeichen behaftete ganze Zahl übertragen.&lt;br /&gt;
&lt;br /&gt;
Der Wert kann also bequem in 4 Byte gespeichert werden und muss auf dem Zielsystem nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat laut Datenblatt eine Grundgenauigkeit von +/- 0,5°C, die Auflösung für einem DS18B20 ist 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung des HiDTemp Gerätes arbeitet zusammen mit der c# Software auf einen Windows 7 x64 System seit Wochen zur vollsten Zufriedenheit. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr einfach nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Grund stelle ich meine eigenen Sources auch unter GPL V3, alle anderen Bestandteile sind wie ihr ursprünglicher Autor es vorsieht.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* (1) http://de.wikipedia.org/wiki/Human_Interface_Device&lt;br /&gt;
* (2) http://www.usb.org/developers/hidpage/&lt;br /&gt;
* (3) http://www.obdev.at/products/vusb/index-de.html&lt;br /&gt;
* (4) http://de.wikipedia.org/wiki/Universal_Serial_Bus&lt;br /&gt;
* (5) http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf&lt;br /&gt;
* (6) http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html&lt;br /&gt;
* (7) http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm&lt;br /&gt;
* (8) http://www.microsoft.com/germany/express/products/windows.aspx&lt;br /&gt;
* (9) http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Bitte nicht blind die folgenden Kategorien kopieren ;-)&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70175</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70175"/>
		<updated>2012-12-23T18:44:16Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Referenzen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt hat zum Ziel den Bau einen relativ genauen Temperatur Moduls das sehr leicht durch die Verwendung als HID Gerät an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Dazu gehört auch der Wunsch das Gerät explizit mit Windows x64 Systeme zu betreiben und die Anwendungssoftware in c# erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung bestehet wie aus dem Schaltplan ersichtlich ist nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ Atmel Tiny85-20 ist. Als Temperatursensor wird ein Dallas DS18B20 verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mir der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet passt.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt Schutzwiderstände (R1 und R3) die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig aber ist er schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 können auch Dallas DS18S20 oder Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit V-USB realisiert nun. Der entschiedenen Punkt ist nun die Definition des USB HID Descriptor [7].&lt;br /&gt;
Der Desciptor sagt der USB Hostsoftware welche Endpoints es gibt und wie mit diesen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier RequestIDs, die als Feature Report an das Gerät realisiert sind.&lt;br /&gt;
Ein Feature Report sind grundsätzlich zum schreiben und lesen von Daten konzipiert da er Einstellungen (Features) vornehmen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs 1 und 2 können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID 3 kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID 4 übermitteln die während des letzten Messzyklus gemessene und  zwischengespeicherten letzte Temperatur des Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! RequestID || Aktion&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein Messzyklus wird mit Hilfe einer State Maschine in 10s durchlaufen. Die State Maschine läuft unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID 4 kann nun die USB Software die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host System direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Sensor auf der einen Seite Zeit sich zu erholen um nicht durch zu häufige Abfragen selber zu erhitzen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Seite ist die USB Kommunikation zeitlich völlig frei wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Da das HiDTemp Gerät als HiD Device erkannt wird, installiert Windows seine eigenen HID System Treiber automatisch. &lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert Treiber automatisch einmalig beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Kern der Software ist die usbGenericHIDDevice Komponente aus [9].&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von einer Basisklasse wird eine eigene USB Device Klasse erstellt, die dem realen Gerät entspricht und alle seine möglichen Eigenschaften abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die entscheidende Klasse für das HiDTemp Gerät sieht so aus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Parametern &#039;&#039;&#039;VID = 0x16c0 und PID = 0x05df&#039;&#039;&#039; initialisiert.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass keine anderen Hardware Hersteller und ihre Geräte davon beeinträchtigt werden.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur des DS18B20 Sensors im Bereich von -55°C bis +125°C wird dabei als Vorzeichen behaftete ganze Zahl übertragen.&lt;br /&gt;
&lt;br /&gt;
Der Wert kann also bequem in 4 Byte gespeichert werden und muss auf dem Zielsystem nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat laut Datenblatt eine Grundgenauigkeit von +/- 0,5°C, die Auflösung für einem DS18B20 ist 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung des HiDTemp Gerätes arbeitet zusammen mit der c# Software auf einen Windows 7 x64 System seit Wochen zur vollsten Zufriedenheit. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr einfach nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Grund stelle ich meine eigenen Sources auch unter GPL V3, alle anderen Bestandteile sind wie ihr ursprünglicher Autor es vorsieht.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* (1) http://de.wikipedia.org/wiki/Human_Interface_Device&lt;br /&gt;
* (2) http://www.usb.org/developers/hidpage/&lt;br /&gt;
* (3) http://www.obdev.at/products/vusb/index-de.html&lt;br /&gt;
* (4) http://de.wikipedia.org/wiki/Universal_Serial_Bus&lt;br /&gt;
* (5) http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf&lt;br /&gt;
* (6) http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html&lt;br /&gt;
* (7) http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm&lt;br /&gt;
* (8) http://www.microsoft.com/germany/express/products/windows.aspx&lt;br /&gt;
* (9) http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Bitte nicht blind die folgenden Kategorien kopieren ;-)&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70174</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70174"/>
		<updated>2012-12-23T18:34:45Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Anwendung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt hat zum Ziel den Bau einen relativ genauen Temperatur Moduls das sehr leicht durch die Verwendung als HID Gerät an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Dazu gehört auch der Wunsch das Gerät explizit mit Windows x64 Systeme zu betreiben und die Anwendungssoftware in c# erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung bestehet wie aus dem Schaltplan ersichtlich ist nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ Atmel Tiny85-20 ist. Als Temperatursensor wird ein Dallas DS18B20 verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mir der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet passt.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt Schutzwiderstände (R1 und R3) die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig aber ist er schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 können auch Dallas DS18S20 oder Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit V-USB realisiert nun. Der entschiedenen Punkt ist nun die Definition des USB HID Descriptor [7].&lt;br /&gt;
Der Desciptor sagt der USB Hostsoftware welche Endpoints es gibt und wie mit diesen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier RequestIDs, die als Feature Report an das Gerät realisiert sind.&lt;br /&gt;
Ein Feature Report sind grundsätzlich zum schreiben und lesen von Daten konzipiert da er Einstellungen (Features) vornehmen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs 1 und 2 können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID 3 kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID 4 übermitteln die während des letzten Messzyklus gemessene und  zwischengespeicherten letzte Temperatur des Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! RequestID || Aktion&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein Messzyklus wird mit Hilfe einer State Maschine in 10s durchlaufen. Die State Maschine läuft unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID 4 kann nun die USB Software die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host System direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Sensor auf der einen Seite Zeit sich zu erholen um nicht durch zu häufige Abfragen selber zu erhitzen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Seite ist die USB Kommunikation zeitlich völlig frei wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Da das HiDTemp Gerät als HiD Device erkannt wird, installiert Windows seine eigenen HID System Treiber automatisch. &lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert Treiber automatisch einmalig beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Kern der Software ist die usbGenericHIDDevice Komponente aus [9].&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von einer Basisklasse wird eine eigene USB Device Klasse erstellt, die dem realen Gerät entspricht und alle seine möglichen Eigenschaften abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die entscheidende Klasse für das HiDTemp Gerät sieht so aus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Parametern &#039;&#039;&#039;VID = 0x16c0 und PID = 0x05df&#039;&#039;&#039; initialisiert.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass keine anderen Hardware Hersteller und ihre Geräte davon beeinträchtigt werden.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur des DS18B20 Sensors im Bereich von -55°C bis +125°C wird dabei als Vorzeichen behaftete ganze Zahl übertragen.&lt;br /&gt;
&lt;br /&gt;
Der Wert kann also bequem in 4 Byte gespeichert werden und muss auf dem Zielsystem nur noch durch 10000 geteilt werden, um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat laut Datenblatt eine Grundgenauigkeit von +/- 0,5°C, die Auflösung für einem DS18B20 ist 12Bit also 0.0625°C oder 1/16°C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung des HiDTemp Gerätes arbeitet zusammen mit der c# Software auf einen Windows 7 x64 System seit Wochen zur vollsten Zufriedenheit. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr einfach nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Grund stelle ich meine eigenen Sources auch unter GPL V3, alle anderen Bestandteile sind wie ihr ursprünglicher Autor es vorsieht.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* (1) http://de.wikipedia.org/wiki/Human_Interface_Device&lt;br /&gt;
* (2) http://www.usb.org/developers/hidpage/&lt;br /&gt;
* (3) http://www.obdev.at/products/vusb/index-de.html&lt;br /&gt;
* (4) http://de.wikipedia.org/wiki/Universal_Serial_Bus&lt;br /&gt;
* (5) http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf&lt;br /&gt;
* (6) http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html&lt;br /&gt;
* (7) http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm&lt;br /&gt;
* (8) http://www.microsoft.com/germany/express/products/windows.aspx&lt;br /&gt;
* (9) http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Bitte nicht blind die folgenden Kategorien kopieren ;-)&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70173</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70173"/>
		<updated>2012-12-23T18:28:09Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Ziel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt hat zum Ziel den Bau einen relativ genauen Temperatur Moduls das sehr leicht durch die Verwendung als HID Gerät an typische PC Systeme angeschlossen werden kann.&lt;br /&gt;
&lt;br /&gt;
Dazu gehört auch der Wunsch das Gerät explizit mit Windows x64 Systeme zu betreiben und die Anwendungssoftware in c# erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung bestehet wie aus dem Schaltplan ersichtlich ist nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ Atmel Tiny85-20 ist. Als Temperatursensor wird ein Dallas DS18B20 verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mir der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet passt.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt Schutzwiderstände (R1 und R3) die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig aber ist er schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 können auch Dallas DS18S20 oder Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit V-USB realisiert nun. Der entschiedenen Punkt ist nun die Definition des USB HID Descriptor [7].&lt;br /&gt;
Der Desciptor sagt der USB Hostsoftware welche Endpoints es gibt und wie mit diesen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier RequestIDs, die als Feature Report an das Gerät realisiert sind.&lt;br /&gt;
Ein Feature Report sind grundsätzlich zum schreiben und lesen von Daten konzipiert da er Einstellungen (Features) vornehmen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs 1 und 2 können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID 3 kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID 4 übermitteln die während des letzten Messzyklus gemessene und  zwischengespeicherten letzte Temperatur des Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! RequestID || Aktion&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein Messzyklus wird mit Hilfe einer State Maschine in 10s durchlaufen. Die State Maschine läuft unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID 4 kann nun die USB Software die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host System direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Sensor auf der einen Seite Zeit sich zu erholen um nicht durch zu häufige Abfragen selber zu erhitzen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Seite ist die USB Kommunikation zeitlich völlig frei wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Da das HiDTemp Gerät als HiD Device erkannt wird, installiert Windows seine eigenen HID System Treiber automatisch. &lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert Treiber automatisch einmalig beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Kern der Software ist die usbGenericHIDDevice Komponente aus [9].&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von einer Basisklasse wird eine eigene USB Device Klasse erstellt, die dem realen Gerät entspricht und alle seine möglichen Eigenschaften abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die entscheidende Klasse für das HiDTemp Gerät sieht so aus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Parametern &#039;&#039;&#039;VID = 0x16c0 und PID = 0x05df&#039;&#039;&#039; initialisiert.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass keine anderen Hardware Hersteller und ihre Geräte davon beeinträchtigt werden.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur wird dabei als Vorzeichen behaftete ganze Zahl übertragen. Der Wert kann also bequem in 4 Byte übertragen werden und muss auf dem Zielsystem  nur noch durch 10000 geteilt werden um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat laut Datenblatt eine Grundgenauigkeit von +/- 0,5 °C , die Auflösung entspricht bei einem DS18B20 12 Bit also 0.0625 oder 1/16 °C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung des HiDTemp Gerätes arbeitet zusammen mit der c# Software auf einen Windows 7 x64 System seit Wochen zur vollsten Zufriedenheit. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr einfach nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Grund stelle ich meine eigenen Sources auch unter GPL V3, alle anderen Bestandteile sind wie ihr ursprünglicher Autor es vorsieht.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* (1) http://de.wikipedia.org/wiki/Human_Interface_Device&lt;br /&gt;
* (2) http://www.usb.org/developers/hidpage/&lt;br /&gt;
* (3) http://www.obdev.at/products/vusb/index-de.html&lt;br /&gt;
* (4) http://de.wikipedia.org/wiki/Universal_Serial_Bus&lt;br /&gt;
* (5) http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf&lt;br /&gt;
* (6) http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html&lt;br /&gt;
* (7) http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm&lt;br /&gt;
* (8) http://www.microsoft.com/germany/express/products/windows.aspx&lt;br /&gt;
* (9) http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Bitte nicht blind die folgenden Kategorien kopieren ;-)&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70172</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70172"/>
		<updated>2012-12-23T18:14:20Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Aufbau */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt hat zum Ziel den Bau einen relativ genauen Temperatur Moduls das sehr leicht durch die Verwendung als HID Gerät an typische PC Systeme angeschlossen werden kann. Dazu gehört auch der Wunsch das Gerät explizit mit Windows x64 Systeme zu betreiben und die Anwendungssoftware in c# erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung bestehet wie aus dem Schaltplan ersichtlich ist nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ Atmel Tiny85-20 ist. Als Temperatursensor wird ein Dallas DS18B20 verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mir der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet passt.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt Schutzwiderstände (R1 und R3) die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig aber ist er schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 können auch Dallas DS18S20 oder Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit V-USB realisiert nun. Der entschiedenen Punkt ist nun die Definition des USB HID Descriptor [7].&lt;br /&gt;
Der Desciptor sagt der USB Hostsoftware welche Endpoints es gibt und wie mit diesen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier RequestIDs, die als Feature Report an das Gerät realisiert sind.&lt;br /&gt;
Ein Feature Report sind grundsätzlich zum schreiben und lesen von Daten konzipiert da er Einstellungen (Features) vornehmen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs 1 und 2 können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID 3 kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID 4 übermitteln die während des letzten Messzyklus gemessene und  zwischengespeicherten letzte Temperatur des Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! RequestID || Aktion&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein Messzyklus wird mit Hilfe einer State Maschine in 10s durchlaufen. Die State Maschine läuft unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID 4 kann nun die USB Software die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host System direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Sensor auf der einen Seite Zeit sich zu erholen um nicht durch zu häufige Abfragen selber zu erhitzen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Seite ist die USB Kommunikation zeitlich völlig frei wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben: &#039;&#039;&#039;[[Datei:HiD-Temp-oben-klein.jpg|400px]]&#039;&#039;&#039;    von unten: &#039;&#039;&#039;[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Da das HiDTemp Gerät als HiD Device erkannt wird, installiert Windows seine eigenen HID System Treiber automatisch. &lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert Treiber automatisch einmalig beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Kern der Software ist die usbGenericHIDDevice Komponente aus [9].&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von einer Basisklasse wird eine eigene USB Device Klasse erstellt, die dem realen Gerät entspricht und alle seine möglichen Eigenschaften abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die entscheidende Klasse für das HiDTemp Gerät sieht so aus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Parametern &#039;&#039;&#039;VID = 0x16c0 und PID = 0x05df&#039;&#039;&#039; initialisiert.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass keine anderen Hardware Hersteller und ihre Geräte davon beeinträchtigt werden.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur wird dabei als Vorzeichen behaftete ganze Zahl übertragen. Der Wert kann also bequem in 4 Byte übertragen werden und muss auf dem Zielsystem  nur noch durch 10000 geteilt werden um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat laut Datenblatt eine Grundgenauigkeit von +/- 0,5 °C , die Auflösung entspricht bei einem DS18B20 12 Bit also 0.0625 oder 1/16 °C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung des HiDTemp Gerätes arbeitet zusammen mit der c# Software auf einen Windows 7 x64 System seit Wochen zur vollsten Zufriedenheit. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr einfach nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Grund stelle ich meine eigenen Sources auch unter GPL V3, alle anderen Bestandteile sind wie ihr ursprünglicher Autor es vorsieht.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* (1) http://de.wikipedia.org/wiki/Human_Interface_Device&lt;br /&gt;
* (2) http://www.usb.org/developers/hidpage/&lt;br /&gt;
* (3) http://www.obdev.at/products/vusb/index-de.html&lt;br /&gt;
* (4) http://de.wikipedia.org/wiki/Universal_Serial_Bus&lt;br /&gt;
* (5) http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf&lt;br /&gt;
* (6) http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html&lt;br /&gt;
* (7) http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm&lt;br /&gt;
* (8) http://www.microsoft.com/germany/express/products/windows.aspx&lt;br /&gt;
* (9) http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Bitte nicht blind die folgenden Kategorien kopieren ;-)&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70171</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70171"/>
		<updated>2012-12-23T18:12:07Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Anwendung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt hat zum Ziel den Bau einen relativ genauen Temperatur Moduls das sehr leicht durch die Verwendung als HID Gerät an typische PC Systeme angeschlossen werden kann. Dazu gehört auch der Wunsch das Gerät explizit mit Windows x64 Systeme zu betreiben und die Anwendungssoftware in c# erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung bestehet wie aus dem Schaltplan ersichtlich ist nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ Atmel Tiny85-20 ist. Als Temperatursensor wird ein Dallas DS18B20 verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mir der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet passt.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt Schutzwiderstände (R1 und R3) die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig aber ist er schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 können auch Dallas DS18S20 oder Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit V-USB realisiert nun. Der entschiedenen Punkt ist nun die Definition des USB HID Descriptor [7].&lt;br /&gt;
Der Desciptor sagt der USB Hostsoftware welche Endpoints es gibt und wie mit diesen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier RequestIDs, die als Feature Report an das Gerät realisiert sind.&lt;br /&gt;
Ein Feature Report sind grundsätzlich zum schreiben und lesen von Daten konzipiert da er Einstellungen (Features) vornehmen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs 1 und 2 können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID 3 kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID 4 übermitteln die während des letzten Messzyklus gemessene und  zwischengespeicherten letzte Temperatur des Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! RequestID || Aktion&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein Messzyklus wird mit Hilfe einer State Maschine in 10s durchlaufen. Die State Maschine läuft unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID 4 kann nun die USB Software die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host System direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Sensor auf der einen Seite Zeit sich zu erholen um nicht durch zu häufige Abfragen selber zu erhitzen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Seite ist die USB Kommunikation zeitlich völlig frei wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben:&#039;&#039;&#039;&lt;br /&gt;
[[Datei:HiD-Temp-oben-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von unten:&#039;&#039;&#039;&lt;br /&gt;
[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Da das HiDTemp Gerät als HiD Device erkannt wird, installiert Windows seine eigenen HID System Treiber automatisch. &lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert Treiber automatisch einmalig beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Kern der Software ist die usbGenericHIDDevice Komponente aus [9].&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von einer Basisklasse wird eine eigene USB Device Klasse erstellt, die dem realen Gerät entspricht und alle seine möglichen Eigenschaften abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die entscheidende Klasse für das HiDTemp Gerät sieht so aus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Parametern &#039;&#039;&#039;VID = 0x16c0 und PID = 0x05df&#039;&#039;&#039; initialisiert.&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich &#039;&#039;&#039;absolut sicher&#039;&#039;&#039; ist, dass keine anderen Hardware Hersteller und ihre Geräte davon beeinträchtigt werden.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur wird dabei als Vorzeichen behaftete ganze Zahl übertragen. Der Wert kann also bequem in 4 Byte übertragen werden und muss auf dem Zielsystem  nur noch durch 10000 geteilt werden um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat laut Datenblatt eine Grundgenauigkeit von +/- 0,5 °C , die Auflösung entspricht bei einem DS18B20 12 Bit also 0.0625 oder 1/16 °C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung des HiDTemp Gerätes arbeitet zusammen mit der c# Software auf einen Windows 7 x64 System seit Wochen zur vollsten Zufriedenheit. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr einfach nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Grund stelle ich meine eigenen Sources auch unter GPL V3, alle anderen Bestandteile sind wie ihr ursprünglicher Autor es vorsieht.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* (1) http://de.wikipedia.org/wiki/Human_Interface_Device&lt;br /&gt;
* (2) http://www.usb.org/developers/hidpage/&lt;br /&gt;
* (3) http://www.obdev.at/products/vusb/index-de.html&lt;br /&gt;
* (4) http://de.wikipedia.org/wiki/Universal_Serial_Bus&lt;br /&gt;
* (5) http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf&lt;br /&gt;
* (6) http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html&lt;br /&gt;
* (7) http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm&lt;br /&gt;
* (8) http://www.microsoft.com/germany/express/products/windows.aspx&lt;br /&gt;
* (9) http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Bitte nicht blind die folgenden Kategorien kopieren ;-)&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70170</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70170"/>
		<updated>2012-12-23T18:09:37Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Anwendung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt hat zum Ziel den Bau einen relativ genauen Temperatur Moduls das sehr leicht durch die Verwendung als HID Gerät an typische PC Systeme angeschlossen werden kann. Dazu gehört auch der Wunsch das Gerät explizit mit Windows x64 Systeme zu betreiben und die Anwendungssoftware in c# erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung bestehet wie aus dem Schaltplan ersichtlich ist nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ Atmel Tiny85-20 ist. Als Temperatursensor wird ein Dallas DS18B20 verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mir der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet passt.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt Schutzwiderstände (R1 und R3) die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig aber ist er schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 können auch Dallas DS18S20 oder Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit V-USB realisiert nun. Der entschiedenen Punkt ist nun die Definition des USB HID Descriptor [7].&lt;br /&gt;
Der Desciptor sagt der USB Hostsoftware welche Endpoints es gibt und wie mit diesen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier RequestIDs, die als Feature Report an das Gerät realisiert sind.&lt;br /&gt;
Ein Feature Report sind grundsätzlich zum schreiben und lesen von Daten konzipiert da er Einstellungen (Features) vornehmen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs 1 und 2 können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID 3 kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID 4 übermitteln die während des letzten Messzyklus gemessene und  zwischengespeicherten letzte Temperatur des Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! RequestID || Aktion&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein Messzyklus wird mit Hilfe einer State Maschine in 10s durchlaufen. Die State Maschine läuft unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID 4 kann nun die USB Software die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host System direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Sensor auf der einen Seite Zeit sich zu erholen um nicht durch zu häufige Abfragen selber zu erhitzen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Seite ist die USB Kommunikation zeitlich völlig frei wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben:&#039;&#039;&#039;&lt;br /&gt;
[[Datei:HiD-Temp-oben-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von unten:&#039;&#039;&#039;&lt;br /&gt;
[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Da das HiDTemp Gerät als HiD Device erkannt wird, installiert Windows seine eigenen HID System Treiber automatisch. &lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert Treiber automatisch einmalig beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Kern der Software ist die usbGenericHIDDevice Komponente aus [9].&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von einer Basisklasse wird eine eigene USB Device Klasse erstellt, die dem realen Gerät entspricht und alle seine möglichen Eigenschaften abbildet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die entscheidende Klasse für das HiDTemp Gerät sieht so aus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Parametern VID = 0x16c0 und PID = 0x05df initialisiert. Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich absolut sicher ist, dass keine anderen Hersteller und Geräte davon beeinträchtigt werden.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur wird dabei als Vorzeichen behaftete ganze Zahl übertragen. Der Wert kann also bequem in 4 Byte übertragen werden und muss auf dem Zielsystem  nur noch durch 10000 geteilt werden um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat laut Datenblatt eine Grundgenauigkeit von +/- 0,5 °C , die Auflösung entspricht bei einem DS18B20 12 Bit also 0.0625 oder 1/16 °C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung des HiDTemp Gerätes arbeitet zusammen mit der c# Software auf einen Windows 7 x64 System seit Wochen zur vollsten Zufriedenheit. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr einfach nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Grund stelle ich meine eigenen Sources auch unter GPL V3, alle anderen Bestandteile sind wie ihr ursprünglicher Autor es vorsieht.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* (1) http://de.wikipedia.org/wiki/Human_Interface_Device&lt;br /&gt;
* (2) http://www.usb.org/developers/hidpage/&lt;br /&gt;
* (3) http://www.obdev.at/products/vusb/index-de.html&lt;br /&gt;
* (4) http://de.wikipedia.org/wiki/Universal_Serial_Bus&lt;br /&gt;
* (5) http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf&lt;br /&gt;
* (6) http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html&lt;br /&gt;
* (7) http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm&lt;br /&gt;
* (8) http://www.microsoft.com/germany/express/products/windows.aspx&lt;br /&gt;
* (9) http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Bitte nicht blind die folgenden Kategorien kopieren ;-)&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70169</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70169"/>
		<updated>2012-12-23T18:09:16Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Anwendung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt hat zum Ziel den Bau einen relativ genauen Temperatur Moduls das sehr leicht durch die Verwendung als HID Gerät an typische PC Systeme angeschlossen werden kann. Dazu gehört auch der Wunsch das Gerät explizit mit Windows x64 Systeme zu betreiben und die Anwendungssoftware in c# erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung bestehet wie aus dem Schaltplan ersichtlich ist nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ Atmel Tiny85-20 ist. Als Temperatursensor wird ein Dallas DS18B20 verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mir der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet passt.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt Schutzwiderstände (R1 und R3) die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig aber ist er schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 können auch Dallas DS18S20 oder Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit V-USB realisiert nun. Der entschiedenen Punkt ist nun die Definition des USB HID Descriptor [7].&lt;br /&gt;
Der Desciptor sagt der USB Hostsoftware welche Endpoints es gibt und wie mit diesen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier RequestIDs, die als Feature Report an das Gerät realisiert sind.&lt;br /&gt;
Ein Feature Report sind grundsätzlich zum schreiben und lesen von Daten konzipiert da er Einstellungen (Features) vornehmen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs 1 und 2 können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID 3 kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID 4 übermitteln die während des letzten Messzyklus gemessene und  zwischengespeicherten letzte Temperatur des Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! RequestID || Aktion&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein Messzyklus wird mit Hilfe einer State Maschine in 10s durchlaufen. Die State Maschine läuft unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID 4 kann nun die USB Software die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host System direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Sensor auf der einen Seite Zeit sich zu erholen um nicht durch zu häufige Abfragen selber zu erhitzen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Seite ist die USB Kommunikation zeitlich völlig frei wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben:&#039;&#039;&#039;&lt;br /&gt;
[[Datei:HiD-Temp-oben-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von unten:&#039;&#039;&#039;&lt;br /&gt;
[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Da das HiDTemp Gerät als HiD Device erkannt wird, installiert Windows seine eigenen HID System Treiber automatisch. &lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert Treiber automatisch einmalig beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Kern der Software ist die usbGenericHIDDevice Komponente aus [9].&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von einer Basisklasse wird eine eigene USB Device Klasse erstellt, die dem realen Gerät entspricht und alle seine möglichen Eigenschaften abbildet.&lt;br /&gt;
&lt;br /&gt;
Die entscheidende Klasse für das HiDTemp Gerät sieht so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Parametern VID = 0x16c0 und PID = 0x05df initialisiert. Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich absolut sicher ist, dass keine anderen Hersteller und Geräte davon beeinträchtigt werden.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur wird dabei als Vorzeichen behaftete ganze Zahl übertragen. Der Wert kann also bequem in 4 Byte übertragen werden und muss auf dem Zielsystem  nur noch durch 10000 geteilt werden um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat laut Datenblatt eine Grundgenauigkeit von +/- 0,5 °C , die Auflösung entspricht bei einem DS18B20 12 Bit also 0.0625 oder 1/16 °C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung des HiDTemp Gerätes arbeitet zusammen mit der c# Software auf einen Windows 7 x64 System seit Wochen zur vollsten Zufriedenheit. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr einfach nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Grund stelle ich meine eigenen Sources auch unter GPL V3, alle anderen Bestandteile sind wie ihr ursprünglicher Autor es vorsieht.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* (1) http://de.wikipedia.org/wiki/Human_Interface_Device&lt;br /&gt;
* (2) http://www.usb.org/developers/hidpage/&lt;br /&gt;
* (3) http://www.obdev.at/products/vusb/index-de.html&lt;br /&gt;
* (4) http://de.wikipedia.org/wiki/Universal_Serial_Bus&lt;br /&gt;
* (5) http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf&lt;br /&gt;
* (6) http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html&lt;br /&gt;
* (7) http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm&lt;br /&gt;
* (8) http://www.microsoft.com/germany/express/products/windows.aspx&lt;br /&gt;
* (9) http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Bitte nicht blind die folgenden Kategorien kopieren ;-)&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70168</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70168"/>
		<updated>2012-12-23T18:08:14Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Treiber */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt hat zum Ziel den Bau einen relativ genauen Temperatur Moduls das sehr leicht durch die Verwendung als HID Gerät an typische PC Systeme angeschlossen werden kann. Dazu gehört auch der Wunsch das Gerät explizit mit Windows x64 Systeme zu betreiben und die Anwendungssoftware in c# erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung bestehet wie aus dem Schaltplan ersichtlich ist nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ Atmel Tiny85-20 ist. Als Temperatursensor wird ein Dallas DS18B20 verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mir der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet passt.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt Schutzwiderstände (R1 und R3) die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig aber ist er schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 können auch Dallas DS18S20 oder Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit V-USB realisiert nun. Der entschiedenen Punkt ist nun die Definition des USB HID Descriptor [7].&lt;br /&gt;
Der Desciptor sagt der USB Hostsoftware welche Endpoints es gibt und wie mit diesen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier RequestIDs, die als Feature Report an das Gerät realisiert sind.&lt;br /&gt;
Ein Feature Report sind grundsätzlich zum schreiben und lesen von Daten konzipiert da er Einstellungen (Features) vornehmen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs 1 und 2 können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID 3 kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID 4 übermitteln die während des letzten Messzyklus gemessene und  zwischengespeicherten letzte Temperatur des Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! RequestID || Aktion&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein Messzyklus wird mit Hilfe einer State Maschine in 10s durchlaufen. Die State Maschine läuft unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID 4 kann nun die USB Software die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host System direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Sensor auf der einen Seite Zeit sich zu erholen um nicht durch zu häufige Abfragen selber zu erhitzen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Seite ist die USB Kommunikation zeitlich völlig frei wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben:&#039;&#039;&#039;&lt;br /&gt;
[[Datei:HiD-Temp-oben-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von unten:&#039;&#039;&#039;&lt;br /&gt;
[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Da das HiDTemp Gerät als HiD Device erkannt wird, installiert Windows seine eigenen HID System Treiber automatisch. &lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert Treiber automatisch einmalig beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenen Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Kern der Software ist die usbGenericHIDDevice Komponente aus [9].&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von einer Basisklasse, wird eine eigene USB Device Klasse erstellt die dem realen Gerät entspricht und alle seine möglichen Eigenschaften abbildet.&lt;br /&gt;
&lt;br /&gt;
Die entscheidende Klasse für das HiDTemp Gerät sieht so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Parametern VID = 0x16c0 und PID = 0x05df initialisiert. Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich absolut sicher ist, dass keine anderen Hersteller und Geräte davon beeinträchtigt werden.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur wird dabei als Vorzeichen behaftete ganze Zahl übertragen. Der Wert kann also bequem in 4 Byte übertragen werden und muss auf dem Zielsystem  nur noch durch 10000 geteilt werden um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat laut Datenblatt eine Grundgenauigkeit von +/- 0,5 °C , die Auflösung entspricht bei einem DS18B20 12 Bit also 0.0625 oder 1/16 °C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung des HiDTemp Gerätes arbeitet zusammen mit der c# Software auf einen Windows 7 x64 System seit Wochen zur vollsten Zufriedenheit. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr einfach nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Grund stelle ich meine eigenen Sources auch unter GPL V3, alle anderen Bestandteile sind wie ihr ursprünglicher Autor es vorsieht.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* (1) http://de.wikipedia.org/wiki/Human_Interface_Device&lt;br /&gt;
* (2) http://www.usb.org/developers/hidpage/&lt;br /&gt;
* (3) http://www.obdev.at/products/vusb/index-de.html&lt;br /&gt;
* (4) http://de.wikipedia.org/wiki/Universal_Serial_Bus&lt;br /&gt;
* (5) http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf&lt;br /&gt;
* (6) http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html&lt;br /&gt;
* (7) http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm&lt;br /&gt;
* (8) http://www.microsoft.com/germany/express/products/windows.aspx&lt;br /&gt;
* (9) http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Bitte nicht blind die folgenden Kategorien kopieren ;-)&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70167</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70167"/>
		<updated>2012-12-23T18:07:10Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Anwendung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt hat zum Ziel den Bau einen relativ genauen Temperatur Moduls das sehr leicht durch die Verwendung als HID Gerät an typische PC Systeme angeschlossen werden kann. Dazu gehört auch der Wunsch das Gerät explizit mit Windows x64 Systeme zu betreiben und die Anwendungssoftware in c# erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung bestehet wie aus dem Schaltplan ersichtlich ist nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ Atmel Tiny85-20 ist. Als Temperatursensor wird ein Dallas DS18B20 verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mir der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet passt.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt Schutzwiderstände (R1 und R3) die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig aber ist er schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 können auch Dallas DS18S20 oder Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit V-USB realisiert nun. Der entschiedenen Punkt ist nun die Definition des USB HID Descriptor [7].&lt;br /&gt;
Der Desciptor sagt der USB Hostsoftware welche Endpoints es gibt und wie mit diesen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier RequestIDs, die als Feature Report an das Gerät realisiert sind.&lt;br /&gt;
Ein Feature Report sind grundsätzlich zum schreiben und lesen von Daten konzipiert da er Einstellungen (Features) vornehmen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs 1 und 2 können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID 3 kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID 4 übermitteln die während des letzten Messzyklus gemessene und  zwischengespeicherten letzte Temperatur des Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! RequestID || Aktion&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein Messzyklus wird mit Hilfe einer State Maschine in 10s durchlaufen. Die State Maschine läuft unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID 4 kann nun die USB Software die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host System direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Sensor auf der einen Seite Zeit sich zu erholen um nicht durch zu häufige Abfragen selber zu erhitzen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Seite ist die USB Kommunikation zeitlich völlig frei wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben:&#039;&#039;&#039;&lt;br /&gt;
[[Datei:HiD-Temp-oben-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von unten:&#039;&#039;&#039;&lt;br /&gt;
[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Da das HiDTemp Gerät als HiD Device erkannt wird, installiert Windows seine eigenen HID System Treiber automatisch. &lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert Treiber automatisch einmalig beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenem Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keinerlei spezial Komponenten benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Kern der Software ist die usbGenericHIDDevice Komponente aus [9].&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von einer Basisklasse, wird eine eigene USB Device Klasse erstellt die dem realen Gerät entspricht und alle seine möglichen Eigenschaften abbildet.&lt;br /&gt;
&lt;br /&gt;
Die entscheidende Klasse für das HiDTemp Gerät sieht so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Parametern VID = 0x16c0 und PID = 0x05df initialisiert. Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich absolut sicher ist, dass keine anderen Hersteller und Geräte davon beeinträchtigt werden.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur wird dabei als Vorzeichen behaftete ganze Zahl übertragen. Der Wert kann also bequem in 4 Byte übertragen werden und muss auf dem Zielsystem  nur noch durch 10000 geteilt werden um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat laut Datenblatt eine Grundgenauigkeit von +/- 0,5 °C , die Auflösung entspricht bei einem DS18B20 12 Bit also 0.0625 oder 1/16 °C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung des HiDTemp Gerätes arbeitet zusammen mit der c# Software auf einen Windows 7 x64 System seit Wochen zur vollsten Zufriedenheit. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr einfach nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Grund stelle ich meine eigenen Sources auch unter GPL V3, alle anderen Bestandteile sind wie ihr ursprünglicher Autor es vorsieht.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* (1) http://de.wikipedia.org/wiki/Human_Interface_Device&lt;br /&gt;
* (2) http://www.usb.org/developers/hidpage/&lt;br /&gt;
* (3) http://www.obdev.at/products/vusb/index-de.html&lt;br /&gt;
* (4) http://de.wikipedia.org/wiki/Universal_Serial_Bus&lt;br /&gt;
* (5) http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf&lt;br /&gt;
* (6) http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html&lt;br /&gt;
* (7) http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm&lt;br /&gt;
* (8) http://www.microsoft.com/germany/express/products/windows.aspx&lt;br /&gt;
* (9) http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Bitte nicht blind die folgenden Kategorien kopieren ;-)&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70166</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70166"/>
		<updated>2012-12-23T18:05:08Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Schaltung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt hat zum Ziel den Bau einen relativ genauen Temperatur Moduls das sehr leicht durch die Verwendung als HID Gerät an typische PC Systeme angeschlossen werden kann. Dazu gehört auch der Wunsch das Gerät explizit mit Windows x64 Systeme zu betreiben und die Anwendungssoftware in c# erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung bestehet wie aus dem Schaltplan ersichtlich ist nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ Atmel Tiny85-20 ist. Als Temperatursensor wird ein Dallas DS18B20 verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mir der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet passt.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt Schutzwiderstände (R1 und R3) die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig aber ist er schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert, wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 können auch Dallas DS18S20 oder Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit V-USB realisiert nun. Der entschiedenen Punkt ist nun die Definition des USB HID Descriptor [7].&lt;br /&gt;
Der Desciptor sagt der USB Hostsoftware welche Endpoints es gibt und wie mit diesen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier RequestIDs, die als Feature Report an das Gerät realisiert sind.&lt;br /&gt;
Ein Feature Report sind grundsätzlich zum schreiben und lesen von Daten konzipiert da er Einstellungen (Features) vornehmen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs 1 und 2 können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID 3 kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID 4 übermitteln die während des letzten Messzyklus gemessene und  zwischengespeicherten letzte Temperatur des Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! RequestID || Aktion&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein Messzyklus wird mit Hilfe einer State Maschine in 10s durchlaufen. Die State Maschine läuft unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID 4 kann nun die USB Software die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host System direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Sensor auf der einen Seite Zeit sich zu erholen um nicht durch zu häufige Abfragen selber zu erhitzen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Seite ist die USB Kommunikation zeitlich völlig frei wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben:&#039;&#039;&#039;&lt;br /&gt;
[[Datei:HiD-Temp-oben-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von unten:&#039;&#039;&#039;&lt;br /&gt;
[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Da das HiDTemp Gerät als HiD Device erkannt wird, installiert Windows seine eigenen HID System Treiber automatisch. &lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert Treiber automatisch einmalig beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenem Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keine speziellen Anforderungen benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Kern der Software ist die usbGenericHIDDevice Komponente aus [9].&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von einer Basisklasse, wird eine eigene USB Device Klasse erstellt die dem realen Gerät entspricht und alle seine möglichen Eigenschaften abbildet.&lt;br /&gt;
&lt;br /&gt;
Die entscheidende Klasse für das HiDTemp Gerät sieht so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Parametern VID = 0x16c0 und PID = 0x05df initialisiert. Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich absolut sicher ist, dass keine anderen Hersteller und Geräte davon beeinträchtigt werden.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur wird dabei als Vorzeichen behaftete ganze Zahl übertragen. Der Wert kann also bequem in 4 Byte übertragen werden und muss auf dem Zielsystem  nur noch durch 10000 geteilt werden um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat laut Datenblatt eine Grundgenauigkeit von +/- 0,5 °C , die Auflösung entspricht bei einem DS18B20 12 Bit also 0.0625 oder 1/16 °C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung des HiDTemp Gerätes arbeitet zusammen mit der c# Software auf einen Windows 7 x64 System seit Wochen zur vollsten Zufriedenheit. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr einfach nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Grund stelle ich meine eigenen Sources auch unter GPL V3, alle anderen Bestandteile sind wie ihr ursprünglicher Autor es vorsieht.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* (1) http://de.wikipedia.org/wiki/Human_Interface_Device&lt;br /&gt;
* (2) http://www.usb.org/developers/hidpage/&lt;br /&gt;
* (3) http://www.obdev.at/products/vusb/index-de.html&lt;br /&gt;
* (4) http://de.wikipedia.org/wiki/Universal_Serial_Bus&lt;br /&gt;
* (5) http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf&lt;br /&gt;
* (6) http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html&lt;br /&gt;
* (7) http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm&lt;br /&gt;
* (8) http://www.microsoft.com/germany/express/products/windows.aspx&lt;br /&gt;
* (9) http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Bitte nicht blind die folgenden Kategorien kopieren ;-)&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70165</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70165"/>
		<updated>2012-12-23T18:04:43Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Schaltung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt hat zum Ziel den Bau einen relativ genauen Temperatur Moduls das sehr leicht durch die Verwendung als HID Gerät an typische PC Systeme angeschlossen werden kann. Dazu gehört auch der Wunsch das Gerät explizit mit Windows x64 Systeme zu betreiben und die Anwendungssoftware in c# erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung bestehet wie aus dem Schaltplan ersichtlich ist nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ Atmel Tiny85-20 ist. Als Temperatursensor wird ein Dallas DS18B20 verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mir der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet passt.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt Schutzwiderstände (R1 und R3) die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig aber ist er schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 können auch Dallas DS18S20 oder Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit V-USB realisiert nun. Der entschiedenen Punkt ist nun die Definition des USB HID Descriptor [7].&lt;br /&gt;
Der Desciptor sagt der USB Hostsoftware welche Endpoints es gibt und wie mit diesen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier RequestIDs, die als Feature Report an das Gerät realisiert sind.&lt;br /&gt;
Ein Feature Report sind grundsätzlich zum schreiben und lesen von Daten konzipiert da er Einstellungen (Features) vornehmen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs 1 und 2 können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID 3 kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID 4 übermitteln die während des letzten Messzyklus gemessene und  zwischengespeicherten letzte Temperatur des Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! RequestID || Aktion&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein Messzyklus wird mit Hilfe einer State Maschine in 10s durchlaufen. Die State Maschine läuft unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID 4 kann nun die USB Software die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host System direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Sensor auf der einen Seite Zeit sich zu erholen um nicht durch zu häufige Abfragen selber zu erhitzen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Seite ist die USB Kommunikation zeitlich völlig frei wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben:&#039;&#039;&#039;&lt;br /&gt;
[[Datei:HiD-Temp-oben-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von unten:&#039;&#039;&#039;&lt;br /&gt;
[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Da das HiDTemp Gerät als HiD Device erkannt wird, installiert Windows seine eigenen HID System Treiber automatisch. &lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert Treiber automatisch einmalig beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenem Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keine speziellen Anforderungen benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Kern der Software ist die usbGenericHIDDevice Komponente aus [9].&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von einer Basisklasse, wird eine eigene USB Device Klasse erstellt die dem realen Gerät entspricht und alle seine möglichen Eigenschaften abbildet.&lt;br /&gt;
&lt;br /&gt;
Die entscheidende Klasse für das HiDTemp Gerät sieht so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Parametern VID = 0x16c0 und PID = 0x05df initialisiert. Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich absolut sicher ist, dass keine anderen Hersteller und Geräte davon beeinträchtigt werden.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur wird dabei als Vorzeichen behaftete ganze Zahl übertragen. Der Wert kann also bequem in 4 Byte übertragen werden und muss auf dem Zielsystem  nur noch durch 10000 geteilt werden um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat laut Datenblatt eine Grundgenauigkeit von +/- 0,5 °C , die Auflösung entspricht bei einem DS18B20 12 Bit also 0.0625 oder 1/16 °C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung des HiDTemp Gerätes arbeitet zusammen mit der c# Software auf einen Windows 7 x64 System seit Wochen zur vollsten Zufriedenheit. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr einfach nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Grund stelle ich meine eigenen Sources auch unter GPL V3, alle anderen Bestandteile sind wie ihr ursprünglicher Autor es vorsieht.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* (1) http://de.wikipedia.org/wiki/Human_Interface_Device&lt;br /&gt;
* (2) http://www.usb.org/developers/hidpage/&lt;br /&gt;
* (3) http://www.obdev.at/products/vusb/index-de.html&lt;br /&gt;
* (4) http://de.wikipedia.org/wiki/Universal_Serial_Bus&lt;br /&gt;
* (5) http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf&lt;br /&gt;
* (6) http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html&lt;br /&gt;
* (7) http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm&lt;br /&gt;
* (8) http://www.microsoft.com/germany/express/products/windows.aspx&lt;br /&gt;
* (9) http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Bitte nicht blind die folgenden Kategorien kopieren ;-)&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70164</id>
		<title>HiDTemp</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=HiDTemp&amp;diff=70164"/>
		<updated>2012-12-23T18:03:38Z</updated>

		<summary type="html">&lt;p&gt;Odiwan: /* Schaltung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Michael Odenwald&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein Mini Temperatur Messmodul mit USB Anschluss zur Kommunikation via Windows System eigener HiD Treiber.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die USB Schnittstelle gehört sicherlich zu den anspruchsvolleren Schnittstellen an einem typischen PC System.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Prototypen Schaltungen und auch die Anwendungssoftware ist dabei im laufe der Jahre durch die Unterstützung der Hersteller / OpenSource Community immer leichter geworden. &lt;br /&gt;
&lt;br /&gt;
Einzig und allein die Treiber für die Ansteuerung der USB Geräte stellen nach wie vor eine Hürde da, die es bei der Entwicklung zu überwinden gilt.&lt;br /&gt;
&lt;br /&gt;
Ein Klasse von Geräten die bei typischen Hobby Projekten bisher nicht sehr oft betrachtet wurde ist die der HID Geräte [1].&lt;br /&gt;
&lt;br /&gt;
Typischer weise denkt man hier in der Regel sofort an eine PC-Maus und Tastatur aber der USB Standard sieht auch „Sonstige“ Geräte vor [2].&lt;br /&gt;
&lt;br /&gt;
== Ziel ==&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt hat zum Ziel den Bau einen relativ genauen Temperatur Moduls das sehr leicht durch die Verwendung als HID Gerät an typische PC Systeme angeschlossen werden kann. Dazu gehört auch der Wunsch das Gerät explizit mit Windows x64 Systeme zu betreiben und die Anwendungssoftware in c# erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung bestehet wie aus dem Schaltplan ersichtlich ist nur aus einer Handvoll Bauteilen deren wichtigste Komponente der Mikrocontroller vom Typ Atmel Tiny85-20 ist. Als Temperatursensor wird ein Dallas DS18B20 verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Realisierung der USB Schnittstelle geschieht hier mir der vielfach bewährten Software V-USB aus [3] die für die relativ langsame und nur wenige Bytes umfassende Informationen ausgezeichnet passt.&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan zeigt den Anschluss der USB Verbindung samt Schutzwiderstände (R1 und R3) die beiden 3,6V Zehnerdioden begrenzen die Spannung auf den USB Datenleitungen auf die durch die Norm festgelegten Pegel. Für die USB Enumeration sorgt (R2) der dem USB Host ein USB Low Speed Device mit max. 1,5 MBit/s Datenübertragung Geschwindigkeit signalisiert [4].&lt;br /&gt;
&lt;br /&gt;
Der Dalles DS18B20 Temperatur Sensor wird im Parasität Power Modus [5] betrieben um die Eigenerwärmung möglichst gering zu halten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Atmel Prozessor vom Typ Tiny85-20 läuft mit 16,5 MHz und 5V Versorgungsspannung die direkt aus der USB Anbindung bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Die Taktfrequenz von 16,5 MHz wird dabei mit Hilfe der internen PLL erzeugt. Dies spart ein externes Quarz und vereinfacht den Aufbau, gleichzeitig aber ist er schnell genug um die USB Kommunikation einwandfrei zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren C1 und C2 sorgen für eine Glättung und Filterung der 5V USB Spannung.&lt;br /&gt;
&lt;br /&gt;
Die LED1 signalisiert wenn sie aktiv ist, einen gerade stattfindenden Messzyklus der bei einem DS18B20 typ. 750ms dauert [5].&lt;br /&gt;
&lt;br /&gt;
Die Abfrage des Temperatursensors und die Übermittlung der Daten an den PC geschieht immer unabhängig voneinander. Der DS18B20 ist dabei langsamer, als die maximale Wartezeit des USB Protokolls. Auf diese Weise werden USB Timeout Meldungen vermieden.&lt;br /&gt;
&lt;br /&gt;
Anstelle des Dallas DS18B20 können auch Dallas DS18S20 oder Dallas DS1820 verwendet werden. Die Sensor Software ermittelt automatisch den richtigen Typ und liest die maximale gültigen Stellen des Sensors aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan für das HiDTemp Gerät&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Schaltplan.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
Die Firmware benutzt für die Abfrage des Temperatur Sensors die Library Funktionen aus [6].&lt;br /&gt;
&lt;br /&gt;
Der USB Stack wird mit V-USB realisiert nun. Der entschiedenen Punkt ist nun die Definition des USB HID Descriptor [7].&lt;br /&gt;
Der Desciptor sagt der USB Hostsoftware welche Endpoints es gibt und wie mit diesen kommuniziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Der USB HID Descriptor HiDTemp Gerätes sieht dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
/* --------------------------- USB interface --------------------------- */&lt;br /&gt;
/* --------------------------------------------------------------------- */&lt;br /&gt;
&lt;br /&gt;
PROGMEM char usbHidReportDescriptor[51] =  /* USB report descriptor */&lt;br /&gt;
{    &lt;br /&gt;
    0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)&lt;br /&gt;
    0x09, 0x01,                    // USAGE (Vendor Usage 1)&lt;br /&gt;
    0xa1, 0x01,                    // COLLECTION (Application)&lt;br /&gt;
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)&lt;br /&gt;
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)&lt;br /&gt;
    0x75, 0x08,                    //   REPORT_SIZE (8)	&lt;br /&gt;
    0x85, 0x01,                    //   REPORT_ID (1)&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Ary,Abs,Buf)&lt;br /&gt;
    0x85, 0x02,                    //   REPORT_ID (2)	&lt;br /&gt;
    0x95, 0x01,                    //   REPORT_COUNT (1)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)&lt;br /&gt;
    0x85, 0x03,                    //   REPORT_ID (3)&lt;br /&gt;
    0x95, 0x0a,                    //   REPORT_COUNT (10)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)	&lt;br /&gt;
    0x85, 0x04,                    //   REPORT_ID (4)&lt;br /&gt;
    0x95, 0x04,                    //   REPORT_COUNT (4)&lt;br /&gt;
    0x09, 0x00,                    //   USAGE (Undefined)&lt;br /&gt;
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)		&lt;br /&gt;
    0xc0                           // END_COLLECTION&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man erkennt vier RequestIDs, die als Feature Report an das Gerät realisiert sind.&lt;br /&gt;
Ein Feature Report sind grundsätzlich zum schreiben und lesen von Daten konzipiert da er Einstellungen (Features) vornehmen soll.&lt;br /&gt;
&lt;br /&gt;
Mit den ReportIDs 1 und 2 können zwei Ausgänge des Mikrocontrollern ein und ausgeschaltet werden. Diese Funktionen spielen derzeit aber keine weitere Rolle und ist für zukünftige Erweiterungen vorgesehen. (z.B. Schaltausgänge bei über oder unterschreiten einer bestimmten Temperatur)&lt;br /&gt;
&lt;br /&gt;
Mit der ReportID 3 kann ein HiDTemp Geräte Ident String ausgelesen werden, zusätzlich zu den Standard USB Informationen.&lt;br /&gt;
&lt;br /&gt;
Die ReportID 4 übermitteln die während des letzten Messzyklus gemessene und  zwischengespeicherten letzte Temperatur des Sensors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zusammenfassung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;HiDTemp Feature-Request IDs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! RequestID || Aktion&lt;br /&gt;
|-&lt;br /&gt;
| 1 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || I/O Pin setzen/abfragen (zukünftige Erweiterung)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Version abfragen Output 10 Byte Format: &#039;yyyy-mm-tt&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Temperatur abfragen Output 4 Byte Format: xxxx&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein Messzyklus wird mit Hilfe einer State Maschine in 10s durchlaufen. Die State Maschine läuft unabhängig von der USB Aktivität und speichert den letzten ermittelten Temperatur Wert in einer internen Variable. &lt;br /&gt;
&lt;br /&gt;
Bei einer USB Anfrage mit der ReportID 4 kann nun die USB Software die letzten gültigen Daten abfragen, ohne den Messvorgang selber einleiten zu müssen oder auf das Ergebnis danach warten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die Informationen des letzten Messzyklus werden umgehen an den USB Host übertragen. Es spielt dabei auch keine Rolle ob die Abfrage vom USB Host System direkt wiederholt wird oder nicht, der nächste Messzyklus wird immer asynchron alle 10s durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Dieses Vorgehen gibt dem Sensor auf der einen Seite Zeit sich zu erholen um nicht durch zu häufige Abfragen selber zu erhitzen und so das Messergebnis zu verfälschen.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Seite ist die USB Kommunikation zeitlich völlig frei wann sie eine Abfrage startet, da sie synchron immer eine Antwort bekommt.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist unkritisch und auf einem Steckbrett oder wie hier auf einer kleinen Lochraster Platine schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Da es sich um einen einmaligen Prototyp handelt, ist kein Platinen Layout entworfen worden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von oben:&#039;&#039;&#039;&lt;br /&gt;
[[Datei:HiD-Temp-oben-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;von unten:&#039;&#039;&#039;&lt;br /&gt;
[[Datei:HiDTemp-unten-klein.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Treiber ==&lt;br /&gt;
&lt;br /&gt;
Da das HiDTemp Gerät als HiD Device erkannt wird, installiert Windows seine eigenen HID System Treiber automatisch. &lt;br /&gt;
&lt;br /&gt;
Ein Windows System installiert Treiber automatisch einmalig beim ersten Kontakt mit der fertig aufgebauten und mit der Firmware programmierten Schaltung.&lt;br /&gt;
&lt;br /&gt;
Dabei ist es egal, ob es sich um ein Windows x32 oder Windows x64 System handelt.&lt;br /&gt;
&lt;br /&gt;
Der Microsoft HID System Treiber ist immer vorhanden und auch immer signiert. Er wird deshalb auch automatisch ohne jede Nachfrage installiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HiDTemp als vollwertiges USB HID Device gekoppelt an den Windows eigenem Treiber&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-USBDview-klein.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Anwendungssoftware ist in c# geschrieben und lässt sich problemlos auch mit der kostenlosen Visual Studio 2010 Express Version [8] übersetzen, da keine speziellen Anforderungen benötigt werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows HiDTemp Anwendungsprogramm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:HiDTemp-Programm.jpg]]&lt;br /&gt;
&lt;br /&gt;
Kern der Software ist die usbGenericHIDDevice Komponente aus [9].&lt;br /&gt;
&lt;br /&gt;
Abgeleitet von einer Basisklasse, wird eine eigene USB Device Klasse erstellt die dem realen Gerät entspricht und alle seine möglichen Eigenschaften abbildet.&lt;br /&gt;
&lt;br /&gt;
Die entscheidende Klasse für das HiDTemp Gerät sieht so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
//&lt;br /&gt;
//  usbDevice.cs&lt;br /&gt;
//&lt;br /&gt;
//  The implementation of the real USB HiD Device with his functions.&lt;br /&gt;
//&lt;br /&gt;
//-----------------------------------------------------------------------------&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using usbGenericHidCommunications;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
&lt;br /&gt;
namespace hidApp_2&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// It also serves as a demonstration of how to use the class&lt;br /&gt;
    /// library to perform different types of read and write&lt;br /&gt;
    /// operations.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    class usbDevice : usbGenericHidCommunication&lt;br /&gt;
    {&lt;br /&gt;
        private int tval;&lt;br /&gt;
&lt;br /&gt;
        private string ByteArrayToString(byte[] arr)&lt;br /&gt;
        {&lt;br /&gt;
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();&lt;br /&gt;
            return enc.GetString(arr);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Class constructor - place any initialisation here&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;vid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name=&amp;quot;pid&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;
        public usbDevice(int vid, int pid)&lt;br /&gt;
            : base(vid, pid)&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// USB HiD User Function GetTemeratur&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        public int GetTemperatur()&lt;br /&gt;
        {&lt;br /&gt;
            // Declare a input buffer&lt;br /&gt;
            Byte[] inputBuffer = new Byte[5]; // we expect 5 byte; 1 x ReportID and 4 Byte temperatur&lt;br /&gt;
&lt;br /&gt;
            inputBuffer[0] = 4; // ReportID 4 abfragen&lt;br /&gt;
&lt;br /&gt;
            // Perform the read command&lt;br /&gt;
            bool success;&lt;br /&gt;
            success = getFeatureReport(inputBuffer);&lt;br /&gt;
&lt;br /&gt;
            if (success == false)&lt;br /&gt;
            {&lt;br /&gt;
                Debug.WriteLine(&amp;quot;Error during getFeatureReport&amp;quot;);&lt;br /&gt;
                return tval;  // Error during USB HiD_GetFeature Request so return the old value&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            tval  = inputBuffer[1] &amp;lt;&amp;lt; 24;&lt;br /&gt;
			tval |= inputBuffer[2] &amp;lt;&amp;lt; 16;&lt;br /&gt;
			tval |= inputBuffer[3] &amp;lt;&amp;lt; 8;&lt;br /&gt;
			tval |= inputBuffer[4];		&lt;br /&gt;
&lt;br /&gt;
            return tval; // Return the new value&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HiDTemp wird mit den beiden Parametern VID = 0x16c0 und PID = 0x05df initialisiert. Diese beiden Werte ergeben sich aus der Dokumentation in [3] und sollten nur geändert werden wenn man sich absolut sicher ist, dass keine anderen Hersteller und Geräte davon beeinträchtigt werden.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Abfrage der Sensor Temperatur geschieht mit der Methode GetTemperatur()&lt;br /&gt;
&lt;br /&gt;
Die Temperatur wird dabei als Vorzeichen behaftete ganze Zahl übertragen. Der Wert kann also bequem in 4 Byte übertragen werden und muss auf dem Zielsystem  nur noch durch 10000 geteilt werden um die aktuelle Temperatur zu erhalten.&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle der Hinweis das Auflösung und Genauigkeit nichts miteinander zu tun haben. Der Sensor hat laut Datenblatt eine Grundgenauigkeit von +/- 0,5 °C , die Auflösung entspricht bei einem DS18B20 12 Bit also 0.0625 oder 1/16 °C.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Die Schaltung des HiDTemp Gerätes arbeitet zusammen mit der c# Software auf einen Windows 7 x64 System seit Wochen zur vollsten Zufriedenheit. &lt;br /&gt;
&lt;br /&gt;
Das System eignet sich prima zum experimentieren und bietet dem Leser Platz eigenen Erfahrungen mit der kleinen Schaltung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung ist so einfach aufgebaut, dass sie sehr einfach nachgebaut werden kann und dazu auch noch sehr preiswert ist.&lt;br /&gt;
&lt;br /&gt;
Dieses Projekt wäre ohne dem Gedanken der OpenSource Community sicher nicht so schnell, ausgereift und produktiv umsetzbar gewesen.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Grund stelle ich meine eigenen Sources auch unter GPL V3, alle anderen Bestandteile sind wie ihr ursprünglicher Autor es vorsieht.&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* (1) http://de.wikipedia.org/wiki/Human_Interface_Device&lt;br /&gt;
* (2) http://www.usb.org/developers/hidpage/&lt;br /&gt;
* (3) http://www.obdev.at/products/vusb/index-de.html&lt;br /&gt;
* (4) http://de.wikipedia.org/wiki/Universal_Serial_Bus&lt;br /&gt;
* (5) http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf&lt;br /&gt;
* (6) http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html&lt;br /&gt;
* (7) http://www.sprut.de/electronic/interfaces/usb/deskriptor.htm&lt;br /&gt;
* (8) http://www.microsoft.com/germany/express/products/windows.aspx&lt;br /&gt;
* (9) http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows&lt;br /&gt;
&lt;br /&gt;
* [[Media:HiDTemp.pdf|Schaltplan als PDF Datei]]&lt;br /&gt;
* [[Media:HiDTemp-20121223.zip|Source Code Archiv]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Bitte nicht blind die folgenden Kategorien kopieren ;-)&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Odiwan</name></author>
	</entry>
</feed>