<?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=Muebau</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=Muebau"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Muebau"/>
	<updated>2026-04-11T08:13:28Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=BMA020&amp;diff=77453</id>
		<title>BMA020</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=BMA020&amp;diff=77453"/>
		<updated>2013-07-03T08:59:24Z</updated>

		<summary type="html">&lt;p&gt;Muebau: /* 10 Bitwerte */  spelling&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der BMA020 ist ein 3-Achsen-Beschleunigungssensor von Bosch der über I2C oder ISP ausgelesen und konfiguriert werden kann.&lt;br /&gt;
&lt;br /&gt;
=BMA020=&lt;br /&gt;
==Bauteilseite==&lt;br /&gt;
[http://www.mikrocontroller.net/part/BMA020 Zur Bauteilseite des BMA020]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Bezugsquellen==&lt;br /&gt;
===ELV===&lt;br /&gt;
http://www.elv.de/3-Achsen-Beschleunigungssensor-3D-BS,-Komplettbausatz/x.aspx/cid_74/detail_10/detail2_28515&lt;br /&gt;
===Farnell===&lt;br /&gt;
http://de.farnell.com/bosch/bma020-0330sb000b/daughter-board/dp/1795593?Ntt=BMA020&lt;br /&gt;
&lt;br /&gt;
==Speicheraufteilung==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;BMA020 Speicher&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Adresse&lt;br /&gt;
! Bit 7&lt;br /&gt;
! Bit 6&lt;br /&gt;
! Bit 5&lt;br /&gt;
! Bit 4&lt;br /&gt;
! Bit 3&lt;br /&gt;
! Bit 2&lt;br /&gt;
! Bit 1&lt;br /&gt;
! Bit 0&lt;br /&gt;
! Typ&lt;br /&gt;
! Axis&lt;br /&gt;
|-&lt;br /&gt;
| 16h - 7Fh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| -&lt;br /&gt;
| reserved&lt;br /&gt;
|rowspan=&amp;quot;15&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| 15h&lt;br /&gt;
| SPI4E&amp;lt;br&amp;gt;(4 wire SPI enable)&amp;lt;br&amp;gt;(default: 1)&lt;br /&gt;
| EAI &amp;lt;br&amp;gt;(enable advanced interrupt)&lt;br /&gt;
| NDI &amp;lt;br&amp;gt;(new data interrupt)&lt;br /&gt;
| LI &amp;lt;br&amp;gt;(latch interrupt)&lt;br /&gt;
|[[#Shadow disable|SD&amp;lt;br&amp;gt;(shadow disable / read MSB only)]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| WUP &amp;lt;br&amp;gt;(wake up pause)&lt;br /&gt;
| WU &amp;lt;br&amp;gt;(wake up)&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 14h&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| - !!! -&amp;lt;br&amp;gt;(NEVER ever change this registers)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|[[#Range|range&amp;lt;br&amp;gt;(+/-2/4/8g)]]&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|[[#Bandwith|bandwith&amp;lt;br&amp;gt;(25...1500 Hz)]]&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 13h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot; rowspan=&amp;quot;2&amp;quot;| customer reserved&amp;lt;br&amp;gt;(can be used as memory)&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 12h&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 11h&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| AMD &amp;lt;br&amp;gt;(any motion duration)&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| HGH &amp;lt;br&amp;gt;(high gravitation hysteresis)&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| LGH &amp;lt;br&amp;gt;(low gravitation hysteresis)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 10h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| AMT &amp;lt;br&amp;gt;(any motion threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Fh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| HGD &amp;lt;br&amp;gt;(high gravitation duration)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Eh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| HGT  &amp;lt;br&amp;gt;(high gravitation threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Dh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| LGD &amp;lt;br&amp;gt;(low gravitation duration)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Ch&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| LGT &amp;lt;br&amp;gt;(high gravitation threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Bh&lt;br /&gt;
| alert&lt;br /&gt;
| AM &amp;lt;br&amp;gt;(any motion)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| HGC &amp;lt;br&amp;gt;(high gravitation counter)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| LGC &amp;lt;br&amp;gt;(low gravitation counter)&lt;br /&gt;
| HGE  &amp;lt;br&amp;gt;(high gravitation enable)&lt;br /&gt;
| LGE &amp;lt;br&amp;gt;(low gravitation enable)&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 0Ah&lt;br /&gt;
| -&lt;br /&gt;
| reset INT&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| self test 1&lt;br /&gt;
| self test 2&lt;br /&gt;
| soft reset&lt;br /&gt;
| sleep&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 09h&lt;br /&gt;
| STR &amp;lt;br&amp;gt;(self test result)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| -&lt;br /&gt;
| alert phase&lt;br /&gt;
| LG latched&lt;br /&gt;
| HG latched&lt;br /&gt;
| HGS &amp;lt;br&amp;gt;(high gravitation status)&lt;br /&gt;
| LGS &amp;lt;br&amp;gt;(low gravitation status)&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 08h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| -&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 07h&lt;br /&gt;
| Z [9]&lt;br /&gt;
| Z [8]&lt;br /&gt;
| Z [7]&lt;br /&gt;
| Z [6]&lt;br /&gt;
| Z [5]&lt;br /&gt;
| Z [4]&lt;br /&gt;
| Z [3]&lt;br /&gt;
| Z [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| Z&lt;br /&gt;
|-&lt;br /&gt;
| 06h&lt;br /&gt;
| Z [1]&lt;br /&gt;
| Z [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDZ &amp;lt;br&amp;gt;(new data Z)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 05h&lt;br /&gt;
| Y [9]&lt;br /&gt;
| Y [8]&lt;br /&gt;
| Y [7]&lt;br /&gt;
| Y [6]&lt;br /&gt;
| Y [5]&lt;br /&gt;
| Y [4]&lt;br /&gt;
| Y [3]&lt;br /&gt;
| Y [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| Y&lt;br /&gt;
|-&lt;br /&gt;
| 04h&lt;br /&gt;
| Y [1]&lt;br /&gt;
| Y [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDY &amp;lt;br&amp;gt;(new data Y)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 03h&lt;br /&gt;
| X [9]&lt;br /&gt;
| X [8]&lt;br /&gt;
| X [7]&lt;br /&gt;
| X [6]&lt;br /&gt;
| X [5]&lt;br /&gt;
| X [4]&lt;br /&gt;
| X [3]&lt;br /&gt;
| X [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| X&lt;br /&gt;
|-&lt;br /&gt;
| 02h&lt;br /&gt;
| X [1]&lt;br /&gt;
| X [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDX &amp;lt;br&amp;gt;(new data X)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 01h&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;| al version&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;| ml version&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| 00h&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| chip ID&lt;br /&gt;
| data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Register==&lt;br /&gt;
===Shadow disable===&lt;br /&gt;
Ist diese Bit gesetzt ist es möglich die MSBs der Beschleunigungswerte (03h, 05h, 07h) zu lesen ohne vorher die LSBs (02h, 04h, 06h) gelesen zu haben.&lt;br /&gt;
===Range===&lt;br /&gt;
Es sind 3 verschiedene Bereiche einstellbar:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;BMA020 Range&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;| 14h&lt;br /&gt;
! &lt;br /&gt;
|-&lt;br /&gt;
! Bit 4&lt;br /&gt;
! Bit 3&lt;br /&gt;
! Bereich&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| +/- 2g&amp;lt;br&amp;gt;(default)&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| +/- 4g&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| +/- 8g&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| -&lt;br /&gt;
|}&lt;br /&gt;
===Bandwith===&lt;br /&gt;
Folgende Aktualisierungsraten sind möglich:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;BMA020 Bandwith&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;| 14h&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
! Bit 2&lt;br /&gt;
! Bit 1&lt;br /&gt;
! Bit 0&lt;br /&gt;
! Rate&lt;br /&gt;
! reale Rate&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 25 Hz&amp;lt;br&amp;gt;(default)&lt;br /&gt;
| 23 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 50 Hz&lt;br /&gt;
| 47 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 100 Hz&lt;br /&gt;
| 94 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 190 Hz&lt;br /&gt;
| 188 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 375 Hz&lt;br /&gt;
| 375 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 750 Hz&lt;br /&gt;
| 750 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1500 Hz&lt;br /&gt;
| 1500 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Konfiguration==&lt;br /&gt;
&lt;br /&gt;
==I2C==&lt;br /&gt;
===Adresse===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adresse&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Bit 7 || Bit 6 || Bit 5 || Bit 4 || Bit 3 || Bit 2 || Bit 1 || R/W &lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 1 || 1 || 0 || 0 || 0 || x&lt;br /&gt;
|}&lt;br /&gt;
====7 Bit Sichtweise====&lt;br /&gt;
Gemeint ist hierbei Bit 7 - 1.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adressen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Hexadezimal || Dezimal&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 56&lt;br /&gt;
|}&lt;br /&gt;
Zum lesen muss das 0. Bit gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
====8 Bit Sichtweise====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adressen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Hexadezimal || Dezimal&lt;br /&gt;
|-&lt;br /&gt;
| schreiben || 0x70 || 112&lt;br /&gt;
|-&lt;br /&gt;
| lesen || 0x71 || 113&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Beschleunigungsdaten lesen===&lt;br /&gt;
&lt;br /&gt;
Um Daten zu lesen muss erst der Offset gesendet werden ab dem Daten gelesen werden sollen. Die Beschleunigungsdaten liegen ab Adresse 0x02h.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Offset senden&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Adresse || Daten&lt;br /&gt;
|-&lt;br /&gt;
| schreiben || 0x70 || 0x02&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Beschleunigungsdaten sind pro Achse (X, Y, Z) 10 Bit lang. Diese liegen in 6 Bytes ab Adresse 0x02h (0x02h - 0x08h). Siehe dazu den Abschnitt [[#Speicheraufteilung|Speicheraufteilung]].&lt;br /&gt;
Um an die Daten zu kommen muessen 6 Byte von der Adresse des BMA020 gelesen werden:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039; Beschleunigungsdaten lesen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Adresse || Byte 1 || Byte 2 || Byte 3 || Byte 4 || Byte 5 || Byte 6&lt;br /&gt;
|-&lt;br /&gt;
| lesen || 0x71 || LSB_x || MSB_x || LSB_y || MSB_y || LSB_z || MSB_z&lt;br /&gt;
|}&lt;br /&gt;
==Berechnung==&lt;br /&gt;
===8 Bitwerte===&lt;br /&gt;
Sind die Beschleunigungswerte ausgelesen geht es nun an die Interpretation. Reicht eine Genauigkeit von 8 Bit so kann man nur den MSB-Teil der Werte nehmen.&lt;br /&gt;
Achtung: Es müssen dennoch die LSBs eingelesen werden, da die MSBs und LSBs solange blockiert bleiben bis beide eingelesen wurden.&lt;br /&gt;
Um dies zu verhindern muss das [[#Shadow disable|Shadow disable Bit]] gesetzt werden (15h, Bit 3; siehe [[#Speicheraufteilung|Speicheraufteilung]]).&lt;br /&gt;
&lt;br /&gt;
===10 Bitwerte===&lt;br /&gt;
Hat man die Werte ausgelesen gilt es diese zusammen zu fügen. Im folgenden Beispiel wird angenommen das die Werte in der Variable &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;values[]&amp;lt;/syntaxhighlight&amp;gt; liegen. Die Variable enthält die 6 Bytes für X, Y und Z.&lt;br /&gt;
&lt;br /&gt;
Als Beispiel wird hier X erzeugt (zusammengefügt).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uint values[6];&lt;br /&gt;
int x;&lt;br /&gt;
&lt;br /&gt;
//X MSB (02h) um zwei Stellen nach links schieben um Platz für die beiden unteren Bits zu schaffen.&lt;br /&gt;
x = values[0] &amp;lt;&amp;lt; 2;&lt;br /&gt;
&lt;br /&gt;
//X LSB (03h) um sechs Stellen nach rechts schieben um die zwei obersten Bits an den richtigen Platz für das Zusammenfügen zu bringen.&lt;br /&gt;
x = x | (values[1] &amp;gt;&amp;gt; 6);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbiges muss für Y und Z getan werden.&lt;br /&gt;
&lt;br /&gt;
===Gravitationsvektor===&lt;br /&gt;
Der Gravitationsvektor ergibt sich aus:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec g = \begin{pmatrix} x \\ y \\ z \end{pmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
====Gravitation berechnen====&lt;br /&gt;
Die Gravitation ist gleich der Länge des Gravitationsvektors:&lt;br /&gt;
&amp;lt;math&amp;gt;g = \sqrt{x^2+y^2+z^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Sensorik]]&lt;/div&gt;</summary>
		<author><name>Muebau</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RFID_Antenne&amp;diff=67552</id>
		<title>RFID Antenne</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RFID_Antenne&amp;diff=67552"/>
		<updated>2012-07-27T10:00:17Z</updated>

		<summary type="html">&lt;p&gt;Muebau: /* Runde Antenne */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier eine Formalsammlung zu RFID-Antennen; aus dem Forum zusammengetragen.&lt;br /&gt;
&lt;br /&gt;
== Runde Antenne ==&lt;br /&gt;
&lt;br /&gt;
Die Induktivität der Antenne in µH:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;L [\mu H]=\frac{0.31\cdot(a\cdot N)^2}{6a+9h+10b}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; = Antenneradius&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; = Dicke der Wicklung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; = Höhe der Wicklung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; = Anzahl Wicklungen&lt;br /&gt;
&lt;br /&gt;
Die Dicke und Höhe der Wicklung (b und h) sind unkritisch. Bei ca. 100 Windungen ist 0.5 ein guter Wert.&lt;br /&gt;
&lt;br /&gt;
=== Antennengüte (Q) ===&lt;br /&gt;
&lt;br /&gt;
Je höher die Güte einer Antenne ist, umso grösser ist der zu erwartende Strom.&lt;br /&gt;
&lt;br /&gt;
Bei hoher Güte muss die Frequenz jedoch auch genauer stimmen. Mit 109&amp;amp;nbsp;kHz wird man bei einer Güte von 30 im Normalfall keine Chance haben 125&amp;amp;nbsp;kHz Tags auszulesen. Die Bandbreite des Signalempfangs ist direkt abhängig von der Güte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Q=\frac{2\pi\cdot f\cdot L}{R_\text{d}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_\text{d}&amp;lt;/math&amp;gt; = Drahtwiderstand der Antenne&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; = Resonanzfrequenz (hier 125kHz)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; = Induktivität in Henry (H)&lt;br /&gt;
&lt;br /&gt;
=== Drahtwiderstand R&amp;lt;sub&amp;gt;d&amp;lt;/sub&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_\text{d}=2a/100 \cdot\pi \cdot N \cdot \frac \varrho{A_\text{d}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; = Antennenradius in cm&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; = Windungen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\varrho&amp;lt;/math&amp;gt; = Spezifischer Widerstand (bei Kupferdraht &amp;lt;math&amp;gt;\varrho&amp;lt;/math&amp;gt; ≈ 0.017 Ω·m)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_\text{d}&amp;lt;/math&amp;gt;= Draht-Querschnittsfläche in mm&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;A_\text{d}= \tfrac{d^2}4\pi&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; = Drahtdurchmesser in mm&lt;br /&gt;
&lt;br /&gt;
=== Serienwiderstand ===&lt;br /&gt;
&lt;br /&gt;
Durch den Serienwiderstand wird das &amp;lt;math&amp;gt;Q_\text{ges}&amp;lt;/math&amp;gt; deutlich kleiner. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Q_\text{ges} = \frac{2\pi\cdot f\cdot L}{R_\text{d}+R_\text{s}+2R_\text{ad}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_\text{d}&amp;lt;/math&amp;gt; = Drahtwiderstand der Antenne&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_\text{s}&amp;lt;/math&amp;gt; = Seriewiderstand zur Antenne&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_\text{ad}&amp;lt;/math&amp;gt; = Antennentreiber-Widerstand (Beim EM4095 R&amp;lt;sub&amp;gt;ad&amp;lt;/sub&amp;gt; ≈ 3Ω)&lt;br /&gt;
&lt;br /&gt;
===Antennendurchmesser===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;r_\text{Antenne} = d_\text{max}\cdot \sqrt{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;r_\text{Antenne}&amp;lt;/math&amp;gt; = Radius der Antenne&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d_\text{max}&amp;lt;/math&amp;gt; = maximaler Leseabstand von Tag und Antennenspule&lt;br /&gt;
&lt;br /&gt;
Der optimale Radius der Sendeantenne entspricht dem Wuzel(2)-fachen Wert des maximal gewünschten Leseabstandes. Dabei ist aber zu beachten, dass das maximale Feld (ist immer im Zentrum der Antenne) dadurch proportional immer kleiner wird. Hier muss also irgendwo die optimale Mitte gefunden werden. Ideal wäre es wenn man die minimal nötige Ansprechfeldstärke des Transponders wüsste, welche aber leider meist nicht angegeben ist.&lt;br /&gt;
&lt;br /&gt;
== Bandbreite ==&lt;br /&gt;
&lt;br /&gt;
Die Bandbreite des Signalempfangs ist direkt abhängig von der Güte. Für &lt;br /&gt;
die Empfangsbandbreite eines LC-Glieds gilt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B=\frac{f}{Q}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; = Resonanzfrequenz (hier 125kHz)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; = Antennengüte&lt;br /&gt;
&lt;br /&gt;
=== Rechnung ===&lt;br /&gt;
&lt;br /&gt;
Bei &amp;lt;math&amp;gt;Q=40&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;f=125&amp;lt;/math&amp;gt;&amp;amp;nbsp;kHz bekommt man&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;B=3.125&amp;lt;/math&amp;gt; kHz&lt;br /&gt;
&lt;br /&gt;
Dies bedeutet, dass man bei einer Frequenzabweichung von ±1.56kHz zu 125kHz bereits nur noch –3db (die Hälfte) des maximal möglichen Signals &amp;quot;empfangen&amp;quot; würde.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* http://www.spulen.com/shop/product_info.php?products_id=925&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:RFID]]&lt;/div&gt;</summary>
		<author><name>Muebau</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RFID_Antenne&amp;diff=67516</id>
		<title>RFID Antenne</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RFID_Antenne&amp;diff=67516"/>
		<updated>2012-07-25T15:58:46Z</updated>

		<summary type="html">&lt;p&gt;Muebau: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier mal die gesammelte Mathematik zu RFID Antennen aus dem Forum zusammen getragen.&lt;br /&gt;
&lt;br /&gt;
=Runde Antenne=&lt;br /&gt;
Die Antenne in (micro) Henry:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;L( \mu H)=\frac{0.31*(a*N)^2}{6*a+9*h+10*b}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; = Antenneradius in cm&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; = Dicke der Wicklung in cm&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; = Höhe der Wicklung in cm&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; = Anzahl Wicklungen&lt;br /&gt;
&lt;br /&gt;
Die Dicke und Höhe der Wicklung (b und h) sind unkritisch. Bei ca. 100 Windungen sind 0.5 ein guter Wert.&lt;br /&gt;
&lt;br /&gt;
=Antennengüte (Q)=&lt;br /&gt;
Je höher die Güte einer Antenne ist, umso grösser ist der zu erwartende Strom.&lt;br /&gt;
&lt;br /&gt;
Bei hoher Güte muss die Frequenz jedoch auch genauer stimmen. Mit 109kHz wird man bei einer Güte von 30 im Normalfall keine Chance haben 125kHz Tags auszulesen. Die Bandbreite des Signalempfangs ist direkt abhängig von der Güte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Q=\frac{2*\pi*f*L}{R_\text{d}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_\text{d}&amp;lt;/math&amp;gt; = Drahtwiderstand der Antenne&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; = Resonanzfrequenz (hier 125kHz)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; = Induktivität in Henry (H)&lt;br /&gt;
&lt;br /&gt;
==Drahtwiderstand &amp;lt;math&amp;gt;R_\text{d}&amp;lt;/math&amp;gt;==&lt;br /&gt;
&amp;lt;math&amp;gt;R_\text{d}=2*a/100*\pi*N*p/(Ad(mm))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; = Antennenradius in cm&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; = Windungen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; = spezifischer Widerstand (bei Kupferdraht p = 0.017)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_\text{d}&amp;lt;/math&amp;gt;= Draht Querschnittsfläche in mm&lt;br /&gt;
===Querschnittsfläche &amp;lt;math&amp;gt;A_\text{d}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&amp;lt;math&amp;gt;A_\text{d}= (\frac{d}{2})^2*\pi&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; = Drahtdurchmesser in mm&lt;br /&gt;
==Serienwiderstand==&lt;br /&gt;
Durch den Serienwiderstand wird das &amp;lt;math&amp;gt;Q_\text{ges}&amp;lt;/math&amp;gt; deutlich kleiner. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Q_\text{ges} = \frac{2*\pi*f*L}{R_\text{d}+R_\text{s}+2*R_\text{ad}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_\text{d}&amp;lt;/math&amp;gt; = Drahtwiderstand der Antenne&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_\text{s}&amp;lt;/math&amp;gt; = Seriewiderstand zur Antenne&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_\text{ad}&amp;lt;/math&amp;gt; = Antennentreiber-Widerstand (Beim EM4095 Rad = ca. 3)&lt;br /&gt;
&lt;br /&gt;
=Bandbreite=&lt;br /&gt;
Die Bandbreite des Signalempfangs ist direkt abhängig von der Güte. Für &lt;br /&gt;
die Empfangsbandbreite eines LC-Glieds gilt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B=\frac{f}{Q}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; = Resonanzfrequenz (hier 125kHz)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; = Antennengüte&lt;br /&gt;
&lt;br /&gt;
==Rechnung==&lt;br /&gt;
&lt;br /&gt;
Bei&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Q=40&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f=125 kHz&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bekommt man&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B=3.125kHz&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies bedeutet, dass man bei einer Frequenzabweichung von +/- 1.56kHz zu 125kHz bereits nur noch -3db (die Hälfte) des maximal möglichen Signals &amp;quot;empfangen&amp;quot; würde.&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
http://www.spulen.com/shop/product_info.php?products_id=925&lt;/div&gt;</summary>
		<author><name>Muebau</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RFID_Antenne&amp;diff=67515</id>
		<title>RFID Antenne</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RFID_Antenne&amp;diff=67515"/>
		<updated>2012-07-25T15:56:00Z</updated>

		<summary type="html">&lt;p&gt;Muebau: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier mal die gesammelte Mathematik zu RFID Antennen aus dem Forum zusammen getragen.&lt;br /&gt;
&lt;br /&gt;
=Runde Antenne=&lt;br /&gt;
Die Antenne in (micro) Henry:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;L( \mu H)=\frac{0.31*(a*N)^2}{6*a+9*h+10*b}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; = Antenneradius in cm&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; = Dicke der Wicklung in cm&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; = Höhe der Wicklung in cm&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; = Anzahl Wicklungen&lt;br /&gt;
&lt;br /&gt;
Die Dicke und Höhe der Wicklung (b und h) sind unkritisch. Bei ca. 100 Windungen sind 0.5 ein guter Wert.&lt;br /&gt;
&lt;br /&gt;
=Antennengüte (Q)=&lt;br /&gt;
Je höher die Güte einer Antenne ist, umso grösser ist der zu erwartende Strom.&lt;br /&gt;
&lt;br /&gt;
Bei hoher Güte muss die Frequenz jedoch auch genauer stimmen. Mit 109kHz wird man bei einer Güte von 30 im Normalfall keine Chance haben 125kHz Tags auszulesen. Die Bandbreite des Signalempfangs ist direkt abhängig von der Güte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Q=\frac{2*\pi*f*L}{R_\text{d}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_\text{d}&amp;lt;/math&amp;gt; = Drahtwiderstand der Antenne&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; = Resonanzfrequenz (hier 125kHz)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; = Induktivität in Henry (H)&lt;br /&gt;
&lt;br /&gt;
==Drahtwiderstand &amp;lt;math&amp;gt;R_\text{d}&amp;lt;/math&amp;gt;==&lt;br /&gt;
&amp;lt;math&amp;gt;R_\text{d}=2*a/100*\pi*N*p/(Ad(mm))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; = Antennenradius in cm&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; = Windungen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; = spezifischer Widerstand (bei Kupferdraht p = 0.017)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_\text{d}&amp;lt;/math&amp;gt;= Draht Querschnittsfläche in mm&lt;br /&gt;
===Querschnittsfläche &amp;lt;math&amp;gt;A_\text{d}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&amp;lt;math&amp;gt;A_\text{d}= (\frac{d}{2})^2*\pi&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; = Drahtdurchmesser in mm&lt;br /&gt;
==Serienwiderstand==&lt;br /&gt;
Durch den Serienwiderstand wird das &amp;lt;math&amp;gt;Q_\text{ges}&amp;lt;/math&amp;gt; deutlich kleiner. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Q_\text{ges} = \frac{2*\pi*f*L}{R_\text{d}+R_\text{s}+2*R_\text{ad}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_\text{d}&amp;lt;/math&amp;gt; = Drahtwiderstand der Antenne&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_\text{s}&amp;lt;/math&amp;gt; = Seriewiderstand zur Antenne&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_\text{ad}&amp;lt;/math&amp;gt; = Antennentreiber-Widerstand (Beim EM4095 Rad = ca. 3)&lt;br /&gt;
&lt;br /&gt;
=Bandbreite=&lt;br /&gt;
Die Bandbreite des Signalempfangs ist direkt abhängig von der Güte. Für &lt;br /&gt;
die Empfangsbandbreite eines LC-Glieds gilt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B=\frac{f}{Q}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; = Resonanzfrequenz (hier 125kHz)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; = Antennengüte&lt;br /&gt;
&lt;br /&gt;
==Rechnung==&lt;br /&gt;
&lt;br /&gt;
Bei&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Q=40&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f=125 kHz&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bekommt man&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B=3.125kHz&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies bedeutet, dass man bei einer Frequenzabweichung von +/- 1.56kHz zu 125kHz bereits nur noch -3db (die Hälfte) des maximal möglichen Signals &amp;quot;empfangen&amp;quot; würde.&lt;/div&gt;</summary>
		<author><name>Muebau</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RFID_Antenne&amp;diff=67514</id>
		<title>RFID Antenne</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RFID_Antenne&amp;diff=67514"/>
		<updated>2012-07-25T15:52:37Z</updated>

		<summary type="html">&lt;p&gt;Muebau: /* RFID Antenne */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier mal die gesammelte Mathematik zu RFID Antennen aus dem Forum zusammen getragen.&lt;br /&gt;
&lt;br /&gt;
=Runde Antenne=&lt;br /&gt;
Die Antenne in (micro) Henry:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;L( \mu H)=\frac{0.31*(a*N)^2}{6*a+9*h+10*b}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; = Antenneradius in cm&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; = Dicke der Wicklung in cm&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; = Höhe der Wicklung in cm&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; = Anzahl Wicklungen&lt;br /&gt;
&lt;br /&gt;
Die Dicke und Höhe der Wicklung (b und h) sind unkritisch. Bei ca. 100 Windungen sind 0.5 ein guter Wert.&lt;br /&gt;
&lt;br /&gt;
=Antennengüte (Q)=&lt;br /&gt;
Je höher die Güte einer Antenne ist, umso grösser ist der zu erwartende Strom.&lt;br /&gt;
&lt;br /&gt;
Bei hoher Güte muss die Frequenz jedoch auch genauer stimmen. Mit 109kHz wird man bei einer Güte von 30 im Normalfall keine Chance haben 125kHz Tags auszulesen. Die Bandbreite des Signalempfangs ist direkt abhängig von der Güte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Q=\frac{2*\pi*f*L}{Rd}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_\text{d}&amp;lt;/math&amp;gt; = Drahtwiderstand der Antenne&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; = Resonanzfrequenz (hier 125kHz)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; = Induktivität in Henry (H)&lt;br /&gt;
&lt;br /&gt;
==Drahtwiderstand &amp;lt;math&amp;gt;R_\text{d}&amp;lt;/math&amp;gt;==&lt;br /&gt;
&amp;lt;math&amp;gt;R_\text{d}=2*a/100*\pi*N*p/(Ad(mm))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; = Antennenradius in cm&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; = Windungen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; = spezifischer Widerstand (bei Kupferdraht p = 0.017)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_\text{d}&amp;lt;/math&amp;gt;= Draht Querschnittsfläche in mm&lt;br /&gt;
===Querschnittsfläche &amp;lt;math&amp;gt;A_\text{d}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&amp;lt;math&amp;gt;A_\text{d}= (d/2)^2*\pi&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; = Drahtdurchmesser in mm&lt;br /&gt;
==Serienwiderstand==&lt;br /&gt;
Durch den Serienwiderstand wird das &amp;lt;math&amp;gt;Q_\text{ges}&amp;lt;/math&amp;gt; deutlich kleiner. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Q_\text{ges} = \frac{2*\pi*f*L}{R_\text{d}+R_\text{s}+2*R_\text{ad}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_\text{d}&amp;lt;/math&amp;gt; = Drahtwiderstand der Antenne&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_\text{s}&amp;lt;/math&amp;gt; = Seriewiderstand zur Antenne&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_\text{ad}&amp;lt;/math&amp;gt; = Antennentreiber-Widerstand (Beim EM4095 Rad = ca. 3)&lt;br /&gt;
&lt;br /&gt;
=Bandbreite=&lt;br /&gt;
Die Bandbreite des Signalempfangs ist direkt abhängig von der Güte. Für &lt;br /&gt;
die Empfangsbandbreite eines LC-Glieds gilt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B=\frac{f}{Q}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; = Resonanzfrequenz (hier 125kHz)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; = Antennengüte&lt;br /&gt;
&lt;br /&gt;
==Rechnung==&lt;br /&gt;
&lt;br /&gt;
Bei&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Q=40&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f=125 kHz&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bekommt man&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B=3.125kHz&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies bedeutet, dass man bei einer Frequenzabweichung von +/- 1.56kHz zu 125kHz bereits nur noch -3db (die Hälfte) des maximal möglichen Signals &amp;quot;empfangen&amp;quot; würde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;g = \sqrt{x^2+y^2+z^2}&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>Muebau</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RFID_Antenne&amp;diff=67513</id>
		<title>RFID Antenne</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RFID_Antenne&amp;diff=67513"/>
		<updated>2012-07-25T15:51:32Z</updated>

		<summary type="html">&lt;p&gt;Muebau: Die Seite wurde neu angelegt: „=RFID Antenne= Hier mal die gesammelte Mathematik zu RFID Antennen aus dem Forum zusammen getragen.  ==Runde Antenne== Die Antenne in (micro) Henry:  &amp;lt;math&amp;gt;L( \mu…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=RFID Antenne=&lt;br /&gt;
Hier mal die gesammelte Mathematik zu RFID Antennen aus dem Forum zusammen getragen.&lt;br /&gt;
&lt;br /&gt;
==Runde Antenne==&lt;br /&gt;
Die Antenne in (micro) Henry:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;L( \mu H)=\frac{0.31*(a*N)^2}{6*a+9*h+10*b}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; = Antenneradius in cm&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; = Dicke der Wicklung in cm&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; = Höhe der Wicklung in cm&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; = Anzahl Wicklungen&lt;br /&gt;
&lt;br /&gt;
Die Dicke und Höhe der Wicklung (b und h) sind unkritisch. Bei ca. 100 Windungen sind 0.5 ein guter Wert.&lt;br /&gt;
&lt;br /&gt;
==Antennengüte (Q)==&lt;br /&gt;
Je höher die Güte einer Antenne ist, umso grösser ist der zu erwartende Strom.&lt;br /&gt;
&lt;br /&gt;
Bei hoher Güte muss die Frequenz jedoch auch genauer stimmen. Mit 109kHz wird man bei einer Güte von 30 im Normalfall keine Chance haben 125kHz Tags auszulesen. Die Bandbreite des Signalempfangs ist direkt abhängig von der Güte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Q=\frac{2*\pi*f*L}{Rd}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_\text{d}&amp;lt;/math&amp;gt; = Drahtwiderstand der Antenne&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; = Resonanzfrequenz (hier 125kHz)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; = Induktivität in Henry (H)&lt;br /&gt;
&lt;br /&gt;
===Drahtwiderstand &amp;lt;math&amp;gt;R_\text{d}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&amp;lt;math&amp;gt;R_\text{d}=2*a/100*\pi*N*p/(Ad(mm))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; = Antennenradius in cm&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; = Windungen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; = spezifischer Widerstand (bei Kupferdraht p = 0.017)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_\text{d}&amp;lt;/math&amp;gt;= Draht Querschnittsfläche in mm&lt;br /&gt;
====Querschnittsfläche &amp;lt;math&amp;gt;A_\text{d}&amp;lt;/math&amp;gt;====&lt;br /&gt;
&amp;lt;math&amp;gt;A_\text{d}= (d/2)^2*\pi&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; = Drahtdurchmesser in mm&lt;br /&gt;
===Serienwiderstand===&lt;br /&gt;
Durch den Serienwiderstand wird das &amp;lt;math&amp;gt;Q_\text{ges}&amp;lt;/math&amp;gt; deutlich kleiner. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Q_\text{ges} = \frac{2*\pi*f*L}{R_\text{d}+R_\text{s}+2*R_\text{ad}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_\text{d}&amp;lt;/math&amp;gt; = Drahtwiderstand der Antenne&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_\text{s}&amp;lt;/math&amp;gt; = Seriewiderstand zur Antenne&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_\text{ad}&amp;lt;/math&amp;gt; = Antennentreiber-Widerstand (Beim EM4095 Rad = ca. 3)&lt;br /&gt;
&lt;br /&gt;
==Bandbreite==&lt;br /&gt;
Die Bandbreite des Signalempfangs ist direkt abhängig von der Güte. Für &lt;br /&gt;
die Empfangsbandbreite eines LC-Glieds gilt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B=\frac{f}{Q}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; = Resonanzfrequenz (hier 125kHz)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; = Antennengüte&lt;br /&gt;
&lt;br /&gt;
===Rechnung===&lt;br /&gt;
&lt;br /&gt;
Bei&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Q=40&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f=125 kHz&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bekommt man&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B=3.125kHz&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies bedeutet, dass man bei einer Frequenzabweichung von +/- 1.56kHz zu 125kHz bereits nur noch -3db (die Hälfte) des maximal möglichen Signals &amp;quot;empfangen&amp;quot; würde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;g = \sqrt{x^2+y^2+z^2}&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>Muebau</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=IRMP&amp;diff=66548</id>
		<title>IRMP</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=IRMP&amp;diff=66548"/>
		<updated>2012-05-28T10:06:50Z</updated>

		<summary type="html">&lt;p&gt;Muebau: /* Einleitung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Von &#039;&#039;&#039;Frank M. ([http://www.mikrocontroller.net/user/show/ukw ukw])&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= IRMP - Infrarot-Multiprotokoll-Decoder =&lt;br /&gt;
&lt;br /&gt;
[[Datei:irmp-title.png| |Scan eines NEC-kompatiblen Fernbedienungssignals]]&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:IRMP-TSOP1736.png|miniatur|Anschluß eines IR-Empfängers an µC]]&lt;br /&gt;
&lt;br /&gt;
Da RC5 nicht nur veraltet, sondern mittlerweile obsolet ist und immer mehr die elektronischen Geräte der fernöstlichen Unterhaltungsindustrie in unseren Haushalten Einzug finden, ist es an der Zeit, einen IR-Decoder zu entwickeln, der ca. 90% aller bei uns im täglichen Leben zu findenden IR-Fernbedienungen &amp;quot;versteht&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
IRMP ist lauffähig auf folgenden AVR µCs:&lt;br /&gt;
&lt;br /&gt;
* ATtiny45,  ATtiny85&lt;br /&gt;
* ATtiny84&lt;br /&gt;
* ATmega8,   ATmega16,  ATmega32&lt;br /&gt;
* ATmega162&lt;br /&gt;
* ATmega164, ATmega324, ATmega644,  ATmega644P, ATmega1284&lt;br /&gt;
* ATmega88,  ATmega88P, ATmega168,  ATmega168P, ATmega328P&lt;br /&gt;
&lt;br /&gt;
Es gibt aber auch Portierungen auf diverse PIC µCs - für den CCS- und C18-Compiler. Auch ist IRMP mittlerweile auf ARM STM32 lauffähig.&lt;br /&gt;
&lt;br /&gt;
IRMP - der Infrarot-Fernbedienungsdecoder, der mehrere Protokolle auf einmal decodieren kann, beherrscht folgende Protokolle:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Protokoll || Hersteller&lt;br /&gt;
|-&lt;br /&gt;
| SIRCS || Sony&lt;br /&gt;
|-&lt;br /&gt;
| NEC || NEC, Yamaha, Canon, Tevion, Harman/Kardon, Hitachi, JVC, Pioneer, Toshiba, Xoro, Orion, NoName und viele weitere japanische Hersteller.&lt;br /&gt;
|-&lt;br /&gt;
| SAMSUNG || Samsung&lt;br /&gt;
|-&lt;br /&gt;
| SAMSUNG32 || Samsung&lt;br /&gt;
|-&lt;br /&gt;
| MATSUSHITA || Matsushita&lt;br /&gt;
|-&lt;br /&gt;
| KASEIKYO || Panasonic, Technics, Denon und andere japanische Hersteller, welche Mitglied der &amp;quot;Japan&#039;s Association for Electric Home Application&amp;quot; sind.&lt;br /&gt;
|-&lt;br /&gt;
| RECS80 || Philips, Nokia, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
|-&lt;br /&gt;
| RECS80EXT || Philips, Technisat, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
|-&lt;br /&gt;
| RC5 || Philips und andere europäische Hersteller&lt;br /&gt;
|-&lt;br /&gt;
| DENON || Denon, Sharp&lt;br /&gt;
|-&lt;br /&gt;
| RC6 || Philips und andere europäische Hersteller&lt;br /&gt;
|-&lt;br /&gt;
| RC6A || Philips, Kathrein und andere Hersteller, z.B. XBOX&lt;br /&gt;
|-&lt;br /&gt;
| APPLE || Apple&lt;br /&gt;
|-&lt;br /&gt;
| NUBERT || Nubert, z.B. Subwoofer System&lt;br /&gt;
|-&lt;br /&gt;
| B&amp;amp;O || Bang &amp;amp; Olufsen&lt;br /&gt;
|-&lt;br /&gt;
| GRUNDIG || Grundig&lt;br /&gt;
|-&lt;br /&gt;
| NOKIA || Nokia, z.B. D-Box&lt;br /&gt;
|-&lt;br /&gt;
| SIEMENS || Siemens, z.B. Gigaset M740AV (ab ~15kHz, siehe Bemerkungen zu F_INTERRUPTS)&lt;br /&gt;
|-&lt;br /&gt;
| FDC || FDC Keyboard (ab ~15kHz)&lt;br /&gt;
|-&lt;br /&gt;
| RCCAR || RC Car: IR Fernbedienung für Modellfahrzeuge&lt;br /&gt;
|-&lt;br /&gt;
| JVC || JVC&lt;br /&gt;
|-&lt;br /&gt;
| NIKON || NIKON&lt;br /&gt;
|-&lt;br /&gt;
| RUWIDO || RUWIDO (z.B. T-Home-Mediareceiver, MERLIN-Tastatur (Pollin))&lt;br /&gt;
|-&lt;br /&gt;
| KATHREIN  || KATHREIN&lt;br /&gt;
|-&lt;br /&gt;
| NEC16  || JVC&lt;br /&gt;
|-&lt;br /&gt;
| NEC42  || JVC&lt;br /&gt;
|-&lt;br /&gt;
| LEGO   || Lego&lt;br /&gt;
|-&lt;br /&gt;
| THOMSON || Thomson&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Jedes dieser Protokolle ist einzeln aktivierbar. Wer möchte, kann alle Protokolle aktivieren. Wer nur ein Protokoll braucht, kann alle anderen deaktivieren. Es wird nur das vom Compiler übersetzt, was auch benötigt wird.&lt;br /&gt;
&lt;br /&gt;
Der auf AVR- und PIC-µCs einsetzbare Source zu IRMP entstand im Rahmen des [[Word Clock]] Projektes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anlass für einen eigenen IRMP-Artikel ist folgender Thread in der Codesammlung: [http://www.mikrocontroller.net/topic/162119 Beitrag: IRMP - Infrared Multi Protocol Decoder]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Protokolle ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:nec-protocol.png|miniatur|NEC-Protokoll, Reichelt RGB-LED-Fernbedienung, T-&amp;gt;A: 9,14ms, A-&amp;gt;B: 4,42ms, B-&amp;gt;C: 660us]]&lt;br /&gt;
&lt;br /&gt;
Einige Hersteller verwenden ihr eigenes Protokoll, dazu gehören u.a. Sony, Samsung und Matsushita. Philips hat RC5 entwickelt und natürlich auch selbst benutzt. RC5 galt damals in Europa als &#039;&#039;das&#039;&#039; Standard-IR-Protokoll, welches von vielen europäischen Herstellern übernommen wurde. Mittlerweile ist RC5 fast gar nicht mehr anzutreffen - man kann es eigentlich als &amp;quot;ausgestorben&amp;quot; abhaken.&lt;br /&gt;
&lt;br /&gt;
Auch die japanischen Hersteller haben versucht, einen eigenen Standard zu etablieren, nämlich das sog. Kaseikyo- (oder auch &amp;quot;Japan-&amp;quot;) Protokoll. Dieses ist mit einer Bitlänge von 48 sehr universell und allgemein verwendbar. Richtig durchgesetzt hat es sich aber bis heute nicht. Ich selbst habe jedenfalls noch keine einzige Fernbedienung gesehen, die das Kaseikyo-Protokoll nutzt.&lt;br /&gt;
&lt;br /&gt;
Heutzutage wird vornehmlich das NEC-Protokoll verwendet - und zwar von den unterschiedlichsten (Marken- und auch Noname-)Herstellern. Ich schätze den &amp;quot;Marktanteil&amp;quot; auf ca. 80% beim NEC-Protokoll. Fast alle Fernbedienungen im alltäglichen Einsatz verwenden bei mir den NEC-IR-Code. Das fängt beim Fernseher an, geht über vom DVD-Player zur Notebook-Fernbedienung und reicht bis zur Noname-MultiMedia-Festplatte - um nur einige Beispiele zu nennen.&lt;br /&gt;
&lt;br /&gt;
Die von IRMP decodierten Protokolle haben etwas gemeinsames: Sie weisen alle ein Start-Bit auf, welches vom Timing her ausgezeichnet, d.h. einmalig ist.&lt;br /&gt;
&lt;br /&gt;
Anhand dieses Start-Bit-Timings werden die verschiedenen Protokolle unterschieden. IRMP misst also das Timing des Start-Bits und stellt dann &amp;quot;on-thy-fly&amp;quot; seine Timingtabellen auf das erkannte Protokoll um, damit die nach dem Start-Bit gesandten Daten in einem Rutsch eingelesen werden können, ohne das komplette Telegramm (Frame) erst speichern zu müssen.&lt;br /&gt;
&lt;br /&gt;
IRMP unterstützt folgende IR-Codings:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Pulse Distance&#039;&#039;&#039;, typ. Beispiel: NEC, Sony&lt;br /&gt;
* &#039;&#039;&#039;Bi-Phase&#039;&#039;&#039; (Manchester), typ. Beispiel: RC5, RC6&lt;br /&gt;
* &#039;&#039;&#039;Serial&#039;&#039;&#039; (ab 1.9.5), typ. Beispiel: Netbox&lt;br /&gt;
&lt;br /&gt;
Ein &#039;&#039;&#039;Puls-Distance-Protokoll&#039;&#039;&#039; erkennt man an folgenden Regeln:&lt;br /&gt;
&lt;br /&gt;
* es gibt nur &#039;&#039;&#039;eine Pulslänge&#039;&#039;&#039; und &#039;&#039;&#039;zwei verschiedene Pausenlängen&#039;&#039;&#039; oder&lt;br /&gt;
  &lt;br /&gt;
* es gibt &#039;&#039;&#039;zwei verschiedene Pulslängen&#039;&#039;&#039; und nur &#039;&#039;&#039;eine Pausenlänge&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ein &#039;&#039;&#039;Bi-Phase-Protokoll&#039;&#039;&#039; erkennt man an:&lt;br /&gt;
&lt;br /&gt;
* es kommen genau &#039;&#039;&#039;eine&#039;&#039;&#039; Pausen- und eine Pulslänge, sowie jeweils die &#039;&#039;&#039;doppelten&#039;&#039;&#039; Puls-/Pausenlängen vor&lt;br /&gt;
&lt;br /&gt;
Typisches Kriterium für ein &#039;&#039;&#039;bitserielles Protokoll&#039;&#039;&#039; ist:&lt;br /&gt;
&lt;br /&gt;
* es kommen &#039;&#039;&#039;Vielfache&#039;&#039;&#039; einer Grund-Puls-/Pausenlänge vor&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Eine tabellarische Aufstellung der verschiedenen IR-Protokolle findet man hier: [http://www.mikrocontroller.net/articles/IRMP#Die_IR-Protokolle_im_Detail Die IR-Protokolle im Detail].&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die angegebenen Timingwerte sind Idealwerte. Bei einigen Fernbedienungen in der Praxis weichen sie um bis zu 40% voneinander ab. Deshalb arbeitet IRMP mit Minimum-/Maximumsgrenzen, um bzgl. des Zeitverhaltens tolerabel zu sein.&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
&lt;br /&gt;
Version 2.2.0, Stand vom 23.05.2012&lt;br /&gt;
&lt;br /&gt;
Download Release-Version: [http://www.mikrocontroller.net/wikifiles/7/79/Irmp.zip Irmp.zip] &lt;br /&gt;
&lt;br /&gt;
IRMP &amp;amp; IRSND sind nun auch über SVN abrufbar: [http://www.mikrocontroller.net/svnbrowser/irmp/ IRMP im SVN], Download [http://www.mikrocontroller.net/svnbrowser/irmp/?view=tar Tarball]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Version im SVN kann eine Zwischen- oder Test-Version sein, die nicht den hier dokumentierten Stand widerspiegelt! Im Zweifel verwendet man besser den obigen Download-Link auf Irmp.zip.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die Software-Änderungen kann man sich hier anschauen: [http://www.mikrocontroller.net/articles/IRMP#Software-Historie_IRMP Software-Historie IRMP]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Source-Code ==&lt;br /&gt;
&lt;br /&gt;
Der Source-Code lässt sich einfach für AVR-µCs übersetzen, indem man unter Windows die Projekt-Datei irmp.aps in das AVR Studio 4 lädt.&lt;br /&gt;
&lt;br /&gt;
Für andere Entwicklungsumgebungen ist leicht ein Projekt bzw. Makefile angelegt. Zum Source gehören:&lt;br /&gt;
&lt;br /&gt;
* irmp.c - Der eigentliche IR-Decoder&lt;br /&gt;
* irmpprotocols.h - Sämtliche Definitionen zu den IR-Protokollen&lt;br /&gt;
* irmpsystem.h - Vom Zielsystem abhängige Definitionen für AVR/PIC/STM32&lt;br /&gt;
* irmp.h - Include-Datei für die Applikation&lt;br /&gt;
* irmpconfig.h - Anzupassende Konfigurationsdatei &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;WICHTIG&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Im Applikations-Source sollte nur irmp.h per include eingefügt werden, also lediglich:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;quot;irmp.h&amp;quot;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle anderen Include-Dateien werden automatisch über irmp.h &amp;quot;eingefügt&amp;quot;. Siehe dazu auch die Beispieldatei main.c.&lt;br /&gt;
&lt;br /&gt;
Auch auf PIC-Prozessoren ist IRMP lauffähig. Für den PIC-CCS-Compiler sind entsprechende Preprocessor-Konstanten bereits gesetzt, so dass man irmp.c direkt in der CCS-Entwicklungsumgebung verwenden kann. Lediglich eine kleine Interrupt-Routine wie&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void  TIMER2_isr(void) &lt;br /&gt;
{&lt;br /&gt;
 irmp_ISR ();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ist hinzuzufügen, wobei man den Interrupt auf 66µs (also 15kHz) stellt. &lt;br /&gt;
&lt;br /&gt;
Für AVR-Prozessoren ist ein Beispiel für die Anwendung von IRMP in main.c zu finden - im wesentlichen geht es da um die Timer-Initialisierung und den Abruf der empfangenen IR-Telegramme.&lt;br /&gt;
&lt;br /&gt;
Ebenso läuft IRMP mittlerweile auf STM32-Mikroprozessoren.&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration von IRMP wird über Parameter in irmpconfig.h vorgenommen, nämlich:&lt;br /&gt;
&lt;br /&gt;
* Anzahl Interrupts pro Sekunde&lt;br /&gt;
* Unterstützte IR-Protokolle&lt;br /&gt;
* Hardware-Pin zum IR-Empfänger&lt;br /&gt;
* IR-Logging&lt;br /&gt;
&lt;br /&gt;
=== Einstellungen in irmpconfig.h ===&lt;br /&gt;
&lt;br /&gt;
IRMP decodiert sämtliche oben aufgelisteten Protokolle in einer ISR, siehe irmpconfig.h. Dafür sind einige Angaben nötig. Diese werden in irmpconfig.h eingestellt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;F_INTERRUPTS&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Anzahl der Interrupts pro Sekunde. Der Wert kann zwischen 10000 und 20000 eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
Standardwert:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define F_INTERRUPTS                            15000      // interrupts per second&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMP_SUPPORT_xxx_PROTOCOL&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hier lässt sich einstellen, welche Protokolle von IRMP unterstützt werden sollen. Die Standardprotokolle sind bereits aktiv. Möchte man weitere Protokolle einschalten bzw. einige aus Speicherplatzgründen deaktivieren, sind die entsprechenden Werte in irmpconfig.h anzupassen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// typical protocols, disable here!             Enable  Remarks                 F_INTERRUPTS            Program Space&lt;br /&gt;
#define IRMP_SUPPORT_SIRCS_PROTOCOL             1       // Sony SIRCS           &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRMP_SUPPORT_NEC_PROTOCOL               1       // NEC + APPLE          &amp;gt;= 10000                 ~300 bytes&lt;br /&gt;
#define IRMP_SUPPORT_SAMSUNG_PROTOCOL           1       // Samsung + Samsung32  &amp;gt;= 10000                 ~300 bytes&lt;br /&gt;
#define IRMP_SUPPORT_MATSUSHITA_PROTOCOL        1       // Matsushita           &amp;gt;= 10000                  ~50 bytes&lt;br /&gt;
#define IRMP_SUPPORT_KASEIKYO_PROTOCOL          1       // Kaseikyo             &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRMP_SUPPORT_DENON_PROTOCOL             1       // DENON, Sharp         &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
&lt;br /&gt;
// more protocols, enable here!                 Enable  Remarks                 F_INTERRUPTS            Program Space&lt;br /&gt;
#define IRMP_SUPPORT_RC5_PROTOCOL               0       // RC5                  &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRMP_SUPPORT_RC6_PROTOCOL               0       // RC6 &amp;amp; RC6A           &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRMP_SUPPORT_JVC_PROTOCOL               0       // JVC                  &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRMP_SUPPORT_NEC16_PROTOCOL             0       // NEC16                &amp;gt;= 10000                 ~100 bytes&lt;br /&gt;
#define IRMP_SUPPORT_NEC42_PROTOCOL             0       // NEC42                &amp;gt;= 10000                 ~300 bytes&lt;br /&gt;
#define IRMP_SUPPORT_IR60_PROTOCOL              0       // IR60 (SDA2008)       &amp;gt;= 10000                 ~300 bytes&lt;br /&gt;
#define IRMP_SUPPORT_GRUNDIG_PROTOCOL           0       // Grundig              &amp;gt;= 10000                 ~300 bytes&lt;br /&gt;
#define IRMP_SUPPORT_SIEMENS_PROTOCOL           0       // Siemens Gigaset      &amp;gt;= 15000                 ~550 bytes&lt;br /&gt;
#define IRMP_SUPPORT_NOKIA_PROTOCOL             0       // Nokia                &amp;gt;= 10000                 ~300 bytes&lt;br /&gt;
&lt;br /&gt;
// exotic protocols, enable here!               Enable  Remarks                 F_INTERRUPTS            Program Space&lt;br /&gt;
#define IRMP_SUPPORT_KATHREIN_PROTOCOL          0       // Kathrein             &amp;gt;= 10000                 ~200 bytes&lt;br /&gt;
#define IRMP_SUPPORT_NUBERT_PROTOCOL            0       // NUBERT               &amp;gt;= 10000                  ~50 bytes&lt;br /&gt;
#define IRMP_SUPPORT_BANG_OLUFSEN_PROTOCOL      0       // Bang &amp;amp; Olufsen       &amp;gt;= 10000                 ~200 bytes&lt;br /&gt;
#define IRMP_SUPPORT_RECS80_PROTOCOL            0       // RECS80 (SAA3004)     &amp;gt;= 15000                  ~50 bytes&lt;br /&gt;
#define IRMP_SUPPORT_RECS80EXT_PROTOCOL         0       // RECS80EXT (SAA3008)  &amp;gt;= 15000                  ~50 bytes&lt;br /&gt;
#define IRMP_SUPPORT_THOMSON_PROTOCOL           0       // Thomson              &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRMP_SUPPORT_NIKON_PROTOCOL             0       // NIKON camera         &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRMP_SUPPORT_NETBOX_PROTOCOL            0       // Netbox keyboard      &amp;gt;= 10000                 ~400 bytes (PROTOTYPE!)&lt;br /&gt;
#define IRMP_SUPPORT_FDC_PROTOCOL               0       // FDC3402 keyboard     &amp;gt;= 10000 (better 15000)  ~150 bytes (~400 in combination with RC5)&lt;br /&gt;
#define IRMP_SUPPORT_RCCAR_PROTOCOL             0       // RC Car               &amp;gt;= 10000 (better 15000)  ~150 bytes (~500 in combination with RC5)&lt;br /&gt;
#define IRMP_SUPPORT_RUWIDO_PROTOCOL            0       // RUWIDO, T-Home       &amp;gt;= 15000                 ~550 bytes&lt;br /&gt;
#define IRMP_SUPPORT_LEGO_PROTOCOL              0       // LEGO Power RC        &amp;gt;= 20000                 ~150 bytes&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jedes von IRMP unterstützte IR-Protokoll &amp;quot;verbrät&amp;quot; ungefähr den oben angegebenen Speicher an Code. Hier kann man Optimierungen vornehmen: Zum Beispiel ist die Modulationsfrequenz von 455kHz beim B&amp;amp;O-Protokoll weitab von den Frequenzen, die von den anderen Protokollen verwendet werden. Hier braucht man evtl. andere IR-Empfänger, anderenfalls kann man diese Protokolle einfach deaktiveren. Zum Beispiel kann man mit einem TSOP1738 kein B&amp;amp;O-Protokoll (455kHz) mehr empfangen. &lt;br /&gt;
&lt;br /&gt;
Ausserdem werden die Protokolle SIEMENS/FDC/RCCAR erst ab einer Scan-Frequenz von ca. 15kHz zuverlässig erkannt. Bei RECS80/REC80EXT sind es sogar 20kHz. Wenn man also diese Protokolle nutzen will, muss man F_INTERRUPTS entsprechend anpassen, sonst erscheint beim Übersetzen eine entsprechende Warnung und die entsprechenden Protokolle werden dann automatisch abgeschaltet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMP_PORT_LETTER&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;IRMP_BIT_NUMBER&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über diese Konstanten wird der Pin am µC beschrieben, an welchem der IR-Empfänger angeschlossen ist.&lt;br /&gt;
&lt;br /&gt;
Standardwert ist PORT B6:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/*---------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for ATMEL AVR&lt;br /&gt;
 *---------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#if defined (ATMEL_AVR)                         // use PB6 as IR input on AVR&lt;br /&gt;
#  define IRMP_PORT_LETTER                      B&lt;br /&gt;
#  define IRMP_BIT_NUMBER                       6&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese beiden Werte sind an den tatsächlichen Hardware-Pin des µCs anzupassen. &lt;br /&gt;
&lt;br /&gt;
Dies gilt ebenso für die STM32-µCs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/*----------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for ARM STM32&lt;br /&gt;
 *----------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined (ARM_STM32)                       // use C13 as IR input on STM32&lt;br /&gt;
#  define IRMP_PORT_LETTER                      C&lt;br /&gt;
#  define IRMP_BIT_NUMBER                       13&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei den PIC-Prozessoren gibt es lediglich die anzupassende Konstante &#039;&#039;&#039;IRMP_PIN&#039;&#039;&#039; - je nach Compiler:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/*----------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for PIC C18 compiler&lt;br /&gt;
 *----------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined (PIC_C18)                         // use RB4 as IR input on PIC&lt;br /&gt;
#  define IRMP_PIN                              PORTBbits.RB4&lt;br /&gt;
&lt;br /&gt;
/*----------------------------------------------------------------------------&lt;br /&gt;
 * Change hardware pin here for PIC CCS compiler&lt;br /&gt;
 *----------------------------------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
#elif defined (PIC_CCS)                         // use PB4 as IR input on PIC&lt;br /&gt;
#  define IRMP_PIN                              PIN_B4&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Anwendung von IRMP ===&lt;br /&gt;
&lt;br /&gt;
Die von IRMP unterstützten Protokolle weisen Bitlängen - teilweise variabel, teilweise fest - von 12 bis 48 Bit auf. Diese werden über Preprocessor-Defines beschrieben.&lt;br /&gt;
&lt;br /&gt;
IRMP trennt diese IR-Telegramme prinzipiell in 3 Bereiche:&lt;br /&gt;
&lt;br /&gt;
 1. ID für verwendetes Protokoll&lt;br /&gt;
 2. Adresse bzw. Herstellercode&lt;br /&gt;
 3. Kommando&lt;br /&gt;
&lt;br /&gt;
Mittels der Funktion&lt;br /&gt;
&lt;br /&gt;
   irmp_get_data (IRMP_DATA * irmp_data_p)&lt;br /&gt;
&lt;br /&gt;
kann man ein decodiertes Telegramm abrufen. Der Return-Wert ist 1, wenn ein Telegramm eingelesen wurde, sonst 0. Im ersten Fall werden die Struct-Members&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    irmp_data_p-&amp;gt;protocol&lt;br /&gt;
    irmp_data_p-&amp;gt;address&lt;br /&gt;
    irmp_data_p-&amp;gt;command&lt;br /&gt;
    irmp_data_p-&amp;gt;flags&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gefüllt.&lt;br /&gt;
&lt;br /&gt;
Das heisst: am Ende bekommt man dann über irmp_get_data() einfach drei&lt;br /&gt;
Werte (Protokoll, Adresse und Kommando-Code), die man über ein if oder switch checken kann, z.&amp;amp;nbsp;B. hier eine Routine, welche die Tasten 1-9 auf einer Fernbedienung auswertet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
   IRMP_DATA irmp_data;&lt;br /&gt;
&lt;br /&gt;
   if (irmp_get_data (&amp;amp;irmp_data))&lt;br /&gt;
   {&lt;br /&gt;
      if (irmp_data.protocol == IRMP_NEC_PROTOCOL &amp;amp;&amp;amp;     // NEC-Protokoll&lt;br /&gt;
          irmp_data.address == 0x1234)                   // Adresse 0x1234&lt;br /&gt;
      {&lt;br /&gt;
         switch (irmp_data.command)&lt;br /&gt;
         {&lt;br /&gt;
            case 0x0001: key1_pressed(); break;          // Taste 1&lt;br /&gt;
            case 0x0002: key2_pressed(); break;          // Taste 2&lt;br /&gt;
            ...&lt;br /&gt;
            case 0x0009: key9_pressed(); break;          // Taste 9&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier die möglichen Werte für irmp_data.protocol, siehe auch irmp.h:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define IRMP_SIRCS_PROTOCOL                      1              // Sony&lt;br /&gt;
#define IRMP_NEC_PROTOCOL                        2              // NEC, Pioneer, JVC, Toshiba, NoName etc.&lt;br /&gt;
#define IRMP_SAMSUNG_PROTOCOL                    3              // Samsung&lt;br /&gt;
#define IRMP_MATSUSHITA_PROTOCOL                 4              // Matsushita&lt;br /&gt;
#define IRMP_KASEIKYO_PROTOCOL                   5              // Kaseikyo (Panasonic etc)&lt;br /&gt;
#define IRMP_RECS80_PROTOCOL                     6              // Philips, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
#define IRMP_RC5_PROTOCOL                        7              // Philips etc&lt;br /&gt;
#define IRMP_DENON_PROTOCOL                      8              // Denon, Sharp&lt;br /&gt;
#define IRMP_RC6_PROTOCOL                        9              // Philips etc&lt;br /&gt;
#define IRMP_SAMSUNG32_PROTOCOL                 10              // Samsung32: no sync pulse at bit 16, length 32 instead of 37&lt;br /&gt;
#define IRMP_APPLE_PROTOCOL                     11              // Apple, very similar to NEC&lt;br /&gt;
#define IRMP_RECS80EXT_PROTOCOL                 12              // Philips, Technisat, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
#define IRMP_NUBERT_PROTOCOL                    13              // Nubert&lt;br /&gt;
#define IRMP_BANG_OLUFSEN_PROTOCOL              14              // Bang &amp;amp; Olufsen&lt;br /&gt;
#define IRMP_GRUNDIG_PROTOCOL                   15              // Grundig&lt;br /&gt;
#define IRMP_NOKIA_PROTOCOL                     16              // Nokia&lt;br /&gt;
#define IRMP_SIEMENS_PROTOCOL                   17              // Siemens, e.g. Gigaset&lt;br /&gt;
#define IRMP_FDC_PROTOCOL                       18              // FDC keyboard&lt;br /&gt;
#define IRMP_RCCAR_PROTOCOL                     19              // RC Car&lt;br /&gt;
#define IRMP_JVC_PROTOCOL                       20              // JVC (NEC with 16 bits)&lt;br /&gt;
#define IRMP_RC6A_PROTOCOL                      21              // RC6A, e.g. Kathrein, XBOX&lt;br /&gt;
#define IRMP_NIKON_PROTOCOL                     22              // Nikon&lt;br /&gt;
#define IRMP_RUWIDO_PROTOCOL                    23              // Ruwido, e.g. T-Home Mediareceiver&lt;br /&gt;
#define IRMP_IR60_PROTOCOL                      24              // IR60 (SDA2008)&lt;br /&gt;
#define IRMP_KATHREIN_PROTOCOL                  25              // Kathrein&lt;br /&gt;
#define IRMP_NETBOX_PROTOCOL                    26              // Netbox keyboard (bitserial)&lt;br /&gt;
#define IRMP_NEC16_PROTOCOL                     27              // NEC with 16 bits (incl. sync)&lt;br /&gt;
#define IRMP_NEC42_PROTOCOL                     28              // NEC with 42 bits&lt;br /&gt;
#define IRMP_LEGO_PROTOCOL                      29              // LEGO Power Functions RC&lt;br /&gt;
#define IRMP_THOMSON_PROTOCOL                   30              // Thomson&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Werte für die Adresse und das Kommando muss man natürlich einmal für eine unbekannte Fernbedienung auslesen und dann über ein UART oder LC-Display ausgeben, um sie dann im Programm hart zu kodieren. Oder man hat eine kleine Anlernroutine, wo man einmal die gewünschten Tasten drücken muss, um sie anschließend im EEPROM abzuspeichern. Ein Beispiel dazu findet man im Artikel [http://www.mikrocontroller.net/articles/DIY_Lernfähige_Fernbedienung_mit_IRMP Lernfähige IR-Fernbedienung mit IRMP].&lt;br /&gt;
&lt;br /&gt;
Eine weitere Beispiel-Main-Funktion ist im Zip-File enthalten, da sieht man dann auch die Initialisierung des Timers.&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;Entprellen&amp;quot; von Tasten ===&lt;br /&gt;
&lt;br /&gt;
Um zu unterscheiden, ob eine Taste lange gedrückt wurde oder lediglich einzeln, dient das Bit IRMP_FLAG_REPETITION. Dieses wird im Struct-Member &#039;&#039;&#039;flags&#039;&#039;&#039; gesetzt, wenn eine Taste auf der Fernbedienung längere Zeit gedrückt wurde und dadurch immer wieder dasselbe Kommando innerhalb kurzer Zeitabstände ausgesandt wird.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    if (irmp_data.flags &amp;amp; IRMP_FLAG_REPETITION)&lt;br /&gt;
    {&lt;br /&gt;
      // Benutzer hält die Taste länger runter&lt;br /&gt;
      // entweder:&lt;br /&gt;
      //   ich ignoriere die (Wiederholungs-)Taste&lt;br /&gt;
      // oder:&lt;br /&gt;
      //   ich benutze diese Info, um einen Repeat-Effekt zu nutzen&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      // Es handelt sich um eine neue Taste&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies kann zum Beispiel dafür genutzt werden, um die Tasten 0-9 zu &amp;quot;entprellen&amp;quot;, indem man Kommandos mit gesetztem Bit IRMP_FLAG_REPETITION ignoriert. Bei dem Drücken auf die Tasten VOLUME+ oder VOLUME- kann die wiederholte Auswertung ein und desselben Kommandos aber durchaus gewünscht sein - zum Beispiel, um LEDs zu faden.&lt;br /&gt;
&lt;br /&gt;
Wenn man nur Einzeltasten auswerten will, kann man obigen IF-Block reduzieren auf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    if (! (irmp_data.flags &amp;amp; IRMP_FLAG_REPETITION))&lt;br /&gt;
    {&lt;br /&gt;
      // Es handelt sich um eine neue Taste&lt;br /&gt;
      // ACTION!&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Arbeitsweise ==&lt;br /&gt;
&lt;br /&gt;
Das &amp;quot;Working Horse&amp;quot; von IRMP ist die Interrupt Service Routine irmp_ISR() welche 15.000 mal pro Sekunde aufgerufen werden sollte. Weicht dieser Wert ab, muss die Preprocessor-Konstante F_INTERRUPTS in irmpconfig.h angepasst werden. Der Wert kann zwischen 10kHz und 20kHz eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
irmp_ISR detektiert zunächst die Länge und die Form des/der Startbits und ermittelt daraus das verwendete Protokoll. Sobald das Protokoll erkannt wurde, werden die weiter einzulesenden Bits parametrisiert, um dann möglichst effektiv in den weiteren Aufrufen das komplette IR-Telegramm einzulesen.&lt;br /&gt;
&lt;br /&gt;
Um direkt Kritikern den Wind aus den Segeln zu nehmen:&lt;br /&gt;
&lt;br /&gt;
Ich weiss, die ISR ist ziemlich groß. Aber da sie sich wie eine State Machine verhält, ist der tatsächlich ausgeführte Code pro Durchlauf relativ gering. Solange es &amp;quot;dunkel&amp;quot; ist (und das ist es ja die meiste Zeit ;-)) ist die aufgewendete Zeit sogar verschwindend gering. Im WordClock-Projekt werden mit ein- und demselben Timer 8 ISRs aufgerufen, davon ist die irmp_ISR() nur eine unter vielen. Bei mindestens 8 MHz CPU-Takt traten bisher keine Timing-Probleme auf. Daher sehe ich bei der Länge von irmp_ISR überhaupt kein Problem.&lt;br /&gt;
&lt;br /&gt;
Ein Quarz ist nicht unbedingt notwendig, es funktioniert auch mit dem internen Oszillator des AVRs, wenn man die Prescaler-Fuse entsprechend gesetzt hat, dass die CPU auch mit 8MHz rennt ... Die Fuse-Werte für einen ATMEGA88 findet man in main.c.&lt;br /&gt;
&lt;br /&gt;
== Scannen von unbekannten Protokollen ==&lt;br /&gt;
&lt;br /&gt;
Stellt man in irmpconfig.h in der Zeile&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    #define IRMP_LOGGING    0   // 1: log IR signal (scan), 0: do not (default)&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
den Wert für IRMP_LOGGING auf 1, wird in IRMP eine Protokollierung eingeschaltet: Es werden dann die Hell- und Dunkelphase auf dem UART des Microntrollers mit 9600Bd ausgegeben: 1=Dunkel, 0=Hell. Eventuell müssen dann die Konstanten in den Funktionen uart_init() und uart_putc() angepasst werden; das kommt auf den verwendeten AVR-µC an.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis: Die IRMP-Logging-Funktion (insb. die Ausgabe über UART) ist nicht für PIC-Prozessoren angepasst. Wer immer dies tun möchte, kann sich gerne bei mir (Benutzer [http://www.mikrocontroller.net/user/show/ukw ukw]) per PN melden.&lt;br /&gt;
&lt;br /&gt;
Nimmt man diese Protokoll-Scans mit einem Terminal-Emulationsprogramm auf und speichert sie dann als normale Datei ab, kann man diese Scan-Dateien zur Analyse verwenden, um damit IRMP an das unbekannte Protokoll anzupassen - siehe nächstes Kapitel.&lt;br /&gt;
&lt;br /&gt;
Wer eine Fernbedienung hat, die nicht von IRMP unterstützt wird, kann mir  ([http://www.mikrocontroller.net/user/show/ukw ukw]) gern die Scan-Dateien zuschicken. Ich schaue dann, ob das Protokoll in das IRMP-Konzept passt und passe gegebenenfalls den Source an.&lt;br /&gt;
&lt;br /&gt;
== IRMP unter Linux und Windows ==&lt;br /&gt;
&lt;br /&gt;
irmp.c lässt sich auch unter Linux direkt kompilieren, um damit Infrarot-Scans, welche in Dateien gespeichert sind, direkt zu testen. Im Unterordner IR-Data finden sich solche Dateien, die man dem IRMP direkt zum &amp;quot;Fraß&amp;quot; vorwerfen kann. &lt;br /&gt;
&lt;br /&gt;
Das Übersetzen von IRMP geht folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
    make -f makefile.lnx&lt;br /&gt;
&lt;br /&gt;
Dabei werden 3 IRMP-Versionen erzeugt:&lt;br /&gt;
&lt;br /&gt;
* irmp: Version für 10kHz Scans&lt;br /&gt;
* irmp-15kHz: Version für 15kHz Scans&lt;br /&gt;
* irmp-20kHz: Version für 20kHz Scans&lt;br /&gt;
&lt;br /&gt;
Der Aufruf geschieht dann über:&lt;br /&gt;
&lt;br /&gt;
  ./irmp [-l|-p|-a|-v] &amp;lt; scan-file&lt;br /&gt;
&lt;br /&gt;
Die angegebenen Optionen schließen sich aus, das heisst, es kann jeweils nur eine Option zu einer Zeit angegeben werden:&lt;br /&gt;
&lt;br /&gt;
Option:&lt;br /&gt;
&lt;br /&gt;
   -l  List             gibt eine Liste der Pulse und Pausen aus&lt;br /&gt;
   -a analyze           analysiert die Puls-/Pausen und schreibt ein &amp;quot;Spektrum&amp;quot; in ASCII-Form&lt;br /&gt;
   -v verbose           ausführliche Ausgabe&lt;br /&gt;
   -p  Print Timings    gibt für alle Protokolle eine Timing-Tabelle aus&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Normale Ausgabe:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   ./irmp &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 -------------------------------------------------------------------------&lt;br /&gt;
 # Taste 1&lt;br /&gt;
 00000001110111101000000001111111 p =  2, a = 0x7b80, c = 0x0001, f = 0x00&lt;br /&gt;
 -------------------------------------------------------------------------&lt;br /&gt;
 # Taste 2&lt;br /&gt;
 00000001110111100100000010111111 p =  2, a = 0x7b80, c = 0x0002, f = 0x00&lt;br /&gt;
 -------------------------------------------------------------------------&lt;br /&gt;
 # Taste 3&lt;br /&gt;
 00000001110111101100000000111111 p =  2, a = 0x7b80, c = 0x0003, f = 0x00&lt;br /&gt;
 -------------------------------------------------------------------------&lt;br /&gt;
 # Taste 4&lt;br /&gt;
 00000001110111100010000011011111 p =  2, a = 0x7b80, c = 0x0004, f = 0x00&lt;br /&gt;
 -------------------------------------------------------------------------&lt;br /&gt;
 ...&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Listen-Ausgabe:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   ./irmp -l &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
# Taste 1&lt;br /&gt;
pulse: 91 pause: 44&lt;br /&gt;
pulse: 6 pause: 5&lt;br /&gt;
pulse: 6 pause: 6&lt;br /&gt;
pulse: 6 pause: 5&lt;br /&gt;
pulse: 6 pause: 5&lt;br /&gt;
pulse: 6 pause: 5&lt;br /&gt;
pulse: 6 pause: 6&lt;br /&gt;
pulse: 6 pause: 5&lt;br /&gt;
pulse: 6 pause: 16&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Analyse:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   ./irmp -a &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
START PULSES:&lt;br /&gt;
 90 o 1&lt;br /&gt;
 91 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 33&lt;br /&gt;
 92 ooo 2&lt;br /&gt;
pulse avg: 91.0=9102.8 us, min: 90=9000.0 us, max: 92=9200.0 us, tol:  1.1%&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
START PAUSES:&lt;br /&gt;
 43 oo 1&lt;br /&gt;
 44 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 25&lt;br /&gt;
 45 oooooooooooooooooooooooo 10&lt;br /&gt;
pause avg: 44.2=4425.0 us, min: 43=4300.0 us, max: 45=4500.0 us, tol:  2.8%&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
PULSES:&lt;br /&gt;
  5 o 17&lt;br /&gt;
  6 ooooooooooooooooooooooooooooooooooooooooooooooooooooooo 562&lt;br /&gt;
  7 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 609&lt;br /&gt;
pulse avg:  6.5= 649.8 us, min:  5= 500.0 us, max:  7= 700.0 us, tol: 23.1%&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
PAUSES:&lt;br /&gt;
  4 ooooooooooooooooooooooo 169&lt;br /&gt;
  5 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 412&lt;br /&gt;
  6 oooo 31&lt;br /&gt;
pause avg:  4.8= 477.5 us, min:  4= 400.0 us, max:  6= 600.0 us, tol: 25.7%&lt;br /&gt;
 15 oooooo 43&lt;br /&gt;
 16 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 425&lt;br /&gt;
 17 oooooooooo 72&lt;br /&gt;
pause avg: 16.1=1605.4 us, min: 15=1500.0 us, max: 17=1700.0 us, tol:  6.6%&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier sieht man die gemessenen Zeiten aller Pulse und Pausen als (liegende) Glockenkurven, welche natürlich wegen der ASCII-Darstellung nicht gerade einer Idealkurve entsprechen. Je schmaler die gemessenen Kanäle, desto besser ist das Timing der Fernbedienung.&lt;br /&gt;
&lt;br /&gt;
Aus obigem Output kann man herauslesen:&lt;br /&gt;
&lt;br /&gt;
* Das Start-Bit hat eine Pulslänge zwischen 9000 und 9200 usec, im Mittel sind es 9102 usec. Die Abweichung von diesem Mittelwert liegt bei 1,1 Prozent.&lt;br /&gt;
&lt;br /&gt;
* Das Start-Bit hat eine Pausenlänge zwischen 4300 usec und 4500 usec, der Mittelwert beträgt 4424 usec. Der Fehler liegt bei 2,8 Prozent.&lt;br /&gt;
&lt;br /&gt;
* Die Pulslänge eines Datenbits liegt zwischen 500 usec und 700 usec, im Mittel sind es 650 usec, der Fehler liegt bei (stolzen) 23,1 Prozent!&lt;br /&gt;
&lt;br /&gt;
Desweiteren gibt es noch 2 verschieden lange Pausen (für die Bits 0 und 1), das Ablesen der Werte überlasse ich dem geneigten Leser ;-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ausführliche Ausgabe:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    ./irmp -v &amp;lt; IR-Data/orion_vcr_07660BM070.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
# Taste 1&lt;br /&gt;
   26084 [starting pulse]&lt;br /&gt;
start-bit: pulse = 91, pause = 44&lt;br /&gt;
protocol = NEC, start bit timings: pulse:  53 - 127, pause:  26 -  64&lt;br /&gt;
pulse_1:   2 -   9&lt;br /&gt;
pause_1:   9 -  25&lt;br /&gt;
pulse_0:   2 -   9&lt;br /&gt;
pause_0:   2 -   9&lt;br /&gt;
command_offset: 16&lt;br /&gt;
command_len:     16&lt;br /&gt;
complete_len:    32&lt;br /&gt;
stop_bit:         1&lt;br /&gt;
   26230 [bit  0: pulse =   6, pause =   5] 0&lt;br /&gt;
   26242 [bit  1: pulse =   6, pause =   6] 0&lt;br /&gt;
   26253 [bit  2: pulse =   6, pause =   5] 0&lt;br /&gt;
   26264 [bit  3: pulse =   6, pause =   5] 0&lt;br /&gt;
   ...&lt;br /&gt;
   26749 [bit 31: pulse =   6, pause =  17] 1&lt;br /&gt;
stop bit detected&lt;br /&gt;
code detected, length = 32&lt;br /&gt;
p =  2, a = 0x7b80, c = 0x0001, f = 0x00&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Timing-Tabelle:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
     ./irmp -p&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
IRMP_TIMEOUT_LEN:        165&lt;br /&gt;
IRMP_KEY_REPETITION_LEN  1500&lt;br /&gt;
&lt;br /&gt;
PROTOCOL       S  S-PULSE    S-PAUSE    PULSE-0    PAUSE-0    PULSE-1    PAUSE-1&lt;br /&gt;
====================================================================================&lt;br /&gt;
SIRCS          1   21 -  27    4 -   7    4 -   8    4 -   8   10 -  14    4 -   8&lt;br /&gt;
NEC            1   53 - 127   26 -  64    2 -   9    2 -   9    2 -   9    9 -  25&lt;br /&gt;
NEC (rep)      1   53 - 127   13 -  32    2 -   9    2 -   9    2 -   9    9 -  25&lt;br /&gt;
SAMSUNG        1   40 -  51   40 -  51    3 -   8    2 -   7    3 -   8    9 -  20&lt;br /&gt;
MATSUSHITA     1   27 -  43   27 -  43    4 -  13    4 -  13    4 -  13   15 -  38&lt;br /&gt;
KASEIKYO       1   29 -  38   14 -  20    1 -   8    1 -   7    1 -   8    5 -  20&lt;br /&gt;
RECS80         1    1 -   3   66 -  83    0 -   3   43 -  55    0 -   3   66 -  83&lt;br /&gt;
RC5            1    7 -  11    7 -  11    7 -  11&lt;br /&gt;
DENON          1    1 -   4               1 -   4    6 -  10    1 -   4   16 -  22&lt;br /&gt;
RC6            1   23 -  30    7 -  11    3 -   6&lt;br /&gt;
RECS80EXT      1    1 -   3   34 -  39    0 -   3   43 -  55    0 -   3   66 -  83&lt;br /&gt;
NUBERT         1   10 -  17    2 -   5    3 -   7    9 -  17   10 -  17    2 -   5&lt;br /&gt;
BANG_OLUFSEN   1    1 -   3   27 -  35&lt;br /&gt;
BANG_OLUFSEN   2    1 -   3   27 -  35&lt;br /&gt;
BANG_OLUFSEN   3    1 -   3  140 - 165&lt;br /&gt;
BANG_OLUFSEN   4    1 -   3   27 -  35&lt;br /&gt;
BANG_OLUFSEN   -                          1 -   3   27 -  35    1 -   3   83 - 104&lt;br /&gt;
GRUNDIG/NOKIA  1    3 -   7   22 -  33    3 -   7&lt;br /&gt;
SIEMENS        1    2 -   4    2 -   4    2 -   4&lt;br /&gt;
FDC            1   18 -  24    8 -  12    1 -   5    1 -   3    1 -   5    5 -  10&lt;br /&gt;
RCCAR          1   17 -  23   17 -  23    4 -   8    5 -  13    4 -   8    2 -   7&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei längeren Ausgaben sollte man das Programm &amp;quot;less&amp;quot; verwenden, um seitenweise zu blättern, z.B.:&lt;br /&gt;
&lt;br /&gt;
    ./irmp -v &amp;lt; IR-Data/Samsung_DVD_Rec_00062C.txt | less&lt;br /&gt;
&lt;br /&gt;
Diese Scan-Dateien halfen mir nicht nur bei der Entwicklung des IRMP, sondern können auch bei der Anpassung des Sources an neue IR-Protokolle sehr hilfreich sein.&lt;br /&gt;
&lt;br /&gt;
Mittlerweile kann man IRMP auch unter Windows nutzen, nämlich folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
* Eingabeaufforderung starten&lt;br /&gt;
* In das Verzeichnis irmp wechseln&lt;br /&gt;
* Aufruf von:&lt;br /&gt;
            irmp.exe &amp;lt; IR-Data\rc5x.txt&lt;br /&gt;
&lt;br /&gt;
Da manche Ausgaben sehr lang werden, empfiehlt es sich auch hier, die Ausgabe in eine Datei zu lenken oder in den more weiterzuleiten, damit man seitenweise blättern kann:&lt;br /&gt;
&lt;br /&gt;
            irmp.exe &amp;lt; IR-Data\rc5x.txt | more&lt;br /&gt;
&lt;br /&gt;
Auch hier gelten dieselben Optionen wie für die Linux-Version.&lt;br /&gt;
&lt;br /&gt;
Zusatz:&lt;br /&gt;
&lt;br /&gt;
Der Decoder für das RECS80- und RECS80-Extended-Protokoll ist ungetestet, wurde anhand von Dokumentationen im Internet erstellt und lediglich mittels&lt;br /&gt;
künstlich erzeugten Scan-Dateien getestet... daher: keine Gewähr!&lt;br /&gt;
&lt;br /&gt;
== Fernbedienungen ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Protokoll || Bezeichnung || Gerät || Device Address&lt;br /&gt;
|-&lt;br /&gt;
| NEC || Toshiba CT-9859 || Fernseher || 24384&lt;br /&gt;
|-&lt;br /&gt;
| || Toshiba VT-728G || V-728G Videorekorder || 23364&lt;br /&gt;
|-&lt;br /&gt;
| || Elta 8848 MP 4 || DVD-Player || 32512&lt;br /&gt;
|-&lt;br /&gt;
| || AS-218 || Askey TV-View CHP03X (TV-Karte) || 15238&lt;br /&gt;
|-&lt;br /&gt;
| || Cyberhome ??? || Cyberhome DVD Player || 28018&lt;br /&gt;
|-&lt;br /&gt;
| || WD TV Life || Western Digital Multimediaplayer || 7984&lt;br /&gt;
|-&lt;br /&gt;
| NEC16 || Daewoo || Videorekorder || 21&lt;br /&gt;
|-&lt;br /&gt;
| KASEIKYO || Technics EUR646497 || AV Receiver SA-AX 730 || 8194&lt;br /&gt;
|-&lt;br /&gt;
| RC5 || Loewe Assist/RC3/RC4 || Fernseher (FB auf TV-Mode) || 0&lt;br /&gt;
|-&lt;br /&gt;
| RC6 || Philips Television || Fernseher (FB auf TV-Mode) || 0&lt;br /&gt;
|-&lt;br /&gt;
| SIRCS || Sony RM-816 || Fernseher (FB auf TV-Mode) || 0 (siehe Beschreibung)&lt;br /&gt;
|-&lt;br /&gt;
| DENON || DENON RC970 || AVR3805 (Verstärker) || 8&lt;br /&gt;
|-&lt;br /&gt;
| || DENON RC970 || DVD/CD-Player || 2&lt;br /&gt;
|-&lt;br /&gt;
| || DENON RC970 || Tuner || 6&lt;br /&gt;
|-&lt;br /&gt;
| SAMSUNG32 || Samsung AA59-00484A || LE40D550 Fernseher || 1799&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== IR-Tastaturen ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:irmp-fdc3402.jpg|miniatur|FDC-3402-Tastatur]]&lt;br /&gt;
&lt;br /&gt;
IRMP unterstützt ab Version 1.7.0 auch IR-Tastaturen, nämlich die Infrarot-Tastatur FDC-3402 - erhältlich bei Pollin (Art. 711 056) für weniger als 2 EUR.&lt;br /&gt;
&lt;br /&gt;
Beim Erkennen einer Taste gibt IRMP folgende Daten zurück:&lt;br /&gt;
&lt;br /&gt;
 Protokoll-Nummer (irmp_data.protocol): 18&lt;br /&gt;
 Addresse         (irmp_data.address):  0x003F&lt;br /&gt;
&lt;br /&gt;
Als Kommando (irmp_data.command) werden folgende Werte zurückgeliefert:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code || Taste || Code || Taste || Code || Taste || Code || Taste || Code || Taste || Code || Taste || Code || Taste || Code || Taste&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000 ||      || 0x0010 || TAB || 0x0020 || &#039;s&#039; || 0x0030 || &#039;c&#039; || 0x0040 ||      || 0x0050 || HOME || 0x0060 ||      || 0x0070 || MENUE&lt;br /&gt;
|-&lt;br /&gt;
| 0x0001 || &#039;^&#039; || 0x0011 || &#039;q&#039; || 0x0021 || &#039;d&#039; || 0x0031 || &#039;v&#039; || 0x0041 ||      || 0x0051 || END || 0x0061 ||      || 0x0071 || BACK&lt;br /&gt;
|-&lt;br /&gt;
| 0x0002 || &#039;1&#039; || 0x0012 || &#039;w&#039; || 0x0022 || &#039;f&#039; || 0x0032 || &#039;b&#039; || 0x0042 ||      || 0x0052 ||      || 0x0062 ||      || 0x0072 || FORWARD&lt;br /&gt;
|-&lt;br /&gt;
| 0x0003 || &#039;2&#039; || 0x0013 || &#039;e&#039; || 0x0023 || &#039;g&#039; || 0x0033 || &#039;n&#039; || 0x0043 ||      || 0x0053 || UP || 0x0063 ||      || 0x0073 || ADDRESS&lt;br /&gt;
|-&lt;br /&gt;
| 0x0004 || &#039;3&#039; || 0x0014 || &#039;r&#039; || 0x0024 || &#039;h&#039; || 0x0034 || &#039;m&#039; || 0x0044 ||      || 0x0054 || DOWN || 0x0064 ||      || 0x0074 || WINDOW&lt;br /&gt;
|-&lt;br /&gt;
| 0x0005 || &#039;4&#039; || 0x0015 || &#039;t&#039; || 0x0025 || &#039;j&#039; || 0x0035 || &#039;,&#039; || 0x0045 ||      || 0x0055 || PAGE_UP || 0x0065 ||      || 0x0075 || 1ST_PAGE&lt;br /&gt;
|-&lt;br /&gt;
| 0x0006 || &#039;5&#039; || 0x0016 || &#039;z&#039; || 0x0026 || &#039;k&#039; || 0x0036 || &#039;.&#039; || 0x0046 ||      || 0x0056 || PAGE_DOWN || 0x0066 ||      || 0x0076 || STOP&lt;br /&gt;
|-&lt;br /&gt;
| 0x0007 || &#039;6&#039; || 0x0017 || &#039;u&#039; || 0x0027 || &#039;l&#039; || 0x0037 || &#039;-&#039; || 0x0047 ||      || 0x0057 ||      || 0x0067 ||      || 0x0077 || MAIL&lt;br /&gt;
|-&lt;br /&gt;
| 0x0008 || &#039;7&#039; || 0x0018 || &#039;i&#039; || 0x0028 || &#039;ö&#039; || 0x0038 ||      || 0x0048 ||      || 0x0058 ||      || 0x0068 ||      || 0x0078 || FAVORITES&lt;br /&gt;
|-&lt;br /&gt;
| 0x0009 || &#039;8&#039; || 0x0019 || &#039;o&#039; || 0x0029 || &#039;ä&#039; || 0x0039 || SHIFT_RIGHT || 0x0049 ||      || 0x0059 || RIGHT || 0x0069 ||      || 0x0079 || NEW_PAGE&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A || &#039;9&#039; || 0x001A || &#039;p&#039; || 0x002A || &#039;#&#039; || 0x003A || CTRL || 0x004A ||      || 0x005A ||      || 0x006A ||      || 0x007A || SETUP&lt;br /&gt;
|-&lt;br /&gt;
| 0x000B || &#039;0&#039; || 0x001B || &#039;ü&#039; || 0x002B || CR || 0x003B ||      || 0x004B || INSERT || 0x005B ||      || 0x006B ||      || 0x007B || FONT&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C || &#039;ß&#039; || 0x001C || &#039;+&#039; || 0x002C || SHIFT_LEFT || 0x003C || ALT_LEFT || 0x004C || DELETE || 0x005C ||      || 0x006C ||      || 0x007C || PRINT&lt;br /&gt;
|-&lt;br /&gt;
| 0x000D || &#039;´&#039; || 0x001D ||      || 0x002D || &#039;&amp;lt;&#039; || 0x003D || SPACE || 0x004D ||      || 0x005D ||      || 0x006D ||      || 0x007D ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E ||      || 0x001E || CAPSLOCK || 0x002E || &#039;y&#039; || 0x003E || ALT_RIGHT || 0x004E ||      || 0x005E ||      || 0x006E || ESCAPE || 0x007E || ON_OFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F || BACKSPACE || 0x001F || &#039;a&#039; || 0x002F || &#039;x&#039; || 0x003F ||      || 0x004F || LEFT || 0x005F ||      || 0x006F ||      || 0x007F ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Zusatztasten links:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code || Taste&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| 0x0400 || KEY_MOUSE_1&lt;br /&gt;
|-&lt;br /&gt;
| 0x0800 || KEY_MOUSE_2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dabei gelten die obigen Werte für das Drücken einer Taste. Wird die Taste wieder losgelassen, setzt IRMP zusätzlich das 8. Bit im Kommando.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
      Taste &#039;a&#039; drücken:   0x001F&lt;br /&gt;
      Taste &#039;a&#039; loslassen: 0x009F&lt;br /&gt;
&lt;br /&gt;
Ausnahme ist die EIN/AUS-Taste: Diese sendet nur beim Drücken einen Code, nicht beim Loslassen.&lt;br /&gt;
&lt;br /&gt;
Wird eine Taste länger gedrückt, wird das in irmp_data.flag angezeigt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
                           command   flag&lt;br /&gt;
      Taste &#039;a&#039; drücken:   0x001F    0x00&lt;br /&gt;
      Taste &#039;a&#039; drücken:   0x001F    0x01&lt;br /&gt;
      Taste &#039;a&#039; drücken:   0x001F    0x01&lt;br /&gt;
      Taste &#039;a&#039; drücken:   0x001F    0x01&lt;br /&gt;
      ....&lt;br /&gt;
      Taste &#039;a&#039; loslassen: 0x009F    0x00&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Werden Tastenkombinationen (zum Beispiel für ein großes &#039;A&#039;) gedrückt, dann sind die Rückgabewerte von IRMP in folgendem Ablauf zu sehen:&lt;br /&gt;
&lt;br /&gt;
      Linke SHIFT-Taste drücken:   0x0002&lt;br /&gt;
      Taste &#039;a&#039; drücken:           0x001F&lt;br /&gt;
      Taste &#039;a&#039; loslassen:         0x009F&lt;br /&gt;
      Linke SHIFT-Taste loslassen: 0x0082&lt;br /&gt;
&lt;br /&gt;
In irmp.c findet man für die LINUX-Version eine Funktion get_fdc_key(), welche als Vorlage dienen mag, die Keycodes einer FDC-Tastatur in die entsprechenden ASCII-Codes umzuwandeln. Diese Funktion kann man entweder lokal auf dem µC nutzen, um die Keycodes zu decodieren, oder auf einem Hostsystem (z.B. PC), an welches die IRMP-Data-Struktur gesandt wird. Dafür sollte man die Funktion incl. der dazugehörenden Preprozessor-Konstanten in seinen Applikations-Quelltext kopieren.&lt;br /&gt;
&lt;br /&gt;
Hier der entsprechende Auszug:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define STATE_LEFT_SHIFT    0x01&lt;br /&gt;
#define STATE_RIGHT_SHIFT   0x02&lt;br /&gt;
#define STATE_LEFT_CTRL     0x04&lt;br /&gt;
#define STATE_LEFT_ALT      0x08&lt;br /&gt;
#define STATE_RIGHT_ALT     0x10&lt;br /&gt;
&lt;br /&gt;
#define KEY_ESCAPE          0x1B            // keycode = 0x006e&lt;br /&gt;
#define KEY_MENUE           0x80            // keycode = 0x0070&lt;br /&gt;
#define KEY_BACK            0x81            // keycode = 0x0071&lt;br /&gt;
#define KEY_FORWARD         0x82            // keycode = 0x0072&lt;br /&gt;
#define KEY_ADDRESS         0x83            // keycode = 0x0073&lt;br /&gt;
#define KEY_WINDOW          0x84            // keycode = 0x0074&lt;br /&gt;
#define KEY_1ST_PAGE        0x85            // keycode = 0x0075&lt;br /&gt;
#define KEY_STOP            0x86            // keycode = 0x0076&lt;br /&gt;
#define KEY_MAIL            0x87            // keycode = 0x0077&lt;br /&gt;
#define KEY_FAVORITES       0x88            // keycode = 0x0078&lt;br /&gt;
#define KEY_NEW_PAGE        0x89            // keycode = 0x0079&lt;br /&gt;
#define KEY_SETUP           0x8A            // keycode = 0x007a&lt;br /&gt;
#define KEY_FONT            0x8B            // keycode = 0x007b&lt;br /&gt;
#define KEY_PRINT           0x8C            // keycode = 0x007c&lt;br /&gt;
#define KEY_ON_OFF          0x8E            // keycode = 0x007c&lt;br /&gt;
&lt;br /&gt;
#define KEY_INSERT          0x90            // keycode = 0x004b&lt;br /&gt;
#define KEY_DELETE          0x91            // keycode = 0x004c&lt;br /&gt;
#define KEY_LEFT            0x92            // keycode = 0x004f&lt;br /&gt;
#define KEY_HOME            0x93            // keycode = 0x0050&lt;br /&gt;
#define KEY_END             0x94            // keycode = 0x0051&lt;br /&gt;
#define KEY_UP              0x95            // keycode = 0x0053&lt;br /&gt;
#define KEY_DOWN            0x96            // keycode = 0x0054&lt;br /&gt;
#define KEY_PAGE_UP         0x97            // keycode = 0x0055&lt;br /&gt;
#define KEY_PAGE_DOWN       0x98            // keycode = 0x0056&lt;br /&gt;
#define KEY_RIGHT           0x99            // keycode = 0x0059&lt;br /&gt;
#define KEY_MOUSE_1         0x9E            // keycode = 0x0400&lt;br /&gt;
#define KEY_MOUSE_2         0x9F            // keycode = 0x0800&lt;br /&gt;
&lt;br /&gt;
static uint8_t&lt;br /&gt;
get_fdc_key (uint16_t cmd)&lt;br /&gt;
{&lt;br /&gt;
    static uint8_t key_table[128] =&lt;br /&gt;
    {&lt;br /&gt;
     // 0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F&lt;br /&gt;
        0,  &#039;^&#039;, &#039;1&#039;, &#039;2&#039;, &#039;3&#039;, &#039;4&#039;, &#039;5&#039;, &#039;6&#039;, &#039;7&#039;, &#039;8&#039;, &#039;9&#039;, &#039;0&#039;, &#039;ß&#039;, &#039;´&#039;,  0,  &#039;\b&#039;,&lt;br /&gt;
       &#039;\t&#039;,&#039;q&#039;, &#039;w&#039;, &#039;e&#039;, &#039;r&#039;, &#039;t&#039;, &#039;z&#039;, &#039;u&#039;, &#039;i&#039;, &#039;o&#039;, &#039;p&#039;, &#039;ü&#039;, &#039;+&#039;,  0,   0,  &#039;a&#039;,&lt;br /&gt;
       &#039;s&#039;, &#039;d&#039;, &#039;f&#039;, &#039;g&#039;, &#039;h&#039;, &#039;j&#039;, &#039;k&#039;, &#039;l&#039;, &#039;ö&#039;, &#039;ä&#039;, &#039;#&#039;,  &#039;\r&#039;, 0,  &#039;&amp;lt;&#039;, &#039;y&#039;, &#039;x&#039;,&lt;br /&gt;
       &#039;c&#039;, &#039;v&#039;, &#039;b&#039;, &#039;n&#039;, &#039;m&#039;, &#039;,&#039;, &#039;.&#039;, &#039;-&#039;,  0,   0,   0,   0,   0,  &#039; &#039;,  0,   0,&lt;br /&gt;
&lt;br /&gt;
        0,  &#039;°&#039;, &#039;!&#039;, &#039;&amp;quot;&#039;, &#039;§&#039;, &#039;$&#039;, &#039;%&#039;, &#039;&amp;amp;&#039;, &#039;/&#039;, &#039;(&#039;, &#039;)&#039;, &#039;=&#039;, &#039;?&#039;, &#039;`&#039;,  0,  &#039;\b&#039;,&lt;br /&gt;
       &#039;\t&#039;,&#039;Q&#039;, &#039;W&#039;, &#039;E&#039;, &#039;R&#039;, &#039;T&#039;, &#039;Z&#039;, &#039;U&#039;, &#039;I&#039;, &#039;O&#039;, &#039;P&#039;, &#039;Ü&#039;, &#039;*&#039;,  0,   0,  &#039;A&#039;,&lt;br /&gt;
       &#039;S&#039;, &#039;D&#039;, &#039;F&#039;, &#039;G&#039;, &#039;H&#039;, &#039;J&#039;, &#039;K&#039;, &#039;L&#039;, &#039;Ö&#039;, &#039;Ä&#039;, &#039;\&#039;&#039;,&#039;\r&#039;, 0,  &#039;&amp;gt;&#039;, &#039;Y&#039;, &#039;X&#039;,&lt;br /&gt;
       &#039;C&#039;, &#039;V&#039;, &#039;B&#039;, &#039;N&#039;, &#039;M&#039;, &#039;;&#039;, &#039;:&#039;, &#039;_&#039;,  0,   0,   0,   0,   0,  &#039; &#039;,  0,   0&lt;br /&gt;
    };&lt;br /&gt;
    static uint8_t state;&lt;br /&gt;
&lt;br /&gt;
    uint8_t key = 0;&lt;br /&gt;
&lt;br /&gt;
    switch (cmd)&lt;br /&gt;
    {&lt;br /&gt;
        case 0x002C: state |=  STATE_LEFT_SHIFT;    break;              // pressed left shift&lt;br /&gt;
        case 0x00AC: state &amp;amp;= ~STATE_LEFT_SHIFT;    break;              // released left shift&lt;br /&gt;
        case 0x0039: state |=  STATE_RIGHT_SHIFT;   break;              // pressed right shift&lt;br /&gt;
        case 0x00B9: state &amp;amp;= ~STATE_RIGHT_SHIFT;   break;              // released right shift&lt;br /&gt;
        case 0x003A: state |=  STATE_LEFT_CTRL;     break;              // pressed left ctrl&lt;br /&gt;
        case 0x00BA: state &amp;amp;= ~STATE_LEFT_CTRL;     break;              // released left ctrl&lt;br /&gt;
        case 0x003C: state |=  STATE_LEFT_ALT;      break;              // pressed left alt&lt;br /&gt;
        case 0x00BC: state &amp;amp;= ~STATE_LEFT_ALT;      break;              // released left alt&lt;br /&gt;
        case 0x003E: state |=  STATE_RIGHT_ALT;     break;              // pressed left alt&lt;br /&gt;
        case 0x00BE: state &amp;amp;= ~STATE_RIGHT_ALT;     break;              // released left alt&lt;br /&gt;
&lt;br /&gt;
        case 0x006e: key = KEY_ESCAPE;              break;&lt;br /&gt;
        case 0x004b: key = KEY_INSERT;              break;&lt;br /&gt;
        case 0x004c: key = KEY_DELETE;              break;&lt;br /&gt;
        case 0x004f: key = KEY_LEFT;                break;&lt;br /&gt;
        case 0x0050: key = KEY_HOME;                break;&lt;br /&gt;
        case 0x0051: key = KEY_END;                 break;&lt;br /&gt;
        case 0x0053: key = KEY_UP;                  break;&lt;br /&gt;
        case 0x0054: key = KEY_DOWN;                break;&lt;br /&gt;
        case 0x0055: key = KEY_PAGE_UP;             break;&lt;br /&gt;
        case 0x0056: key = KEY_PAGE_DOWN;           break;&lt;br /&gt;
        case 0x0059: key = KEY_RIGHT;               break;&lt;br /&gt;
        case 0x0400: key = KEY_MOUSE_1;             break;&lt;br /&gt;
        case 0x0800: key = KEY_MOUSE_2;             break;&lt;br /&gt;
&lt;br /&gt;
        default:&lt;br /&gt;
        {&lt;br /&gt;
            if (!(cmd &amp;amp; 0x80))                      // pressed key&lt;br /&gt;
            {&lt;br /&gt;
                if (cmd &amp;gt;= 0x70 &amp;amp;&amp;amp; cmd &amp;lt;= 0x7F)     // function keys&lt;br /&gt;
                {&lt;br /&gt;
                    key = cmd + 0x10;               // 7x -&amp;gt; 8x&lt;br /&gt;
                }&lt;br /&gt;
                else if (cmd &amp;lt; 64)                  // key listed in key_table&lt;br /&gt;
                {&lt;br /&gt;
                    if (state &amp;amp; (STATE_LEFT_ALT | STATE_RIGHT_ALT))&lt;br /&gt;
                    {&lt;br /&gt;
                        switch (cmd)&lt;br /&gt;
                        {&lt;br /&gt;
                            case 0x0003: key = &#039;²&#039;;     break;&lt;br /&gt;
                            case 0x0008: key = &#039;{&#039;;     break;&lt;br /&gt;
                            case 0x0009: key = &#039;[&#039;;     break;&lt;br /&gt;
                            case 0x000A: key = &#039;]&#039;;     break;&lt;br /&gt;
                            case 0x000B: key = &#039;}&#039;;     break;&lt;br /&gt;
                            case 0x000C: key = &#039;\\&#039;;    break;&lt;br /&gt;
                            case 0x001C: key = &#039;~&#039;;     break;&lt;br /&gt;
                            case 0x002D: key = &#039;|&#039;;     break;&lt;br /&gt;
                            case 0x0034: key = &#039;µ&#039;;     break;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    else if (state &amp;amp; (STATE_LEFT_CTRL))&lt;br /&gt;
                    {&lt;br /&gt;
                        if (key_table[cmd] &amp;gt;= &#039;a&#039; &amp;amp;&amp;amp; key_table[cmd] &amp;lt;= &#039;z&#039;)&lt;br /&gt;
                        {&lt;br /&gt;
                            key = key_table[cmd] - &#039;a&#039; + 1;&lt;br /&gt;
                        }&lt;br /&gt;
                        else&lt;br /&gt;
                        {&lt;br /&gt;
                            key = key_table[cmd];&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        int idx = cmd + ((state &amp;amp; (STATE_LEFT_SHIFT | STATE_RIGHT_SHIFT)) ? 64 : 0);&lt;br /&gt;
&lt;br /&gt;
                        if (key_table[idx])&lt;br /&gt;
                        {&lt;br /&gt;
                            key = key_table[idx];&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return (key);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als letztes noch ein Beispiel einer Anwendung der Funktion get_fdc_key():&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    if (irmp_get_data (&amp;amp;irmp_data))&lt;br /&gt;
    {&lt;br /&gt;
        uint8_t key;&lt;br /&gt;
&lt;br /&gt;
        if (irmp_data.protocol == IRMP_FDC_PROTOCOL &amp;amp;&amp;amp;&lt;br /&gt;
            (key = get_fdc_key (irmp_data.command)) != 0)&lt;br /&gt;
        {&lt;br /&gt;
            if ((key &amp;gt;= 0x20 &amp;amp;&amp;amp; key &amp;lt; 0x7F) || key &amp;gt;= 0xA0) // show only printable characters&lt;br /&gt;
            {&lt;br /&gt;
                printf (&amp;quot;ascii-code = 0x%02x, character = &#039;%c&#039;\n&amp;quot;, key, key);&lt;br /&gt;
            }&lt;br /&gt;
            else // it&#039;s a non-printable key&lt;br /&gt;
            {&lt;br /&gt;
                printf (&amp;quot;ascii-code = 0x%02x\n&amp;quot;, key);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle nicht-druckbaren Zeichen werden dabei folgendermaßen codiert:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Taste             || Konstante                || Wert&lt;br /&gt;
|-&lt;br /&gt;
| ESC               || KEY_ESCAPE              || 0x1B&lt;br /&gt;
|-&lt;br /&gt;
| Menü              || KEY_MENUE               || 0x80&lt;br /&gt;
|-&lt;br /&gt;
| Zurück            || KEY_BACK                || 0x81&lt;br /&gt;
|-&lt;br /&gt;
| Vorw.             || KEY_FORWARD             || 0x82&lt;br /&gt;
|-&lt;br /&gt;
| Adresse           || KEY_ADDRESS             || 0x83&lt;br /&gt;
|-&lt;br /&gt;
| Fenster           || KEY_WINDOW              || 0x84&lt;br /&gt;
|-&lt;br /&gt;
| 1. Seite          || KEY_1ST_PAGE            || 0x85&lt;br /&gt;
|-&lt;br /&gt;
| Stop              || KEY_STOP                || 0x86&lt;br /&gt;
|-&lt;br /&gt;
| Mail              || KEY_MAIL                || 0x87&lt;br /&gt;
|-&lt;br /&gt;
| Fav.              || KEY_FAVORITES           || 0x88&lt;br /&gt;
|-&lt;br /&gt;
| Neue Seite        || KEY_NEW_PAGE            || 0x89&lt;br /&gt;
|-&lt;br /&gt;
| Setup             || KEY_SETUP               || 0x8A&lt;br /&gt;
|-&lt;br /&gt;
| Schrift           || KEY_FONT                || 0x8B&lt;br /&gt;
|-&lt;br /&gt;
| Druck             || KEY_PRINT               || 0x8C&lt;br /&gt;
|-&lt;br /&gt;
| Ein/Aus           || KEY_ON_OFF              || 0x8E&lt;br /&gt;
|-&lt;br /&gt;
| Backspace         || &#039;\b&#039;                    || 0x08&lt;br /&gt;
|-&lt;br /&gt;
| CR/ENTER          || &#039;\r&#039;                    || 0x0C&lt;br /&gt;
|-&lt;br /&gt;
| TAB               || &#039;\t&#039;                    || 0x09&lt;br /&gt;
|-&lt;br /&gt;
| Einfg             || KEY_INSERT              || 0x90&lt;br /&gt;
|-&lt;br /&gt;
| Entf              || KEY_DELETE              || 0x91&lt;br /&gt;
|-&lt;br /&gt;
| Cursor links      || KEY_LEFT                || 0x92&lt;br /&gt;
|-&lt;br /&gt;
| Pos1              || KEY_HOME                || 0x93&lt;br /&gt;
|-&lt;br /&gt;
| Ende              || KEY_END                 || 0x94&lt;br /&gt;
|-&lt;br /&gt;
| Cursor rechts     || KEY_UP                  || 0x95&lt;br /&gt;
|-&lt;br /&gt;
| Cursor runter     || KEY_DOWN                || 0x96&lt;br /&gt;
|-&lt;br /&gt;
| Bild hoch         || KEY_PAGE_UP             || 0x97&lt;br /&gt;
|-&lt;br /&gt;
| Bild runter       || KEY_PAGE_DOWN           || 0x98&lt;br /&gt;
|-&lt;br /&gt;
| Cursor links      || KEY_RIGHT               || 0x99&lt;br /&gt;
|-&lt;br /&gt;
| Linke Maustaste   || KEY_MOUSE_1             || 0x9E&lt;br /&gt;
|-&lt;br /&gt;
| Rechte Maustaste  || KEY_MOUSE_2             || 0x9F&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Funktion get_fdc_key berücksichtigt das Gedrückthalten der Shift-, Strg- und ALT-Tasten. Damit funktioniert nicht nur das Schreiben von Großbuchstaben, sondern auch das Auswählen der Sonderzeichen mit der Tastenkombination  ALT + Taste, z.B. ALT + m = µ oder ALT + q = @. Ebenso kann man mit der Strg-Taste die Control-Zeichen CTRL-A bis CTRL-Z senden. Die CapsLock-Taste wird ignoriert, da ich sie sowieso für die überflüssigste Taste überhaupt halte ;-)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= IRSND - Infrarot-Multiprotokoll-Encoder =&lt;br /&gt;
&lt;br /&gt;
[[Datei:irmp-title.png| |Scan eines NEC-kompatiblen Fernbedienungssignals]]&lt;br /&gt;
&lt;br /&gt;
== Einleitung IRSND ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:ir-sender.png|miniatur|Anschluß eines einfachen IR-Senders an µC]]&lt;br /&gt;
&lt;br /&gt;
IRSND ist das Gegenstück zu IRMP: es reproduziert aus den Daten, die mit IRMP empfangen wurden, wieder den Original Frame, der dann über eine Infrarot-Diode ausgegeben werden kann.&lt;br /&gt;
&lt;br /&gt;
IRSND ist lauffähig auf folgenden AVR µCs:&lt;br /&gt;
&lt;br /&gt;
* ATtiny45,  ATtiny85&lt;br /&gt;
* ATtiny84&lt;br /&gt;
* ATmega8,   ATmega16,  ATmega32&lt;br /&gt;
* ATmega162&lt;br /&gt;
* ATmega164, ATmega324, ATmega644,  ATmega644P, ATmega1284&lt;br /&gt;
* ATmega88,  ATmega88P, ATmega168,  ATmega168P, ATmega328P&lt;br /&gt;
&lt;br /&gt;
IRSND unterstützt die folgenden Protokolle:&lt;br /&gt;
&lt;br /&gt;
* SIRCS&lt;br /&gt;
* NEC&lt;br /&gt;
* SAMSUNG&lt;br /&gt;
* SAMSUNG32&lt;br /&gt;
* MATSUSHITA&lt;br /&gt;
* RC5&lt;br /&gt;
* KASEIKYO&lt;br /&gt;
* DENON&lt;br /&gt;
* JVC&lt;br /&gt;
* APPLE&lt;br /&gt;
* NUBERT&lt;br /&gt;
* BANG_OLUFSEN&lt;br /&gt;
* GRUNDIG&lt;br /&gt;
* NOKIA&lt;br /&gt;
* SIEMENS (bei mind. ~15kHz)&lt;br /&gt;
* FDC (bei mind. ~15kHz)&lt;br /&gt;
* RCCAR (bei mind. ~15kHz)&lt;br /&gt;
* RECS80 (bei mind. ~20kHz)&lt;br /&gt;
* RECS80EXT (bei mind. ~20kHz)&lt;br /&gt;
* NIKON&lt;br /&gt;
* RC6&lt;br /&gt;
* RC6A&lt;br /&gt;
* THOMSON&lt;br /&gt;
* NEC16&lt;br /&gt;
* NEC42&lt;br /&gt;
* LEGO&lt;br /&gt;
* IR60 (&#039;&#039;&#039;NEU&#039;&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
== Download IRSND ==&lt;br /&gt;
&lt;br /&gt;
Version 2.2.0, Stand vom 23.05.2012&lt;br /&gt;
&lt;br /&gt;
Download Release-Version: [http://www.mikrocontroller.net/wikifiles/c/c7/Irsnd.zip Irsnd.zip] &lt;br /&gt;
&lt;br /&gt;
IRMP &amp;amp; IRSND sind nun auch über SVN abrufbar: [http://www.mikrocontroller.net/svnbrowser/irmp/ IRMP im SVN]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Version im SVN kann eine Zwischen- oder Test-Version sein, die nicht den hier dokumentierten Stand widerspiegelt! Im Zweifel verwendet man besser den obigen Download auf Irsnd.zip.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die Software-Änderungen kann man sich hier anschauen: [http://www.mikrocontroller.net/articles/IRMP#Software-Historie_IRSND Software-Historie IRSND]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Source-Code IRSND ==&lt;br /&gt;
&lt;br /&gt;
Der Source-Code lässt sich einfach übersetzen, indem man unter Windows die Projekt-Datei irsnd.aps in das AVRStudio 4 lädt.&lt;br /&gt;
&lt;br /&gt;
Auch für andere Entwicklungsumgebungen lässt sich leicht ein Projekt bzw. Makefile zusammenstellen. Zum IRSND-Source gehören folgende Dateien:&lt;br /&gt;
&lt;br /&gt;
* irsnd.c - Der eigentliche IR-Encoder&lt;br /&gt;
* irmpprotocols.h - Sämtliche Definitionen zu den IR-Protokollen&lt;br /&gt;
* irmpsystem.h - Vom Zielsystem abhängige Definitionen für AVR/PIC/STM32&lt;br /&gt;
* irsnd.h - Include-Datei für die Applikation&lt;br /&gt;
* irsndconfig.h - Anzupassende Konfigurationsdatei &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;WICHTIG:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Im Applikations-Source sollte nur irsnd.h per include eingefügt werden, also lediglich:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;quot;irsnd.h&amp;quot;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle anderen Include-Dateien werden automatisch über irsnd.h &amp;quot;eingefügt&amp;quot;. Siehe dazu auch die Beispieldatei irsndmain.c.&lt;br /&gt;
&lt;br /&gt;
IRSND encodiert sämtliche oben aufgelisteten Protokolle in einer ISR, siehe irsnd.c.&lt;br /&gt;
&lt;br /&gt;
=== Einstellungen in irsndconfig.h ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;F_INTERRUPTS&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Anzahl der Interrupts pro Sekunde. Der Wert kann zwischen 10000 und 20000 eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
Standardwert:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define F_INTERRUPTS                            15000      // interrupts per second&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRSND_SUPPORT_xxx_PROTOCOL&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hier lässt sich einstellen, welche Protokolle von IRSND unterstützt werden sollen. Die Standardprotokolle sind bereits aktiv. Möchte man weitere Protokolle einschalten bzw. einige aus Speicherplatzgründen deaktivieren, sind die entsprechenden Werte in irsndconfig.h anzupassen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// typical protocols, disable here!             Enable  Remarks                 F_INTERRUPTS            Program Space&lt;br /&gt;
#define IRSND_SUPPORT_SIRCS_PROTOCOL            1       // Sony SIRCS           &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_NEC_PROTOCOL              1       // NEC + APPLE          &amp;gt;= 10000                 ~100 bytes&lt;br /&gt;
#define IRSND_SUPPORT_SAMSUNG_PROTOCOL          1       // Samsung + Samsung32  &amp;gt;= 10000                 ~300 bytes&lt;br /&gt;
#define IRSND_SUPPORT_MATSUSHITA_PROTOCOL       1       // Matsushita           &amp;gt;= 10000                 ~200 bytes&lt;br /&gt;
#define IRSND_SUPPORT_KASEIKYO_PROTOCOL         1       // Kaseikyo             &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_DENON_PROTOCOL            1       // DENON, Sharp         &amp;gt;= 10000                 ~200 bytes&lt;br /&gt;
&lt;br /&gt;
// more protocols, enable here!                 Enable  Remarks                 F_INTERRUPTS            Program Space&lt;br /&gt;
#define IRSND_SUPPORT_RC5_PROTOCOL              0       // RC5                  &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_RC6_PROTOCOL              0       // RC6                  &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRSND_SUPPORT_RC6A_PROTOCOL             0       // RC6A                 &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRSND_SUPPORT_JVC_PROTOCOL              0       // JVC                  &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_NEC16_PROTOCOL            0       // NEC16                &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_NEC42_PROTOCOL            0       // NEC42                &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_IR60_PROTOCOL             0       // IR60 (SDA2008)       &amp;gt;= 10000                 DON&#039;T CHANGE, NOT SUPPORTED YET!&lt;br /&gt;
#define IRSND_SUPPORT_GRUNDIG_PROTOCOL          0       // Grundig              &amp;gt;= 10000                 ~300 bytes&lt;br /&gt;
#define IRSND_SUPPORT_SIEMENS_PROTOCOL          0       // Siemens, Gigaset     &amp;gt;= 15000                 ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_NOKIA_PROTOCOL            0       // Nokia                &amp;gt;= 10000                 ~400 bytes&lt;br /&gt;
&lt;br /&gt;
// exotic protocols, enable here!               Enable  Remarks                 F_INTERRUPTS            Program Space&lt;br /&gt;
#define IRSND_SUPPORT_KATHREIN_PROTOCOL         0       // Kathrein             &amp;gt;= 10000                 DON&#039;T CHANGE, NOT SUPPORTED YET!&lt;br /&gt;
#define IRSND_SUPPORT_NUBERT_PROTOCOL           0       // NUBERT               &amp;gt;= 10000                 ~100 bytes&lt;br /&gt;
#define IRSND_SUPPORT_BANG_OLUFSEN_PROTOCOL     0       // Bang&amp;amp;Olufsen         &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRSND_SUPPORT_RECS80_PROTOCOL           0       // RECS80               &amp;gt;= 20000                 ~100 bytes&lt;br /&gt;
#define IRSND_SUPPORT_RECS80EXT_PROTOCOL        0       // RECS80EXT            &amp;gt;= 20000                 ~100 bytes&lt;br /&gt;
#define IRSND_SUPPORT_THOMSON_PROTOCOL          0       // Thomson              &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRSND_SUPPORT_NIKON_PROTOCOL            0       // NIKON                &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_NETBOX_PROTOCOL           0       // Netbox keyboard      &amp;gt;= 10000                 DON&#039;T CHANGE, NOT SUPPORTED YET!&lt;br /&gt;
#define IRSND_SUPPORT_FDC_PROTOCOL              0       // FDC IR keyboard      &amp;gt;= 10000 (better 15000)  ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_RCCAR_PROTOCOL            0       // RC CAR               &amp;gt;= 10000 (better 15000)  ~150 bytes&lt;br /&gt;
#define IRSND_SUPPORT_RUWIDO_PROTOCOL           0       // RUWIDO, T-Home       &amp;gt;= 15000                 DON&#039;T CHANGE, NOT SUPPORTED YET!&lt;br /&gt;
#define IRSND_SUPPORT_LEGO_PROTOCOL             0       // LEGO Power RC        &amp;gt;= 20000                 ~150 bytes&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit Setzen auf 0 wird das Protokoll deaktiviert, mit Setzen auf 1 wird es aktiviert. Die deaktivierten Protokolle werden dann nicht mitübersetzt. Das spart Speicherplatz im Flash, siehe Angaben in obigen Kommentaren. Wenn man unbedingt Speicherplatz sparen muss, gelten natürlich hier dieselben Tipps wie für IRMP.&lt;br /&gt;
&lt;br /&gt;
Um das APPLE-Protokoll zu unterstützen, ist IRSND_SUPPORT_NEC_PROTOCOL auf 1 zu setzen, da es sich hier lediglich um einen Spezialfall vom NEC-Protokoll handelt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRSND_OCx&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Für das Senden der IR-Signale benötigt IRSND einen PWM-fähigen Output-Pin, da das Signal moduliert werden muss. Möglich sind eine der folgenden Einstellungen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define IRSND_OCx                               IRSND_OC2  // OC2  on ATmegas         supporting OC2,  e.g. ATmega8&lt;br /&gt;
#define IRSND_OCx                               IRSND_OC2A // OC2A on ATmegas         supporting OC2A, e.g. ATmega88&lt;br /&gt;
#define IRSND_OCx                               IRSND_OC2B // OC2B on ATmegas         supporting OC2B, e.g. ATmega88&lt;br /&gt;
#define IRSND_OCx                               IRSND_OC0  // OC0  on ATmegas         supporting OC0,  e.g. ATmega162&lt;br /&gt;
#define IRSND_OCx                               IRSND_OC0A // OC0A on ATmegas/ATtinys supporting OC0A, e.g. ATtiny84, ATtiny85&lt;br /&gt;
#define IRSND_OCx                               IRSND_OC0B // OC0B on ATmegas/ATtinys supporting OC0B, e.g. ATtiny84, ATtiny85&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Standardwert:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define IRSND_OCx                               IRSND_OC2B&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die PIC- und STM32-µCs sind entsprechende Werte anzupassen, siehe Kommentare in irsndconfig.h.&lt;br /&gt;
&lt;br /&gt;
IRSND baut den zu sendenden Frame &amp;quot;on-the-fly&amp;quot; aus der IRMP-Datenstruktur wieder zusammen. Dazu zählen:&lt;br /&gt;
&lt;br /&gt;
 1. ID für verwendetes Protokoll&lt;br /&gt;
 2. Adresse bzw. Herstellercode&lt;br /&gt;
 3. Kommando&lt;br /&gt;
&lt;br /&gt;
Mittels der Funktion&lt;br /&gt;
&lt;br /&gt;
   irsnd_send_data (IRMP_DATA * irmp_data_p)&lt;br /&gt;
&lt;br /&gt;
kann man ein zu encodierendes Telegramm versenden. Der Return-Wert ist 1, wenn das Telegramm versendet werden kann, sonst 0. Im ersten Fall werden die Struct-Members&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    irmp_data_p-&amp;gt;protocol&lt;br /&gt;
    irmp_data_p-&amp;gt;address&lt;br /&gt;
    irmp_data_p-&amp;gt;command&lt;br /&gt;
    irmp_data_p-&amp;gt;flags&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ausgelesen und dann als Frame im jeweils gewünschten Protokoll gesendet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NEU ab Version 1.5.0:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
irmp_data_p-&amp;gt;flags gibt die Anzahl der Wiederholungen an, z.B.&lt;br /&gt;
&lt;br /&gt;
  irmp_data_p-&amp;gt;flags = 0: Verhalten wie bisher&lt;br /&gt;
  irmp_data_p-&amp;gt;flags = 1: 1 Wiederholung&lt;br /&gt;
  irmp_data_p-&amp;gt;flags = 2: 2 Wiederholungen&lt;br /&gt;
  usw.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zu beachten: Da bisher irmp_data_p-&amp;gt;flags von IRSND nicht ausgewertet wurde, ist unbedingt ab Version 1.5.0 darauf zu achten, dass irmp_data_p-&amp;gt;flags vor dem Aufruf von irsnd_send_data() einen definierten Wert hat!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
   IRMP_DATA irmp_data;&lt;br /&gt;
&lt;br /&gt;
   irmp_data.protocol = IRMP_NEC_PROTOCOL;   // sende im NEC-Protokoll&lt;br /&gt;
   irmp_data.address  = 0x00FF;              // verwende Adresse 0x00FF&lt;br /&gt;
   irmp_data.command  = 0x0001;              // sende Kommando 0001&lt;br /&gt;
   irmp_data.flags    = 0;                   // keine Wiederholung!&lt;br /&gt;
&lt;br /&gt;
   (void) irsnd_send_data (&amp;amp;irmp_data);      // versende ohne Prüfung&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Frame wird asynchron über die Interrupt-Routine irsnd_ISR() verschickt, so dass die Funktion irsnd_send_data() sofort zurückkommt.&lt;br /&gt;
&lt;br /&gt;
Sind Wiederholungen angegeben, wird entweder der Frame nach einer Pause (protokollabhängig) neu ausgegeben oder ein protokollspezifischer Wiederholungsframe (z.B. für NEC) gesendet.&lt;br /&gt;
&lt;br /&gt;
Wird erneut irsnd_send_data() aufgerufen, wartet diese, bis der vorhergenhende Frame vollständig verschickt wurde. Man kann aber auch selbst prüfen, ob IRSND gerade &amp;quot;busy&amp;quot; ist oder nicht:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
   while (irsnd_is_busy ())&lt;br /&gt;
   {&lt;br /&gt;
      ;                                      // selber warten oder was anderes tun...&lt;br /&gt;
   }&lt;br /&gt;
   (void) irsnd_send_data (&amp;amp;irmp_data);      // versende ohne Prüfung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Beispiel-Source irsndmain.c findet man neben der Verwendung von irsnd_send_data() auch den Timer-Aufruf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
  irsnd_ISR())          // call irsnd ISR&lt;br /&gt;
  // call other timer interrupt routines...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Paralleles Betreiben von IRMP und IRSND ===&lt;br /&gt;
&lt;br /&gt;
Möchte man IRMP und IRSND parallel verwenden (also als Sender und Empfänger) schreibt man die ISR folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
  if (! irsnd_ISR())          // call irsnd ISR&lt;br /&gt;
  {                           // if not busy...&lt;br /&gt;
      irmp_ISR();             // call irmp ISR&lt;br /&gt;
  }&lt;br /&gt;
  // call other timer interrupt routines...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das heisst: Nur wenn irsnd_ISR() nichts zu tun hat, dann rufe die ISR des Empfängers auf. Damit ist der Empfänger solange abgeschaltet, während irsnd_ISR() noch Daten sendet. Die Timer-Initialisierungsroutine ist für IRMP und IRSND dann natürlich dieselbe.&lt;br /&gt;
&lt;br /&gt;
Eine gemeinsame main-Funktion könnte dann zum Beispiel folgendermaßen aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
int&lt;br /&gt;
main (void)&lt;br /&gt;
{&lt;br /&gt;
  IRMP_DATA irmp_data;&lt;br /&gt;
&lt;br /&gt;
  irmp_init();                // initialize irmp&lt;br /&gt;
  irsnd_init();               // initialize irsnd&lt;br /&gt;
  timer_init();               // initialize timer&lt;br /&gt;
  sei ();                     // enable interrupts&lt;br /&gt;
&lt;br /&gt;
  for (;;)&lt;br /&gt;
  {&lt;br /&gt;
    if (irmp_get_data (&amp;amp;irmp_data))&lt;br /&gt;
    {&lt;br /&gt;
      irmp_data.flags = 0;    // reset flags!&lt;br /&gt;
      irsnd_send_data (&amp;amp;irmp_data);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion des obigen Sources ist offensichtlich: Ein empfangenes Telegramm wird nach vollständiger Decodierung wieder encodiert und dann wieder über die IR-Diode ausgesandt. Somit können dann zum Beispiel Signale &amp;quot;um die Ecke&amp;quot; oder streckenweise drahtgebunden übertragen werden.&lt;br /&gt;
&lt;br /&gt;
Desweiteren könnte man auch Protokolle transformieren, zum Beispiel NEC-Telegramme in RC5 umwandeln, wenn man seine Original-RC5-FB zu seinem Philips-Gerät verlegt hat...&lt;br /&gt;
&lt;br /&gt;
Der Rest bleibt der Phantasie des geneigten Lesers überlassen ;-)&lt;br /&gt;
&lt;br /&gt;
Hier noch die möglichen Werte für irmp_data.protocol, siehe auch irmp.h:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define IRMP_SIRCS_PROTOCOL                      1              // Sony&lt;br /&gt;
#define IRMP_NEC_PROTOCOL                        2              // NEC, Pioneer, JVC, Toshiba, NoName etc.&lt;br /&gt;
#define IRMP_SAMSUNG_PROTOCOL                    3              // Samsung&lt;br /&gt;
#define IRMP_MATSUSHITA_PROTOCOL                 4              // Matsushita&lt;br /&gt;
#define IRMP_KASEIKYO_PROTOCOL                   5              // Kaseikyo (Panasonic etc)&lt;br /&gt;
#define IRMP_RECS80_PROTOCOL                     6              // Philips, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
#define IRMP_RC5_PROTOCOL                        7              // Philips etc&lt;br /&gt;
#define IRMP_DENON_PROTOCOL                      8              // Denon, Sharp&lt;br /&gt;
#define IRMP_RC6_PROTOCOL                        9              // Philips etc&lt;br /&gt;
#define IRMP_SAMSUNG32_PROTOCOL                 10              // Samsung32: no sync pulse at bit 16, length 32 instead of 37&lt;br /&gt;
#define IRMP_APPLE_PROTOCOL                     11              // Apple, very similar to NEC&lt;br /&gt;
#define IRMP_RECS80EXT_PROTOCOL                 12              // Philips, Technisat, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
#define IRMP_NUBERT_PROTOCOL                    13              // Nubert&lt;br /&gt;
#define IRMP_BANG_OLUFSEN_PROTOCOL              14              // Bang &amp;amp; Olufsen&lt;br /&gt;
#define IRMP_GRUNDIG_PROTOCOL                   15              // Grundig&lt;br /&gt;
#define IRMP_NOKIA_PROTOCOL                     16              // Nokia&lt;br /&gt;
#define IRMP_SIEMENS_PROTOCOL                   17              // Siemens, e.g. Gigaset&lt;br /&gt;
#define IRMP_FDC_PROTOCOL                       18              // FDC keyboard&lt;br /&gt;
#define IRMP_RCCAR_PROTOCOL                     19              // RC Car&lt;br /&gt;
#define IRMP_JVC_PROTOCOL                       20              // JVC (NEC with 16 bits)&lt;br /&gt;
#define IRMP_RC6A_PROTOCOL                      21              // RC6A, e.g. Kathrein, XBOX&lt;br /&gt;
#define IRMP_NIKON_PROTOCOL                     22              // Nikon&lt;br /&gt;
#define IRMP_RUWIDO_PROTOCOL                    23              // Ruwido, e.g. T-Home Mediareceiver&lt;br /&gt;
#define IRMP_IR60_PROTOCOL                      24              // IR60 (SDA2008)&lt;br /&gt;
#define IRMP_KATHREIN_PROTOCOL                  25              // Kathrein&lt;br /&gt;
#define IRMP_NETBOX_PROTOCOL                    26              // Netbox keyboard (bitserial)&lt;br /&gt;
#define IRMP_NEC16_PROTOCOL                     27              // NEC with 16 bits (incl. sync)&lt;br /&gt;
#define IRMP_NEC42_PROTOCOL                     28              // NEC with 42 bits&lt;br /&gt;
#define IRMP_LEGO_PROTOCOL                      29              // LEGO Power Functions RC&lt;br /&gt;
#define IRMP_THOMSON_PROTOCOL                   30              // Thomson&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Daten für die Adresse und das Kommando ermittelt man am besten über IRMP, siehe weiter oben ;-)&lt;br /&gt;
&lt;br /&gt;
== IRSND unter Linux und Windows ==&lt;br /&gt;
&lt;br /&gt;
irsnd.c lässt sich auch unter Linux direkt kompilieren, um damit Telegramme in Form von IRMP-Scan-Dateien zu erzeugen. Das geht folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
    cc irsnd.c -o irsnd                            # IRSND compilieren&lt;br /&gt;
&lt;br /&gt;
Der Aufruf geht dann folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
    ./irsnd protocol-number hex-address hex-command [repeat] &amp;gt; filename.txt&lt;br /&gt;
&lt;br /&gt;
also zum Beispiel für das NEC-Protokoll, Adresse 0x00FF, Kommando 0x0001&lt;br /&gt;
&lt;br /&gt;
    ./irsnd 2 00FF 0001 &amp;gt; nec.txt                   # irsnd ausführen&lt;br /&gt;
&lt;br /&gt;
IRSND kann man auch unter Windows nutzen, nämlich folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
* Eingabeaufforderung starten&lt;br /&gt;
* In das Verzeichnis von irsnd wechseln&lt;br /&gt;
* Aufruf von:&lt;br /&gt;
&lt;br /&gt;
            irsnd.exe 2 00FF 0001 &amp;gt; nec.txt&lt;br /&gt;
&lt;br /&gt;
Nun kann man direkt mit IRMP anschließend testen, ob das erzeugte Telegramm auch korrekt ist:&lt;br /&gt;
&lt;br /&gt;
            ./irmp &amp;lt; nec.txt&lt;br /&gt;
&lt;br /&gt;
bzw. unter Windows:&lt;br /&gt;
&lt;br /&gt;
            irmp.exe &amp;lt; nec.txt&lt;br /&gt;
&lt;br /&gt;
Das Ganze geht auch ohne Zwischendatei, nämlich:&lt;br /&gt;
&lt;br /&gt;
            ./irsnd 2 00FF 0001 | ./irmp&lt;br /&gt;
&lt;br /&gt;
bzw. unter Windows:&lt;br /&gt;
&lt;br /&gt;
            irsnd.exe 2 00FF 0001 | irmp.exe&lt;br /&gt;
&lt;br /&gt;
IRMP gibt dann als Ergebnis folgendes aus:&lt;br /&gt;
&lt;br /&gt;
            11111111000000001000000001111111 p =  2, a = 0x00ff, c = 0x0001, f = 0x00&lt;br /&gt;
&lt;br /&gt;
IRMP konnte also aus dem von IRSND generierten Frame wieder das Protokoll 2, Adresse 0x00FF und Kommando 0x0001 decodieren.&lt;br /&gt;
&lt;br /&gt;
Bitte beachten: Je nach benutztem Protokoll sind die Bit-Breiten der Adressen bzw. Kommandos verschieden, siehe obige Tabelle [http://www.mikrocontroller.net/articles/IRMP#Protokolle].&lt;br /&gt;
&lt;br /&gt;
Man kann also nicht mit jedem IR-Protokoll komplett 16-Bit breite Adressen oder Kommandos transparent übertragen.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= Anhang =&lt;br /&gt;
&lt;br /&gt;
== Die IR-Protokolle im Detail ==&lt;br /&gt;
&lt;br /&gt;
=== Pulse-Distance Protokolle ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;SIRCS&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 40 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 12-20 Daten-Bits, kein Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 7 Kommando-Bits + 5 Adress-Bits + bis zu 8 zusätzliche Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 2400µs Puls, 600µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 600µs Puls, 600µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 1200µs Puls, 600µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || zweimalig nach ca. 25ms, d.h. 2. und 3. Frame&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || ab dem 4. identischen Frame, Abstand ca. 25ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;NEC + extended NEC&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz / 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 32 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten NEC || 8 Adress-Bits + 8 invertierte Adress-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten ext. NEC || 16 Adress-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 9000µs Puls, 4500µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 560µs Puls,  560µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 560µs Puls, 1690µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 560µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || 9000µs Puls, 2250µs Pause, 560µs Puls, ~100ms Pause&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;JVC&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 16 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 4 Adress-Bits + 12 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 9000µs Puls, 4500µs Pause, 6000µs Pause bei Tasten-Wiederholung&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 560µs Puls,  560µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 560µs Puls, 1690µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 560µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || Wiederholung nach Pause von 25ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;NEC16&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 8 Adress-Bits + 1 Sync-Bit + 8 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 9000µs Puls, 4500µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Sync-Bit || 560µs Puls, 4500µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 560µs Puls,  560µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 560µs Puls, 1690µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 560µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine/eine/zwei nach 25ms?&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || Wiederholung nach Pause von 25ms?&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;NEC42&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 42 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 13 Adress-Bits + 13 invertierte Adress-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 9000µs Puls, 4500µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 560µs Puls,  560µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 560µs Puls, 1690µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 560µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || (unbekannt)&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;SAMSUNG&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || ?? kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 16 Daten(1)-Bits + 1 Sync-Bit + 20 Daten(2)-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten(1) || 16 Adress-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten(2) || 4 ID-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 4500µs Puls, 4500µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 550µs Puls,  550µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 550µs Puls, 1650µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Sync-Bit || 550µs Puls, 4500µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 550µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;SAMSUNG32&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 32 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 16 Adress-Bits + 16 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 4500µs Puls, 4500µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 550µs Puls,  550µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 550µs Puls, 1650µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 550µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || dritter, fünfter, siebter usw. identischer Frame&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;MATSUSHITA&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 24 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 6 Hersteller-Bits + 6 Kommando-Bits + 12 Adress-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 3488µs Puls, 3488µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 872µs Puls,  872µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 872µs Puls, 2616µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 872µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first?&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;KASEIKYO&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 48 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 16 Hersteller-Bits + 4 Parity-Bits + 4 Genre1-Bits + 4 Genre2-Bits + 10 Kommando-Bits + 2 ID-Bits + 8 Parity-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 3380µs Puls, 1690µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 423µs Puls,  423µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 423µs Puls, 1269µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 423µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || einmalig nach 74ms&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 74ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first?&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;RECS80&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bits + 10 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 1 Toggle-Bit + 3 Adress-Bits + 6 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 158µs Puls, 7432µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 158µs Puls, 4902µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 158µs Puls, 7432µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 158µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;RECS80EXT&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 2 Start-Bits + 11 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 1 Toggle-Bit + 4 Adress-Bits + 6 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 158µs Puls, 3637µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 158µs Puls, 4902µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 158µs Puls, 7432µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 158µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;DENON&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz (in der Praxis, lt. Dokumentation: 32 kHz)&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 0 Start-Bits + 15 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 5 Address-Bits + 10 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || kein Start-Bit&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 310µs Puls, 745µs Pause (in der Praxis, lt. Doku: 275µs Puls, 775µs Pause)&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 310µs Puls, 1780µs Pause (in der Praxis, lt. Doku: 275µs Puls, 1900µs Pause)&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 310µs Puls (310µs Puls, 745µs Pause (in der Praxis, lt. Doku: 275µs Puls)&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || Nach 65ms Wiederholung des Frames mit invertieren Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;APPLE&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 32 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 16 Adress-Bits + 11100000 + 8 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || siehe NEC&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || siehe NEC&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || siehe NEC&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || siehe NEC&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;NUBERT&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 10 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 0 Adress-Bits + 10 Kommando-Bits ?&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 1340µs Puls, 340µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 500µs Puls, 1300µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 1340µs Puls, 340µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 500µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || einmalig nach 35ms&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || dritter, fünfter, siebter usw. identischer Frame&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first?&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;B&amp;amp;O&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 455 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 4 Start-Bits + 16 Daten-Bits + 1 Trailer-Bit + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 0 Adress-Bits + 16 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit 1 || 200µs Puls, 2925µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit 2 || 200µs Puls, 2925µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit 3 || 200µs Puls, 15425µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit 4 || 200µs Puls, 2925µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 200µs Puls, 2925µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 200µs Puls, 9175µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| R-Bit || 200µs Puls, 6050µs Pause, wiederholt das letzte Bit (repetition)&lt;br /&gt;
|-&lt;br /&gt;
| Trailer-Bit || 200µs Puls, 12300µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 200µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;FDC&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 40 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 8 Adress-Bits + 12 x 0-Bits + 4 Press/Release-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 2085µs Puls, 966µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 300µs Puls,  220µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 300µs Puls, 715µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 300µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Drücken || Press/Release-Bits = 0000&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Loslassen || Press/Release-Bits = 1111&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || Wiederholung nach Pause von 60ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;RCCAR&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Pulse Distance&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 13 Daten-Bits + 1 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || C0 C1 A0 A1 D0 D1 D2 D3 D4 D5 D6 D7 V&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 2000µs Puls, 2000µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 600µs Puls,  900µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 600µs Puls, 450µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || 600µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || keine?&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Bi-Phase Protokolle ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;RC5 + RC5X&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Bi-Phase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame RC5 || 2 Start-Bits + 12 Daten-Bits + 0 Stop-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten RC5 || 1 Toggle-Bit + 5 Adress-Bits + 6 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Frame RC5X || 1 Start-Bit + 13 Daten-Bits + 0 Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten RC5X || 1 invertiertes Kommando-Bit + 1 Toggle-Bit + 5 Adress-Bits + 6 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 889µs Pause, 889µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 889µs Puls, 889µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 889µs Pause, 889µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || kein Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;RC6&#039;&#039;&#039; + &#039;&#039;&#039;RC6A&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Bi-Phase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame RC6 || 1 Start-Bit + 1 Bit &amp;quot;1&amp;quot; + 3 Mode-Bits (000) + 1 Toggle-Bit + 16 Daten-Bits + 2666µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Frame RC6A || 1 Start-Bit + 1 Bit &amp;quot;1&amp;quot; + 3 Mode-Bits (110) + 1 Toggle-Bit + 31 Daten-Bits + 2666µs pause&lt;br /&gt;
|-&lt;br /&gt;
| Daten RC6 || 8 Adress-Bits + 8 Kommando Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten RC6A || &amp;quot;1&amp;quot; + 14 Hersteller-Bits + 8 System-Bits + 8 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 2666µs Puls, 889µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Toggle 0-Bit || 889µs Pause, 889µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| Toggle 1-Bit || 889µs Puls, 889µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 444µs Pause, 444µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 444µs Puls, 444µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || kein Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;GRUNDIG + NOKIA&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz (?)&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Bi-Phase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame-Paket || 1 Start-Frame + 19,968ms Pause + N Info-Frames + 117,76ms Pause + 1 Stop-Frame&lt;br /&gt;
|-&lt;br /&gt;
| Start-Frame || 1 Pre-Bit + 1 Start-Bit + 9 Daten-Bits (alle 1) + 0 Stop-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Info-Frame || 1 Pre-Bit + 1 Start-Bit + 9 Daten-Bits + 0 Stop-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Frame || 1 Pre-Bit + 1 Start-Bit + 9 Daten-Bits (alle 1) + 0 Stop-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten Grundig || 9 Kommando-Bits + 0 Adress-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten Nokia || 8 Kommando-Bits + 8 Adress-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Pre-Bit || 528µs Puls, 2639µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 528µs Puls, 528µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 528µs Pause, 528µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 528µs Puls, 528µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || kein Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Info-Frames mit einem Pausenabstand von 117,76ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;IR60 (SDA2008)&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 30 kHz&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Bi-Phase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Start Frame || 1 Start-Bit + 101111 + 0 Stop-Bits + 22ms Pause&lt;br /&gt;
|-&lt;br /&gt;
| Daten Frame || 1 Start-Bit + 7 Daten-Bits + 0 Stop-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 0 Adress-Bits + 7 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 528µs Puls, 2639µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 528µs Pause, 528µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 528µs Puls, 528µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || kein Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Info-Frames mit einem Pausenabstand von 117,76ms&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;SIEMENS + RUWIDO&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 36 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Bi-Phase (Manchester)&lt;br /&gt;
|-&lt;br /&gt;
| Frame Siemens || 1 Start-Bit + 22 Daten-Bits + 0 Stop-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Frame Ruwido || 1 Start-Bit + 17 Daten-Bits + 0 Stop-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Daten Siemens || 11 Adress-Bits + 10 Kommando-Bits + 1 invertiertes Bit (letztes Bit davor nochmal invertiert)&lt;br /&gt;
|-&lt;br /&gt;
| Daten Ruwido || 9 Adress-Bits + 7 Kommando-Bits + 1 invertiertes Bit (letztes Bit davor nochmal invertiert)&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 275µs Puls, 275µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| 0-Bit || 275µs Pause, 275µs Puls&lt;br /&gt;
|-&lt;br /&gt;
| 1-Bit || 275µs Puls, 275µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Stop-Bit || kein Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || 1-malige Wiederholung mit gesetztem Repeat-Bit (?)&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms (?)&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || MSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Serial Protokolle ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &#039;&#039;&#039;NETBOX&#039;&#039;&#039; || Wert&lt;br /&gt;
|-&lt;br /&gt;
| Frequenz || 38 kHz?&lt;br /&gt;
|-&lt;br /&gt;
| Kodierung || Serial&lt;br /&gt;
|-&lt;br /&gt;
| Frame || 1 Start-Bit + 16 Daten-Bits, kein Stop-Bit&lt;br /&gt;
|-&lt;br /&gt;
| Daten || 3 Adress-Bits + 13 Kommando-Bits&lt;br /&gt;
|-&lt;br /&gt;
| Start-Bit || 2400µs Puls, 800µs Pause&lt;br /&gt;
|-&lt;br /&gt;
| Bitlänge || 800µs&lt;br /&gt;
|-&lt;br /&gt;
| Wiederholung || keine&lt;br /&gt;
|-&lt;br /&gt;
| Tasten-Wiederholung || Abstand ca. 35ms?&lt;br /&gt;
|-&lt;br /&gt;
| Bit-Order || LSB first&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software-Historie IRMP ==&lt;br /&gt;
&lt;br /&gt;
Änderungen IRMP:&lt;br /&gt;
&lt;br /&gt;
Version 2.2.0:&lt;br /&gt;
* 23.05.2012: Portierung auf ARM STM32&lt;br /&gt;
* 23.05.2012: Bugfix Frame-Erkennung beim Denon-Protokoll&lt;br /&gt;
&lt;br /&gt;
Ältere Versionen:&lt;br /&gt;
&lt;br /&gt;
* 27.02.2012: Bug in IR60-Decoder behoben&lt;br /&gt;
* 27.02.2012: Bug in CRC-Berechnung von Kaseikyo-Frames behoben&lt;br /&gt;
* 27.02.2012: Portierung auf C18 Compiler für PIC-Mikroprozessoren&lt;br /&gt;
* 13.02.2012: Bugfix: oberstes Bit in Adresse falsch bei NEC-Protokoll, wenn auch NEC42-Protokoll eingeschaltet ist.&lt;br /&gt;
* 13.02.2012: Timing von SAMSUNG- und SAMSUNG32-Protokoll korrigiert&lt;br /&gt;
* 13.02.2012: Genre2-Bits werden nun im oberen Nibble von flags gespeichert.&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: KATHREIN&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: RUWIDO&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: THOMSON&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: IR60&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: LEGO&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: NEC16&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: NEC42&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: NETBOX&lt;br /&gt;
* 20.09.2011: Portierung auf ATtiny84 und ATtiny85&lt;br /&gt;
* 20.09.2011: Verbesserung von Tastenwiederholungen bei RC5&lt;br /&gt;
* 20.09.2011: Verbessertes Decodieren von Bi-Phase-Protokollen&lt;br /&gt;
* 20.09.2011: Korrekturen am RECS80-Decoder&lt;br /&gt;
* 20.09.2011: Korrekturen beim Erkennen von zusätzlichen Bits im SIRCS-Protocol&lt;br /&gt;
* 18.01.2011: Korrekturen für Siemens-Protokoll&lt;br /&gt;
* 18.01.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: NIKON&lt;br /&gt;
* 18.01.2011: Speichern der zusätzlichen Bits (&amp;gt;12) im SIRCS-Protokoll in der Adresse&lt;br /&gt;
* 18.01.2011: Timing-Korrekturen für Denon-Protokoll&lt;br /&gt;
&lt;br /&gt;
* 04.09.2010: Bugfix für F_INTERRUPTS &amp;gt;= 16000&lt;br /&gt;
&lt;br /&gt;
* 02.09.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: RC6A&lt;br /&gt;
&lt;br /&gt;
* 29.08.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: JVC&lt;br /&gt;
* 29.08.2010: Kaseikyo-Protokoll: Berücksichtigung der Genre-Bits. &#039;&#039;&#039;ACHTUNG: dadurch neue Command-Codes!&#039;&#039;&#039;&lt;br /&gt;
* 29.08.2010: Kaseikyo-Protokoll: Verbesserte Behandlung von Wiederholungs-Frames&lt;br /&gt;
* 29.08.2010: Verbesserte Unterstützung des APPLE-Protokolls. &#039;&#039;&#039;ACHTUNG: dadurch neue Adress-Codes!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* 01.07.2010: Bugfix: Einführen eines Timeouts für NEC-Repetition-Frames, um &amp;quot;Geisterkommandos&amp;quot; zu verhindern.&lt;br /&gt;
&lt;br /&gt;
* 26.06.2010: Bugfix: Deaktivieren von RECS80, RECS80EXT &amp;amp; SIEMENS bei geringer Interrupt-Rate&lt;br /&gt;
&lt;br /&gt;
* 25.06.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: RCCAR&lt;br /&gt;
* 25.06.2010: Tastenerkennung für FDC-Protokoll (IR-keyboard) erweitert&lt;br /&gt;
* 25.06.2010: Interrupt-Frequenz nun bis zu 20kHz möglich&lt;br /&gt;
&lt;br /&gt;
* 09.06.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: FDC (IR-keyboard)&lt;br /&gt;
* 09.06.2010: Timing für DENON-Protokoll korrigiert&lt;br /&gt;
&lt;br /&gt;
* 02.06.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: Siemens (Gigaset)&lt;br /&gt;
&lt;br /&gt;
* 26.05.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: Nokia&lt;br /&gt;
* 26.05.2010: Bugfix Auswertung von langen Tastendrücken bei Grundig-Protokoll&lt;br /&gt;
&lt;br /&gt;
* 17.05.2010: Bugfix SAMSUNG32-Protokoll: Kommando-Bit-Maske korrigiert&lt;br /&gt;
&lt;br /&gt;
* 16.05.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: Grundig&lt;br /&gt;
* 16.05.2010: Behandlung von automatischen Frame-Wiederholungen beim SIRCS-, SAMSUNG32- und NUBERT-Protokoll verbessert.&lt;br /&gt;
&lt;br /&gt;
* 28.04.2010: Nur einige kosmetische Code-Optimierungen&lt;br /&gt;
&lt;br /&gt;
* 16.04.2010: Sämtliche Timing-Toleranzen angepasst/optimiert&lt;br /&gt;
&lt;br /&gt;
* 12.04.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: Bang &amp;amp; Olufsen&lt;br /&gt;
&lt;br /&gt;
* 29.03.2010: Bugfix beim Erkennen von mehrfachen NEC-Repetition-Frames&lt;br /&gt;
* 29.03.2010: Konfiguration in irmpconfig.h ausgelagert&lt;br /&gt;
* 29.03.2010: Einführung einer Programmversion in README.txt: Version 1.0&lt;br /&gt;
&lt;br /&gt;
* 17.03.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: Nubert&lt;br /&gt;
&lt;br /&gt;
* 16.03.2010: Korrektur der RECS80-Startbit-Timings&lt;br /&gt;
* 16.03.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: RECS80 Extended&lt;br /&gt;
&lt;br /&gt;
* 15.03.2010: Codeoptimierung&lt;br /&gt;
&lt;br /&gt;
* 14.03.2010: Portierung auf PIC&lt;br /&gt;
&lt;br /&gt;
* 11.03.2010: Anpassungen an verschiedene ATMega-Typen durchgeführt&lt;br /&gt;
&lt;br /&gt;
* 07.03.2010: Bugfix: Zurücksetzen der Statemachine nach einem unvollständigen RC5-Frame&lt;br /&gt;
&lt;br /&gt;
* 05.03.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: Apple&lt;br /&gt;
* 05.03.2010: Die Daten irmp_data.addr + irmp_data.command werden nun in der jeweiligen Bit-Order des verwendeten Protokolls gespeichert&lt;br /&gt;
&lt;br /&gt;
* 04.03.2010: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: SAMSUNG32 (Mix aus SAMSUNG &amp;amp; NEC-Protokoll)&lt;br /&gt;
* 04.03.2010: Änderung der SIRCS- und Kaseikyo-Toleranzen&lt;br /&gt;
&lt;br /&gt;
* 02.03.2010: SIRCS: Korrekte Erkennung und Unterdrückung von automatischen Frame-Wiederholungen&lt;br /&gt;
* 02.03.2010: SIRCS: Device-ID-Bits werden nun in irmp_data.command und nicht mehr in irmp_data.address gespeichert&lt;br /&gt;
* 02.03.2010: Vergrößerung des Scan Buffers (zwecks Protokollierung)&lt;br /&gt;
&lt;br /&gt;
* 24.02.2010: Neue Variable flags in IRMP_DATA zur Erkennung von langen Tastendrücken&lt;br /&gt;
&lt;br /&gt;
* 20.02.2010: Bugfix Denon-Protokoll: Wiederholungsframe grundsätzlich invertiert&lt;br /&gt;
&lt;br /&gt;
* 19.02.2010: Erkennung von NEC-Protokoll-Varianten, z.&amp;amp;nbsp;B. Apple-Fernbedienung&lt;br /&gt;
* 19.02.2010: Erkennung von RC6- und Denon-Protokoll&lt;br /&gt;
* 19.02.2010: Verbesserung des RC5-Decoders (Bugfixes)&lt;br /&gt;
&lt;br /&gt;
* 13.02.2010: Bugfix: Puls/Pausen-Counter um 1 zu niedrig, nun bessere Erkennung bei Protokollen mit sehr kurzen Pulszeiten&lt;br /&gt;
* 13.02.2010: Erkennung der NEC-Wiederholungssequenz&lt;br /&gt;
&lt;br /&gt;
* 12.02.2010: RC5-Protokoll-Decoder hinzugefügt&lt;br /&gt;
&lt;br /&gt;
* 05.02.2010: Konflikt zwischen Samsung- und Matsushita-Protokoll beseitigt&lt;br /&gt;
&lt;br /&gt;
* 07.01.2010: Erste Version&lt;br /&gt;
&lt;br /&gt;
== Software-Historie IRSND ==&lt;br /&gt;
&lt;br /&gt;
Änderungen IRSND:&lt;br /&gt;
&lt;br /&gt;
Version 2.2.0:&lt;br /&gt;
* 23.05.2012: Portierung auf ARM STM32 (ungetestet!)&lt;br /&gt;
* 23.05.2012: Bugfix Timing für 2. Frame beim Denon-Protokoll&lt;br /&gt;
&lt;br /&gt;
Ältere Versionen:&lt;br /&gt;
&lt;br /&gt;
* 27.02.2012: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: IR60&lt;br /&gt;
* 27.02.2012: Bug beim Senden von Bi-Phase-Frames (Manchester) behoben&lt;br /&gt;
* 27.02.2012: Portierung auf C18 Compiler für PIC-Mikroprozessoren&lt;br /&gt;
* 15.02.2012: Bugfix: Nur der 1. Frame wurde gesendet&lt;br /&gt;
* 13.02.2012: Timing von SAMSUNG- und SAMSUNG32-Protokoll korrigiert&lt;br /&gt;
* 13.02.2012: Genre2-Bits werden nun im oberen Nibble von flags gespeichert.&lt;br /&gt;
* 13.02.2012: Zusätzliche Pause nach dem Senden des letzten Frames&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: THOMSON&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: LEGO&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: NEC16&lt;br /&gt;
* 20.09.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: NEC42&lt;br /&gt;
* 20.09.2011: Portierung auf ATtiny84 und ATtiny85&lt;br /&gt;
* 20.09.2011: Korrektur von Pausenlängen&lt;br /&gt;
* 20.09.2011: Korrekturen von irsnd_stop()&lt;br /&gt;
* 20.09.2011: Korrektur des SIEMENS-Timings&lt;br /&gt;
* 20.09.2011: Umstellung auf 36kHz Modulationsfrequenz für DENON-Protokoll&lt;br /&gt;
* 20.09.2011: Korrektur Behandlung zusätzlicher Bits im SIRCS Protokoll&lt;br /&gt;
* 18.01.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: RC6A&lt;br /&gt;
* 18.01.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: RC6&lt;br /&gt;
* 18.01.2011: &#039;&#039;&#039;Neues Protokoll&#039;&#039;&#039;: NIKON&lt;br /&gt;
* 18.01.2011: Beachten der zusätzlichen Bits (&amp;gt;12) im SIRCS-Protokoll&lt;br /&gt;
* 18.01.2011: Korrektur der Pausenlängen&lt;br /&gt;
* 18.01.2011: Timing-Korrekturen für Denon-Protokoll&lt;br /&gt;
&lt;br /&gt;
* 02.09.2010: Neues Protokoll: JVC&lt;br /&gt;
* 02.09.2010: Anpassung des APPLE-Encoders an IRMP-Version 1.7.3.&lt;br /&gt;
&lt;br /&gt;
* 29.08.2010: Neues Protokoll: Kaseikyo (Panasonic u.a.)&lt;br /&gt;
&lt;br /&gt;
* 01.07.2010: Bugfix: Deaktivieren von RECS80, RECS80EXT &amp;amp; SIEMENS bei geringer Interrupt-Rate&lt;br /&gt;
&lt;br /&gt;
* 25.06.2010: Neues Protokoll: RCCAR&lt;br /&gt;
&lt;br /&gt;
* 09.06.2010: Neues Protokoll: FDC (IR-keyboard)&lt;br /&gt;
* 09.06.2010: Timing für DENON-Protokoll korrigiert&lt;br /&gt;
&lt;br /&gt;
* 02.06.2010: Neues Protokoll: Siemens (Gigaset)&lt;br /&gt;
* 02.06.2010: Simulation von langen Tastendrücken&lt;br /&gt;
&lt;br /&gt;
* 26.05.2010: Neues Protokoll: Nokia&lt;br /&gt;
&lt;br /&gt;
* 17.05.2010: Neues Protokoll: Grundig&lt;br /&gt;
* 17.05.2010: Behandlung von Frame-Wiederholungen für SIRCS, SAMSUNG32 und NUBERT korrigiert&lt;br /&gt;
&lt;br /&gt;
* 28.04.2010: Unterstützung des APPLE-Protokolls&lt;br /&gt;
* 28.04.2010: Konfiguration über irmpconfig.h&lt;br /&gt;
&lt;br /&gt;
* 16.04.2010: Sämtliche Timing-Toleranzen angepasst/optimiert&lt;br /&gt;
&lt;br /&gt;
* 14.04.2010: Neues Protokoll: Bang &amp;amp; Olufsen&lt;br /&gt;
&lt;br /&gt;
* 17.03.2010: Neues Protokoll: Nubert&lt;br /&gt;
* 17.03.2010: Korrektur der Pausen zwischen Frame-Wiederholungen&lt;br /&gt;
&lt;br /&gt;
* 16.03.2010: Korrektur des Timer-Registers TCCR2&lt;br /&gt;
* 16.03.2010: Korrektur der RECS80-Startbit-Timings&lt;br /&gt;
* 16.03.2010: Neues Protokoll: RECS80 Extended &lt;br /&gt;
&lt;br /&gt;
* 11.03.2010: Anpassungen an verschiedene ATMega-Typen durchgeführt&lt;br /&gt;
&lt;br /&gt;
* 07.03.2010: Alpha-Version&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; IR-Übersicht &#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* http://www.epanorama.net/links/irremote.html&lt;br /&gt;
* http://www.elektor.de/jahrgang/2008/juni/cc2-avr-projekt-%283%29-unsichtbare-kommandos.497184.lynkx?tab=4 (IR Übersicht &amp;amp; RC5)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SIRCS-Protokoll&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.com/knowledge/ir/sirc.htm&lt;br /&gt;
* http://www.ustr.net/infrared/sony.shtml&lt;br /&gt;
* http://users.telenet.be/davshomepage/sony.htm&lt;br /&gt;
* http://picprojects.org.uk/projects/sirc/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NEC-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.com/knowledge/ir/nec.htm&lt;br /&gt;
* http://www.ustr.net/infrared/nec.shtml&lt;br /&gt;
* http://www.celadon.com/infrared_protocol/infrared_protocols_samples.pdf&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NEC16-Protokoll (JVC):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.ustr.net/infrared/jvc.shtml&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SAMSUNG-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
(wurde aus diversen Protokollen (Daewoo u.ä.) zusammengereimt, daher kein direkter Link auf irgendwelche SAMSUNG-Dokumentation verfügbar)&lt;br /&gt;
&lt;br /&gt;
Hier ein Link zum Daewoo-Protokoll, welches dasselbe Prinzip des Sync-Bits in der Mitte eines Frames nutzt, jedoch mit anderen Timing-Werten arbeitet:&lt;br /&gt;
&lt;br /&gt;
* http://users.telenet.be/davshomepage/daewoo.htm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MATSUHITA-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.celadon.com/infrared_protocol/infrared_protocols_samples.pdf&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KASEIKYO-Protokoll (auch &amp;quot;Japan-Protokoll&amp;quot;):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/attachment/4246/IR-Protokolle_Diplomarbeit.pdf&lt;br /&gt;
* http://www.roboternetz.de/phpBB2/files/entwicklung_und_realisierung_einer_universalinfrarotfernbedienung_mit_timerfunktionen.pdf&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RECS80- und RECS80-Extended-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.com/knowledge/ir/recs80.htm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RC5- und RC5x-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.com/knowledge/ir/rc5.htm&lt;br /&gt;
* http://users.telenet.be/davshomepage/rc5.htm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Denon-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.com/de/IR-Protokolle.php#DENON&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RC6 und RC6A-Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.com/knowledge/ir/rc6.htm&lt;br /&gt;
* http://slycontrol.ru/scr/kb/rc6.htm&lt;br /&gt;
* http://www.picbasic.nl/info_rc6_uk.htm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bang &amp;amp; Olufsen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/attachment/33137/datalink.pdf&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Grundig&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/attachment/77507/Grundig_10bit.pdf&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nokia&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.sbprojects.com/knowledge/ir/nrc17.htm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IR60 (SDA2008 bzw. MC14497P)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.datasheetarchive.com/dl/Datasheets-24/DSA-478524.pdf&lt;br /&gt;
* http://www.datasheetcatalog.org/datasheet/motorola/MC14497P.pdf&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Diverse Protokolle:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/attachment/4246/IR-Protokolle_Diplomarbeit.pdf&lt;br /&gt;
* http://www.celadon.com/infrared_protocol/infrared_protocols_samples.pdf&lt;br /&gt;
* http://www.opendcc.de/info/rc5/rc5.html&lt;br /&gt;
* http://www.roboternetz.de/phpBB2/files/entwicklung_und_realisierung_einer_universalinfrarotfernbedienung_mit_timerfunktionen.pdf&lt;br /&gt;
&lt;br /&gt;
== Hardware / IRMP-Projekte ==&lt;br /&gt;
&lt;br /&gt;
Eine Implementierung auf Basis IRMP und IRSND als Multiprotokoll Dekoder mit LCD&lt;br /&gt;
von Klaus Leidinger: &lt;br /&gt;
* http://www.mikrocontroller-projekte.de/Mikrocontroller/index.html&lt;br /&gt;
&lt;br /&gt;
Ähnliche Implementierung wie von Klaus Leidinger für Pollin AVR-NET-IO mit Pollin ADD-ON Board:&lt;br /&gt;
* http://son.ffdf-clan.de/include.php?path=forumsthread&amp;amp;threadid=703&lt;br /&gt;
&lt;br /&gt;
USB IR Remote Receiver von Hugo Portisch:&lt;br /&gt;
* http://www.mikrocontroller.net/articles/USB_IR_Remote_Receiver&lt;br /&gt;
&lt;br /&gt;
Servo-gesteuerter IR Sender mit Anlernfunktion von Stefan Pendsa:&lt;br /&gt;
* http://forum.mikrokopter.de/topic-21060.html&lt;br /&gt;
* (SVN) http://svn.mikrokopter.de/listing.php?repname=Projects&amp;amp;path=%2FServo-Controlled+IR-Transmitter%2F&amp;amp;#Ad2417800d6aa14bf08c571a896e9def7&lt;br /&gt;
&lt;br /&gt;
Lernfähige IR-Fernbedienung von Robert und Frank M.&lt;br /&gt;
* http://www.mikrocontroller.net/articles/DIY_Lernfähige_Fernbedienung_mit_IRMP&lt;br /&gt;
&lt;br /&gt;
== Danksagung ==&lt;br /&gt;
&lt;br /&gt;
Ganz herzlich bedanken möchte ich mich bei Vlad Tepesch, Klaus Leidinger und Peter K., die mich mit Scan-Dateien ihrer Infrarot-Fernbedienungen versorgt haben. Dank auch an Klaus für seine nächtelangen Tests von IRMP &amp;amp; IRSND.&lt;br /&gt;
&lt;br /&gt;
Ebenso bedanken möchte ich mich bei Christian F. für seine Tipps zur PIC-Portierung. Vielen Dank auch an gera für die Portierung auf den PIC-C18 Compiler.&lt;br /&gt;
&lt;br /&gt;
Für die Portierung auf ARM STM32 bedanke ich mich herzlich bei kichi (Michael K.).&lt;br /&gt;
&lt;br /&gt;
== Diskussion ==&lt;br /&gt;
&lt;br /&gt;
Meinungen, Verbesserungsvorschläge, harsche Kritik und ähnliches kann im [http://www.mikrocontroller.net/topic/162119 Beitrag: Infrared Multi Protocol Decoder] geäussert werden.&lt;br /&gt;
&lt;br /&gt;
Viel Spaß mit IRMP!&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Infrarot]]&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;/div&gt;</summary>
		<author><name>Muebau</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=USB_IR_Remote_Receiver&amp;diff=66457</id>
		<title>USB IR Remote Receiver</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=USB_IR_Remote_Receiver&amp;diff=66457"/>
		<updated>2012-05-21T18:38:49Z</updated>

		<summary type="html">&lt;p&gt;Muebau: /* Hardware / Projekte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein Infrarot-Multiprotokoll-Decoder in Kombination mit [[IRMP]] von Frank M.  und [http://www.obdev.at/products/vusb/index-de.html V-USB] für die USB Schnittstelle&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Motivation für das Projekt war der veraltete Igor-IR Empfänger. Auch wie Frank M. in seinem Artikel beschreibt ist das RC5 Protokoll veraltet und findet in neuen Geräten fast keine Anwendung mehr. Auch habe ich mich für die USB Lösung entschieden, da heutzutage nicht mehr jedes PC-Mainboard über eine RS-232 Schnittstelle verfügt.&lt;br /&gt;
Durch Irmp - der Infrarot-Fernbedienungsdecoder der mehrere Protokolle auf einmal decodieren kann, ist es möglich folgende Protokolle zu empfangen und auszuwerten:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Protokoll || Hersteller&lt;br /&gt;
|-&lt;br /&gt;
| SIRCS || Sony&lt;br /&gt;
|-&lt;br /&gt;
| NEC || NEC, Yamaha, Canon, Tevion, Harman/Kardon, Hitachi, JVC, Pioneer, Toshiba, Xoro, Orion, NoName und viele weitere japanische Hersteller.&lt;br /&gt;
|-&lt;br /&gt;
| SAMSUNG || Samsung&lt;br /&gt;
|-&lt;br /&gt;
| SAMSUNG32 || Samsung&lt;br /&gt;
|-&lt;br /&gt;
| MATSUSHITA || Matsushita&lt;br /&gt;
|-&lt;br /&gt;
| KASEIKYO || Panasonic, Technics, Denon und andere japanische Hersteller, welche Mitglied der &amp;quot;Japan&#039;s Association for Electric Home Application&amp;quot; sind.&lt;br /&gt;
|-&lt;br /&gt;
| RECS80 || Philips, Nokia, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
|-&lt;br /&gt;
| RECS80EXT || Philips, Technisat, Thomson, Nordmende, Telefunken, Saba&lt;br /&gt;
|-&lt;br /&gt;
| RC5 || Philips und andere europäische Hersteller&lt;br /&gt;
|-&lt;br /&gt;
| DENON || Denon, Sharp&lt;br /&gt;
|-&lt;br /&gt;
| RC6 || Philips und andere europäische Hersteller&lt;br /&gt;
|-&lt;br /&gt;
| RC6A || Philips, Kathrein und andere Hersteller, z.B. XBOX&lt;br /&gt;
|-&lt;br /&gt;
| APPLE || Apple&lt;br /&gt;
|-&lt;br /&gt;
| NUBERT || Nubert, z.B. Subwoofer System&lt;br /&gt;
|-&lt;br /&gt;
| B&amp;amp;O || Bang &amp;amp; Olufsen&lt;br /&gt;
|-&lt;br /&gt;
| GRUNDIG || Grundig&lt;br /&gt;
|-&lt;br /&gt;
| NOKIA || Nokia, z.B. D-Box&lt;br /&gt;
|-&lt;br /&gt;
| SIEMENS || Siemens, z.B. Gigaset M740AV (ab ~15kHz, siehe Bemerkungen zu F_INTERRUPTS)&lt;br /&gt;
|-&lt;br /&gt;
| FDC || FDC Keyboard (ab ~15kHz)&lt;br /&gt;
|-&lt;br /&gt;
| RCCAR || RC Car: IR Fernbedienung für Modellfahrzeuge&lt;br /&gt;
|-&lt;br /&gt;
| JVC || JVC&lt;br /&gt;
|-&lt;br /&gt;
| NIKON || NIKON&lt;br /&gt;
|-&lt;br /&gt;
| RUWIDO || RUWIDO (z.B. T-Home-Mediareceiver)&lt;br /&gt;
|-&lt;br /&gt;
| KATHREIN  || KATHREIN&lt;br /&gt;
|-&lt;br /&gt;
| NEC16  || JVC&lt;br /&gt;
|-&lt;br /&gt;
| NEC42  || JVC&lt;br /&gt;
|-&lt;br /&gt;
| LEGO   || Lego&lt;br /&gt;
|-&lt;br /&gt;
| THOMSON || Thomson&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funktionen/Vorteile gegenüber anderen IR Empfängern ==&lt;br /&gt;
* Der AVR-Source ist für fast alle Mikrochips einsetzbar&lt;br /&gt;
* Bei vorhandenen modifizierten [[#bootloadHID]] kann schnell und einfach ein Firmware Update des Mikrochips über die USB Schnittstelle durchgeführt werden&lt;br /&gt;
* Der Empfänger hat eine PowerOn Funktion um den Host per Fernbedienung ein/aus-schalten zu können (deaktivierbar)&lt;br /&gt;
* Es sind keine speziellen Treiber notwendig, egal ob Windows XP oder Windows 7&lt;br /&gt;
* Tastenentprellung im Mikrochip selber (einstellbar)&lt;br /&gt;
* Durch die Verwendung der [[#USB IR Remote Receiver DLL]] hat der Benutzer leicht die Möglichkeit die dekodierten IR-Codes auszuwerten.&lt;br /&gt;
&lt;br /&gt;
== Arbeitsweise ==&lt;br /&gt;
Durch V-USB wird eine rein Softwaremässige USB Schnittstelle geschaffen. Somit können auch Mikrokontroller ohne USB-Schnittstelle wie z.B. der Atmega8-16 eingesetzt werden. Durch V-USB arbeitet der AVR als Low Speed USB 1.1 HID Gerät. Durch die Benutzung von Standard HID-Funktionen wird kein spezieller USB Treiber benötigt.&lt;br /&gt;
&lt;br /&gt;
Wenn ein IR-Code dekodiert wurde wird dieser per USB Interrupt Transfer vom Gerät an den Host gesendet. Die Auswertung des IR-Codes übernimmt der Host.&lt;br /&gt;
&lt;br /&gt;
Die PowerOn Funktion speichert den ersten empfangenen IR-Code im EEPROM. Wird dieser erneut empfangen wird der definierte Ausgang für die PowerOn Funktion für ~250ms auf +VCC geschaltet. Dieser IR-Code wird dann nicht mehr zum Host weiter gesendet. Die PowerOn Funktion lässt sich über den Settings/Optionen Dialog deaktivieren.&lt;br /&gt;
&lt;br /&gt;
Durch Irmp lässt sich auch die Fernbedienung bereits im Gerät entprellen. Die Entprellung ist über den Settings/Optionen Dialog einstellbar.&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
&lt;br /&gt;
Stand vom 02.01.2012&lt;br /&gt;
&lt;br /&gt;
Download des kompletten Paketes: &lt;br /&gt;
[[http://www.mikrocontroller.net/wikifiles/e/e5/USB_IR_Remote_Receiver_Complete.zip USB IR Remote Receiver Complete]]&lt;br /&gt;
&lt;br /&gt;
Dieser Download beinhaltet:&lt;br /&gt;
* Release der USB IR Remote Receiver DLL&lt;br /&gt;
&lt;br /&gt;
* Sourcecode AVR USB IR Remote Receiver&lt;br /&gt;
* Release AVR USB IR Remote Receiver für Atmega8 und Atmega168p&lt;br /&gt;
* Sourcecode &amp;amp; Release AVR modifizierter bootloadHID v1.1 für Atmega8&lt;br /&gt;
* Sourcecode &amp;amp; Release AVR modifizierter bootloadHID v1.1 für Atmega168p&lt;br /&gt;
&lt;br /&gt;
* Sourcecode &amp;amp; Release Visual Studio 2008 Demo Konsole Anwendung&lt;br /&gt;
* Sourcecode &amp;amp; Release Delphi 2010 Demo Anwendung&lt;br /&gt;
* Sourcecode &amp;amp; Release Visual Studio 2008 C# Demo Anwendung (Danke an Michael Kipp)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Plugin für EventGhost&lt;br /&gt;
&lt;br /&gt;
* Beschreibung in Englisch als Html&lt;br /&gt;
&lt;br /&gt;
Änderungen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Datum || Änderung&lt;br /&gt;
|-&lt;br /&gt;
| 02.01.2012 || DLL:&lt;br /&gt;
* v1.0.0.14, IR Polling entfernt, IRMP Logging per USB hinzugefügt&lt;br /&gt;
AVR:&lt;br /&gt;
* v1.8, IR Polling entfernt, IRMP Logging per USB hinzugefügt. Source für AVR Studio v5 konvertiert.&lt;br /&gt;
|-&lt;br /&gt;
| 26.10.2011 || DLL:&lt;br /&gt;
* v1.0.0.13, Neue Irmp Protokolle in die Standard Liste aufgenommen&lt;br /&gt;
AVR:&lt;br /&gt;
* v1.7, IRMP Update auf 20.09.2011, neues Protokoll RUWIDO, KATHREIN, NEC16, NEC42, LEGO und THOMSON.&lt;br /&gt;
|-&lt;br /&gt;
| 14.07.2011 || DLL:&lt;br /&gt;
* v1.0.0.12, Problem mit EventGhost behoben&lt;br /&gt;
|-&lt;br /&gt;
| 28.02.2011 || Demo:&lt;br /&gt;
* neuen Demo Source für Visual Studio 2008 C# aufgenommen. Danke an Michael Kipp für seine Arbeit&lt;br /&gt;
|-&lt;br /&gt;
| 27.02.2011 || DLL:&lt;br /&gt;
* v1.0.0.11, Problem mit EventGhost behoben, Problem mit InitNative/InitPAnsiChar behoben&lt;br /&gt;
|-&lt;br /&gt;
| 04.02.2011 || AVR:&lt;br /&gt;
* v1.6, Source und Release für Atmega8/Atmega168p.&lt;br /&gt;
* bootLoadHID v1.1 Source und Release für Atmega8/Atmega168p.&lt;br /&gt;
|-&lt;br /&gt;
| 27.01.2011 || DLL:&lt;br /&gt;
* v1.0.0.10, Neue Irmp Protokolle in die Standard Liste aufgenommen.&lt;br /&gt;
AVR:&lt;br /&gt;
* v1.5, IRMP Update auf 18.01.2011, neues Protokoll RC6A, JVC und NIKON.&lt;br /&gt;
|-&lt;br /&gt;
| 28.06.2010 || DLL:&lt;br /&gt;
* v1.0.0.9, Neue Irmp Protokolle in die Standard Liste aufgenommen.&lt;br /&gt;
AVR:&lt;br /&gt;
* v1.4, IRMP Update auf 26.06.2010, neues Protokoll FDC und RCCAR.&lt;br /&gt;
|-&lt;br /&gt;
| 06.06.2010 || DLL:&lt;br /&gt;
* v1.0.0.8, Protokolle die in der INI Datei fehlen werden nun automatisch eingetragen. Neue Irmp Protokolle in die Standard Liste aufgenommen.&lt;br /&gt;
AVR:&lt;br /&gt;
* v1.3, IRMP Update auf 02.06.2010, neues Protokoll NOKIA und SIEMENS&lt;br /&gt;
|-&lt;br /&gt;
| 18.05.2010 || DLL:&lt;br /&gt;
* v1.0.0.7, Grundig Protokoll für INI-Datei aufgenommen. Bei fehlender INI-Datei werden die Protokolle automatisch eingetragen. Beim manuellen Einfügen von &amp;quot;GRUNDIG=15&amp;quot; kann auch die alte v1.0.0.6 weiter verwendet werden. Siehe INI Beschreibung.&lt;br /&gt;
AVR:&lt;br /&gt;
* v1.2, IRMP Update auf 17.05.2010, neues Protokoll GRUNDIG, Bugfix SAMSUNG32&lt;br /&gt;
|-&lt;br /&gt;
| 09.05.2010 || DLL:&lt;br /&gt;
* v1.0.0.6, Bugfix für Standby - die Verbindung zum Gerät wurde nicht richtig getrennt&lt;br /&gt;
Sonstiges:&lt;br /&gt;
* Plugin für EventGhost wurde hinzugefügt&lt;br /&gt;
* Dokumentation überarbeitet&lt;br /&gt;
|-&lt;br /&gt;
| 02.05.2010 || Dokumentation überarbeitet, PonyProg2000 im Schaltplan aufgenommen.&lt;br /&gt;
|-&lt;br /&gt;
| 28.04.2010 || DLL:&lt;br /&gt;
* v1.0.0.5, Möglichkeit um die Firmware über den Settings/Optionen Dialog auf den Mikrochip programmieren zu können hinzugefügt.&lt;br /&gt;
&lt;br /&gt;
AVR:&lt;br /&gt;
* Bugfix der Entprellung&lt;br /&gt;
* Irmp Version Update auf 28.04.2010&lt;br /&gt;
* modifizierter bootloadHID um über den Settings/Optionen Dialog eine neue Firmware aufspielen zu können&lt;br /&gt;
|-&lt;br /&gt;
| 23.04.2010 || DLL:&lt;br /&gt;
* v1.0.0.4, Tasten Unterdrückung für träge Host Anwendung hinzugefügt&lt;br /&gt;
* Bugfix für Settings/Optionen Dialog und DVBViewer&lt;br /&gt;
&lt;br /&gt;
AVR:&lt;br /&gt;
* Bugfix der Entprellung wenn die Taste länger als 255 Wiederholungen gedrückt war&lt;br /&gt;
* Erkennung/Auswertung des PowerOn IR-Code optimiert&lt;br /&gt;
|-&lt;br /&gt;
| 16.04.2010 || DLL:&lt;br /&gt;
* v1.0.0.3, InitNative, InitPAnsiChar und Girder Unterstützung hinzugefügt&lt;br /&gt;
&lt;br /&gt;
AVR:&lt;br /&gt;
* Irmp Version Update auf 16.04.2010&lt;br /&gt;
|-&lt;br /&gt;
| 12.04.2010 || AVR:&lt;br /&gt;
* Irmp Version Update auf 12.04.2010, neues Protokoll B&amp;amp;Q&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== AVR Source ===&lt;br /&gt;
&lt;br /&gt;
Der Source kann mit [http://www.atmel.com/dyn/Products/tools_card.asp?tool_id=2725 AVR-Studio] und [http://winavr.sourceforge.net WinAVR] kompiliert werden.&lt;br /&gt;
Ab AVR v1.8 wird nun AVR Studio v5 benutzt und somit ist kein extra WinAVR mehr notwendig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung IRMP ab 26.06.2010&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind die unterstützen Protokolle von Irmp so viel geworden, dass nicht mehr alle in den Flash des Atmega8 mit dem Bootloader passen.&lt;br /&gt;
&lt;br /&gt;
Als Alternative kann der Atmega168p verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Man sollte also für seine eigene Verwendung die Protokolle in der &#039;&#039;&#039;irmpconfig.h&#039;&#039;&#039; aktivieren die man benötigt und den AVR Source neu kompilieren!&lt;br /&gt;
&lt;br /&gt;
Es ist eine fertige Version mit im Paket die auf den Atmega8 passt und diese Protokolle unterstützt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// typical protocols, disable here!             Enable  Remarks                 F_INTERRUPTS            Program Space&lt;br /&gt;
#define IRMP_SUPPORT_SIRCS_PROTOCOL             1       // Sony SIRCS           &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRMP_SUPPORT_NEC_PROTOCOL               1       // NEC + APPLE          &amp;gt;= 10000                 ~300 bytes&lt;br /&gt;
#define IRMP_SUPPORT_SAMSUNG_PROTOCOL           1       // Samsung + Samsung32  &amp;gt;= 10000                 ~300 bytes&lt;br /&gt;
#define IRMP_SUPPORT_MATSUSHITA_PROTOCOL        1       // Matsushita           &amp;gt;= 10000                  ~50 bytes&lt;br /&gt;
#define IRMP_SUPPORT_KASEIKYO_PROTOCOL          1       // Kaseikyo             &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRMP_SUPPORT_DENON_PROTOCOL             1       // DENON, Sharp         &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
&lt;br /&gt;
// more protocols, enable here!                 Enable  Remarks                 F_INTERRUPTS            Program Space&lt;br /&gt;
#define IRMP_SUPPORT_RC5_PROTOCOL               0       // RC5                  &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRMP_SUPPORT_RC6_PROTOCOL               0       // RC6 &amp;amp; RC6A           &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRMP_SUPPORT_JVC_PROTOCOL               0       // JVC                  &amp;gt;= 10000                 ~150 bytes&lt;br /&gt;
#define IRMP_SUPPORT_NEC16_PROTOCOL             0       // NEC16                &amp;gt;= 10000                 ~100 bytes&lt;br /&gt;
#define IRMP_SUPPORT_NEC42_PROTOCOL             0       // NEC42                &amp;gt;= 10000                 ~300 bytes&lt;br /&gt;
#define IRMP_SUPPORT_IR60_PROTOCOL              0       // IR60 (SAB2008)       &amp;gt;= 10000                 ~300 bytes&lt;br /&gt;
#define IRMP_SUPPORT_GRUNDIG_PROTOCOL           0       // Grundig              &amp;gt;= 10000                 ~300 bytes&lt;br /&gt;
#define IRMP_SUPPORT_SIEMENS_PROTOCOL           0       // Siemens Gigaset      &amp;gt;= 15000                 ~550 bytes&lt;br /&gt;
#define IRMP_SUPPORT_NOKIA_PROTOCOL             0       // Nokia                &amp;gt;= 10000                 ~300 bytes&lt;br /&gt;
&lt;br /&gt;
// exotic protocols, enable here!               Enable  Remarks                 F_INTERRUPTS            Program Space&lt;br /&gt;
#define IRMP_SUPPORT_KATHREIN_PROTOCOL          0       // Kathrein             &amp;gt;= 10000                 ~200 bytes&lt;br /&gt;
#define IRMP_SUPPORT_NUBERT_PROTOCOL            0       // NUBERT               &amp;gt;= 10000                  ~50 bytes&lt;br /&gt;
#define IRMP_SUPPORT_BANG_OLUFSEN_PROTOCOL      0       // Bang &amp;amp; Olufsen       &amp;gt;= 10000                 ~200 bytes&lt;br /&gt;
#define IRMP_SUPPORT_RECS80_PROTOCOL            0       // RECS80 (SAA3004)     &amp;gt;= 15000                  ~50 bytes&lt;br /&gt;
#define IRMP_SUPPORT_RECS80EXT_PROTOCOL         0       // RECS80EXT (SAA3008)  &amp;gt;= 15000                  ~50 bytes&lt;br /&gt;
#define IRMP_SUPPORT_THOMSON_PROTOCOL           0       // Thomson              &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRMP_SUPPORT_NIKON_PROTOCOL             0       // NIKON camera         &amp;gt;= 10000                 ~250 bytes&lt;br /&gt;
#define IRMP_SUPPORT_NETBOX_PROTOCOL            0       // Netbox keyboard      &amp;gt;= 10000                 ~400 bytes (PROTOTYPE!)&lt;br /&gt;
#define IRMP_SUPPORT_FDC_PROTOCOL               0       // FDC3402 keyboard     &amp;gt;= 10000 (better 15000)  ~150 bytes (~400 in combination with RC5)&lt;br /&gt;
#define IRMP_SUPPORT_RCCAR_PROTOCOL             0       // RC Car               &amp;gt;= 10000 (better 15000)  ~150 bytes (~500 in combination with RC5)&lt;br /&gt;
#define IRMP_SUPPORT_RUWIDO_PROTOCOL            0       // RUWIDO, T-Home       &amp;gt;= 15000                 ~550 bytes&lt;br /&gt;
#define IRMP_SUPPORT_LEGO_PROTOCOL              0       // LEGO Power RC        &amp;gt;= 20000                 ~150 bytes&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Konfigurationen AVR Source bootloadHID&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Auch die modifizierte Version des bootloadHID kann mit AVR-Studio und WinAVR kompiliert werden. Je nach Mikrochip muss die Bootloader Adresse in AVR-Studio eingestellt werden. Der Bootloader benötigt 2048 Bytes.&lt;br /&gt;
&lt;br /&gt;
In der Menüleiste unter &#039;&#039;Project&#039;&#039;-&amp;gt;&#039;&#039;Configuration Options&#039;&#039;-&amp;gt;&#039;&#039;Custom Options&#039;&#039;-&amp;gt;&#039;&#039;[Linker Options]&#039;&#039; die Zeile&lt;br /&gt;
&lt;br /&gt;
Atmega8:&lt;br /&gt;
&amp;lt;c&amp;gt;-Wl,--section-start=.text=0x1800&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Atmega168p:&lt;br /&gt;
&amp;lt;c&amp;gt;-Wl,--section-start=.text=0x3800&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
auf die richtige Bootloader Adresse ändern.&lt;br /&gt;
&lt;br /&gt;
= Schaltplan des USB IR Remote Receiver =&lt;br /&gt;
[[Datei:USB_IR_Remote_Receiver_schematic.jpg|1000px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Erläuterung&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Z-Dioden ZD1 und ZD2 werden benötigt, um dem USB Standard zu entsprechen.&lt;br /&gt;
&lt;br /&gt;
Es können folgende IR Empfänger Dioden eingesetzt werden:&lt;br /&gt;
&lt;br /&gt;
    Vishay TSOP 1738, Vishay TSOP 1838, Vishay TSOP 11xx series, Siemens SFH 5110, Radio Shack 276-0137, Mitsumi IR Preamp KEY-COOSV (0924G),&lt;br /&gt;
    Toshiba TK19 444 TFMS 5360, Temic TFMS 5380 by Telefunken Semiconductors, Sharp IS1U60, Everlight IRM-8601S, Sony SBX 1620-12, Sharp GP1U271R&lt;br /&gt;
&lt;br /&gt;
Optional: R6 und OK1: diese Bauteile werden für die PowerOn Funktion benötigt um den Host PC über den Power Schalter ein/ausschalten zu können.&lt;br /&gt;
&lt;br /&gt;
Optional: J1: wird nur für den nicht modifizierten bootloadHID Bootloader benötigt.&lt;br /&gt;
&lt;br /&gt;
Optional: CN2, R8 und R9: werden nur benötigt falls man keinen Programmer hat und den Mikrochip mit PonyProg2000 über den LPT Port programmieren will.&lt;br /&gt;
&lt;br /&gt;
== Foto eines aufgebauten USB IR Remote Receiver ==&lt;br /&gt;
[[Datei:avr_hardware_front.jpg|300px]][[Datei:avr_hardware_back.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:USB_IR_Remote_Receiver_Top.jpg|300px]][[Datei:USB_IR_Remote_Receiver_Bot.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:Plot USBIRRR Page 1.jpg|300px]]&lt;br /&gt;
[[Datei:Plot USBIRRR Page 2.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Aufbau als Stick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:USBIRRR Stick Bottom.jpg|320px]]&lt;br /&gt;
[[Datei:USBIRRR Stick Top.jpg|300px]]&lt;br /&gt;
[[Datei:USBIRRR Stick Case.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
= USB IR Remote Receiver DLL =&lt;br /&gt;
&lt;br /&gt;
Die inkludierte &#039;&#039;&#039;USB_IR_Remote_Receiver.dll&#039;&#039;&#039; übernimmt für den Anwender die Kommunikation des Host PCs mit der Hardware. Somit braucht sich der Anwender nicht um die Geräte Verbindung zu kümmern. Empfangene IR-Codes werden von der DLL an die Host-Anwendung per CallBack Funktion weiter gereicht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die DLL Unterstützt folgende Host-Anwendungen:&#039;&#039;&#039;&lt;br /&gt;
* [http://www.dvbviewer.com DVBViewer] als Input-Plugin: Die DLL muss sich im DVBViewer\Plugins Ordner befinden&lt;br /&gt;
* [http://www.promixis.com Girder] als Input-Plugin: Die DLL muss sich im Girder\Plugins Ordner befinden, es wird Girder ab Version 3.2.9 unterstüzt.&lt;br /&gt;
* [http://www.eventghost.org EventGhost] als Input-Plugin: Die DLL und die &#039;__init__.py&#039; muss sich im EventGhost\plugins\USBIRRemoteReceiver Ordner befinden&lt;br /&gt;
* Native: mit den Funktionen &#039;&#039;InitNative&#039;&#039; und &#039;&#039;InitPAnsiChar&#039;&#039; kann die DLL kann auch für selbst geschriebene Anwendungen verwendet werden&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Settings/Optionen Dialog ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:MainScreen.jpg]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Settings/Optionen Dialog&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Objekt || Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| Device Connected  || Wenn das Gerät verbunden ist erscheint ein grünes Icon. auch wird die beinhaltete Irmp Version angezeigt. Auch die USB IR Remote Receiver Mikrochip Version wird angezeigt.&lt;br /&gt;
|-&lt;br /&gt;
| PowerOn Function Status || Wenn die PowerOn Funktion im Gerät aktiviert ist erscheint das grüne Icon. Mit dem Button kann man die Funktion im Gerät aktivieren/deaktivieren.&lt;br /&gt;
|-&lt;br /&gt;
| Disable PowerOn when initialized || Ist diese Option aktiviert, wird beim initialisieren des Gerätes durch die Host Anwendung die PowerOn Funktion deaktiviert. Beim Entladen der DLL oder bei Standby/Ruhezustand des Hosts-PCs wird die PowerOn Funktion wieder aktiviert um den PC wieder einschalten zu können. Somit kann die gleiche Taste auf einer Fernbedienung zum Einschalten des PC und in der Software für eine andere Funktion verwendet werden.&lt;br /&gt;
|-&lt;br /&gt;
| Received IR Code || Hier wird der zuletzt empfangene IR-Code angezeigt. Wenn der Settings/Optionen Dialog sichtbar ist wird der IR-Code nicht zur Host Anwendung weiter gerreicht und man kann verschiedene Tasten der Fernbedienung ausprobieren ohne in der Host Anwendung etwas auszulösen.&lt;br /&gt;
|-&lt;br /&gt;
| Trained IR Code || Hier wird der gespeicherte IR-Code, der für die PowerOn Funktion verwendet wird, angezeigt.&lt;br /&gt;
|-&lt;br /&gt;
| Read Trained IR Code || Hier kann der aktuelle gespeicherte IR-Code für die PowerOn Funktion aus dem EEPROM ausgelesen werden.&lt;br /&gt;
|-&lt;br /&gt;
| Clear Trained IR Code || Hier kann der aktuelle gespeicherte IR-Code für die PowerOn Funktion im EEPROM gelöscht werden. Bei nicht vorhanden sein eines IR-Codes im EEPROM wird automatisch der nächste empfangene IR-Code wieder abgespeichert. Dieser wird dann wieder für die PowerOn Funktion verwendet.&lt;br /&gt;
|-&lt;br /&gt;
| Enable IRMP Logging || Wenn die Fernbedinung von IRMP nicht erkannt wird kann man mit dieser Option die rohen IR Signale loggen. Der AVR Source muss dazu mit IRMP_LOGGING=1 kompiliert sein.&lt;br /&gt;
|-&lt;br /&gt;
| Minimum of Repeats || Hier kann die Entprellung der Fernbedienung eingestellt werden. Je höher dieser Wert ist um so mehr Wiederholungen des IR-Codes müssen vorkommen bis sie wieder ohne Einschränkungen zur Host Anwendung durchgelassen werden. Ein Wert von 0 bedeutet keine Entprellung. (Default 5)&lt;br /&gt;
|-&lt;br /&gt;
| Flash/Update Firmware || Diese Funktion ist ab USB IR Remote Receiver v1.1 oder wenn sich das Gerät im Bootloader Modus befindet verfügbar. Es wird ein neuer Dialog geöffnet wo es möglich ist eine Intel-HEX Datei auszuwählen und die Firmware des Gerätes zu erneuern.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== IRMP Logging ==&lt;br /&gt;
Ist auf dem AVR eine Firmware mit der Kompileroption IRMP_LOGGING = 1 können die Rohdaten des IR Signales aufgezeichnet werden.&lt;br /&gt;
&lt;br /&gt;
Dazu muss im Optionen Dialog die Option &amp;quot;Enable IRMP Logging&amp;quot; aktiviert werden. Nun wird bei empfangenen Rohdaten eine Beschreibung der zuletzt gedrückten Taste auf der Fernbedienung verlangt. Die Rohdaten werden danach in das Textfile &amp;quot;IRMP_Log.txt&amp;quot; im selben Ordner wo sich die DLL befindet geschrieben.&lt;br /&gt;
&lt;br /&gt;
Dieses Textfile kann zur Analyse der IR Signale verwendet werden. Auch können die Rohdaten direkt mit der &amp;quot;irmp.exe&amp;quot; analysiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;C:\Program Files (x86)\DVBViewer\Plugins&amp;gt;irmp.exe &amp;lt;IRMP_Log.txt&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
# 1&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
# 02.01.12 17:18:32&lt;br /&gt;
00000010111111011000000001111111 p = 2, a = 0xbf40, c = 0x0001, f = 0x00&lt;br /&gt;
p = 2, a = 0xbf40, c = 0x0001, f = 0x01&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Flash/Update Firmware Dialog ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:FlashScreen.jpg]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Flash/Update Firmware Dialog&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Objekt || Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| Load Intel HEX File|| Hier kann die USB IR Remote Receiver Firmware einfach in das Gerät eingespielt werden. Die Firmware ist auf die Größe des verwendeten Mikrochips Flashes minus der Bootloader Größe (2048 Bytes) beschränkt. Beim Atmega8 sind es dann z.B. maximal Flash 8192 Bytes - Bootloader 2048 Bytes = 6144 Bytes. Beim Atmega168p sind es dann z.B. maximal Flash 16384 Bytes - Bootloader 2048 Bytes = 14336 Bytes.&lt;br /&gt;
Wenn das Gerät sich im Normal Betrieb befindet wird zuerst das Gerät neu gestartet um es in den Bootloader Modus zu versetzen. Danach wird die neue Firmware automatisch eingespielt. Nach dem Einspielen wird das Gerät neu gestartet und es sollte dann die neue Firmware automatisch gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Um die volle Funktion des Einspielen einer neuen Firmware zu haben sollte die modifizierte Version von [[#bootloadHID]] verwendet werden.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== USB IR Remote Receiver INI ==&lt;br /&gt;
Beim ersten mal Initialisieren der DLL wird eine &#039;&#039;USB_IR_Remote_Receiver.ini&#039;&#039; im gleichen Ordner wo sich die DLL befindet erzeugt.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;USB_IR_Remote_Receiver.ini&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Sektion || Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| [IRMP Protocols] || Hier wird die Liste der unterstützen Protokolle von Irmp eingetragen. Sollte ein neues Protokoll hinzukommen kann dies einfach hier ergänzt werden ohne das es nötig ist die DLL zu erneuern.&lt;br /&gt;
&lt;br /&gt;
Format:&lt;br /&gt;
&#039;&#039;Name_des_Protokolls&#039;&#039;=&#039;&#039;Irmp_ID&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
z.B.:&lt;br /&gt;
&#039;&#039;NEC&#039;&#039;=&#039;&#039;2&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| [Settings] || &#039;&#039;&#039;Gerätverbindung Startverzögerung&#039;&#039;&#039;&lt;br /&gt;
Um der Host Anwendung genug Zeit zu lassen kann eine Startverzögerung zwischen Initialisieren und verbinden mit dem Gerät eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
Format:&lt;br /&gt;
&#039;&#039;StartUpDelay&#039;&#039;=&#039;&#039;gewünschter_Wert_in_Millisekunden&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
z.B.:&lt;br /&gt;
&#039;&#039;StartUpDelay&#039;&#039;=&#039;&#039;2000&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Default: 2000ms&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tasten Unterdrückung&#039;&#039;&#039;&lt;br /&gt;
Sollte die verwendete Host Anwendung eher träge reagieren - d.h. nicht schnell genug sein um die empfangenen IR-Codes umzusetzen kann eine Tasten Unterdrückung zusätzlich aktiviert werden.&lt;br /&gt;
&lt;br /&gt;
Format:&lt;br /&gt;
&#039;&#039;Key Suppression&#039;&#039;=&#039;&#039;gewünschter_Wert_in_Millisekunden&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
z.B.:&lt;br /&gt;
&#039;&#039;Key Suppression&#039;&#039;=&#039;&#039;200&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Default: 0ms - deaktiviert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Debug LOG&#039;&#039;&#039;&lt;br /&gt;
Um das Debug Logmemo im Settings/Optionen Dialog anzuzeigen kann dieser Wert eingetragen werden:&lt;br /&gt;
&lt;br /&gt;
Format:&lt;br /&gt;
&#039;&#039;Debug&#039;&#039;=&#039;&#039;0/1&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
z.B.:&lt;br /&gt;
&#039;&#039;Debug&#039;&#039;=&#039;&#039;0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Default: 0 - deaktiviert&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= bootloadHID =&lt;br /&gt;
&lt;br /&gt;
Um einfach in das Gerät eine neue Firmware einspielen zu können wurde das Projekt [http://www.obdev.at/products/vusb/prjdetail.php?pid=32 bootloadHID] etwas verändert.&lt;br /&gt;
&lt;br /&gt;
Es kann nun aus der eigentlichen Firmware das Gerät in den Bootloader Modus gebracht werden ohne den Jumper setzen oder das Gerät aus/einstecken zu müssen.&lt;br /&gt;
&lt;br /&gt;
Das Gerät kann nun in den Bootloader Modus gebracht werden wenn:&lt;br /&gt;
* der Jumper gesetzt ist&lt;br /&gt;
* keine USB IR Remote Receiver Firmware im Flash ist&lt;br /&gt;
* die USB IR Remote Receiver Firmware den Bootloader Modus startet&lt;br /&gt;
&lt;br /&gt;
Bei einem leeren Gerät sollte zuerst mit einem Programmer oder mit PonyProg2000 über den LPT Port der Bootloader aufgespielt werden. Die USB IR Remote Receiver Firmware selber kann danach einfach über den Settings/Optionen Dialog eingespielt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fuses&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Beim Bootloader ist es wichtig die Fuse Bits richtig zu setzten, denn ansonsten kann es nach dem ersten Update der Firmware vorkommen dass der Bootloader gelöscht wird. Wenn ein anderer Mikrochip als der Atmega8 verwendet wird muss gegebenfalls auch die Adresse des Bootloader angepasst werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;###############################################################################&lt;br /&gt;
# Configure the following variables according to your AVR. The example below&lt;br /&gt;
# is for an ATMega8. Program the device with&lt;br /&gt;
# make fuse  # to set the clock generator, boot section size etc.&lt;br /&gt;
# make flash # to load the boot loader into flash&lt;br /&gt;
# make lock  # to protect the boot loader from overwriting&lt;br /&gt;
&lt;br /&gt;
DEVICE = atmega8&lt;br /&gt;
BOOTLOADER_ADDRESS = 1800&lt;br /&gt;
F_CPU = 12000000&lt;br /&gt;
FUSEH = 0xc0&lt;br /&gt;
FUSEL = 0x9f&lt;br /&gt;
&lt;br /&gt;
# Fuse high byte:&lt;br /&gt;
# 0xc0 = 1 1 0 0   0 0 0 0 &amp;lt;-- BOOTRST (boot reset vector at 0x1800)&lt;br /&gt;
#        ^ ^ ^ ^   ^ ^ ^------ BOOTSZ0&lt;br /&gt;
#        | | | |   | +-------- BOOTSZ1&lt;br /&gt;
#        | | | |   + --------- EESAVE (preserve EEPROM over chip erase)&lt;br /&gt;
#        | | | +-------------- CKOPT (full output swing)&lt;br /&gt;
#        | | +---------------- SPIEN (allow serial programming)&lt;br /&gt;
#        | +------------------ WDTON (WDT not always on)&lt;br /&gt;
#        +-------------------- RSTDISBL (reset pin is enabled)&lt;br /&gt;
# Fuse low byte:&lt;br /&gt;
# 0x9f = 1 0 0 1   1 1 1 1&lt;br /&gt;
#        ^ ^ \ /   \--+--/&lt;br /&gt;
#        | |  |       +------- CKSEL 3..0 (external &amp;gt;8M crystal)&lt;br /&gt;
#        | |  +--------------- SUT 1..0 (crystal osc, BOD enabled)&lt;br /&gt;
#        | +------------------ BODEN (BrownOut Detector enabled)&lt;br /&gt;
#        +-------------------- BODLEVEL (2.7V)&lt;br /&gt;
###############################################################################&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Programmieren des Mikrochips mit PonyProg2000 über den LPT Port ==&lt;br /&gt;
Der Schaltplan enthält die Bauteile R8, R9 und CN2. Diese werden nur benötigt, wenn man über keinen Mikrochip Programmer verfügt. Ansonsten kann mit diesen 3 zusätzlichen Bauteilen der Mikrochip mit PonyProg2000 über den LPT Port eines PCs programmiert werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel eines LPT Kabels im Selberbau&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:LPT_cable.jpg]]&lt;br /&gt;
&lt;br /&gt;
Nach dem Download und Installieren von PonyProg2000 muss dies zuerst Kalibriert werden. Dazu in der Menüleiste auf &#039;&#039;Setup&#039;&#039;-&amp;gt;&#039;&#039;Calibration&#039;&#039; gehen und ausführen.&lt;br /&gt;
&lt;br /&gt;
Danach kann der Mikrochip eingestellt werden. Für Atmega8 in der Menüleiste &#039;&#039;Device&#039;&#039;-&amp;gt;&#039;&#039;AVR micro&#039;&#039;-&amp;gt;&#039;&#039;ATmega8&#039;&#039; auswählen.&lt;br /&gt;
&lt;br /&gt;
Dann kann das LPT Kabel mit dem Host PC Verbunden werden. Auch muss die USB Verbindung vorhanden sein, da der Mikrochip von dem USB-Port versorgt wird. Nun kann man die Verbindung mit dem Mikrochip mit &#039;&#039;Probe&#039;&#039; überprüfen.&lt;br /&gt;
[[Datei:I_O.JPG]]&lt;br /&gt;
&lt;br /&gt;
Sollten hier Probleme auftreten kann es helfen in der &#039;&#039;PONYPROG2000.INI&#039;&#039; den Wert &#039;&#039;AutoDetectPorts=YES&#039;&#039; auf &#039;&#039;NO&#039;&#039; umzustellen. Eventuell muss dann noch bei &#039;&#039;LPTPorts&#039;&#039; die LPT Port Adresse eingetragen werden.&lt;br /&gt;
&lt;br /&gt;
Wenn der Test OK verläuft kann nun die &#039;&#039;bootloadHID.hex&#039;&#039; Datei in der Menüleiste &#039;&#039;File&#039;&#039;-&amp;gt;&#039;&#039;Open Device File...&#039;&#039; geöffnet werden. Es sollten nun lauter FF zu sehen sein. Der Bootloader startet beim Atmega8 erst ab Adresse 0x1800!&lt;br /&gt;
&lt;br /&gt;
Nun sollten die Fuse Bits über die Menüleiste &#039;&#039;Command&#039;&#039;-&amp;gt;&#039;&#039;Security and Configuration Bits...&#039;&#039; eingestellt werden:&lt;br /&gt;
&lt;br /&gt;
[[Datei:fuses.JPG]]&lt;br /&gt;
&lt;br /&gt;
Dannach auf &#039;&#039;Write&#039;&#039; drücken um die Fuses auf dem Mikrochip zu setzten. Danach kann das Fuses-Fenster geschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Nun in der Menüleiste über &#039;&#039;Command&#039;&#039;-&amp;gt;&#039;&#039;Write All&#039;&#039; die zuvor geöffnete bootloadHID.hex auf den Mikrochip programmieren. Wenn dieser Vorgang abgeschlossen wurde zuerst PonyProg2000 beenden, USB Verbindung trennen und dann das LPT Kabel entfernen. Wenn keine Probleme auftreten wird das LPT-Kabel und PonyProg2000 nun jetzt nicht mehr gebraucht.&lt;br /&gt;
&lt;br /&gt;
Nun kann der USB IR Remote Receiver über USB angeschlossen werden und es sollte sich ein USB Gerät Namens &#039;&#039;HIDBoot&#039;&#039; anmelden. Nun kann über den Settings/Optionen Dialog eine USB IR Remote Receiver Firmware aufgespielt werden.&lt;br /&gt;
&lt;br /&gt;
= Weblinks =&lt;br /&gt;
&#039;&#039;&#039;V-USB&#039;&#039;&#039;:&lt;br /&gt;
* http://www.obdev.at/products/vusb/index-de.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PonyProg2000&#039;&#039;&#039;:&lt;br /&gt;
* http://www.lancos.com/prog.html&lt;br /&gt;
&lt;br /&gt;
== Hardware / Projekte ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMP - Infrarot-Multiprotokoll-Decoder&#039;&#039;&#039;:&lt;br /&gt;
* [[IRMP]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Version auf Basis vom USBasp&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Enthält auch ein Linux Kommandozeilen Tool:&lt;br /&gt;
* [[http://www.easyvdr-forum.de/forum/index.php?topic=13723.msg117780#msg117780 USBASP Einschalter]]&lt;br /&gt;
&lt;br /&gt;
= Danksagung =&lt;br /&gt;
Vielen Dank an das Forum + Community für deren Unterstützung!&lt;br /&gt;
&lt;br /&gt;
Auch speziellen Dank an Frank M. für sein Irmp.&lt;br /&gt;
&lt;br /&gt;
= Diskussion =&lt;br /&gt;
&lt;br /&gt;
Meinungen, Verbesserungsvorschläge oder Kritik kann im [http://www.mikrocontroller.net/topic/171111 Beitrag: USB IR Remote Receiver (V-USB + IRMP)] geäussert werden.&lt;br /&gt;
&lt;br /&gt;
Viel Spaß mit dem USB IR Remote Receiver!&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:USB]]&lt;br /&gt;
[[Kategorie:Infrarot]]&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;/div&gt;</summary>
		<author><name>Muebau</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=BMA020&amp;diff=63194</id>
		<title>BMA020</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=BMA020&amp;diff=63194"/>
		<updated>2012-01-08T14:01:36Z</updated>

		<summary type="html">&lt;p&gt;Muebau: /* Bezugsquellen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der BMA020 ist ein 3-Achsen-Beschleunigungssensor von Bosch der über I2C oder ISP ausgelesen und konfiguriert werden kann.&lt;br /&gt;
&lt;br /&gt;
=BMA020=&lt;br /&gt;
==Bauteilseite==&lt;br /&gt;
[http://www.mikrocontroller.net/part/BMA020 Zur Bauteilseite des BMA020]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Bezugsquellen==&lt;br /&gt;
===ELV===&lt;br /&gt;
http://www.elv.de/3-Achsen-Beschleunigungssensor-3D-BS,-Komplettbausatz/x.aspx/cid_74/detail_10/detail2_28515&lt;br /&gt;
===Farnell===&lt;br /&gt;
http://de.farnell.com/bosch/bma020-0330sb000b/daughter-board/dp/1795593?Ntt=BMA020&lt;br /&gt;
&lt;br /&gt;
==Speicheraufteilung==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;BMA020 Speicher&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Adresse&lt;br /&gt;
! Bit 7&lt;br /&gt;
! Bit 6&lt;br /&gt;
! Bit 5&lt;br /&gt;
! Bit 4&lt;br /&gt;
! Bit 3&lt;br /&gt;
! Bit 2&lt;br /&gt;
! Bit 1&lt;br /&gt;
! Bit 0&lt;br /&gt;
! Typ&lt;br /&gt;
! Axis&lt;br /&gt;
|-&lt;br /&gt;
| 16h - 7Fh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| -&lt;br /&gt;
| reserved&lt;br /&gt;
|rowspan=&amp;quot;15&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| 15h&lt;br /&gt;
| SPI4E&amp;lt;br&amp;gt;(4 wire SPI enable)&amp;lt;br&amp;gt;(default: 1)&lt;br /&gt;
| EAI &amp;lt;br&amp;gt;(enable advanced interrupt)&lt;br /&gt;
| NDI &amp;lt;br&amp;gt;(new data interrupt)&lt;br /&gt;
| LI &amp;lt;br&amp;gt;(latch interrupt)&lt;br /&gt;
|[[#Shadow disable|SD&amp;lt;br&amp;gt;(shadow disable / read MSB only)]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| WUP &amp;lt;br&amp;gt;(wake up pause)&lt;br /&gt;
| WU &amp;lt;br&amp;gt;(wake up)&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 14h&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| - !!! -&amp;lt;br&amp;gt;(NEVER ever change this registers)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|[[#Range|range&amp;lt;br&amp;gt;(+/-2/4/8g)]]&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|[[#Bandwith|bandwith&amp;lt;br&amp;gt;(25...1500 Hz)]]&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 13h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot; rowspan=&amp;quot;2&amp;quot;| customer reserved&amp;lt;br&amp;gt;(can be used as memory)&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 12h&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 11h&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| AMD &amp;lt;br&amp;gt;(any motion duration)&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| HGH &amp;lt;br&amp;gt;(high gravitation hysteresis)&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| LGH &amp;lt;br&amp;gt;(low gravitation hysteresis)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 10h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| AMT &amp;lt;br&amp;gt;(any motion threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Fh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| HGD &amp;lt;br&amp;gt;(high gravitation duration)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Eh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| HGT  &amp;lt;br&amp;gt;(high gravitation threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Dh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| LGD &amp;lt;br&amp;gt;(low gravitation duration)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Ch&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| LGT &amp;lt;br&amp;gt;(high gravitation threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Bh&lt;br /&gt;
| alert&lt;br /&gt;
| AM &amp;lt;br&amp;gt;(any motion)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| HGC &amp;lt;br&amp;gt;(high gravitation counter)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| LGC &amp;lt;br&amp;gt;(low gravitation counter)&lt;br /&gt;
| HGE  &amp;lt;br&amp;gt;(high gravitation enable)&lt;br /&gt;
| LGE &amp;lt;br&amp;gt;(low gravitation enable)&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 0Ah&lt;br /&gt;
| -&lt;br /&gt;
| reset INT&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| self test 1&lt;br /&gt;
| self test 2&lt;br /&gt;
| soft reset&lt;br /&gt;
| sleep&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 09h&lt;br /&gt;
| STR &amp;lt;br&amp;gt;(self test result)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| -&lt;br /&gt;
| alert phase&lt;br /&gt;
| LG latched&lt;br /&gt;
| HG latched&lt;br /&gt;
| HGS &amp;lt;br&amp;gt;(high gravitation status)&lt;br /&gt;
| LGS &amp;lt;br&amp;gt;(low gravitation status)&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 08h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| -&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 07h&lt;br /&gt;
| Z [9]&lt;br /&gt;
| Z [8]&lt;br /&gt;
| Z [7]&lt;br /&gt;
| Z [6]&lt;br /&gt;
| Z [5]&lt;br /&gt;
| Z [4]&lt;br /&gt;
| Z [3]&lt;br /&gt;
| Z [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| Z&lt;br /&gt;
|-&lt;br /&gt;
| 06h&lt;br /&gt;
| Z [1]&lt;br /&gt;
| Z [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDZ &amp;lt;br&amp;gt;(new data Z)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 05h&lt;br /&gt;
| Y [9]&lt;br /&gt;
| Y [8]&lt;br /&gt;
| Y [7]&lt;br /&gt;
| Y [6]&lt;br /&gt;
| Y [5]&lt;br /&gt;
| Y [4]&lt;br /&gt;
| Y [3]&lt;br /&gt;
| Y [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| Y&lt;br /&gt;
|-&lt;br /&gt;
| 04h&lt;br /&gt;
| Y [1]&lt;br /&gt;
| Y [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDY &amp;lt;br&amp;gt;(new data Y)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 03h&lt;br /&gt;
| X [9]&lt;br /&gt;
| X [8]&lt;br /&gt;
| X [7]&lt;br /&gt;
| X [6]&lt;br /&gt;
| X [5]&lt;br /&gt;
| X [4]&lt;br /&gt;
| X [3]&lt;br /&gt;
| X [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| X&lt;br /&gt;
|-&lt;br /&gt;
| 02h&lt;br /&gt;
| X [1]&lt;br /&gt;
| X [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDX &amp;lt;br&amp;gt;(new data X)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 01h&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;| al version&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;| ml version&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| 00h&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| chip ID&lt;br /&gt;
| data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Register==&lt;br /&gt;
===Shadow disable===&lt;br /&gt;
Ist diese Bit gesetzt ist es möglich die MSBs der Beschleunigungswerte (03h, 05h, 07h) zu lesen ohne vorher die LSBs (02h, 04h, 06h) gelesen zu haben.&lt;br /&gt;
===Range===&lt;br /&gt;
Es sind 3 verschiedene Bereiche einstellbar:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;BMA020 Range&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;| 14h&lt;br /&gt;
! &lt;br /&gt;
|-&lt;br /&gt;
! Bit 4&lt;br /&gt;
! Bit 3&lt;br /&gt;
! Bereich&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| +/- 2g&amp;lt;br&amp;gt;(default)&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| +/- 4g&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| +/- 8g&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| -&lt;br /&gt;
|}&lt;br /&gt;
===Bandwith===&lt;br /&gt;
Folgende Aktualisierungsraten sind möglich:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;BMA020 Bandwith&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;| 14h&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
! Bit 2&lt;br /&gt;
! Bit 1&lt;br /&gt;
! Bit 0&lt;br /&gt;
! Rate&lt;br /&gt;
! reale Rate&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 25 Hz&amp;lt;br&amp;gt;(default)&lt;br /&gt;
| 23 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 50 Hz&lt;br /&gt;
| 47 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 100 Hz&lt;br /&gt;
| 94 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 190 Hz&lt;br /&gt;
| 188 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 375 Hz&lt;br /&gt;
| 375 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 750 Hz&lt;br /&gt;
| 750 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1500 Hz&lt;br /&gt;
| 1500 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Konfiguration==&lt;br /&gt;
&lt;br /&gt;
==I2C==&lt;br /&gt;
===Adresse===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adresse&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Bit 7 || Bit 6 || Bit 5 || Bit 4 || Bit 3 || Bit 2 || Bit 1 || R/W &lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 1 || 1 || 0 || 0 || 0 || x&lt;br /&gt;
|}&lt;br /&gt;
====7 Bit Sichtweise====&lt;br /&gt;
Gemeint ist hierbei Bit 7 - 1.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adressen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Hexadezimal || Dezimal&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 56&lt;br /&gt;
|}&lt;br /&gt;
Zum lesen muss das 0. Bit gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
====8 Bit Sichtweise====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adressen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Hexadezimal || Dezimal&lt;br /&gt;
|-&lt;br /&gt;
| schreiben || 0x70 || 112&lt;br /&gt;
|-&lt;br /&gt;
| lesen || 0x71 || 113&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Beschleunigungsdaten lesen===&lt;br /&gt;
&lt;br /&gt;
Um Daten zu lesen muss erst der Offset gesendet werden ab dem Daten gelesen werden sollen. Die Beschleunigungsdaten liegen ab Adresse 0x02h.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Offset senden&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Adresse || Daten&lt;br /&gt;
|-&lt;br /&gt;
| schreiben || 0x70 || 0x02&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Beschleunigungsdaten sind pro Achse (X, Y, Z) 10 Bit lang. Diese liegen in 6 Bytes ab Adresse 0x02h (0x02h - 0x08h). Siehe dazu den Abschnitt [[#Speicheraufteilung|Speicheraufteilung]].&lt;br /&gt;
Um an die Daten zu kommen muessen 6 Byte von der Adresse des BMA020 gelesen werden:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039; Beschleunigungsdaten lesen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Adresse || Byte 1 || Byte 2 || Byte 3 || Byte 4 || Byte 5 || Byte 6&lt;br /&gt;
|-&lt;br /&gt;
| lesen || 0x71 || LSB_x || MSB_x || LSB_y || MSB_y || LSB_z || MSB_z&lt;br /&gt;
|}&lt;br /&gt;
==Berechnung==&lt;br /&gt;
===8 Bitwerte===&lt;br /&gt;
Sind die Beschleunigungswerte ausgelesen geht es nun an die Interpretation. Reicht eine Genauigkeit von 8 Bit so kann man nur den MSB-Teil der Werte nehmen.&lt;br /&gt;
Achtung: Es müssen dennoch die LSBs eingelesen werden, da die MSBs und LSBs solange blockiert bleiben bis beide eingelesen wurden.&lt;br /&gt;
Um dies zu verhindern muss das [[#Shadow disable|Shadow disable Bit]] gesetzt werden (15h, Bit 3; siehe [[#Speicheraufteilung|Speicheraufteilung]]).&lt;br /&gt;
&lt;br /&gt;
===10 Bitwerte===&lt;br /&gt;
Hat man die Werte ausgelesen gilt es diese zusammen zu fügen. Im folgenden Beispiel wird angenommen das die Werte in der variable &amp;lt;c&amp;gt;values[]&amp;lt;/c&amp;gt; liegen. Die Variable enthält die 6 Bytes für X, Y und Z.&lt;br /&gt;
&lt;br /&gt;
Als Beispiel wird hier X erzeugt (zusammengefügt).&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
uint values[6];&lt;br /&gt;
int x;&lt;br /&gt;
&lt;br /&gt;
//X MSB (02h) um zwei nach links schieben um Platz für die beiden unteren Bits zu schaffen.&lt;br /&gt;
x = values[0] &amp;lt;&amp;lt; 2;&lt;br /&gt;
&lt;br /&gt;
//X LSB (03h) um sechs nach rechts schieben um die zwei obersten Bits an den richtigen Platz das zusammenfügen zu bringen.&lt;br /&gt;
x = x | (values[1] &amp;gt;&amp;gt; 6);&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbiges muss für Y und Z getan werden.&lt;br /&gt;
&lt;br /&gt;
===Gravitationsvektor===&lt;br /&gt;
Der Gravitationsvektor ergibt sich aus:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec g = \begin{pmatrix} x \\ y \\ z \end{pmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
====Gravitation berechnen====&lt;br /&gt;
Die Gravitation ist gleich der Länge des Gravitationsvektors:&lt;br /&gt;
&amp;lt;math&amp;gt;g = \sqrt{x^2+y^2+z^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Sensorik]]&lt;/div&gt;</summary>
		<author><name>Muebau</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=BMA020&amp;diff=63193</id>
		<title>BMA020</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=BMA020&amp;diff=63193"/>
		<updated>2012-01-08T13:59:47Z</updated>

		<summary type="html">&lt;p&gt;Muebau: Eine korrekte Zusammenfassung erstellt.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der BMA020 ist ein 3-Achsen-Beschleunigungssensor von Bosch der über I2C oder ISP ausgelesen und konfiguriert werden kann.&lt;br /&gt;
&lt;br /&gt;
=BMA020=&lt;br /&gt;
==Bauteilseite==&lt;br /&gt;
[http://www.mikrocontroller.net/part/BMA020 Zur Bauteilseite des BMA020]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Bezugsquellen==&lt;br /&gt;
===ELV===&lt;br /&gt;
http://www.elv.de/3-Achsen-Beschleunigungssensor-3D-BS,-Komplettbausatz/x.aspx/cid_74/detail_10/detail2_28515&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Speicheraufteilung==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;BMA020 Speicher&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Adresse&lt;br /&gt;
! Bit 7&lt;br /&gt;
! Bit 6&lt;br /&gt;
! Bit 5&lt;br /&gt;
! Bit 4&lt;br /&gt;
! Bit 3&lt;br /&gt;
! Bit 2&lt;br /&gt;
! Bit 1&lt;br /&gt;
! Bit 0&lt;br /&gt;
! Typ&lt;br /&gt;
! Axis&lt;br /&gt;
|-&lt;br /&gt;
| 16h - 7Fh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| -&lt;br /&gt;
| reserved&lt;br /&gt;
|rowspan=&amp;quot;15&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| 15h&lt;br /&gt;
| SPI4E&amp;lt;br&amp;gt;(4 wire SPI enable)&amp;lt;br&amp;gt;(default: 1)&lt;br /&gt;
| EAI &amp;lt;br&amp;gt;(enable advanced interrupt)&lt;br /&gt;
| NDI &amp;lt;br&amp;gt;(new data interrupt)&lt;br /&gt;
| LI &amp;lt;br&amp;gt;(latch interrupt)&lt;br /&gt;
|[[#Shadow disable|SD&amp;lt;br&amp;gt;(shadow disable / read MSB only)]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| WUP &amp;lt;br&amp;gt;(wake up pause)&lt;br /&gt;
| WU &amp;lt;br&amp;gt;(wake up)&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 14h&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| - !!! -&amp;lt;br&amp;gt;(NEVER ever change this registers)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|[[#Range|range&amp;lt;br&amp;gt;(+/-2/4/8g)]]&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|[[#Bandwith|bandwith&amp;lt;br&amp;gt;(25...1500 Hz)]]&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 13h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot; rowspan=&amp;quot;2&amp;quot;| customer reserved&amp;lt;br&amp;gt;(can be used as memory)&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 12h&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 11h&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| AMD &amp;lt;br&amp;gt;(any motion duration)&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| HGH &amp;lt;br&amp;gt;(high gravitation hysteresis)&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| LGH &amp;lt;br&amp;gt;(low gravitation hysteresis)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 10h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| AMT &amp;lt;br&amp;gt;(any motion threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Fh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| HGD &amp;lt;br&amp;gt;(high gravitation duration)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Eh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| HGT  &amp;lt;br&amp;gt;(high gravitation threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Dh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| LGD &amp;lt;br&amp;gt;(low gravitation duration)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Ch&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| LGT &amp;lt;br&amp;gt;(high gravitation threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Bh&lt;br /&gt;
| alert&lt;br /&gt;
| AM &amp;lt;br&amp;gt;(any motion)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| HGC &amp;lt;br&amp;gt;(high gravitation counter)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| LGC &amp;lt;br&amp;gt;(low gravitation counter)&lt;br /&gt;
| HGE  &amp;lt;br&amp;gt;(high gravitation enable)&lt;br /&gt;
| LGE &amp;lt;br&amp;gt;(low gravitation enable)&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 0Ah&lt;br /&gt;
| -&lt;br /&gt;
| reset INT&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| self test 1&lt;br /&gt;
| self test 2&lt;br /&gt;
| soft reset&lt;br /&gt;
| sleep&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 09h&lt;br /&gt;
| STR &amp;lt;br&amp;gt;(self test result)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| -&lt;br /&gt;
| alert phase&lt;br /&gt;
| LG latched&lt;br /&gt;
| HG latched&lt;br /&gt;
| HGS &amp;lt;br&amp;gt;(high gravitation status)&lt;br /&gt;
| LGS &amp;lt;br&amp;gt;(low gravitation status)&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 08h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| -&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 07h&lt;br /&gt;
| Z [9]&lt;br /&gt;
| Z [8]&lt;br /&gt;
| Z [7]&lt;br /&gt;
| Z [6]&lt;br /&gt;
| Z [5]&lt;br /&gt;
| Z [4]&lt;br /&gt;
| Z [3]&lt;br /&gt;
| Z [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| Z&lt;br /&gt;
|-&lt;br /&gt;
| 06h&lt;br /&gt;
| Z [1]&lt;br /&gt;
| Z [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDZ &amp;lt;br&amp;gt;(new data Z)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 05h&lt;br /&gt;
| Y [9]&lt;br /&gt;
| Y [8]&lt;br /&gt;
| Y [7]&lt;br /&gt;
| Y [6]&lt;br /&gt;
| Y [5]&lt;br /&gt;
| Y [4]&lt;br /&gt;
| Y [3]&lt;br /&gt;
| Y [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| Y&lt;br /&gt;
|-&lt;br /&gt;
| 04h&lt;br /&gt;
| Y [1]&lt;br /&gt;
| Y [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDY &amp;lt;br&amp;gt;(new data Y)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 03h&lt;br /&gt;
| X [9]&lt;br /&gt;
| X [8]&lt;br /&gt;
| X [7]&lt;br /&gt;
| X [6]&lt;br /&gt;
| X [5]&lt;br /&gt;
| X [4]&lt;br /&gt;
| X [3]&lt;br /&gt;
| X [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| X&lt;br /&gt;
|-&lt;br /&gt;
| 02h&lt;br /&gt;
| X [1]&lt;br /&gt;
| X [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDX &amp;lt;br&amp;gt;(new data X)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 01h&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;| al version&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;| ml version&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| 00h&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| chip ID&lt;br /&gt;
| data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Register==&lt;br /&gt;
===Shadow disable===&lt;br /&gt;
Ist diese Bit gesetzt ist es möglich die MSBs der Beschleunigungswerte (03h, 05h, 07h) zu lesen ohne vorher die LSBs (02h, 04h, 06h) gelesen zu haben.&lt;br /&gt;
===Range===&lt;br /&gt;
Es sind 3 verschiedene Bereiche einstellbar:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;BMA020 Range&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;| 14h&lt;br /&gt;
! &lt;br /&gt;
|-&lt;br /&gt;
! Bit 4&lt;br /&gt;
! Bit 3&lt;br /&gt;
! Bereich&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| +/- 2g&amp;lt;br&amp;gt;(default)&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| +/- 4g&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| +/- 8g&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| -&lt;br /&gt;
|}&lt;br /&gt;
===Bandwith===&lt;br /&gt;
Folgende Aktualisierungsraten sind möglich:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;BMA020 Bandwith&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;| 14h&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
! Bit 2&lt;br /&gt;
! Bit 1&lt;br /&gt;
! Bit 0&lt;br /&gt;
! Rate&lt;br /&gt;
! reale Rate&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 25 Hz&amp;lt;br&amp;gt;(default)&lt;br /&gt;
| 23 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 50 Hz&lt;br /&gt;
| 47 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 100 Hz&lt;br /&gt;
| 94 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 190 Hz&lt;br /&gt;
| 188 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 375 Hz&lt;br /&gt;
| 375 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 750 Hz&lt;br /&gt;
| 750 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1500 Hz&lt;br /&gt;
| 1500 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Konfiguration==&lt;br /&gt;
&lt;br /&gt;
==I2C==&lt;br /&gt;
===Adresse===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adresse&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Bit 7 || Bit 6 || Bit 5 || Bit 4 || Bit 3 || Bit 2 || Bit 1 || R/W &lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 1 || 1 || 0 || 0 || 0 || x&lt;br /&gt;
|}&lt;br /&gt;
====7 Bit Sichtweise====&lt;br /&gt;
Gemeint ist hierbei Bit 7 - 1.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adressen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Hexadezimal || Dezimal&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 56&lt;br /&gt;
|}&lt;br /&gt;
Zum lesen muss das 0. Bit gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
====8 Bit Sichtweise====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adressen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Hexadezimal || Dezimal&lt;br /&gt;
|-&lt;br /&gt;
| schreiben || 0x70 || 112&lt;br /&gt;
|-&lt;br /&gt;
| lesen || 0x71 || 113&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Beschleunigungsdaten lesen===&lt;br /&gt;
&lt;br /&gt;
Um Daten zu lesen muss erst der Offset gesendet werden ab dem Daten gelesen werden sollen. Die Beschleunigungsdaten liegen ab Adresse 0x02h.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Offset senden&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Adresse || Daten&lt;br /&gt;
|-&lt;br /&gt;
| schreiben || 0x70 || 0x02&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Beschleunigungsdaten sind pro Achse (X, Y, Z) 10 Bit lang. Diese liegen in 6 Bytes ab Adresse 0x02h (0x02h - 0x08h). Siehe dazu den Abschnitt [[#Speicheraufteilung|Speicheraufteilung]].&lt;br /&gt;
Um an die Daten zu kommen muessen 6 Byte von der Adresse des BMA020 gelesen werden:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039; Beschleunigungsdaten lesen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Adresse || Byte 1 || Byte 2 || Byte 3 || Byte 4 || Byte 5 || Byte 6&lt;br /&gt;
|-&lt;br /&gt;
| lesen || 0x71 || LSB_x || MSB_x || LSB_y || MSB_y || LSB_z || MSB_z&lt;br /&gt;
|}&lt;br /&gt;
==Berechnung==&lt;br /&gt;
===8 Bitwerte===&lt;br /&gt;
Sind die Beschleunigungswerte ausgelesen geht es nun an die Interpretation. Reicht eine Genauigkeit von 8 Bit so kann man nur den MSB-Teil der Werte nehmen.&lt;br /&gt;
Achtung: Es müssen dennoch die LSBs eingelesen werden, da die MSBs und LSBs solange blockiert bleiben bis beide eingelesen wurden.&lt;br /&gt;
Um dies zu verhindern muss das [[#Shadow disable|Shadow disable Bit]] gesetzt werden (15h, Bit 3; siehe [[#Speicheraufteilung|Speicheraufteilung]]).&lt;br /&gt;
&lt;br /&gt;
===10 Bitwerte===&lt;br /&gt;
Hat man die Werte ausgelesen gilt es diese zusammen zu fügen. Im folgenden Beispiel wird angenommen das die Werte in der variable &amp;lt;c&amp;gt;values[]&amp;lt;/c&amp;gt; liegen. Die Variable enthält die 6 Bytes für X, Y und Z.&lt;br /&gt;
&lt;br /&gt;
Als Beispiel wird hier X erzeugt (zusammengefügt).&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
uint values[6];&lt;br /&gt;
int x;&lt;br /&gt;
&lt;br /&gt;
//X MSB (02h) um zwei nach links schieben um Platz für die beiden unteren Bits zu schaffen.&lt;br /&gt;
x = values[0] &amp;lt;&amp;lt; 2;&lt;br /&gt;
&lt;br /&gt;
//X LSB (03h) um sechs nach rechts schieben um die zwei obersten Bits an den richtigen Platz das zusammenfügen zu bringen.&lt;br /&gt;
x = x | (values[1] &amp;gt;&amp;gt; 6);&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbiges muss für Y und Z getan werden.&lt;br /&gt;
&lt;br /&gt;
===Gravitationsvektor===&lt;br /&gt;
Der Gravitationsvektor ergibt sich aus:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec g = \begin{pmatrix} x \\ y \\ z \end{pmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
====Gravitation berechnen====&lt;br /&gt;
Die Gravitation ist gleich der Länge des Gravitationsvektors:&lt;br /&gt;
&amp;lt;math&amp;gt;g = \sqrt{x^2+y^2+z^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Sensorik]]&lt;/div&gt;</summary>
		<author><name>Muebau</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=BMA020&amp;diff=62933</id>
		<title>BMA020</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=BMA020&amp;diff=62933"/>
		<updated>2012-01-02T16:01:50Z</updated>

		<summary type="html">&lt;p&gt;Muebau: /* 8 Bitwerte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=BMA020=&lt;br /&gt;
==Bauteilseite==&lt;br /&gt;
[http://www.mikrocontroller.net/part/BMA020 Zur Bauteilseite des BMA020]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Bezugsquellen==&lt;br /&gt;
===ELV===&lt;br /&gt;
http://www.elv.de/3-Achsen-Beschleunigungssensor-3D-BS,-Komplettbausatz/x.aspx/cid_74/detail_10/detail2_28515&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Speicheraufteilung==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;BMA020 Speicher&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Adresse&lt;br /&gt;
! Bit 7&lt;br /&gt;
! Bit 6&lt;br /&gt;
! Bit 5&lt;br /&gt;
! Bit 4&lt;br /&gt;
! Bit 3&lt;br /&gt;
! Bit 2&lt;br /&gt;
! Bit 1&lt;br /&gt;
! Bit 0&lt;br /&gt;
! Typ&lt;br /&gt;
! Axis&lt;br /&gt;
|-&lt;br /&gt;
| 16h - 7Fh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| -&lt;br /&gt;
| reserved&lt;br /&gt;
|rowspan=&amp;quot;15&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| 15h&lt;br /&gt;
| SPI4E&amp;lt;br&amp;gt;(4 wire SPI enable)&amp;lt;br&amp;gt;(default: 1)&lt;br /&gt;
| EAI &amp;lt;br&amp;gt;(enable advanced interrupt)&lt;br /&gt;
| NDI &amp;lt;br&amp;gt;(new data interrupt)&lt;br /&gt;
| LI &amp;lt;br&amp;gt;(latch interrupt)&lt;br /&gt;
|[[#Shadow disable|SD&amp;lt;br&amp;gt;(shadow disable / read MSB only)]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| WUP &amp;lt;br&amp;gt;(wake up pause)&lt;br /&gt;
| WU &amp;lt;br&amp;gt;(wake up)&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 14h&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| - !!! -&amp;lt;br&amp;gt;(NEVER ever change this registers)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|[[#Range|range&amp;lt;br&amp;gt;(+/-2/4/8g)]]&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|[[#Bandwith|bandwith&amp;lt;br&amp;gt;(25...1500 Hz)]]&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 13h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot; rowspan=&amp;quot;2&amp;quot;| customer reserved&amp;lt;br&amp;gt;(can be used as memory)&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 12h&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 11h&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| AMD &amp;lt;br&amp;gt;(any motion duration)&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| HGH &amp;lt;br&amp;gt;(high gravitation hysteresis)&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| LGH &amp;lt;br&amp;gt;(low gravitation hysteresis)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 10h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| AMT &amp;lt;br&amp;gt;(any motion threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Fh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| HGD &amp;lt;br&amp;gt;(high gravitation duration)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Eh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| HGT  &amp;lt;br&amp;gt;(high gravitation threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Dh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| LGD &amp;lt;br&amp;gt;(low gravitation duration)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Ch&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| LGT &amp;lt;br&amp;gt;(high gravitation threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Bh&lt;br /&gt;
| alert&lt;br /&gt;
| AM &amp;lt;br&amp;gt;(any motion)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| HGC &amp;lt;br&amp;gt;(high gravitation counter)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| LGC &amp;lt;br&amp;gt;(low gravitation counter)&lt;br /&gt;
| HGE  &amp;lt;br&amp;gt;(high gravitation enable)&lt;br /&gt;
| LGE &amp;lt;br&amp;gt;(low gravitation enable)&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 0Ah&lt;br /&gt;
| -&lt;br /&gt;
| reset INT&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| self test 1&lt;br /&gt;
| self test 2&lt;br /&gt;
| soft reset&lt;br /&gt;
| sleep&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 09h&lt;br /&gt;
| STR &amp;lt;br&amp;gt;(self test result)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| -&lt;br /&gt;
| alert phase&lt;br /&gt;
| LG latched&lt;br /&gt;
| HG latched&lt;br /&gt;
| HGS &amp;lt;br&amp;gt;(high gravitation status)&lt;br /&gt;
| LGS &amp;lt;br&amp;gt;(low gravitation status)&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 08h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| -&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 07h&lt;br /&gt;
| Z [9]&lt;br /&gt;
| Z [8]&lt;br /&gt;
| Z [7]&lt;br /&gt;
| Z [6]&lt;br /&gt;
| Z [5]&lt;br /&gt;
| Z [4]&lt;br /&gt;
| Z [3]&lt;br /&gt;
| Z [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| Z&lt;br /&gt;
|-&lt;br /&gt;
| 06h&lt;br /&gt;
| Z [1]&lt;br /&gt;
| Z [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDZ &amp;lt;br&amp;gt;(new data Z)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 05h&lt;br /&gt;
| Y [9]&lt;br /&gt;
| Y [8]&lt;br /&gt;
| Y [7]&lt;br /&gt;
| Y [6]&lt;br /&gt;
| Y [5]&lt;br /&gt;
| Y [4]&lt;br /&gt;
| Y [3]&lt;br /&gt;
| Y [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| Y&lt;br /&gt;
|-&lt;br /&gt;
| 04h&lt;br /&gt;
| Y [1]&lt;br /&gt;
| Y [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDY &amp;lt;br&amp;gt;(new data Y)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 03h&lt;br /&gt;
| X [9]&lt;br /&gt;
| X [8]&lt;br /&gt;
| X [7]&lt;br /&gt;
| X [6]&lt;br /&gt;
| X [5]&lt;br /&gt;
| X [4]&lt;br /&gt;
| X [3]&lt;br /&gt;
| X [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| X&lt;br /&gt;
|-&lt;br /&gt;
| 02h&lt;br /&gt;
| X [1]&lt;br /&gt;
| X [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDX &amp;lt;br&amp;gt;(new data X)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 01h&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;| al version&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;| ml version&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| 00h&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| chip ID&lt;br /&gt;
| data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Register==&lt;br /&gt;
===Shadow disable===&lt;br /&gt;
Ist diese Bit gesetzt ist es möglich die MSBs der Beschleunigungswerte (03h, 05h, 07h) zu lesen ohne vorher die LSBs (02h, 04h, 06h) gelesen zu haben.&lt;br /&gt;
===Range===&lt;br /&gt;
Es sind 3 verschiedene Bereiche einstellbar:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;BMA020 Range&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;| 14h&lt;br /&gt;
! &lt;br /&gt;
|-&lt;br /&gt;
! Bit 4&lt;br /&gt;
! Bit 3&lt;br /&gt;
! Bereich&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| +/- 2g&amp;lt;br&amp;gt;(default)&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| +/- 4g&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| +/- 8g&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| -&lt;br /&gt;
|}&lt;br /&gt;
===Bandwith===&lt;br /&gt;
Folgende Aktualisierungsraten sind möglich:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;BMA020 Bandwith&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;| 14h&lt;br /&gt;
! &lt;br /&gt;
|-&lt;br /&gt;
! Bit 2&lt;br /&gt;
! Bit 1&lt;br /&gt;
! Bit 0&lt;br /&gt;
! Rate&lt;br /&gt;
! reale Rate&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 25 Hz&amp;lt;br&amp;gt;(default)&lt;br /&gt;
| 23 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 50 Hz&lt;br /&gt;
| 47 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 100 Hz&lt;br /&gt;
| 94 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 190 Hz&lt;br /&gt;
| 188 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 375 Hz&lt;br /&gt;
| 375 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 750 Hz&lt;br /&gt;
| 750 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1500 Hz&lt;br /&gt;
| 1500 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Konfiguration==&lt;br /&gt;
&lt;br /&gt;
==I2C==&lt;br /&gt;
===Adresse===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adresse&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Bit 7 || Bit 6 || Bit 5 || Bit 4 || Bit 3 || Bit 2 || Bit 1 || R/W &lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 1 || 1 || 0 || 0 || 0 || x&lt;br /&gt;
|}&lt;br /&gt;
====7 Bit Sichtweise====&lt;br /&gt;
Gemeint ist hierbei Bit 7 - 1.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adressen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Hexadezimal || Dezimal&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 56&lt;br /&gt;
|}&lt;br /&gt;
Zum lesen muss das 0. Bit gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
====8 Bit Sichtweise====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adressen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Hexadezimal || Dezimal&lt;br /&gt;
|-&lt;br /&gt;
| schreiben || 0x70 || 112&lt;br /&gt;
|-&lt;br /&gt;
| lesen || 0x71 || 113&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Beschleunigungsdaten lesen===&lt;br /&gt;
&lt;br /&gt;
Um Daten zu lesen muss erst der Offset gesendet werden ab dem Daten gelesen werden sollen. Die Beschleunigungsdaten liegen ab Adresse 0x02h.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Offset senden&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Adresse || Daten&lt;br /&gt;
|-&lt;br /&gt;
| schreiben || 0x70 || 0x02&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Beschleunigungsdaten sind pro Achse (X, Y, Z) 10 Bit lang. Diese liegen in 6 Bytes ab Adresse 0x02h (0x02h - 0x08h). Siehe dazu den Abschnitt [[#Speicheraufteilung|Speicheraufteilung]].&lt;br /&gt;
Um an die Daten zu kommen muessen 6 Byte von der Adresse des BMA020 gelesen werden:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039; Beschleunigungsdaten lesen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Adresse || Byte 1 || Byte 2 || Byte 3 || Byte 4 || Byte 5 || Byte 6&lt;br /&gt;
|-&lt;br /&gt;
| lesen || 0x71 || LSB_x || MSB_x || LSB_y || MSB_y || LSB_z || MSB_z&lt;br /&gt;
|}&lt;br /&gt;
==Berechnung==&lt;br /&gt;
===8 Bitwerte===&lt;br /&gt;
Sind die Beschleunigungswerte ausgelesen geht es nun an die Interpretation. Reicht eine Genauigkeit von 8 Bit so kann man nur den MSB-Teil der Werte nehmen.&lt;br /&gt;
Achtung: Es müssen dennoch die LSBs eingelesen werden, da die MSBs und LSBs solange blockiert bleiben bis beide eingelesen wurden.&lt;br /&gt;
Um dies zu verhindern muss das [[#Shadow disable|Shadow disable Bit]] gesetzt werden (15h, Bit 3; siehe [[#Speicheraufteilung|Speicheraufteilung]]).&lt;br /&gt;
&lt;br /&gt;
===10 Bitwerte===&lt;br /&gt;
Hat man die Werte ausgelesen gilt es diese zusammen zu fügen. Im folgenden Beispiel wird angenommen das die Werte in der variable &amp;lt;c&amp;gt;values[]&amp;lt;/c&amp;gt; liegen. Die Variable enthält die 6 Bytes für X, Y und Z.&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
uint values[6];&lt;br /&gt;
int x;&lt;br /&gt;
&lt;br /&gt;
//X MSB (02h) um zwei nach links schieben um Platz für die beiden unteren Bits zu schaffen.&lt;br /&gt;
x = values[0] &amp;lt;&amp;lt; 2;&lt;br /&gt;
&lt;br /&gt;
//X LSB (03h) um sechs nach rechts schieben um die zwei obersten Bits an den richtigen Platz das zusammenfügen zu bringen.&lt;br /&gt;
x = x | (values[1] &amp;gt;&amp;gt; 6);&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbiges muss für Y und Z getan werden.&lt;br /&gt;
&lt;br /&gt;
===Gravitationsvektor===&lt;br /&gt;
Der Gravitationsvektor ergibt sich aus:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec g = \begin{pmatrix} x \\ y \\ z \end{pmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
====Gravitation berechnen====&lt;br /&gt;
Die Gravitation ist gleich der Länge des Gravitationsvektors:&lt;br /&gt;
&amp;lt;math&amp;gt;g = \sqrt{x^2+y^2+z^2}&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>Muebau</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=BMA020&amp;diff=62932</id>
		<title>BMA020</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=BMA020&amp;diff=62932"/>
		<updated>2012-01-02T16:00:58Z</updated>

		<summary type="html">&lt;p&gt;Muebau: /* Berechnung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=BMA020=&lt;br /&gt;
==Bauteilseite==&lt;br /&gt;
[http://www.mikrocontroller.net/part/BMA020 Zur Bauteilseite des BMA020]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Bezugsquellen==&lt;br /&gt;
===ELV===&lt;br /&gt;
http://www.elv.de/3-Achsen-Beschleunigungssensor-3D-BS,-Komplettbausatz/x.aspx/cid_74/detail_10/detail2_28515&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Speicheraufteilung==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;BMA020 Speicher&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Adresse&lt;br /&gt;
! Bit 7&lt;br /&gt;
! Bit 6&lt;br /&gt;
! Bit 5&lt;br /&gt;
! Bit 4&lt;br /&gt;
! Bit 3&lt;br /&gt;
! Bit 2&lt;br /&gt;
! Bit 1&lt;br /&gt;
! Bit 0&lt;br /&gt;
! Typ&lt;br /&gt;
! Axis&lt;br /&gt;
|-&lt;br /&gt;
| 16h - 7Fh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| -&lt;br /&gt;
| reserved&lt;br /&gt;
|rowspan=&amp;quot;15&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| 15h&lt;br /&gt;
| SPI4E&amp;lt;br&amp;gt;(4 wire SPI enable)&amp;lt;br&amp;gt;(default: 1)&lt;br /&gt;
| EAI &amp;lt;br&amp;gt;(enable advanced interrupt)&lt;br /&gt;
| NDI &amp;lt;br&amp;gt;(new data interrupt)&lt;br /&gt;
| LI &amp;lt;br&amp;gt;(latch interrupt)&lt;br /&gt;
|[[#Shadow disable|SD&amp;lt;br&amp;gt;(shadow disable / read MSB only)]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| WUP &amp;lt;br&amp;gt;(wake up pause)&lt;br /&gt;
| WU &amp;lt;br&amp;gt;(wake up)&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 14h&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| - !!! -&amp;lt;br&amp;gt;(NEVER ever change this registers)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|[[#Range|range&amp;lt;br&amp;gt;(+/-2/4/8g)]]&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|[[#Bandwith|bandwith&amp;lt;br&amp;gt;(25...1500 Hz)]]&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 13h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot; rowspan=&amp;quot;2&amp;quot;| customer reserved&amp;lt;br&amp;gt;(can be used as memory)&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 12h&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 11h&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| AMD &amp;lt;br&amp;gt;(any motion duration)&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| HGH &amp;lt;br&amp;gt;(high gravitation hysteresis)&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| LGH &amp;lt;br&amp;gt;(low gravitation hysteresis)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 10h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| AMT &amp;lt;br&amp;gt;(any motion threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Fh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| HGD &amp;lt;br&amp;gt;(high gravitation duration)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Eh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| HGT  &amp;lt;br&amp;gt;(high gravitation threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Dh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| LGD &amp;lt;br&amp;gt;(low gravitation duration)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Ch&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| LGT &amp;lt;br&amp;gt;(high gravitation threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Bh&lt;br /&gt;
| alert&lt;br /&gt;
| AM &amp;lt;br&amp;gt;(any motion)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| HGC &amp;lt;br&amp;gt;(high gravitation counter)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| LGC &amp;lt;br&amp;gt;(low gravitation counter)&lt;br /&gt;
| HGE  &amp;lt;br&amp;gt;(high gravitation enable)&lt;br /&gt;
| LGE &amp;lt;br&amp;gt;(low gravitation enable)&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 0Ah&lt;br /&gt;
| -&lt;br /&gt;
| reset INT&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| self test 1&lt;br /&gt;
| self test 2&lt;br /&gt;
| soft reset&lt;br /&gt;
| sleep&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 09h&lt;br /&gt;
| STR &amp;lt;br&amp;gt;(self test result)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| -&lt;br /&gt;
| alert phase&lt;br /&gt;
| LG latched&lt;br /&gt;
| HG latched&lt;br /&gt;
| HGS &amp;lt;br&amp;gt;(high gravitation status)&lt;br /&gt;
| LGS &amp;lt;br&amp;gt;(low gravitation status)&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 08h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| -&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 07h&lt;br /&gt;
| Z [9]&lt;br /&gt;
| Z [8]&lt;br /&gt;
| Z [7]&lt;br /&gt;
| Z [6]&lt;br /&gt;
| Z [5]&lt;br /&gt;
| Z [4]&lt;br /&gt;
| Z [3]&lt;br /&gt;
| Z [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| Z&lt;br /&gt;
|-&lt;br /&gt;
| 06h&lt;br /&gt;
| Z [1]&lt;br /&gt;
| Z [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDZ &amp;lt;br&amp;gt;(new data Z)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 05h&lt;br /&gt;
| Y [9]&lt;br /&gt;
| Y [8]&lt;br /&gt;
| Y [7]&lt;br /&gt;
| Y [6]&lt;br /&gt;
| Y [5]&lt;br /&gt;
| Y [4]&lt;br /&gt;
| Y [3]&lt;br /&gt;
| Y [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| Y&lt;br /&gt;
|-&lt;br /&gt;
| 04h&lt;br /&gt;
| Y [1]&lt;br /&gt;
| Y [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDY &amp;lt;br&amp;gt;(new data Y)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 03h&lt;br /&gt;
| X [9]&lt;br /&gt;
| X [8]&lt;br /&gt;
| X [7]&lt;br /&gt;
| X [6]&lt;br /&gt;
| X [5]&lt;br /&gt;
| X [4]&lt;br /&gt;
| X [3]&lt;br /&gt;
| X [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| X&lt;br /&gt;
|-&lt;br /&gt;
| 02h&lt;br /&gt;
| X [1]&lt;br /&gt;
| X [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDX &amp;lt;br&amp;gt;(new data X)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 01h&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;| al version&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;| ml version&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| 00h&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| chip ID&lt;br /&gt;
| data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Register==&lt;br /&gt;
===Shadow disable===&lt;br /&gt;
Ist diese Bit gesetzt ist es möglich die MSBs der Beschleunigungswerte (03h, 05h, 07h) zu lesen ohne vorher die LSBs (02h, 04h, 06h) gelesen zu haben.&lt;br /&gt;
===Range===&lt;br /&gt;
Es sind 3 verschiedene Bereiche einstellbar:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;BMA020 Range&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;| 14h&lt;br /&gt;
! &lt;br /&gt;
|-&lt;br /&gt;
! Bit 4&lt;br /&gt;
! Bit 3&lt;br /&gt;
! Bereich&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| +/- 2g&amp;lt;br&amp;gt;(default)&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| +/- 4g&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| +/- 8g&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| -&lt;br /&gt;
|}&lt;br /&gt;
===Bandwith===&lt;br /&gt;
Folgende Aktualisierungsraten sind möglich:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;BMA020 Bandwith&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;| 14h&lt;br /&gt;
! &lt;br /&gt;
|-&lt;br /&gt;
! Bit 2&lt;br /&gt;
! Bit 1&lt;br /&gt;
! Bit 0&lt;br /&gt;
! Rate&lt;br /&gt;
! reale Rate&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 25 Hz&amp;lt;br&amp;gt;(default)&lt;br /&gt;
| 23 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 50 Hz&lt;br /&gt;
| 47 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 100 Hz&lt;br /&gt;
| 94 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 190 Hz&lt;br /&gt;
| 188 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 375 Hz&lt;br /&gt;
| 375 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 750 Hz&lt;br /&gt;
| 750 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1500 Hz&lt;br /&gt;
| 1500 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Konfiguration==&lt;br /&gt;
&lt;br /&gt;
==I2C==&lt;br /&gt;
===Adresse===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adresse&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Bit 7 || Bit 6 || Bit 5 || Bit 4 || Bit 3 || Bit 2 || Bit 1 || R/W &lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 1 || 1 || 0 || 0 || 0 || x&lt;br /&gt;
|}&lt;br /&gt;
====7 Bit Sichtweise====&lt;br /&gt;
Gemeint ist hierbei Bit 7 - 1.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adressen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Hexadezimal || Dezimal&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 56&lt;br /&gt;
|}&lt;br /&gt;
Zum lesen muss das 0. Bit gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
====8 Bit Sichtweise====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adressen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Hexadezimal || Dezimal&lt;br /&gt;
|-&lt;br /&gt;
| schreiben || 0x70 || 112&lt;br /&gt;
|-&lt;br /&gt;
| lesen || 0x71 || 113&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Beschleunigungsdaten lesen===&lt;br /&gt;
&lt;br /&gt;
Um Daten zu lesen muss erst der Offset gesendet werden ab dem Daten gelesen werden sollen. Die Beschleunigungsdaten liegen ab Adresse 0x02h.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Offset senden&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Adresse || Daten&lt;br /&gt;
|-&lt;br /&gt;
| schreiben || 0x70 || 0x02&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Beschleunigungsdaten sind pro Achse (X, Y, Z) 10 Bit lang. Diese liegen in 6 Bytes ab Adresse 0x02h (0x02h - 0x08h). Siehe dazu den Abschnitt [[#Speicheraufteilung|Speicheraufteilung]].&lt;br /&gt;
Um an die Daten zu kommen muessen 6 Byte von der Adresse des BMA020 gelesen werden:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039; Beschleunigungsdaten lesen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Adresse || Byte 1 || Byte 2 || Byte 3 || Byte 4 || Byte 5 || Byte 6&lt;br /&gt;
|-&lt;br /&gt;
| lesen || 0x71 || LSB_x || MSB_x || LSB_y || MSB_y || LSB_z || MSB_z&lt;br /&gt;
|}&lt;br /&gt;
==Berechnung==&lt;br /&gt;
===8 Bitwerte===&lt;br /&gt;
Sind die Beschleunigungswerte ausgelesen geht es nun an die Interpretation. Reicht eine Genauigkeit von 8 Bit so kann man nur den MSB-Teil der Werte nehmen.&lt;br /&gt;
Achtung: Es müssen dennoch die LSBs eingelesen werden, da die MSBs und LSBs solange blockiert bleiben bis beide eingelesen wurden.&lt;br /&gt;
Um dies zu verhindern muss das [[#Shadow disable|Shadow disable Bit]] gesetzt werden (15h, Bit 3; siehe [[#Speicherbelegung|Speicherbelegung]]).&lt;br /&gt;
===10 Bitwerte===&lt;br /&gt;
Hat man die Werte ausgelesen gilt es diese zusammen zu fügen. Im folgenden Beispiel wird angenommen das die Werte in der variable &amp;lt;c&amp;gt;values[]&amp;lt;/c&amp;gt; liegen. Die Variable enthält die 6 Bytes für X, Y und Z.&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
uint values[6];&lt;br /&gt;
int x;&lt;br /&gt;
&lt;br /&gt;
//X MSB (02h) um zwei nach links schieben um Platz für die beiden unteren Bits zu schaffen.&lt;br /&gt;
x = values[0] &amp;lt;&amp;lt; 2;&lt;br /&gt;
&lt;br /&gt;
//X LSB (03h) um sechs nach rechts schieben um die zwei obersten Bits an den richtigen Platz das zusammenfügen zu bringen.&lt;br /&gt;
x = x | (values[1] &amp;gt;&amp;gt; 6);&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbiges muss für Y und Z getan werden.&lt;br /&gt;
&lt;br /&gt;
===Gravitationsvektor===&lt;br /&gt;
Der Gravitationsvektor ergibt sich aus:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec g = \begin{pmatrix} x \\ y \\ z \end{pmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
====Gravitation berechnen====&lt;br /&gt;
Die Gravitation ist gleich der Länge des Gravitationsvektors:&lt;br /&gt;
&amp;lt;math&amp;gt;g = \sqrt{x^2+y^2+z^2}&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>Muebau</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=BMA020&amp;diff=62931</id>
		<title>BMA020</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=BMA020&amp;diff=62931"/>
		<updated>2012-01-02T15:57:31Z</updated>

		<summary type="html">&lt;p&gt;Muebau: /* Beschleunigungsdaten lesen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=BMA020=&lt;br /&gt;
==Bauteilseite==&lt;br /&gt;
[http://www.mikrocontroller.net/part/BMA020 Zur Bauteilseite des BMA020]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Bezugsquellen==&lt;br /&gt;
===ELV===&lt;br /&gt;
http://www.elv.de/3-Achsen-Beschleunigungssensor-3D-BS,-Komplettbausatz/x.aspx/cid_74/detail_10/detail2_28515&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Speicheraufteilung==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;BMA020 Speicher&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Adresse&lt;br /&gt;
! Bit 7&lt;br /&gt;
! Bit 6&lt;br /&gt;
! Bit 5&lt;br /&gt;
! Bit 4&lt;br /&gt;
! Bit 3&lt;br /&gt;
! Bit 2&lt;br /&gt;
! Bit 1&lt;br /&gt;
! Bit 0&lt;br /&gt;
! Typ&lt;br /&gt;
! Axis&lt;br /&gt;
|-&lt;br /&gt;
| 16h - 7Fh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| -&lt;br /&gt;
| reserved&lt;br /&gt;
|rowspan=&amp;quot;15&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| 15h&lt;br /&gt;
| SPI4E&amp;lt;br&amp;gt;(4 wire SPI enable)&amp;lt;br&amp;gt;(default: 1)&lt;br /&gt;
| EAI &amp;lt;br&amp;gt;(enable advanced interrupt)&lt;br /&gt;
| NDI &amp;lt;br&amp;gt;(new data interrupt)&lt;br /&gt;
| LI &amp;lt;br&amp;gt;(latch interrupt)&lt;br /&gt;
|[[#Shadow disable|SD&amp;lt;br&amp;gt;(shadow disable / read MSB only)]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| WUP &amp;lt;br&amp;gt;(wake up pause)&lt;br /&gt;
| WU &amp;lt;br&amp;gt;(wake up)&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 14h&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| - !!! -&amp;lt;br&amp;gt;(NEVER ever change this registers)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|[[#Range|range&amp;lt;br&amp;gt;(+/-2/4/8g)]]&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|[[#Bandwith|bandwith&amp;lt;br&amp;gt;(25...1500 Hz)]]&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 13h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot; rowspan=&amp;quot;2&amp;quot;| customer reserved&amp;lt;br&amp;gt;(can be used as memory)&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 12h&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 11h&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| AMD &amp;lt;br&amp;gt;(any motion duration)&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| HGH &amp;lt;br&amp;gt;(high gravitation hysteresis)&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| LGH &amp;lt;br&amp;gt;(low gravitation hysteresis)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 10h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| AMT &amp;lt;br&amp;gt;(any motion threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Fh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| HGD &amp;lt;br&amp;gt;(high gravitation duration)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Eh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| HGT  &amp;lt;br&amp;gt;(high gravitation threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Dh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| LGD &amp;lt;br&amp;gt;(low gravitation duration)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Ch&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| LGT &amp;lt;br&amp;gt;(high gravitation threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Bh&lt;br /&gt;
| alert&lt;br /&gt;
| AM &amp;lt;br&amp;gt;(any motion)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| HGC &amp;lt;br&amp;gt;(high gravitation counter)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| LGC &amp;lt;br&amp;gt;(low gravitation counter)&lt;br /&gt;
| HGE  &amp;lt;br&amp;gt;(high gravitation enable)&lt;br /&gt;
| LGE &amp;lt;br&amp;gt;(low gravitation enable)&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 0Ah&lt;br /&gt;
| -&lt;br /&gt;
| reset INT&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| self test 1&lt;br /&gt;
| self test 2&lt;br /&gt;
| soft reset&lt;br /&gt;
| sleep&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 09h&lt;br /&gt;
| STR &amp;lt;br&amp;gt;(self test result)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| -&lt;br /&gt;
| alert phase&lt;br /&gt;
| LG latched&lt;br /&gt;
| HG latched&lt;br /&gt;
| HGS &amp;lt;br&amp;gt;(high gravitation status)&lt;br /&gt;
| LGS &amp;lt;br&amp;gt;(low gravitation status)&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 08h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| -&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 07h&lt;br /&gt;
| Z [9]&lt;br /&gt;
| Z [8]&lt;br /&gt;
| Z [7]&lt;br /&gt;
| Z [6]&lt;br /&gt;
| Z [5]&lt;br /&gt;
| Z [4]&lt;br /&gt;
| Z [3]&lt;br /&gt;
| Z [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| Z&lt;br /&gt;
|-&lt;br /&gt;
| 06h&lt;br /&gt;
| Z [1]&lt;br /&gt;
| Z [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDZ &amp;lt;br&amp;gt;(new data Z)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 05h&lt;br /&gt;
| Y [9]&lt;br /&gt;
| Y [8]&lt;br /&gt;
| Y [7]&lt;br /&gt;
| Y [6]&lt;br /&gt;
| Y [5]&lt;br /&gt;
| Y [4]&lt;br /&gt;
| Y [3]&lt;br /&gt;
| Y [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| Y&lt;br /&gt;
|-&lt;br /&gt;
| 04h&lt;br /&gt;
| Y [1]&lt;br /&gt;
| Y [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDY &amp;lt;br&amp;gt;(new data Y)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 03h&lt;br /&gt;
| X [9]&lt;br /&gt;
| X [8]&lt;br /&gt;
| X [7]&lt;br /&gt;
| X [6]&lt;br /&gt;
| X [5]&lt;br /&gt;
| X [4]&lt;br /&gt;
| X [3]&lt;br /&gt;
| X [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| X&lt;br /&gt;
|-&lt;br /&gt;
| 02h&lt;br /&gt;
| X [1]&lt;br /&gt;
| X [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDX &amp;lt;br&amp;gt;(new data X)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 01h&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;| al version&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;| ml version&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| 00h&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| chip ID&lt;br /&gt;
| data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Register==&lt;br /&gt;
===Shadow disable===&lt;br /&gt;
Ist diese Bit gesetzt ist es möglich die MSBs der Beschleunigungswerte (03h, 05h, 07h) zu lesen ohne vorher die LSBs (02h, 04h, 06h) gelesen zu haben.&lt;br /&gt;
===Range===&lt;br /&gt;
Es sind 3 verschiedene Bereiche einstellbar:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;BMA020 Range&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;| 14h&lt;br /&gt;
! &lt;br /&gt;
|-&lt;br /&gt;
! Bit 4&lt;br /&gt;
! Bit 3&lt;br /&gt;
! Bereich&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| +/- 2g&amp;lt;br&amp;gt;(default)&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| +/- 4g&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| +/- 8g&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| -&lt;br /&gt;
|}&lt;br /&gt;
===Bandwith===&lt;br /&gt;
Folgende Aktualisierungsraten sind möglich:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;BMA020 Bandwith&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;| 14h&lt;br /&gt;
! &lt;br /&gt;
|-&lt;br /&gt;
! Bit 2&lt;br /&gt;
! Bit 1&lt;br /&gt;
! Bit 0&lt;br /&gt;
! Rate&lt;br /&gt;
! reale Rate&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 25 Hz&amp;lt;br&amp;gt;(default)&lt;br /&gt;
| 23 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 50 Hz&lt;br /&gt;
| 47 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 100 Hz&lt;br /&gt;
| 94 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 190 Hz&lt;br /&gt;
| 188 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 375 Hz&lt;br /&gt;
| 375 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 750 Hz&lt;br /&gt;
| 750 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1500 Hz&lt;br /&gt;
| 1500 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Konfiguration==&lt;br /&gt;
&lt;br /&gt;
==I2C==&lt;br /&gt;
===Adresse===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adresse&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Bit 7 || Bit 6 || Bit 5 || Bit 4 || Bit 3 || Bit 2 || Bit 1 || R/W &lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 1 || 1 || 0 || 0 || 0 || x&lt;br /&gt;
|}&lt;br /&gt;
====7 Bit Sichtweise====&lt;br /&gt;
Gemeint ist hierbei Bit 7 - 1.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adressen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Hexadezimal || Dezimal&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 56&lt;br /&gt;
|}&lt;br /&gt;
Zum lesen muss das 0. Bit gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
====8 Bit Sichtweise====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adressen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Hexadezimal || Dezimal&lt;br /&gt;
|-&lt;br /&gt;
| schreiben || 0x70 || 112&lt;br /&gt;
|-&lt;br /&gt;
| lesen || 0x71 || 113&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Beschleunigungsdaten lesen===&lt;br /&gt;
&lt;br /&gt;
Um Daten zu lesen muss erst der Offset gesendet werden ab dem Daten gelesen werden sollen. Die Beschleunigungsdaten liegen ab Adresse 0x02h.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Offset senden&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Adresse || Daten&lt;br /&gt;
|-&lt;br /&gt;
| schreiben || 0x70 || 0x02&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Beschleunigungsdaten sind pro Achse (X, Y, Z) 10 Bit lang. Diese liegen in 6 Bytes ab Adresse 0x02h (0x02h - 0x08h). Siehe dazu den Abschnitt [[#Speicheraufteilung|Speicheraufteilung]].&lt;br /&gt;
Um an die Daten zu kommen muessen 6 Byte von der Adresse des BMA020 gelesen werden:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039; Beschleunigungsdaten lesen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Adresse || Byte 1 || Byte 2 || Byte 3 || Byte 4 || Byte 5 || Byte 6&lt;br /&gt;
|-&lt;br /&gt;
| lesen || 0x71 || LSB_x || MSB_x || LSB_y || MSB_y || LSB_z || MSB_z&lt;br /&gt;
|}&lt;br /&gt;
==Berechnung==&lt;br /&gt;
===8 Bitwerte===&lt;br /&gt;
Sind die Beschleunigungswerte ausgelesen geht es nun an die Interpretation. Reicht eine Genauigkeit von 8 Bit so kann man nur den MSB-Teil der Werte nehmen.&lt;br /&gt;
Achtung: Es müssen dennoch die LSBs eingelesen werden, da die MSBs und LSBs solange blockiert bleiben bis beide eingelesen wurden.&lt;br /&gt;
Um dies zu verhindern muss das [[Shadow disable|Shadow disable Bit]] gesetzt werden (15h, Bit 3; siehe [[Speicherbelegung]]).&lt;br /&gt;
===10 Bitwerte===&lt;br /&gt;
Hat man die Werte ausgelesen gilt es diese zusammen zu fügen. Im folgenden Beispiel wird angenommen das die Werte in der variable [c]values[][/c] liegen. Die Variable enthält die 6 Bytes für X, Y und Z.&lt;br /&gt;
[c]&lt;br /&gt;
uint values[6];&lt;br /&gt;
int x;&lt;br /&gt;
&lt;br /&gt;
//X MSB (02h) um zwei nach links schieben um Platz für die beiden unteren Bits zu schaffen.&lt;br /&gt;
x = values[0] &amp;lt;&amp;lt; 2;&lt;br /&gt;
&lt;br /&gt;
//X LSB (03h) um sechs nach rechts schieben um die zwei obersten Bits an den richtigen Platz das zusammenfügen zu bringen.&lt;br /&gt;
x = x | (values[1] &amp;gt;&amp;gt; 6);&lt;br /&gt;
[/c]&lt;br /&gt;
&lt;br /&gt;
Selbiges muss für Y und Z getan werden.&lt;br /&gt;
&lt;br /&gt;
===Gravitationsvektor===&lt;br /&gt;
Der Gravitationsvektor ergibt sich aus:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec g = \begin{pmatrix} x \\ y \\ z \end{pmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
====Gravitation berechnen====&lt;br /&gt;
Die Gravitation ist gleich der Länge des Gravitationsvektors:&lt;br /&gt;
&amp;lt;math&amp;gt;g = \sqrt{x^2+y^2+z^2}&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>Muebau</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=BMA020&amp;diff=62929</id>
		<title>BMA020</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=BMA020&amp;diff=62929"/>
		<updated>2012-01-02T15:16:33Z</updated>

		<summary type="html">&lt;p&gt;Muebau: /* Speicheraufteilung */ add links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=BMA020=&lt;br /&gt;
==Bauteilseite==&lt;br /&gt;
[http://www.mikrocontroller.net/part/BMA020 Zur Bauteilseite des BMA020]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Bezugsquellen==&lt;br /&gt;
===ELV===&lt;br /&gt;
http://www.elv.de/3-Achsen-Beschleunigungssensor-3D-BS,-Komplettbausatz/x.aspx/cid_74/detail_10/detail2_28515&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Speicheraufteilung==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;BMA020 Speicher&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Adresse&lt;br /&gt;
! Bit 7&lt;br /&gt;
! Bit 6&lt;br /&gt;
! Bit 5&lt;br /&gt;
! Bit 4&lt;br /&gt;
! Bit 3&lt;br /&gt;
! Bit 2&lt;br /&gt;
! Bit 1&lt;br /&gt;
! Bit 0&lt;br /&gt;
! Typ&lt;br /&gt;
! Axis&lt;br /&gt;
|-&lt;br /&gt;
| 16h - 7Fh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| -&lt;br /&gt;
| reserved&lt;br /&gt;
|rowspan=&amp;quot;15&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| 15h&lt;br /&gt;
| SPI4E&amp;lt;br&amp;gt;(4 wire SPI enable)&amp;lt;br&amp;gt;(default: 1)&lt;br /&gt;
| EAI &amp;lt;br&amp;gt;(enable advanced interrupt)&lt;br /&gt;
| NDI &amp;lt;br&amp;gt;(new data interrupt)&lt;br /&gt;
| LI &amp;lt;br&amp;gt;(latch interrupt)&lt;br /&gt;
|[[#Shadow disable|SD&amp;lt;br&amp;gt;(shadow disable / read MSB only)]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| WUP &amp;lt;br&amp;gt;(wake up pause)&lt;br /&gt;
| WU &amp;lt;br&amp;gt;(wake up)&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 14h&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| - !!! -&amp;lt;br&amp;gt;(NEVER ever change this registers)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|[[#Range|range&amp;lt;br&amp;gt;(+/-2/4/8g)]]&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|[[#Bandwith|bandwith&amp;lt;br&amp;gt;(25...1500 Hz)]]&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 13h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot; rowspan=&amp;quot;2&amp;quot;| customer reserved&amp;lt;br&amp;gt;(can be used as memory)&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 12h&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 11h&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| AMD &amp;lt;br&amp;gt;(any motion duration)&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| HGH &amp;lt;br&amp;gt;(high gravitation hysteresis)&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| LGH &amp;lt;br&amp;gt;(low gravitation hysteresis)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 10h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| AMT &amp;lt;br&amp;gt;(any motion threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Fh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| HGD &amp;lt;br&amp;gt;(high gravitation duration)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Eh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| HGT  &amp;lt;br&amp;gt;(high gravitation threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Dh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| LGD &amp;lt;br&amp;gt;(low gravitation duration)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Ch&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| LGT &amp;lt;br&amp;gt;(high gravitation threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Bh&lt;br /&gt;
| alert&lt;br /&gt;
| AM &amp;lt;br&amp;gt;(any motion)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| HGC &amp;lt;br&amp;gt;(high gravitation counter)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| LGC &amp;lt;br&amp;gt;(low gravitation counter)&lt;br /&gt;
| HGE  &amp;lt;br&amp;gt;(high gravitation enable)&lt;br /&gt;
| LGE &amp;lt;br&amp;gt;(low gravitation enable)&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 0Ah&lt;br /&gt;
| -&lt;br /&gt;
| reset INT&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| self test 1&lt;br /&gt;
| self test 2&lt;br /&gt;
| soft reset&lt;br /&gt;
| sleep&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 09h&lt;br /&gt;
| STR &amp;lt;br&amp;gt;(self test result)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| -&lt;br /&gt;
| alert phase&lt;br /&gt;
| LG latched&lt;br /&gt;
| HG latched&lt;br /&gt;
| HGS &amp;lt;br&amp;gt;(high gravitation status)&lt;br /&gt;
| LGS &amp;lt;br&amp;gt;(low gravitation status)&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 08h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| -&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 07h&lt;br /&gt;
| Z [9]&lt;br /&gt;
| Z [8]&lt;br /&gt;
| Z [7]&lt;br /&gt;
| Z [6]&lt;br /&gt;
| Z [5]&lt;br /&gt;
| Z [4]&lt;br /&gt;
| Z [3]&lt;br /&gt;
| Z [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| Z&lt;br /&gt;
|-&lt;br /&gt;
| 06h&lt;br /&gt;
| Z [1]&lt;br /&gt;
| Z [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDZ &amp;lt;br&amp;gt;(new data Z)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 05h&lt;br /&gt;
| Y [9]&lt;br /&gt;
| Y [8]&lt;br /&gt;
| Y [7]&lt;br /&gt;
| Y [6]&lt;br /&gt;
| Y [5]&lt;br /&gt;
| Y [4]&lt;br /&gt;
| Y [3]&lt;br /&gt;
| Y [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| Y&lt;br /&gt;
|-&lt;br /&gt;
| 04h&lt;br /&gt;
| Y [1]&lt;br /&gt;
| Y [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDY &amp;lt;br&amp;gt;(new data Y)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 03h&lt;br /&gt;
| X [9]&lt;br /&gt;
| X [8]&lt;br /&gt;
| X [7]&lt;br /&gt;
| X [6]&lt;br /&gt;
| X [5]&lt;br /&gt;
| X [4]&lt;br /&gt;
| X [3]&lt;br /&gt;
| X [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| X&lt;br /&gt;
|-&lt;br /&gt;
| 02h&lt;br /&gt;
| X [1]&lt;br /&gt;
| X [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDX &amp;lt;br&amp;gt;(new data X)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 01h&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;| al version&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;| ml version&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| 00h&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| chip ID&lt;br /&gt;
| data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Register==&lt;br /&gt;
===Shadow disable===&lt;br /&gt;
Ist diese Bit gesetzt ist es möglich die MSBs der Beschleunigungswerte (03h, 05h, 07h) zu lesen ohne vorher die LSBs (02h, 04h, 06h) gelesen zu haben.&lt;br /&gt;
===Range===&lt;br /&gt;
Es sind 3 verschiedene Bereiche einstellbar:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;BMA020 Range&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;| 14h&lt;br /&gt;
! &lt;br /&gt;
|-&lt;br /&gt;
! Bit 4&lt;br /&gt;
! Bit 3&lt;br /&gt;
! Bereich&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| +/- 2g&amp;lt;br&amp;gt;(default)&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| +/- 4g&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| +/- 8g&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| -&lt;br /&gt;
|}&lt;br /&gt;
===Bandwith===&lt;br /&gt;
Folgende Aktualisierungsraten sind möglich:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;BMA020 Bandwith&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;| 14h&lt;br /&gt;
! &lt;br /&gt;
|-&lt;br /&gt;
! Bit 2&lt;br /&gt;
! Bit 1&lt;br /&gt;
! Bit 0&lt;br /&gt;
! Rate&lt;br /&gt;
! reale Rate&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 25 Hz&amp;lt;br&amp;gt;(default)&lt;br /&gt;
| 23 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 50 Hz&lt;br /&gt;
| 47 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 100 Hz&lt;br /&gt;
| 94 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 190 Hz&lt;br /&gt;
| 188 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 375 Hz&lt;br /&gt;
| 375 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 750 Hz&lt;br /&gt;
| 750 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1500 Hz&lt;br /&gt;
| 1500 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Konfiguration==&lt;br /&gt;
&lt;br /&gt;
==I2C==&lt;br /&gt;
===Adresse===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adresse&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Bit 7 || Bit 6 || Bit 5 || Bit 4 || Bit 3 || Bit 2 || Bit 1 || R/W &lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 1 || 1 || 0 || 0 || 0 || x&lt;br /&gt;
|}&lt;br /&gt;
====7 Bit Sichtweise====&lt;br /&gt;
Gemeint ist hierbei Bit 7 - 1.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adressen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Hexadezimal || Dezimal&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 56&lt;br /&gt;
|}&lt;br /&gt;
Zum lesen muss das 0. Bit gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
====8 Bit Sichtweise====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adressen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Hexadezimal || Dezimal&lt;br /&gt;
|-&lt;br /&gt;
| schreiben || 0x70 || 112&lt;br /&gt;
|-&lt;br /&gt;
| lesen || 0x71 || 113&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Beschleunigungsdaten lesen===&lt;br /&gt;
&lt;br /&gt;
Um Daten zu lesen muss erst der Offset gesendet werden ab dem Daten gelesen werden sollen. Die Beschleunigungsdaten liegen ab Adresse 0x02h.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Offset senden&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Adresse || Daten&lt;br /&gt;
|-&lt;br /&gt;
| schreiben || 0x70 || 0x02&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Beschleunigungsdaten sind pro Achse (X, Y, Z) 10 Bit lang. Diese liegen in 6 Bytes ab Adresse 0x02h (0x02h - 0x08h). Siehe dazu den Abschnitt [[#Speicheraufteilung|Speicheraufteilung]].&lt;br /&gt;
Um an die Daten zu kommen muessen 6 Byte von der Adresse des BMA020 gelesen werden:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039; Beschleunigungsdaten lesen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Adresse || Byte 1 || Byte 2 || Byte 3 || Byte 4 || Byte 5 || Byte 6&lt;br /&gt;
|-&lt;br /&gt;
| lesen || 0x71 || LSB_x || MSB_x || LSB_y || MSB_y || LSB_z || MSB_z&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Muebau</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=BMA020&amp;diff=62928</id>
		<title>BMA020</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=BMA020&amp;diff=62928"/>
		<updated>2012-01-02T15:12:53Z</updated>

		<summary type="html">&lt;p&gt;Muebau: /* Register */  add &amp;#039;shadow disable&amp;#039; and &amp;#039;bandwith&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=BMA020=&lt;br /&gt;
==Bauteilseite==&lt;br /&gt;
[http://www.mikrocontroller.net/part/BMA020 Zur Bauteilseite des BMA020]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Bezugsquellen==&lt;br /&gt;
===ELV===&lt;br /&gt;
http://www.elv.de/3-Achsen-Beschleunigungssensor-3D-BS,-Komplettbausatz/x.aspx/cid_74/detail_10/detail2_28515&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Speicheraufteilung==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;BMA020 Speicher&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Adresse&lt;br /&gt;
! Bit 7&lt;br /&gt;
! Bit 6&lt;br /&gt;
! Bit 5&lt;br /&gt;
! Bit 4&lt;br /&gt;
! Bit 3&lt;br /&gt;
! Bit 2&lt;br /&gt;
! Bit 1&lt;br /&gt;
! Bit 0&lt;br /&gt;
! Typ&lt;br /&gt;
! Axis&lt;br /&gt;
|-&lt;br /&gt;
| 16h - 7Fh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| -&lt;br /&gt;
| reserved&lt;br /&gt;
|rowspan=&amp;quot;15&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| 15h&lt;br /&gt;
| SPI4E&amp;lt;br&amp;gt;(4 wire SPI enable)&amp;lt;br&amp;gt;(default: 1)&lt;br /&gt;
| EAI &amp;lt;br&amp;gt;(enable advanced interrupt)&lt;br /&gt;
| NDI &amp;lt;br&amp;gt;(new data interrupt)&lt;br /&gt;
| LI &amp;lt;br&amp;gt;(latch interrupt)&lt;br /&gt;
| SD &amp;lt;br&amp;gt;(shadow disable / read MSB only)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| WUP &amp;lt;br&amp;gt;(wake up pause)&lt;br /&gt;
| WU &amp;lt;br&amp;gt;(wake up)&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 14h&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| - !!! -&amp;lt;br&amp;gt;(NEVER ever change this registers)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|[[#Range|range &amp;lt;br&amp;gt;(+/-2/4/8g)]]&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| bandwith &amp;lt;br&amp;gt;(25...1500 Hz)&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 13h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot; rowspan=&amp;quot;2&amp;quot;| customer reserved &amp;lt;br&amp;gt;(can be used as memory)&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 12h&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 11h&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| AMD &amp;lt;br&amp;gt;(any motion duration)&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| HGH &amp;lt;br&amp;gt;(high gravitation hysteresis)&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| LGH &amp;lt;br&amp;gt;(low gravitation hysteresis)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 10h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| AMT &amp;lt;br&amp;gt;(any motion threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Fh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| HGD &amp;lt;br&amp;gt;(high gravitation duration)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Eh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| HGT  &amp;lt;br&amp;gt;(high gravitation threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Dh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| LGD &amp;lt;br&amp;gt;(low gravitation duration)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Ch&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| LGT &amp;lt;br&amp;gt;(high gravitation threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Bh&lt;br /&gt;
| alert&lt;br /&gt;
| AM &amp;lt;br&amp;gt;(any motion)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| HGC &amp;lt;br&amp;gt;(high gravitation counter)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| LGC &amp;lt;br&amp;gt;(low gravitation counter)&lt;br /&gt;
| HGE  &amp;lt;br&amp;gt;(high gravitation enable)&lt;br /&gt;
| LGE &amp;lt;br&amp;gt;(low gravitation enable)&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 0Ah&lt;br /&gt;
| -&lt;br /&gt;
| reset INT&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| self test 1&lt;br /&gt;
| self test 2&lt;br /&gt;
| soft reset&lt;br /&gt;
| sleep&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 09h&lt;br /&gt;
| STR &amp;lt;br&amp;gt;(self test result)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| -&lt;br /&gt;
| alert phase&lt;br /&gt;
| LG latched&lt;br /&gt;
| HG latched&lt;br /&gt;
| HGS &amp;lt;br&amp;gt;(high gravitation status)&lt;br /&gt;
| LGS &amp;lt;br&amp;gt;(low gravitation status)&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 08h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| -&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 07h&lt;br /&gt;
| Z [9]&lt;br /&gt;
| Z [8]&lt;br /&gt;
| Z [7]&lt;br /&gt;
| Z [6]&lt;br /&gt;
| Z [5]&lt;br /&gt;
| Z [4]&lt;br /&gt;
| Z [3]&lt;br /&gt;
| Z [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| Z&lt;br /&gt;
|-&lt;br /&gt;
| 06h&lt;br /&gt;
| Z [1]&lt;br /&gt;
| Z [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDZ &amp;lt;br&amp;gt;(new data Z)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 05h&lt;br /&gt;
| Y [9]&lt;br /&gt;
| Y [8]&lt;br /&gt;
| Y [7]&lt;br /&gt;
| Y [6]&lt;br /&gt;
| Y [5]&lt;br /&gt;
| Y [4]&lt;br /&gt;
| Y [3]&lt;br /&gt;
| Y [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| Y&lt;br /&gt;
|-&lt;br /&gt;
| 04h&lt;br /&gt;
| Y [1]&lt;br /&gt;
| Y [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDY &amp;lt;br&amp;gt;(new data Y)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 03h&lt;br /&gt;
| X [9]&lt;br /&gt;
| X [8]&lt;br /&gt;
| X [7]&lt;br /&gt;
| X [6]&lt;br /&gt;
| X [5]&lt;br /&gt;
| X [4]&lt;br /&gt;
| X [3]&lt;br /&gt;
| X [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| X&lt;br /&gt;
|-&lt;br /&gt;
| 02h&lt;br /&gt;
| X [1]&lt;br /&gt;
| X [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDX &amp;lt;br&amp;gt;(new data X)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 01h&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;| al version&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;| ml version&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| 00h&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| chip ID&lt;br /&gt;
| data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Register==&lt;br /&gt;
===Shadow disable===&lt;br /&gt;
Ist diese Bit gesetzt ist es möglich die MSBs der Beschleunigungswerte (03h, 05h, 07h) zu lesen ohne vorher die LSBs (02h, 04h, 06h) gelesen zu haben.&lt;br /&gt;
===Range===&lt;br /&gt;
Es sind 3 verschiedene Bereiche einstellbar:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;BMA020 Range&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;| 14h&lt;br /&gt;
! &lt;br /&gt;
|-&lt;br /&gt;
! Bit 4&lt;br /&gt;
! Bit 3&lt;br /&gt;
! Bereich&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| +/- 2g&amp;lt;br&amp;gt;(default)&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| +/- 4g&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| +/- 8g&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| -&lt;br /&gt;
|}&lt;br /&gt;
===Bandwith===&lt;br /&gt;
Folgende Aktualisierungsraten sind möglich:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;BMA020 Bandwith&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;| 14h&lt;br /&gt;
! &lt;br /&gt;
|-&lt;br /&gt;
! Bit 2&lt;br /&gt;
! Bit 1&lt;br /&gt;
! Bit 0&lt;br /&gt;
! Rate&lt;br /&gt;
! reale Rate&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 25 Hz&amp;lt;br&amp;gt;(default)&lt;br /&gt;
| 23 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 50 Hz&lt;br /&gt;
| 47 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 100 Hz&lt;br /&gt;
| 94 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 190 Hz&lt;br /&gt;
| 188 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 375 Hz&lt;br /&gt;
| 375 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 750 Hz&lt;br /&gt;
| 750 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1500 Hz&lt;br /&gt;
| 1500 Hz&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Konfiguration==&lt;br /&gt;
&lt;br /&gt;
==I2C==&lt;br /&gt;
===Adresse===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adresse&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Bit 7 || Bit 6 || Bit 5 || Bit 4 || Bit 3 || Bit 2 || Bit 1 || R/W &lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 1 || 1 || 0 || 0 || 0 || x&lt;br /&gt;
|}&lt;br /&gt;
====7 Bit Sichtweise====&lt;br /&gt;
Gemeint ist hierbei Bit 7 - 1.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adressen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Hexadezimal || Dezimal&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 56&lt;br /&gt;
|}&lt;br /&gt;
Zum lesen muss das 0. Bit gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
====8 Bit Sichtweise====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adressen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Hexadezimal || Dezimal&lt;br /&gt;
|-&lt;br /&gt;
| schreiben || 0x70 || 112&lt;br /&gt;
|-&lt;br /&gt;
| lesen || 0x71 || 113&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Beschleunigungsdaten lesen===&lt;br /&gt;
&lt;br /&gt;
Um Daten zu lesen muss erst der Offset gesendet werden ab dem Daten gelesen werden sollen. Die Beschleunigungsdaten liegen ab Adresse 0x02h.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Offset senden&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Adresse || Daten&lt;br /&gt;
|-&lt;br /&gt;
| schreiben || 0x70 || 0x02&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Beschleunigungsdaten sind pro Achse (X, Y, Z) 10 Bit lang. Diese liegen in 6 Bytes ab Adresse 0x02h (0x02h - 0x08h). Siehe dazu den Abschnitt [[#Speicheraufteilung|Speicheraufteilung]].&lt;br /&gt;
Um an die Daten zu kommen muessen 6 Byte von der Adresse des BMA020 gelesen werden:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039; Beschleunigungsdaten lesen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Adresse || Byte 1 || Byte 2 || Byte 3 || Byte 4 || Byte 5 || Byte 6&lt;br /&gt;
|-&lt;br /&gt;
| lesen || 0x71 || LSB_x || MSB_x || LSB_y || MSB_y || LSB_z || MSB_z&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Muebau</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=BMA020&amp;diff=62927</id>
		<title>BMA020</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=BMA020&amp;diff=62927"/>
		<updated>2012-01-02T14:45:45Z</updated>

		<summary type="html">&lt;p&gt;Muebau: /* Speicheraufteilung */ add link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=BMA020=&lt;br /&gt;
==Bauteilseite==&lt;br /&gt;
[http://www.mikrocontroller.net/part/BMA020 Zur Bauteilseite des BMA020]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Bezugsquellen==&lt;br /&gt;
===ELV===&lt;br /&gt;
http://www.elv.de/3-Achsen-Beschleunigungssensor-3D-BS,-Komplettbausatz/x.aspx/cid_74/detail_10/detail2_28515&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Speicheraufteilung==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;BMA020 Speicher&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Adresse&lt;br /&gt;
! Bit 7&lt;br /&gt;
! Bit 6&lt;br /&gt;
! Bit 5&lt;br /&gt;
! Bit 4&lt;br /&gt;
! Bit 3&lt;br /&gt;
! Bit 2&lt;br /&gt;
! Bit 1&lt;br /&gt;
! Bit 0&lt;br /&gt;
! Typ&lt;br /&gt;
! Axis&lt;br /&gt;
|-&lt;br /&gt;
| 16h - 7Fh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| -&lt;br /&gt;
| reserved&lt;br /&gt;
|rowspan=&amp;quot;15&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| 15h&lt;br /&gt;
| SPI4E&amp;lt;br&amp;gt;(4 wire SPI enable)&amp;lt;br&amp;gt;(default: 1)&lt;br /&gt;
| EAI &amp;lt;br&amp;gt;(enable advanced interrupt)&lt;br /&gt;
| NDI &amp;lt;br&amp;gt;(new data interrupt)&lt;br /&gt;
| LI &amp;lt;br&amp;gt;(latch interrupt)&lt;br /&gt;
| SD &amp;lt;br&amp;gt;(shadow disable / read MSB only)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| WUP &amp;lt;br&amp;gt;(wake up pause)&lt;br /&gt;
| WU &amp;lt;br&amp;gt;(wake up)&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 14h&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| - !!! -&amp;lt;br&amp;gt;(NEVER ever change this registers)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|[[#Range|range &amp;lt;br&amp;gt;(+/-2/4/8g)]]&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| bandwith &amp;lt;br&amp;gt;(25...1500 Hz)&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 13h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot; rowspan=&amp;quot;2&amp;quot;| customer reserved &amp;lt;br&amp;gt;(can be used as memory)&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 12h&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 11h&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| AMD &amp;lt;br&amp;gt;(any motion duration)&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| HGH &amp;lt;br&amp;gt;(high gravitation hysteresis)&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| LGH &amp;lt;br&amp;gt;(low gravitation hysteresis)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 10h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| AMT &amp;lt;br&amp;gt;(any motion threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Fh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| HGD &amp;lt;br&amp;gt;(high gravitation duration)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Eh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| HGT  &amp;lt;br&amp;gt;(high gravitation threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Dh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| LGD &amp;lt;br&amp;gt;(low gravitation duration)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Ch&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| LGT &amp;lt;br&amp;gt;(high gravitation threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Bh&lt;br /&gt;
| alert&lt;br /&gt;
| AM &amp;lt;br&amp;gt;(any motion)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| HGC &amp;lt;br&amp;gt;(high gravitation counter)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| LGC &amp;lt;br&amp;gt;(low gravitation counter)&lt;br /&gt;
| HGE  &amp;lt;br&amp;gt;(high gravitation enable)&lt;br /&gt;
| LGE &amp;lt;br&amp;gt;(low gravitation enable)&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 0Ah&lt;br /&gt;
| -&lt;br /&gt;
| reset INT&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| self test 1&lt;br /&gt;
| self test 2&lt;br /&gt;
| soft reset&lt;br /&gt;
| sleep&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 09h&lt;br /&gt;
| STR &amp;lt;br&amp;gt;(self test result)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| -&lt;br /&gt;
| alert phase&lt;br /&gt;
| LG latched&lt;br /&gt;
| HG latched&lt;br /&gt;
| HGS &amp;lt;br&amp;gt;(high gravitation status)&lt;br /&gt;
| LGS &amp;lt;br&amp;gt;(low gravitation status)&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 08h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| -&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 07h&lt;br /&gt;
| Z [9]&lt;br /&gt;
| Z [8]&lt;br /&gt;
| Z [7]&lt;br /&gt;
| Z [6]&lt;br /&gt;
| Z [5]&lt;br /&gt;
| Z [4]&lt;br /&gt;
| Z [3]&lt;br /&gt;
| Z [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| Z&lt;br /&gt;
|-&lt;br /&gt;
| 06h&lt;br /&gt;
| Z [1]&lt;br /&gt;
| Z [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDZ &amp;lt;br&amp;gt;(new data Z)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 05h&lt;br /&gt;
| Y [9]&lt;br /&gt;
| Y [8]&lt;br /&gt;
| Y [7]&lt;br /&gt;
| Y [6]&lt;br /&gt;
| Y [5]&lt;br /&gt;
| Y [4]&lt;br /&gt;
| Y [3]&lt;br /&gt;
| Y [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| Y&lt;br /&gt;
|-&lt;br /&gt;
| 04h&lt;br /&gt;
| Y [1]&lt;br /&gt;
| Y [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDY &amp;lt;br&amp;gt;(new data Y)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 03h&lt;br /&gt;
| X [9]&lt;br /&gt;
| X [8]&lt;br /&gt;
| X [7]&lt;br /&gt;
| X [6]&lt;br /&gt;
| X [5]&lt;br /&gt;
| X [4]&lt;br /&gt;
| X [3]&lt;br /&gt;
| X [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| X&lt;br /&gt;
|-&lt;br /&gt;
| 02h&lt;br /&gt;
| X [1]&lt;br /&gt;
| X [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDX &amp;lt;br&amp;gt;(new data X)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 01h&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;| al version&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;| ml version&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| 00h&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| chip ID&lt;br /&gt;
| data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Register==&lt;br /&gt;
===Range===&lt;br /&gt;
Es sind 3 verschiedene Bereiche einstellbar:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;BMA020 Range&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;| 14h&lt;br /&gt;
! &lt;br /&gt;
|-&lt;br /&gt;
! Bit 4&lt;br /&gt;
! Bit 3&lt;br /&gt;
! Bereich&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| +/- 2g&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| +/- 4g&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| +/- 8g&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Konfiguration==&lt;br /&gt;
&lt;br /&gt;
==I2C==&lt;br /&gt;
===Adresse===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adresse&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Bit 7 || Bit 6 || Bit 5 || Bit 4 || Bit 3 || Bit 2 || Bit 1 || R/W &lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 1 || 1 || 0 || 0 || 0 || x&lt;br /&gt;
|}&lt;br /&gt;
====7 Bit Sichtweise====&lt;br /&gt;
Gemeint ist hierbei Bit 7 - 1.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adressen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Hexadezimal || Dezimal&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 56&lt;br /&gt;
|}&lt;br /&gt;
Zum lesen muss das 0. Bit gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
====8 Bit Sichtweise====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adressen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Hexadezimal || Dezimal&lt;br /&gt;
|-&lt;br /&gt;
| schreiben || 0x70 || 112&lt;br /&gt;
|-&lt;br /&gt;
| lesen || 0x71 || 113&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Beschleunigungsdaten lesen===&lt;br /&gt;
&lt;br /&gt;
Um Daten zu lesen muss erst der Offset gesendet werden ab dem Daten gelesen werden sollen. Die Beschleunigungsdaten liegen ab Adresse 0x02h.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Offset senden&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Adresse || Daten&lt;br /&gt;
|-&lt;br /&gt;
| schreiben || 0x70 || 0x02&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Beschleunigungsdaten sind pro Achse (X, Y, Z) 10 Bit lang. Diese liegen in 6 Bytes ab Adresse 0x02h (0x02h - 0x08h). Siehe dazu den Abschnitt [[#Speicheraufteilung|Speicheraufteilung]].&lt;br /&gt;
Um an die Daten zu kommen muessen 6 Byte von der Adresse des BMA020 gelesen werden:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039; Beschleunigungsdaten lesen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Adresse || Byte 1 || Byte 2 || Byte 3 || Byte 4 || Byte 5 || Byte 6&lt;br /&gt;
|-&lt;br /&gt;
| lesen || 0x71 || LSB_x || MSB_x || LSB_y || MSB_y || LSB_z || MSB_z&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Muebau</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=BMA020&amp;diff=62926</id>
		<title>BMA020</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=BMA020&amp;diff=62926"/>
		<updated>2012-01-02T14:43:18Z</updated>

		<summary type="html">&lt;p&gt;Muebau: /* Register */  add range&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=BMA020=&lt;br /&gt;
==Bauteilseite==&lt;br /&gt;
[http://www.mikrocontroller.net/part/BMA020 Zur Bauteilseite des BMA020]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Bezugsquellen==&lt;br /&gt;
===ELV===&lt;br /&gt;
http://www.elv.de/3-Achsen-Beschleunigungssensor-3D-BS,-Komplettbausatz/x.aspx/cid_74/detail_10/detail2_28515&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Speicheraufteilung==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;BMA020 Speicher&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Adresse&lt;br /&gt;
! Bit 7&lt;br /&gt;
! Bit 6&lt;br /&gt;
! Bit 5&lt;br /&gt;
! Bit 4&lt;br /&gt;
! Bit 3&lt;br /&gt;
! Bit 2&lt;br /&gt;
! Bit 1&lt;br /&gt;
! Bit 0&lt;br /&gt;
! Typ&lt;br /&gt;
! Axis&lt;br /&gt;
|-&lt;br /&gt;
| 16h - 7Fh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| -&lt;br /&gt;
| reserved&lt;br /&gt;
|rowspan=&amp;quot;15&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| 15h&lt;br /&gt;
| SPI4E&amp;lt;br&amp;gt;(4 wire SPI enable)&amp;lt;br&amp;gt;(default: 1)&lt;br /&gt;
| EAI &amp;lt;br&amp;gt;(enable advanced interrupt)&lt;br /&gt;
| NDI &amp;lt;br&amp;gt;(new data interrupt)&lt;br /&gt;
| LI &amp;lt;br&amp;gt;(latch interrupt)&lt;br /&gt;
| SD &amp;lt;br&amp;gt;(shadow disable / read MSB only)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| WUP &amp;lt;br&amp;gt;(wake up pause)&lt;br /&gt;
| WU &amp;lt;br&amp;gt;(wake up)&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 14h&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| - !!! -&amp;lt;br&amp;gt;(NEVER ever change this registers)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| range &amp;lt;br&amp;gt;(+/-2/4/8g)&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| bandwith &amp;lt;br&amp;gt;(25...1500 Hz)&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 13h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot; rowspan=&amp;quot;2&amp;quot;| customer reserved &amp;lt;br&amp;gt;(can be used as memory)&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 12h&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 11h&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| AMD &amp;lt;br&amp;gt;(any motion duration)&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| HGH &amp;lt;br&amp;gt;(high gravitation hysteresis)&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| LGH &amp;lt;br&amp;gt;(low gravitation hysteresis)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 10h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| AMT &amp;lt;br&amp;gt;(any motion threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Fh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| HGD &amp;lt;br&amp;gt;(high gravitation duration)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Eh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| HGT  &amp;lt;br&amp;gt;(high gravitation threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Dh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| LGD &amp;lt;br&amp;gt;(low gravitation duration)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Ch&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| LGT &amp;lt;br&amp;gt;(high gravitation threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Bh&lt;br /&gt;
| alert&lt;br /&gt;
| AM &amp;lt;br&amp;gt;(any motion)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| HGC &amp;lt;br&amp;gt;(high gravitation counter)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| LGC &amp;lt;br&amp;gt;(low gravitation counter)&lt;br /&gt;
| HGE  &amp;lt;br&amp;gt;(high gravitation enable)&lt;br /&gt;
| LGE &amp;lt;br&amp;gt;(low gravitation enable)&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 0Ah&lt;br /&gt;
| -&lt;br /&gt;
| reset INT&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| self test 1&lt;br /&gt;
| self test 2&lt;br /&gt;
| soft reset&lt;br /&gt;
| sleep&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 09h&lt;br /&gt;
| STR &amp;lt;br&amp;gt;(self test result)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| -&lt;br /&gt;
| alert phase&lt;br /&gt;
| LG latched&lt;br /&gt;
| HG latched&lt;br /&gt;
| HGS &amp;lt;br&amp;gt;(high gravitation status)&lt;br /&gt;
| LGS &amp;lt;br&amp;gt;(low gravitation status)&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 08h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| -&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 07h&lt;br /&gt;
| Z [9]&lt;br /&gt;
| Z [8]&lt;br /&gt;
| Z [7]&lt;br /&gt;
| Z [6]&lt;br /&gt;
| Z [5]&lt;br /&gt;
| Z [4]&lt;br /&gt;
| Z [3]&lt;br /&gt;
| Z [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| Z&lt;br /&gt;
|-&lt;br /&gt;
| 06h&lt;br /&gt;
| Z [1]&lt;br /&gt;
| Z [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDZ &amp;lt;br&amp;gt;(new data Z)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 05h&lt;br /&gt;
| Y [9]&lt;br /&gt;
| Y [8]&lt;br /&gt;
| Y [7]&lt;br /&gt;
| Y [6]&lt;br /&gt;
| Y [5]&lt;br /&gt;
| Y [4]&lt;br /&gt;
| Y [3]&lt;br /&gt;
| Y [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| Y&lt;br /&gt;
|-&lt;br /&gt;
| 04h&lt;br /&gt;
| Y [1]&lt;br /&gt;
| Y [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDY &amp;lt;br&amp;gt;(new data Y)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 03h&lt;br /&gt;
| X [9]&lt;br /&gt;
| X [8]&lt;br /&gt;
| X [7]&lt;br /&gt;
| X [6]&lt;br /&gt;
| X [5]&lt;br /&gt;
| X [4]&lt;br /&gt;
| X [3]&lt;br /&gt;
| X [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| X&lt;br /&gt;
|-&lt;br /&gt;
| 02h&lt;br /&gt;
| X [1]&lt;br /&gt;
| X [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDX &amp;lt;br&amp;gt;(new data X)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 01h&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;| al version&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;| ml version&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| 00h&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| chip ID&lt;br /&gt;
| data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Register==&lt;br /&gt;
===Range===&lt;br /&gt;
Es sind 3 verschiedene Bereiche einstellbar:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;BMA020 Range&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;| 14h&lt;br /&gt;
! &lt;br /&gt;
|-&lt;br /&gt;
! Bit 4&lt;br /&gt;
! Bit 3&lt;br /&gt;
! Bereich&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| +/- 2g&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| +/- 4g&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| +/- 8g&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Konfiguration==&lt;br /&gt;
&lt;br /&gt;
==I2C==&lt;br /&gt;
===Adresse===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adresse&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Bit 7 || Bit 6 || Bit 5 || Bit 4 || Bit 3 || Bit 2 || Bit 1 || R/W &lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 1 || 1 || 0 || 0 || 0 || x&lt;br /&gt;
|}&lt;br /&gt;
====7 Bit Sichtweise====&lt;br /&gt;
Gemeint ist hierbei Bit 7 - 1.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adressen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Hexadezimal || Dezimal&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 56&lt;br /&gt;
|}&lt;br /&gt;
Zum lesen muss das 0. Bit gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
====8 Bit Sichtweise====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adressen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Hexadezimal || Dezimal&lt;br /&gt;
|-&lt;br /&gt;
| schreiben || 0x70 || 112&lt;br /&gt;
|-&lt;br /&gt;
| lesen || 0x71 || 113&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Beschleunigungsdaten lesen===&lt;br /&gt;
&lt;br /&gt;
Um Daten zu lesen muss erst der Offset gesendet werden ab dem Daten gelesen werden sollen. Die Beschleunigungsdaten liegen ab Adresse 0x02h.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Offset senden&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Adresse || Daten&lt;br /&gt;
|-&lt;br /&gt;
| schreiben || 0x70 || 0x02&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Beschleunigungsdaten sind pro Achse (X, Y, Z) 10 Bit lang. Diese liegen in 6 Bytes ab Adresse 0x02h (0x02h - 0x08h). Siehe dazu den Abschnitt [[#Speicheraufteilung|Speicheraufteilung]].&lt;br /&gt;
Um an die Daten zu kommen muessen 6 Byte von der Adresse des BMA020 gelesen werden:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039; Beschleunigungsdaten lesen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Adresse || Byte 1 || Byte 2 || Byte 3 || Byte 4 || Byte 5 || Byte 6&lt;br /&gt;
|-&lt;br /&gt;
| lesen || 0x71 || LSB_x || MSB_x || LSB_y || MSB_y || LSB_z || MSB_z&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Muebau</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=BMA020&amp;diff=62924</id>
		<title>BMA020</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=BMA020&amp;diff=62924"/>
		<updated>2012-01-02T14:34:11Z</updated>

		<summary type="html">&lt;p&gt;Muebau: /* Speicheraufteilung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=BMA020=&lt;br /&gt;
==Bauteilseite==&lt;br /&gt;
[http://www.mikrocontroller.net/part/BMA020 Zur Bauteilseite des BMA020]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Bezugsquellen==&lt;br /&gt;
===ELV===&lt;br /&gt;
http://www.elv.de/3-Achsen-Beschleunigungssensor-3D-BS,-Komplettbausatz/x.aspx/cid_74/detail_10/detail2_28515&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Speicheraufteilung==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;BMA020 Speicher&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Adresse&lt;br /&gt;
! Bit 7&lt;br /&gt;
! Bit 6&lt;br /&gt;
! Bit 5&lt;br /&gt;
! Bit 4&lt;br /&gt;
! Bit 3&lt;br /&gt;
! Bit 2&lt;br /&gt;
! Bit 1&lt;br /&gt;
! Bit 0&lt;br /&gt;
! Typ&lt;br /&gt;
! Axis&lt;br /&gt;
|-&lt;br /&gt;
| 16h - 7Fh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| -&lt;br /&gt;
| reserved&lt;br /&gt;
|rowspan=&amp;quot;15&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| 15h&lt;br /&gt;
| SPI4E&amp;lt;br&amp;gt;(4 wire SPI enable)&amp;lt;br&amp;gt;(default: 1)&lt;br /&gt;
| EAI &amp;lt;br&amp;gt;(enable advanced interrupt)&lt;br /&gt;
| NDI &amp;lt;br&amp;gt;(new data interrupt)&lt;br /&gt;
| LI &amp;lt;br&amp;gt;(latch interrupt)&lt;br /&gt;
| SD &amp;lt;br&amp;gt;(shadow disable / read MSB only)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| WUP &amp;lt;br&amp;gt;(wake up pause)&lt;br /&gt;
| WU &amp;lt;br&amp;gt;(wake up)&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 14h&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| - !!! -&amp;lt;br&amp;gt;(NEVER ever change this registers)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| range &amp;lt;br&amp;gt;(+/-2/4/8g)&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| bandwith &amp;lt;br&amp;gt;(25...1500 Hz)&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 13h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot; rowspan=&amp;quot;2&amp;quot;| customer reserved &amp;lt;br&amp;gt;(can be used as memory)&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 12h&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 11h&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| AMD &amp;lt;br&amp;gt;(any motion duration)&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| HGH &amp;lt;br&amp;gt;(high gravitation hysteresis)&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| LGH &amp;lt;br&amp;gt;(low gravitation hysteresis)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 10h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| AMT &amp;lt;br&amp;gt;(any motion threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Fh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| HGD &amp;lt;br&amp;gt;(high gravitation duration)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Eh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| HGT  &amp;lt;br&amp;gt;(high gravitation threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Dh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| LGD &amp;lt;br&amp;gt;(low gravitation duration)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Ch&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| LGT &amp;lt;br&amp;gt;(high gravitation threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Bh&lt;br /&gt;
| alert&lt;br /&gt;
| AM &amp;lt;br&amp;gt;(any motion)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| HGC &amp;lt;br&amp;gt;(high gravitation counter)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| LGC &amp;lt;br&amp;gt;(low gravitation counter)&lt;br /&gt;
| HGE  &amp;lt;br&amp;gt;(high gravitation enable)&lt;br /&gt;
| LGE &amp;lt;br&amp;gt;(low gravitation enable)&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 0Ah&lt;br /&gt;
| -&lt;br /&gt;
| reset INT&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| self test 1&lt;br /&gt;
| self test 2&lt;br /&gt;
| soft reset&lt;br /&gt;
| sleep&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 09h&lt;br /&gt;
| STR &amp;lt;br&amp;gt;(self test result)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| -&lt;br /&gt;
| alert phase&lt;br /&gt;
| LG latched&lt;br /&gt;
| HG latched&lt;br /&gt;
| HGS &amp;lt;br&amp;gt;(high gravitation status)&lt;br /&gt;
| LGS &amp;lt;br&amp;gt;(low gravitation status)&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 08h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| -&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 07h&lt;br /&gt;
| Z [9]&lt;br /&gt;
| Z [8]&lt;br /&gt;
| Z [7]&lt;br /&gt;
| Z [6]&lt;br /&gt;
| Z [5]&lt;br /&gt;
| Z [4]&lt;br /&gt;
| Z [3]&lt;br /&gt;
| Z [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| Z&lt;br /&gt;
|-&lt;br /&gt;
| 06h&lt;br /&gt;
| Z [1]&lt;br /&gt;
| Z [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDZ &amp;lt;br&amp;gt;(new data Z)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 05h&lt;br /&gt;
| Y [9]&lt;br /&gt;
| Y [8]&lt;br /&gt;
| Y [7]&lt;br /&gt;
| Y [6]&lt;br /&gt;
| Y [5]&lt;br /&gt;
| Y [4]&lt;br /&gt;
| Y [3]&lt;br /&gt;
| Y [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| Y&lt;br /&gt;
|-&lt;br /&gt;
| 04h&lt;br /&gt;
| Y [1]&lt;br /&gt;
| Y [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDY &amp;lt;br&amp;gt;(new data Y)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 03h&lt;br /&gt;
| X [9]&lt;br /&gt;
| X [8]&lt;br /&gt;
| X [7]&lt;br /&gt;
| X [6]&lt;br /&gt;
| X [5]&lt;br /&gt;
| X [4]&lt;br /&gt;
| X [3]&lt;br /&gt;
| X [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| X&lt;br /&gt;
|-&lt;br /&gt;
| 02h&lt;br /&gt;
| X [1]&lt;br /&gt;
| X [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDX &amp;lt;br&amp;gt;(new data X)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 01h&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;| al version&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;| ml version&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| 00h&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| chip ID&lt;br /&gt;
| data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Register==&lt;br /&gt;
==Konfiguration==&lt;br /&gt;
&lt;br /&gt;
==I2C==&lt;br /&gt;
===Adresse===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adresse&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Bit 7 || Bit 6 || Bit 5 || Bit 4 || Bit 3 || Bit 2 || Bit 1 || R/W &lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 1 || 1 || 0 || 0 || 0 || x&lt;br /&gt;
|}&lt;br /&gt;
====7 Bit Sichtweise====&lt;br /&gt;
Gemeint ist hierbei Bit 7 - 1.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adressen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Hexadezimal || Dezimal&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 56&lt;br /&gt;
|}&lt;br /&gt;
Zum lesen muss das 0. Bit gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
====8 Bit Sichtweise====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adressen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Hexadezimal || Dezimal&lt;br /&gt;
|-&lt;br /&gt;
| schreiben || 0x70 || 112&lt;br /&gt;
|-&lt;br /&gt;
| lesen || 0x71 || 113&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Beschleunigungsdaten lesen===&lt;br /&gt;
&lt;br /&gt;
Um Daten zu lesen muss erst der Offset gesendet werden ab dem Daten gelesen werden sollen. Die Beschleunigungsdaten liegen ab Adresse 0x02h.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Offset senden&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Adresse || Daten&lt;br /&gt;
|-&lt;br /&gt;
| schreiben || 0x70 || 0x02&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Beschleunigungsdaten sind pro Achse (X, Y, Z) 10 Bit lang. Diese liegen in 6 Bytes ab Adresse 0x02h (0x02h - 0x08h). Siehe dazu den Abschnitt [[#Speicheraufteilung|Speicheraufteilung]].&lt;br /&gt;
Um an die Daten zu kommen muessen 6 Byte von der Adresse des BMA020 gelesen werden:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039; Beschleunigungsdaten lesen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Adresse || Byte 1 || Byte 2 || Byte 3 || Byte 4 || Byte 5 || Byte 6&lt;br /&gt;
|-&lt;br /&gt;
| lesen || 0x71 || LSB_x || MSB_x || LSB_y || MSB_y || LSB_z || MSB_z&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Muebau</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=BMA020&amp;diff=62922</id>
		<title>BMA020</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=BMA020&amp;diff=62922"/>
		<updated>2012-01-02T14:21:52Z</updated>

		<summary type="html">&lt;p&gt;Muebau: /* Speicheraufteilung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=BMA020=&lt;br /&gt;
==Bauteilseite==&lt;br /&gt;
[http://www.mikrocontroller.net/part/BMA020 Zur Bauteilseite des BMA020]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Bezugsquellen==&lt;br /&gt;
===ELV===&lt;br /&gt;
http://www.elv.de/3-Achsen-Beschleunigungssensor-3D-BS,-Komplettbausatz/x.aspx/cid_74/detail_10/detail2_28515&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Speicheraufteilung==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;BMA020 Speicher&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Adresse&lt;br /&gt;
! Bit 7&lt;br /&gt;
! Bit 6&lt;br /&gt;
! Bit 5&lt;br /&gt;
! Bit 4&lt;br /&gt;
! Bit 3&lt;br /&gt;
! Bit 2&lt;br /&gt;
! Bit 1&lt;br /&gt;
! Bit 0&lt;br /&gt;
! Typ&lt;br /&gt;
! Axis&lt;br /&gt;
|-&lt;br /&gt;
| 16h - 7Fh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| -&lt;br /&gt;
| reserved&lt;br /&gt;
|rowspan=&amp;quot;15&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| 15h&lt;br /&gt;
| SPI4E &amp;lt;br&amp;gt;(4 wire SPI enable)&lt;br /&gt;
| EAI &amp;lt;br&amp;gt;(enable advanced interrupt)&lt;br /&gt;
| NDI &amp;lt;br&amp;gt;(new data interrupt)&lt;br /&gt;
| LI &amp;lt;br&amp;gt;(latch interrupt)&lt;br /&gt;
| SD &amp;lt;br&amp;gt;(shadow disable / read MSB only)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| WUP &amp;lt;br&amp;gt;(wake up pause)&lt;br /&gt;
| WU &amp;lt;br&amp;gt;(wake up)&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 14h&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| - !!! -&amp;lt;br&amp;gt;(NEVER ever change this registers)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| range &amp;lt;br&amp;gt;(+/-2/4/8g)&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| bandwith &amp;lt;br&amp;gt;(25...1500 Hz)&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 13h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot; rowspan=&amp;quot;2&amp;quot;| customer reserved &amp;lt;br&amp;gt;(can be used as memory)&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 12h&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 11h&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| AMD &amp;lt;br&amp;gt;(any motion duration)&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| HGH &amp;lt;br&amp;gt;(high gravitation hysteresis)&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| LGH &amp;lt;br&amp;gt;(low gravitation hysteresis)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 10h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| AMT &amp;lt;br&amp;gt;(any motion threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Fh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| HGD &amp;lt;br&amp;gt;(high gravitation duration)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Eh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| HGT  &amp;lt;br&amp;gt;(high gravitation threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Dh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| LGD &amp;lt;br&amp;gt;(low gravitation duration)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Ch&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| LGT &amp;lt;br&amp;gt;(high gravitation threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Bh&lt;br /&gt;
| alert&lt;br /&gt;
| AM &amp;lt;br&amp;gt;(any motion)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| HGC &amp;lt;br&amp;gt;(high gravitation counter)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| LGC &amp;lt;br&amp;gt;(low gravitation counter)&lt;br /&gt;
| HGE  &amp;lt;br&amp;gt;(high gravitation enable)&lt;br /&gt;
| LGE &amp;lt;br&amp;gt;(low gravitation enable)&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 0Ah&lt;br /&gt;
| -&lt;br /&gt;
| reset INT&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| self test 1&lt;br /&gt;
| self test 2&lt;br /&gt;
| soft reset&lt;br /&gt;
| sleep&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 09h&lt;br /&gt;
| STR &amp;lt;br&amp;gt;(self test result)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| -&lt;br /&gt;
| alert phase&lt;br /&gt;
| LG latched&lt;br /&gt;
| HG latched&lt;br /&gt;
| HGS &amp;lt;br&amp;gt;(high gravitation status)&lt;br /&gt;
| LGS &amp;lt;br&amp;gt;(low gravitation status)&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 08h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| -&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 07h&lt;br /&gt;
| Z [9]&lt;br /&gt;
| Z [8]&lt;br /&gt;
| Z [7]&lt;br /&gt;
| Z [6]&lt;br /&gt;
| Z [5]&lt;br /&gt;
| Z [4]&lt;br /&gt;
| Z [3]&lt;br /&gt;
| Z [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| Z&lt;br /&gt;
|-&lt;br /&gt;
| 06h&lt;br /&gt;
| Z [1]&lt;br /&gt;
| Z [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDZ &amp;lt;br&amp;gt;(new data Z)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 05h&lt;br /&gt;
| Y [9]&lt;br /&gt;
| Y [8]&lt;br /&gt;
| Y [7]&lt;br /&gt;
| Y [6]&lt;br /&gt;
| Y [5]&lt;br /&gt;
| Y [4]&lt;br /&gt;
| Y [3]&lt;br /&gt;
| Y [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| Y&lt;br /&gt;
|-&lt;br /&gt;
| 04h&lt;br /&gt;
| Y [1]&lt;br /&gt;
| Y [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDY &amp;lt;br&amp;gt;(new data Y)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 03h&lt;br /&gt;
| X [9]&lt;br /&gt;
| X [8]&lt;br /&gt;
| X [7]&lt;br /&gt;
| X [6]&lt;br /&gt;
| X [5]&lt;br /&gt;
| X [4]&lt;br /&gt;
| X [3]&lt;br /&gt;
| X [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| X&lt;br /&gt;
|-&lt;br /&gt;
| 02h&lt;br /&gt;
| X [1]&lt;br /&gt;
| X [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDX &amp;lt;br&amp;gt;(new data X)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 01h&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;| al version&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;| ml version&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| 00h&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| chip ID&lt;br /&gt;
| data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Register==&lt;br /&gt;
==Konfiguration==&lt;br /&gt;
&lt;br /&gt;
==I2C==&lt;br /&gt;
===Adresse===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adresse&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Bit 7 || Bit 6 || Bit 5 || Bit 4 || Bit 3 || Bit 2 || Bit 1 || R/W &lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 1 || 1 || 0 || 0 || 0 || x&lt;br /&gt;
|}&lt;br /&gt;
====7 Bit Sichtweise====&lt;br /&gt;
Gemeint ist hierbei Bit 7 - 1.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adressen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Hexadezimal || Dezimal&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 56&lt;br /&gt;
|}&lt;br /&gt;
Zum lesen muss das 0. Bit gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
====8 Bit Sichtweise====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adressen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Hexadezimal || Dezimal&lt;br /&gt;
|-&lt;br /&gt;
| schreiben || 0x70 || 112&lt;br /&gt;
|-&lt;br /&gt;
| lesen || 0x71 || 113&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Beschleunigungsdaten lesen===&lt;br /&gt;
&lt;br /&gt;
Um Daten zu lesen muss erst der Offset gesendet werden ab dem Daten gelesen werden sollen. Die Beschleunigungsdaten liegen ab Adresse 0x02h.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Offset senden&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Adresse || Daten&lt;br /&gt;
|-&lt;br /&gt;
| schreiben || 0x70 || 0x02&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Beschleunigungsdaten sind pro Achse (X, Y, Z) 10 Bit lang. Diese liegen in 6 Bytes ab Adresse 0x02h (0x02h - 0x08h). Siehe dazu den Abschnitt [[#Speicheraufteilung|Speicheraufteilung]].&lt;br /&gt;
Um an die Daten zu kommen muessen 6 Byte von der Adresse des BMA020 gelesen werden:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039; Beschleunigungsdaten lesen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Adresse || Byte 1 || Byte 2 || Byte 3 || Byte 4 || Byte 5 || Byte 6&lt;br /&gt;
|-&lt;br /&gt;
| lesen || 0x71 || LSB_x || MSB_x || LSB_y || MSB_y || LSB_z || MSB_z&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Muebau</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=BMA020&amp;diff=62921</id>
		<title>BMA020</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=BMA020&amp;diff=62921"/>
		<updated>2012-01-02T14:20:05Z</updated>

		<summary type="html">&lt;p&gt;Muebau: /* Speicheraufteilung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=BMA020=&lt;br /&gt;
==Bauteilseite==&lt;br /&gt;
[http://www.mikrocontroller.net/part/BMA020 Zur Bauteilseite des BMA020]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Bezugsquellen==&lt;br /&gt;
===ELV===&lt;br /&gt;
http://www.elv.de/3-Achsen-Beschleunigungssensor-3D-BS,-Komplettbausatz/x.aspx/cid_74/detail_10/detail2_28515&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Speicheraufteilung==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;BMA020 Speicher&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Adresse&lt;br /&gt;
! Bit 7&lt;br /&gt;
! Bit 6&lt;br /&gt;
! Bit 5&lt;br /&gt;
! Bit 4&lt;br /&gt;
! Bit 3&lt;br /&gt;
! Bit 2&lt;br /&gt;
! Bit 1&lt;br /&gt;
! Bit 0&lt;br /&gt;
! Typ&lt;br /&gt;
! Axis&lt;br /&gt;
|-&lt;br /&gt;
| 16h - 7Fh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| -&lt;br /&gt;
| reserved&lt;br /&gt;
|rowspan=&amp;quot;15&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| 15h&lt;br /&gt;
| SPI4E &amp;lt;br&amp;gt;(4 wire SPI enable)&lt;br /&gt;
| EAI &amp;lt;br&amp;gt;(enable advanced interrupt)&lt;br /&gt;
| NDI &amp;lt;br&amp;gt;(new data interrupt)&lt;br /&gt;
| LI &amp;lt;br&amp;gt;(latch interrupt)&lt;br /&gt;
| SD &amp;lt;br&amp;gt;(shadow disable / read MSB only)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| WUP &amp;lt;br&amp;gt;(wake up pause)&lt;br /&gt;
| WU &amp;lt;br&amp;gt;(wake up)&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 14h&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| - !!! -&amp;lt;br&amp;gt;(NEVER ever change this registers)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| range &amp;lt;br&amp;gt;(+/-2/4/8g)&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| bandwith &amp;lt;br&amp;gt;(25...1500 Hz)&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 13h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot; rowspan=&amp;quot;2&amp;quot;| customer reserved &amp;lt;br&amp;gt;(can be freely used)&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 12h&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 11h&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| AMD &amp;lt;br&amp;gt;(any motion duration)&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| HGH &amp;lt;br&amp;gt;(high gravitation hysteresis)&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| LGH &amp;lt;br&amp;gt;(low gravitation hysteresis)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 10h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| AMT &amp;lt;br&amp;gt;(any motion threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Fh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| HGD &amp;lt;br&amp;gt;(high gravitation duration)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Eh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| HGT  &amp;lt;br&amp;gt;(high gravitation threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Dh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| LGD &amp;lt;br&amp;gt;(low gravitation duration)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Ch&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| LGT &amp;lt;br&amp;gt;(high gravitation threshold)&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Bh&lt;br /&gt;
| alert&lt;br /&gt;
| AM &amp;lt;br&amp;gt;(any motion)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| HGC &amp;lt;br&amp;gt;(high gravitation counter)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| LGC &amp;lt;br&amp;gt;(low gravitation counter)&lt;br /&gt;
| HGE  &amp;lt;br&amp;gt;(high gravitation enable)&lt;br /&gt;
| LGE &amp;lt;br&amp;gt;(low gravitation enable)&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 0Ah&lt;br /&gt;
| -&lt;br /&gt;
| reset INT&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| self test 1&lt;br /&gt;
| self test 2&lt;br /&gt;
| soft reset&lt;br /&gt;
| sleep&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 09h&lt;br /&gt;
| STR &amp;lt;br&amp;gt;(self test result)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| -&lt;br /&gt;
| alert phase&lt;br /&gt;
| LG latched&lt;br /&gt;
| HG latched&lt;br /&gt;
| HGS &amp;lt;br&amp;gt;(high gravitation status)&lt;br /&gt;
| LGS &amp;lt;br&amp;gt;(low gravitation status)&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 08h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| -&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 07h&lt;br /&gt;
| Z [9]&lt;br /&gt;
| Z [8]&lt;br /&gt;
| Z [7]&lt;br /&gt;
| Z [6]&lt;br /&gt;
| Z [5]&lt;br /&gt;
| Z [4]&lt;br /&gt;
| Z [3]&lt;br /&gt;
| Z [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| Z&lt;br /&gt;
|-&lt;br /&gt;
| 06h&lt;br /&gt;
| Z [1]&lt;br /&gt;
| Z [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDZ &amp;lt;br&amp;gt;(new data Z)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 05h&lt;br /&gt;
| Y [9]&lt;br /&gt;
| Y [8]&lt;br /&gt;
| Y [7]&lt;br /&gt;
| Y [6]&lt;br /&gt;
| Y [5]&lt;br /&gt;
| Y [4]&lt;br /&gt;
| Y [3]&lt;br /&gt;
| Y [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| Y&lt;br /&gt;
|-&lt;br /&gt;
| 04h&lt;br /&gt;
| Y [1]&lt;br /&gt;
| Y [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDY &amp;lt;br&amp;gt;(new data Y)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 03h&lt;br /&gt;
| X [9]&lt;br /&gt;
| X [8]&lt;br /&gt;
| X [7]&lt;br /&gt;
| X [6]&lt;br /&gt;
| X [5]&lt;br /&gt;
| X [4]&lt;br /&gt;
| X [3]&lt;br /&gt;
| X [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| X&lt;br /&gt;
|-&lt;br /&gt;
| 02h&lt;br /&gt;
| X [1]&lt;br /&gt;
| X [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDX &amp;lt;br&amp;gt;(new data X)&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 01h&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;| al version&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;| ml version&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| 00h&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| chip ID&lt;br /&gt;
| data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Register==&lt;br /&gt;
==Konfiguration==&lt;br /&gt;
&lt;br /&gt;
==I2C==&lt;br /&gt;
===Adresse===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adresse&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Bit 7 || Bit 6 || Bit 5 || Bit 4 || Bit 3 || Bit 2 || Bit 1 || R/W &lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 1 || 1 || 0 || 0 || 0 || x&lt;br /&gt;
|}&lt;br /&gt;
====7 Bit Sichtweise====&lt;br /&gt;
Gemeint ist hierbei Bit 7 - 1.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adressen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Hexadezimal || Dezimal&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 56&lt;br /&gt;
|}&lt;br /&gt;
Zum lesen muss das 0. Bit gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
====8 Bit Sichtweise====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adressen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Hexadezimal || Dezimal&lt;br /&gt;
|-&lt;br /&gt;
| schreiben || 0x70 || 112&lt;br /&gt;
|-&lt;br /&gt;
| lesen || 0x71 || 113&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Beschleunigungsdaten lesen===&lt;br /&gt;
&lt;br /&gt;
Um Daten zu lesen muss erst der Offset gesendet werden ab dem Daten gelesen werden sollen. Die Beschleunigungsdaten liegen ab Adresse 0x02h.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Offset senden&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Adresse || Daten&lt;br /&gt;
|-&lt;br /&gt;
| schreiben || 0x70 || 0x02&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Beschleunigungsdaten sind pro Achse (X, Y, Z) 10 Bit lang. Diese liegen in 6 Bytes ab Adresse 0x02h (0x02h - 0x08h). Siehe dazu den Abschnitt [[#Speicheraufteilung|Speicheraufteilung]].&lt;br /&gt;
Um an die Daten zu kommen muessen 6 Byte von der Adresse des BMA020 gelesen werden:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039; Beschleunigungsdaten lesen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Adresse || Byte 1 || Byte 2 || Byte 3 || Byte 4 || Byte 5 || Byte 6&lt;br /&gt;
|-&lt;br /&gt;
| lesen || 0x71 || LSB_x || MSB_x || LSB_y || MSB_y || LSB_z || MSB_z&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Muebau</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=BMA020&amp;diff=62919</id>
		<title>BMA020</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=BMA020&amp;diff=62919"/>
		<updated>2012-01-02T10:14:08Z</updated>

		<summary type="html">&lt;p&gt;Muebau: /* Speicheraufteilung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=BMA020=&lt;br /&gt;
==Bauteilseite==&lt;br /&gt;
[http://www.mikrocontroller.net/part/BMA020 Zur Bauteilseite des BMA020]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Bezugsquellen==&lt;br /&gt;
===ELV===&lt;br /&gt;
http://www.elv.de/3-Achsen-Beschleunigungssensor-3D-BS,-Komplettbausatz/x.aspx/cid_74/detail_10/detail2_28515&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Speicheraufteilung==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;BMA020 Speicher&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Adresse&lt;br /&gt;
! Bit 7&lt;br /&gt;
! Bit 6&lt;br /&gt;
! Bit 5&lt;br /&gt;
! Bit 4&lt;br /&gt;
! Bit 3&lt;br /&gt;
! Bit 2&lt;br /&gt;
! Bit 1&lt;br /&gt;
! Bit 0&lt;br /&gt;
! Typ&lt;br /&gt;
! Axis&lt;br /&gt;
|-&lt;br /&gt;
| 16h - 7Fh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| -&lt;br /&gt;
| reserved&lt;br /&gt;
|rowspan=&amp;quot;15&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| 15h&lt;br /&gt;
| SPI4&lt;br /&gt;
| EAI&lt;br /&gt;
| NDI&lt;br /&gt;
| LI&lt;br /&gt;
| SD&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| WUP&lt;br /&gt;
| WU&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 14h&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| -&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| range&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| bandwith&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 13h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| customer reserved 1&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 12h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| customer reserved 2&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 11h&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| AMD&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| HGH&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| LGH&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 10h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| AMT&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Fh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| HGD&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Eh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| HGT&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Dh&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| LGD&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Ch&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| LGT&lt;br /&gt;
| settings&lt;br /&gt;
|-&lt;br /&gt;
| 0Bh&lt;br /&gt;
| alert&lt;br /&gt;
| AM&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| HGC&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| LGC&lt;br /&gt;
| HGE&lt;br /&gt;
| LGE&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 0Ah&lt;br /&gt;
| -&lt;br /&gt;
| reset INT&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| self test 1&lt;br /&gt;
| self test 2&lt;br /&gt;
| soft reset&lt;br /&gt;
| sleep&lt;br /&gt;
| control&lt;br /&gt;
|-&lt;br /&gt;
| 09h&lt;br /&gt;
| st result&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| -&lt;br /&gt;
| alert phase&lt;br /&gt;
| LG latched&lt;br /&gt;
| HG latched&lt;br /&gt;
| HGS&lt;br /&gt;
| LGS&lt;br /&gt;
| status&lt;br /&gt;
|-&lt;br /&gt;
| 08h&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot;| -&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 07h&lt;br /&gt;
| Z [9]&lt;br /&gt;
| Z [8]&lt;br /&gt;
| Z [7]&lt;br /&gt;
| Z [6]&lt;br /&gt;
| Z [5]&lt;br /&gt;
| Z [4]&lt;br /&gt;
| Z [3]&lt;br /&gt;
| Z [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| Z&lt;br /&gt;
|-&lt;br /&gt;
| 06h&lt;br /&gt;
| Z [1]&lt;br /&gt;
| Z [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDZ&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 05h&lt;br /&gt;
| Y [9]&lt;br /&gt;
| Y [8]&lt;br /&gt;
| Y [7]&lt;br /&gt;
| Y [6]&lt;br /&gt;
| Y [5]&lt;br /&gt;
| Y [4]&lt;br /&gt;
| Y [3]&lt;br /&gt;
| Y [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| Y&lt;br /&gt;
|-&lt;br /&gt;
| 04h&lt;br /&gt;
| Y [1]&lt;br /&gt;
| Y [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDY&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 03h&lt;br /&gt;
| X [9]&lt;br /&gt;
| X [8]&lt;br /&gt;
| X [7]&lt;br /&gt;
| X [6]&lt;br /&gt;
| X [5]&lt;br /&gt;
| X [4]&lt;br /&gt;
| X [3]&lt;br /&gt;
| X [2]&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| X&lt;br /&gt;
|-&lt;br /&gt;
| 02h&lt;br /&gt;
| X [1]&lt;br /&gt;
| X [0]&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
| NDX&lt;br /&gt;
| data&lt;br /&gt;
|-&lt;br /&gt;
| 01h&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;| al version&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;| ml version&lt;br /&gt;
| data&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| 00h&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;| -&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| chip ID&lt;br /&gt;
| data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Register==&lt;br /&gt;
==Konfiguration==&lt;br /&gt;
&lt;br /&gt;
==I2C==&lt;br /&gt;
===Adresse===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adresse&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Bit 7 || Bit 6 || Bit 5 || Bit 4 || Bit 3 || Bit 2 || Bit 1 || R/W &lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 1 || 1 || 0 || 0 || 0 || x&lt;br /&gt;
|}&lt;br /&gt;
====7 Bit Sichtweise====&lt;br /&gt;
Gemeint ist hierbei Bit 7 - 1.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adressen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Hexadezimal || Dezimal&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 56&lt;br /&gt;
|}&lt;br /&gt;
Zum lesen muss das 0. Bit gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
====8 Bit Sichtweise====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adressen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Hexadezimal || Dezimal&lt;br /&gt;
|-&lt;br /&gt;
| schreiben || 0x70 || 112&lt;br /&gt;
|-&lt;br /&gt;
| lesen || 0x71 || 113&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Beschleunigungsdaten lesen===&lt;br /&gt;
&lt;br /&gt;
Um Daten zu lesen muss erst der Offset gesendet werden ab dem Daten gelesen werden sollen. Die Beschleunigungsdaten liegen ab Adresse 0x02h.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Offset senden&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Adresse || Daten&lt;br /&gt;
|-&lt;br /&gt;
| schreiben || 0x70 || 0x02&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Beschleunigungsdaten sind pro Achse (X, Y, Z) 10 Bit lang. Diese liegen in 6 Bytes ab Adresse 0x02h (0x02h - 0x08h). Siehe dazu den Abschnitt [[#Speicheraufteilung|Speicheraufteilung]].&lt;br /&gt;
Um an die Daten zu kommen muessen 6 Byte von der Adresse des BMA020 gelesen werden:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039; Beschleunigungsdaten lesen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Adresse || Byte 1 || Byte 2 || Byte 3 || Byte 4 || Byte 5 || Byte 6&lt;br /&gt;
|-&lt;br /&gt;
| lesen || 0x71 || LSB_x || MSB_x || LSB_y || MSB_y || LSB_z || MSB_z&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Muebau</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=BMA020&amp;diff=62914</id>
		<title>BMA020</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=BMA020&amp;diff=62914"/>
		<updated>2012-01-02T00:25:55Z</updated>

		<summary type="html">&lt;p&gt;Muebau: /* Beschleunigungsdaten lesen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=BMA020=&lt;br /&gt;
==Bauteilseite==&lt;br /&gt;
[http://www.mikrocontroller.net/part/BMA020 Zur Bauteilseite des BMA020]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Bezugsquellen==&lt;br /&gt;
===ELV===&lt;br /&gt;
http://www.elv.de/3-Achsen-Beschleunigungssensor-3D-BS,-Komplettbausatz/x.aspx/cid_74/detail_10/detail2_28515&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Speicheraufteilung==&lt;br /&gt;
==Register==&lt;br /&gt;
==Konfiguration==&lt;br /&gt;
&lt;br /&gt;
==I2C==&lt;br /&gt;
===Adresse===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adresse&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Bit 7 || Bit 6 || Bit 5 || Bit 4 || Bit 3 || Bit 2 || Bit 1 || R/W &lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 1 || 1 || 0 || 0 || 0 || x&lt;br /&gt;
|}&lt;br /&gt;
====7 Bit Sichtweise====&lt;br /&gt;
Gemeint ist hierbei Bit 7 - 1.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adressen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Hexadezimal || Dezimal&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 56&lt;br /&gt;
|}&lt;br /&gt;
Zum lesen muss das 0. Bit gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
====8 Bit Sichtweise====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adressen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Hexadezimal || Dezimal&lt;br /&gt;
|-&lt;br /&gt;
| schreiben || 0x70 || 112&lt;br /&gt;
|-&lt;br /&gt;
| lesen || 0x71 || 113&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Beschleunigungsdaten lesen===&lt;br /&gt;
&lt;br /&gt;
Um Daten zu lesen muss erst der Offset gesendet werden ab dem Daten gelesen werden sollen. Die Beschleunigungsdaten liegen ab Adresse 0x02h.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Offset senden&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Adresse || Daten&lt;br /&gt;
|-&lt;br /&gt;
| schreiben || 0x70 || 0x02&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Beschleunigungsdaten sind pro Achse (X, Y, Z) 10 Bit lang. Diese liegen in 6 Bytes ab Adresse 0x02h (0x02h - 0x08h). Siehe dazu den Abschnitt [[#Speicheraufteilung|Speicheraufteilung]].&lt;br /&gt;
Um an die Daten zu kommen muessen 6 Byte von der Adresse des BMA020 gelesen werden:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039; Beschleunigungsdaten lesen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Adresse || Byte 1 || Byte 2 || Byte 3 || Byte 4 || Byte 5 || Byte 6&lt;br /&gt;
|-&lt;br /&gt;
| lesen || 0x71 || LSB_x || MSB_x || LSB_y || MSB_y || LSB_z || MSB_z&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Muebau</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=BMA020&amp;diff=62913</id>
		<title>BMA020</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=BMA020&amp;diff=62913"/>
		<updated>2012-01-02T00:17:18Z</updated>

		<summary type="html">&lt;p&gt;Muebau: Beschleunigungsensor BMA020&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=BMA020=&lt;br /&gt;
==Bauteilseite==&lt;br /&gt;
[http://www.mikrocontroller.net/part/BMA020 Zur Bauteilseite des BMA020]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Bezugsquellen==&lt;br /&gt;
===ELV===&lt;br /&gt;
http://www.elv.de/3-Achsen-Beschleunigungssensor-3D-BS,-Komplettbausatz/x.aspx/cid_74/detail_10/detail2_28515&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Speicheraufteilung==&lt;br /&gt;
==Register==&lt;br /&gt;
==Konfiguration==&lt;br /&gt;
&lt;br /&gt;
==I2C==&lt;br /&gt;
===Adresse===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adresse&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Bit 7 || Bit 6 || Bit 5 || Bit 4 || Bit 3 || Bit 2 || Bit 1 || R/W &lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 1 || 1 || 0 || 0 || 0 || x&lt;br /&gt;
|}&lt;br /&gt;
====7 Bit Sichtweise====&lt;br /&gt;
Gemeint ist hierbei Bit 7 - 1.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adressen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Hexadezimal || Dezimal&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || 56&lt;br /&gt;
|}&lt;br /&gt;
Zum lesen muss das 0. Bit gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
====8 Bit Sichtweise====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;I2C Adressen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Hexadezimal || Dezimal&lt;br /&gt;
|-&lt;br /&gt;
| schreiben || 0x70 || 112&lt;br /&gt;
|-&lt;br /&gt;
| lesen || 0x71 || 113&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Beschleunigungsdaten lesen===&lt;br /&gt;
&lt;br /&gt;
Um Daten zu lesen muss erst der Offset gesendet werden ab dem Daten gelesen werden sollen. Die Beschleunigungsdaten liegen ab Adresse 0x02h.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Offset senden&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Adresse || Daten&lt;br /&gt;
|-&lt;br /&gt;
| schreiben || 0x70 || 0x02&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Beschleunigungsdaten sind pro Achse (X, Y, Z) 10 Bit lang. Diese liegen in 6 Bytes ab Adresse 0x02h (0x02h - 0x08h). Siehe dazu den Abschnitt Speicheraufteilung.&lt;br /&gt;
Um an die Daten zu kommen muessen 6 Byte von der Adresse des BMA020 gelesen werden:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039; Beschleunigungsdaten lesen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Richtung || Adresse || Byte 1 || Byte 2 || Byte 3 || Byte 4 || Byte 5 || Byte 6&lt;br /&gt;
|-&lt;br /&gt;
| lesen || 0x71 || LSB_x || MSB_x || LSB_y || MSB_y || LSB_z || MSB_z&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Muebau</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=I%C2%B2C&amp;diff=62911</id>
		<title>I²C</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=I%C2%B2C&amp;diff=62911"/>
		<updated>2012-01-01T23:18:14Z</updated>

		<summary type="html">&lt;p&gt;Muebau: /* Bausteine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;I²C&#039;&#039;&#039; ist ein synchroner serieller Zweidraht-[[Bus]] (eine Daten- und eine Taktleitung), der für die Kommunikation zwischen [[IC]]s über kleine Distanzen geeignet ist. Entwickelt wurde er Anfang der 80er Jahre von Philips.&lt;br /&gt;
Gesprochen &amp;quot;I quadrat C&amp;quot; steht für IIC = Inter [[IC]] Bus. Aus Lizenzgründen heißt der I²C Bus bei manchen Herstellern auch &#039;&#039;&#039;TWI&#039;&#039;&#039;, two wire interface.&lt;br /&gt;
&lt;br /&gt;
== I2C ==&lt;br /&gt;
In einem I²C-Bus gibt es mindestens einen Master mit bis zu 127 Slaves und einen Broadcast Kanal. Ein I²C-Bus mit mehreren Mastern wird als &amp;quot;Multi-Master-Bus&amp;quot; bezeichnet.&lt;br /&gt;
Der (oder die) Master sprechen die Slaves an; ein Slave kann NIE selbstständig Daten senden. Dazu übernimmt der Master, der Daten senden oder empfangen möchte, den Bus und gibt die (7-bit- bzw. 10-bit-)Adresse des Slaves aus, mit dem er kommunizieren möchte. Nach der Adresse teilt der Master dem entsprechenden Slave mit, ob er Daten senden oder empfangen möchte. Danach werden die eigentlichen Daten (entweder vom Master oder Slave) auf den Bus gelegt. Hat der Master den Lese- oder Schreibvorgang abgeschlossen, so gibt er den Bus wieder frei.&lt;br /&gt;
Sofern mehrere Master vorhanden sind, stellt ein Protokoll sicher, dass sich diese nicht gegenseitig stören.&lt;br /&gt;
&lt;br /&gt;
=== I2C - Übertragungsraten  ===&lt;br /&gt;
Die Übertragungsrate beträgt beim standard mode bis zu 100 kbit/s, beim fast mode bis zu 400 kbit/s und beim high-speed mode bis zu 3,4 MBit/s. Falls die Taktrate für einen Slave zu hoch ist, kann er die Clock-Leitung auf Null ziehen und die Übertragung damit verlangsamen (sog. Clock Stretching). Dies ist auf Bit- wie auf Byte-Ebene möglich; ersteres allerdings nicht im high-speed mode.&lt;br /&gt;
Um längere Übertragungswege zu realisieren, kann man die Taktrate fast beliebig vermindern (einige Bausteine erzeugen aber irgendwann ein Time-Out). Mit einer Taktfrequenz von nur 5 kbit/s können dann durchaus mehrere Meter überbrückt werden.&lt;br /&gt;
&lt;br /&gt;
Im PC wird ein dem I²C-Bus sehr ähnliches System benutzt, um z.&amp;amp;nbsp;B. die Daten eines [[SDRAM]]-Modules auszulesen. Dieser nennt sich [[SMBus]] (System Management Bus).&lt;br /&gt;
&lt;br /&gt;
Erfahrungen mit den Atmegas (gemessene I2C-Taktfrequenzen):&lt;br /&gt;
* 16,000MHz - schafft sauber bis zu 700KHz&lt;br /&gt;
* 18,432MHz - schafft sauber bis zu 950KHz&lt;br /&gt;
&lt;br /&gt;
Selbst unter schlechten Bedingungen wie...&lt;br /&gt;
* 50cm 6-adriges Spiralkabel, frei schwingend verbaut in einem Rennwagen als Verbindung zwischen Lenkraddisplay und Amaturenbrett&lt;br /&gt;
* Nähe zu nicht geschirmten Leitungen mit 12V, GND und 5V PWM zum Dimmen von LEDs&lt;br /&gt;
* grausamen Umgebungsbedingungen, Fahrten im Regen, Schnee oder bei glühender Sonne und gefühlten 100° C ;-) auf der Rennstrecke.&lt;br /&gt;
hat der Bus ohne Probleme funktioniert.&lt;br /&gt;
&lt;br /&gt;
=== Bausteine ===&lt;br /&gt;
&lt;br /&gt;
Neben Mikrocontrollern gibt es eine Reihe von Peripheriebausteinen, die per I²C angeschlossen werden können. Eine gute Anlaufstelle bei der Suche ist die unten angegebene Seite des &amp;quot;Erfinders&amp;quot; Philips, heute als [http://www.nxp.com NXP] bekannt.&lt;br /&gt;
&lt;br /&gt;
*serielle [[Speicher#EEPROM | EEPROM]]s &lt;br /&gt;
** [http://www.datasheetcatalog.net/cgi-bin/helo.pl?text=24C01&amp;amp;action=Search 24Cxx]&lt;br /&gt;
** [http://ics.nxp.com/products/pcf/seeproms/ PCF85xx von NXP, 256-2048 Byte]&lt;br /&gt;
&lt;br /&gt;
*I/O-Portexpander&lt;br /&gt;
** [[I2C-Schaltmodul|PCF8574]]&lt;br /&gt;
** [http://www.mikrocontroller.net/part/MCP23008 MCP23008] (8-bit) von Microchip&lt;br /&gt;
** [http://www.mikrocontroller.net/part/MCP23017 MCP23017](16-bit) von Microchip&lt;br /&gt;
&lt;br /&gt;
* I2C MUX, zum Anschluss von ICs mit gleicher, fester Adresse&lt;br /&gt;
** [http://www.datasheetcatalog.org/cgi-bin/helo.pl?field=Nume&amp;amp;type=C&amp;amp;text=PCA9545A&amp;amp;producedby=&amp;amp;action=Search PCA9545A]&lt;br /&gt;
&lt;br /&gt;
* [[AD-Wandler]]&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/182614 12x12 Bit ADC MAX1238]&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/182614 12x10 Bit ADC MAX1138]&lt;br /&gt;
** [http://www.maxim-ic.com/datasheet/index.mvp/id/1890 MAX127 und MAX128 von Maxim, 12bit x8, PDIP24+SSOP28]&lt;br /&gt;
** [http://www.jtronics.de/platinen.html 12x8  Bit ADC MAX1038]&lt;br /&gt;
&lt;br /&gt;
* [[DA-Wandler]]&lt;br /&gt;
** [http://www.datasheetcatalog.net/cgi-bin/helo.pl?field=Nume&amp;amp;type=C&amp;amp;text=TDA8444&amp;amp;producedby=&amp;amp;action=Search TDA8444, 8x6Bit]&lt;br /&gt;
&lt;br /&gt;
* Uhrenbausteine&lt;br /&gt;
** [http://www.datasheetcatalog.net/cgi-bin/helo.pl?field=Nume&amp;amp;type=C&amp;amp;text=PCF8583&amp;amp;producedby=&amp;amp;action=Search PCF8583, mit 256 Bytes RAM]&lt;br /&gt;
** DS1307&lt;br /&gt;
&lt;br /&gt;
* [[LCD]]-Treiber&lt;br /&gt;
** [http://www.datasheetcatalog.net/cgi-bin/helo.pl?field=Nume&amp;amp;type=C&amp;amp;text=PCF8577&amp;amp;producedby=&amp;amp;action=Search PCF8577, 2x32 Segmente]&lt;br /&gt;
&lt;br /&gt;
* [[Temperatursensor|Temperatursensoren]]&lt;br /&gt;
** [http://www.datasheetcatalog.net/cgi-bin/helo.pl?text=DS1621&amp;amp;action=Search DS1621]&lt;br /&gt;
** [http://www.datasheetcatalog.net/cgi-bin/helo.pl?text=lm75&amp;amp;action=Search LM75]&lt;br /&gt;
** [http://www.sensirion.com/en/pdf/product_information/Datasheet-humidity-sensor-SHT21.pdf SHT21]&lt;br /&gt;
** TMP101 von TexasInstruments&lt;br /&gt;
** TMP175 von TI (mehr als 8 Bausteine im gleichen Bus möglich)&lt;br /&gt;
&lt;br /&gt;
* Drucksensoren&lt;br /&gt;
** SMD500&lt;br /&gt;
** BMP085&lt;br /&gt;
&lt;br /&gt;
* Beschleunigungssensor&lt;br /&gt;
** [http://www.mikrocontroller.net/articles/BMA020 BMA020]&lt;br /&gt;
&lt;br /&gt;
=== Galvanische Trennung ===&lt;br /&gt;
* http://www.analog.com/static/imported-files/application_notes/AN_913.pdf&lt;br /&gt;
* http://www.analog.com/en/interface/digital-isolators/products/index.html#Isolated_I2C_Isolators&lt;br /&gt;
* http://www.mikrocontroller.net/attachment/5670/Galvanische_Trennung_fuer_I2C-Bus.pdf&lt;br /&gt;
* http://www.esacademy.com/en/library/technical-articles-and-documents/miscellaneous/i2c-bus/frequently-asked-questions/i2c-faq.html&lt;br /&gt;
* http://www.mikrocontroller.net/topic/17425#125464&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[AT91-TWI]]&lt;br /&gt;
* [[AVR TWI]]&lt;br /&gt;
* [[I2C als Hausbus]]&lt;br /&gt;
* Beitrag zu [http://www.mikrocontroller.net/topic/181115#1748880 I2C-Adressen] im Forum&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://ics.nxp.com/interface/ NXP (ehemals Philips) Produktseite]&lt;br /&gt;
* [http://www.nxp.com/acrobat/usermanuals/UM10204_3.pdf I2C Spezifikation 3.0]&lt;br /&gt;
* [http://www.i2c-bus.org I²C FAQ, Einführung, Hintergrundinformationen]&lt;br /&gt;
* [http://www.robotikhardware.de/download/rn_pc_i2c.pdf robotikhardware.de]&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheken ===&lt;br /&gt;
* [http://www.jtronics.de/elektronik-avr/lib-i2ctwi-avr.html AVR TWI Slave]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/235733#2398750 TWI MASTER in ASM]&lt;br /&gt;
&lt;br /&gt;
===I²C-Interface===&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/155136#1462320 Beitrag &amp;quot;i2c usb interface&amp;quot;] (Linux)&lt;br /&gt;
* [http://sprut.de/electronic/pic/projekte/usb4all/usb4all.htm USB4ALL bei sprut.de] universeller USB-Baustein, auch für I2C&lt;br /&gt;
&lt;br /&gt;
===I²C-Monitor===&lt;br /&gt;
*http://realterm.sourceforge.net/#I2C%20Bus&lt;br /&gt;
*http://www.avrfreaks.net/index.php?module=FreaksTools&amp;amp;func=viewItem&amp;amp;item_id=411&lt;br /&gt;
* [http://www.telos.info/ConniiMM20 Connii MM 2.0 - I²C Monitor with USB Interface]&lt;br /&gt;
* [http://www.telos.info/traciixl20 Tracii XL - High-End I²C Monitor]&lt;br /&gt;
*http://i2cchip.com/&lt;br /&gt;
* [http://www.ullihome.de/index.php/Hauptseite#USB_AVR-Lab I2C Logger Firmware für USB AVR-ISP]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/41535 I2C Monitor mit Mega8 (Firmware)]&lt;br /&gt;
* [http://warmcat.com/milksop/cheapi2c.html Cheapi2c] by Numbnut (Andy Green) uses your PC CPU (Linux only!) and printer port to perform realtime snooping of a standard 100kHz I2C bus with 100% capture.&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/103600#905495 I2C (TWI) Sniffer]. Basierend auf einem ATtiny85 mit Ausgabe auf RS232 (C und ASM).&lt;br /&gt;
* [http://en.radzio.dxp.pl/i2c-sniffer/ I2C/TWI bus sniffer/analyzer] (ATTiny2313 @ 20 MHz und USB über FTDI FT245RL oder UM245R)&lt;br /&gt;
* [http://www.i2cchip.com/start_bit_detector1.jpg I2C Startbit-Detector] auf [http://www.i2cchip.com/ www.i2cchip.com]&lt;br /&gt;
* [http://www.harbaum.org/till/i2c_tiny_usb/index.shtml i2c-tiny-usb open source/open hardware zum Auslesen mit einem PC]&lt;br /&gt;
&lt;br /&gt;
[[Category:I2C| ]]&lt;/div&gt;</summary>
		<author><name>Muebau</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=I%C2%B2C&amp;diff=62909</id>
		<title>I²C</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=I%C2%B2C&amp;diff=62909"/>
		<updated>2012-01-01T22:13:42Z</updated>

		<summary type="html">&lt;p&gt;Muebau: /* Bausteine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;I²C&#039;&#039;&#039; ist ein synchroner serieller Zweidraht-[[Bus]] (eine Daten- und eine Taktleitung), der für die Kommunikation zwischen [[IC]]s über kleine Distanzen geeignet ist. Entwickelt wurde er Anfang der 80er Jahre von Philips.&lt;br /&gt;
Gesprochen &amp;quot;I quadrat C&amp;quot; steht für IIC = Inter [[IC]] Bus. Aus Lizenzgründen heißt der I²C Bus bei manchen Herstellern auch &#039;&#039;&#039;TWI&#039;&#039;&#039;, two wire interface.&lt;br /&gt;
&lt;br /&gt;
== I2C ==&lt;br /&gt;
In einem I²C-Bus gibt es mindestens einen Master mit bis zu 127 Slaves und einen Broadcast Kanal. Ein I²C-Bus mit mehreren Mastern wird als &amp;quot;Multi-Master-Bus&amp;quot; bezeichnet.&lt;br /&gt;
Der (oder die) Master sprechen die Slaves an; ein Slave kann NIE selbstständig Daten senden. Dazu übernimmt der Master, der Daten senden oder empfangen möchte, den Bus und gibt die (7-bit- bzw. 10-bit-)Adresse des Slaves aus, mit dem er kommunizieren möchte. Nach der Adresse teilt der Master dem entsprechenden Slave mit, ob er Daten senden oder empfangen möchte. Danach werden die eigentlichen Daten (entweder vom Master oder Slave) auf den Bus gelegt. Hat der Master den Lese- oder Schreibvorgang abgeschlossen, so gibt er den Bus wieder frei.&lt;br /&gt;
Sofern mehrere Master vorhanden sind, stellt ein Protokoll sicher, dass sich diese nicht gegenseitig stören.&lt;br /&gt;
&lt;br /&gt;
=== I2C - Übertragungsraten  ===&lt;br /&gt;
Die Übertragungsrate beträgt beim standard mode bis zu 100 kbit/s, beim fast mode bis zu 400 kbit/s und beim high-speed mode bis zu 3,4 MBit/s. Falls die Taktrate für einen Slave zu hoch ist, kann er die Clock-Leitung auf Null ziehen und die Übertragung damit verlangsamen (sog. Clock Stretching). Dies ist auf Bit- wie auf Byte-Ebene möglich; ersteres allerdings nicht im high-speed mode.&lt;br /&gt;
Um längere Übertragungswege zu realisieren, kann man die Taktrate fast beliebig vermindern (einige Bausteine erzeugen aber irgendwann ein Time-Out). Mit einer Taktfrequenz von nur 5 kbit/s können dann durchaus mehrere Meter überbrückt werden.&lt;br /&gt;
&lt;br /&gt;
Im PC wird ein dem I²C-Bus sehr ähnliches System benutzt, um z.&amp;amp;nbsp;B. die Daten eines [[SDRAM]]-Modules auszulesen. Dieser nennt sich [[SMBus]] (System Management Bus).&lt;br /&gt;
&lt;br /&gt;
Erfahrungen mit den Atmegas (gemessene I2C-Taktfrequenzen):&lt;br /&gt;
* 16,000MHz - schafft sauber bis zu 700KHz&lt;br /&gt;
* 18,432MHz - schafft sauber bis zu 950KHz&lt;br /&gt;
&lt;br /&gt;
Selbst unter schlechten Bedingungen wie...&lt;br /&gt;
* 50cm 6-adriges Spiralkabel, frei schwingend verbaut in einem Rennwagen als Verbindung zwischen Lenkraddisplay und Amaturenbrett&lt;br /&gt;
* Nähe zu nicht geschirmten Leitungen mit 12V, GND und 5V PWM zum Dimmen von LEDs&lt;br /&gt;
* grausamen Umgebungsbedingungen, Fahrten im Regen, Schnee oder bei glühender Sonne und gefühlten 100° C ;-) auf der Rennstrecke.&lt;br /&gt;
hat der Bus ohne Probleme funktioniert.&lt;br /&gt;
&lt;br /&gt;
=== Bausteine ===&lt;br /&gt;
&lt;br /&gt;
Neben Mikrocontrollern gibt es eine Reihe von Peripheriebausteinen, die per I²C angeschlossen werden können. Eine gute Anlaufstelle bei der Suche ist die unten angegebene Seite des &amp;quot;Erfinders&amp;quot; Philips, heute als [http://www.nxp.com NXP] bekannt.&lt;br /&gt;
&lt;br /&gt;
*serielle [[Speicher#EEPROM | EEPROM]]s &lt;br /&gt;
** [http://www.datasheetcatalog.net/cgi-bin/helo.pl?text=24C01&amp;amp;action=Search 24Cxx]&lt;br /&gt;
** [http://ics.nxp.com/products/pcf/seeproms/ PCF85xx von NXP, 256-2048 Byte]&lt;br /&gt;
&lt;br /&gt;
*I/O-Portexpander&lt;br /&gt;
** [[I2C-Schaltmodul|PCF8574]]&lt;br /&gt;
** [http://www.mikrocontroller.net/part/MCP23008 MCP23008] (8-bit) von Microchip&lt;br /&gt;
** [http://www.mikrocontroller.net/part/MCP23017 MCP23017](16-bit) von Microchip&lt;br /&gt;
&lt;br /&gt;
* I2C MUX, zum Anschluss von ICs mit gleicher, fester Adresse&lt;br /&gt;
** [http://www.datasheetcatalog.org/cgi-bin/helo.pl?field=Nume&amp;amp;type=C&amp;amp;text=PCA9545A&amp;amp;producedby=&amp;amp;action=Search PCA9545A]&lt;br /&gt;
&lt;br /&gt;
* [[AD-Wandler]]&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/182614 12x12 Bit ADC MAX1238]&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/182614 12x10 Bit ADC MAX1138]&lt;br /&gt;
** [http://www.maxim-ic.com/datasheet/index.mvp/id/1890 MAX127 und MAX128 von Maxim, 12bit x8, PDIP24+SSOP28]&lt;br /&gt;
** [http://www.jtronics.de/platinen.html 12x8  Bit ADC MAX1038]&lt;br /&gt;
&lt;br /&gt;
* [[DA-Wandler]]&lt;br /&gt;
** [http://www.datasheetcatalog.net/cgi-bin/helo.pl?field=Nume&amp;amp;type=C&amp;amp;text=TDA8444&amp;amp;producedby=&amp;amp;action=Search TDA8444, 8x6Bit]&lt;br /&gt;
&lt;br /&gt;
* Uhrenbausteine&lt;br /&gt;
** [http://www.datasheetcatalog.net/cgi-bin/helo.pl?field=Nume&amp;amp;type=C&amp;amp;text=PCF8583&amp;amp;producedby=&amp;amp;action=Search PCF8583, mit 256 Bytes RAM]&lt;br /&gt;
** DS1307&lt;br /&gt;
&lt;br /&gt;
* [[LCD]]-Treiber&lt;br /&gt;
** [http://www.datasheetcatalog.net/cgi-bin/helo.pl?field=Nume&amp;amp;type=C&amp;amp;text=PCF8577&amp;amp;producedby=&amp;amp;action=Search PCF8577, 2x32 Segmente]&lt;br /&gt;
&lt;br /&gt;
* [[Temperatursensor|Temperatursensoren]]&lt;br /&gt;
** [http://www.datasheetcatalog.net/cgi-bin/helo.pl?text=DS1621&amp;amp;action=Search DS1621]&lt;br /&gt;
** [http://www.datasheetcatalog.net/cgi-bin/helo.pl?text=lm75&amp;amp;action=Search LM75]&lt;br /&gt;
** [http://www.sensirion.com/en/pdf/product_information/Datasheet-humidity-sensor-SHT21.pdf SHT21]&lt;br /&gt;
** TMP101 von TexasInstruments&lt;br /&gt;
** TMP175 von TI (mehr als 8 Bausteine im gleichen Bus möglich)&lt;br /&gt;
&lt;br /&gt;
* Drucksensoren&lt;br /&gt;
** SMD500&lt;br /&gt;
** BMP085&lt;br /&gt;
&lt;br /&gt;
* Beschleunigungssensor&lt;br /&gt;
** [http://www.mikrocontroller.net/part/BMA020 BMA020]&lt;br /&gt;
&lt;br /&gt;
=== Galvanische Trennung ===&lt;br /&gt;
* http://www.analog.com/static/imported-files/application_notes/AN_913.pdf&lt;br /&gt;
* http://www.analog.com/en/interface/digital-isolators/products/index.html#Isolated_I2C_Isolators&lt;br /&gt;
* http://www.mikrocontroller.net/attachment/5670/Galvanische_Trennung_fuer_I2C-Bus.pdf&lt;br /&gt;
* http://www.esacademy.com/en/library/technical-articles-and-documents/miscellaneous/i2c-bus/frequently-asked-questions/i2c-faq.html&lt;br /&gt;
* http://www.mikrocontroller.net/topic/17425#125464&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[AT91-TWI]]&lt;br /&gt;
* [[AVR TWI]]&lt;br /&gt;
* [[I2C als Hausbus]]&lt;br /&gt;
* Beitrag zu [http://www.mikrocontroller.net/topic/181115#1748880 I2C-Adressen] im Forum&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://ics.nxp.com/interface/ NXP (ehemals Philips) Produktseite]&lt;br /&gt;
* [http://www.nxp.com/acrobat/usermanuals/UM10204_3.pdf I2C Spezifikation 3.0]&lt;br /&gt;
* [http://www.i2c-bus.org I²C FAQ, Einführung, Hintergrundinformationen]&lt;br /&gt;
* [http://www.robotikhardware.de/download/rn_pc_i2c.pdf robotikhardware.de]&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheken ===&lt;br /&gt;
* [http://www.jtronics.de/elektronik-avr/lib-i2ctwi-avr.html AVR TWI Slave]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/235733#2398750 TWI MASTER in ASM]&lt;br /&gt;
&lt;br /&gt;
===I²C-Interface===&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/155136#1462320 Beitrag &amp;quot;i2c usb interface&amp;quot;] (Linux)&lt;br /&gt;
* [http://sprut.de/electronic/pic/projekte/usb4all/usb4all.htm USB4ALL bei sprut.de] universeller USB-Baustein, auch für I2C&lt;br /&gt;
&lt;br /&gt;
===I²C-Monitor===&lt;br /&gt;
*http://realterm.sourceforge.net/#I2C%20Bus&lt;br /&gt;
*http://www.avrfreaks.net/index.php?module=FreaksTools&amp;amp;func=viewItem&amp;amp;item_id=411&lt;br /&gt;
* [http://www.telos.info/ConniiMM20 Connii MM 2.0 - I²C Monitor with USB Interface]&lt;br /&gt;
* [http://www.telos.info/traciixl20 Tracii XL - High-End I²C Monitor]&lt;br /&gt;
*http://i2cchip.com/&lt;br /&gt;
* [http://www.ullihome.de/index.php/Hauptseite#USB_AVR-Lab I2C Logger Firmware für USB AVR-ISP]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/41535 I2C Monitor mit Mega8 (Firmware)]&lt;br /&gt;
* [http://warmcat.com/milksop/cheapi2c.html Cheapi2c] by Numbnut (Andy Green) uses your PC CPU (Linux only!) and printer port to perform realtime snooping of a standard 100kHz I2C bus with 100% capture.&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/103600#905495 I2C (TWI) Sniffer]. Basierend auf einem ATtiny85 mit Ausgabe auf RS232 (C und ASM).&lt;br /&gt;
* [http://en.radzio.dxp.pl/i2c-sniffer/ I2C/TWI bus sniffer/analyzer] (ATTiny2313 @ 20 MHz und USB über FTDI FT245RL oder UM245R)&lt;br /&gt;
* [http://www.i2cchip.com/start_bit_detector1.jpg I2C Startbit-Detector] auf [http://www.i2cchip.com/ www.i2cchip.com]&lt;br /&gt;
* [http://www.harbaum.org/till/i2c_tiny_usb/index.shtml i2c-tiny-usb open source/open hardware zum Auslesen mit einem PC]&lt;br /&gt;
&lt;br /&gt;
[[Category:I2C| ]]&lt;/div&gt;</summary>
		<author><name>Muebau</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_Eclipse&amp;diff=48791</id>
		<title>AVR Eclipse</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_Eclipse&amp;diff=48791"/>
		<updated>2010-06-28T09:50:15Z</updated>

		<summary type="html">&lt;p&gt;Muebau: /* Schritt für Schritt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieser Artikel beschreibt erste Erfahrungen mit Eclipse und der AVR-Toolchain.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  Allgemeines zu Eclipse ==&lt;br /&gt;
Eclipse ist eine IDE, die sich alleine nicht zur Programmierung von C/C++ eignet. Dafür gibt es dann das Eclipse-Plugin CDT (auch von ECLIPSE.ORG). Die CDT erweitert Eclipse mit der Möglichkeit, C/C++ zu programmieren. Das aber erstmal nur mit dem GCC. Um jetzt die Toolchain AVR-GCC (WINAVR) einzubinden, benötigt man noch ein weiteres Plugin (CDT AVRGCC oder auch CDT AVR Plugin). Es ist auch möglich, ohne die beiden letzt genannten Plugins zu arbeiten, dann sind die Einstellungen für den GCC an AVR-GCC anzupassen (unkomfortabler).&lt;br /&gt;
&lt;br /&gt;
==  Allgemeines zu dem AVR Eclipse Plugin ==&lt;br /&gt;
&lt;br /&gt;
Da dieser Artikel nicht immer auf dem neuesten Stand ist, bekommt man weitere Informationen auf der englischen [http://avr-eclipse.sourceforge.net/wiki/index.php/The_AVR_Eclipse_Plugin AVR Eclipse Plugin WIKI] Seite&lt;br /&gt;
&lt;br /&gt;
=== Eclipse Plugin Tutorials ===&lt;br /&gt;
&lt;br /&gt;
* Kurzanleitung zur Installation des [http://winavr.scienceprog.com/other-valuable-tools/using-eclipse-as-ide-for-winavr-compiler.html Plugins] (englisch).&lt;br /&gt;
&lt;br /&gt;
== Installation unter Windows ==&lt;br /&gt;
&lt;br /&gt;
=== Was wird benötigt? ===&lt;br /&gt;
==== Compiler ====&lt;br /&gt;
* [http://winavr.sourceforge.net/ WINAVR] AVR-GCC Compiler Toolchain, siehe auch Artikel [[WinAVR]]&lt;br /&gt;
&lt;br /&gt;
==== IDE ====&lt;br /&gt;
Eclipse braucht eine JAVA Runtime Enviroment, falls diese noch nicht installiert ist muss das auch noch heruntergeladen werden&lt;br /&gt;
* [http://java.sun.com/javase/downloads/index.jsp JDK 6 Update 10]&lt;br /&gt;
&lt;br /&gt;
Am einfachsten geht es, wenn man die Version mit dem integrierten CDT-Plugin verwendet.&lt;br /&gt;
Unter diesem Link die Aktuellste &#039;&#039;&#039;Eclipse IDE for C/C++ Developers&#039;&#039;&#039; downloaden&lt;br /&gt;
* [http://www.eclipse.org/downloads/ Eclipse IDE]&lt;br /&gt;
&lt;br /&gt;
Das zusätzliche AVR Plugin ist notwendig zum Einbinden des AVR-GCC. Kann hier heruntergeladen werden. Oder, besser, in einer installierten Eclipse Umgebung eingebunden werden.&lt;br /&gt;
* [http://sourceforge.net/projects/avr-eclipse CDT AVRGCC Plugin]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Programmer / Debugger ====&lt;br /&gt;
Zum Programmieren und Debuggen kann man eingentlich jedes beliebige Programm verwenden. Zum Debuggen kommt unter anderem AVaRICE zum Einsatz, mit dem man auch programmieren kann (JTAG).&lt;br /&gt;
Wahlweise ist auch AVRDUDE zum programmieren zu verwenden. Das kann man machen,&lt;br /&gt;
wie man möchte. Beide Programme sind in WINAVR (siehe oben unter Compiler) enthalten.&lt;br /&gt;
&lt;br /&gt;
=== Wie Installieren ===&lt;br /&gt;
WinAVR sollte auf dem System installiert sein. Siehe [[AVR_Eclipse#Compiler|oben]].&lt;br /&gt;
==== JAVA ====&lt;br /&gt;
&lt;br /&gt;
Java Runtime installieren.&lt;br /&gt;
&lt;br /&gt;
==== IDE ====&lt;br /&gt;
Eclipse ist in einem Zip Archiv, das an einen beliebigen Ort entpackt werden kann. Gestartet wird das Programm mit der Datei eclipse.exe. Meldet Eclipse beim Start einen Fehler, ist wahrscheinlich keine oder eine unpassende JAVA Runtime Enviroment installiert.&lt;br /&gt;
&lt;br /&gt;
==== Plugin ====&lt;br /&gt;
Es gibt zwei Möglichkeiten, wobei die [[AVR_Eclipse#.C3.9Cber_Updatesite:|erste]] empfohlen wird:&lt;br /&gt;
&lt;br /&gt;
===== Über Updatesite: =====&lt;br /&gt;
&lt;br /&gt;
* Eclipse starten. Zum Software Update Dialog gehen (Help &amp;gt; Install New Software ...)&lt;br /&gt;
&lt;br /&gt;
* In der Zeile Work with ... http://avr-eclipse.sourceforge.net/updatesite eintragen. &lt;br /&gt;
*Button Add anklicken. Einen Namen vergeben z.B. AVR-Eclipse. &lt;br /&gt;
*Neuste Version von AVR-Eclipse auswählen und installieren.&lt;br /&gt;
&lt;br /&gt;
===== Direkt installieren: ===== &lt;br /&gt;
Das Plugin ist ebenfalls eine ZIP-Datei die entpackt werden muss. Alle Dateien und Ordner im features Ordner müssen in den features Ordner von Eclipse kopiert werden. Alle Dateien und Ordner im Verzeichnis plugins müssen in den plugins Ordner von Eclipse kopiert werden.&lt;br /&gt;
&lt;br /&gt;
== Installation unter Linux ==&lt;br /&gt;
&lt;br /&gt;
===openSuSE===&lt;br /&gt;
Eclipse läßt sich einfach via zypper oder yast installieren:&lt;br /&gt;
&lt;br /&gt;
 zypper install eclipse&lt;br /&gt;
&lt;br /&gt;
Crosscompiler, avr-libc und avrdude:&lt;br /&gt;
&lt;br /&gt;
 zypper install avr-libc&lt;br /&gt;
&lt;br /&gt;
=== Gentoo ===&lt;br /&gt;
==== Eclipse-IDE ====&lt;br /&gt;
* [http://www.eclipse.org/downloads/index.php Eclipse-IDE] Version 3.1.0&lt;br /&gt;
* [http://www.eclipse.org/cdt/ Eclipse-CDT-Plugin] Version 3.0.0&lt;br /&gt;
* [http://sf.net/projects/avr-eclipse Eclipse-CDT-Addon for AVR] Version 20070404&lt;br /&gt;
&lt;br /&gt;
==== Compiler ====&lt;br /&gt;
crossdev emergen:&lt;br /&gt;
* emerge crossdev &lt;br /&gt;
Stabile Version der avr-toolchain inkl. g++ kompilieren:&lt;br /&gt;
* USE=&amp;quot;-nocxx&amp;quot; crossdev -s4 -S -t avr&lt;br /&gt;
&lt;br /&gt;
==== Programmer ====&lt;br /&gt;
* emerge uisp&lt;br /&gt;
&lt;br /&gt;
=== Debian ===&lt;br /&gt;
==== Eclipse-IDE ====&lt;br /&gt;
* [http://www.eclipse.org/downloads/index.php Eclipse-IDE] Version 3.1.0&lt;br /&gt;
* [http://www.eclipse.org/cdt/ Eclipse-CDT-Plugin] Version 3.0.0&lt;br /&gt;
* [http://sf.net/projects/avr-eclipse Eclipse-CDT-Addon for AVR] Version 20070404&lt;br /&gt;
&lt;br /&gt;
==== Compiler ====&lt;br /&gt;
* binutils-avr 2.15-3&lt;br /&gt;
* gcc-avr 1:3.4.3-2&lt;br /&gt;
* avr-libc 1:1.2.3-3&lt;br /&gt;
&lt;br /&gt;
==== Debugger ====&lt;br /&gt;
* simulavr 0.1.2.2-1&lt;br /&gt;
* gdb-avr 6.3-2&lt;br /&gt;
* ? avra 0.7-1&lt;br /&gt;
&lt;br /&gt;
==== Programmer ====&lt;br /&gt;
* AVRDUDE und die GUI [http://avr8-burn-o-mat.aaabbb.de/ avr8-burn-o-mat]&lt;br /&gt;
* uisp 20050207&lt;br /&gt;
* ? avrp&lt;br /&gt;
* ? avrprog&lt;br /&gt;
&lt;br /&gt;
=== Ubuntu 8.10 (Zum ersten) ===&lt;br /&gt;
==== Eclipse-IDE ====&lt;br /&gt;
* [http://www.eclipse.org/downloads Eclipse IDE for C/C++ Developers] Version 3.3, CDT Version 4.0&lt;br /&gt;
* [http://sourceforge.net/projects/avr-eclipse AVR-Eclipse-Plugin] Version 2.2.0&lt;br /&gt;
&lt;br /&gt;
==== Compiler ====&lt;br /&gt;
* binutils-avr: 2.18-3&lt;br /&gt;
* gcc-avr: 1:4.3.0-2&lt;br /&gt;
* avr-libc: 1:1.6.2-1&lt;br /&gt;
&lt;br /&gt;
==== Debugger ====&lt;br /&gt;
* [ftp://ftp.gnu.org/gnu/gdb/gdb-6.6.tar.bz2 avr-gdb]: 6.6; &#039;&#039;&#039;In den Repositories ist 6.4.90!&#039;&#039;&#039; &lt;br /&gt;
* avarice: 2.7-2&lt;br /&gt;
* simulavr: 0.1.2.2-6.1 (nicht getestet, sollte aber genauso funktionieren)&lt;br /&gt;
&lt;br /&gt;
==== Programmer ====&lt;br /&gt;
* avrdude: 5.5-3 und GUI [http://avr8-burn-o-mat.aaabbb.de/ avr8-burn-o-mat]&lt;br /&gt;
&lt;br /&gt;
==== Zusätzliche notwendige Programme/Libraries ====&lt;br /&gt;
* gcc&lt;br /&gt;
* binutils-avr&lt;br /&gt;
* build-essential&lt;br /&gt;
* ncurses-dev&lt;br /&gt;
&lt;br /&gt;
=== Ubuntu (Zum zweiten) ===&lt;br /&gt;
==== AVR-Toolchain ====&lt;br /&gt;
Leider ist in den Repositories nur eine veraltete Version von avr-gdb (bzw. gdb-avr) enthalten. Diese Version hat bei mir zu Fehlern geführt. Deshalb wird die aktuelle Releaseversion 6.6 verwendet.&lt;br /&gt;
&lt;br /&gt;
==== Schritt für Schritt ====&lt;br /&gt;
Als erstes werden die notwendigen Programme aus den Repositories installiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo apt-get install gcc gcc-avr avr-libc avrdude binutils-avr avarice build-essential ncurses-dev&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu 6.10:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo apt-get install gcc gcc-avr avr-libc avrdude binutils-avr avarice build-essential libncurses5-dev&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusätzlich können auch noch folgende Packages interessant sein:&lt;br /&gt;
* Simulavr: Ein Simulator für die AVR-Reihe&lt;br /&gt;
* uisp: Alternativer Downloader&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo apt-get install simulavr uisp&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt kann man bereits das AVR-Target ansprechen, um z.&amp;amp;nbsp;B. die Fuses auszulesen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;avarice -j /dev/ttyUSB0 -P atmega128 -r&amp;lt;/pre&amp;gt;&lt;br /&gt;
* -j: Gibt das Gerät an, mit dem das Target verbunden ist.&lt;br /&gt;
* -P: Zielarchitektur&lt;br /&gt;
* -r: Read Fuses&lt;br /&gt;
&lt;br /&gt;
Dazu ist die Manpage von avarice zu empfehlen: &lt;br /&gt;
&amp;lt;pre&amp;gt;man avarice&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als nächstes muss gdb-avr heruntergeladen und dann kompiliert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;wget ftp://ftp.gnu.org/gnu/gdb/gdb-6.6.tar.bz2&lt;br /&gt;
tar jxf gdb-6.6.tar.bz2&lt;br /&gt;
cd gdb-6.6&lt;br /&gt;
./configure --target=avr --prefix=/usr/local/avr&lt;br /&gt;
make&lt;br /&gt;
sudo make install&lt;br /&gt;
cd ..&lt;br /&gt;
rm -rf gdb-6.6&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies installiert die aktuelle Version von gdb-avr unter /usr/local/avr. Diesen Pfad könnte man zur PATH-Variable hinzufügen, dies ist allerdings nicht zwingend notwendig.&lt;br /&gt;
&lt;br /&gt;
Unter Ubuntu 8.10 kommt es bei der Installation zu Problemen.&lt;br /&gt;
Hier gibt es Abhilfe:&lt;br /&gt;
http://www.mikrocontroller.net/topic/76404#1198507&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zitat:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Fehlermeldung lautet ja:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avr-dis.c:xxx: error: format not a string literal and no format arguments&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
und Zeile xxx in dieser Datei lautet: &amp;lt;c&amp;gt;sprintf (buf, xyz);&amp;lt;/c&amp;gt; Wenn man das in &amp;lt;c&amp;gt;strcpy(buf, xyz);&amp;lt;/c&amp;gt; ändert, sollte es funktionieren.&lt;br /&gt;
&lt;br /&gt;
== Einrichten von Eclipse unter Windows ==&lt;br /&gt;
Beim ersten Start muss man einen Workspace angeben, dazu kann das vorgeschlagene Standardverzeichnis verwendet werden, wenn nur ein Benutzer diesen Workspace verwendet, ansonsten sollte man einen Ort auswählen, auf den alle Zugriff haben. Danach sollte das Bild so aussehen. Klicke auf Workbench.&lt;br /&gt;
&lt;br /&gt;
[[Bild:EclipseStart.png]]&lt;br /&gt;
&lt;br /&gt;
== Einrichten von Eclipse unter Linux ==&lt;br /&gt;
&lt;br /&gt;
=== Alternative 1 ===&lt;br /&gt;
&lt;br /&gt;
Das AVR-Eclipse Plugin kann über die Update-Site http://avr-eclipse.sourceforge.net/updatesite/ installiert werden. (Help-&amp;gt;Software Updates...)&lt;br /&gt;
&lt;br /&gt;
Zum Schluss muss noch, die avr-objsplit.bat-Datei, wie folgt, umgeschrieben, nach /usr/bin/avr-objsplit kopiert und ausführbar gemacht werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
avr-objcopy -j .text -j .data -O ihex *.elf flash.hex&lt;br /&gt;
avr-objcopy -j .eeprom --change-section-lma .eeprom=0 -O ihex *.elf eeprom.hex&lt;br /&gt;
if [ ! -f eeprom.hex ]; then&lt;br /&gt;
        echo &amp;quot;:00000001FF&amp;quot; &amp;gt; eeprom.hex&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ändern der Rechte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chmod +x avr-objsplit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Einstellungen ====&lt;br /&gt;
Jetzt müssen noch gewisse Einstellungen in Eclipse angepasst werden:&lt;br /&gt;
Unter Window-&amp;gt;Preferences-&amp;gt;AVR-&amp;gt;AVRdude:&lt;br /&gt;
&lt;br /&gt;
* Programmer auswählen&lt;br /&gt;
* Programmerport auswählen&lt;br /&gt;
* Target MCU Type auswählen&lt;br /&gt;
&lt;br /&gt;
==== Projekteinstellungen ====&lt;br /&gt;
Jetzt kann ein neues C-Project angelegt werden, wobei als Projekttyp &amp;quot;AVR Cross-Target Project&amp;quot; ausgewählt werden muss.&amp;lt;br/&amp;gt;Im &amp;quot;New Project Wizard&amp;quot; kann der MCU-Typ und die Quarzfrequenz eingestellt werden. Weitere Compiler-Optionen sind in den Projekteinstellungen unter &amp;quot;C/C++ Build-&amp;gt;Settings&amp;quot; möglich.&lt;br /&gt;
&lt;br /&gt;
=== Alternative 2 ===&lt;br /&gt;
&lt;br /&gt;
Dabei werden die Projekteinstellungen eines Standard-C-Projekts so verändert, dass die AVR-Toolchain verwendet wird.&lt;br /&gt;
&lt;br /&gt;
Mein erster erfolgreicher Versuch lief mit einen &amp;quot;managed C Projekt&amp;quot;. Ich hoffe in der folgenden Beschreibung fehlt kein Schritt:&lt;br /&gt;
* File / New / Managed Make C Project&lt;br /&gt;
** Project Name &#039;&#039;&#039;&amp;quot;test2&amp;quot; [Next]&#039;&#039;&#039;&lt;br /&gt;
** Project Type &#039;&#039;&#039;&amp;quot;Executable (GNU)&amp;quot; [Next]&#039;&#039;&#039;&lt;br /&gt;
** C/C++ Indexer &#039;&#039;&#039;&amp;quot;full ...&amp;quot; [Finish]&#039;&#039;&#039; (hab ich später geändert siehe unten)&lt;br /&gt;
&lt;br /&gt;
==== Projekteinstellungen ====&lt;br /&gt;
* File / New / SourceFile&lt;br /&gt;
** &#039;&#039;&#039;[Browse] &amp;quot;test2&amp;quot; [OK]&#039;&#039;&#039;&lt;br /&gt;
** Source File: &#039;&#039;&#039;&amp;quot;test2.c&amp;quot; [Finish]&#039;&#039;&#039;&lt;br /&gt;
* Project / Properties&lt;br /&gt;
** C/C++ Build / ToolSettings&lt;br /&gt;
*** GCC-C-Compiler&lt;br /&gt;
**** Command:  &#039;&#039;&#039;gcc&#039;&#039;&#039; ändern auf &#039;&#039;&#039;avr-gcc -mmcu=atmega16 -c&#039;&#039;&#039;&lt;br /&gt;
**** Das &#039;&#039;&#039;-c&#039;&#039;&#039; ist wichtig, damit nur kompliert aber nicht gelinkt wird.&lt;br /&gt;
**** Directorys Eintrag &#039;&#039;&#039;/usr/avr/include&#039;&#039;&#039; einfügen&lt;br /&gt;
**** Debugging  gewünschten Wert einstellen (z.&amp;amp;nbsp;B. -g)&lt;br /&gt;
*** GCC-C-Linker &lt;br /&gt;
**** Command:  &#039;&#039;&#039;gcc&#039;&#039;&#039; auch ändern auf &#039;&#039;&#039;avr-gcc -mmcu=atmega16 &#039;&#039;&#039;&lt;br /&gt;
**** Libraries: Library Search Path= &#039;&#039;&#039;/usr/avr&#039;&#039;&#039;&lt;br /&gt;
**** Miscellaneous: Linker Flags = &#039;&#039;&#039;-Wl,-Map,avr.map&#039;&#039;&#039;&lt;br /&gt;
*** GCC Assembler&lt;br /&gt;
**** Command:  &#039;&#039;&#039;as&#039;&#039;&#039; ändern auf &#039;&#039;avr-as&#039;&#039;&lt;br /&gt;
** C/C++ Build / Build Steps&lt;br /&gt;
*** Post-Build-Step&lt;br /&gt;
**** Command: &#039;&#039;&#039;avr-objcopy -j .text -j .data -O ihex test2 test2.hex&#039;&#039;&#039;&lt;br /&gt;
** C/C++ Indexer&lt;br /&gt;
*** Available Indexers = &#039;&#039;&#039;CTags Indexer (declarations only)&#039;&#039;&#039;&lt;br /&gt;
*** Include Files: Index Include paths &#039;&#039;&#039; einschalten&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== später eingefügt: ====&lt;br /&gt;
* Project / Properties&lt;br /&gt;
** C/C++ Build / Build Steps&lt;br /&gt;
*** Pre-Build-Step&lt;br /&gt;
**** Command: &#039;&#039;&#039;uisp -dprog=dasa2 -dserial=/dev/ttyS0 -dpart=atmega16 --erase&#039;&#039;&#039;&lt;br /&gt;
* Project / Properties&lt;br /&gt;
** C/C++ Build / Build Steps&lt;br /&gt;
*** Post-Build-Step&lt;br /&gt;
**** Command: &#039;&#039;&#039;avr_upload&#039;&#039;&#039;&lt;br /&gt;
* Project / Properties&lt;br /&gt;
** C/C++ Build / Build Settings&lt;br /&gt;
*** Build Output&lt;br /&gt;
**** Artifact Name: &#039;&#039;&#039;avr_main&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
avr_upload ist eine kleine Batchdatei im Verzeichniss &#039;&#039;&#039;/usr/bin &#039;&#039;&#039;, die ich neu angelegt hab:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
# .lst-Datei erzeugen (optional)&lt;br /&gt;
# avr-objdump -h -S avr_main &amp;gt; avr.lst&lt;br /&gt;
# Datei in Intel-hex erzeugen&lt;br /&gt;
avr-objcopy -j .text -j .data -O ihex avr_main avr.hex&lt;br /&gt;
# Intel-hex-Datei uploaden&lt;br /&gt;
#uisp -dprog=dasa2 -dserial=/dev/ttyS0 -dpart=atmega16 --upload if=avr.hex&lt;br /&gt;
# Intel-hex Datei uploaden und verifizieren.&lt;br /&gt;
uisp -dprog=dasa2 -dserial=/dev/ttyS0 -dpart=atmega16 --upload if=avr.hex --verify&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Eclipse Plugin ====&lt;br /&gt;
&lt;br /&gt;
Im Forum gibt es ein Plugin für Eclipse, das einen Großteil dieser Einstellungen bereits beinhaltet. Der Thread steht unter: &lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/forum/read-2-229419.html#new &lt;br /&gt;
&lt;br /&gt;
Das Plugin wird dort zum Download angeboten. Aber es ist sicher hilfreich die dortige Anleitung zu beachten.&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/attachment.php/285349/org.eclipse.cdt.avrgcc_1.0.16.zip&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HINWEIS:&#039;&#039;&#039; Bitte die aktuelle Version benutzen. Folgende Warnung bezieht sich auf die älteren Versionen (vor Version 1.0.14).&lt;br /&gt;
&#039;&#039;&#039;WARNUNG:&#039;&#039;&#039; Bei mir funktionierten Timer-Interrupts mit dem Plugin nicht (die jedoch tadellos mit der WinAVR Makefile funktionierten). Vielleicht habe ich nur eine Option übersehen, seid aber auf der Hut. Wenn ihr Unregelmäßigkeiten bei IRQs feststellt, versucht&#039;s erstmal ohne das Eclipse-Plugin (bevor ihr stundenlang an eurem Code und euch selbst zweifelt :-) ).&lt;br /&gt;
&lt;br /&gt;
== Projekt erstellen ==&lt;br /&gt;
[[Bild:NewProject.png]]&lt;br /&gt;
&lt;br /&gt;
Wichtig ist, dass man &#039;&#039;&#039;AVR Cross Target Application&#039;&#039;&#039; auswählt&lt;br /&gt;
&lt;br /&gt;
[[Bild:CreateProject.png]]&lt;br /&gt;
&lt;br /&gt;
Beim nächsten Schritt kann man auswählen, was für Konfigurationen man will. In den meisten Fällen reicht es aus, wenn man nur &#039;&#039;&#039;Release&#039;&#039;&#039; auswählt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:SelectConfigurations.png]]&lt;br /&gt;
&lt;br /&gt;
In diesem Schritt wählt man den Prozessor und die Taktfrequenz aus, wobei die Taktfrequenz in Hz angegeben werden muss&lt;br /&gt;
&lt;br /&gt;
[[Bild:TargetHardwareProperties.png]]&lt;br /&gt;
&lt;br /&gt;
== Erster Test ==&lt;br /&gt;
Die jeweiligen Alternativen beziehen sich auf die oben genannten verschiedenen Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
=== Aufbau ===&lt;br /&gt;
Die folgenden Angaben beziehen sich auf ein sehr einfaches Entwicklungsboard von Pollin, welches aber auch einfach nachgebaut werden kann. Den Schaltplan gibt&#039;s [http://www.pollin.de/shop/downloads/D810022B.PDF als PDF hier].&lt;br /&gt;
&lt;br /&gt;
==== Programm eintippen ====&lt;br /&gt;
(oder einfach von hier kopieren)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
#define running  1  &lt;br /&gt;
&lt;br /&gt;
// Unterprogramm mit Zeitschleife fuer ATMega16 ohne Quarz&lt;br /&gt;
void delay_ms( unsigned int ms )&lt;br /&gt;
{&lt;br /&gt;
    unsigned int  i;&lt;br /&gt;
    unsigned int  j;&lt;br /&gt;
       &lt;br /&gt;
    for ( i = ms;  i;  i-- ) &lt;br /&gt;
    {&lt;br /&gt;
        for ( j = 51;  j;  j-- )&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main( void )&lt;br /&gt;
{&lt;br /&gt;
    // PortD6 als Output konfigurieren&lt;br /&gt;
    DDRD |= _BV(PD6);&lt;br /&gt;
&lt;br /&gt;
    // Hauptschleife des Programms&lt;br /&gt;
    while ( running )&lt;br /&gt;
    {&lt;br /&gt;
    	// LED einschalten, und dann warten&lt;br /&gt;
        PORTD |= _BV(PD6);&lt;br /&gt;
        delay_ms( 1000 ); &lt;br /&gt;
        &lt;br /&gt;
    	// LED ausschalten, und dann warten&lt;br /&gt;
        PORTD &amp;amp;= ~_BV(PD6);&lt;br /&gt;
        delay_ms( 29000 );         &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um dass Programm zu kompilieren muss links im &#039;&#039;&#039;Project Explorer&#039;&#039;&#039; der Projektordner angeklickt werden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:MakeTarget.png]]&lt;br /&gt;
&lt;br /&gt;
Eine Konfiguration fügt man mit &#039;&#039;&#039;Add&#039;&#039;&#039; hinzu. In neuen Fenster gibt man als &#039;&#039;&#039;Target Name&#039;&#039;&#039; einen Namen ein. Der Name wird später unter anderem für den Dateinamen der HEX-Datei verwendet.&lt;br /&gt;
&lt;br /&gt;
[[Bild:MakeTargetOptions.png]]&lt;br /&gt;
&lt;br /&gt;
Die Einstellungen mit &#039;&#039;&#039;Create&#039;&#039;&#039; bestätigen und das andere Fenster mit &#039;&#039;&#039;Cancel&#039;&#039;&#039; schliessen. Ändert man nun eine Datei und speichert sie ab, wird das Projekt automatisch kompiliert. Das kann übrigens über &#039;&#039;&#039;Project&#039;&#039;&#039; --&amp;gt; &#039;&#039;&#039;Build Automatically&#039;&#039;&#039; geändert werden, da es bei grossen Projekten nachteilig ist, wenn der da die ganze Zeit kompiliert. Ob das ganze funktioniert hat kann man überprüfen, indem man auf &#039;&#039;&#039;Console&#039;&#039;&#039; klickt. Wenn das Kompilieren erfolgreich war, sollte die Ausgabe etwa so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
**** Build of configuration Release for project AVRTest ****&lt;br /&gt;
&lt;br /&gt;
make &lt;br /&gt;
Building target: AVRTest.elf&lt;br /&gt;
Invoking: AVR C Linker&lt;br /&gt;
avr-gcc -Wl,-Map,AVRTest.map -mmcu=atmega8 -o&amp;quot;AVRTest.elf&amp;quot;  ./main.o   &lt;br /&gt;
Finished building target: AVRTest.elf&lt;br /&gt;
 &lt;br /&gt;
Invoking: AVR Create Extended Listing&lt;br /&gt;
avr-objdump -h -S AVRTest.elf  &amp;gt;&amp;quot;AVRTest.lss&amp;quot;&lt;br /&gt;
Finished building: AVRTest.lss&lt;br /&gt;
 &lt;br /&gt;
Create Flash image (ihex format)&lt;br /&gt;
avr-objcopy -R .eeprom -O ihex AVRTest.elf  &amp;quot;AVRTest.hex&amp;quot;&lt;br /&gt;
Finished building: AVRTest.hex&lt;br /&gt;
 &lt;br /&gt;
Create eeprom image (ihex format)&lt;br /&gt;
avr-objcopy -j .eeprom --no-change-warnings --change-section-lma .eeprom=0 -O ihex AVRTest.elf  &amp;quot;AVRTest.eep&amp;quot;&lt;br /&gt;
Finished building: AVRTest.eep&lt;br /&gt;
 &lt;br /&gt;
Invoking: Print Size&lt;br /&gt;
avr-size --format=avr --mcu=atmega8 AVRTest.elf&lt;br /&gt;
AVR Memory Usage&lt;br /&gt;
----------------&lt;br /&gt;
Device: atmega8&lt;br /&gt;
&lt;br /&gt;
Program:     108 bytes (1.3% Full)&lt;br /&gt;
(.text + .data + .bootloader)&lt;br /&gt;
&lt;br /&gt;
Data:          0 bytes (0.0% Full)&lt;br /&gt;
(.data + .bss + .noinit)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finished building: sizedummy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Projekteinstellungen ==&lt;br /&gt;
=== Allgemein ===&lt;br /&gt;
Die Einstellungen können unter &#039;&#039;&#039;Project&#039;&#039;&#039; --&amp;gt; &#039;&#039;&#039;Properties&#039;&#039;&#039; --&amp;gt; &#039;&#039;&#039;C/C++ Build&#039;&#039;&#039; --&amp;gt; &#039;&#039;&#039;Settings&#039;&#039;&#039; vorgenommen werden. Auch hier muss man zuerst das Projekt im &#039;&#039;&#039;Project Explorer&#039;&#039;&#039; erstmal anklicken.&lt;br /&gt;
&lt;br /&gt;
[[Bild:ProjectProperties.png]]&lt;br /&gt;
&lt;br /&gt;
=== Prozessor / Taktfrequenz ===&lt;br /&gt;
Den Prozessor oder die Taktfrequenz kann man hier verändern&lt;br /&gt;
&#039;&#039;&#039;Project&#039;&#039;&#039; --&amp;gt; &#039;&#039;&#039;Properties&#039;&#039;&#039; --&amp;gt; &#039;&#039;&#039;AVR&#039;&#039;&#039; --&amp;gt; &#039;&#039;&#039;Target Hardware&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Prozessor brennen ==&lt;br /&gt;
=== AVRDude ===&lt;br /&gt;
Den Prozessor kann man mit dem &#039;&#039;&#039;AVR&#039;&#039;&#039; Button in der Symbolleiste direkt aus Eclipse heraus mit AVRDude programmieren, dafür muss man aber gewisse Einstellungen vornehmen.&lt;br /&gt;
&lt;br /&gt;
=== Programmierhardware auswählen ===&lt;br /&gt;
&#039;&#039;&#039;Project&#039;&#039;&#039; --&amp;gt; &#039;&#039;&#039;Properties&#039;&#039;&#039; --&amp;gt; &#039;&#039;&#039;AVR&#039;&#039;&#039; --&amp;gt; &#039;&#039;&#039;Target Hardware&#039;&#039;&#039; Danach klickt man auf den Tab &#039;&#039;&#039;Programmer&#039;&#039;&#039; und dann auf &#039;&#039;&#039;New&#039;&#039;&#039;. In der Liste wählt man einen Programmer aus und nimmt gegebenen falls zusätzliche Einstellungen vor.&lt;br /&gt;
&lt;br /&gt;
=== HEX-Datei auswählen ===&lt;br /&gt;
&#039;&#039;&#039;Project&#039;&#039;&#039; --&amp;gt; &#039;&#039;&#039;Properties&#039;&#039;&#039; --&amp;gt; &#039;&#039;&#039;AVR&#039;&#039;&#039; --&amp;gt; &#039;&#039;&#039;Target Hardware&#039;&#039;&#039; Danach klickt man auf den Tab Flash/EEPROM. Eigentlich reicht es aus, &#039;&#039;&#039;from Build&#039;&#039;&#039; auszuwählen.&lt;br /&gt;
&lt;br /&gt;
=== Fuse- / Lockbits ===&lt;br /&gt;
Zu den Fuse- bzw. Lockbits gibt es in den jeweiligen Tabs diverse Einstellmöglichkeiten.&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
&lt;br /&gt;
Debuggen funktioniert mit Eclipse entweder mit &#039;&#039;&#039;avarice&#039;&#039;&#039; oder &#039;&#039;&#039;simulavr&#039;&#039;&#039;, wobei ersteres zum OnDeviceDebugging dient und zweiteres einen Simulator darstellt. Zusätzlich ist &#039;&#039;&#039;avr-gdb&#039;&#039;&#039; notwendig, welches wie unter &#039;&#039;&#039;Installation unter Ubuntu&#039;&#039;&#039; beschrieben, installiert werden kann.&lt;br /&gt;
Einen Link zu einer Anleitung für das Debuggen mit Eclipse unter Windows findet ihr unten bei den [http://www.mikrocontroller.net/articles/AVR_Eclipse#Links Links].&lt;br /&gt;
&lt;br /&gt;
=== simulavr ===&lt;br /&gt;
&amp;lt;pre&amp;gt;simulavr -g -p 1212 -d atmega16 -P simulavr-disp&amp;lt;/pre&amp;gt;&lt;br /&gt;
startet den Simulator.&lt;br /&gt;
&lt;br /&gt;
=== avarice ===&lt;br /&gt;
&amp;lt;pre&amp;gt;avarice -j /dev/ttyS0 -P atmega128 :1212&amp;lt;/pre&amp;gt;&lt;br /&gt;
startet einen Server, der auf Port 1212 lauscht und das OnDeviceDebugging übernimmt.&lt;br /&gt;
&lt;br /&gt;
=== Eclipseeinstellungen ===&lt;br /&gt;
Unter Eclipse muss ein neues Debug-Target erzeugt werden, was in den Projekteinstellungen unter &#039;&#039;Run/Debug-Settings&#039;&#039; funktioniert. Es muss &#039;&#039;C/C++ application&#039;&#039; ausgewählt werden und folgende Einstellungen müssen geändert werden: &lt;br /&gt;
* Debugger&lt;br /&gt;
** gdbserver auswählen&lt;br /&gt;
** GDB debugger: Pfad zu avr-gdb (/usr/local/avr/bin/avr-gdb)&lt;br /&gt;
** &#039;&#039;verbose console mode&#039;&#039; einschalten&lt;br /&gt;
* Connection&lt;br /&gt;
** TCP, localhost, port 1212 (siehe simulavr/avarice-Aufruf).&lt;br /&gt;
&lt;br /&gt;
Unter Debugger muss für die Verwendung des Simulators Command-Datei mit folgendem Inhalt angegeben und daher auch erstellt werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
file link.elf&lt;br /&gt;
targ rem :1212&lt;br /&gt;
load&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
link.elf ist die Datei, welche durch den Build erstellt wird. Dies muss daher angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Beim On Device Debugging muss keine Command-Datei angegeben werden.&lt;br /&gt;
&lt;br /&gt;
=== Auslesen von IO-Registern ===&lt;br /&gt;
Wenn &#039;&#039;verbose console mode&#039;&#039; eingeschaltet ist, kann in diesem Konsolenfenster direkt mit avr-gdb kommuniziert werden. Dadurch können unter anderem die Register ausgelesen werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;p/x *(char *)Adresse&amp;lt;/pre&amp;gt; &lt;br /&gt;
gibt den Wert der Adresse als char aus.&lt;br /&gt;
&amp;lt;pre&amp;gt;p/t *(char *)Adresse&amp;lt;/pre&amp;gt;&lt;br /&gt;
returniert den Binärwert.&lt;br /&gt;
&lt;br /&gt;
Die Adresse setzt sich aus einer Startadresse und einem Offset zusammen, wobei diese sich im entsprechenden io-Header der Architektur befindet. Beispielweise setzt sich die Adresse für das UCSR0B-Register eines Atmega128 aus der Startadresse 0x800020 und dem Offset 0x0A zusammen.&lt;br /&gt;
&lt;br /&gt;
Für oft verwendete Register empfiehlt es sich, diesen mittels &lt;br /&gt;
&amp;lt;pre&amp;gt;set $name=(char *)Adresse&amp;lt;/pre&amp;gt;&lt;br /&gt;
einen Namen zuzuweisen. Diese könnte man in einer Datei speichern und diese als command-Datei beim Debugger angeben, wodurch man sich diese händischen Eingaben spart und mittels &lt;br /&gt;
&amp;lt;pre&amp;gt;p/x *$name&amp;lt;/pre&amp;gt; bzw. &amp;lt;pre&amp;gt;display *$name&amp;lt;/pre&amp;gt;&lt;br /&gt;
zugegreifen kann.&lt;br /&gt;
&lt;br /&gt;
=== AVR Studio ===&lt;br /&gt;
&lt;br /&gt;
Hinweise zum Debuggen mit [[AVR Studio]] (Windows) in einem Eclipse-Projekt gibt Marcel K. in http://www.mikrocontroller.net/topic/152059#1428733&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
[http://www.torsten-horn.de/techdocs/java-eclipse.htm Erste Schritte mit Eclipse]&lt;br /&gt;
&lt;br /&gt;
[http://avr-eclipse.sourceforge.net/wiki/index.php/Debugging Anleitung zum Debuggen mit Eclipse unter Windows]&lt;br /&gt;
&lt;br /&gt;
[http://www.wiki.elektronik-projekt.de/mikrocontroller/avr/avr_tutorials 3 Tuts für Eclipse mit AVRs]&lt;br /&gt;
&lt;br /&gt;
= Weiteres =&lt;br /&gt;
Bei Problemen kann dieser [http://www.mikrocontroller.net/topic/79965#667525 Thread] verwendet werden, in den ich, wann immer es sich bei mir ausgeht, schauen werde.&lt;br /&gt;
&lt;br /&gt;
Jeder ist aufgerufen hier weiterzumachen, wenn er mehr weiss, oder es besser gestalten kann.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR ]]&lt;/div&gt;</summary>
		<author><name>Muebau</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Compact_Plus_Blutzuckermessger%C3%A4t-Hardware&amp;diff=42409</id>
		<title>Compact Plus Blutzuckermessgerät-Hardware</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Compact_Plus_Blutzuckermessger%C3%A4t-Hardware&amp;diff=42409"/>
		<updated>2010-01-20T23:33:24Z</updated>

		<summary type="html">&lt;p&gt;Muebau: aufraeumen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hardware ==&lt;br /&gt;
=== Übersicht Hardware ===&lt;br /&gt;
* OLED Display 102×80 Pixel incl. 16 Helligkeitsstufen pro Pixel / SSD1325 /43x36 mm gesamt&lt;br /&gt;
* Atmega168PA&lt;br /&gt;
* DC/DC-Wandler (Regler und Drosseln)&lt;br /&gt;
* IR-Sender/Empfänger&lt;br /&gt;
* 3 Tasten (4 wenn man den Schließer der Klappe mitzählt)&lt;br /&gt;
* 2 Elektromotoren&lt;br /&gt;
* kleine Lichtschranke/Barcodescanner&lt;br /&gt;
* kleines Spektrometer (2 * LEDs rot, IR(?)-LED, Fotodiode)&lt;br /&gt;
* Betriebsspannung 3V (2*AAA)&lt;br /&gt;
* SMD Piezo-Summer&lt;br /&gt;
&lt;br /&gt;
=== Gerät als Ganzes ===&lt;br /&gt;
[[Bild:compact_plus.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
Das unzerlegte Gerät. Ganz links ist die Stechhilfe.&lt;br /&gt;
&lt;br /&gt;
=== Gerät zerlegen ===&lt;br /&gt;
Das Gehäuse besteht aus drei ineinander einrastenden Teilen (keine Schrauben). Relativ schadlose Demontage durch vorsichtiges Aufhebeln möglich.&lt;br /&gt;
Erst das Seitenteil (links) ganz oben und 2 cm von unten ausrasten.&lt;br /&gt;
Von unten anfangen die Gehäusehälften zu lösen, bis man sie über die Oberkante aufklappen kann.&lt;br /&gt;
&lt;br /&gt;
Die Platine selbst ist mit 2 Schrauben und ein paar Clipsen befestigt. Vor dem Entnehmen ist der untere Folienstecker abzuziehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:compact_plus_open.jpg|250px]]&lt;br /&gt;
&lt;br /&gt;
Das geöffnete Gerät ohne Platine.&lt;br /&gt;
Gut zu erkennen (im unverkleinertem Bild) sind die zwei Motoren und die Mechanik die dafür sorgen, dass die Aufbewarungstrommel gedreht und die Messstreifen herausgefahren werden können.&lt;br /&gt;
&lt;br /&gt;
=== Komponenten ===&lt;br /&gt;
&lt;br /&gt;
==== Board ====&lt;br /&gt;
Hochauflösende Scans beider Platinenseiten.&lt;br /&gt;
Die Bauteile sind nach bestem Wissen und Gewissen bezeichnet (für spätere Schaltpläne). Speziell bei den Widerständen und Kondensatoren ist noch eine Kontrolle notwendig. Ich habe dabei alle blauen und schwarzen Bauteile als Widerstände und alles graue und weiße als Kondensatoren gedeutet.&lt;br /&gt;
&lt;br /&gt;
Änderungen bitte mir (Netzwanze) melden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:AccuCheckL1.jpg|300px]][[Bild:AccuCheckL6.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
==== Stromversorgung ====&lt;br /&gt;
Die zwei AAA Zellen sind in Serie geschaltet.&lt;br /&gt;
Ein Schaltregler [IC7] erzeugt daraus 3.3 V.&lt;br /&gt;
Ein Schaltregler [IC6] erzeugt daraus 12 V für das OLED.&lt;br /&gt;
&lt;br /&gt;
==== Bauteilliste ====&lt;br /&gt;
&lt;br /&gt;
Nach bestem Wissen und Gewissen bestimmt durch Kombination aus Schaltplänen und Messungen. Bei Komponenten mit &amp;quot;(?)&amp;quot; bin ich mir nicht sicher.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bauteil || Größe&lt;br /&gt;
|-&lt;br /&gt;
| R1  || 820 kOhm&lt;br /&gt;
|-&lt;br /&gt;
| R35 || Temperaturfühler; NTC 10 kOhm bei 20°C (?)&lt;br /&gt;
|-&lt;br /&gt;
| R43 || 100 kOhm&lt;br /&gt;
|-&lt;br /&gt;
| R44 || 100 Ohm&lt;br /&gt;
|-&lt;br /&gt;
| R45 || 39 kOhm&lt;br /&gt;
|-&lt;br /&gt;
| R46 || 1 MOhm&lt;br /&gt;
|-&lt;br /&gt;
| C24 || 22 uF (?)&lt;br /&gt;
|-&lt;br /&gt;
| C38 || 4,7 uF&lt;br /&gt;
|-&lt;br /&gt;
| C39 || 4,7 uF&lt;br /&gt;
|-&lt;br /&gt;
| C44 || 100 nF&lt;br /&gt;
|-&lt;br /&gt;
| C45 || 470 nF (?)&lt;br /&gt;
|-&lt;br /&gt;
| C46 || 10 pF&lt;br /&gt;
|-&lt;br /&gt;
| L2 || 100 uH&lt;br /&gt;
|-&lt;br /&gt;
| IC1 || ASIC&lt;br /&gt;
|-&lt;br /&gt;
| IC2 || ATmega168A&lt;br /&gt;
|-&lt;br /&gt;
| IC3 || Atmel AT25640A SPI EEPROM&lt;br /&gt;
|-&lt;br /&gt;
| IC4 || NC7NP14 ULP Triple Inverter with Schmitt Trigger Input&lt;br /&gt;
|-&lt;br /&gt;
| IC5 || 74LVC1G86GV (Markierung V68)&lt;br /&gt;
|-&lt;br /&gt;
| IC6 || TPS61080 Step-up 12 V&lt;br /&gt;
|-&lt;br /&gt;
| IC7 || AS1329, Step-up 3,3 V&lt;br /&gt;
|-&lt;br /&gt;
| IC8 || BIG 01 A825MFL ????&lt;br /&gt;
|-&lt;br /&gt;
| IC9 || [[#IC9 (IR)|IR (TFDU2201)]]&lt;br /&gt;
|-&lt;br /&gt;
| Buzzer || [[#Buzzer|Piezo Schallwandler]]&lt;br /&gt;
|-&lt;br /&gt;
| D1 || BAT54W&lt;br /&gt;
|-&lt;br /&gt;
| XTAL1 || 32 Khz&lt;br /&gt;
|-&lt;br /&gt;
| XTAL2 || 4 Mhz&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Pinbelegung Mega168 ====&lt;br /&gt;
&lt;br /&gt;
Wie oben mittles Messungen ermittelt. Ohne Garantie auf Vollständigkeit und Richtigkeit.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Pin  || Port || Funktionen || Verwendung&lt;br /&gt;
|-&lt;br /&gt;
| 1  || PD3 || (PCINT19/OC2B/INT1)  || Taste Mitte (S2)&lt;br /&gt;
|-&lt;br /&gt;
| 2  || PD4 || (PCINT20/XCK/T0) || Display SCLK (XCLK)&lt;br /&gt;
|-&lt;br /&gt;
| 3  || GND ||  || GND&lt;br /&gt;
|-&lt;br /&gt;
| 4  || VCC ||  || VCC&lt;br /&gt;
|-&lt;br /&gt;
| 5  || GND ||  || GND&lt;br /&gt;
|-&lt;br /&gt;
| 6  || VCC ||  || VCC&lt;br /&gt;
|-&lt;br /&gt;
| 7  || PB6 || (PCINT6/XTAL1/TOSC1) || An 32,768(?)kHz Oszillator. Taktsignal auch ohne ASIC vorhanden.&lt;br /&gt;
|-&lt;br /&gt;
| 8  || PB7 || (PCINT7/XTAL2/TOSC2)  || enable 3.3V step-up&lt;br /&gt;
|-&lt;br /&gt;
| 9  || PD5 || (PCINT21/OC0B/T1) || VCC enable (12 V step-up)&lt;br /&gt;
|-&lt;br /&gt;
| 10  || PD6 || (PCINT22/OC0A/AIN0) || &lt;br /&gt;
|-&lt;br /&gt;
| 11  || PD7 || (PCINT23/AIN1) ||&lt;br /&gt;
|-&lt;br /&gt;
| 12  || PB0 || (PCINT0/CLKO/ICP1) || an Transistor T1 (schaltet 12 V über 100 Ohm gegen GND als Grundlast bzw. zum Entladen)&lt;br /&gt;
|-&lt;br /&gt;
| 13  || PB1 || (PCINT1/OC1A) || Display /CS&lt;br /&gt;
|-&lt;br /&gt;
| 14  || PB2 || (PCINT2/SS/OC1B) || Anschluss des [[#Buzzer|Buzzers]] möglich&lt;br /&gt;
|-&lt;br /&gt;
| 15  || PB3 || (PCINT3/OC2A/MOSI) || ISP MOSI&lt;br /&gt;
|-&lt;br /&gt;
| 16  || PB4 || (PCINT4/MISO) || ISP MISO&lt;br /&gt;
|-&lt;br /&gt;
| 17  || PB5 ||  (SCK/PCINT5) || ISP SCK&lt;br /&gt;
|-&lt;br /&gt;
| 18  || AVCC ||  || mit Beschaltung an VCC&lt;br /&gt;
|-&lt;br /&gt;
| 19  || ADC6 ||  || Batteriespannung (3.3Volt StepUp dafür abschalten)&lt;br /&gt;
|-&lt;br /&gt;
| 20  || AREF ||  || mit Beschaltung an VCC (REFS1=0, REFS0=1)&lt;br /&gt;
|-&lt;br /&gt;
| 21  || GND ||  || GND&lt;br /&gt;
|-&lt;br /&gt;
| 22  || ADC7 ||  ||  Ausgang des 3,3V step-up über Spannungsteiler. Mit Step-Up wird 707 gemessen, ohne ca. 637.&lt;br /&gt;
|-&lt;br /&gt;
| 23  || PC0 || (ADC0/PCINT8) || Batteriespannung über Spannungsteiler, bei voller Batterie ca. 638&lt;br /&gt;
|-&lt;br /&gt;
| 24  || PC1 || (ADC1/PCINT9) || Display D/C&lt;br /&gt;
|-&lt;br /&gt;
| 25  || PC2 || (ADC2/PCINT10) || Display RESET&lt;br /&gt;
|-&lt;br /&gt;
| 26  || PC3 || (ADC3/PCINT11) || &lt;br /&gt;
|-&lt;br /&gt;
| 27  || PC4 || (ADC4/SDA/PCINT12) || Taste Links (S1)&lt;br /&gt;
|-&lt;br /&gt;
| 28  || PC5 || (ADC5/SCL/PCINT13) || Taste rechts (S3)&lt;br /&gt;
|-&lt;br /&gt;
| 29  || PC6 || (RESET/PCINT14) || ISP Reset&lt;br /&gt;
|-&lt;br /&gt;
| 30  || PD0 || (RXD/PCINT16) || &lt;br /&gt;
|-&lt;br /&gt;
| 31  || PD1 || (TXD/PCINT17) || Display SDIN. Achtung, ist auch TxD (UART-SPI möglich)&lt;br /&gt;
|-&lt;br /&gt;
| 32  || PD2 || (INT0/PCINT18) ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Unbekanntes IC1 ====&lt;br /&gt;
&lt;br /&gt;
Hier mal der Dekodierte Barcode des noch Unbekannten IC1.&lt;br /&gt;
Der decodierte Text ist:&lt;br /&gt;
&lt;br /&gt;
 25SLEATM 8R4222 084420179+2P00+PLCMC&lt;br /&gt;
&lt;br /&gt;
[[Bild:AccuCheckDecodedMatrixCode.png|500px]]&lt;br /&gt;
&lt;br /&gt;
==== IC9 (IR) ====&lt;br /&gt;
&lt;br /&gt;
Ist wohl ein TFDU2201 ([http://www.vishay.com/docs/82539/tfdu2201.pdf Datenblatt]).&lt;br /&gt;
&lt;br /&gt;
[[Bild:Accu chek combo ir.png|320px]] [[Bild:AccuCheckIRDA(TFDU2201)Pinout.png|320px]]&lt;br /&gt;
&lt;br /&gt;
==== Buzzer ====&lt;br /&gt;
&lt;br /&gt;
Ist ein Piezo Schallwandler. Es ist möglich eine ihn mit PB2 des [[#Pinbelegung Mega168|mega168]] zu verbinden. Im Bereich &amp;quot;Kurzzeitwecker mit 7-Segment-Anzeige&amp;quot; auf adriano6&#039;s [[#Websites|Webseite]].&lt;br /&gt;
&lt;br /&gt;
==== Display ====&lt;br /&gt;
[[Bild:display.JPG|300px]]&lt;br /&gt;
&lt;br /&gt;
Das Display basiert auf OLED - Technologie und besitzt eine Auflösung von 102×80 Pixel, von denen jedes 16 Helligkeitsstufen darstellen kann.&lt;br /&gt;
Displaycontroller ist SSD1325.&lt;br /&gt;
&lt;br /&gt;
Detailierte Informationen zum Display gibts auf adriano6&#039;s [[#Websites|Webseite ]]&lt;br /&gt;
&lt;br /&gt;
===== Inbetriebnahme auf dem Board =====&lt;br /&gt;
&lt;br /&gt;
Es ist möglich das Display auf dem Board in Betrieb zu nehmen, wenn alle Komponenten bis auf:&lt;br /&gt;
R1, R43, R44, R45, R46, C24, C38, C39, C44, C45, C46, L2, IC6 und D1&lt;br /&gt;
entfernt werden.&lt;br /&gt;
T1 und R11 sind vermutlich als Grundlast zum Start des 12 V Step-up und zum Entladen des OLED beim Abschalten.&lt;br /&gt;
Die folgende Tabelle enthält die Pads des Atmega168 Footprints und die entsprechenden Pins am Display.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Pad am Atmega168 || Pin am Display&lt;br /&gt;
|-&lt;br /&gt;
| PD1 || SDIN&lt;br /&gt;
|-&lt;br /&gt;
| PD4 || SCLK&lt;br /&gt;
|-&lt;br /&gt;
| PC1 || D/C&lt;br /&gt;
|-&lt;br /&gt;
| PC2 || RESET&lt;br /&gt;
|-&lt;br /&gt;
| PB1 || /CS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Grafikbeschleunigung mit dem SSD1325 =====&lt;br /&gt;
&lt;br /&gt;
Mit dem im SSD1325 vorhandenen Befehlen Copy, DrawRectangle und HorizontalScolling kann man ein paar nette Animationen machen, bzw. dem ATmega eine Menge Arbeit abnehmen (Details zu Controller und Display stehen im Datenblatt und [[#Websites|hier ]]).&lt;br /&gt;
&lt;br /&gt;
Der Displaycontroller verfügt über ein 64x80 Bytes großes RAM, von dem das Display aber nur 51x80 Bytes (102x80 Pixel) darstellt, beginnend von Spalte 7 bis Spalte 57:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; width:60em&amp;quot;&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em&amp;quot; | Col0&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em&amp;quot; | ...&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em&amp;quot; | Col6&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em; background:#c0c0c0&amp;quot; | Col7&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em; background:#c0c0c0&amp;quot; | ...&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em; background:#c0c0c0&amp;quot; | Col56&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em; background:#c0c0c0&amp;quot; | Col57&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em&amp;quot; | Col58&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em&amp;quot; | ...&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em&amp;quot; | Col63&lt;br /&gt;
|- style=&amp;quot;width:3em&amp;quot;&lt;br /&gt;
| D7-4 || D3-0 || ... || ... || D7-4 || D3-0 || D7-4 || D3-0 || ... || ... || D7-4 || D3-0 || D7-4 || D3-0 || D7-4 || D3-0 || ... || ... || D7-4 || D3-0 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Schaltet man im Controller nun Wraparound für das Scrolling- und Copy-Commando ein, hängen Ende und Anfang der jeweiligen Zeile hintereinander:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; width:36em&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:6em&amp;quot; | Col58 || style=&amp;quot;width:6em&amp;quot; | ... || style=&amp;quot;width:6em&amp;quot; | Col63 || style=&amp;quot;width:6em&amp;quot; | Col0 || style=&amp;quot;width:6em&amp;quot; | ... || style=&amp;quot;width:6em&amp;quot; | Col6&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Aus Sicht des Copy- und DrawRectangle-Kommandos kann man jetzt folgendermaßen auf den nicht sichtbaren Bereich des Display-RAM zugreifen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; width:36em&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:6em&amp;quot; | Col58 || style=&amp;quot;width:6em&amp;quot; | ... || style=&amp;quot;width:6em&amp;quot; | Col63 || style=&amp;quot;width:6em&amp;quot; | Col64 || style=&amp;quot;width:6em&amp;quot; | ... || style=&amp;quot;width:6em&amp;quot; | Col70&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Um Daten in diesen Bereich zu bekommen, könnte man einen entsprechenden Bildschirmausschnitt definieren und die Daten einfach sequentiell da rein schreiben. Praktisch hat das aber nicht einwandfrei funktioniert. Besser schreibt man zuerst in den sichtbaren Bereich und kopiert dann den Block in den Bereich ab Spalte 58.&lt;br /&gt;
Statt jetzt Grafiken byteweise über die Schnittstelle in das RAM zu schreiben braucht man sie nur noch durch den Controller vom unsichtbaren Bereich (maximal 26x80 Pixel) in den sichtbaren kopieren zu lassen.&lt;br /&gt;
&lt;br /&gt;
Ich habe [http://www.mikrocontroller.net/topic/109648#1419368 eine kleine Demo] geschrieben, die mit dem Copy-Befehl 8 Sprites (sich drehende Bälle) fliegen läßt und bei jeder Randberührung eines Sprites einen Zähler erhöht. Im Hintergrund laufen je eine horizontale und vertikale Linie (Rechteck) durch.&lt;br /&gt;
Das Ganze verbraucht mit Software-SPI ca. 20% Rechenzeit des ATmega, bei Hardware-SPI sind es ca. 6%.&lt;br /&gt;
&lt;br /&gt;
Um auch in horizontaler Richtung eine pixelgenaue Bewegung zu erreichen, erstellt man für jedes Sprite zwei um jeweils ein Pixel verschobene Versionen, und kopiert diese nacheinander auf die selbe Spaltenposition.&lt;br /&gt;
&lt;br /&gt;
Das Timing ist etwas kritisch, da vom Controller keine Rückmeldung möglich ist, man muß ggf. die Wartezeit nach einem Kommando versuchsweise ermitteln. Schickt man das nächste Kommando zu früh ab, wird das gerade laufende abgebrochen, was nicht immer schön aussieht oder sogar den Controller zum Abstürzen bringt.&lt;br /&gt;
&lt;br /&gt;
Bei Ansteuerung mit Hardware-SPI muß man außerdem ca. 2us warten, bevor das CS-Signal deaktiviert werden kann.&lt;br /&gt;
&lt;br /&gt;
==== Spektrometer ====&lt;br /&gt;
[[Bild:Accu-Check_CompactPlus_BZ_Sensor.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
Im Grunde genommen, handelt es sich um eine Reflexlichtschranke mit zwei roten LEDs, einer vermutlich infraroten LED, sowie einer Fotodiode.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Accu-Check_CompactPlus_Photometer.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
=== Programmierung ===&lt;br /&gt;
==== AVRdude ==== &lt;br /&gt;
Auslesen der Fuses&lt;br /&gt;
 avrdude -p m168  -P /dev/ttyUSB0 -c avrispv2 -F -v&lt;br /&gt;
&lt;br /&gt;
 avrdude: Device signature = 0x1e940b&lt;br /&gt;
 avrdude: Expected signature for ATMEGA168 is 1E 94 06&lt;br /&gt;
 avrdude: safemode: lfuse reads as 42&lt;br /&gt;
 avrdude: safemode: hfuse reads as D6&lt;br /&gt;
 avrdude: safemode: efuse reads as 1&lt;br /&gt;
&lt;br /&gt;
==== Flashen mit AVRdude ====&lt;br /&gt;
Da die IDs von ATmega168 und ATmega168A abweichen, muss die Option -F mit avrdude verwendet werden.&lt;br /&gt;
 avrdude -p m168  -P /dev/ttyUSB0 -c avrispv2 -F -u -U flash:w:Oled-Demo.hex&lt;br /&gt;
&lt;br /&gt;
==== Fuses mit AVRdude ====&lt;br /&gt;
Der ATmega168A hat die Fuse CLKDIV8 eingeschaltet.&lt;br /&gt;
 avrdude -p m168  -P /dev/ttyUSB0 -c avrispv2 -F -U lfuse:w:0xC2:m&lt;br /&gt;
&lt;br /&gt;
=== Programme ===&lt;br /&gt;
==== µC ====&lt;br /&gt;
* GPS http://www.mikrocontroller.net/topic/109648#1385554&lt;br /&gt;
** http://www.mikrocontroller.net/topic/109648#1397017&lt;br /&gt;
&lt;br /&gt;
* Grafikdemo: http://www.mikrocontroller.net/topic/109648#1419368&lt;br /&gt;
** Video: http://vimeo.com/6609124&lt;br /&gt;
&lt;br /&gt;
* Kurzzeitwecker: http://www.mikrocontroller.net/topic/109648#1412841&lt;br /&gt;
** http://www.mikrocontroller.net/topic/109648#1427502&lt;br /&gt;
&lt;br /&gt;
* serielle Displaysteuerung: http://www.mikrocontroller.net/topic/109648#1487494&lt;br /&gt;
&lt;br /&gt;
==== PC ====&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/109648#1352701 gibt als Header gespeicherte Bilder auf std aus]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/109648#1353067 Erweiterter (ungetesteter) Konvertierer für Bilder in Format für Display]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
=== Technische Dokumente ===&lt;br /&gt;
* [http://www.crystalfontz.com/controllers/SSD1325_2.1.pdf Datenblatt für Display-Controller]&lt;br /&gt;
* [http://www.atmel.com/dyn/products/product_card.asp?PN=ATmega168PA AVR Produktseite ATmega168PA mit Datasheets ]&lt;br /&gt;
* [http://www.freshpatents.com/Device-for-analysis-of-a-sample-on-a-test-element-dt20081113ptan20080277280.php Patentschrift zu Gerät ]&lt;br /&gt;
&lt;br /&gt;
=== Websites ===&lt;br /&gt;
* [http://home.arcor.de/wehrsdorf/Oled-Display-Recycling.html Oled-Recycling Seite von adriano6]&lt;br /&gt;
&lt;br /&gt;
=== Diskussions Threads ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/109648 Hauptdiskussionsthread im Mikrocontrollernet ]&lt;br /&gt;
* [http://bascom-forum.de/index.php/topic,2754.0.html Umsetzung in Bascom (wer&#039;s mag) im Bascom-Forum]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/143806 Vorschlag für Display-Adapter-Platine]&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR-Projekte]]&lt;/div&gt;</summary>
		<author><name>Muebau</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Compact_Plus_Blutzuckermessger%C3%A4t-Hardware&amp;diff=42408</id>
		<title>Compact Plus Blutzuckermessgerät-Hardware</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Compact_Plus_Blutzuckermessger%C3%A4t-Hardware&amp;diff=42408"/>
		<updated>2010-01-20T23:16:24Z</updated>

		<summary type="html">&lt;p&gt;Muebau: /* IC9 (IR) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hardware ==&lt;br /&gt;
== Übersicht Hardware ==&lt;br /&gt;
* OLED Display 102×80 Pixel incl. 16 Helligkeitsstufen pro Pixel / SSD1325 /43x36 mm gesamt&lt;br /&gt;
* Atmega168PA&lt;br /&gt;
* DC/DC-Wandler (Regler und Drosseln)&lt;br /&gt;
* IR-Sender/Empfänger&lt;br /&gt;
* 3 Tasten (4 wenn man den Schließer der Klappe mitzählt)&lt;br /&gt;
* 2 Elektromotoren&lt;br /&gt;
* kleine Lichtschranke/Barcodescanner&lt;br /&gt;
* kleines Spektrometer (2 * LEDs rot, IR(?)-LED, Fotodiode)&lt;br /&gt;
* Betriebsspannung 3V (2*AAA)&lt;br /&gt;
* SMD Piezo-Summer&lt;br /&gt;
&lt;br /&gt;
== Gerät als Ganzes ==&lt;br /&gt;
[[Bild:compact_plus.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
Das unzerlegte Gerät. Ganz links ist die Stechhilfe.&lt;br /&gt;
&lt;br /&gt;
== Gerät zerlegen ==&lt;br /&gt;
Das Gehäuse besteht aus drei ineinander einrastenden Teilen (keine Schrauben). Relativ schadlose Demontage durch vorsichtiges Aufhebeln möglich.&lt;br /&gt;
Erst das Seitenteil (links) ganz oben und 2 cm von unten ausrasten.&lt;br /&gt;
Von unten anfangen die Gehäusehälften zu lösen, bis man sie über die Oberkante aufklappen kann.&lt;br /&gt;
&lt;br /&gt;
Die Platine selbst ist mit 2 Schrauben und ein paar Clipsen befestigt. Vor dem Entnehmen ist der untere Folienstecker abzuziehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:compact_plus_open.jpg|250px]]&lt;br /&gt;
&lt;br /&gt;
Das geöffnete Gerät ohne Platine.&lt;br /&gt;
Gut zu erkennen (im unverkleinertem Bild) sind die zwei Motoren und die Mechanik die dafür sorgen, dass die Aufbewarungstrommel gedreht und die Messstreifen herausgefahren werden können.&lt;br /&gt;
&lt;br /&gt;
== Komponenten ==&lt;br /&gt;
&lt;br /&gt;
=== Board ===&lt;br /&gt;
Hochauflösende Scans beider Platinenseiten.&lt;br /&gt;
Die Bauteile sind nach bestem Wissen und Gewissen bezeichnet (für spätere Schaltpläne). Speziell bei den Widerständen und Kondensatoren ist noch eine Kontrolle notwendig. Ich habe dabei alle blauen und schwarzen Bauteile als Widerstände und alles graue und weiße als Kondensatoren gedeutet.&lt;br /&gt;
&lt;br /&gt;
Änderungen bitte mir (Netzwanze) melden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:AccuCheckL1.jpg|300px]][[Bild:AccuCheckL6.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
=== Stromversorgung ===&lt;br /&gt;
Die zwei AAA Zellen sind in Serie geschaltet.&lt;br /&gt;
Ein Schaltregler [IC7] erzeugt daraus 3.3 V.&lt;br /&gt;
Ein Schaltregler [IC6] erzeugt daraus 12 V für das OLED.&lt;br /&gt;
&lt;br /&gt;
=== Komponenten ===&lt;br /&gt;
&lt;br /&gt;
Nach bestem Wissen und Gewissen bestimmt durch Kombination aus Schaltplänen und Messungen. Bei Komponenten mit &amp;quot;(?)&amp;quot; bin ich mir nicht sicher.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bauteil || Größe&lt;br /&gt;
|-&lt;br /&gt;
| R1  || 820 kOhm&lt;br /&gt;
|-&lt;br /&gt;
| R35 || Temperaturfühler; NTC 10 kOhm bei 20°C (?)&lt;br /&gt;
|-&lt;br /&gt;
| R43 || 100 kOhm&lt;br /&gt;
|-&lt;br /&gt;
| R44 || 100 Ohm&lt;br /&gt;
|-&lt;br /&gt;
| R45 || 39 kOhm&lt;br /&gt;
|-&lt;br /&gt;
| R46 || 1 MOhm&lt;br /&gt;
|-&lt;br /&gt;
| C24 || 22 uF (?)&lt;br /&gt;
|-&lt;br /&gt;
| C38 || 4,7 uF&lt;br /&gt;
|-&lt;br /&gt;
| C39 || 4,7 uF&lt;br /&gt;
|-&lt;br /&gt;
| C44 || 100 nF&lt;br /&gt;
|-&lt;br /&gt;
| C45 || 470 nF (?)&lt;br /&gt;
|-&lt;br /&gt;
| C46 || 10 pF&lt;br /&gt;
|-&lt;br /&gt;
| L2 || 100 uH&lt;br /&gt;
|-&lt;br /&gt;
| IC1 || ASIC&lt;br /&gt;
|-&lt;br /&gt;
| IC2 || ATmega168A&lt;br /&gt;
|-&lt;br /&gt;
| IC3 || Atmel AT25640A SPI EEPROM&lt;br /&gt;
|-&lt;br /&gt;
| IC4 || NC7NP14 ULP Triple Inverter with Schmitt Trigger Input&lt;br /&gt;
|-&lt;br /&gt;
| IC5 || 74LVC1G86GV (Markierung V68)&lt;br /&gt;
|-&lt;br /&gt;
| IC6 || TPS61080 Step-up 12 V&lt;br /&gt;
|-&lt;br /&gt;
| IC7 || AS1329, Step-up 3,3 V&lt;br /&gt;
|-&lt;br /&gt;
| IC8 || BIG 01 A825MFL ????&lt;br /&gt;
|-&lt;br /&gt;
| IC9 || [[#IC9 (IR)|IR (TFDU2201)]]&lt;br /&gt;
|-&lt;br /&gt;
| Buzzer || [[#Buzzer|Piezo Schallwandler]]&lt;br /&gt;
|-&lt;br /&gt;
| D1 || BAT54W&lt;br /&gt;
|-&lt;br /&gt;
| XTAL1 || 32 Khz&lt;br /&gt;
|-&lt;br /&gt;
| XTAL2 || 4 Mhz&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Unbekanntes IC1 ===&lt;br /&gt;
&lt;br /&gt;
Hier mal der Dekodierte Barcode des noch Unbekannten IC1.&lt;br /&gt;
Der decodierte Text ist:&lt;br /&gt;
&lt;br /&gt;
 25SLEATM 8R4222 084420179+2P00+PLCMC&lt;br /&gt;
&lt;br /&gt;
[[Bild:AccuCheckDecodedMatrixCode.png|500px]]&lt;br /&gt;
&lt;br /&gt;
=== Pinbelegung Mega168 ===&lt;br /&gt;
&lt;br /&gt;
Wie oben mittles Messungen ermittelt. Ohne Garantie auf Vollständigkeit und Richtigkeit.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Pin  || Port || Funktionen || Verwendung&lt;br /&gt;
|-&lt;br /&gt;
| 1  || PD3 || (PCINT19/OC2B/INT1)  || Taste Mitte (S2)&lt;br /&gt;
|-&lt;br /&gt;
| 2  || PD4 || (PCINT20/XCK/T0) || Display SCLK (XCLK)&lt;br /&gt;
|-&lt;br /&gt;
| 3  || GND ||  || GND&lt;br /&gt;
|-&lt;br /&gt;
| 4  || VCC ||  || VCC&lt;br /&gt;
|-&lt;br /&gt;
| 5  || GND ||  || GND&lt;br /&gt;
|-&lt;br /&gt;
| 6  || VCC ||  || VCC&lt;br /&gt;
|-&lt;br /&gt;
| 7  || PB6 || (PCINT6/XTAL1/TOSC1) || An 32,768(?)kHz Oszillator. Taktsignal auch ohne ASIC vorhanden.&lt;br /&gt;
|-&lt;br /&gt;
| 8  || PB7 || (PCINT7/XTAL2/TOSC2)  || enable 3.3V step-up&lt;br /&gt;
|-&lt;br /&gt;
| 9  || PD5 || (PCINT21/OC0B/T1) || VCC enable (12 V step-up)&lt;br /&gt;
|-&lt;br /&gt;
| 10  || PD6 || (PCINT22/OC0A/AIN0) || &lt;br /&gt;
|-&lt;br /&gt;
| 11  || PD7 || (PCINT23/AIN1) ||&lt;br /&gt;
|-&lt;br /&gt;
| 12  || PB0 || (PCINT0/CLKO/ICP1) || an Transistor T1 (schaltet 12 V über 100 Ohm gegen GND als Grundlast bzw. zum Entladen)&lt;br /&gt;
|-&lt;br /&gt;
| 13  || PB1 || (PCINT1/OC1A) || Display /CS&lt;br /&gt;
|-&lt;br /&gt;
| 14  || PB2 || (PCINT2/SS/OC1B) || Anschluss des [[#Buzzer|Buzzers]] möglich&lt;br /&gt;
|-&lt;br /&gt;
| 15  || PB3 || (PCINT3/OC2A/MOSI) || ISP MOSI&lt;br /&gt;
|-&lt;br /&gt;
| 16  || PB4 || (PCINT4/MISO) || ISP MISO&lt;br /&gt;
|-&lt;br /&gt;
| 17  || PB5 ||  (SCK/PCINT5) || ISP SCK&lt;br /&gt;
|-&lt;br /&gt;
| 18  || AVCC ||  || mit Beschaltung an VCC&lt;br /&gt;
|-&lt;br /&gt;
| 19  || ADC6 ||  || Batteriespannung (3.3Volt StepUp dafür abschalten)&lt;br /&gt;
|-&lt;br /&gt;
| 20  || AREF ||  || mit Beschaltung an VCC (REFS1=0, REFS0=1)&lt;br /&gt;
|-&lt;br /&gt;
| 21  || GND ||  || GND&lt;br /&gt;
|-&lt;br /&gt;
| 22  || ADC7 ||  ||  Ausgang des 3,3V step-up über Spannungsteiler. Mit Step-Up wird 707 gemessen, ohne ca. 637.&lt;br /&gt;
|-&lt;br /&gt;
| 23  || PC0 || (ADC0/PCINT8) || Batteriespannung über Spannungsteiler, bei voller Batterie ca. 638&lt;br /&gt;
|-&lt;br /&gt;
| 24  || PC1 || (ADC1/PCINT9) || Display D/C&lt;br /&gt;
|-&lt;br /&gt;
| 25  || PC2 || (ADC2/PCINT10) || Display RESET&lt;br /&gt;
|-&lt;br /&gt;
| 26  || PC3 || (ADC3/PCINT11) || &lt;br /&gt;
|-&lt;br /&gt;
| 27  || PC4 || (ADC4/SDA/PCINT12) || Taste Links (S1)&lt;br /&gt;
|-&lt;br /&gt;
| 28  || PC5 || (ADC5/SCL/PCINT13) || Taste rechts (S3)&lt;br /&gt;
|-&lt;br /&gt;
| 29  || PC6 || (RESET/PCINT14) || ISP Reset&lt;br /&gt;
|-&lt;br /&gt;
| 30  || PD0 || (RXD/PCINT16) || &lt;br /&gt;
|-&lt;br /&gt;
| 31  || PD1 || (TXD/PCINT17) || Display SDIN. Achtung, ist auch TxD (UART-SPI möglich)&lt;br /&gt;
|-&lt;br /&gt;
| 32  || PD2 || (INT0/PCINT18) ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== IC9 (IR) ===&lt;br /&gt;
&lt;br /&gt;
Ist wohl ein TFDU2201 ([http://www.vishay.com/docs/82539/tfdu2201.pdf Datenblatt]).&lt;br /&gt;
&lt;br /&gt;
[[Bild:Accu chek combo ir.png|320px]] [[Bild:AccuCheckIRDA(TFDU2201)Pinout.png|320px]]&lt;br /&gt;
&lt;br /&gt;
=== Buzzer ===&lt;br /&gt;
&lt;br /&gt;
Ist ein Piezo Schallwandler. Es ist möglich eine ihn mit PB2 des [[#Pinbelegung Mega168|mega168]] zu verbinden. Im Bereich &amp;quot;Kurzzeitwecker mit 7-Segment-Anzeige&amp;quot; auf adriano6&#039;s [[#Websites|Webseite]].&lt;br /&gt;
&lt;br /&gt;
==== AVRdude ==== &lt;br /&gt;
Auslesen der Fuses&lt;br /&gt;
 avrdude -p m168  -P /dev/ttyUSB0 -c avrispv2 -F -v&lt;br /&gt;
&lt;br /&gt;
 avrdude: Device signature = 0x1e940b&lt;br /&gt;
 avrdude: Expected signature for ATMEGA168 is 1E 94 06&lt;br /&gt;
 avrdude: safemode: lfuse reads as 42&lt;br /&gt;
 avrdude: safemode: hfuse reads as D6&lt;br /&gt;
 avrdude: safemode: efuse reads as 1&lt;br /&gt;
&lt;br /&gt;
==== Flashen mit AVRdude ====&lt;br /&gt;
Da die IDs von ATmega168 und ATmega168A abweichen, muss die Option -F mit avrdude verwendet werden.&lt;br /&gt;
 avrdude -p m168  -P /dev/ttyUSB0 -c avrispv2 -F -u -U flash:w:Oled-Demo.hex&lt;br /&gt;
&lt;br /&gt;
==== Fuses mit AVRdude ====&lt;br /&gt;
Der ATmega168A hat die Fuse CLKDIV8 eingeschaltet.&lt;br /&gt;
 avrdude -p m168  -P /dev/ttyUSB0 -c avrispv2 -F -U lfuse:w:0xC2:m&lt;br /&gt;
&lt;br /&gt;
=== Display ===&lt;br /&gt;
[[Bild:display.JPG|300px]]&lt;br /&gt;
&lt;br /&gt;
Das Display basiert auf OLED - Technologie und besitzt eine Auflösung von 102×80 Pixel, von denen jedes 16 Helligkeitsstufen darstellen kann.&lt;br /&gt;
Displaycontroller ist SSD1325.&lt;br /&gt;
&lt;br /&gt;
Detailierte Informationen zum Display gibts auf adriano6&#039;s [[#Websites|Webseite ]]&lt;br /&gt;
&lt;br /&gt;
==== Inbetriebnahme auf dem Board ====&lt;br /&gt;
&lt;br /&gt;
Es ist möglich das Display auf dem Board in Betrieb zu nehmen, wenn alle Komponenten bis auf:&lt;br /&gt;
R1, R43, R44, R45, R46, C24, C38, C39, C44, C45, C46, L2, IC6 und D1&lt;br /&gt;
entfernt werden.&lt;br /&gt;
T1 und R11 sind vermutlich als Grundlast zum Start des 12 V Step-up und zum Entladen des OLED beim Abschalten.&lt;br /&gt;
Die folgende Tabelle enthält die Pads des Atmega168 Footprints und die entsprechenden Pins am Display.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Pad am Atmega168 || Pin am Display&lt;br /&gt;
|-&lt;br /&gt;
| PD1 || SDIN&lt;br /&gt;
|-&lt;br /&gt;
| PD4 || SCLK&lt;br /&gt;
|-&lt;br /&gt;
| PC1 || D/C&lt;br /&gt;
|-&lt;br /&gt;
| PC2 || RESET&lt;br /&gt;
|-&lt;br /&gt;
| PB1 || /CS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Grafikbeschleunigung mit dem SSD1325 ===&lt;br /&gt;
&lt;br /&gt;
Mit dem im SSD1325 vorhandenen Befehlen Copy, DrawRectangle und HorizontalScolling kann man ein paar nette Animationen machen, bzw. dem ATmega eine Menge Arbeit abnehmen (Details zu Controller und Display stehen im Datenblatt und [[#Websites|hier ]]).&lt;br /&gt;
&lt;br /&gt;
Der Displaycontroller verfügt über ein 64x80 Bytes großes RAM, von dem das Display aber nur 51x80 Bytes (102x80 Pixel) darstellt, beginnend von Spalte 7 bis Spalte 57:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; width:60em&amp;quot;&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em&amp;quot; | Col0&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em&amp;quot; | ...&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em&amp;quot; | Col6&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em; background:#c0c0c0&amp;quot; | Col7&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em; background:#c0c0c0&amp;quot; | ...&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em; background:#c0c0c0&amp;quot; | Col56&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em; background:#c0c0c0&amp;quot; | Col57&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em&amp;quot; | Col58&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em&amp;quot; | ...&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em&amp;quot; | Col63&lt;br /&gt;
|- style=&amp;quot;width:3em&amp;quot;&lt;br /&gt;
| D7-4 || D3-0 || ... || ... || D7-4 || D3-0 || D7-4 || D3-0 || ... || ... || D7-4 || D3-0 || D7-4 || D3-0 || D7-4 || D3-0 || ... || ... || D7-4 || D3-0 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Schaltet man im Controller nun Wraparound für das Scrolling- und Copy-Commando ein, hängen Ende und Anfang der jeweiligen Zeile hintereinander:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; width:36em&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:6em&amp;quot; | Col58 || style=&amp;quot;width:6em&amp;quot; | ... || style=&amp;quot;width:6em&amp;quot; | Col63 || style=&amp;quot;width:6em&amp;quot; | Col0 || style=&amp;quot;width:6em&amp;quot; | ... || style=&amp;quot;width:6em&amp;quot; | Col6&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Aus Sicht des Copy- und DrawRectangle-Kommandos kann man jetzt folgendermaßen auf den nicht sichtbaren Bereich des Display-RAM zugreifen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; width:36em&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:6em&amp;quot; | Col58 || style=&amp;quot;width:6em&amp;quot; | ... || style=&amp;quot;width:6em&amp;quot; | Col63 || style=&amp;quot;width:6em&amp;quot; | Col64 || style=&amp;quot;width:6em&amp;quot; | ... || style=&amp;quot;width:6em&amp;quot; | Col70&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Um Daten in diesen Bereich zu bekommen, könnte man einen entsprechenden Bildschirmausschnitt definieren und die Daten einfach sequentiell da rein schreiben. Praktisch hat das aber nicht einwandfrei funktioniert. Besser schreibt man zuerst in den sichtbaren Bereich und kopiert dann den Block in den Bereich ab Spalte 58.&lt;br /&gt;
Statt jetzt Grafiken byteweise über die Schnittstelle in das RAM zu schreiben braucht man sie nur noch durch den Controller vom unsichtbaren Bereich (maximal 26x80 Pixel) in den sichtbaren kopieren zu lassen.&lt;br /&gt;
&lt;br /&gt;
Ich habe [http://www.mikrocontroller.net/topic/109648#1419368 eine kleine Demo] geschrieben, die mit dem Copy-Befehl 8 Sprites (sich drehende Bälle) fliegen läßt und bei jeder Randberührung eines Sprites einen Zähler erhöht. Im Hintergrund laufen je eine horizontale und vertikale Linie (Rechteck) durch.&lt;br /&gt;
Das Ganze verbraucht mit Software-SPI ca. 20% Rechenzeit des ATmega, bei Hardware-SPI sind es ca. 6%.&lt;br /&gt;
&lt;br /&gt;
Um auch in horizontaler Richtung eine pixelgenaue Bewegung zu erreichen, erstellt man für jedes Sprite zwei um jeweils ein Pixel verschobene Versionen, und kopiert diese nacheinander auf die selbe Spaltenposition.&lt;br /&gt;
&lt;br /&gt;
Das Timing ist etwas kritisch, da vom Controller keine Rückmeldung möglich ist, man muß ggf. die Wartezeit nach einem Kommando versuchsweise ermitteln. Schickt man das nächste Kommando zu früh ab, wird das gerade laufende abgebrochen, was nicht immer schön aussieht oder sogar den Controller zum Abstürzen bringt.&lt;br /&gt;
&lt;br /&gt;
Bei Ansteuerung mit Hardware-SPI muß man außerdem ca. 2us warten, bevor das CS-Signal deaktiviert werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Spektrometer ===&lt;br /&gt;
[[Bild:Accu-Check_CompactPlus_BZ_Sensor.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
Im Grunde genommen, handelt es sich um eine Reflexlichtschranke mit zwei roten LEDs, einer vermutlich infraroten LED, sowie einer Fotodiode.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Accu-Check_CompactPlus_Photometer.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
== Programme ==&lt;br /&gt;
=== µC ===&lt;br /&gt;
* GPS http://www.mikrocontroller.net/topic/109648#1385554&lt;br /&gt;
** http://www.mikrocontroller.net/topic/109648#1397017&lt;br /&gt;
&lt;br /&gt;
* Grafikdemo: http://www.mikrocontroller.net/topic/109648#1419368&lt;br /&gt;
** Video: http://vimeo.com/6609124&lt;br /&gt;
&lt;br /&gt;
* Kurzzeitwecker: http://www.mikrocontroller.net/topic/109648#1412841&lt;br /&gt;
** http://www.mikrocontroller.net/topic/109648#1427502&lt;br /&gt;
&lt;br /&gt;
* serielle Displaysteuerung: http://www.mikrocontroller.net/topic/109648#1487494&lt;br /&gt;
&lt;br /&gt;
=== PC ===&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/109648#1352701 gibt als Header gespeicherte Bilder auf std aus]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/109648#1353067 Erweiterter (ungetesteter) Konvertierer für Bilder in Format für Display]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
=== Technische Dokumente ===&lt;br /&gt;
* [http://www.crystalfontz.com/controllers/SSD1325_2.1.pdf Datenblatt für Display-Controller]&lt;br /&gt;
* [http://www.atmel.com/dyn/products/product_card.asp?PN=ATmega168PA AVR Produktseite ATmega168PA mit Datasheets ]&lt;br /&gt;
* [http://www.freshpatents.com/Device-for-analysis-of-a-sample-on-a-test-element-dt20081113ptan20080277280.php Patentschrift zu Gerät ]&lt;br /&gt;
&lt;br /&gt;
=== Websites ===&lt;br /&gt;
* [http://home.arcor.de/wehrsdorf/Oled-Display-Recycling.html Oled-Recycling Seite von adriano6]&lt;br /&gt;
&lt;br /&gt;
=== Diskussions Threads ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/109648 Hauptdiskussionsthread im Mikrocontrollernet ]&lt;br /&gt;
* [http://bascom-forum.de/index.php/topic,2754.0.html Umsetzung in Bascom (wer&#039;s mag) im Bascom-Forum]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/143806 Vorschlag für Display-Adapter-Platine]&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR-Projekte]]&lt;/div&gt;</summary>
		<author><name>Muebau</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:AccuCheckIRDA(TFDU2201)Pinout.png&amp;diff=42407</id>
		<title>Datei:AccuCheckIRDA(TFDU2201)Pinout.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:AccuCheckIRDA(TFDU2201)Pinout.png&amp;diff=42407"/>
		<updated>2010-01-20T23:15:38Z</updated>

		<summary type="html">&lt;p&gt;Muebau: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Muebau</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Compact_Plus_Blutzuckermessger%C3%A4t-Hardware&amp;diff=42278</id>
		<title>Compact Plus Blutzuckermessgerät-Hardware</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Compact_Plus_Blutzuckermessger%C3%A4t-Hardware&amp;diff=42278"/>
		<updated>2010-01-16T12:47:41Z</updated>

		<summary type="html">&lt;p&gt;Muebau: /* Komponenten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hardware ==&lt;br /&gt;
== Übersicht Hardware ==&lt;br /&gt;
* OLED Display 102×80 Pixel incl. 16 Helligkeitsstufen pro Pixel / SSD1325 /43x36 mm gesamt&lt;br /&gt;
* Atmega168PA&lt;br /&gt;
* DC/DC-Wandler (Regler und Drosseln)&lt;br /&gt;
* IR-Sender/Empfänger&lt;br /&gt;
* 3 Tasten (4 wenn man den Schließer der Klappe mitzählt)&lt;br /&gt;
* 2 Elektromotoren&lt;br /&gt;
* kleine Lichtschranke/Barcodescanner&lt;br /&gt;
* kleines Spektrometer (2 * LEDs rot, IR(?)-LED, Fotodiode)&lt;br /&gt;
* Betriebsspannung 3V (2*AAA)&lt;br /&gt;
* SMD Piezo-Summer&lt;br /&gt;
&lt;br /&gt;
== Gerät als Ganzes ==&lt;br /&gt;
[[Bild:compact_plus.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
Das unzerlegte Gerät. Ganz links ist die Stechhilfe.&lt;br /&gt;
&lt;br /&gt;
== Gerät zerlegen ==&lt;br /&gt;
Das Gehäuse besteht aus drei ineinander einrastenden Teilen (keine Schrauben). Relativ schadlose Demontage durch vorsichtiges Aufhebeln möglich.&lt;br /&gt;
Erst das Seitenteil (links) ganz oben und 2 cm von unten ausrasten.&lt;br /&gt;
Von unten anfangen die Gehäusehälften zu lösen, bis man sie über die Oberkante aufklappen kann.&lt;br /&gt;
&lt;br /&gt;
Die Platine selbst ist mit 2 Schrauben und ein paar Clipsen befestigt. Vor dem Entnehmen ist der untere Folienstecker abzuziehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:compact_plus_open.jpg|250px]]&lt;br /&gt;
&lt;br /&gt;
Das geöffnete Gerät ohne Platine.&lt;br /&gt;
Gut zu erkennen (im unverkleinertem Bild) sind die zwei Motoren und die Mechanik die dafür sorgen, dass die Aufbewarungstrommel gedreht und die Messstreifen herausgefahren werden können.&lt;br /&gt;
&lt;br /&gt;
== Komponenten ==&lt;br /&gt;
&lt;br /&gt;
=== Board ===&lt;br /&gt;
Hochauflösende Scans beider Platinenseiten.&lt;br /&gt;
Die Bauteile sind nach bestem Wissen und Gewissen bezeichnet (für spätere Schaltpläne). Speziell bei den Widerständen und Kondensatoren ist noch eine Kontrolle notwendig. Ich habe dabei alle blauen und schwarzen Bauteile als Widerstände und alles graue und weiße als Kondensatoren gedeutet.&lt;br /&gt;
&lt;br /&gt;
Änderungen bitte mir (Netzwanze) melden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:AccuCheckL1.jpg|300px]][[Bild:AccuCheckL6.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
=== Stromversorgung ===&lt;br /&gt;
Die zwei AAA Zellen sind in Serie geschaltet.&lt;br /&gt;
Ein Schaltregler [IC7] erzeugt daraus 3.3 V.&lt;br /&gt;
Ein Schaltregler [IC6] erzeugt daraus 12 V für das OLED.&lt;br /&gt;
&lt;br /&gt;
=== Komponenten ===&lt;br /&gt;
&lt;br /&gt;
Nach bestem Wissen und Gewissen bestimmt durch Kombination aus Schaltplänen und Messungen. Bei Komponenten mit &amp;quot;(?)&amp;quot; bin ich mir nicht sicher.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bauteil || Größe&lt;br /&gt;
|-&lt;br /&gt;
| R1  || 820 kOhm&lt;br /&gt;
|-&lt;br /&gt;
| R35 || Temperaturfühler; NTC 10 kOhm bei 20°C (?)&lt;br /&gt;
|-&lt;br /&gt;
| R43 || 100 kOhm&lt;br /&gt;
|-&lt;br /&gt;
| R44 || 100 Ohm&lt;br /&gt;
|-&lt;br /&gt;
| R45 || 39 kOhm&lt;br /&gt;
|-&lt;br /&gt;
| R46 || 1 MOhm&lt;br /&gt;
|-&lt;br /&gt;
| C24 || 22 uF (?)&lt;br /&gt;
|-&lt;br /&gt;
| C38 || 4,7 uF&lt;br /&gt;
|-&lt;br /&gt;
| C39 || 4,7 uF&lt;br /&gt;
|-&lt;br /&gt;
| C44 || 100 nF&lt;br /&gt;
|-&lt;br /&gt;
| C45 || 470 nF (?)&lt;br /&gt;
|-&lt;br /&gt;
| C46 || 10 pF&lt;br /&gt;
|-&lt;br /&gt;
| L2 || 100 uH&lt;br /&gt;
|-&lt;br /&gt;
| IC1 || ASIC&lt;br /&gt;
|-&lt;br /&gt;
| IC2 || ATmega168A&lt;br /&gt;
|-&lt;br /&gt;
| IC3 || Atmel AT25640A SPI EEPROM&lt;br /&gt;
|-&lt;br /&gt;
| IC4 || NC7NP14 ULP Triple Inverter with Schmitt Trigger Input&lt;br /&gt;
|-&lt;br /&gt;
| IC5 || 74LVC1G86GV (Markierung V68)&lt;br /&gt;
|-&lt;br /&gt;
| IC6 || TPS61080 Step-up 12 V&lt;br /&gt;
|-&lt;br /&gt;
| IC7 || AS1329, Step-up 3,3 V&lt;br /&gt;
|-&lt;br /&gt;
| IC8 || BIG 01 A825MFL ????&lt;br /&gt;
|-&lt;br /&gt;
| IC9 || [[#IC9 (IR)|IR (TFDU2201)]]&lt;br /&gt;
|-&lt;br /&gt;
| Buzzer || [[#Buzzer|Piezo Schallwandler]]&lt;br /&gt;
|-&lt;br /&gt;
| D1 || BAT54W&lt;br /&gt;
|-&lt;br /&gt;
| XTAL1 || 32 Khz&lt;br /&gt;
|-&lt;br /&gt;
| XTAL2 || 4 Mhz&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Unbekanntes IC1 ===&lt;br /&gt;
&lt;br /&gt;
Hier mal der Dekodierte Barcode des noch Unbekannten IC1.&lt;br /&gt;
Der decodierte Text ist:&lt;br /&gt;
&lt;br /&gt;
 25SLEATM 8R4222 084420179+2P00+PLCMC&lt;br /&gt;
&lt;br /&gt;
[[Bild:AccuCheckDecodedMatrixCode.png|500px]]&lt;br /&gt;
&lt;br /&gt;
=== Pinbelegung Mega168 ===&lt;br /&gt;
&lt;br /&gt;
Wie oben mittles Messungen ermittelt. Ohne Garantie auf Vollständigkeit und Richtigkeit.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Pin  || Port || Funktionen || Verwendung&lt;br /&gt;
|-&lt;br /&gt;
| 1  || PD3 || (PCINT19/OC2B/INT1)  || Taste Mitte (S2)&lt;br /&gt;
|-&lt;br /&gt;
| 2  || PD4 || (PCINT20/XCK/T0) || Display SCLK (XCLK)&lt;br /&gt;
|-&lt;br /&gt;
| 3  || GND ||  || GND&lt;br /&gt;
|-&lt;br /&gt;
| 4  || VCC ||  || VCC&lt;br /&gt;
|-&lt;br /&gt;
| 5  || GND ||  || GND&lt;br /&gt;
|-&lt;br /&gt;
| 6  || VCC ||  || VCC&lt;br /&gt;
|-&lt;br /&gt;
| 7  || PB6 || (PCINT6/XTAL1/TOSC1) || An 32,768(?)kHz Oszillator. Taktsignal auch ohne ASIC vorhanden.&lt;br /&gt;
|-&lt;br /&gt;
| 8  || PB7 || (PCINT7/XTAL2/TOSC2)  || enable 3.3V step-up&lt;br /&gt;
|-&lt;br /&gt;
| 9  || PD5 || (PCINT21/OC0B/T1) || VCC enable (12 V step-up)&lt;br /&gt;
|-&lt;br /&gt;
| 10  || PD6 || (PCINT22/OC0A/AIN0) || &lt;br /&gt;
|-&lt;br /&gt;
| 11  || PD7 || (PCINT23/AIN1) ||&lt;br /&gt;
|-&lt;br /&gt;
| 12  || PB0 || (PCINT0/CLKO/ICP1) || an Transistor T1 (schaltet 12 V über 100 Ohm gegen GND als Grundlast bzw. zum Entladen)&lt;br /&gt;
|-&lt;br /&gt;
| 13  || PB1 || (PCINT1/OC1A) || Display /CS&lt;br /&gt;
|-&lt;br /&gt;
| 14  || PB2 || (PCINT2/SS/OC1B) || Anschluss des [[#Buzzer|Buzzers]] möglich&lt;br /&gt;
|-&lt;br /&gt;
| 15  || PB3 || (PCINT3/OC2A/MOSI) || ISP MOSI&lt;br /&gt;
|-&lt;br /&gt;
| 16  || PB4 || (PCINT4/MISO) || ISP MISO&lt;br /&gt;
|-&lt;br /&gt;
| 17  || PB5 ||  (SCK/PCINT5) || ISP SCK&lt;br /&gt;
|-&lt;br /&gt;
| 18  || AVCC ||  || mit Beschaltung an VCC&lt;br /&gt;
|-&lt;br /&gt;
| 19  || ADC6 ||  || Batteriespannung (3.3Volt StepUp dafür abschalten)&lt;br /&gt;
|-&lt;br /&gt;
| 20  || AREF ||  || mit Beschaltung an VCC (REFS1=0, REFS0=1)&lt;br /&gt;
|-&lt;br /&gt;
| 21  || GND ||  || GND&lt;br /&gt;
|-&lt;br /&gt;
| 22  || ADC7 ||  ||  Ausgang des 3,3V step-up über Spannungsteiler. Mit Step-Up wird 707 gemessen, ohne ca. 637.&lt;br /&gt;
|-&lt;br /&gt;
| 23  || PC0 || (ADC0/PCINT8) || Batteriespannung über Spannungsteiler, bei voller Batterie ca. 638&lt;br /&gt;
|-&lt;br /&gt;
| 24  || PC1 || (ADC1/PCINT9) || Display D/C&lt;br /&gt;
|-&lt;br /&gt;
| 25  || PC2 || (ADC2/PCINT10) || Display RESET&lt;br /&gt;
|-&lt;br /&gt;
| 26  || PC3 || (ADC3/PCINT11) || &lt;br /&gt;
|-&lt;br /&gt;
| 27  || PC4 || (ADC4/SDA/PCINT12) || Taste Links (S1)&lt;br /&gt;
|-&lt;br /&gt;
| 28  || PC5 || (ADC5/SCL/PCINT13) || Taste rechts (S3)&lt;br /&gt;
|-&lt;br /&gt;
| 29  || PC6 || (RESET/PCINT14) || ISP Reset&lt;br /&gt;
|-&lt;br /&gt;
| 30  || PD0 || (RXD/PCINT16) || &lt;br /&gt;
|-&lt;br /&gt;
| 31  || PD1 || (TXD/PCINT17) || Display SDIN. Achtung, ist auch TxD (UART-SPI möglich)&lt;br /&gt;
|-&lt;br /&gt;
| 32  || PD2 || (INT0/PCINT18) ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== IC9 (IR) ===&lt;br /&gt;
&lt;br /&gt;
Ist wohl ein TFDU2201 ([http://www.vishay.com/docs/82539/tfdu2201.pdf Datenblatt]).&lt;br /&gt;
&lt;br /&gt;
[[Bild:Accu chek combo ir.png|320px]]&lt;br /&gt;
&lt;br /&gt;
=== Buzzer ===&lt;br /&gt;
&lt;br /&gt;
Ist ein Piezo Schallwandler. Es ist möglich eine ihn mit PB2 des [[#Pinbelegung Mega168|mega168]] zu verbinden. Im Bereich &amp;quot;Kurzzeitwecker mit 7-Segment-Anzeige&amp;quot; auf adriano6&#039;s [[#Websites|Webseite]].&lt;br /&gt;
&lt;br /&gt;
==== AVRdude ==== &lt;br /&gt;
Auslesen der Fuses&lt;br /&gt;
 avrdude -p m168  -P /dev/ttyUSB0 -c avrispv2 -F -v&lt;br /&gt;
&lt;br /&gt;
 avrdude: Device signature = 0x1e940b&lt;br /&gt;
 avrdude: Expected signature for ATMEGA168 is 1E 94 06&lt;br /&gt;
 avrdude: safemode: lfuse reads as 42&lt;br /&gt;
 avrdude: safemode: hfuse reads as D6&lt;br /&gt;
 avrdude: safemode: efuse reads as 1&lt;br /&gt;
&lt;br /&gt;
==== Flashen mit AVRdude ====&lt;br /&gt;
Da die IDs von ATmega168 und ATmega168A abweichen, muss die Option -F mit avrdude verwendet werden.&lt;br /&gt;
 avrdude -p m168  -P /dev/ttyUSB0 -c avrispv2 -F -u -U flash:w:Oled-Demo.hex&lt;br /&gt;
&lt;br /&gt;
==== Fuses mit AVRdude ====&lt;br /&gt;
Der ATmega168A hat die Fuse CLKDIV8 eingeschaltet.&lt;br /&gt;
 avrdude -p m168  -P /dev/ttyUSB0 -c avrispv2 -F -U lfuse:w:0xC2:m&lt;br /&gt;
&lt;br /&gt;
=== Display ===&lt;br /&gt;
[[Bild:display.JPG|300px]]&lt;br /&gt;
&lt;br /&gt;
Das Display basiert auf OLED - Technologie und besitzt eine Auflösung von 102×80 Pixel, von denen jedes 16 Helligkeitsstufen darstellen kann.&lt;br /&gt;
Displaycontroller ist SSD1325.&lt;br /&gt;
&lt;br /&gt;
Detailierte Informationen zum Display gibts auf adriano6&#039;s [[#Websites|Webseite ]]&lt;br /&gt;
&lt;br /&gt;
==== Inbetriebnahme auf dem Board ====&lt;br /&gt;
&lt;br /&gt;
Es ist möglich das Display auf dem Board in Betrieb zu nehmen, wenn alle Komponenten bis auf:&lt;br /&gt;
R1, R43, R44, R45, R46, C24, C38, C39, C44, C45, C46, L2, IC6 und D1&lt;br /&gt;
entfernt werden.&lt;br /&gt;
T1 und R11 sind vermutlich als Grundlast zum Start des 12 V Step-up und zum Entladen des OLED beim Abschalten.&lt;br /&gt;
Die folgende Tabelle enthält die Pads des Atmega168 Footprints und die entsprechenden Pins am Display.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Pad am Atmega168 || Pin am Display&lt;br /&gt;
|-&lt;br /&gt;
| PD1 || SDIN&lt;br /&gt;
|-&lt;br /&gt;
| PD4 || SCLK&lt;br /&gt;
|-&lt;br /&gt;
| PC1 || D/C&lt;br /&gt;
|-&lt;br /&gt;
| PC2 || RESET&lt;br /&gt;
|-&lt;br /&gt;
| PB1 || /CS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Grafikbeschleunigung mit dem SSD1325 ===&lt;br /&gt;
&lt;br /&gt;
Mit dem im SSD1325 vorhandenen Befehlen Copy, DrawRectangle und HorizontalScolling kann man ein paar nette Animationen machen, bzw. dem ATmega eine Menge Arbeit abnehmen (Details zu Controller und Display stehen im Datenblatt und [[#Websites|hier ]]).&lt;br /&gt;
&lt;br /&gt;
Der Displaycontroller verfügt über ein 64x80 Bytes großes RAM, von dem das Display aber nur 51x80 Bytes (102x80 Pixel) darstellt, beginnend von Spalte 7 bis Spalte 57:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; width:60em&amp;quot;&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em&amp;quot; | Col0&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em&amp;quot; | ...&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em&amp;quot; | Col6&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em; background:#c0c0c0&amp;quot; | Col7&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em; background:#c0c0c0&amp;quot; | ...&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em; background:#c0c0c0&amp;quot; | Col56&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em; background:#c0c0c0&amp;quot; | Col57&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em&amp;quot; | Col58&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em&amp;quot; | ...&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em&amp;quot; | Col63&lt;br /&gt;
|- style=&amp;quot;width:3em&amp;quot;&lt;br /&gt;
| D7-4 || D3-0 || ... || ... || D7-4 || D3-0 || D7-4 || D3-0 || ... || ... || D7-4 || D3-0 || D7-4 || D3-0 || D7-4 || D3-0 || ... || ... || D7-4 || D3-0 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Schaltet man im Controller nun Wraparound für das Scrolling- und Copy-Commando ein, hängen Ende und Anfang der jeweiligen Zeile hintereinander:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; width:36em&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:6em&amp;quot; | Col58 || style=&amp;quot;width:6em&amp;quot; | ... || style=&amp;quot;width:6em&amp;quot; | Col63 || style=&amp;quot;width:6em&amp;quot; | Col0 || style=&amp;quot;width:6em&amp;quot; | ... || style=&amp;quot;width:6em&amp;quot; | Col6&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Aus Sicht des Copy- und DrawRectangle-Kommandos kann man jetzt folgendermaßen auf den nicht sichtbaren Bereich des Display-RAM zugreifen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; width:36em&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:6em&amp;quot; | Col58 || style=&amp;quot;width:6em&amp;quot; | ... || style=&amp;quot;width:6em&amp;quot; | Col63 || style=&amp;quot;width:6em&amp;quot; | Col64 || style=&amp;quot;width:6em&amp;quot; | ... || style=&amp;quot;width:6em&amp;quot; | Col70&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Um Daten in diesen Bereich zu bekommen, könnte man einen entsprechenden Bildschirmausschnitt definieren und die Daten einfach sequentiell da rein schreiben. Praktisch hat das aber nicht einwandfrei funktioniert. Besser schreibt man zuerst in den sichtbaren Bereich und kopiert dann den Block in den Bereich ab Spalte 58.&lt;br /&gt;
Statt jetzt Grafiken byteweise über die Schnittstelle in das RAM zu schreiben braucht man sie nur noch durch den Controller vom unsichtbaren Bereich (maximal 26x80 Pixel) in den sichtbaren kopieren zu lassen.&lt;br /&gt;
&lt;br /&gt;
Ich habe [http://www.mikrocontroller.net/topic/109648#1419368 eine kleine Demo] geschrieben, die mit dem Copy-Befehl 8 Sprites (sich drehende Bälle) fliegen läßt und bei jeder Randberührung eines Sprites einen Zähler erhöht. Im Hintergrund laufen je eine horizontale und vertikale Linie (Rechteck) durch.&lt;br /&gt;
Das Ganze verbraucht mit Software-SPI ca. 20% Rechenzeit des ATmega, bei Hardware-SPI sind es ca. 6%.&lt;br /&gt;
&lt;br /&gt;
Um auch in horizontaler Richtung eine pixelgenaue Bewegung zu erreichen, erstellt man für jedes Sprite zwei um jeweils ein Pixel verschobene Versionen, und kopiert diese nacheinander auf die selbe Spaltenposition.&lt;br /&gt;
&lt;br /&gt;
Das Timing ist etwas kritisch, da vom Controller keine Rückmeldung möglich ist, man muß ggf. die Wartezeit nach einem Kommando versuchsweise ermitteln. Schickt man das nächste Kommando zu früh ab, wird das gerade laufende abgebrochen, was nicht immer schön aussieht oder sogar den Controller zum Abstürzen bringt.&lt;br /&gt;
&lt;br /&gt;
Bei Ansteuerung mit Hardware-SPI muß man außerdem ca. 2us warten, bevor das CS-Signal deaktiviert werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Spektrometer ===&lt;br /&gt;
[[Bild:Accu-Check_CompactPlus_BZ_Sensor.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
Im Grunde genommen, handelt es sich um eine Reflexlichtschranke mit zwei roten LEDs, einer vermutlich infraroten LED, sowie einer Fotodiode.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Accu-Check_CompactPlus_Photometer.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
== Programme ==&lt;br /&gt;
=== µC ===&lt;br /&gt;
* GPS http://www.mikrocontroller.net/topic/109648#1385554&lt;br /&gt;
** http://www.mikrocontroller.net/topic/109648#1397017&lt;br /&gt;
&lt;br /&gt;
* Grafikdemo: http://www.mikrocontroller.net/topic/109648#1419368&lt;br /&gt;
** Video: http://vimeo.com/6609124&lt;br /&gt;
&lt;br /&gt;
* Kurzzeitwecker: http://www.mikrocontroller.net/topic/109648#1412841&lt;br /&gt;
** http://www.mikrocontroller.net/topic/109648#1427502&lt;br /&gt;
&lt;br /&gt;
* serielle Displaysteuerung: http://www.mikrocontroller.net/topic/109648#1487494&lt;br /&gt;
&lt;br /&gt;
=== PC ===&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/109648#1352701 gibt als Header gespeicherte Bilder auf std aus]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/109648#1353067 Erweiterter (ungetesteter) Konvertierer für Bilder in Format für Display]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
=== Technische Dokumente ===&lt;br /&gt;
* [http://www.crystalfontz.com/controllers/SSD1325_2.1.pdf Datenblatt für Display-Controller]&lt;br /&gt;
* [http://www.atmel.com/dyn/products/product_card.asp?PN=ATmega168PA AVR Produktseite ATmega168PA mit Datasheets ]&lt;br /&gt;
* [http://www.freshpatents.com/Device-for-analysis-of-a-sample-on-a-test-element-dt20081113ptan20080277280.php Patentschrift zu Gerät ]&lt;br /&gt;
&lt;br /&gt;
=== Websites ===&lt;br /&gt;
* [http://home.arcor.de/wehrsdorf/Oled-Display-Recycling.html Oled-Recycling Seite von adriano6]&lt;br /&gt;
&lt;br /&gt;
=== Diskussions Threads ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/109648 Hauptdiskussionsthread im Mikrocontrollernet ]&lt;br /&gt;
* [http://bascom-forum.de/index.php/topic,2754.0.html Umsetzung in Bascom (wer&#039;s mag) im Bascom-Forum]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/143806 Vorschlag für Display-Adapter-Platine]&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR-Projekte]]&lt;/div&gt;</summary>
		<author><name>Muebau</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Compact_Plus_Blutzuckermessger%C3%A4t-Hardware&amp;diff=42276</id>
		<title>Compact Plus Blutzuckermessgerät-Hardware</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Compact_Plus_Blutzuckermessger%C3%A4t-Hardware&amp;diff=42276"/>
		<updated>2010-01-16T12:06:39Z</updated>

		<summary type="html">&lt;p&gt;Muebau: /* Komponenten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hardware ==&lt;br /&gt;
== Übersicht Hardware ==&lt;br /&gt;
* OLED Display 102×80 Pixel incl. 16 Helligkeitsstufen pro Pixel / SSD1325 /43x36 mm gesamt&lt;br /&gt;
* Atmega168PA&lt;br /&gt;
* DC/DC-Wandler (Regler und Drosseln)&lt;br /&gt;
* IR-Sender/Empfänger&lt;br /&gt;
* 3 Tasten (4 wenn man den Schließer der Klappe mitzählt)&lt;br /&gt;
* 2 Elektromotoren&lt;br /&gt;
* kleine Lichtschranke/Barcodescanner&lt;br /&gt;
* kleines Spektrometer (2 * LEDs rot, IR(?)-LED, Fotodiode)&lt;br /&gt;
* Betriebsspannung 3V (2*AAA)&lt;br /&gt;
* SMD Piezo-Summer&lt;br /&gt;
&lt;br /&gt;
== Gerät als Ganzes ==&lt;br /&gt;
[[Bild:compact_plus.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
Das unzerlegte Gerät. Ganz links ist die Stechhilfe.&lt;br /&gt;
&lt;br /&gt;
== Gerät zerlegen ==&lt;br /&gt;
Das Gehäuse besteht aus drei ineinander einrastenden Teilen (keine Schrauben). Relativ schadlose Demontage durch vorsichtiges Aufhebeln möglich.&lt;br /&gt;
Erst das Seitenteil (links) ganz oben und 2 cm von unten ausrasten.&lt;br /&gt;
Von unten anfangen die Gehäusehälften zu lösen, bis man sie über die Oberkante aufklappen kann.&lt;br /&gt;
&lt;br /&gt;
Die Platine selbst ist mit 2 Schrauben und ein paar Clipsen befestigt. Vor dem Entnehmen ist der untere Folienstecker abzuziehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:compact_plus_open.jpg|250px]]&lt;br /&gt;
&lt;br /&gt;
Das geöffnete Gerät ohne Platine.&lt;br /&gt;
Gut zu erkennen (im unverkleinertem Bild) sind die zwei Motoren und die Mechanik die dafür sorgen, dass die Aufbewarungstrommel gedreht und die Messstreifen herausgefahren werden können.&lt;br /&gt;
&lt;br /&gt;
== Komponenten ==&lt;br /&gt;
&lt;br /&gt;
=== Board ===&lt;br /&gt;
Hochauflösende Scans beider Platinenseiten.&lt;br /&gt;
Die Bauteile sind nach bestem Wissen und Gewissen bezeichnet (für spätere Schaltpläne). Speziell bei den Widerständen und Kondensatoren ist noch eine Kontrolle notwendig. Ich habe dabei alle blauen und schwarzen Bauteile als Widerstände und alles graue und weiße als Kondensatoren gedeutet.&lt;br /&gt;
&lt;br /&gt;
Änderungen bitte mir (Netzwanze) melden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:AccuCheckL1.jpg|300px]][[Bild:AccuCheckL6.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
=== Stromversorgung ===&lt;br /&gt;
Die zwei AAA Zellen sind in Serie geschaltet.&lt;br /&gt;
Ein Schaltregler [IC7] erzeugt daraus 3.3 V.&lt;br /&gt;
Ein Schaltregler [IC6] erzeugt daraus 12 V für das OLED.&lt;br /&gt;
&lt;br /&gt;
=== Komponenten ===&lt;br /&gt;
&lt;br /&gt;
Nach bestem Wissen und Gewissen bestimmt durch Kombination aus Schaltplänen und Messungen. Bei Komponenten mit &amp;quot;(?)&amp;quot; bin ich mir nicht sicher.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bauteil || Größe&lt;br /&gt;
|-&lt;br /&gt;
| R1  || 820 kOhm&lt;br /&gt;
|-&lt;br /&gt;
| R35 || Temperaturfühler; NTC 10 kOhm bei 20°C (?)&lt;br /&gt;
|-&lt;br /&gt;
| R43 || 100 kOhm&lt;br /&gt;
|-&lt;br /&gt;
| R44 || 100 Ohm&lt;br /&gt;
|-&lt;br /&gt;
| R45 || 39 kOhm&lt;br /&gt;
|-&lt;br /&gt;
| R46 || 1 MOhm&lt;br /&gt;
|-&lt;br /&gt;
| C24 || 22 uF (?)&lt;br /&gt;
|-&lt;br /&gt;
| C38 || 4,7 uF&lt;br /&gt;
|-&lt;br /&gt;
| C39 || 4,7 uF&lt;br /&gt;
|-&lt;br /&gt;
| C44 || 100 nF&lt;br /&gt;
|-&lt;br /&gt;
| C45 || 470 nF (?)&lt;br /&gt;
|-&lt;br /&gt;
| C46 || 10 pF&lt;br /&gt;
|-&lt;br /&gt;
| L2 || 100 uH&lt;br /&gt;
|-&lt;br /&gt;
| IC1 || ASIC&lt;br /&gt;
|-&lt;br /&gt;
| IC2 || ATmega168A&lt;br /&gt;
|-&lt;br /&gt;
| IC3 || Atmel AT25640A SPI EEPROM&lt;br /&gt;
|-&lt;br /&gt;
| IC4 || NC7NP14 ULP Triple Inverter with Schmitt Trigger Input&lt;br /&gt;
|-&lt;br /&gt;
| IC5 || 74LVC1G86GV (Markierung V68)&lt;br /&gt;
|-&lt;br /&gt;
| IC6 || TPS61080 Step-up 12 V&lt;br /&gt;
|-&lt;br /&gt;
| IC7 || AS1329, Step-up 3,3 V&lt;br /&gt;
|-&lt;br /&gt;
| IC8 || BIG 01 A825MFL ????&lt;br /&gt;
|-&lt;br /&gt;
| IC9 || [[#IC9 (IR)|IR (TFDU2201)]]&lt;br /&gt;
|-&lt;br /&gt;
| D1 || BAT54W&lt;br /&gt;
|-&lt;br /&gt;
| XTAL1 || 32 Khz&lt;br /&gt;
|-&lt;br /&gt;
| XTAL2 || 4 Mhz&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Unbekanntes IC1 ===&lt;br /&gt;
&lt;br /&gt;
Hier mal der Dekodierte Barcode des noch Unbekannten IC1.&lt;br /&gt;
Der decodierte Text ist:&lt;br /&gt;
&lt;br /&gt;
 25SLEATM 8R4222 084420179+2P00+PLCMC&lt;br /&gt;
&lt;br /&gt;
[[Bild:AccuCheckDecodedMatrixCode.png|500px]]&lt;br /&gt;
&lt;br /&gt;
=== Pinbelegung Mega168 ===&lt;br /&gt;
&lt;br /&gt;
Wie oben mittles Messungen ermittelt. Ohne Garantie auf Vollständigkeit und Richtigkeit.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Pin  || Port || Funktionen || Verwendung&lt;br /&gt;
|-&lt;br /&gt;
| 1  || PD3 || (PCINT19/OC2B/INT1)  || Taste Mitte (S2)&lt;br /&gt;
|-&lt;br /&gt;
| 2  || PD4 || (PCINT20/XCK/T0) || Display SCLK (XCLK)&lt;br /&gt;
|-&lt;br /&gt;
| 3  || GND ||  || GND&lt;br /&gt;
|-&lt;br /&gt;
| 4  || VCC ||  || VCC&lt;br /&gt;
|-&lt;br /&gt;
| 5  || GND ||  || GND&lt;br /&gt;
|-&lt;br /&gt;
| 6  || VCC ||  || VCC&lt;br /&gt;
|-&lt;br /&gt;
| 7  || PB6 || (PCINT6/XTAL1/TOSC1) || An 32,768(?)kHz Oszillator. Taktsignal auch ohne ASIC vorhanden.&lt;br /&gt;
|-&lt;br /&gt;
| 8  || PB7 || (PCINT7/XTAL2/TOSC2)  || enable 3.3V step-up&lt;br /&gt;
|-&lt;br /&gt;
| 9  || PD5 || (PCINT21/OC0B/T1) || VCC enable (12 V step-up)&lt;br /&gt;
|-&lt;br /&gt;
| 10  || PD6 || (PCINT22/OC0A/AIN0) || &lt;br /&gt;
|-&lt;br /&gt;
| 11  || PD7 || (PCINT23/AIN1) ||&lt;br /&gt;
|-&lt;br /&gt;
| 12  || PB0 || (PCINT0/CLKO/ICP1) || an Transistor T1 (schaltet 12 V über 100 Ohm gegen GND als Grundlast bzw. zum Entladen)&lt;br /&gt;
|-&lt;br /&gt;
| 13  || PB1 || (PCINT1/OC1A) || Display /CS&lt;br /&gt;
|-&lt;br /&gt;
| 14  || PB2 || (PCINT2/SS/OC1B) || &lt;br /&gt;
|-&lt;br /&gt;
| 15  || PB3 || (PCINT3/OC2A/MOSI) || ISP MOSI&lt;br /&gt;
|-&lt;br /&gt;
| 16  || PB4 || (PCINT4/MISO) || ISP MISO&lt;br /&gt;
|-&lt;br /&gt;
| 17  || PB5 ||  (SCK/PCINT5) || ISP SCK&lt;br /&gt;
|-&lt;br /&gt;
| 18  || AVCC ||  || mit Beschaltung an VCC&lt;br /&gt;
|-&lt;br /&gt;
| 19  || ADC6 ||  || Batteriespannung (3.3Volt StepUp dafür abschalten)&lt;br /&gt;
|-&lt;br /&gt;
| 20  || AREF ||  || mit Beschaltung an VCC (REFS1=0, REFS0=1)&lt;br /&gt;
|-&lt;br /&gt;
| 21  || GND ||  || GND&lt;br /&gt;
|-&lt;br /&gt;
| 22  || ADC7 ||  ||  Ausgang des 3,3V step-up über Spannungsteiler. Mit Step-Up wird 707 gemessen, ohne ca. 637.&lt;br /&gt;
|-&lt;br /&gt;
| 23  || PC0 || (ADC0/PCINT8) || Batteriespannung über Spannungsteiler, bei voller Batterie ca. 638&lt;br /&gt;
|-&lt;br /&gt;
| 24  || PC1 || (ADC1/PCINT9) || Display D/C&lt;br /&gt;
|-&lt;br /&gt;
| 25  || PC2 || (ADC2/PCINT10) || Display RESET&lt;br /&gt;
|-&lt;br /&gt;
| 26  || PC3 || (ADC3/PCINT11) || &lt;br /&gt;
|-&lt;br /&gt;
| 27  || PC4 || (ADC4/SDA/PCINT12) || Taste Links (S1)&lt;br /&gt;
|-&lt;br /&gt;
| 28  || PC5 || (ADC5/SCL/PCINT13) || Taste rechts (S3)&lt;br /&gt;
|-&lt;br /&gt;
| 29  || PC6 || (RESET/PCINT14) || ISP Reset&lt;br /&gt;
|-&lt;br /&gt;
| 30  || PD0 || (RXD/PCINT16) || &lt;br /&gt;
|-&lt;br /&gt;
| 31  || PD1 || (TXD/PCINT17) || Display SDIN. Achtung, ist auch TxD (UART-SPI möglich)&lt;br /&gt;
|-&lt;br /&gt;
| 32  || PD2 || (INT0/PCINT18) ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== IC9 (IR) ===&lt;br /&gt;
&lt;br /&gt;
Ist wohl ein TFDU2201 ([http://www.vishay.com/docs/82539/tfdu2201.pdf Datenblatt]).&lt;br /&gt;
&lt;br /&gt;
[[Bild:Accu chek combo ir.png|320px]]&lt;br /&gt;
&lt;br /&gt;
==== AVRdude ==== &lt;br /&gt;
Auslesen der Fuses&lt;br /&gt;
 avrdude -p m168  -P /dev/ttyUSB0 -c avrispv2 -F -v&lt;br /&gt;
&lt;br /&gt;
 avrdude: Device signature = 0x1e940b&lt;br /&gt;
 avrdude: Expected signature for ATMEGA168 is 1E 94 06&lt;br /&gt;
 avrdude: safemode: lfuse reads as 42&lt;br /&gt;
 avrdude: safemode: hfuse reads as D6&lt;br /&gt;
 avrdude: safemode: efuse reads as 1&lt;br /&gt;
&lt;br /&gt;
==== Flashen mit AVRdude ====&lt;br /&gt;
Da die IDs von ATmega168 und ATmega168A abweichen, muss die Option -F mit avrdude verwendet werden.&lt;br /&gt;
 avrdude -p m168  -P /dev/ttyUSB0 -c avrispv2 -F -u -U flash:w:Oled-Demo.hex&lt;br /&gt;
&lt;br /&gt;
==== Fuses mit AVRdude ====&lt;br /&gt;
Der ATmega168A hat die Fuse CLKDIV8 eingeschaltet.&lt;br /&gt;
 avrdude -p m168  -P /dev/ttyUSB0 -c avrispv2 -F -U lfuse:w:0xC2:m&lt;br /&gt;
&lt;br /&gt;
=== Display ===&lt;br /&gt;
[[Bild:display.JPG|300px]]&lt;br /&gt;
&lt;br /&gt;
Das Display basiert auf OLED - Technologie und besitzt eine Auflösung von 102×80 Pixel, von denen jedes 16 Helligkeitsstufen darstellen kann.&lt;br /&gt;
Displaycontroller ist SSD1325.&lt;br /&gt;
&lt;br /&gt;
Detailierte Informationen zum Display gibts auf adriano6&#039;s [[#Websites|Webseite ]]&lt;br /&gt;
&lt;br /&gt;
==== Inbetriebnahme auf dem Board ====&lt;br /&gt;
&lt;br /&gt;
Es ist möglich das Display auf dem Board in Betrieb zu nehmen, wenn alle Komponenten bis auf:&lt;br /&gt;
R1, R43, R44, R45, R46, C24, C38, C39, C44, C45, C46, L2, IC6 und D1&lt;br /&gt;
entfernt werden.&lt;br /&gt;
T1 und R11 sind vermutlich als Grundlast zum Start des 12 V Step-up und zum Entladen des OLED beim Abschalten.&lt;br /&gt;
Die folgende Tabelle enthält die Pads des Atmega168 Footprints und die entsprechenden Pins am Display.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Pad am Atmega168 || Pin am Display&lt;br /&gt;
|-&lt;br /&gt;
| PD1 || SDIN&lt;br /&gt;
|-&lt;br /&gt;
| PD4 || SCLK&lt;br /&gt;
|-&lt;br /&gt;
| PC1 || D/C&lt;br /&gt;
|-&lt;br /&gt;
| PC2 || RESET&lt;br /&gt;
|-&lt;br /&gt;
| PB1 || /CS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Grafikbeschleunigung mit dem SSD1325 ===&lt;br /&gt;
&lt;br /&gt;
Mit dem im SSD1325 vorhandenen Befehlen Copy, DrawRectangle und HorizontalScolling kann man ein paar nette Animationen machen, bzw. dem ATmega eine Menge Arbeit abnehmen (Details zu Controller und Display stehen im Datenblatt und [[#Websites|hier ]]).&lt;br /&gt;
&lt;br /&gt;
Der Displaycontroller verfügt über ein 64x80 Bytes großes RAM, von dem das Display aber nur 51x80 Bytes (102x80 Pixel) darstellt, beginnend von Spalte 7 bis Spalte 57:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; width:60em&amp;quot;&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em&amp;quot; | Col0&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em&amp;quot; | ...&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em&amp;quot; | Col6&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em; background:#c0c0c0&amp;quot; | Col7&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em; background:#c0c0c0&amp;quot; | ...&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em; background:#c0c0c0&amp;quot; | Col56&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em; background:#c0c0c0&amp;quot; | Col57&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em&amp;quot; | Col58&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em&amp;quot; | ...&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em&amp;quot; | Col63&lt;br /&gt;
|- style=&amp;quot;width:3em&amp;quot;&lt;br /&gt;
| D7-4 || D3-0 || ... || ... || D7-4 || D3-0 || D7-4 || D3-0 || ... || ... || D7-4 || D3-0 || D7-4 || D3-0 || D7-4 || D3-0 || ... || ... || D7-4 || D3-0 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Schaltet man im Controller nun Wraparound für das Scrolling- und Copy-Commando ein, hängen Ende und Anfang der jeweiligen Zeile hintereinander:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; width:36em&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:6em&amp;quot; | Col58 || style=&amp;quot;width:6em&amp;quot; | ... || style=&amp;quot;width:6em&amp;quot; | Col63 || style=&amp;quot;width:6em&amp;quot; | Col0 || style=&amp;quot;width:6em&amp;quot; | ... || style=&amp;quot;width:6em&amp;quot; | Col6&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Aus Sicht des Copy- und DrawRectangle-Kommandos kann man jetzt folgendermaßen auf den nicht sichtbaren Bereich des Display-RAM zugreifen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; width:36em&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:6em&amp;quot; | Col58 || style=&amp;quot;width:6em&amp;quot; | ... || style=&amp;quot;width:6em&amp;quot; | Col63 || style=&amp;quot;width:6em&amp;quot; | Col64 || style=&amp;quot;width:6em&amp;quot; | ... || style=&amp;quot;width:6em&amp;quot; | Col70&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Um Daten in diesen Bereich zu bekommen, könnte man einen entsprechenden Bildschirmausschnitt definieren und die Daten einfach sequentiell da rein schreiben. Praktisch hat das aber nicht einwandfrei funktioniert. Besser schreibt man zuerst in den sichtbaren Bereich und kopiert dann den Block in den Bereich ab Spalte 58.&lt;br /&gt;
Statt jetzt Grafiken byteweise über die Schnittstelle in das RAM zu schreiben braucht man sie nur noch durch den Controller vom unsichtbaren Bereich (maximal 26x80 Pixel) in den sichtbaren kopieren zu lassen.&lt;br /&gt;
&lt;br /&gt;
Ich habe [http://www.mikrocontroller.net/topic/109648#1419368 eine kleine Demo] geschrieben, die mit dem Copy-Befehl 8 Sprites (sich drehende Bälle) fliegen läßt und bei jeder Randberührung eines Sprites einen Zähler erhöht. Im Hintergrund laufen je eine horizontale und vertikale Linie (Rechteck) durch.&lt;br /&gt;
Das Ganze verbraucht mit Software-SPI ca. 20% Rechenzeit des ATmega, bei Hardware-SPI sind es ca. 6%.&lt;br /&gt;
&lt;br /&gt;
Um auch in horizontaler Richtung eine pixelgenaue Bewegung zu erreichen, erstellt man für jedes Sprite zwei um jeweils ein Pixel verschobene Versionen, und kopiert diese nacheinander auf die selbe Spaltenposition.&lt;br /&gt;
&lt;br /&gt;
Das Timing ist etwas kritisch, da vom Controller keine Rückmeldung möglich ist, man muß ggf. die Wartezeit nach einem Kommando versuchsweise ermitteln. Schickt man das nächste Kommando zu früh ab, wird das gerade laufende abgebrochen, was nicht immer schön aussieht oder sogar den Controller zum Abstürzen bringt.&lt;br /&gt;
&lt;br /&gt;
Bei Ansteuerung mit Hardware-SPI muß man außerdem ca. 2us warten, bevor das CS-Signal deaktiviert werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Spektrometer ===&lt;br /&gt;
[[Bild:Accu-Check_CompactPlus_BZ_Sensor.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
Im Grunde genommen, handelt es sich um eine Reflexlichtschranke mit zwei roten LEDs, einer vermutlich infraroten LED, sowie einer Fotodiode.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Accu-Check_CompactPlus_Photometer.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
== Programme ==&lt;br /&gt;
=== µC ===&lt;br /&gt;
* GPS http://www.mikrocontroller.net/topic/109648#1385554&lt;br /&gt;
** http://www.mikrocontroller.net/topic/109648#1397017&lt;br /&gt;
&lt;br /&gt;
* Grafikdemo: http://www.mikrocontroller.net/topic/109648#1419368&lt;br /&gt;
** Video: http://vimeo.com/6609124&lt;br /&gt;
&lt;br /&gt;
* Kurzzeitwecker: http://www.mikrocontroller.net/topic/109648#1412841&lt;br /&gt;
** http://www.mikrocontroller.net/topic/109648#1427502&lt;br /&gt;
&lt;br /&gt;
* serielle Displaysteuerung: http://www.mikrocontroller.net/topic/109648#1487494&lt;br /&gt;
&lt;br /&gt;
=== PC ===&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/109648#1352701 gibt als Header gespeicherte Bilder auf std aus]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/109648#1353067 Erweiterter (ungetesteter) Konvertierer für Bilder in Format für Display]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
=== Technische Dokumente ===&lt;br /&gt;
* [http://www.crystalfontz.com/controllers/SSD1325_2.1.pdf Datenblatt für Display-Controller]&lt;br /&gt;
* [http://www.atmel.com/dyn/products/product_card.asp?PN=ATmega168PA AVR Produktseite ATmega168PA mit Datasheets ]&lt;br /&gt;
* [http://www.freshpatents.com/Device-for-analysis-of-a-sample-on-a-test-element-dt20081113ptan20080277280.php Patentschrift zu Gerät ]&lt;br /&gt;
&lt;br /&gt;
=== Websites ===&lt;br /&gt;
* [http://home.arcor.de/wehrsdorf/Oled-Display-Recycling.html Oled-Recycling Seite von adriano6]&lt;br /&gt;
&lt;br /&gt;
=== Diskussions Threads ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/109648 Hauptdiskussionsthread im Mikrocontrollernet ]&lt;br /&gt;
* [http://bascom-forum.de/index.php/topic,2754.0.html Umsetzung in Bascom (wer&#039;s mag) im Bascom-Forum]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/143806 Vorschlag für Display-Adapter-Platine]&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR-Projekte]]&lt;/div&gt;</summary>
		<author><name>Muebau</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Accu_chek_combo_ir.png&amp;diff=42275</id>
		<title>Datei:Accu chek combo ir.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Accu_chek_combo_ir.png&amp;diff=42275"/>
		<updated>2010-01-16T11:39:49Z</updated>

		<summary type="html">&lt;p&gt;Muebau: tfdu2201&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;tfdu2201&lt;/div&gt;</summary>
		<author><name>Muebau</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Compact_Plus_Blutzuckermessger%C3%A4t-Hardware&amp;diff=42049</id>
		<title>Compact Plus Blutzuckermessgerät-Hardware</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Compact_Plus_Blutzuckermessger%C3%A4t-Hardware&amp;diff=42049"/>
		<updated>2010-01-07T16:43:16Z</updated>

		<summary type="html">&lt;p&gt;Muebau: /* Komponenten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hardware ==&lt;br /&gt;
== Übersicht Hardware ==&lt;br /&gt;
* OLED Display 102×80 Pixel incl. 16 Helligkeitsstufen pro Pixel / SSD1325 /43x36 mm gesamt&lt;br /&gt;
* Atmega168PA&lt;br /&gt;
* DC/DC-Wandler (Regler und Drosseln)&lt;br /&gt;
* IR-Sender/Empfänger&lt;br /&gt;
* 3 Tasten (4 wenn man den Schließer der Klappe mitzählt)&lt;br /&gt;
* 2 Elektromotoren&lt;br /&gt;
* kleine Lichtschranke/Barcodescanner&lt;br /&gt;
* kleines Spektrometer (2 * LEDs rot, IR(?)-LED, Fotodiode)&lt;br /&gt;
* Betriebsspannung 3V (2*AAA)&lt;br /&gt;
* SMD Piezo-Summer&lt;br /&gt;
&lt;br /&gt;
== Gerät als Ganzes ==&lt;br /&gt;
[[Bild:compact_plus.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
Das unzerlegte Gerät. Ganz links ist die Stechhilfe.&lt;br /&gt;
&lt;br /&gt;
== Gerät zerlegen ==&lt;br /&gt;
Das Gehäuse besteht aus drei ineinander einrastenden Teilen (keine Schrauben). Relativ schadlose Demontage durch vorsichtiges Aufhebeln möglich.&lt;br /&gt;
Erst das Seitenteil (links) ganz oben und 2 cm von unten ausrasten.&lt;br /&gt;
Von unten anfangen die Gehäusehälften zu lösen, bis man sie über die Oberkante aufklappen kann.&lt;br /&gt;
&lt;br /&gt;
Die Platine selbst ist mit 2 Schrauben und ein paar Clipsen befestigt. Vor dem Entnehmen ist der untere Folienstecker abzuziehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:compact_plus_open.jpg|250px]]&lt;br /&gt;
&lt;br /&gt;
Das geöffnete Gerät ohne Platine.&lt;br /&gt;
Gut zu erkennen (im unverkleinertem Bild) sind die zwei Motoren und die Mechanik die dafür sorgen, dass die Aufbewarungstrommel gedreht und die Messstreifen herausgefahren werden können.&lt;br /&gt;
&lt;br /&gt;
== Komponenten ==&lt;br /&gt;
&lt;br /&gt;
=== Board ===&lt;br /&gt;
Hochauflösende Scans beider Platinenseiten.&lt;br /&gt;
Die Bauteile sind nach bestem Wissen und Gewissen bezeichnet (für spätere Schaltpläne). Speziell bei den Widerständen und Kondensatoren ist noch eine Kontrolle notwendig. Ich habe dabei alle blauen und schwarzen Bauteile als Widerstände und alles graue und weiße als Kondensatoren gedeutet.&lt;br /&gt;
&lt;br /&gt;
Änderungen bitte mir (Netzwanze) melden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:AccuCheckL1.jpg|300px]][[Bild:AccuCheckL6.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
=== Stromversorgung ===&lt;br /&gt;
Die zwei AAA Zellen sind in Serie geschaltet.&lt;br /&gt;
Ein Schaltregler [IC7] erzeugt daraus 3.3 V.&lt;br /&gt;
Ein Schaltregler [IC6] erzeugt daraus 12 V für das OLED.&lt;br /&gt;
&lt;br /&gt;
=== Komponenten ===&lt;br /&gt;
&lt;br /&gt;
Nach bestem Wissen und Gewissen bestimmt durch Kombination aus Schaltplänen und Messungen. Bei Komponenten mit &amp;quot;(?)&amp;quot; bin ich mir nicht sicher.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bauteil || Größe&lt;br /&gt;
|-&lt;br /&gt;
| R1  || 820 kOhm&lt;br /&gt;
|-&lt;br /&gt;
| R35 || Temperaturfühler; NTC 10 kOhm bei 20°C (?)&lt;br /&gt;
|-&lt;br /&gt;
| R43 || 100 kOhm&lt;br /&gt;
|-&lt;br /&gt;
| R44 || 100 Ohm&lt;br /&gt;
|-&lt;br /&gt;
| R45 || 39 kOhm&lt;br /&gt;
|-&lt;br /&gt;
| R46 || 1 MOhm&lt;br /&gt;
|-&lt;br /&gt;
| C24 || 22 uF (?)&lt;br /&gt;
|-&lt;br /&gt;
| C38 || 4,7 uF&lt;br /&gt;
|-&lt;br /&gt;
| C39 || 4,7 uF&lt;br /&gt;
|-&lt;br /&gt;
| C44 || 100 nF&lt;br /&gt;
|-&lt;br /&gt;
| C45 || 470 nF (?)&lt;br /&gt;
|-&lt;br /&gt;
| C46 || 10 pF&lt;br /&gt;
|-&lt;br /&gt;
| L2 || 100 uH&lt;br /&gt;
|-&lt;br /&gt;
| IC1 || ASIC&lt;br /&gt;
|-&lt;br /&gt;
| IC2 || ATmega168A&lt;br /&gt;
|-&lt;br /&gt;
| IC3 || Atmel AT25640A SPI EEPROM&lt;br /&gt;
|-&lt;br /&gt;
| IC4 || NC7NP14 ULP Triple Inverter with Schmitt Trigger Input&lt;br /&gt;
|-&lt;br /&gt;
| IC5 || 74LVC1G86GV (Markierung V68)&lt;br /&gt;
|-&lt;br /&gt;
| IC6 || TPS61080 Step-up 12 V&lt;br /&gt;
|-&lt;br /&gt;
| IC7 || AS1329, Step-up 3,3 V&lt;br /&gt;
|-&lt;br /&gt;
| IC8 || BIG 01 A825MFL ????&lt;br /&gt;
|-&lt;br /&gt;
| D1 || BAT54W&lt;br /&gt;
|-&lt;br /&gt;
| XTAL1 || 32 Khz&lt;br /&gt;
|-&lt;br /&gt;
| XTAL2 || 4 Mhz&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Unbekanntes IC1 ===&lt;br /&gt;
&lt;br /&gt;
Hier mal der Dekodierte Barcode des noch Unbekannten IC1.&lt;br /&gt;
Der decodierte Text ist:&lt;br /&gt;
&lt;br /&gt;
 25SLEATM 8R4222 084420179+2P00+PLCMC&lt;br /&gt;
&lt;br /&gt;
[[Bild:AccuCheckDecodedMatrixCode.png|500px]]&lt;br /&gt;
&lt;br /&gt;
=== Pinbelegung Mega168 ===&lt;br /&gt;
&lt;br /&gt;
Wie oben mittles Messungen ermittelt. Ohne Garantie auf Vollständigkeit und Richtigkeit.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Pin  || Port || Funktionen || Verwendung&lt;br /&gt;
|-&lt;br /&gt;
| 1  || PD3 || (PCINT19/OC2B/INT1)  || Taste Mitte (S2)&lt;br /&gt;
|-&lt;br /&gt;
| 2  || PD4 || (PCINT20/XCK/T0) || Display SCLK (XCLK)&lt;br /&gt;
|-&lt;br /&gt;
| 3  || GND ||  || GND&lt;br /&gt;
|-&lt;br /&gt;
| 4  || VCC ||  || VCC&lt;br /&gt;
|-&lt;br /&gt;
| 5  || GND ||  || GND&lt;br /&gt;
|-&lt;br /&gt;
| 6  || VCC ||  || VCC&lt;br /&gt;
|-&lt;br /&gt;
| 7  || PB6 || (PCINT6/XTAL1/TOSC1) || &lt;br /&gt;
|-&lt;br /&gt;
| 8  || PB7 || (PCINT7/XTAL2/TOSC2)  || enable 3.3V step-up&lt;br /&gt;
|-&lt;br /&gt;
| 9  || PD5 || (PCINT21/OC0B/T1) || VCC enable (12 V step-up)&lt;br /&gt;
|-&lt;br /&gt;
| 10  || PD6 || (PCINT22/OC0A/AIN0) || &lt;br /&gt;
|-&lt;br /&gt;
| 11  || PD7 || (PCINT23/AIN1) || &lt;br /&gt;
|-&lt;br /&gt;
| 12  || PB0 || (PCINT0/CLKO/ICP1) || an Transistor T1 (schaltet 12 V über 100 Ohm gegen GND als Grundlast bzw. zum Entladen)&lt;br /&gt;
|-&lt;br /&gt;
| 13  || PB1 || (PCINT1/OC1A) || Display /CS&lt;br /&gt;
|-&lt;br /&gt;
| 14  || PB2 || (PCINT2/SS/OC1B) || &lt;br /&gt;
|-&lt;br /&gt;
| 15  || PB3 || (PCINT3/OC2A/MOSI) || ISP MOSI&lt;br /&gt;
|-&lt;br /&gt;
| 16  || PB4 || (PCINT4/MISO) || ISP MISO&lt;br /&gt;
|-&lt;br /&gt;
| 17  || PB5 ||  (SCK/PCINT5) || ISP SCK&lt;br /&gt;
|-&lt;br /&gt;
| 18  || AVCC ||  || mit Beschaltung an VCC&lt;br /&gt;
|-&lt;br /&gt;
| 19  || ADC6 ||  || Batteriespannung (3.3Volt StepUp dafür abschalten)&lt;br /&gt;
|-&lt;br /&gt;
| 20  || AREF ||  || mit Beschaltung an VCC (REFS1=0, REFS0=1)&lt;br /&gt;
|-&lt;br /&gt;
| 21  || GND ||  || GND&lt;br /&gt;
|-&lt;br /&gt;
| 22  || ADC7 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| 23  || PC0 || (ADC0/PCINT8) || &lt;br /&gt;
|-&lt;br /&gt;
| 24  || PC1 || (ADC1/PCINT9) || Display D/C&lt;br /&gt;
|-&lt;br /&gt;
| 25  || PC2 || (ADC2/PCINT10) || Display RESET&lt;br /&gt;
|-&lt;br /&gt;
| 26  || PC3 || (ADC3/PCINT11) || &lt;br /&gt;
|-&lt;br /&gt;
| 27  || PC4 || (ADC4/SDA/PCINT12) || Taste Links (S1)&lt;br /&gt;
|-&lt;br /&gt;
| 28  || PC5 || (ADC5/SCL/PCINT13) || Taste rechts (S3)&lt;br /&gt;
|-&lt;br /&gt;
| 29  || PC6 || (RESET/PCINT14) || ISP Reset&lt;br /&gt;
|-&lt;br /&gt;
| 30  || PD0 || (RXD/PCINT16) || &lt;br /&gt;
|-&lt;br /&gt;
| 31  || PD1 || (TXD/PCINT17) || Display SDIN. Achtung, ist auch TxD (UART-SPI möglich)&lt;br /&gt;
|-&lt;br /&gt;
| 32  || PD2 || (INT0/PCINT18) ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AVRdude ==== &lt;br /&gt;
Auslesen der Fuses&lt;br /&gt;
 avrdude -p m168  -P /dev/ttyUSB0 -c avrispv2 -F -v&lt;br /&gt;
&lt;br /&gt;
 avrdude: Device signature = 0x1e940b&lt;br /&gt;
 avrdude: Expected signature for ATMEGA168 is 1E 94 06&lt;br /&gt;
 avrdude: safemode: lfuse reads as 42&lt;br /&gt;
 avrdude: safemode: hfuse reads as D6&lt;br /&gt;
 avrdude: safemode: efuse reads as 1&lt;br /&gt;
&lt;br /&gt;
==== Flashen mit AVRdude ====&lt;br /&gt;
Da die IDs von ATmega168 und ATmega168A abweichen, muss die Option -F mit avrdude verwendet werden.&lt;br /&gt;
 avrdude -p m168  -P /dev/ttyUSB0 -c avrispv2 -F -u -U flash:w:Oled-Demo.hex&lt;br /&gt;
&lt;br /&gt;
==== Fuses mit AVRdude ====&lt;br /&gt;
Der ATmega168A hat die Fuse CLKDIV8 eingeschaltet.&lt;br /&gt;
 avrdude -p m168  -P /dev/ttyUSB0 -c avrispv2 -F -U lfuse:w:0xC2:m&lt;br /&gt;
&lt;br /&gt;
=== Display ===&lt;br /&gt;
[[Bild:display.JPG|300px]]&lt;br /&gt;
&lt;br /&gt;
Das Display basiert auf OLED - Technologie und besitzt eine Auflösung von 102×80 Pixel, von denen jedes 16 Helligkeitsstufen darstellen kann.&lt;br /&gt;
Displaycontroller ist SSD1325.&lt;br /&gt;
&lt;br /&gt;
Detailierte Informationen zum Display gibts auf adriano6&#039;s [[#Websites|Webseite ]]&lt;br /&gt;
&lt;br /&gt;
==== Inbetriebnahme auf dem Board ====&lt;br /&gt;
&lt;br /&gt;
Es ist möglich das Display auf dem Board in Betrieb zu nehmen, wenn alle Komponenten bis auf:&lt;br /&gt;
R1, R43, R44, R45, R46, C24, C38, C39, C44, C45, C46, L2, IC6 und D1&lt;br /&gt;
entfernt werden.&lt;br /&gt;
T1 und R11 sind vermutlich als Grundlast zum Start des 12 V Step-up und zum Entladen des OLED beim Abschalten.&lt;br /&gt;
Die folgende Tabelle enthält die Pads des Atmega168 Footprints und die entsprechenden Pins am Display.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Pad am Atmega168 || Pin am Display&lt;br /&gt;
|-&lt;br /&gt;
| PD1 || SDIN&lt;br /&gt;
|-&lt;br /&gt;
| PD4 || SCLK&lt;br /&gt;
|-&lt;br /&gt;
| PC1 || D/C&lt;br /&gt;
|-&lt;br /&gt;
| PC2 || RESET&lt;br /&gt;
|-&lt;br /&gt;
| PB1 || /CS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Grafikbeschleunigung mit dem SSD1325 ===&lt;br /&gt;
&lt;br /&gt;
Mit dem im SSD1325 vorhandenen Befehlen Copy, DrawRectangle und HorizontalScolling kann man ein paar nette Animationen machen, bzw. dem ATmega eine Menge Arbeit abnehmen (Details zu Controller und Display stehen im Datenblatt und [[#Websites|hier ]]).&lt;br /&gt;
&lt;br /&gt;
Der Displaycontroller verfügt über ein 64x80 Bytes großes RAM, von dem das Display aber nur 51x80 Bytes (102x80 Pixel) darstellt, beginnend von Spalte 7 bis Spalte 57:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; width:60em&amp;quot;&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em&amp;quot; | Col0&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em&amp;quot; | ...&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em&amp;quot; | Col6&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em; background:#c0c0c0&amp;quot; | Col7&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em; background:#c0c0c0&amp;quot; | ...&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em; background:#c0c0c0&amp;quot; | Col56&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em; background:#c0c0c0&amp;quot; | Col57&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em&amp;quot; | Col58&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em&amp;quot; | ...&lt;br /&gt;
! colspan=2 style=&amp;quot;width:6em&amp;quot; | Col63&lt;br /&gt;
|- style=&amp;quot;width:3em&amp;quot;&lt;br /&gt;
| D7-4 || D3-0 || ... || ... || D7-4 || D3-0 || D7-4 || D3-0 || ... || ... || D7-4 || D3-0 || D7-4 || D3-0 || D7-4 || D3-0 || ... || ... || D7-4 || D3-0 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Schaltet man im Controller nun Wraparound für das Scrolling- und Copy-Commando ein, hängen Ende und Anfang der jeweiligen Zeile hintereinander:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; width:36em&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:6em&amp;quot; | Col58 || style=&amp;quot;width:6em&amp;quot; | ... || style=&amp;quot;width:6em&amp;quot; | Col63 || style=&amp;quot;width:6em&amp;quot; | Col0 || style=&amp;quot;width:6em&amp;quot; | ... || style=&amp;quot;width:6em&amp;quot; | Col6&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Aus Sicht des Copy- und DrawRectangle-Kommandos kann man jetzt folgendermaßen auf den nicht sichtbaren Bereich des Display-RAM zugreifen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; width:36em&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:6em&amp;quot; | Col58 || style=&amp;quot;width:6em&amp;quot; | ... || style=&amp;quot;width:6em&amp;quot; | Col63 || style=&amp;quot;width:6em&amp;quot; | Col64 || style=&amp;quot;width:6em&amp;quot; | ... || style=&amp;quot;width:6em&amp;quot; | Col70&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Um Daten in diesen Bereich zu bekommen, könnte man einen entsprechenden Bildschirmausschnitt definieren und die Daten einfach sequentiell da rein schreiben. Praktisch hat das aber nicht einwandfrei funktioniert. Besser schreibt man zuerst in den sichtbaren Bereich und kopiert dann den Block in den Bereich ab Spalte 58.&lt;br /&gt;
Statt jetzt Grafiken byteweise über die Schnittstelle in das RAM zu schreiben braucht man sie nur noch durch den Controller vom unsichtbaren Bereich (maximal 26x80 Pixel) in den sichtbaren kopieren zu lassen.&lt;br /&gt;
&lt;br /&gt;
Ich habe [http://www.mikrocontroller.net/topic/109648#1419368 eine kleine Demo] geschrieben, die mit dem Copy-Befehl 8 Sprites (sich drehende Bälle) fliegen läßt und bei jeder Randberührung eines Sprites einen Zähler erhöht. Im Hintergrund laufen je eine horizontale und vertikale Linie (Rechteck) durch.&lt;br /&gt;
Das Ganze verbraucht mit Software-SPI ca. 20% Rechenzeit des ATmega, bei Hardware-SPI sind es ca. 6%.&lt;br /&gt;
&lt;br /&gt;
Um auch in horizontaler Richtung eine pixelgenaue Bewegung zu erreichen, erstellt man für jedes Sprite zwei um jeweils ein Pixel verschobene Versionen, und kopiert diese nacheinander auf die selbe Spaltenposition.&lt;br /&gt;
&lt;br /&gt;
Das Timing ist etwas kritisch, da vom Controller keine Rückmeldung möglich ist, man muß ggf. die Wartezeit nach einem Kommando versuchsweise ermitteln. Schickt man das nächste Kommando zu früh ab, wird das gerade laufende abgebrochen, was nicht immer schön aussieht oder sogar den Controller zum Abstürzen bringt.&lt;br /&gt;
&lt;br /&gt;
Bei Ansteuerung mit Hardware-SPI muß man außerdem ca. 2us warten, bevor das CS-Signal deaktiviert werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Spektrometer ===&lt;br /&gt;
[[Bild:Accu-Check_CompactPlus_BZ_Sensor.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
Im Grunde genommen, handelt es sich um eine Reflexlichtschranke mit zwei roten LEDs, einer vermutlich infraroten LED, sowie einer Fotodiode.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Accu-Check_CompactPlus_Photometer.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
== Programme ==&lt;br /&gt;
=== µC ===&lt;br /&gt;
* GPS http://www.mikrocontroller.net/topic/109648#1385554&lt;br /&gt;
** http://www.mikrocontroller.net/topic/109648#1397017&lt;br /&gt;
&lt;br /&gt;
* Grafikdemo: http://www.mikrocontroller.net/topic/109648#1419368&lt;br /&gt;
** Video: http://vimeo.com/6609124&lt;br /&gt;
&lt;br /&gt;
* Kurzzeitwecker: http://www.mikrocontroller.net/topic/109648#1412841&lt;br /&gt;
** http://www.mikrocontroller.net/topic/109648#1427502&lt;br /&gt;
&lt;br /&gt;
* serielle Displaysteuerung: http://www.mikrocontroller.net/topic/109648#1487494&lt;br /&gt;
&lt;br /&gt;
=== PC ===&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/109648#1352701 gibt als Header gespeicherte Bilder auf std aus]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/109648#1353067 Erweiterter (ungetesteter) Konvertierer für Bilder in Format für Display]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
=== Technische Dokumente ===&lt;br /&gt;
* [http://www.crystalfontz.com/controllers/SSD1325_2.1.pdf Datenblatt für Display-Controller]&lt;br /&gt;
* [http://www.atmel.com/dyn/products/product_card.asp?PN=ATmega168PA AVR Produktseite ATmega168PA mit Datasheets ]&lt;br /&gt;
* [http://www.freshpatents.com/Device-for-analysis-of-a-sample-on-a-test-element-dt20081113ptan20080277280.php Patentschrift zu Gerät ]&lt;br /&gt;
&lt;br /&gt;
=== Websites ===&lt;br /&gt;
* [http://home.arcor.de/wehrsdorf/Oled-Display-Recycling.html Oled-Recycling Seite von adriano6]&lt;br /&gt;
&lt;br /&gt;
=== Diskussions Threads ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/109648 Hauptdiskussionsthread im Mikrocontrollernet ]&lt;br /&gt;
* [http://bascom-forum.de/index.php/topic,2754.0.html Umsetzung in Bascom (wer&#039;s mag) im Bascom-Forum]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/143806 Vorschlag für Display-Adapter-Platine]&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR-Projekte]]&lt;/div&gt;</summary>
		<author><name>Muebau</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:AccuCheckDecodedMatrixCode.png&amp;diff=42048</id>
		<title>Datei:AccuCheckDecodedMatrixCode.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:AccuCheckDecodedMatrixCode.png&amp;diff=42048"/>
		<updated>2010-01-07T16:37:45Z</updated>

		<summary type="html">&lt;p&gt;Muebau: Decoded data:
25SLEATM 8R4222 084420179+2P00+PLCMC&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Decoded data:&lt;br /&gt;
25SLEATM 8R4222 084420179+2P00+PLCMC&lt;/div&gt;</summary>
		<author><name>Muebau</name></author>
	</entry>
</feed>