<?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=Sternst</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=Sternst"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Sternst"/>
	<updated>2026-04-10T10:08:51Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Standardbauelemente&amp;diff=96498</id>
		<title>Standardbauelemente</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Standardbauelemente&amp;diff=96498"/>
		<updated>2017-06-01T07:39:26Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Änderung 96496 von 46.161.9.51 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Gerade Neulinge kennen das Problem: Man hat eine tolle Schaltung mit vielen Operationsverstärkern, Spannungsreglern, Logikbausteinen, ADCs, was auch immer entwickelt und jetzt geht&#039;s an die Realisierung.&lt;br /&gt;
&lt;br /&gt;
Aber welche Bausteine nehmen in dem Wust der Angebote? Also erstmal auf die Seiten der Hersteller und die Produktpalette durchforsten. Nach einigen Stunden gewissenhafter Recherche hat man dann endlich alle Bauteile beisammen und will bestellen. Und dann kommt das böse Erwachen: Einige Bauelemente gibt&#039;s nur bei Reichelt, andere nur bei Conrad. Farnell hat zwar das meiste, aber da kann man als Privatperson leider nicht bestellen. Manche ICs bekommt man nur in 1000er Stückzahlen oder sind halt einfach nur viel zu teuer.&lt;br /&gt;
&lt;br /&gt;
Nach einigen Jahren praktischer Erfahrung hat man dann seine &amp;quot;Standardbauelemente&amp;quot;, die man immer wieder verwendet. Dieser Artikel soll helfen andere von dieser Erfahrung profitieren zu lassen. Ähnliche Anregungen findet man auch in der [http://dse-faq.elektronik-kompendium.de/dse-faq.htm#F.2 de.sci.electronics-FAQ: Grundausstattung des Bastlers].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
Hier soll eine Liste von häufig anzutreffenden, preiswerten und verfügbaren Standardbauelementen entstehen. Diese Liste soll knapp und bündig sein, für technische Daten wird auf die Datenblätter verwiesen. Hier gilt: &amp;quot;weniger ist mehr&amp;quot;, exotische Bauelemente sind also unerwünscht. Für hier gelistete Typen sollte gelten:&lt;br /&gt;
* für Privatpersonen verfügbar&lt;br /&gt;
* preiswert (nicht billig)&lt;br /&gt;
&lt;br /&gt;
Nicht gelistet werden sollen:&lt;br /&gt;
* hunderte Typen, die alle den gleichen Zweck erfüllen, aber keinen Mehrwert bringen. Stattdessen auf die bekanntesten / preiswertesten beschränken.&lt;br /&gt;
* Details. Stattdessen die Felder &amp;quot;Besonderheiten&amp;quot; und &amp;quot;Anwendungen&amp;quot; benutzen, z.&amp;amp;nbsp;B. &amp;quot;I²C, 12bit&amp;quot; bei Besonderheiten für einen ADC oder &amp;quot;Präzision, Audio&amp;quot; bei Anwendungen für einen OpAmp.&lt;br /&gt;
&lt;br /&gt;
Wer eine Sparte, oder eine Anwendung vermisst, aber selber nichts dazu beitragen kann: Einfach hinzufügen. Wer z.&amp;amp;nbsp;B. einen HF OpAmp sucht und hier nicht fündig wird sollte also eine neue Zeile einfügen und in die Spalte Anwendungen &amp;quot;HF&amp;quot; eintragen. Vielleicht kann ja jemand den Rest der Zeile füllen.&lt;br /&gt;
&lt;br /&gt;
Immer den Grundtypen listen und nicht eine der Varianten, und schon gar nicht alle Varianten einzeln! Also z.&amp;amp;nbsp;B. &amp;quot;LM324&amp;quot; statt &amp;quot;LM324N&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Wenn möglich Direktlinks auf Datenblätter vermeiden und eine Suchmaschine befragen: &amp;quot;http://www.datasheetarchive.com/search.php?q=lm324_also_zumindest_so_ähnlich_denn_die_suchmaschine_sucht_hier_nicht_mehr_nach_lm324&amp;quot;&lt;br /&gt;
* so werden alle Varianten gefunden&lt;br /&gt;
* und tote Links vermieden&lt;br /&gt;
&lt;br /&gt;
Die wichtigsten, allgemeinen Standard-Typen ganz oben in der Tabelle listen, danach erst die Spezialtypen für bestimmte Anwendungen.&lt;br /&gt;
&lt;br /&gt;
Und weil es mir so wichtig ist nochmal: Ich rufe geradezu dazu auf, überflüssige, unverfügbare Typen zu löschen!&lt;br /&gt;
&lt;br /&gt;
= Aktive Bauelemente =&lt;br /&gt;
== Analog ==&lt;br /&gt;
&lt;br /&gt;
=== Transistoren ===&lt;br /&gt;
&#039;&#039;Siehe auch:&#039;&#039; &#039;&#039;&#039;[[Transistor-Übersicht#NPN|Transistor-Übersicht]]&#039;&#039;&#039;&lt;br /&gt;
====NPN====&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;transistors-npn&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BC337 BC337]&lt;br /&gt;
| 0,04&lt;br /&gt;
| Standardtyp (SMD: [http://www.mikrocontroller.net/part/BC817 BC817])&lt;br /&gt;
| bis ~300mA sinnvoll&lt;br /&gt;
| R,D,P,[https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.google.de/search?num=100&amp;amp;hl=de&amp;amp;q=datasheet+bc337+filetype%3Apdf&amp;amp;btnG=Suche&amp;amp;meta=lr%3Dlang_de%7Clang_en PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MMBT2222A MMBT2222A]&lt;br /&gt;
| 0,05&lt;br /&gt;
| SMD TO-23 Gehäuse, Ptot bis 350mW&lt;br /&gt;
| bis ~ 300mA sinnvoll &lt;br /&gt;
| R,D&lt;br /&gt;
| [http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=1;INDEX=0;FILENAME=A100%252F2N2222ASMD%2523FAI.pdf;SID=29Jo9LE6wQAR0AADnPx904c70c3257c398b8b92e44b2052e44b2f PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BC547 BC547]&lt;br /&gt;
| 0,03&lt;br /&gt;
| Standardtyp, [http://www.mikrocontroller.net/part/BC847 in SMD BC847]&lt;br /&gt;
| bis ~50mA sinnvoll&lt;br /&gt;
| R,D,[https://www.IT-WNS.de/ I], P&lt;br /&gt;
| [http://www.semiconductors.philips.com/acrobat_download/datasheets/BC847_BC547_SER_6.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BC635 BC635]/[http://www.mikrocontroller.net/part/BC639 BC639]&lt;br /&gt;
| 0,07&lt;br /&gt;
| andere Pinbelegung als BC547 (= BD135 in anderem Gehäuse)&lt;br /&gt;
| bis ~500mA sinnvoll&lt;br /&gt;
| R,D&lt;br /&gt;
| [http://www.semiconductors.philips.com/acrobat/datasheets/BC635_BCP54_BCX54_6.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BD433 BD433]/[http://www.mikrocontroller.net/part/BD437 BD437]&lt;br /&gt;
| 0,19&lt;br /&gt;
| niedrige Sättigungsspannung&lt;br /&gt;
| bis ~2A sinnvoll&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.fairchildsemi.com/ds/BD%2FBD435.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TIP41C TIP41C]&lt;br /&gt;
| 0,24&lt;br /&gt;
| Ptot: 65W, geringe Stromverstärkung (max.75)&lt;br /&gt;
| Grenzwert 10A&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.datasheetcatalog.org/datasheet/fairchild/TIP41C.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TIP102 TIP102]&lt;br /&gt;
| 0,42&lt;br /&gt;
| Ptot bis 80W mit Kühlkörper, hohe Stromverstärkung von über 1000 über einen sehr großen Bereich (Darlington).&lt;br /&gt;
| Grenzwert 8A&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.fairchildsemi.com/ds/TI%2FTIP102.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TIP3055 TIP3055]&lt;br /&gt;
| 0,75&lt;br /&gt;
| Ptot bis 90W mit Kühlkörper, Stromverstärkung sehr niedrig (bei großen Strömen &amp;lt;&amp;lt; 100)&lt;br /&gt;
| Grenzwert 15A &lt;br /&gt;
| R&lt;br /&gt;
| [http://www.ortodoxism.ro/datasheets/PowerInnovations/mXvutwr.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/2N6284 2N6284]&lt;br /&gt;
| 4,50&lt;br /&gt;
| Lin. NPN-PowerDarlington, Ptot bis 160W, Stromverstärkung ~ 750&lt;br /&gt;
| 100V Ic 20A &lt;br /&gt;
| R&lt;br /&gt;
| [http://www.ortodoxism.ro/datasheets/SGSThomsonMicroelectronics/mXvsruq.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====PNP====&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;transistors-pnp&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BC327 BC327]&lt;br /&gt;
| 0,04&lt;br /&gt;
| Komplementärtyp zu [http://www.mikrocontroller.net/part/BC337 BC337]&lt;br /&gt;
| bis ~300mA sinnvoll&lt;br /&gt;
| R,D,[https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.google.de/search?num=100&amp;amp;hl=de&amp;amp;q=datasheet+bc327+filetype%3Apdf&amp;amp;btnG=Suche&amp;amp;meta=lr%3Dlang_de%7Clang_en PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BC557 BC557]&lt;br /&gt;
| 0,03&lt;br /&gt;
| Komplementärtyp zu [http://www.mikrocontroller.net/part/BC547 BC547]&lt;br /&gt;
| bis ~50mA sinnvoll&lt;br /&gt;
| R,D,[https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.semiconductors.philips.com/acrobat_download/datasheets/BC556_557_4.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BC636 BC636]/[http://www.mikrocontroller.net/part/BC640 BC640]&lt;br /&gt;
| 0,07&lt;br /&gt;
| Komplementärtyp zu [http://www.mikrocontroller.net/part/BC635 BC635]&lt;br /&gt;
| bis ~500mA sinnvoll&lt;br /&gt;
| R,D&lt;br /&gt;
| [http://www.semiconductors.philips.com/acrobat/datasheets/BC640_BCP53_BCX53_6.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TIP2955 TIP2955]&lt;br /&gt;
| 0,75&lt;br /&gt;
| Ptot bis 90W mit Kühlkörper&lt;br /&gt;
| Grenzwert 15A&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.ortodoxism.ro/datasheets/motorola/TIP2955.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====N-MOSFET====&lt;br /&gt;
&#039;&#039;Siehe auch:&#039;&#039; &#039;&#039;&#039;[[MOSFET-Übersicht#N-Kanal_MOSFET|MOSFET-Übersicht]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
BUZ10, BUZ11 etc. sind wie alle BUZ Typen ziemlich veraltet. Bitte nicht listen; es gibt fast immer was besseres von IRF.&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;mosfet-n&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF1010N IRF1010N]&lt;br /&gt;
| 0,78&lt;br /&gt;
| max 50V, max 85A, 11 mOhm On-Widerstand&lt;br /&gt;
| Alles, was mit POWER zu tun hat ...&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.irf.com/product-info/datasheets/data/irf1010n.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF1404 IRF1404]&lt;br /&gt;
| 0,96&lt;br /&gt;
| max 40V, max 162A, 4 mOhm, 200W&lt;br /&gt;
| sehr geringer Rds, TO-220&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.irf.com/product-info/datasheets/data/irf1404.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRLZ34N IRLZ34N]&lt;br /&gt;
| 0,41&lt;br /&gt;
| max 55V, max 30A, 35 mOhm On-Widerstand&lt;br /&gt;
| Gatespannung kompatibel mit 5V-Controllern.&lt;br /&gt;
| R, D, [https://www.IT-WNS.de/ I], C&lt;br /&gt;
| [http://www.irf.com/product-info/datasheets/data/irlz34n.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRLML2502 IRLML2502]&lt;br /&gt;
| 0,17&lt;br /&gt;
| max 20V, max 4,2A (cont.), 45 mOhm On-Widerstand&lt;br /&gt;
| SOT23 SMD-FET, extrem niedrige V_GS_th, bei niedrigem R_DS_on&lt;br /&gt;
| R, D&lt;br /&gt;
| [http://www.irf.com/product-info/datasheets/data/irlml2502.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BS170 BS170]&lt;br /&gt;
| 0,10&lt;br /&gt;
| max 60V, bis 500mA, 5Ω On-Widerstand&lt;br /&gt;
| veraltete Technik, aber in bastelfreundlichem TO-92 Gehäuse&lt;br /&gt;
| R,D&lt;br /&gt;
| [http://www.fairchildsemi.com/ds/BS/BS170.pdf PDF] (Fairchild)&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BSS123 BSS123]&lt;br /&gt;
| 0,05&lt;br /&gt;
| max 100V, max 170mA (cont.), Thresholdspannung 1,7V, On-Widerstand 1,3Ω&lt;br /&gt;
| SOT23 SMD-FET, auch für 3V3-versorgte Schaltungen bestens geeignet&lt;br /&gt;
| R,D&lt;br /&gt;
| [http://www.fairchildsemi.com/ds/BS/BSS123.pdf PDF] (Fairchild)&lt;br /&gt;
|-&lt;br /&gt;
| BUK100-50GL &lt;br /&gt;
| 1,15&lt;br /&gt;
| Logic-Level Power&lt;br /&gt;
| &lt;br /&gt;
| R&lt;br /&gt;
| [http://www.nxp.com/pip/BUK100-50GL_1.html PDF] (NXP)&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRLIZ44N IRLIZ44N]&lt;br /&gt;
| 1,45&lt;br /&gt;
| Logic-Level Power 30A 55V 22mohm&lt;br /&gt;
| TO-220&lt;br /&gt;
| R, [https://www.IT-WNS.de/ I]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRLR2905 IRLR2905]/[http://www.mikrocontroller.net/part/IRLU2905 IRLU2905]&lt;br /&gt;
| 0,60&lt;br /&gt;
| Logic-Level Power 36A 55V RDS=27 mOhm&lt;br /&gt;
| D-Pak &lt;br /&gt;
| R, C, P&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRLU3410 IRLU3410]&lt;br /&gt;
| 0,71&lt;br /&gt;
| Logic-Level Power, 100V, 17A, 105mOhm RDS(on), I-PAK&lt;br /&gt;
| &lt;br /&gt;
| R&lt;br /&gt;
| [http://www.datasheetarchive.com/pdf-datasheets/Datasheets-303/37622.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF7301 IRF7301]&lt;br /&gt;
| 0,91&lt;br /&gt;
| Dual N-MOSFET mit nur 70mOhm RDS(on) bei 2.7 V, SO-8&lt;br /&gt;
| Laststromschaltung bei kleinen Spannungen, z.&amp;amp;nbsp;B. an Akkus&lt;br /&gt;
| C, R&lt;br /&gt;
| [http://www.irf.com/product-info/datasheets/data/irf7301.pdf PDF] &lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/PMV30UN PMV30UN]&lt;br /&gt;
| 0,35&lt;br /&gt;
| max 20V, 5.7A (5s), &amp;lt;36mOhm(@4.5V), &amp;lt;63mOhm(@1.8V) On-Widerstand, Ultra-Low-Level: 1.8V.&lt;br /&gt;
| SOT-23 SMD, Treiber f&amp;amp;uuml;r Microcontroller-Ausg&amp;amp;auml;nge, Motortreiber, Verpolschutz.&lt;br /&gt;
| D&lt;br /&gt;
| (NXP)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====P-MOSFET====&lt;br /&gt;
&#039;&#039;Siehe auch:&#039;&#039; &#039;&#039;&#039;[[MOSFET-Übersicht#P-Kanal_MOSFET|MOSFET-Übersicht]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;mosfet-p&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRLML6401 IRLML6401]&lt;br /&gt;
| 0,18&lt;br /&gt;
| max -12V, ca -4,3A (cont.), ca. 0,05Ω On-Widerstand&lt;br /&gt;
| SOT-23 SMD FET, extrem niedrige V_GS_th, bei niedrigem R_DS_on&lt;br /&gt;
| R, D&lt;br /&gt;
| [http://www.irf.com/product-info/datasheets/data/irlml6401.pdf]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF7220 IRF7220]&lt;br /&gt;
| 0,50&lt;br /&gt;
| max -14V, ca -10A (cont.), ca. 0,02Ω On-Widerstand&lt;br /&gt;
| Gehäuse SO-8, brauchbar in 3,3V Systemen&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.irf.com/product-info/datasheets/data/irf7220.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRFR5305 IRF5305]&lt;br /&gt;
| 0,56&lt;br /&gt;
| max -55V, -31A (cont.), ca. 0,065Ω On-Widerstand&lt;br /&gt;
| Gehäuse D-Pak (SMD, TO-252AA), Uth=-2 bis -4V&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.irf.com/product-info/datasheets/data/irfr5305.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BS250 BS250]&lt;br /&gt;
| 0,26&lt;br /&gt;
| max -45V, bis -230mA (cont.), 14 (und mehr) Ohm On-Widerstand&lt;br /&gt;
| veraltete Technik aber in bastelfreundlichem TO-92 Gehäuse von R lieferbar &lt;br /&gt;
| R&lt;br /&gt;
| [http://www.vishay.com/docs/70209/70209.pdf PDF] (Vishay)&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/NDS0610 NDS0610]&lt;br /&gt;
| 0,07&lt;br /&gt;
| max -60V, bis -120mA (cont.), 20 (und mehr) Ohm On-Widerstand&lt;br /&gt;
| SOT-23 SMD Gehäuse Anwendung z.&amp;amp;nbsp;B. als [http://www.mikrocontroller.net/topic/42113#317220 Verpolschutz mit geringem Spannungsabfall]&lt;br /&gt;
| R, D DK&lt;br /&gt;
| [http://www.fairchildsemi.com/ds/ND%2FNDS0610.pdf PDF] (Fairchild)&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/PMV33UPE PMV33UPE]&lt;br /&gt;
| 0.52&lt;br /&gt;
| max -20V, 5.3A (5s), &amp;lt;36mOhm(@4.5V), &amp;lt;65mOhm(@1.8V) On-Widerstand, Ultra-Low-Level: 1.8V.&lt;br /&gt;
| SOT-23 SMD, Treiber f&amp;amp;uuml;r Microcontroller-Ausg&amp;amp;auml;nge, Motortreiber, Verpolschutz.&lt;br /&gt;
| D&lt;br /&gt;
| (NXP)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====MOSFET-Pärchen====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;mosfet-n-p&amp;quot;&lt;br /&gt;
|-  bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF7389 IRF7389]&lt;br /&gt;
| 0,51&lt;br /&gt;
| 30 V, &amp;gt;2,5 A, 30/60 mOhm On-Widerstand&lt;br /&gt;
| Gehäuse SO-8&lt;br /&gt;
| D,R&lt;br /&gt;
| [http://www.irf.com/product-info/datasheets/data/irf7389.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Dioden ===&lt;br /&gt;
==== Standarddioden ====&lt;br /&gt;
&#039;&#039;Siehe auch:&#039;&#039; &#039;&#039;&#039;[[Dioden-Übersicht]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;mosfet-p&amp;quot;&lt;br /&gt;
|-  bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/1N4148 1N4148]&lt;br /&gt;
| 0,02&lt;br /&gt;
| Kleinsignal-Gleichrichterdiode&lt;br /&gt;
| 75V/150mA&lt;br /&gt;
| R,D,[https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.fairchildsemi.com/ds/1N/1N4148.pdf D]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/1N4007 1N4001]..[http://www.mikrocontroller.net/part/1N4007 1N4007]&lt;br /&gt;
| 0,02&lt;br /&gt;
| Mehrzweck-Gleichrichterdiode, 1N4001..1N4007 mit gestaffelter Sperrspannung&lt;br /&gt;
| 1A 50..1000V&lt;br /&gt;
| R,D,[https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.fairchildsemi.com/ds/1N/1N4001.pdf D]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/UF4001 UF4001]..[http://www.mikrocontroller.net/part/UF4007 UF4007]&lt;br /&gt;
| 0,06 - 0,07&lt;br /&gt;
| UltraFast-Gleichrichterdiode, gestaffelte Sperrspannung, trr&amp;lt;50ns bzw 75ns&lt;br /&gt;
| 1A&lt;br /&gt;
| R, D&lt;br /&gt;
| [http://www.ortodoxism.ro/datasheets/vishay/uf4001.pdf Datenblatt]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/1N5400 1N5400]..[http://www.mikrocontroller.net/part/1N5408 1N5408]&lt;br /&gt;
| 0,06&lt;br /&gt;
| Mehrzweck-Gleichrichterdiode, 1N5400..1N5408 mit gestaffelter Sperrspannung&lt;br /&gt;
| 3A, 50..1000V&lt;br /&gt;
| R, D&lt;br /&gt;
| [http://www.ortodoxism.ro/datasheets/fairchild/1N5401.pdf D]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/UF5404 UF5404], [http://www.mikrocontroller.net/part/UF5408 UF5408]&lt;br /&gt;
| 0,11 bzw 0,22&lt;br /&gt;
| UltraFast-Gleichrichterdiode, gestaffelte Sperrspannung, trr&amp;lt;50ns bzw 75ns&lt;br /&gt;
| 3A, 50..1000V&lt;br /&gt;
| R&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BAT46 BAT46]&lt;br /&gt;
| 0,10&lt;br /&gt;
| Kleinsignal-Schottky-Diode&lt;br /&gt;
| 150mA&lt;br /&gt;
| D,R&lt;br /&gt;
| [http://www.alldatasheet.com/view.jsp?Searchword=BAT46 D]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BAT54 BAT54(A/C/S)]&lt;br /&gt;
| 0,04&lt;br /&gt;
| sehr schnelle Kleinsignal-(Doppel-)Schottky-Diode&lt;br /&gt;
| 200mA&lt;br /&gt;
| R,D,[https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.alldatasheet.com/view.jsp?Searchword=BAT54 D]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/SB120 SB120]..[http://www.mikrocontroller.net/part/SB160 SB160]&lt;br /&gt;
| 0,13&lt;br /&gt;
| Schottky-Diode&lt;br /&gt;
| 1A 20-60V&lt;br /&gt;
| R,[https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.alldatasheet.com/view.jsp?Searchword=SB140 D]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/1N5817 1N5817]..[http://www.mikrocontroller.net/part/1N5819 1N5819]&lt;br /&gt;
| 0,15&lt;br /&gt;
| Schottky-Diode, sehr ähnlich zu SB120-140&lt;br /&gt;
| 1A 20/30/40V&lt;br /&gt;
| R, D, C, [https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.alldatasheet.com/view.jsp?Searchword=1N5819 D]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/1N5822 1N5822]&lt;br /&gt;
| 0,16&lt;br /&gt;
| Schottky-Diode&lt;br /&gt;
| 3A 40V&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.alldatasheet.com/view.jsp?Searchword=1N5822 D]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BA159 BA159]&lt;br /&gt;
| 0,051&lt;br /&gt;
| Standard-Diode&lt;br /&gt;
| HF 1A 1000V&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.alldatasheet.com/view.jsp?Searchword=BA159 D]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BAV99 BAV99]&lt;br /&gt;
| 0,041&lt;br /&gt;
| Standard-Doppeldiode, SOT-23&lt;br /&gt;
| ESD-Schutz&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.alldatasheet.com/view.jsp?Searchword=BAV99 D]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Z-Dioden ====&lt;br /&gt;
Nahezu jeder Lieferant von Elektronikbauteilen hat [[Diode#Z-Diode|Z-Dioden]] im Sortiment. Meist gliedert sich das Angebot in die 0,5W und 1,3W-Typen. Für den Handapparat sind fertig gefüllte Sortierkästen eine gute Wahl. Sie enthalten 10-20 Stück jeder Spannung einer Leistungsklasse. Wer weniger braucht, dem seien einige Standardanwendungsfälle angeraten:&lt;br /&gt;
* Querregler für kleinste Leistungen, typ. Spannungen 3.3V, 5,1V, 9V, 12V&lt;br /&gt;
* Spannungsbegrenzung an MOSFET-Gates 10V&lt;br /&gt;
* Bereitstellung von Referenzspannungen 2,4V-15V (bis 10V in 0,3V-Schritten, darüber 1V-Schritte)&lt;br /&gt;
* Die Spannung von Z-Dioden unterhalb von 5V ist stark vom Strom abhängig und die Nennspannung wird je nach Typ bei unterschiedlichem Strom spezifiziert, so dass bei verschiedenen 3,3V Typen recht verschiedene Spannungen auftreten können&lt;br /&gt;
&lt;br /&gt;
==== Suppressordioden ====&lt;br /&gt;
==== Leuchtdioden====&lt;br /&gt;
Die Auswahl an [[LED|Leuchtdioden]] übersteigt die 2000 Typen. Sie unterscheiden sich nicht nur in der Farbe, der Form und den Bauweisen, auch die Leuchtstärke und der dafür notwendige Strom sind Auswahlkriterien. Wie bei den Z-Dioden sind Sortimente im Fall von Unsicherheit die beste Wahl. Ansonsten sind:&lt;br /&gt;
* für Anzeigezwecke Leuchtstärken von 2-50mcd ausreichend, zumal die Abstrahlwinkel über 90° liegen. &lt;br /&gt;
* Bis 2000mcd sind bereits Schutzmaßnahmen notwendig, denn bei 30° Abstrahlwinkel ist es fürs Auge bereits gefährlich&lt;br /&gt;
* Mehr als 4000mcd sind schon sehr hell, selten sind die Abstrahlwinkel allerdings größer als 15°&lt;br /&gt;
&lt;br /&gt;
RGB-LEDs gibt es in zwei Grundkonfigurationen. Die gemeinsame Anode (common anode) erlaubt die Open-Collector-Ansteuerung der einzelnen Farben per NPN-Transistor. Für die gemeinsame Kathode (common cathode) muss man dann einen PNP-Transistor einsetzen oder spezielle Anzeigentreiber. Letztere setzen zu einem wesentlichen Teil auf gemeinsame Kathode. Die Ansteuerung mit Logik-Ausgängen hängt davon ab, wieviel Strom der Ausgang verträgt (sink, common anode) oder liefert (source, common cathode).&lt;br /&gt;
&lt;br /&gt;
Leistungs-LEDs, die 0,3A und mehr vertragen, gehören nicht zu den Standardbauteilen, erfreuen sich aber großer Beliebtheit. Da sie grundsätzlich der Kühlung bedürfen und in SMD-Bauweise gefertigt werden, ist der Kauf auf fertigen sog. Star-Platinen (deutsch: Stern) empfehlenswert. Eine solche Platine lässt sich leicht auf größere Kühlkörper schrauben und bietet sehr gut lötbare Anschlussflächen.&lt;br /&gt;
&lt;br /&gt;
Ein Handapparat aus je 10 LEDs der Farben rot, grün, gelb und weiß, 5mm Durchmesser und ca. 30mcd, zzgl. 20 Widerstände 330 Ohm (1/4W) sind für 5V und das Steckbrett völlig ausreichend. Für die Unterstützung (warm-)weißer Leistungs-LEDs (je ca. 90lm) müssen schon Typen mit &amp;gt;2000mcd (bevorzugt gelb oder orange) vorgesehen werden.&lt;br /&gt;
&lt;br /&gt;
=== Instrumentenverstärker ===&lt;br /&gt;
{|  class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/INA128 INA128]&lt;br /&gt;
| 6,37 (F)&lt;br /&gt;
| Verstärkung über 1 Widerstand einstellbar&lt;br /&gt;
| Brückenverstärker , Datenerfassung&lt;br /&gt;
| F&lt;br /&gt;
| [http://focus.ti.com/lit/ds/symlink/ina128.pdf#search=%22ina128%22 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/INA326 INA326]&lt;br /&gt;
| ca. 3 (DK)&lt;br /&gt;
| Low Power, läuft an 3.3 oder 5 V&lt;br /&gt;
| Medizintechnik (EKG), Sensoren&lt;br /&gt;
| DK, C&lt;br /&gt;
| [http://www.ti.com/lit/gpn/ina326 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/AD620 AD620]&lt;br /&gt;
| ca. 8 (R)&lt;br /&gt;
| Standardtyp&lt;br /&gt;
| EKG, EEG, Brückenverstärker&lt;br /&gt;
| R, RS, DK&lt;br /&gt;
| [http://www.analog.com/UploadedFiles/Data_Sheets/37793330023930AD620_e.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Operationsverstärker ===&lt;br /&gt;
&lt;br /&gt;
Es sind die &#039;&#039;typical values&#039;&#039; bei &#039;&#039;25°C&#039;&#039; angegeben. Falls es selektierte Versionen gibt (z.&amp;amp;nbsp;B. LM358&#039;&#039;&#039;A&#039;&#039;&#039;) ist der schlechtere Wert des Standardteils angegeben.&lt;br /&gt;
&lt;br /&gt;
Bei den R2R output Werten immer die Last RL in Ohm mitangeben, ansonsten sind die Werte relativ sinnlos. Teilweise steht auch dabei für welche Versorgungsspannung dies gilt.&lt;br /&gt;
Vcc ist Versorgungs-Plus. Vee ist Versorgungs-Minus.&lt;br /&gt;
&lt;br /&gt;
Bei der Stromaufnahme (supply current) ist der Strom pro IC angegeben. Weil es besser aussieht, ist sie in den Datenblättern oft pro OPV angegeben und muss z.&amp;amp;nbsp;B. bei einem Quad noch mit vier multipliziert werden.&lt;br /&gt;
&lt;br /&gt;
Der Preis ist für Einzelstücke angegeben und entspricht meistens dem bei Reichelt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; &#039;&#039;Siehe auch:&#039;&#039; [http://www.rn-wissen.de/index.php/Operationsverst%C3%A4rker#Liste_g.C3.A4ngiger_Typen_von_Operationsverst.C3.A4rkern RN - Liste gängiger Typen von Operationsverstärkern]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;Die Tabelle lässt sich mit einem Klick auf die Überschriften &#039;&#039;&#039;sortieren&#039;&#039;&#039;.&amp;lt;/center&amp;gt;&lt;br /&gt;
{| {{Tabelle}} style=&amp;quot;font-size:80%&amp;quot; class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! OPVs&lt;br /&gt;
! Unity- Gain in&amp;amp;nbsp;MHz&lt;br /&gt;
! Slew-Rate in V/µs&lt;br /&gt;
! &amp;lt;small&amp;gt;Input Offset Spannung in mV&amp;lt;/small&amp;gt;&lt;br /&gt;
! Input Offset Strom&lt;br /&gt;
! Input Bias Strom&lt;br /&gt;
! R2R in&lt;br /&gt;
! R2R out @RL&amp;amp;nbsp;Vcc&lt;br /&gt;
! Strom- aufnahme in mA&lt;br /&gt;
! Bemerkung&lt;br /&gt;
! Daten- blatt&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM358 LM358] / [http://www.mikrocontroller.net/part/LM324 LM324]&lt;br /&gt;
| 2 / 4&lt;br /&gt;
| 1&lt;br /&gt;
| 0,5&lt;br /&gt;
| 3&lt;br /&gt;
| 5 nA&lt;br /&gt;
| 45 nA&lt;br /&gt;
| Vcc-2V Vee-0,1V&lt;br /&gt;
| Vcc-1,5V Vee+5mV @10kΩ 5V&lt;br /&gt;
| 0,8&lt;br /&gt;
| Standard-OP, Vcc=3V-30V, I&amp;lt;sub&amp;gt;sink&amp;lt;/sub&amp;gt;=15mA I&amp;lt;sub&amp;gt;source&amp;lt;/sub&amp;gt;=30mA I&amp;lt;sub&amp;gt;sink-max&amp;lt;/sub&amp;gt;=40mA&lt;br /&gt;
| [http://www.ti.com/lit/gpn/lm358 PDF(358)] / [http://www.ti.com/lit/gpn/lm324 PDF(324)]&lt;br /&gt;
| alle&lt;br /&gt;
| 0,19&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TL072 TL072]&lt;br /&gt;
| 2&lt;br /&gt;
| 3&lt;br /&gt;
| 13&lt;br /&gt;
| 3&lt;br /&gt;
| 5 pA&lt;br /&gt;
| 65 pA&lt;br /&gt;
| Vcc-0V Vee+3V&lt;br /&gt;
| Vcc-1,5V Vee+1,5V @10kΩ 30V&lt;br /&gt;
| 2,8&lt;br /&gt;
| Standard Audio, Low Noise/JFET Eingang, Quad-Version: TL074, single: TL071(mit Offsetkorr.)&lt;br /&gt;
| [http://focus.ti.com/lit/ds/symlink/tl072.pdf PDF]&lt;br /&gt;
| alle&lt;br /&gt;
| 0,17&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/NE5532 NE5532]&lt;br /&gt;
| 2&lt;br /&gt;
| 10&lt;br /&gt;
| 9&lt;br /&gt;
| 0,5&lt;br /&gt;
| 10 nA&lt;br /&gt;
| 500 nA&lt;br /&gt;
| &lt;br /&gt;
| Vcc-2V Vee+2V @600Ω 30V&lt;br /&gt;
| 8&lt;br /&gt;
| Standard Audio OP, treibt 600Ω, Iout=35mA&lt;br /&gt;
| [http://focus.ti.com/lit/ds/symlink/ne5532.pdf PDF]&lt;br /&gt;
| alle&lt;br /&gt;
| 0,23&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MAX4238 MAX4238/4239]&lt;br /&gt;
| 1&lt;br /&gt;
| MAX4238: 1.0, MAX4239: 6.5&lt;br /&gt;
| MAX4238: 0.35, MAX4239: 1.6&lt;br /&gt;
| 0,0001&lt;br /&gt;
| 2 pA&lt;br /&gt;
| 1 pA&lt;br /&gt;
| Vcc+0.3V Vee-0.3V&lt;br /&gt;
| Vcc-4mV Vee+4mV @10kΩ / Vcc-35mV Vee+35mV @1kΩ&lt;br /&gt;
| 0.6 @Vcc=5.5V&lt;br /&gt;
| very low offset (&amp;quot;zero offset&amp;quot;) 0.1µV, Rail2Rail, Vcc=2.7-5.5V, MAX4239: min. Gain x10&lt;br /&gt;
| [http://datasheets.maxim-ic.com/en/ds/MAX4238-MAX4239.pdf PDF]&lt;br /&gt;
| F, (R MAX4238)&lt;br /&gt;
| 2,55 (1,45)&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/OPA333 OPA333]&lt;br /&gt;
| 1&lt;br /&gt;
| 0.350&lt;br /&gt;
| 0.16&lt;br /&gt;
| 0.002&lt;br /&gt;
| 140 pA&lt;br /&gt;
| 70 pA&lt;br /&gt;
| Vcc+0.1V Vee-0.1V&lt;br /&gt;
| Vcc-30mV Vee+30mV @10kΩ&lt;br /&gt;
| 0.017&lt;br /&gt;
| micro power, low offset 2µV, Rail2Rail, Vcc=1.8-5.5V, SOT23-5 SO-8, Dual:OPA2333&lt;br /&gt;
| [http://focus.ti.com/general/docs/lit/getliterature.tsp?genericPartNumber=opa333&amp;amp;fileType=pdf PDF]&lt;br /&gt;
| F&lt;br /&gt;
| 3,60&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/OPA335 OPA335]&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| 1.6&lt;br /&gt;
| 0.001&lt;br /&gt;
| 120 pA&lt;br /&gt;
| 70 pA&lt;br /&gt;
| Vcc-1.5V Vee-0.1V&lt;br /&gt;
| Vcc-15mV Vee+15mV @10kΩ, Vcc-1mV Vee+1mV @100kΩ&lt;br /&gt;
| 0.285&lt;br /&gt;
| low offset 1µV, Rail2Rail, Vcc=2.7-5.5V, SOT23-5 SO-8, Dual:OPA2335&lt;br /&gt;
| [http://focus.ti.com/general/docs/lit/getliterature.tsp?genericPartNumber=opa335&amp;amp;fileType=pdf PDF]&lt;br /&gt;
| F&lt;br /&gt;
| 3,50&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TL062 TL062]&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 3&lt;br /&gt;
| 3&lt;br /&gt;
| 5 pA&lt;br /&gt;
| 30 pA&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| 0,4&lt;br /&gt;
| Low Power/JFET Eingang, veraltet&lt;br /&gt;
| [http://focus.ti.com/lit/ds/symlink/tl062.pdf PDF]&lt;br /&gt;
| alle&lt;br /&gt;
| 0,17&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TS912 TS912]&lt;br /&gt;
| 2&lt;br /&gt;
| 1 @5V&lt;br /&gt;
| 0,8 @5V&lt;br /&gt;
| 2-10&lt;br /&gt;
| 1 pA&lt;br /&gt;
| 1 pA&lt;br /&gt;
| Vcc+0,2V Vee-0,2V over the rail&lt;br /&gt;
| Vcc-0,05V Vee+0,04V @10kΩ 5V&lt;br /&gt;
| 0,4&lt;br /&gt;
| Standard Rail2Rail Typ, Vcc=2,7-16V, Iout=40mA, Quad: TS914&lt;br /&gt;
| [http://www.st.com/stonline/products/literature/ds/2325/ts912.pdf PDF]&lt;br /&gt;
| alle&lt;br /&gt;
| 0,80&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LMC6484 LMC6484]&lt;br /&gt;
| 4&lt;br /&gt;
| 1,5&lt;br /&gt;
| 0,9&lt;br /&gt;
| 3&lt;br /&gt;
| 2 pA&lt;br /&gt;
| 4 pA&lt;br /&gt;
| Vcc+0,2V Vee-0,2V over the rail&lt;br /&gt;
| Vcc-0,2V Vee+0,2V @2kΩ 5V&lt;br /&gt;
| 3&lt;br /&gt;
| Iout=16mA@5V Iout=28mA@15V&lt;br /&gt;
| [http://www.national.com/ds.cgi/LM/LMC6484.pdf PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 2,35&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/OPA2340 OPA2340]&lt;br /&gt;
| 2&lt;br /&gt;
| 5,5&lt;br /&gt;
| 6&lt;br /&gt;
| 0,150&lt;br /&gt;
| 1 pA&lt;br /&gt;
| 1 pA&lt;br /&gt;
| Vcc+0,5V Vee-0,5V over the rail&lt;br /&gt;
| Vcc-0,04V Vee+0,04V @2kΩ&lt;br /&gt;
| 1,5&lt;br /&gt;
| CMOS Vcc=2,5V - 5,5V&lt;br /&gt;
| [http://focus.ti.com/lit/ds/symlink/opa4340.pdf PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 1,65&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LF356 LF356]&lt;br /&gt;
| 1&lt;br /&gt;
| 5&lt;br /&gt;
| 12&lt;br /&gt;
| 3&lt;br /&gt;
| 3 pA&lt;br /&gt;
| 30 pA&lt;br /&gt;
| Vcc&#039;&#039;&#039;+&#039;&#039;&#039;0,1V Vee+3V &lt;br /&gt;
| Vcc-2V Vee+2V  @10kΩ 30V&lt;br /&gt;
| 5&lt;br /&gt;
| high bandwidth J-FET, Settling-Time = 1,5µs @0.01% error-voltage, Eingang knapp über Vcc, &lt;br /&gt;
| [http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=0;INDEX=0;FILENAME=A200%252FLF355_LF356_LF357%2523STM.pdf; PDF]&lt;br /&gt;
| alle&lt;br /&gt;
| 0,50&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/OP07 OP07]&lt;br /&gt;
| 1&lt;br /&gt;
| 0,6&lt;br /&gt;
| 0,3&lt;br /&gt;
| 0,030&lt;br /&gt;
| 0,4 nA&lt;br /&gt;
| 1 nA&lt;br /&gt;
| Vcc-1,5V Vee+1,5V&lt;br /&gt;
| Vcc-2,2V Vee+2,2V @2kΩ 15V&lt;br /&gt;
| 0,7 - 2,5&lt;br /&gt;
| geringer Offset &amp;lt;80µV je nach Hersteller&lt;br /&gt;
| [http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=1;INDEX=0;FILENAME=A200%252FOP07%2523AD.pdf; PDF]&lt;br /&gt;
| alle&lt;br /&gt;
| 0,25&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LMC6062 LMC6062]&lt;br /&gt;
| 2&lt;br /&gt;
| 0,1&lt;br /&gt;
| 0,015&lt;br /&gt;
| 0,1&lt;br /&gt;
| 0,01 pA max:2pA&lt;br /&gt;
| 0,01 pA max:4pA&lt;br /&gt;
| &lt;br /&gt;
| Vcc-0,05V Vee+0,05V @25kΩ 5V&lt;br /&gt;
| 0,045&lt;br /&gt;
| Precision, Micropower, CMOS, Is~40µA (typ.), Iout=8mA&lt;br /&gt;
| [http://www.national.com/ds.cgi/LM/LMC6062.pdf PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 2,05&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM4250 LM4250]&lt;br /&gt;
| 1&lt;br /&gt;
| 0,3-0,01&lt;br /&gt;
| 1-0,001&lt;br /&gt;
| 3-5&lt;br /&gt;
| 3-10 nA&lt;br /&gt;
| 8-50 nA&lt;br /&gt;
| Vcc-0,6V Vee+0,6V&lt;br /&gt;
| Vcc-0,6V Vee+0,6V @10kΩ 3V&lt;br /&gt;
| 0,008 - 0,09&lt;br /&gt;
| Micropower, &amp;quot;programmierbar&amp;quot;, Werte jeweils für Is=8µA und 90µA&lt;br /&gt;
| [http://www.national.com/ds.cgi/LM/LM4250.pdf PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 0,98&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/ICL7621 ICL7621]&lt;br /&gt;
| 2&lt;br /&gt;
| 0,5&lt;br /&gt;
| 0,15&lt;br /&gt;
| 15&lt;br /&gt;
| 30 pA&lt;br /&gt;
| 1 pA&lt;br /&gt;
| Vcc-0,3V Vee+0,3V unklar &amp;lt;!-- Das Datenblatt sagt folgendes. Bedeutet dies R2R input?    Differential Input Voltage [(V+ +0.3) - (V- -0.3)]V --&amp;gt;&lt;br /&gt;
| Vcc-0,1V Vee+0,1V @100kΩ&lt;br /&gt;
| 0,2&lt;br /&gt;
| Micropower CMOS Vcc=2V - 16V &lt;br /&gt;
| [http://datasheets.maxim-ic.com/en/ds/ICL7611-ICL764X.pdf PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 1,10&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/ICL7611 ICL7611] / [http://www.mikrocontroller.net/part/ICL7612 ICL7612]&lt;br /&gt;
| 1&lt;br /&gt;
| 0,5&lt;br /&gt;
| 0,15&lt;br /&gt;
| 15&lt;br /&gt;
| 30 pA&lt;br /&gt;
| 1 pA&lt;br /&gt;
| Vcc-0,3V Vee+0,3V unklar &amp;lt;!-- Das Datenblatt sagt folgendes. Bedeutet dies R2R input?    Differential Input Voltage [(V+ +0.3) - (V- -0.3)]V --&amp;gt;&lt;br /&gt;
| Vcc-0,1V Vee+0,1V @100kΩ&lt;br /&gt;
| 0,010 - 1 &lt;br /&gt;
| gleich mit ICL7621, aber nur 1 OPV und dafür programmierbar: Is= 10µA, 100µA, 1mA&lt;br /&gt;
| [http://datasheets.maxim-ic.com/en/ds/ICL7611-ICL764X.pdf PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 0,82&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM13700 LM13700]&lt;br /&gt;
| 2&lt;br /&gt;
| 2&lt;br /&gt;
| 50&lt;br /&gt;
| 0,5&lt;br /&gt;
| 0,1 µA&lt;br /&gt;
| 0,4 µA&lt;br /&gt;
| &lt;br /&gt;
| Vcc-0,8V Vee+0,6V&lt;br /&gt;
| 2,6&lt;br /&gt;
| OTA - Steilheits-OP 50V/µs&lt;br /&gt;
| [http://www.national.com/ds.cgi/LM/LM13700.pdf PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 0,90&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [http://www.mikrocontroller.net/part/µA733 µA733]&lt;br /&gt;
| 1&lt;br /&gt;
| 1200*&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| 6 µA&lt;br /&gt;
| 40 µA&lt;br /&gt;
| &lt;br /&gt;
| Vcc-3,5V Vee+3,5V @2kΩ&lt;br /&gt;
| 25&lt;br /&gt;
| Video OP,  Vcc=12V, I&amp;lt;sub&amp;gt;sink&amp;lt;/sub&amp;gt;=2mA; Gains of 10, 100, 400; R&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt;=8kΩ; V&amp;lt;sub&amp;gt;Output offset&amp;lt;/sub&amp;gt;=0,6V; &lt;br /&gt;
| [http://www.national.com/ds.cgi/LM/µA733 PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 0,50&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/NE592 NE592]&lt;br /&gt;
| 1&lt;br /&gt;
| 1200*&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| 1 µA&lt;br /&gt;
| 9 µA&lt;br /&gt;
| &lt;br /&gt;
| Vcc-4V Vee+4V @2kΩ&lt;br /&gt;
| 20&lt;br /&gt;
| Video OP,  Vcc=12V, I&amp;lt;sub&amp;gt;sink&amp;lt;/sub&amp;gt;=15mA; R&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt;=4-30kΩ; V&amp;lt;sub&amp;gt;Output offset&amp;lt;/sub&amp;gt;=1,5V; &lt;br /&gt;
| [http://www.national.com/ds.cgi/LM/NE592 PDF]&lt;br /&gt;
| R, [https://www.IT-WNS.de/ I]&lt;br /&gt;
| 0,40&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LT1363 LT1363]&lt;br /&gt;
| 1&lt;br /&gt;
| 70&lt;br /&gt;
| 1000&lt;br /&gt;
| 1,5&lt;br /&gt;
| 120 nA&lt;br /&gt;
| 0,6 µA&lt;br /&gt;
| Vcc-1,6V Vee+1,8V&lt;br /&gt;
| Vcc-0,9V Vee+0,9V @500Ω 10V&lt;br /&gt;
| 7&lt;br /&gt;
| Steilheits OP,  Vcc=5-15V, I&amp;lt;sub&amp;gt;sink/source&amp;lt;/sub&amp;gt;=30-60mA; R&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt;=5MΩ*;&lt;br /&gt;
| [http://www.linear.com/docs/3603 PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 3,80&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/CA3140 CA3140]&lt;br /&gt;
| 1&lt;br /&gt;
| 4,5&lt;br /&gt;
| 9&lt;br /&gt;
| 5&lt;br /&gt;
| 0,5 pA&lt;br /&gt;
| 10 pA&lt;br /&gt;
| Vee-0,5V&lt;br /&gt;
| Vcc-2V Vee+0,6V  @2kΩ 15V&lt;br /&gt;
| 4&lt;br /&gt;
| BIMOS-OP - kleiner Eingangsstrom, ideal für Single-Supply, Vcc-min=4V&lt;br /&gt;
| [http://www.intersil.com/data/fn/fn957.pdf PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 0,47&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TCA0372 TCA0372]&lt;br /&gt;
| 2&lt;br /&gt;
| 1,1&lt;br /&gt;
| 1,3&lt;br /&gt;
| 1&lt;br /&gt;
| 10 nA&lt;br /&gt;
| 100 nA&lt;br /&gt;
| Vee to Vcc-1,0V&lt;br /&gt;
| Vcc-0,8V Vee+0,8V @0,1A 30V  Vcc-1,3V Vee+1,3V  @1A 24V &lt;br /&gt;
| 5&lt;br /&gt;
| Power-OPV, Thermal Shutdown, Io=1A Io(max)=1.5A&lt;br /&gt;
| [http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=0;INDEX=0;FILENAME=A200%252FTCA0372%2523MOT.pdf; PDF]&lt;br /&gt;
| alle, R&lt;br /&gt;
| 0,70&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LA6510 LA6510]&lt;br /&gt;
| 2&lt;br /&gt;
| &lt;br /&gt;
| 0,15&lt;br /&gt;
| 2&lt;br /&gt;
| 10 nA&lt;br /&gt;
| 100 nA&lt;br /&gt;
| Vcc-2V Vee+0V&lt;br /&gt;
| Vcc-2V Vee+2V  @33Ω 30V&lt;br /&gt;
| 12&lt;br /&gt;
| Power-OPV, current limiter pin, Imax=1A P=2,5W, Gehäuse:SIP10F&lt;br /&gt;
| [http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=0;INDEX=0;FILENAME=A200%252FLA6510%2523SAN.pdf; PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 0,80&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/L272 L272]&lt;br /&gt;
| 2&lt;br /&gt;
| 0,35&lt;br /&gt;
| 1&lt;br /&gt;
| 15&lt;br /&gt;
| 50 nA&lt;br /&gt;
| 300 nA&lt;br /&gt;
| &lt;br /&gt;
| Vcc-1V Vee+0,3V @0,1A 24V  Vcc-1,5V Vee+0,6V  @0,5A 24V &lt;br /&gt;
| 8&lt;br /&gt;
| Power-OPV, Vcc=4V-28V, Io=0,7A P=1W, Thermal Shutdown @160°C&lt;br /&gt;
| [http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=0;INDEX=0;FILENAME=A200%252FL272fai.pdf; PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 0,70&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TLC272 TLC272]&lt;br /&gt;
| 2&lt;br /&gt;
| 1,7&lt;br /&gt;
| 2,9&lt;br /&gt;
| 1,1&lt;br /&gt;
| 0,1 pA&lt;br /&gt;
| 0,7 pA&lt;br /&gt;
| Vcc-0.8V Vee-0.3V&lt;br /&gt;
| Vcc-1.2V Vee+0V  @10kΩ&lt;br /&gt;
| 5&lt;br /&gt;
| Precision OPV, für hochohmige Messanwendungen, Single: TLC271, Quad: TLC274, weniger Offset: TLC277&lt;br /&gt;
| [http://focus.ti.com/lit/ds/symlink/tlc272.pdf PDF]&lt;br /&gt;
| R, CSD&lt;br /&gt;
| 0,26&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MCP602 MCP602-I/P]&lt;br /&gt;
| 2&lt;br /&gt;
| 2,8&lt;br /&gt;
| 2,3&lt;br /&gt;
| 1&lt;br /&gt;
| 1 pA&lt;br /&gt;
| 1 pA&lt;br /&gt;
| Vcc-1,2V Vee-0,2V&lt;br /&gt;
| Vcc-0,1V Vee+0,1V  @5kΩ&lt;br /&gt;
| 0,5&lt;br /&gt;
| Vcc=2,7V-5,5V Vout=20mA&lt;br /&gt;
| [http://www.chipcatalog.com/Doc/88306CED2FD891755A0736169A8D31C1.pdf PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 0,55&lt;br /&gt;
|-&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
| Bezeichnung&lt;br /&gt;
| OPVs pro Gehäuse&lt;br /&gt;
| Unity-Gain&lt;br /&gt;
| Slew-Rate&lt;br /&gt;
| Input Offset Spannung&lt;br /&gt;
| Input Offset Strom&lt;br /&gt;
| Input Bias Strom&lt;br /&gt;
| R2R in&lt;br /&gt;
| R2R out&lt;br /&gt;
| Stromaufnahme&lt;br /&gt;
| Bemerkung&lt;br /&gt;
| [http://www. PDF]&lt;br /&gt;
| Lieferant&lt;br /&gt;
| Preis&lt;br /&gt;
|-&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Warum findet sich in obiger Liste kein [http://www.mikrocontroller.net/part/LM741 741], war er doch lange Zeit &amp;quot;der&amp;quot; OPV schlechthin? Nun, er wird allgemein als &amp;quot;veraltet&amp;quot; angesehen, da er aus den 60er Jahren stammt (1968 von Fairchild vorgestellt, etwa ab 1969 kommerziell erhältlich) und keine besonderen technischen Daten aufweist. Der immerhin etwa fünf Jahre jüngere 324 (von 1974) kostet häufig ein paar Cent weniger, enthält dafür aber vier statt einen OPV mit besseren Daten.&lt;br /&gt;
&lt;br /&gt;
=== Lineare NF-Verstärker ===&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} style=&amp;quot;font-size:80%&amp;quot; class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;NFAmps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Kanäle&lt;br /&gt;
! Ausgangsstrom /A&lt;br /&gt;
! Ausgangs- leistung /W&lt;br /&gt;
! Bemerkung&lt;br /&gt;
! Datenblatt&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TDA2030 TDA2030]&lt;br /&gt;
| 1&lt;br /&gt;
| 3,5&lt;br /&gt;
| 14&lt;br /&gt;
| &lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=TDA2030 PDF]&lt;br /&gt;
| alle&lt;br /&gt;
| 0,73&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TDA2050 TDA2050]&lt;br /&gt;
| 1&lt;br /&gt;
| 5&lt;br /&gt;
| 32&lt;br /&gt;
| &lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=TDA2050 PDF]&lt;br /&gt;
| alle&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TDA7294 TDA7294]&lt;br /&gt;
| 1&lt;br /&gt;
| 10&lt;br /&gt;
| 100&lt;br /&gt;
| &lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=TDA7294 PDF]&lt;br /&gt;
| alle&lt;br /&gt;
| 2,10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== HF-taugliche Verstärker ===&lt;br /&gt;
Für HF-Anwendungen eigenen sich besonders:&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/part/LT1222 LT1222]&lt;br /&gt;
&lt;br /&gt;
=== Komparatoren ===&lt;br /&gt;
&lt;br /&gt;
Komparatoren sind im Vergleich zu OPVs deutlich schneller. Man sollte sie immer nur als Komparatoren benutzen und nicht als lineare Verstärker. OPVs sollte man nur als Komparatoren beschalten, wenn es nicht um hohe Schaltgeschwindigkeiten geht, siehe [[Schmitt-Trigger]].&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;Die Tabelle lässt sich mit einem Klick auf die Überschriften &#039;&#039;&#039;sortieren&#039;&#039;&#039;.&amp;lt;/center&amp;gt;&lt;br /&gt;
{| {{Tabelle}} style=&amp;quot;font-size:80%&amp;quot; class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;Komparatoren&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Kanäle&lt;br /&gt;
! Response time /µs&lt;br /&gt;
! &amp;lt;small&amp;gt;Input Offset Spannung in mV&amp;lt;/small&amp;gt;&lt;br /&gt;
! Input Bias Strom&lt;br /&gt;
! R2R in&lt;br /&gt;
! Ausgang&lt;br /&gt;
! Strom- aufnahme in mA&lt;br /&gt;
! Bemerkung&lt;br /&gt;
! Daten- blatt&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM393 LM393]&lt;br /&gt;
| 2&lt;br /&gt;
| 1,5 &lt;br /&gt;
| 1&lt;br /&gt;
| 65 nA&lt;br /&gt;
| Vcc-2V Vee+0V&lt;br /&gt;
| Open- Collector&lt;br /&gt;
| 1,6&lt;br /&gt;
| Standard- Komparator&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=lm393 PDF]&lt;br /&gt;
| alle&lt;br /&gt;
| 0,10&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM339 LM339]&lt;br /&gt;
| 4&lt;br /&gt;
| 1,5&lt;br /&gt;
| 1,4&lt;br /&gt;
| 60 nA&lt;br /&gt;
| Vcc-2V Vee+0V&lt;br /&gt;
| Open- Collector&lt;br /&gt;
| 1,1&lt;br /&gt;
| Standard- Komparator&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=lm339 PDF]&lt;br /&gt;
| alle&lt;br /&gt;
| 0,10&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TLC3702 TLC3702]&lt;br /&gt;
| 2&lt;br /&gt;
| 1,1&lt;br /&gt;
| 1,2&lt;br /&gt;
| 5pA&lt;br /&gt;
| Vcc-1,5V Vee-0,2V&lt;br /&gt;
| PushPull&lt;br /&gt;
| 0,02&lt;br /&gt;
| Micropower- Komparator&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=tlc3702 PDF]&lt;br /&gt;
| F, C&lt;br /&gt;
| 0,80&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
| Bezeichnung&lt;br /&gt;
| OPVs pro Gehäuse&lt;br /&gt;
| Unity-Gain&lt;br /&gt;
| Slew-Rate&lt;br /&gt;
| Input Offset Spannung&lt;br /&gt;
| Input Offset Strom&lt;br /&gt;
| Input Bias Strom&lt;br /&gt;
| R2R in&lt;br /&gt;
| R2R out&lt;br /&gt;
| Stromaufnahme&lt;br /&gt;
| Bemerkung&lt;br /&gt;
| [http://www. PDF]&lt;br /&gt;
| Lieferant&lt;br /&gt;
| Preis&lt;br /&gt;
|-&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Spannungsregler ===&lt;br /&gt;
==== Linearregler ====&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;linearregler&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung Datenblatt&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Eingangsspannung&lt;br /&gt;
! Ausgangsspannung&lt;br /&gt;
! Ausgangsstrom&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Preis (€)&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LP2950 LP2950]&lt;br /&gt;
| Festspannungsregler Low-Dropout&lt;br /&gt;
| 30 V max&lt;br /&gt;
| 2,5V, 3V, 3,3V, 3,6V, 5V&lt;br /&gt;
| 100 mA&lt;br /&gt;
| TO-92, &amp;lt;120µA Ruhestrom&lt;br /&gt;
| R, D&lt;br /&gt;
| 0,39 - 0,53&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM2940 LM2940]&lt;br /&gt;
| Festspannungsregler Low-Dropout&lt;br /&gt;
| 26 V max&lt;br /&gt;
| 5V, 8V, 9V, 10V, 12V, 15V&lt;br /&gt;
| 1 A (@0,5V drop)&lt;br /&gt;
| Verpolschutz, TO-220, SOT-223.&lt;br /&gt;
| R, D&lt;br /&gt;
| 0,40&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM1117 LM1117]&lt;br /&gt;
| Festspannungsregler Low-Dropout (auch LT1117, NCP#, REG#, usw.)&lt;br /&gt;
| 20 V max&lt;br /&gt;
| 1,8V, 2,5V, 2,85V, 3,3V, 5V&lt;br /&gt;
| 800mA(@1,1V drop)&lt;br /&gt;
| SOT-223. fixed 3V3 oder adjustable&lt;br /&gt;
| D, R, [https://www.IT-WNS.de/ I]&lt;br /&gt;
| 0,65&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM317 LM317]&lt;br /&gt;
| Linearer einstellbarer Spannungsregler (LM337 für neg. Spannungen)&lt;br /&gt;
| 40 V Differenz zw. Ausgang u. Eingang&lt;br /&gt;
| 1,2 - 37 V&lt;br /&gt;
| 1,5 A&lt;br /&gt;
| TO220&lt;br /&gt;
| alle&lt;br /&gt;
| 0,22&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MAX663 MAX663]&lt;br /&gt;
| Linearer, einstellbarer Spannungsregler&lt;br /&gt;
| 2-16,5V, 18V max&lt;br /&gt;
| 5V fest, 1,3-16V einstellbar&lt;br /&gt;
| 40 mA&lt;br /&gt;
| sehr niedriger Eigenstromverbrauch&lt;br /&gt;
|&lt;br /&gt;
| 1,80&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM7805 LM78xx]&lt;br /&gt;
| Festspannungregler (xx=05: 5V, xx=12: 12V, ...)&lt;br /&gt;
| 35 V max&lt;br /&gt;
| 5V, 6V, 8V, 9V, 10V, 12V, 15V, 18V, 24V&lt;br /&gt;
| 1 A&lt;br /&gt;
| &lt;br /&gt;
| alle&lt;br /&gt;
| &amp;lt;1,00&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM7905 LM79xx]&lt;br /&gt;
| Festspannungregler, negative Spannung (xx=05: -5V, xx=12: -12V ...)&lt;br /&gt;
| -35V max&lt;br /&gt;
| -5V, -6V, -8V, -9V, -10V, -12V, -15V, -18V, -24V&lt;br /&gt;
| 1 A&lt;br /&gt;
| &lt;br /&gt;
| alle&lt;br /&gt;
| &amp;lt;1,00&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LF33 LF33], LFxx&lt;br /&gt;
| Festspannungregler (xx=12: 1,25V, xx=15: 1,5V, ..., xxx=120: 12V)&lt;br /&gt;
| 18 V max&lt;br /&gt;
| 1,25V, 1,5V, 1,8V, 2,5V, 2,7V, 3V, 3,3V, 3,5V, 4V, 4,5V, 4,7V 5V, 5,2V, 5,5V, 6V, 8V, 8,5V, 9V, 12V&lt;br /&gt;
| 1A&lt;br /&gt;
| Low-Dropout, TO-220&lt;br /&gt;
| R, [https://www.IT-WNS.de/ I]&lt;br /&gt;
| &amp;lt;1,00&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MCP1700 MCP1700]&lt;br /&gt;
| Festspannungregler, Low-Dropout, sehr niedriger Eigenstromverbrauch, siehe auch MCP1702/MCP1703, durch geringe PSRR eher nur für Batterieanwendung&lt;br /&gt;
| 13,2V max&lt;br /&gt;
| 1,2V, 1,5V, 1,8V, 2,5V, 2,8V, 3,0V, 3,3V, 4,0V, 5,0V&lt;br /&gt;
| 200mA (&amp;lt; 2,5V), 250 mA &amp;gt;= 2,5V)&lt;br /&gt;
| TO-92, SOT-89, SOT-23&lt;br /&gt;
| R, F, [https://www.IT-WNS.de/ I]&lt;br /&gt;
| &amp;lt;1,00&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM2931 LM2931]&lt;br /&gt;
| Low-Dropout Spannungsregler&lt;br /&gt;
| 26 V&lt;br /&gt;
| 3,3V, 5V, 3-24V einstellbar&lt;br /&gt;
| 100 mA&lt;br /&gt;
| TO-220, TO-92, SMD, Automotive, Iq=0,4mA&lt;br /&gt;
| R&lt;br /&gt;
| ~0,30 - 0,40&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM723 &amp;amp;mu;A723/LM723]&lt;br /&gt;
| Spannungsregler einstellbar&lt;br /&gt;
| 40 V max&lt;br /&gt;
| 2-37 V&lt;br /&gt;
| 150 mA&lt;br /&gt;
| Netzteile mit Strombegrenzung, Netzteile mit hohem Ausgangsstrom, Labornetzteile, DIP-14, SO-14&lt;br /&gt;
| alle&lt;br /&gt;
| ~0,35&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TL783 TL783]&lt;br /&gt;
| Spannungsregler einstellbar für hohe Eingangsspannung&lt;br /&gt;
| 20-125 V&lt;br /&gt;
| 1,25-125 V&lt;br /&gt;
| 700 mA&lt;br /&gt;
| TO-220&lt;br /&gt;
| R, ...&lt;br /&gt;
| ~2,00&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* [http://www.national.com/an/AN/AN-1148.pdf AN-1148: Application Note 1148 Linear Regulators: Theory of Operation and Compensation] von National Semiconductor Corporation (PDF)&lt;br /&gt;
&lt;br /&gt;
==== Schaltregler ====&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;schaltregler&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM2576 LM2576, LM2575, LM2574]&lt;br /&gt;
| 0,90&lt;br /&gt;
| Step-Down (einstellbar/&amp;quot;ADJ&amp;quot; oder Festspannung)&lt;br /&gt;
| max 40Vin -&amp;gt; 1,2 - 37Vout, TO220-5 u.a., LM2576 bis 3A, LM2575 bis 1A, LM2574 bis 0,5A, als HV-Typen Vin bis 63V&lt;br /&gt;
| alle - Achtung: R liefert u.U. den nur zum LM2596 äquivalenten P3596&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=LM2576 PDF] - [http://www.mikrocontroller.net/topic/58094#450561 mit Funk-Entstördrossel FED100µ (Reichelt...) bis 3 A]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM2577 LM2577, LM1577]&lt;br /&gt;
| &lt;br /&gt;
| Step-Up (ADJ oder Festsp.), auch als Step-Up/-Down ([http://www.mikrocontroller.net/topic/262140 &amp;quot;buck boost&amp;quot; bzw. SEPIC]) betreibbar&lt;br /&gt;
| 3,5 - 40Vin -&amp;gt; 0 - 60Vout, TO220-5 u.a., &lt;br /&gt;
| &lt;br /&gt;
| [http://www.ti.com/lit/ds/symlink/lm2577.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [[MC34063]]A&lt;br /&gt;
| 0,29&lt;br /&gt;
| Step-Up ~0,3A / Step-Down 0,7A / Inverter 0,2A-0,6A&lt;br /&gt;
| SO-8/DIP-8; Tool zum Berechnen auf [http://www.nomad.ee/micros/mc34063a/index.shtml www.nomad.ee]&lt;br /&gt;
| R, [https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.onsemi.com/pub/Collateral/MC34063A-D.PDF PDF], [http://www.mikrocontroller.net/articles/MC34063]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/PR4401 PR4401]&lt;br /&gt;
| 0,50&lt;br /&gt;
| Led-Treiber, Step-Up, Batteriebetrieb mit einer Zelle (bis 0,9 V)&lt;br /&gt;
| SO-23&lt;br /&gt;
| R, [http://www.ak-modul-bus.de/ AK Modul-Bus], [https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.prema.com/images/downloads/Datenblatt_PR4401_PR4402.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LT1930 LT1930] und [http://www.mikrocontroller.net/part/LT1932 LT1932]&lt;br /&gt;
| ~3 €&lt;br /&gt;
| Leistungs-Led-Treiber, Step-Up&lt;br /&gt;
| SO-23&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.linear.com/pc/productDetail.jsp?navId=H0,C1,C1003,C1042,C1031,C1061,P1813]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Shuntregler/[[Spannungsreferenz]] ====&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;schaltregler&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot; style=&amp;quot;text-align:center&amp;quot; &lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis [&amp;amp;euro;]&lt;br /&gt;
! Spannung [V]&lt;br /&gt;
! Strom [mA]&lt;br /&gt;
! Fehler [%]&lt;br /&gt;
! Temperatur koeffizient typ/max [ppm/K]&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TL431 TL431]&lt;br /&gt;
| 0,15&lt;br /&gt;
| 2,5-36&lt;br /&gt;
| 1-100&lt;br /&gt;
| 2&lt;br /&gt;
| 20/70 &lt;br /&gt;
| Präzise Alternative zur Z-Diode; SO8; TO92&lt;br /&gt;
| C, R, DK&lt;br /&gt;
|[http://www.datasheetarchive.com/search.php?q=TL431 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LT1021 LT1021]&lt;br /&gt;
| 5,00&lt;br /&gt;
| 5; 7; 10&lt;br /&gt;
| 10 &lt;br /&gt;
| 1; 0,05&lt;br /&gt;
| 2/5&lt;br /&gt;
| Präzisionsreferenz, +/-10mA Ausgangsstrom&lt;br /&gt;
| C, R, DK&lt;br /&gt;
|[http://www.datasheetarchive.com/pdf/getfile.php?dir=Datasheets-17&amp;amp;file=DSA-321686.pdf&amp;amp;scan= PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LT1004  LT1004]&lt;br /&gt;
| 1,90&lt;br /&gt;
| 1,235; 2,5 &lt;br /&gt;
| 0.01-20 &lt;br /&gt;
| 0,8&lt;br /&gt;
| 20/50&lt;br /&gt;
| niedriger Stromverbrauch, ab 20 µA; 1,2V bessere Eigenschaften; TI =! LT&lt;br /&gt;
| R, [https://www.IT-WNS.de/ I]&lt;br /&gt;
|[http://www.datasheetarchive.com/search.php?q=LT1004 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LT1009  LT1009]&lt;br /&gt;
| 1,95&lt;br /&gt;
| 2,5 &lt;br /&gt;
| 1-10&lt;br /&gt;
| 0,2&lt;br /&gt;
| 20/30&lt;br /&gt;
| verbesserter Ersatz für LM336&lt;br /&gt;
| R&lt;br /&gt;
|[http://www.datasheetarchive.com/search.php?q=LT1009 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM336-2.5 LM336-2.5]&lt;br /&gt;
| 0,20&lt;br /&gt;
| 2,5; 5,0&lt;br /&gt;
| 0,6-10&lt;br /&gt;
| 4&lt;br /&gt;
| 70/230&lt;br /&gt;
| TO92; SO8; 1% erhältlich&lt;br /&gt;
| C, R, DK&lt;br /&gt;
|[http://www.datasheetarchive.com/search.php?q=LM336 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM385 LM385]&lt;br /&gt;
| 0,35&lt;br /&gt;
| 1,2V; 2,5&lt;br /&gt;
| 0,015-20&lt;br /&gt;
| 2&lt;br /&gt;
| 30/150&lt;br /&gt;
| Präzise Alternative zur Z-Diode; SO8; TO92&lt;br /&gt;
| C, R, DK&lt;br /&gt;
|[http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=0;INDEX=0;FILENAME=A200%252FLM385Z1%252C2%2523TEX.pdf; PDF]&lt;br /&gt;
|-&lt;br /&gt;
| LM 4041 CIDBZT&lt;br /&gt;
| 0,35&lt;br /&gt;
| 1,22V-10,0&lt;br /&gt;
| 0,000045-12&lt;br /&gt;
| 0,5&lt;br /&gt;
| 20/100&lt;br /&gt;
| Battery Powered Equipment&lt;br /&gt;
| elpro.org&lt;br /&gt;
|[http://www.google.de/url?sa=t&amp;amp;rct=j&amp;amp;q=&amp;amp;esrc=s&amp;amp;source=web&amp;amp;cd=5&amp;amp;ved=0CEYQFjAE&amp;amp;url=http%3A%2F%2Fwww.farnell.com%2Fdatasheets%2F36982.pdf&amp;amp;ei=MCbJU9ShJajy7Ab41YDIBw&amp;amp;usg=AFQjCNEhAH7BdMUd-YWQB1HRbdUNmvzA_Q&amp;amp;bvm=bv.71198958,d.ZGU]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LT1029 LT1029]&lt;br /&gt;
| 2,20&lt;br /&gt;
| 5,0&lt;br /&gt;
| 0,6-10&lt;br /&gt;
| 1&lt;br /&gt;
| 8/40&lt;br /&gt;
| Bandgap TO92; 0,2% erhältlich&lt;br /&gt;
| C, R, DK&lt;br /&gt;
|[http://www.datasheetarchive.com/search.php?q=LT1029 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| ADR36x&lt;br /&gt;
| 2,20&lt;br /&gt;
| 2,048; 2,5; 3; 3,3; 4,096; 5 &lt;br /&gt;
| -1, +5&lt;br /&gt;
| 0,1&lt;br /&gt;
| 3/9&lt;br /&gt;
| Bandgap; SOT23&lt;br /&gt;
| DK, RS, FAR&lt;br /&gt;
|[http://www.datasheetarchive.com/search.php?q=ADR363 PDF]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Viele Spannungsreferenzen haben auch [http://www.maxim-ic.com/products/references/ Maxim] und [http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=analog&amp;amp;familyId=401&amp;amp;uiTemplateId=NODE_STRY_PGE_T TI] im Programm.&lt;br /&gt;
&lt;br /&gt;
=== Stromquelle ===&lt;br /&gt;
==== Referenzstromquelle ====&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;referenzstromquelle&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| LM134&lt;br /&gt;
| 0,58 - 1,84&lt;br /&gt;
| Referenzstromquelle, 1µA...10mA, TO-92&lt;br /&gt;
| Referenzstromquelle/Temperatursensor&lt;br /&gt;
| R, C&lt;br /&gt;
| [http://www.ti.com.cn/general/cn/docs/lit/getliterature.tsp?genericPartNumber=lm134&amp;amp;fileType=pdf]&lt;br /&gt;
|-&lt;br /&gt;
| REF200&lt;br /&gt;
| 7,94&lt;br /&gt;
| Referenzstromquelle, 2 x 100µA&lt;br /&gt;
| Referenzstromquelle&lt;br /&gt;
| F&lt;br /&gt;
| [http://www.ti.com/general/docs/lit/getliterature.tsp?genericPartNumber=ref200&amp;amp;fileType=pdf]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Timer ===&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;can&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/NE555 555]&lt;br /&gt;
| 0,15&lt;br /&gt;
| Universeller Zeitgeber.&lt;br /&gt;
| Für alles, wirklich alles. CMOS-Versionen lassen sich aufgrund ihrer niedrigeren Betriebsspannung besser mit µCs verbinden.&lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.google.de/search?q=555+Datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/DS1307 DS1307]&lt;br /&gt;
| 1,95&lt;br /&gt;
| 64 X 8 Serial Real Time Clock. Quarzuhr / Kalender Baustein mit serieller TWI-Schnittstelle.  &lt;br /&gt;
| Uhrenfunktion, unabhängig vom µC, aber µC-Steuerbar. Batteriepufferbar (3V-Knopfzelle wie CR2032) um die Zeit bei ausgeschalteter Board-Betriebsspannung weiter zu zählen.&lt;br /&gt;
| D, R, [https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.google.de/search?q=DS1307 Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/PCF8583 PCF8583]&lt;br /&gt;
| 1,50&lt;br /&gt;
| I²C/TWI Real Time Clock, Calendar, SRAM, Alarm, Timer, Eventcounter&lt;br /&gt;
| Auf Basis eines SRAM-chips, deshalb kann ein großer Teil als SRAM genutzt werden (ca 240 bytes). Berechnet Datum (4 Jahre, Jahr 0 = Schaltjahr), Uhrzeit (12/24), Wochentag. ein 32-kHz-Uhrenquarz ist nötig, sonst als Uhr unbrauchbar da  störempfindlich. Möglichkeit eines Interruptausganges bei voreingestellter Alarmzeit. Bemerkenswert einfaches Protokoll. Kann umgeschaltet werden in einen Timer-Modus (einfacher Counter mit bestimmter Timebase) oder Event-Counter-Modus (Eingangssignale zählen).&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.alldatasheet.com/view.jsp?Searchword=PCF8583]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Analogschalter und Multiplexer ===&lt;br /&gt;
Die DG2xx DG3xx DG4xx, teilweise auch DG5xx bezeichnen Analogschalter und Multiplexer die sich zum Industriestandard entwickelt haben. Es gibt sie von vielen Herstellern und zahlreichen Ausführungen in allen R(on) Bereichen und sind Pinkompatibel. Anstelle von &amp;quot;DGxxx&amp;quot; benutzen Hersteller für verbesserte/moderne Versionen ihre eigenen Präfixe wie &amp;quot;ADGxxx&amp;quot; von Analog Devices oder &amp;quot;MAXxxx&amp;quot; von Maxim. Für einfache Schalter werden häufig die letzten zwei Ziffern 01 bis 05 und 11-13 benutzt, 06/07/08/09 bezeichnet 16:1 8:1 und 4:1 Multiplexer in Single Ended und Differential Ended. Spannungsbereich geht bis +/-12 oder +/-15 V, die Steuereingänge haben zum Teil TTL-Kompatibilität, andernfalls einen Pin der den Logikpegel definiert (z.&amp;amp;nbsp;B. VCC).&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;can&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/DG201 DG201]/[http://www.mikrocontroller.net/part/DG202 DG202]/[http://www.mikrocontroller.net/part/DG212 DG212]&lt;br /&gt;
| ~2-3€&lt;br /&gt;
| Vierfach Einzelschalter in SPST, SPDT, &lt;br /&gt;
| Zum µC-gesteuerten schalten von Analogsignalen, in Audio, Video, und Messschaltungen, in OP-Schaltungen für programmierbare Verstärkungen&lt;br /&gt;
| Maxim, Analog Devices, u.a.&lt;br /&gt;
| [http://search.datasheetcatalog.net/cgi-bin/helo.pl?text=DG202&amp;amp;action=Search]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/DG306 DG306]/[http://www.mikrocontroller.net/part/DG406 DG406]&lt;br /&gt;
| ~4-10€&lt;br /&gt;
| 16:1 Analog-Multiplexer&lt;br /&gt;
| Zum Multiplexen von Analogsignalen, Kanalauswahl für ADC-Messschaltungen.&lt;br /&gt;
| Maxim, Analog Devices, u.a.&lt;br /&gt;
| [http://search.datasheetcatalog.net/cgi-bin/helo.pl?text=DG306&amp;amp;action=Search]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/DG307 DG307]/[http://www.mikrocontroller.net/part/DG408 DG408]&lt;br /&gt;
| ~4-10€&lt;br /&gt;
| Zweifach 8:1 bzw Einfach 8:1 differential ended (8 Doppelkanäle)&lt;br /&gt;
| Zum Multiplexen von Analogsignalen, Kanalauswahl für ADC-Messschaltungen auch für differentielle Eingänge. &lt;br /&gt;
| Maxim, Analog Devices, u.a.&lt;br /&gt;
| [http://search.datasheetcatalog.net/cgi-bin/helo.pl?text=DG308&amp;amp;action=Search]&lt;br /&gt;
|-&lt;br /&gt;
| 4051, z.&amp;amp;nbsp;B. [http://www.mikrocontroller.net/part/74HC4051 74HC4051]&lt;br /&gt;
| ab 25ct&lt;br /&gt;
| 1:8 Multiplexer, R_on &amp;lt;100Ω, auch 2:4, 1:16 usw  &lt;br /&gt;
| Zum µC-gesteuerten schalten von Analogsignalen, in Audio, Video, und Messschaltungen, in OP-Schaltungen für programmierbare Verstärkungen&lt;br /&gt;
| verschiedende&lt;br /&gt;
| [http://search.datasheetcatalog.net/cgi-bin/helo.pl?text=74HC4051&amp;amp;action=Search]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Digital ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== CAN ===&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;can&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MCP2515 MCP2515]&lt;br /&gt;
| 2,55&lt;br /&gt;
| CAN 2.0B, [[SPI]]-Schnittstelle&lt;br /&gt;
| &lt;br /&gt;
| D,F,R,[https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q= PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/SJA1000 SJA1000]&lt;br /&gt;
| 4,55&lt;br /&gt;
| PellCAN 2.0B, 8 Bit parallele Schnittstelle&lt;br /&gt;
|&lt;br /&gt;
| F,R&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Logik ===&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (€)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/74HC4050 74HC4050]&lt;br /&gt;
| 0,27&lt;br /&gt;
| z.&amp;amp;nbsp;B. 5V =&amp;gt; 3V&lt;br /&gt;
| Pegelwandler unidirektional abwärts&lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=74hc4050 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/HEF4104B HEF4104B]&lt;br /&gt;
| 0,77&lt;br /&gt;
| z.&amp;amp;nbsp;B. 5V =&amp;gt; 12V&lt;br /&gt;
| Pegelwandler unidirektional aufwärts&lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=HEF4104B PDF]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== USB ===&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;usb&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/FT232 FT232]&lt;br /&gt;
| 3,59&lt;br /&gt;
| USB &amp;lt;-&amp;gt; RS232 Wandler&lt;br /&gt;
| Zugriff über virtuellen COM Port&lt;br /&gt;
| D, R, [https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.ftdichip.com/Support/Documents/DataSheets/ICs/DS_FT232BL_BQ.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/FT245 FT245]&lt;br /&gt;
| 4,79&lt;br /&gt;
| USB &amp;lt;-&amp;gt; Seriell Wandler mit paralleler Schnittstelle&lt;br /&gt;
| Zugriff über virtuellen COM Port&lt;br /&gt;
| D, R&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=ft245 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TUSB3410 TUSB3410]&lt;br /&gt;
| 3,50&lt;br /&gt;
| USB &amp;lt;-&amp;gt; RS232 mit 8052 CPU&lt;br /&gt;
| Zugriff über virtuellen COM Port&lt;br /&gt;
| DK&lt;br /&gt;
| [http://focus.ti.com/docs/prod/folders/print/tusb3410.html PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MCP2200 MCP2200]&lt;br /&gt;
| 1,90&lt;br /&gt;
| USB &amp;lt;-&amp;gt; UART per fest-vorprogrammiertem PIC&lt;br /&gt;
| Zugriff über virtuellen COM Port&lt;br /&gt;
| R, RS, F, M, DK, [https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://ww1.microchip.com/downloads/en/DeviceDoc/22228B.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== GPS ===&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;usb&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| NL-552ETTL (uBlox5) &lt;br /&gt;
| 25,43&lt;br /&gt;
| GPS-Empfänger&lt;br /&gt;
| Zugriff über TTL (NMEA Protokoll)&lt;br /&gt;
| www.mercateo.com&lt;br /&gt;
| [http://www.navilock.de/produkte/gruppen/13/Boards_und_Module/60721_NL-552ETTL_ublox5.html HTML]&lt;br /&gt;
|-&lt;br /&gt;
| NL-550ERS (uBlox5) &lt;br /&gt;
| 24,95&lt;br /&gt;
| GPS-Empfänger&lt;br /&gt;
| Zugriff über RS232 (NMEA Protokoll)&lt;br /&gt;
| www.mercateo.com&lt;br /&gt;
| [http://www.navilock.de/produkte/gruppen/13/Boards_und_Module/60418_NL-550ERS_ublox5.html HTML]&lt;br /&gt;
|-&lt;br /&gt;
| NL-551EUSB (uBlox5) &lt;br /&gt;
| 22,56&lt;br /&gt;
| GPS-Empfänger&lt;br /&gt;
| Zugriff über USB (NMEA Protokoll)&lt;br /&gt;
| www.mercateo.com&lt;br /&gt;
| [http://www.navilock.de/produkt/60419/pdf.html?sprache=de PDF]&lt;br /&gt;
|-&lt;br /&gt;
| EM-406A (Sirf III)&lt;br /&gt;
| um 35 Euro&lt;br /&gt;
| GPS-Empfänger mit 1PPS-Ausgang&lt;br /&gt;
| Zugriff über TTL (NMEA Protokoll)&lt;br /&gt;
|&lt;br /&gt;
| [http://www.navilock.de/produkte/G_60407/merkmale.html HTML]&lt;br /&gt;
|-&lt;br /&gt;
| CW25-TIM &lt;br /&gt;
| ca. 35 Euro (ab 10 Stk)&lt;br /&gt;
| GPS Empfänger mit zusätzlichen Frequenzausgang(programmierbar von 10Hz..30Mhz)&lt;br /&gt;
| Sehr interesant wenn man einen präzisen Takt braucht.(für Adwandler, Datenlogger usw)&lt;br /&gt;
| [http://www.navsync.com navsync.com]&lt;br /&gt;
|-&lt;br /&gt;
| Timing Multi-GNSS Receiver Module Typ Furuno GT-87&lt;br /&gt;
| 48,67&lt;br /&gt;
| Ein GPS Empfänger auch mit zusätzlichen Frequenzausgang, für aber für alle Satelitten(GPS,GLONASS,usw).&lt;br /&gt;
| Interresant für simultane Ad-Wandlung an verschiendenen Orten, da zwei Empfänger sehr präzise sind im Gleichlauf.&lt;br /&gt;
| Zu erhalten bei Bürklin. Bestell.Nr. 64S3190&lt;br /&gt;
| Furuno[http://www.furuno.com]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Treiber ===&lt;br /&gt;
==== Diverse Treiber ====&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/ULN2003A ULN2003A]&lt;br /&gt;
| 0,29&lt;br /&gt;
| 7-fach Low-Side Treiber&lt;br /&gt;
| 50V/500mA&lt;br /&gt;
| R, D, [https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=ULN2003 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/ULN2803A ULN2803A]&lt;br /&gt;
| 0,31&lt;br /&gt;
| 8-fach Low-Side Treiber&lt;br /&gt;
| 50V/500mA&lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=ULN2803 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TBD62083A TBD62083A]&lt;br /&gt;
| 0,31&lt;br /&gt;
| 8-fach Low-Side Treiber (DMOS) 2 Ohm RDS ON &lt;br /&gt;
| 50V/500mA&lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=TBD62083A PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TPIC6B595 TPIC6B595]&lt;br /&gt;
| 1,00&lt;br /&gt;
| 8-fach Low-Side Treiber mit integriertem Schieberegister&lt;br /&gt;
| 45V/250mA&lt;br /&gt;
| F&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=TPIC6B595 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/UDN2981 UDN2981]&lt;br /&gt;
| 1,50&lt;br /&gt;
| 8-fach High-Side Treiber&lt;br /&gt;
| 50V/500mA&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=UDN2981 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/ICL7667 ICL7667]&lt;br /&gt;
| 1&lt;br /&gt;
| Dual inverting MOSFET Treiber&lt;br /&gt;
| 18V, 20ns@1nF&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=ICL7667 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/HCPL3120 HCPL3120]&lt;br /&gt;
| 3.70&lt;br /&gt;
| Optokoppler mit integriertem MOSFET-Treiber&lt;br /&gt;
| Schaltnetzteile, etc.&lt;br /&gt;
| C&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=HCPL3120 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/SN75179B SN75179B]&lt;br /&gt;
| 0.36&lt;br /&gt;
| RS-485/422 Receiver/Transmitter, alter IC mit hohem Stromverbrauch (60mA!)&lt;br /&gt;
| Serielle Daten (z.&amp;amp;nbsp;B.UART) über weite Strecken&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=SN75174 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MAX485 MAX485]&lt;br /&gt;
| 1.50&lt;br /&gt;
| RS-485/422 Receiver/Transmitter, moderner CMOS IC mit geringem Stromverbrauch (0,3mA!)&lt;br /&gt;
| Serielle Daten (z.&amp;amp;nbsp;B.UART) über weite Strecken&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=MAX485 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LTC1480 LTC1480]&lt;br /&gt;
| &lt;br /&gt;
| RS-485 Transceiver&lt;br /&gt;
| Betriebsspannung 3,3V, &amp;quot;Ultralow Power&amp;quot;&lt;br /&gt;
| R, C u.a.&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=LTC1480 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MAX3232 MAX3232]&lt;br /&gt;
| &lt;br /&gt;
| RS-232 Transceiver&lt;br /&gt;
| Betriebsspannung 3V bis 5,5V&lt;br /&gt;
| R, D, C, [https://www.IT-WNS.de/ I] u.a.&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=MAX3232 PDF]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== 7-Segment LED-Treiber ====&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;led&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MAX6950 MAX6950 (MAX6951)]&lt;br /&gt;
| ~9€&lt;br /&gt;
| 5 (8) Stellen Treiber mit [[SPI]]-Schnittstelle&lt;br /&gt;
| Unterstützt 2.7 bis 5.5 V Versorgungsspannung, für LEDs mit gemeinsamer Kathode, minimierte Anzahl von Ausgangs-PINs - trotzdem alle Segmente/LEDs einzeln angsteuerbar, nur QSOP Package&lt;br /&gt;
| Mouser&lt;br /&gt;
| [http://datasheets.maximintegrated.com/en/ds/MAX6950-MAX6951.pdf MAX]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/STLED316S STLED316S], [http://www.mikrocontroller.net/part/STLED316SMTR STLED316SMTR]&lt;br /&gt;
| ~2€&lt;br /&gt;
| Sechs-Stellen Treiber mit [[SPI]]-ähnlicher Busschnittstelle&lt;br /&gt;
| Sechs-Stellen Treiber, der zusätzlich noch ein 8x2 Tastaturdekoder enthält. Die Busschnittstelle ist [[SPI]]-ähnlich, MOSI und MISO liegen auf einem gemeinsamen PIN als DIN/DOUT (SISO). Nur 5 Volt.&lt;br /&gt;
| Mouser&lt;br /&gt;
| [http://www.st.com/web/en/resource/technical/document/datasheet/CD00181714.pdf ST]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/ICM7218 ICM7218C]&lt;br /&gt;
| ~6€&lt;br /&gt;
| Acht-Stellen Treiber mit paralleler Busschnittstelle&lt;br /&gt;
| Alt, teuer, benötigt viele µC-Pins für die parallele Schnittstelle&lt;br /&gt;
| Reichelt&lt;br /&gt;
| [http://www.intersil.com/data/fn/FN3159.pdf Intersil]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MAX7221 MAX7221]&lt;br /&gt;
| ~6€&lt;br /&gt;
| Acht-Stellen Treiber mit [[SPI]]-Schnittstelle&lt;br /&gt;
| Mit BCD-Dekoder, kann auch beliebige 8x8 LED-Matrix ansteuern, nur 5 Volt&lt;br /&gt;
| Reichelt&lt;br /&gt;
| [http://datasheets.maxim-ic.com/en/ds/MAX7219-MAX7221.pdf Maxim]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Punkt/Streifen (Dot/Bar) LED-Treiber ====&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;bar&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM3914 LM3914]&lt;br /&gt;
| ~1,20 €&lt;br /&gt;
| 10-Stellen Balkenanzeigetreiber mit Analogeingang&lt;br /&gt;
| Lineare A/D-Wandlung&lt;br /&gt;
| Reichelt&lt;br /&gt;
| [http://www.national.com/pf/LM/LM3914.html National]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM3915 LM3915]&lt;br /&gt;
| ~1,40 €&lt;br /&gt;
| 10-Stellen Balkenanzeigetreiber mit Analogeingang&lt;br /&gt;
| Logarithmische A/D-Wandlung&lt;br /&gt;
| Reichelt&lt;br /&gt;
| [http://www.national.com/pf/LM/LM3915.html National]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Analogschalter aus der 4000 Logikreihe ===&lt;br /&gt;
Die folgenden Schalter werden digital gesteuert, daher sind sie im Kapitel [[#Digital|Digital]] einsortiert. Sie basieren auf standard CMOS-Technologien, sind daher weit verbreitet, günstig, haben aber daher auch nur mäßige Eigenschaften und begrenzte Anwendungsbereiche. Analogschalter für Präzisionsanwendungen sind im Kapitel [[#Analog|Analog]]. Zum Schalten Analog- oder Digitalsignalen. Je nach Typ sind  Analogsignale bis in den 100 MHz Bereich mit einer Schaltfrequenz bis mehrere 10 MHz möglich.&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;can&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/CD4051 4051]&lt;br /&gt;
| 0,25&lt;br /&gt;
| Ein 8:1 Analogmultiplexer.&lt;br /&gt;
| &lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.google.de/search?q=4051+datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/CD4052 4052]&lt;br /&gt;
| 0,11&lt;br /&gt;
| Zwei 4:1 Analogmultiplexer/-demultiplexer&lt;br /&gt;
| &lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.google.de/search?q=4052+datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/CD4053 4053]&lt;br /&gt;
| 0,16&lt;br /&gt;
| Drei 2:1 Analogmultiplexer/-demultiplexer&lt;br /&gt;
| &lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.google.de/search?q=4053+datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/CD4066 4066]&lt;br /&gt;
| 0,15&lt;br /&gt;
| Vier Analogschalter&lt;br /&gt;
| &lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.datasheets.org.uk/pdf/347282.pdf 4066.pdf]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/CD4067 4067]&lt;br /&gt;
| 0,60&lt;br /&gt;
| Ein 16:1 Analogmultiplexer/-demultiplexer&lt;br /&gt;
|&lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.google.de/search?q=4067+datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Galvanische Trennelemente ===&lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Optokoppler]].&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/CNY17 CNY17]&lt;br /&gt;
| 0,28&lt;br /&gt;
| Optisch, Standardtyp&lt;br /&gt;
| 3,7kV 50-100kHz&lt;br /&gt;
| R,C&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=CNY17 PDF], [http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=0;INDEX=0;FILENAME=A500%252FCNY17-I_CNY17-II_CNY17-III.pdf; PDF Temic]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/6N137 6N137]&lt;br /&gt;
| 0,49&lt;br /&gt;
| Optisch, Logikausgang (5V)&lt;br /&gt;
| sehr schnell 14MHz&lt;br /&gt;
| R,D,[https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=0;INDEX=0;FILENAME=A500%252F6N137.pdf; PDF]&lt;br /&gt;
|-&lt;br /&gt;
| ADUM240*&lt;br /&gt;
| 10&lt;br /&gt;
| Induktiv, 3V/5V Logik&lt;br /&gt;
| extrem schnell, EN90650, 5kV&lt;br /&gt;
| F&lt;br /&gt;
| [http://www.analog.com/en/products/interface-isolation/isolation.html www]&lt;br /&gt;
|-&lt;br /&gt;
| ISO72*&lt;br /&gt;
| 1,25&lt;br /&gt;
| Kapazitiv, 3V/5V&lt;br /&gt;
| 6kV, bis zu 150MHz&lt;br /&gt;
| DK,F&lt;br /&gt;
| [http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=analog&amp;amp;familyId=897&amp;amp;uiTemplateId=NODE_STRY_PGE_T PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/PC817 PC817]/827/837/847&lt;br /&gt;
| 0,3&lt;br /&gt;
| Optisch&lt;br /&gt;
| 8x7, x=Anzahl der Optokoppler&lt;br /&gt;
| C, R, [https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=analog&amp;amp;familyId=897&amp;amp;uiTemplateId=NODE_STRY_PGE_T PDF]&lt;br /&gt;
|-&lt;br /&gt;
| HCNR201&lt;br /&gt;
| 4,50&lt;br /&gt;
| Optisch&lt;br /&gt;
| Linear Optokoppler wie IL300&lt;br /&gt;
| F&lt;br /&gt;
| [http://www.avagotech.com/docs/AV02-0886EN PDF]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Displays ===&lt;br /&gt;
Bei den Textdisplays eignet sich praktisch jedes [[HD44780]] kompatible Display.&lt;br /&gt;
Praktisch jeder Elektronikversender hat eine Auswahl an verschiedenen Größen zu bieten. &lt;br /&gt;
Wer keinen besonderen Anforderungen an die Größe der Displays hat sollte sich bei Pollin und in Ebay umschauen.&lt;br /&gt;
&lt;br /&gt;
=== Speicher ===&lt;br /&gt;
&lt;br /&gt;
==== [[RAM]] ====&lt;br /&gt;
&lt;br /&gt;
==== [[EEPROM]] ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;EEPROMmemory&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| ST 24C01 BN6, ST 24C02 BN6, ST 24C256 BN6 (allgemein 24C## mit ## Größe in kbit)&lt;br /&gt;
| 0,14€ - 1,50€&lt;br /&gt;
| EEPROM Speicher mit seriellem (I2C) Interface, 1kbit bis 512 kbit Speicher. Viele verschiedene Hersteller.&lt;br /&gt;
| Speichern von Konfigurationsdaten &lt;br /&gt;
| R&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=24C PDF]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Converter ==&lt;br /&gt;
=== ADC ===&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Geschwindigkeit / Sps/s&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/ADC830 ADC830]&lt;br /&gt;
| 6&lt;br /&gt;
| 8-Bit-ADC, Differentiell, Parallel, (DIL-20)&lt;br /&gt;
| 8770&lt;br /&gt;
| C,R&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=adc830 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LTC2400 LTC2400CS8]&lt;br /&gt;
| 8,30&lt;br /&gt;
| 24-Bit-ADC, Single Ended, Seriell (SPI), (SO-8) &lt;br /&gt;
| ca. 6&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.linear.com/pc/downloadDocument.do?navId=H0,C1,C1155,C1001,C1152,P1636,D1887]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/CS5381 CS5381]&lt;br /&gt;
| 37,50&lt;br /&gt;
| 24 Bit Stereo-Audio-ADC  (SOIC-24) &lt;br /&gt;
| bis 192k&lt;br /&gt;
| &lt;br /&gt;
| [http://www.cirrus.com/en/products/cs5381.html Seite]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/ADS830 ADS830]&lt;br /&gt;
| 6,10&lt;br /&gt;
| 8 Bit ADC Parallel (SSOP-20) &lt;br /&gt;
| bis 60M&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.datasheetcatalog.com/datasheets_pdf/A/D/S/8/ADS830.shtml PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MCP3204 MCP3204]&lt;br /&gt;
| 2,65&lt;br /&gt;
| 12-Bit-SAR-ADC, Single Ended, 4 Kanäle mit MUX, Seriell (SPI), (DIL-14/SO-14) &lt;br /&gt;
| bis 100k&lt;br /&gt;
| C,R&lt;br /&gt;
| [http://ww1.microchip.com/downloads/en/DeviceDoc/21298c.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.ti.com/lit/ds/symlink/ads1113.pdf ADS1115]&lt;br /&gt;
| 2,40&lt;br /&gt;
| Quad 16-Bit-ADC, Seriell (i2C), (X2QFN)&lt;br /&gt;
| bis 3400&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.ti.com/lit/ds/symlink/ads1113.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LTC2440 LTC2440CGN]&lt;br /&gt;
| 8,40&lt;br /&gt;
| 24-Bit-ADC, Differentiell, Seriell (SPI), (SSOP-16)&lt;br /&gt;
| bis 3500&lt;br /&gt;
| R&lt;br /&gt;
| [http://cds.linear.com/docs/en/datasheet/2440fe.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DAC ===&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/DAC08 DAC08]&lt;br /&gt;
| 0,90&lt;br /&gt;
| 8-Bit DAC mit parallelem Businterface.&lt;br /&gt;
| Alt, preiswert. Benötigt viele µC Pins (min. 8, paralleler Bus) und eine doppelte Spannungsversorgung. Langsamere Version: 0808.&lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.google.de/search?q=DAC08+Datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/AD7524  AD7524]&lt;br /&gt;
| 3,00&lt;br /&gt;
| 8-Bit DAC mit parallelem Businterface&lt;br /&gt;
| Benötigt viele µC Pins. Single-Supply (5V bis 15V).&lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.google.de/search?q=7524+Datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TDA8444  TDA8444]&lt;br /&gt;
| 1,20&lt;br /&gt;
| Achtfach 6-Bit DAC mit seriellem TWI-Businterface. Bezahlbarer sechsfach-DAC, allerdings mit geringer Auflösung.&lt;br /&gt;
| Dort wo µC gesteuert viele Ausgangskanäle mit geringer, ungenauer Auflösung benötigt werden.&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.google.de/search?q=TDA8444+Datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/PCF8591 PCF8591]&lt;br /&gt;
| 2,50&lt;br /&gt;
| 8-Bit DAC, 8-Bit ADC mit seriellem TWI-Businterface.&lt;br /&gt;
| Z.B. in Regelkreisen wo sowohl ein DAC, als auch ein ADC benötigt wird.&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.google.de/search?q=PFC8591+Datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TDA8702 TDA8702]&lt;br /&gt;
| 2,50&lt;br /&gt;
| 8-Bit Video DAC mit parallelem Businterface und Clock-Eingang.&lt;br /&gt;
| Schnelle Wandlung bis 30 MHz. Benötigt viele µC Pins.&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.google.de/search?q=TDA8702+Datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LTC1661 LTC1661]&lt;br /&gt;
| 2,45&lt;br /&gt;
| Dual 10-bit DAC mit seriellem 3-Leitungs-Businterface.&lt;br /&gt;
| Guter Kompromiss aus Preis und Leistung. (Achtung, Micro-SO8-Gehäuse)&lt;br /&gt;
| F, C (Suchfunktion weigert sich manchmal ihn im Conrad-Shop zu finden), R&lt;br /&gt;
| [http://www.google.de/search?q=LTC1661+Datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LTC1257 LTC1257]&lt;br /&gt;
| 6,20&lt;br /&gt;
| 12-bit DAC mit kaskadierbarem seriellen 3-Leitungs-Businterface.&lt;br /&gt;
| Genauer µC-steuerbarer DAC.&lt;br /&gt;
| C, F, R&lt;br /&gt;
| [http://www.google.de/search?q=LTC1257+Datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LTC1456 LTC1456]&lt;br /&gt;
| 10,-&lt;br /&gt;
| 12-bit DAC mit kaskadierbarem seriellen 3-Leitungs-Businterface.&lt;br /&gt;
| Genauer µC-steuerbarer DAC.&lt;br /&gt;
| C&lt;br /&gt;
| [http://www.google.de/search?q=LTC1456+Datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MCP4922 MCP4922]&lt;br /&gt;
| 2,25&lt;br /&gt;
| 2Kanal 12-bit DAC mit SPI-Interface&lt;br /&gt;
| Genauer µC-steuerbarer DAC von Microchip.&lt;br /&gt;
| R&lt;br /&gt;
| [http://ww1.microchip.com/downloads/en/devicedoc/21897a.pdf Datenblatt]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sensoren (aktiv) ==&lt;br /&gt;
=== [[Temperatursensor|Temperatur]] ===&lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Temperatursensor]].&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM75 LM75]&lt;br /&gt;
| 1,75&lt;br /&gt;
| Temperatursensor mit I²C (TWI) Bus Interface (3.3V und 5V Version) (SMD)&lt;br /&gt;
| D, R, [https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=LM75 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/DS1621 DS1621]&lt;br /&gt;
| ~5&lt;br /&gt;
| Temperatursensor mit I²C (TWI) Bus Interface (wie LM75, kein SMD)&lt;br /&gt;
| C, D&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/DS18B20 DS18B20]&lt;br /&gt;
| 2,95&lt;br /&gt;
| Temperatursensor mit 1-Wire Interface&lt;br /&gt;
| D, R, [https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=DS18B20 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM35 LM35]&lt;br /&gt;
| 1,19&lt;br /&gt;
| Analoger Temperatursensor&lt;br /&gt;
| D, R&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=LM35 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM335 LM335]&lt;br /&gt;
| 0,87&lt;br /&gt;
| Analoger Temperatursensor&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=LM335 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TSIC306 TSIC306]&lt;br /&gt;
| 6&lt;br /&gt;
| Digitaler Temperatursensor (auch analog oder ratiometrisch)&lt;br /&gt;
| R,C&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=TSIC306 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TSIC506 TSIC506]&lt;br /&gt;
| 6&lt;br /&gt;
| Digitaler Temperatursensor (fertig kalibriert bis zu 0,1K zwischen 0-45°C)&lt;br /&gt;
| F&lt;br /&gt;
| [http://www.zmd.de/pdf/ZMD%20TSic%20Data%20Sheet%20V3%207.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wenn man z.&amp;amp;nbsp;B. einen Übertemperaturschutz bauen will, bei der es nur eine Schaltschwelle gibt, dann empfiehlt sich die Verwendung eines NTCs. Dessen Kennlinie ist gegenüber den Kennlinien von z.&amp;amp;nbsp;B. LM335 dahingehend im Vorteil, dass eine geringe Temperaturänderung besser messbar ist. Eine detailliertere Übersicht findet sich im Artikel [[Temperatursensor]]en, andere Sensoren sind in der [[:Category:Sensorik|Kategorie Sensorik]] zu finden.&lt;br /&gt;
&lt;br /&gt;
= Passive Bauelemente =&lt;br /&gt;
== Sensoren (passiv)==&lt;br /&gt;
=== Licht ===&lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Lichtsensor / Helligkeitssensor]].&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BPX65 BPX65]&lt;br /&gt;
| 4,25&lt;br /&gt;
| Fotodiode 10µA, 350-1000nm&lt;br /&gt;
| schnelle Lichtmessungen (bis MHz Bereich), großer Wellenlängenbereich&lt;br /&gt;
| R&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BPW34 BPW34]&lt;br /&gt;
| 0,59&lt;br /&gt;
| Fotodiode 80µA, 400-1100nm&lt;br /&gt;
| großer Wellenlängenbereich, Low Cost model, große Verfügbarkeit&lt;br /&gt;
| R&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BPW21 BPW21]&lt;br /&gt;
| 5,25&lt;br /&gt;
| Fotodiode 10µA, 550nm&lt;br /&gt;
| Lichtspektrum des menschlichen Auges&lt;br /&gt;
| R&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== [[Temperatursensor|Temperatur]] ===&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/KTY81 KTY81]&lt;br /&gt;
| ~0,50&lt;br /&gt;
| nichtlinear(*), bis 150°C&lt;br /&gt;
| in &amp;amp;#956;C Schaltungen&lt;br /&gt;
| R, D&lt;br /&gt;
| [http://www.semiconductors.philips.com/acrobat/datasheets/KTY84_SERIES_5.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/KTY84 KTY84]&lt;br /&gt;
| 0,72&lt;br /&gt;
| nichtlinear(*), bis 300°C&lt;br /&gt;
| in &amp;amp;#956;C Schaltungen&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.datasheetcatalog.org/datasheet2/e/0l2lc3p1dl8e5dgghsfh2oee43py.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/PT100 Pt100] / [http://www.mikrocontroller.net/part/PT1000 Pt1000]&lt;br /&gt;
| ab 3,00&lt;br /&gt;
| lineare Kennlinie&lt;br /&gt;
| analoge Messschaltungen&lt;br /&gt;
| F C R&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(*) Verschaltet man den Sensor als Spannungsteiler (Abgriff an den ADC), so erhält man dadurch eine meist ausreichende Linearisierung!&lt;br /&gt;
&lt;br /&gt;
== Widerstände ==&lt;br /&gt;
Mit einem Widerstandssortiment, welches die E12-Werte enthält, kann man normalerweise nicht falsch liegen. Denn früher oder später benötigt man jeden Widerstandswert der E12-Reihe einmal. Für einen Einstieg eignen sich die Sortimente vom Pollin. Auch ein Blick in Ebay kann sich lohnen, um ein Einstiegssortiment zu bekommen. Wer Schaltungen an Netzspannung entwickelt, sollte auf die &#039;&#039;Operation Voltage&#039;&#039; achten, denn nicht alle Typen weisen die nötige Spannungsfestigkeit auf. Als Daumenregel gilt: &amp;amp;frac12;-Watt-Widerstände oder größer passen immer, zwei bis drei in Reihe geschaltete &amp;amp;frac14;-Watt-Widerständen tun es auch.&lt;br /&gt;
&lt;br /&gt;
== Kondensatoren ==&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| 100nF Keramik&lt;br /&gt;
| ~0.05&lt;br /&gt;
| &lt;br /&gt;
| [[Kondensator#Entkoppelkondensator | Abblockkondensator]] zwischen VCC und GND vor allem bei Digital-ICs &lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q= PDF]&lt;br /&gt;
|-&lt;br /&gt;
| 100nF Keramik SMD 0603&lt;br /&gt;
| ~0.01 (bei 100 Stück)&lt;br /&gt;
| SMD 0603&lt;br /&gt;
| [[Kondensator#Entkoppelkondensator | Abblockkondensator]] zwischen VCC und GND vor allem bei Digital-ICs&lt;br /&gt;
| D&lt;br /&gt;
| [http://www.google.de/search?num=100&amp;amp;hl=de&amp;amp;q=datasheet+0603+chip-capacitors+filetype%3Apdf&amp;amp;btnG=Suche&amp;amp;meta=lr%3Dlang_de%7Clang_en PDF]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Mechanische Bauelemente =&lt;br /&gt;
&lt;br /&gt;
== Taster / Schalter ==&lt;br /&gt;
&lt;br /&gt;
== Steckverbinder ==&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| WSL 10G&lt;br /&gt;
| 0,07&lt;br /&gt;
| Wannenstecker, 10-polig, gerade, Raster 2,54 mm&lt;br /&gt;
| Verbindung zwischen zwei Platinen mit Flachbandkabel&lt;br /&gt;
| R, alle&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| PFL 10&lt;br /&gt;
| 0,09&lt;br /&gt;
| Pfostenleiste, 10-polig, Schneidklemmtechnik, Raster 2,54 mm&lt;br /&gt;
| Verbindung zwischen zwei Platinen mit Flachbandkabel&lt;br /&gt;
| R,alle&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| AWG 28-10G&lt;br /&gt;
| 0,70€/m&lt;br /&gt;
| Flachbandkabel, 10-polig, 3 Meter, Raster 1,27 mm&lt;br /&gt;
| Verbindung zwischen zwei Platinen mit Flachbandkabel&lt;br /&gt;
| R,alle&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| D-SUB BU 09FB&lt;br /&gt;
| 0,50&lt;br /&gt;
| D-Sub 9-polig auf 10-polig Pfostenleiste mit Flachbandkabel&lt;br /&gt;
| Anschluss für serielle Schnittstelle am PC&lt;br /&gt;
| R&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| KKxx025C&lt;br /&gt;
| 0,35 - 1,20&lt;br /&gt;
| Flachkabel-IC-Sockelverbinder, xx-polig (08, 14, 16, 18, 20, 28 erhältlich)&lt;br /&gt;
| Übergang von Leiterplatte auf Steckbrett&lt;br /&gt;
| R&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| Anreihklemmen&lt;br /&gt;
| 0,30 &lt;br /&gt;
| Reihenklemme/Anreihklemme (verschieden Typen, für Lochraster: Raster 5.08)&lt;br /&gt;
| Anschluss der Spannungsversorung, leistungsstarke Verbraucher&lt;br /&gt;
| alle&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 0,30&lt;br /&gt;
| Hohlstecker/DC-Stecker&lt;br /&gt;
| siehe englische Wikipedia [http://en.wikipedia.org/wiki/Coaxial_power_connector Coaxial power connector] &lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| SL 1X40G 2,54&lt;br /&gt;
| 0,20&lt;br /&gt;
| 40-pol. Stiftleiste (&amp;quot;Jumperleiste&amp;quot;), Raster 2,54mm (auch in anderen Polzahlen)&lt;br /&gt;
| z.B. mit Jumper als &amp;quot;Schalter&amp;quot;, für DuPont-Kabel, teilbar &lt;br /&gt;
| R, alle&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| Buchsenleiste&lt;br /&gt;
| ca 0,20&lt;br /&gt;
| Buchsenleiste, Raster 2,54mm, in versch. Polzahlen erhältlich&lt;br /&gt;
| z.B. als Sockel für Stiftleisten (&amp;quot;Jumperleisten&amp;quot;), teilbar (wenn man eine Buchse opfert) &lt;br /&gt;
| R, alle&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| präzisions Buchsenleiste&lt;br /&gt;
| ca 0,40&lt;br /&gt;
| präzisions Buchsenleiste, Raster 2,54mm, in versch. Polzahlen erhältlich&lt;br /&gt;
| für Jumperkabel oder Drähte, man kann sie anstatt IC-Sockel verwenden, meist teilbar, nicht geignet als Sockel für Stiftleisten (&amp;quot;Jumperleisten&amp;quot;) &lt;br /&gt;
| R, alle&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Lieferanten =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lokale Lieferanten: [[Lokale Anbieter]]&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Allgemeine Lieferantenliste: [[Elektronikversender]]&amp;lt;br&amp;gt;&lt;br /&gt;
Metallteile/Mechanik Lieferantenliste: [[Eisenwarenversender]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Kürzel&lt;br /&gt;
! Name&lt;br /&gt;
! Webseite&lt;br /&gt;
! Kommentar&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;b&amp;gt;B&amp;lt;/b&amp;gt;&lt;br /&gt;
|Bürklin&lt;br /&gt;
|[http://www.buerklin.de www.buerklin.de]&lt;br /&gt;
|Ladengeschäft in Oberhaching&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;b&amp;gt;C&amp;lt;/b&amp;gt;&lt;br /&gt;
|Conrad&lt;br /&gt;
|[http://www.conrad.de www.conrad.de]&lt;br /&gt;
|Gigantisches Sortiment, aber sehr hohe Preise. Nur zu empfehlen, wenn die benötigten Teile nirgendwo anders aufzutreiben sind. Trotzdem kann man auch hier gelegentlich ein Schnäppchen machen. Filialen haben nicht alle Katalogartikel auf Lager&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;b&amp;gt;D&amp;lt;/b&amp;gt;&lt;br /&gt;
|CSD-Electronics&lt;br /&gt;
|[http://www.csd-electronics.de www.csd-electronics.de]&lt;br /&gt;
|Kleiner Shop mit überschaubarem Sortiment und akzeptablen Preisen.&amp;lt;br /&amp;gt;Ladengeschäft in Bonn&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;b&amp;gt;DK&amp;lt;/b&amp;gt;&lt;br /&gt;
|Digikey&lt;br /&gt;
|[http://de.digikey.com www.de.digikey.com]&lt;br /&gt;
|Mindestbestellmenge von 65€, sonst 18€ Versandkosten&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;b&amp;gt;e&amp;lt;/b&amp;gt;&lt;br /&gt;
|elpro&lt;br /&gt;
|[http://www.elpro.org/shop/shop.php  http://www.elpro.org/shop/shop.php]&lt;br /&gt;
|großes Sortiment, sehr preiswert&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;b&amp;gt;F&amp;lt;/b&amp;gt;&lt;br /&gt;
|Farnell&lt;br /&gt;
|[http://www.farnell.de www.farnell.de]&lt;br /&gt;
|Versand nur Firmen &amp;amp; Studenten.  Farnell-Zwischenhändler für Privatkunden: HBE-Shop [http://www.hbe-shop.de] (wenn Ware im Shop nicht gelistet, einfach Farnell-Bestellnummer eingeben)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;b&amp;gt;I&amp;lt;/b&amp;gt;&lt;br /&gt;
|IT-WNS&lt;br /&gt;
|[http://www.it-wns.de www.it-wns.de]&lt;br /&gt;
|Kein Mindestbestellwert, geringe Versandkosten ab 2,45€&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;b&amp;gt;M&amp;lt;/b&amp;gt;&lt;br /&gt;
|Meilhaus&lt;br /&gt;
|[http://www.meilhaus.de www.meilhaus.de]&lt;br /&gt;
|Nur gewerbliche Kunden&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;b&amp;gt;P&amp;lt;/b&amp;gt;&lt;br /&gt;
|Pollin&lt;br /&gt;
|[http://www.pollin.de www.pollin.de]&lt;br /&gt;
|Hier finden sich viele Schnäppchen und Industrierestposten&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;b&amp;gt;U&amp;lt;/b&amp;gt;&lt;br /&gt;
|Mouser&lt;br /&gt;
|[http://www.mouser.com www.mouser.com]&lt;br /&gt;
| 20€ Versand, ab 65€ Versandkostenfrei. Großes Sortiment und meist die niedrigsten Preise wenn man größere Stückzahlen benötigt.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;b&amp;gt;R&amp;lt;/b&amp;gt;&lt;br /&gt;
|Reichelt&lt;br /&gt;
|[http://www.reichelt.de www.reichelt.de]&lt;br /&gt;
| Mindestbestellmenge von 10€, sonst Zuschlag von 3€, 5,60€ Versand, großes Sortiment und meist gute Preise&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Bauteile| ]]&lt;br /&gt;
[[Kategorie:Lieferanten]]&lt;br /&gt;
[[Kategorie:Liste mit Bauteilen]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Layoutsammlung&amp;diff=96497</id>
		<title>Layoutsammlung</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Layoutsammlung&amp;diff=96497"/>
		<updated>2017-06-01T07:38:25Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Änderung 96495 von 46.161.9.51 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Einige interessante Layouts aus der [http://www.mikrocontroller.net/forum/codesammlung Codesammlung]&lt;br /&gt;
----&lt;br /&gt;
Symbole zur Kennzeichnung des verwendeten CAD-Systems&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|(E)&lt;br /&gt;
|EAGLE Projekt, (E5) = EAGLE 5&lt;br /&gt;
|-&lt;br /&gt;
|(K)&lt;br /&gt;
|[[KiCAD]] Projekt&lt;br /&gt;
|-&lt;br /&gt;
|(P)&lt;br /&gt;
|Protel Projekt&lt;br /&gt;
|-&lt;br /&gt;
|(T)&lt;br /&gt;
|Target Projekt&lt;br /&gt;
|-&lt;br /&gt;
|(X)&lt;br /&gt;
|Rohdaten der Leiterplatte (pdf, gerber, usw.)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Audio ==&lt;br /&gt;
&lt;br /&gt;
* (E) [http://www.mikrocontroller.net/topic/114262 SD-Karten-Wave-Recorder] (ATXMega128A1 + 2x ATTiny2313)&lt;br /&gt;
&lt;br /&gt;
== Entwicklungsboard ==&lt;br /&gt;
* (X) [[Zilog Encore Experimentierplatine]]&lt;br /&gt;
&lt;br /&gt;
== Programmieradapter ==&lt;br /&gt;
&lt;br /&gt;
* (E) [[AVR HV-Programmer|Platinenlayout für ElmChans AVR HV-Programmer]]&lt;br /&gt;
&lt;br /&gt;
== RF, Funk ==&lt;br /&gt;
&lt;br /&gt;
* (E) [http://www.mikrocontroller.net/topic/90021#768374 Layout RFM12 Funkmodul]&lt;br /&gt;
* (E) [http://www.mikrocontroller.net/topic/68442#552128 USB RFID Tag Leser] für 64 Bit 125 kHz Tags&lt;br /&gt;
* (X) [[RFID Türmodul]]&lt;br /&gt;
&lt;br /&gt;
== Sonstiges ==&lt;br /&gt;
&lt;br /&gt;
* (E) [http://www.mikrocontroller.net/topic/120816 Giess-o-mat mit AVR] - Blumengiessanlage mit Atmega8&lt;br /&gt;
* (X) [[STK500USB-Adapter]] - USB zu RS232 Adapter mit Schaltregler zur Versorgung des [[STK500]] per USB&lt;br /&gt;
&lt;br /&gt;
== E-Tools ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/120124 Kleiner Funktionsgenerator mit Tiny2313]&lt;br /&gt;
* (E) [http://www.mikrocontroller.net/topic/103600 I2C (TWI) Sniffer mit AVR] (ATtiny85 mit 14,7456MHz Quarz)&lt;br /&gt;
* (K und X) [[Media:DC-50Ohm_Terminierung_RevE_25Mar2015.zip]] 50 Ohm DC entkoppelte Terminierung fuer Oszilloskope. [[Bild:DC-50Ohm_Terminierung_Downside.png|thumb|150px|Unterseite des DC-Messadapters mit kapazitiv entkoppelter 50 Ohm Terminierung]] [[Bild:DC-50Ohm_Terminierung_Upside.png|thumb|150px|Oberseite des DC-Messadapters mit kapazitiv entkoppelter 50 Ohm Terminierung]]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[Schaltplaneditoren]]&lt;br /&gt;
* [[AVR Softwarepool]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Category:Platinen]]&lt;br /&gt;
[[Kategorie:Listen]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Makro&amp;diff=96493</id>
		<title>Makro</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Makro&amp;diff=96493"/>
		<updated>2017-05-31T19:34:45Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Änderung 96491 von 46.161.9.51 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Makros sind eine mehr oder weniger große Anzahl von Anweisungen, die unter einer Kurzbezeichnung zu einer Gruppe zusammengefasst sind und als Einheit verwendbar sind. Makros werden i.d.R von [[Assembler]]sprachen angeboten, sind aber auch in einigen [[HLL|höheren Programmiersprachen]] verfügbar etwa in [[C]]/[[C-Plusplus|C++]] durch den [[C-Präprozessor]]. Schließlich gibt es auch reine Makrosprachen (etwa den Makroprozessor m4 von Unix/Linux), die als Werkzeug zur systematischen Transformation von Textdateien eingesetzt werden können.&lt;br /&gt;
&lt;br /&gt;
Hinsichtlich eines Makros ist zu unterscheiden zwischen dessen &#039;&#039;Definition&#039;&#039;, i.d.R. einmalig und VOR der ersten Verwendung (evtl. auch in [[Include-Files]]) und dessen &#039;&#039;Verwendungen&#039;&#039; (0-mal bis beliebig oft).&lt;br /&gt;
&lt;br /&gt;
== Allgemeines zu Makros ==&lt;br /&gt;
&lt;br /&gt;
Besonders flexibel sind &#039;&#039;&#039;parametrisierbare Makros&#039;&#039;&#039;. Die Makro-Definition ist dann als eine Schablone zu sehen, bei der einige Stellen noch offen gehalten wurden, um sie erst später, bei der Makro-Verwendung zu füllen. Bei der Programmierung haben parametrisierbare Makros eine gewisse Ähnlichkeit zu Unterprogrammen (mit Parametern), werden aber anders als diese zum Zeitpunkt der Übersetzung ausgeführt und hinsichtlich der Parameterwerte festgelegt. &lt;br /&gt;
&lt;br /&gt;
Bei der Programmierung von Mikrocontrollern ist es mitunter erforderlich, zwischen der Verwendung von Unterprogrammen und Makros abzuwägen. Universell wiederverwendbare, und deshalb in einer gewissen Umfang noch konfigurierbare Programmteile können in Form von Makros effizienter als Unterprogramme sein. Allerdings müssen die folgenden Voraussetzungen bestehen:&lt;br /&gt;
# Der &amp;quot;variable&amp;quot; Teil (= aktuelle Werte der Parameter) muss bei der Kompilierung festgelegt werden können. Sofern dieser Punkt nicht sichergestellt ist, scheiden (parametrisierte) Makros komplett aus. &lt;br /&gt;
# Der Makro wird nur ein einziges Mal in genau dieser Form verwendet. Ob die Mehrfachverwendung eines Makros mit identischen Parametern ein Vor- oder Nachteil gegenüber einem Unterprogramm ist, hängt davon ab, was optimiert werden soll. Im Hinblick auf die Ausführungsgeschwindigkeit ist der Makro vorteilhaft, geht es um geringe Code-Größe ist fast immer das Unterprogramm besser. Die Ausnahme von dieser Regel bilden triviale Makros, die weniger Maschinen-Code erzeugen als der Befehl für einen Unterprogrammsprung und die notwendige Parameterübergabe.&lt;br /&gt;
&lt;br /&gt;
== Makros vs. Inline-Funktionen ==&lt;br /&gt;
&lt;br /&gt;
Anstatt ein Makro zu verwenden, kann eine Funktion auch mit dem Schlüsselwort &amp;quot;inline&amp;quot; versehen werden. Dies ist ein Hinweis für den Compiler, dass er den Code der Inline-Funktion direkt an dieser Stelle einfügen soll, an der die Funktion aufgerufen wird. Ob der Compiler diesem Hinweis folgt, ist seine Entscheidung&amp;lt;ref&amp;gt;[https://gcc.gnu.org/onlinedocs/gcc/Hints-implementation.html#Hints-implementation GCC: Hints implementation]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[https://gcc.gnu.org/onlinedocs/gcc/Inline.html GCC: An Inline Function is As Fast As a Macro]&amp;lt;/ref&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vorteile von Inline Funktionen ===&lt;br /&gt;
;Typensicherheit: Der Compiler kann die Typen der Parameter prüfen und Fehler erkennen. Einem Makro kann eigentlich alles übergeben werden, was dann zu seltsamen Fehlermeldungen beim compilieren oder schlimmer einem seltsamen Programmverhalten führen. Beispiels sind im Artikel [[C-Präprozessor]] zu finden.&lt;br /&gt;
;Parameterauswertung: Die Parameter werden ausgewertet, bevor die Inline-Funktion aufgerufen wird. Insbesondere, wenn die Parameterauswertung Nebeneffekte wie Post-Increment hat oder ein Parameter mehrfach verwendet wird, helfen Inline-Funktionen, unangenehme Überaschungen zu vermeiden. Auch hier sei wieder für Beispiele auf den Artikel [[C-Präprozessor]] verwiesen.&lt;br /&gt;
;Makros sind nur Hacks: Makros sollten vermieden werden, da sie das Debuggen erschweren und sie der strukturierten Programmierung widersprechen. Insbesondere komplexe, vermeintlich geniale und verschachtelte Makros können für andere oder für einen selber nach einiger Zeit schon komplett unverständlich sein.&lt;br /&gt;
&lt;br /&gt;
=== Vorteile von Makros ===&lt;br /&gt;
;Textersetzung: Makros sind etwas flexibler, da in ihnen bestimme Code-Schnipsel, die oft vorkommen, zusammengefasst werden können. Erst nach dem Einbauen des Makros durch den Preprozessor muss sich gültiger C-Code ergeben. Dadurch können Makros an manchen Stellen sehr flexibel eingesetzt werden.&lt;br /&gt;
;Makros sind genial: Mit Makros kann man einige Sachen kompakt darstellen und inbesondere lästige Code-Wiederholungen vermeiden bzw. an eine Stelle zentral warten.&lt;br /&gt;
&lt;br /&gt;
== Also jetzt Makros oder Inline-Funktionen? ==&lt;br /&gt;
Es ist wohl zum Teil eine Glaubenfrage über die sich lange vortrefflich streiten lässt. Die einen sagen, dass eben schon immer Makros verwendet wurden und sie zu C einfach dazu gehören (und zu Assembler sowieso). Die anderen sehen sie eher als Altlast aus Zeiten an, in der Code in Assember geschrieben wurde, die Compiler schlecht waren und ein Goto nichts böses war....&lt;br /&gt;
&lt;br /&gt;
Die Erfahrung bei grösseren Projekten (vor allem im Nicht-uC oder 32-bit uC-Bereich) zeigt aber, dass der Einsatz von Makro mit Bedacht erfolgen sollte. Je abstrakter das Modul wird, desto weniger Makros sollten verwendet werden. Trotzdem sind Makros gerade dann sinnvoll, wenn man direkt an der Hardware programmiert und weit weg von strukturiert objektorientierter Programmierung ist. Um den einen oder anderen von Hand optimierten Hack kommt man dann einfach nicht herum, weil die der Compiler das sonst einfach doch nicht schafft.&lt;br /&gt;
&lt;br /&gt;
Trotzdem sei an dieser Stelle gewarnt, sich in vermeintlich tollen Makro zu verrennen, ohne über das ganze mal eine Nacht zu überschlafen. Jede vermeintliche Optimierung über Makro-Hacks sollte am Ende auch wirklich eine Optimierung sein. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;An dieser Stelle erwartet der Autor hitzige Debatten und praktische Beispiele darüber, was Compiler einfach nicht hinbekommen... :)&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[AVR Assembler Makros]]&lt;br /&gt;
* [[C Makros]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:C]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Aufl%C3%B6sung_und_Genauigkeit&amp;diff=96490</id>
		<title>Auflösung und Genauigkeit</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Aufl%C3%B6sung_und_Genauigkeit&amp;diff=96490"/>
		<updated>2017-05-31T16:58:16Z</updated>

		<summary type="html">&lt;p&gt;Sternst: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Immer wieder werden die beiden Parameter &#039;&#039;Auflösung&#039;&#039; und &#039;&#039;Genauigkeit&#039;&#039; verwechselt. Oft  werden Meßgeräte oder Sensoren mit einer hohen Auflösung beworben. Wenn man jedoch genauer nachliest, oder manchmal auch genauer nachmißt, stellt man fest, daß zwar viel Auflösung vorhanden ist, aber die Genauigkeit doch eher zu wünschen übrig läßt. Dieser Artikel soll Klarheit schaffen.&lt;br /&gt;
&lt;br /&gt;
== Auflösung ==&lt;br /&gt;
&lt;br /&gt;
Auflösung ist das Vermögen eines Messgerätes (z.&amp;amp;nbsp;B. [[AD-Wandler]]), zwischen zwei geringfügig verschiedenen Messwerten reproduzierbar einen Unterschied zu erkennen. Dabei spielt der absolute Betrag keine Rolle. Es werden nur relative Unterschiede betrachtet. Ein 8 Bit Wandler mit 5V Referenzspannung kann beispielsweise die Eingangsspannung in 20mV Schritten auflösen. Wenn die Eingangsspannungen zwischen zwei Messungen näher als 20 mV zusammen liegen kann der AD-Wandler keinen Unterschied messen (Es sei denn, es liegt zufällig eine Grenze zwischen zwei [[Quantisierung | Quantisierungsstufen]] dazwischen). Mit einem 16 Bit AD-Wandler und 5V Referenzspannung kann man die Eingangsspannung bereits auf 76 &amp;amp;mu;V auflösen, 256 mal besser als mit dem 8-Bit Wandler.&lt;br /&gt;
&lt;br /&gt;
== Genauigkeit ==&lt;br /&gt;
&lt;br /&gt;
Genauigkeit gibt an, wie weit das Messergebnis vom physikalisch absolut wahren Ergebnis abweicht (egal ob digital oder analog). Es werden dabei absolute Meßwerte betrachtet und mit einem genaueren Meßgerät verglichen. Z.B. zeigen zwei Armbanduhren die Zeit mit einer 1 Sekunde Auflösung an (hier wird bewußt die umgangssprachliche Formulierung „auf eine Sekunde genau“ vermieden). Wenn eine davon eine [[Funkuhr]] ist , wird diese immer die absolut richtige Zeit anzeigen, wie sie im Moment physikalisch exakt generiert werden kann. Die Zweite ist eine normale Quarzuhr und wird nach einem Monat vielleicht 10 Sekunden Abweichung anzeigen. Sie ist dann ungenau.&lt;br /&gt;
&lt;br /&gt;
== Eichen, Kalibrieren, Justieren ==&lt;br /&gt;
&lt;br /&gt;
Die meisten Meßgeräte müssen nach der Herstellung vor der Verwendung noch eingestellt werden, um das Maximum an Genauigkeit zu erreichen, welches durch die Schaltung möglich ist. Hierbei spricht man von justieren.&lt;br /&gt;
&lt;br /&gt;
Um jedoch ein Meßgerät justieren zu können, muß der Fehler, die sog. Meßungenauigkeit bekannt sein. Diese kann durch &#039;&#039;Kalibrieren&#039;&#039; oder &#039;&#039;Eichen&#039;&#039; ermittelt werden.&lt;br /&gt;
&lt;br /&gt;
Von &#039;&#039;Eichen&#039;&#039; spricht man, wenn die sog. &#039;&#039;Kalibrierung&#039;&#039; durch das Eichamt durchgeführt wird.&lt;br /&gt;
&lt;br /&gt;
Zum Eichen oder Kalibrieren benötigt man ein Referenzmaß (bei Waagen z. B. ein &amp;quot;Gewicht&amp;quot; mit genau bekannter Masse). Diese nennt man Eichmaß oder Referenz oder auch nationale Normale. Mit solchen Normalen wird auch im Eichamt ein Meßgerät kalibriert. Das ist sowohl ein technisch sehr aufwendiger als auch amtlich beglaubigter Vorgang und dementsprechend teuer. Das zu eichende Meßgerät wird während einer Messung über den gesamten Meßbereich mit dem Eichmaß verglichen und die Meßunsicherheit des Prüflings ermittelt. Das Eichen ist normalerweise nur für Meßgeräte vorgeschrieben, die für den Handel o.ä. verwendet werden, wie z.&amp;amp;nbsp;B. Waagen, Zapfsäulen, Portowaagen etc.&lt;br /&gt;
&lt;br /&gt;
Normalerweise spricht man aber von &#039;&#039;Kalibrieren&#039;&#039;. Der Vorgang ist physikalisch der gleiche. Dabei gibt es in Deutschland eine sog. Kalibrierpyramide. Dessen oberste Stelle ist die PTB, also die Physikalisch-Technische Bundesanstalt in Braunschweig. Die PTB kalibriert die &amp;quot;Normale&amp;quot; oder Referenzen der einzelnen Kalibrierlaboratorien. Darunter ist der DKD angesiedelt, dieser wiederum kalibriert Meßgeräte und Normale, die für Werkskalibrierungen verwendet werden. Mit den vom DKD kalibrierten Meßgeräten und Normalen werden dann Werkskalibrierungen durchgeführt, wie z.&amp;amp;nbsp;B. die Kalibrierung von Multimetern, Waagen, Messuhren ect. Kalibrieren kann man auch selber, indem man ein genaues Meßgerät mit seiner selbstgebauten Schaltung vergleicht und diese dementsprechend den Fehler bzw. die Abweichung seiner Schaltung ermittelt.&lt;br /&gt;
&lt;br /&gt;
Ist der Fehler zu groß, so muss bzw. kann die Schaltung oder das Meßgerät neu justiert werden, um den Fehler zu minimieren.&lt;br /&gt;
&lt;br /&gt;
== Veranschaulichung ==&lt;br /&gt;
&lt;br /&gt;
[[bild:kennlinien.png|thumb|right|300px|Messkurven]]&lt;br /&gt;
Wenn einem der Unterschied zwischen Genauigkeit und Auflösung langsam klar wird, dann versteht man auch, wie z.&amp;amp;nbsp;B. Multimeter Spannungen mit 40000 Schritten anzeigen (0,0025% = 25ppm Auflösung) aber „nur“ auf 0,1 bis 0,3% Genauigkeit kalibriert sind.&lt;br /&gt;
 &lt;br /&gt;
Nachfolgend sind die prinzipiellen Kennlinien einiger Meßgeräte dargestellt, um den Unterschied zwischen Auflösung und Genauigkeit bildlich darzustellen.  Auf der X-Achse ist dabei der wahre Meßwert dargestellt, die Y-Achse zeigt das Meßergebnis. Die Kennlinien sind bewußt extrem dargestellt um das Prinzip zu veranschaulichen.&lt;br /&gt;
&lt;br /&gt;
* K1 ist die Kennlinie eines idealen Meßgerätes. Es verfügt über eine unendlich hohe Auflösung, hat keinerlei Meßfehler (Genauigkeit) und ist vollkommen linear.&lt;br /&gt;
* K2 ist die Kennlinie eines AD-Wandlers mit hoher Genauigkeit. Die Auflösung ist zwar relativ niedrig (große Treppenstufen der Kennlinie), dafür liegen die Meßergebnisse nah an der idealen Kennlinie (hohe Genauigkeit).&lt;br /&gt;
* K3 ist die Kennlinie eines AD-Wandlers mit geringer Genauigkeit. Die Meßwerte weichen stark von der idealen Kennlinie ab, die hohe Auflösung nützt hier eher wenig.&lt;br /&gt;
* K4 ist ein weiterer Fall einer realen Kennlinie mit nichtlinearem Verlauf, resultierend in geringer Genauigkeit.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
== Zusammenfassung ==&lt;br /&gt;
&lt;br /&gt;
Auflösung und Genauigkeit sind zwei verschiedene Parameter. Eine hohe Auflösung bedeutet nicht automatisch eine hohe Genauigkeit und umgekehrt. Bei manchen Messungen braucht man nur eine hohe Auflösung mit geringer Genauigkeit, wenn beispielsweise vergleichende Messungen durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
== Forum ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/179966#1734002] Was bedeutet Grundgenauigkeit (bei einem Messgerät)?&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.ptb.de www.ptb.de]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Signalverarbeitung]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RFM69&amp;diff=95945</id>
		<title>RFM69</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RFM69&amp;diff=95945"/>
		<updated>2017-04-19T08:28:43Z</updated>

		<summary type="html">&lt;p&gt;Sternst: /* Ansteuerung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Datei:rf69cw.png|thumb|300px|RFM69CW, Pinkompatibel zum RFM12]]&lt;br /&gt;
Das RFM69 von HopeRF ist ein universelles Funkmodul für die ISM-Frequenzbänder 315, 433, 868 und 915 MHz. Eine [[SPI]]-Schnitttstelle ermöglicht die einfache Integration in Mikrocontrollerprojekte.&lt;br /&gt;
&lt;br /&gt;
== Ausführungen ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! RFM69HCW !! RFM69HW !! RFM69CW !! RFM69W&lt;br /&gt;
|-&lt;br /&gt;
| Sendeleistung || 20 dBm || 20 dBm || 13 dBm || 13 dBm&lt;br /&gt;
|-&lt;br /&gt;
| Pins || 16 || 16 || 14 || 16&lt;br /&gt;
|-&lt;br /&gt;
| Abmessungen || 16 x 16 mm || 19,7 x 16 mm || 16 x 16 mm || 19,7 x 16 mm&lt;br /&gt;
|-&lt;br /&gt;
| Sonstiges || Ersatz für RFM22B || || Ersatz für RFM12 ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die CW-Variante hat 2 Pins weniger (es fehlt der Pin DIO4), und ist Pinkompatibel zum Vorgänger RFM12B.&lt;br /&gt;
Es kann ohne Änderung am Layout oder der Schaltung ausgetauscht werden. Lediglich die Software muss angepasst werden.&lt;br /&gt;
&lt;br /&gt;
== Ausstattung ==&lt;br /&gt;
* Betriebsspannung 1,8 - 3,6 V&lt;br /&gt;
* SPI-Schnittstelle&lt;br /&gt;
* FSK- und OOK-Modulation (Frequency Shift Keying = Frequenzumtastung, On-Off-Keying = Amplitudentastung)&lt;br /&gt;
* Eingebauter Manchesterde- und -encoder&lt;br /&gt;
* Frequenzbereiche 315, 433, 868, 915 MHz&lt;br /&gt;
* Max. Datenrate 300 kbit/s&lt;br /&gt;
* Ausgangsleistung +13 dBm (rund 20 mW)&lt;br /&gt;
* Stromaufnahme 45 mA senden (13 dBm), 16 mA empfangen, 0,1 µA Standby&lt;br /&gt;
* Integrierte Packetengine für Synchronwort, CRC, Scrambling und AES-Verschlüsselung&lt;br /&gt;
* 66 Byte FIFO&lt;br /&gt;
* Modul basiert auf dem SX1231 von Semtech&lt;br /&gt;
&lt;br /&gt;
== Vergleich zum RFM12B ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! !! RFM12B !! RFM69(C)W&lt;br /&gt;
|-&lt;br /&gt;
| Versorgungsspannung || 2,2 - 3,8 V || 1,8 - 3,6 V&lt;br /&gt;
|-&lt;br /&gt;
| Max. Datenrate || 115,2 kbit/s || 300 kbit/s&lt;br /&gt;
|-&lt;br /&gt;
| Sendeleistung || 5 dBm || 13 dBm&lt;br /&gt;
|-&lt;br /&gt;
| Empfindlichkeit || -105 dB || -120 dB&lt;br /&gt;
|-&lt;br /&gt;
| Stromaufnahme || 22 mA/11 mA/0,3 µA || 45 mA/16 mA/0,1 µA&lt;br /&gt;
|-&lt;br /&gt;
| FIFO Größe || 16 Bit || 66 Bytes&lt;br /&gt;
|-&lt;br /&gt;
| Syncmustererkennung || Fest 0x2DD4 oder 0xD4 || Frei bis zu 8 Bytes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Ansteuerung ==&lt;br /&gt;
Das Funkmodul kommuniziert über die SPI Schnittstelle mit dem µC. Im einfachsten Fall werden SCK, MISO, MOSI und NSS benötigt. Am besten führt man auch noch DIO0 zum Prozessor. Dieser Pin kann softwareseitig so konfiguriert werden, dass er anzeigt, wenn ein Paket vollständig gesendet oder ein neues Paket empfangen wurde. Ist das Modul in Minimalkonfiguration angeschlossen, müssen dazu die Statusregister RegIrqFlags1 (0x27) oder RegIrqFlags2 (0x28) ausgelesen werden.&lt;br /&gt;
&lt;br /&gt;
Die SPI-Ansteuerung erfolgt im Modus CPOL=0, CPHA=0, wobei jeweils 16 Bits vom µC zum Modul geschickt werden:&lt;br /&gt;
Das erste Bit teilt dem Modul mit, ob es sich um einen Lese- (Bitwert 0) oder Schreibvorgang (Bitwert 1) handelt, die restlichen sieben Bit des ersten Bytes geben die Registeradresse an. Mit den zweiten acht Bit wird im Schreibmodus der zu übertragende Befehl an das Modul übermittelt, im Lesemodus kann eine beliebige Bitfolge gesendet werden. Während das zweite Byte gesendet wird, empfängt der µC sowohl im Lese- als auch im Schreibmodus den Inhalt des angesprochenen Registers vor dem aktuellen Zugriff.&lt;br /&gt;
&lt;br /&gt;
Werden nach dem Adressbyte mehrere Bytes empfangen oder gelesen, wird der Adresszeiger im RFM69 automatisch inkrementiert, so dass in einem einzigen Burst mehrere Register gelesen werden können. Zu beachten ist dabei, dass in Registern die mehr als 8 Bit breit sind (Frequenz, Bitrate, ...), das höchstwertige Byte zu erst geschrieben/gelesen wird (big endian). Wird das FIFO Register gelesen/geschrieben, wird der Adresszeiger nicht inkrementiert, so dass auf das FIFO in einem Burst zugegriffen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Funktionsweise ==&lt;br /&gt;
Es gibt zwei grundsätzliche Funktionsmodi, die im Register &amp;quot;RegDataModule&amp;quot; gewählt werden:&lt;br /&gt;
=== Continuous Mode ===&lt;br /&gt;
Für die Datenübertragung vom/zum Modul werden die beiden Pins &amp;quot;DIO1/DCLK&amp;quot; und &amp;quot;DIO2/DATA&amp;quot; verwendet. An DCLK gibt das Modul den Takt vor mit dem die Datenbits an DATA geschrieben oder gelesen werden müssen.&lt;br /&gt;
=== Packet Mode ===&lt;br /&gt;
Die Packetengine des RFM69 kümmert sich um die Erzeugung und Auswertung der Preamble, des Synchronwortes, des Scramblings, der CRC und der Verschlüsselung. Im Sendebetrieb bearbeitet die eingebaute Packet Engine ein Nutzdatenpaket folgendermaßen:&lt;br /&gt;
==== Fixed Length Format ====&lt;br /&gt;
===== Senden =====&lt;br /&gt;
* Einstellbare Anzahl (0-65535) von Preamblebytes (0xAA) an den Anfang setzen&lt;br /&gt;
* Synchronwort hinzufügen (Länge zwischen 0-8 Bytes einstellbar, Synchronwort selbst ebenfalls einstellbar)&lt;br /&gt;
* Nutzdaten hinzufügen (Länge wird in einem Register angegeben)&lt;br /&gt;
* CRC hinzufügen (abschaltbar)&lt;br /&gt;
===== Empfangen =====&lt;br /&gt;
* Länge des zu empfangenden Frames wird in einem Register angegeben&lt;br /&gt;
==== Variable Length Format ====&lt;br /&gt;
===== Senden =====&lt;br /&gt;
* Länge des zu sendenen Frames in einem Register angeben. Die Packetengine sendet das Längenbyte automatisch vor den Nutzdaten&lt;br /&gt;
===== Empfangen =====&lt;br /&gt;
* Packetengine erkennt automatisch die Packetlänge&lt;br /&gt;
==== Unlimited Length Packet Format ====&lt;br /&gt;
===== Senden =====&lt;br /&gt;
* Beliebig lange Frames; Senden muss von der Software selber gestoppt werden&lt;br /&gt;
===== Empfangen =====&lt;br /&gt;
* Empfangen muss von der Software selber gestoppt werden&lt;br /&gt;
&lt;br /&gt;
== Interrupts ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bezeichnung !! Beschreibung !! Verfügbar an (Packet mode) !! Verfügbar an (Cont. mode)&lt;br /&gt;
|-&lt;br /&gt;
| ModeReady || Beispiel || DIO5&lt;br /&gt;
|-&lt;br /&gt;
| RxReady || Beispiel || Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| TxReady || Beispiel || DIO3, DIO0&lt;br /&gt;
|-&lt;br /&gt;
| PllLock || Beispiel || DIO3, DIO1, DIO0&lt;br /&gt;
|-&lt;br /&gt;
| Rssi || Eingestellte Rssi-Schwelle überschritten; wird gelöscht wenn RX Modus verlassen wird || DIO0, DIO3 || DIO0, DIO3, DIO5&lt;br /&gt;
|-&lt;br /&gt;
| Timeout || Beispiel || DIO1&lt;br /&gt;
|-&lt;br /&gt;
| AutoMode || Beispiel || DIO2&lt;br /&gt;
|-&lt;br /&gt;
| SyncAddressMatch || Syncadresse empfangen || DIO0, DIO3 || DIO0, DIO1&lt;br /&gt;
|-&lt;br /&gt;
| FifoFull || Beispiel || DIO3, DIO1&lt;br /&gt;
|-&lt;br /&gt;
| FifoNotEmpty || || DIO2, DIO1&lt;br /&gt;
|-&lt;br /&gt;
| FifoLevel || || DIO1&lt;br /&gt;
|-&lt;br /&gt;
| FifoOverrun || ||&lt;br /&gt;
|-&lt;br /&gt;
| PacketSent || || DIO0&lt;br /&gt;
|-&lt;br /&gt;
| PayloadReady || || DIO0&lt;br /&gt;
|-&lt;br /&gt;
| CrcOk || || DIO0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Pinbelegung RFM69(H)CW ==&lt;br /&gt;
[[Datei:RFM12 69 Pins.svg|Anschlussbelegung RFM12B und RFM69]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Pinnummer !! Name !! Richtung !! Fktn. im packet mode !! Fktn. im cont. mode!! Pin am RFM12&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ANA || || Antennenanschluss || || ANT&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 3.3V || || Versorgungsspannung || || VDD&lt;br /&gt;
|-&lt;br /&gt;
| 3 || GND || || || ||GND&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DIO3 || || FifoFull&amp;amp;nbsp;PllLock&amp;lt;br/&amp;gt;Rssi&amp;lt;br/&amp;gt;SyncAdress&amp;lt;br/&amp;gt;TXReady || || nINT/VDI&lt;br /&gt;
|-&lt;br /&gt;
| 5 || MOSI || || SPI Daten Eingang || || SDI&lt;br /&gt;
|-&lt;br /&gt;
| 6 || SCK || || SPI Takt || || SCK&lt;br /&gt;
|-&lt;br /&gt;
| 7 || NSS || || Chip select || || nSEL&lt;br /&gt;
|-&lt;br /&gt;
| 8 || MISO || || SPI Daten Ausgang || || SDO&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DIO0 || || PllLock (FS, TX)&amp;lt;br/&amp;gt;CrcOK (RX)&amp;lt;br/&amp;gt;PayloadReady (RX)&amp;lt;br/&amp;gt;SyncAddress (RX)&amp;lt;br/&amp;gt;Rssi (RX)&amp;lt;br/&amp;gt;PacketSent (TX)&amp;lt;br/&amp;gt;TxReady (TX) || ModeReady&amp;lt;br /&amp;gt;&lt;br /&gt;
PllLock&amp;lt;br /&amp;gt;&lt;br /&gt;
SyncAddress&amp;lt;br /&amp;gt;&lt;br /&gt;
Timeout&amp;lt;br /&amp;gt;&lt;br /&gt;
Rssi&amp;lt;br /&amp;gt;&lt;br /&gt;
TxReady || nIRQ&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DIO2 || || FifoNotEmpty (Sleep, Stdby, FS, RX, TX)&amp;lt;br/&amp;gt;AutoMode(Sleep, Stdby, FS, RX, TX)&amp;lt;br/&amp;gt;Data (RX, TX) || Data || FSK&amp;lt;br /&amp;gt;DATA&amp;lt;br /&amp;gt;nFFS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DIO1 || || FifoLevel (Sleep, Stdby, FS, RX, TX)&amp;lt;br/&amp;gt;FifoFull (Sleep, Stdby, FS, RX, TX)&amp;lt;br/&amp;gt;FifoNotEmpty (Sleep, Stdby, FS, RX, TX)&amp;lt;br/&amp;gt;PllLock (FS, TX)&amp;lt;br/&amp;gt;Timeout (RX) || PllLock&amp;lt;br /&amp;gt;&lt;br /&gt;
Dclk&amp;lt;br /&amp;gt;&lt;br /&gt;
RxReady&amp;lt;br /&amp;gt;&lt;br /&gt;
SyncAddress&amp;lt;br /&amp;gt;&lt;br /&gt;
TxReady&amp;lt;br /&amp;gt;&lt;br /&gt;
 || DCLK/CFIL/FFIT&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DIO5 || || ModeReady&amp;lt;br/&amp;gt;ClkOut (Stdby, FS, RX, TX)&amp;lt;br/&amp;gt;Data (RX, TX) || ||CLK&lt;br /&gt;
|-&lt;br /&gt;
| 13 || RESET || || || || nRES&lt;br /&gt;
|-&lt;br /&gt;
| 14 || GND || || || || GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Register ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Adresse !! Registername !! Beschreibung !! Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || RegFifo || Zugriff auf das FIFO Register&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || RegOpMode || Betriebsart (senden, empfangen, ...) || 0x04 = Empfangen&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || RegDataModule || Modulationsart &amp;amp;-shaping, Packetengine || 0x00 = FSK, Packetengine aktiv&lt;br /&gt;
|-&lt;br /&gt;
| 0x03 - 0x04|| RegBitrate || = FXOSC/Bitrate || 0x1A0B = 6667 -&amp;gt; 4,8 kbit/s&lt;br /&gt;
|-&lt;br /&gt;
| 0x05 - 0x06 || RegFdev || Frequenzabweichung (Hub * 2) || 0x52 = 82 -&amp;gt; 5 kHz&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 - 0x09 || RegFrf || Mittenfrequenz || 0xD91333 = 14226227 -&amp;gt; 868,300 MHz&lt;br /&gt;
|-&lt;br /&gt;
| 0x11|| RegPaLevel || Sendeleistung || 0x12 = 18 -&amp;gt; 0 dBm&lt;br /&gt;
|-&lt;br /&gt;
| 0x19|| RegRxBw || Filterbandbreite || 0b01001 -&amp;gt; 200 kHz&lt;br /&gt;
|-&lt;br /&gt;
| 0x25|| RegDioMapping1 || DIO Funktionen ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x27|| RegIrqFlags1 || Statusflags (ModeReady, RxReady, TxReady, PllLock, RSSI, Timeout, AutoMode, SyncAddressMatch) || 0xD0 -&amp;gt; Empfänger bereit zum Datenempfang&lt;br /&gt;
|-&lt;br /&gt;
| 0x28|| RegIrqFlags2 || Statusflags (FifoFull, FifoNotEmpty, FifoLevel, FifoOverrun, PacketSent, PayloadReady, CrcOk, LowBat) || 0x06 -&amp;gt; Daten mit erfolgreichem CRC empfangen&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C - 0x2D|| RegPreamble || Preamblelänge ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || RegSyncConfig || Synchronworteinstellungen ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F - 0x36 || RegSyncValue || Synchronwort || 0x2DD4&lt;br /&gt;
|-&lt;br /&gt;
| 0x37 || RegPacketConfig1 || Einstellungen Packetengine ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 || RegPayloadLength || Datenpacketgröße ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software Implementierungen ==&lt;br /&gt;
* [https://github.com/LowPowerLab/RFM69 Arduinobibliothek (C++) von LowPowerLab]&lt;br /&gt;
* [https://github.com/jcw/jeelib Arduinobibliothek (C++) für JeeNodes]&lt;br /&gt;
* [https://github.com/gkaindl/rfm12b-linux Linux Kerneltreiber (C) für RFM12 und RFM69]&lt;br /&gt;
* [https://github.com/ahessling/RFM69-STM32 Bibliothek (C++) für STM32]&lt;br /&gt;
* [https://github.com/etrombly/RFM69 RFM69 Anbindung in Python]&lt;br /&gt;
* [https://github.com/russss/rfm69-python RFM69 Anbindung in Python]&lt;br /&gt;
* [https://github.com/cristi85/RFM69 RFM69 in C]&lt;br /&gt;
&lt;br /&gt;
== Projekte ==&lt;br /&gt;
&lt;br /&gt;
=== Intertechno Funksteckdosen schalten ===&lt;br /&gt;
Hier gibt es einen Artikel wie mit einem Raspberry Pi und einem RFM69 Modul Funksteckdosen angesteuert werden:&lt;br /&gt;
[[http://www.seegel-systeme.de/2015/09/05/funksteckdosen-mit-dem-raspberry-pi-steuern/ Funksteckdosen am Raspberry Pi]]&lt;br /&gt;
&lt;br /&gt;
=== FS20 Funksteckdosen schalten ===&lt;br /&gt;
Da das RFM69 OOK modulieren kann, können damit die FS20 Funksteckdosen geschaltet werden. FS20 verwendet allerdings eine Art Pulsdauermodulation; eine 1 wird mit 600&amp;amp;nbsp;µs Träger an gefolgt von 600&amp;amp;nbsp;µs Träger aus, und eine 0 mit 400&amp;amp;nbsp;µs an gefolgt von 400&amp;amp;nbsp;µs aus übertragen. Man teilt einfach das Signal in 200&amp;amp;nbsp;µs Schlitze ein (OOK-Datenrate 5&amp;amp;nbsp;kbit/s), und sendet für eine 1 die Folge 111000 und für eine 0 die Folge 1100. Im FS20 Protokoll wird ein 13 Bit langer Header (0000000000001) übertragen, diesen kann man umrechnen und im RFM69 als Syncword einstellen. So wird der Header vom RFM69 bei jeder Übertragung automatisch vorweg ausgesendet.&lt;br /&gt;
&lt;br /&gt;
=== Conrad Energy Count 3000 ===&lt;br /&gt;
Unter http://forum.jeelabs.net/node/3412679.html?page=1 wurde schon das Protokoll der Conrad Energy Count 3000 (baugleich mit Technoline Cost Control RC) Funk-Energiekostenmessgeräte beschrieben. Mit dem RFM69 lässt sich ein Frame des Messgerätes mit dem konfigurierbarem Synchronwortfinder bequem empfangen.&lt;br /&gt;
&lt;br /&gt;
=== LaCrosse Temperatursensoren empfangen ===&lt;br /&gt;
=== Open Energy Monitor empfangen ===&lt;br /&gt;
&lt;br /&gt;
== Hardware mit RFM69 ==&lt;br /&gt;
* [http://www.seegel-systeme.de/produkt/raspyrfm-ii/ RaspyRFM, ein Aufsteckmodul für den Raspberry Pi]&lt;br /&gt;
* [https://lowpowerlab.com/guide/moteino/ Moteino, Arduino kompatibles Board mit RFM69]&lt;br /&gt;
* [http://shop.in-circuit.de/product_info.php?cPath=22_27&amp;amp;products_id=159 radino, Minimodul mit ATMega32u4 und RFM69]&lt;br /&gt;
* [https://www.adafruit.com/product/3177 Adafruit Feather M0, Modul mit Atmel ARM und RFM69]&lt;br /&gt;
&lt;br /&gt;
== Themen zum RFM69 im Forum ==&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/332579 Thread im Forum: Wer verwendet RFM69]&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/397900 RFM69 - Beispiel für Initialisierung gesucht]&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/409803 RFM69 - RSSI Messung]&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/359345 Simple SPI Interaktion mit dem rfm69 Modul]&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/400123 RFM69 Sleep Mode]&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/369204 Raspberry Pi mit RFM69 und FS20]&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/370196 RFM 69 Hub, Bandbreite, Bitrate?]&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/421164 RFM69 AFC Versatz auslesen?]&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/372914 Umstieg von RFM22 auf RFM69]&lt;br /&gt;
&lt;br /&gt;
== Bezugsquellen ==&lt;br /&gt;
* [http://www.seegel-systeme.de/produkt/funkmodul-rfm69cw-rev-v1-0-smd/ Seegel Systeme]&lt;br /&gt;
* Pollin: [http://www.pollin.de/shop/dt/Nzk2OTgxOTk-/Bausaetze_Module/Module/Funkmodul_HOPERF_RFM69CW_433_MHz_TX_RX.html 433 MHz] / [http://www.pollin.de/shop/dt/Njk2OTgxOTk-/Bausaetze_Module/Module/Funkmodul_HOPERF_RFM69CW_868_MHz_TX_RX.html 868 MHz]&lt;br /&gt;
* [http://www.aliexpress.com/item/RFM69CW-13dBm-transceiver-module-pin-to-pin-compatible-to-RFM12B-433-868-915mhz-can-be-selected/2010762457.html AliExpress]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.hoperf.com/upload/rf/RFM69CW-V1.1.pdf Datenblatt RFM69CW]&lt;br /&gt;
* [http://www.hoperf.com/upload/rf/RFM69W-V1.3.pdf Datenblatt RFM69W]&lt;br /&gt;
* [http://www.semtech.com/images/datasheet/sx1231.pdf Datenblatt Semtech SX1231]&lt;br /&gt;
* [http://www.semtech.com/images/datasheet/AN1200.18_STD.pdf Application Note zur Softwareimplementierung von Data-Whitening und CRC]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:RFM12]]&lt;br /&gt;
[[Kategorie:Funk]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Temperatursensor&amp;diff=94743</id>
		<title>Temperatursensor</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Temperatursensor&amp;diff=94743"/>
		<updated>2017-01-03T21:26:36Z</updated>

		<summary type="html">&lt;p&gt;Sternst: /* TSYS01 / G-NICO-018 von Measurement Specialties Inc. */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Will man mit einem [[Mikrocontroller]] Temperaturen messen, dann braucht man&lt;br /&gt;
* einen [[Sensor]], der die Temperatur z.&amp;amp;nbsp;B. in eine Spannung oder einen Strom umsetzt&lt;br /&gt;
* einen [[ADC | AD-Wandler]], der das Signal digitalisiert. Der kann auf dem Sensor oder dem Mikrocontroller integriert sein.&lt;br /&gt;
&lt;br /&gt;
Temperatursensoren gibt es nun in allen möglichen Varianten. Vom temperaturabhängigen [[Widerstand]] bis zum fertig abgeglichenen All-in-one-Bauteil mit digitalem Ausgang. Wie bei allen Sensoren sollte man auch hier genau hinschauen und [[Auflösung und Genauigkeit]] unterscheiden.&lt;br /&gt;
&lt;br /&gt;
== Analoge Temperatursensoren ==&lt;br /&gt;
&lt;br /&gt;
=== PT100 ===&lt;br /&gt;
&lt;br /&gt;
Unter einem PT100 versteht man einen Platinwiderstand, der bei 0°C einen Widerstand von 100Ω hat.&lt;br /&gt;
Platinwiderstände sind temperaturabhängige Widerstände mit hoher Wiederholgenauigkeit und Konstanz[http://de.wikipedia.org/wiki/Konstante].  Wegen der relativ geringen Widerstandsänderung von nur ca. 0,4Ω pro Grad ist etwas mehr Schaltungsaufwand erforderlich als bei anderen Sensoren. Genauere Formeln zur Temperaturbestimmung gibt es u.a. bei [http://de.wikipedia.org/wiki/Pt100 Wikipedia]. Ein Schaltplan findet sich bei der [http://www.heise.de/ct/artikel/Sensibelchen-289608.html c&#039;t].&lt;br /&gt;
&lt;br /&gt;
Die Sensoren gibt es auch mit anderen Widerstandswerten, z.&amp;amp;nbsp;B. mit 1000&amp;amp;Omega; und heißen dann entsprechend PT1000.&lt;br /&gt;
&lt;br /&gt;
Vorteil:&lt;br /&gt;
* genormt&lt;br /&gt;
* großer Meßbereich&lt;br /&gt;
* hohe Linearität&lt;br /&gt;
* hohe Wiederholgenauigkeit&lt;br /&gt;
* einfach austauschbar&lt;br /&gt;
&lt;br /&gt;
Nachteil:&lt;br /&gt;
* brauchen aufwändigere Auswerteschaltung&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* [http://de.wikibooks.org/wiki/Linearisierung_von_resistiven_Sensoren/_Pt100 Wikibooks: Linearisierung von resistiven Sensoren - PT100]&lt;br /&gt;
* [http://www.heise.de/ct/04/22/236/ c&#039;t-Artikel: Mikrocontroller-Programmierung: Timer, Sensoren und Drehgeber (mit PT100 Schaltung)]&lt;br /&gt;
* [http://www.maxim-ic.com/app-notes/index.mvp/id/3450 Maxim AN3450 Positive Analog Feedback Compensates PT100 Transducer]&lt;br /&gt;
* [http://www.maxim-ic.com/app-notes/index.mvp/id/4875 Maxim AN4875 High-Accuracy Temperature Measurements Call for Platinum Resistance Temperature Detectors (PRTDs) and Precision Delta-Sigma ADCs]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/AppNotes/01154a.pdf Microchip AN1154 Precision RTD Instrumentation for Temperature Sensing]&lt;br /&gt;
* [http://www.analog.com/static/imported-files/application_notes/AN709_0.pdf Analog Devices AN709 RTD Interfacing and Linearization Using an ADuC8xx MicroConverter]&lt;br /&gt;
&lt;br /&gt;
=== NTC/PTC ===&lt;br /&gt;
&lt;br /&gt;
NTC und PTC sind temperaturabhängige Widerstände.&lt;br /&gt;
&lt;br /&gt;
* NTC (engl. &#039;&#039;&#039;N&#039;&#039;&#039;egative &#039;&#039;&#039;T&#039;&#039;&#039;emperature &#039;&#039;&#039;C&#039;&#039;&#039;oefficient, Heißleiter), hat bei hohen Temperaturen seinen niedrigsten Widerstand, z.&amp;amp;nbsp;B. Silizium&lt;br /&gt;
* PTC (engl. &#039;&#039;&#039;P&#039;&#039;&#039;ositive &#039;&#039;&#039;T&#039;&#039;&#039;emperature &#039;&#039;&#039;C&#039;&#039;&#039;oefficient, Kaltleiter), hat bei niedrigen Temperaturen seinen geringsten Widerstand, z.&amp;amp;nbsp;B. Glühlampe&lt;br /&gt;
&lt;br /&gt;
Um den Widerstandswert zu messen schaltet man sie mit einem normalen Widerstand oder einer [[Konstantstromquelle]] in Reihe zu einem [[Spannungsteiler]] und misst den Spannungsabfall. Eine Beispielschaltung findet sich [http://www.mathar.com/msp_thermo1.html hier].&lt;br /&gt;
&lt;br /&gt;
Vorteil:&lt;br /&gt;
* billig (z.B. [http://www.reichelt.de/?ARTICLE=9595 KTY81-120] 1 kΩ bei Reichelt  ~&amp;lt;strikethrough&amp;gt;0,50&amp;lt;/strikethrough&amp;gt; 0,70 &amp;amp;euro;)&lt;br /&gt;
&lt;br /&gt;
Nachteil:&lt;br /&gt;
* müssen für höhere Genauigkeiten abgeglichen werden&lt;br /&gt;
* brauchen A/D-Wandler&lt;br /&gt;
* sind nichtlinear&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* KTY10-5&lt;br /&gt;
* KTY13-6&lt;br /&gt;
* KTY81-121&lt;br /&gt;
* KTY81-122&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* [http://www.sprut.de/electronic/temeratur/temp.htm Temperaturabhängige Stromquelle und NTC/PTC inclusive Linearisierung]&lt;br /&gt;
*[http://www.umnicom.de/Elektronik/Mikrokontroller/Atmel/AtFan/AtFan.html#2.2.2 Berechnung des Linearisierungswiderstandes für gewünschten Temperaturbereich] der fällt sonst immer vom Himmel&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/208587#2065880 KTY 10-5 Formelprobleme]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/225563 Codesammlung: Beispiel mit 0,5°C Auflösung]&lt;br /&gt;
* [http://preis-ing.de/extras/alle-berechnungen-im-schnellzugriff/automatisches-erzeugen-einer-ntc-tabelle/ Automatisches Erzeugen von C-Code zur NTC Auswertung] Aus den NTC Parametern und den Anforderungen wird  ein schneller und schlanker C-Code generiert.&lt;br /&gt;
&lt;br /&gt;
=== LMx35 ===&lt;br /&gt;
&lt;br /&gt;
Eine IC-Familie, die pro Kelvin Temperaturänderung ihre Ausgangsspannung um 10&amp;amp;nbsp;mV ändert. Die ICs gibt es in verschiedenen Genauigkeiten und Temperaturbereichen mit den Bezeichnungen LM135(A), LM235(A) und LM335(A). Der günstigste ist der LM335 mit einem Temperaturbereich von −40 … +100°C.&lt;br /&gt;
In verschiedenen Bauformen erhältlich. Beispielschaltungen finden sich im [http://www.national.com/ds.cgi/LM/LM135.pdf Datenblatt] und [http://www.suessbrich.info/elek/elektherm1.html hier]&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* hat auch ohne Kalibrierung eine Genauigkeit von einem Grad (bei 25°C)&lt;br /&gt;
* relativ billig (LM335 bei Reichelt ab 0,76&amp;amp;nbsp;€)&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* benötigt A/D-Wandler&lt;br /&gt;
* bei längerer Anschlussleitung störanfällig&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* [http://www.schramm-software.de/tipps/temperaturmessung/analogsensoren.htm Test-Schaltungen und -Code zur Auswertung mit ADC (AVR-Assembler)]&lt;br /&gt;
&lt;br /&gt;
=== LM334 ===&lt;br /&gt;
&lt;br /&gt;
Ein IC ähnlich dem LM335 mit dem Unterschied, dass der durch das IC fließende Strom proportional von der Temperatur abhängt. Mit einer einfachen Schaltung aus nur zwei Widerständen kann man dann den Strom in einer Weise wandeln, dass pro Kelvin eine Spannungsänderung von 10mV ausgegeben wird. Da die Strom-Spannungswandlung auf der Platine (und damit nahe am AD-Wandler) stattfindet und die Übertragung des Messwerts durch einen Strom stattfindet, sind Störungen durch Netzbrummen etc. viel geringer als beim LM335&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
&amp;lt;!-- * hat auch ohne Kalibrierung eine Genauigkeit von einem Grad (bei 25°C) &lt;br /&gt;
Laut Datenblatt +-3°C&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* relativ billig ([http://www.reichelt.de/?ARTICLE=10468 Reichelt 0,54 &amp;amp;euro;])&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* benötigt A/D-Wandler&lt;br /&gt;
* Bereich 0°C-70°C&lt;br /&gt;
&lt;br /&gt;
Ähnliche ICs:&lt;br /&gt;
* AD592 (Ausgangsstrom 1µA pro Kelvin, absolute Temperatur) [http://www.reichelt.de/?ARTICLE=3825 Reichelt: 3,75 €], Conrad 174912 8,50 &amp;amp;euro;&lt;br /&gt;
&lt;br /&gt;
=== SMT160-30 ===&lt;br /&gt;
&lt;br /&gt;
Ist ein Zwischending zwischen Digital und Analog. Sein Ausgangssignal ist ein digitales PWM-Signal, zu dessen Messung man am besten den Input-Capture-Eingang eines Mikrocontrollers verwendet. Man kann ihn also wie einen analogen Sensor nur indirekt auslesen, anstatt über einen AD-Wandler hier über einen Timer.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* Digitales PWM-Signal ist unempfindlich gegen Störeinflüsse&lt;br /&gt;
* gibt es in SO8, TO18, TO92 und &amp;lt;b&amp;gt;TO220&amp;lt;/b&amp;gt;, gut befestigbar, z.B am Kühlkörper&lt;br /&gt;
* linear&lt;br /&gt;
* kein Abgleich nötig&lt;br /&gt;
&lt;br /&gt;
Nachteile (viele):&lt;br /&gt;
* benötigt Timer&lt;br /&gt;
* jittert extrem, genaue Messungen nur über Mittelung / Filterung möglich&lt;br /&gt;
* nicht nur das PWM-Verhältnis, sondern auch die Frequenz ist temp-abhängig (1-4kHz)&lt;br /&gt;
* teuer (Farnell 10,90&amp;amp;euro; +16%, Conrad 9,xx&amp;amp;euro; , www.hy-line.de ??).&lt;br /&gt;
* TO92 Gehäuse ist günstiger, dafür weniger genau&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* http://www.hy-line.de/co/sensor-tec/hersteller/smartec/smt-160-30/index.html&lt;br /&gt;
&lt;br /&gt;
=== Thermoelement ===&lt;br /&gt;
&lt;br /&gt;
Ein Thermoelement besteht im einfachsten Fall aus zwei ungleichen Metallendrähten, die an einem Punkt miteinander verbunden sind und bei dem die Verbindungsstelle einer anderen Temperatur ausgesetzt ist als die offenen Enden der Drähte. An den offenen Enden der Drähten entsteht eine Spannung (Thermospannung). Dieser Effekt wurde 1821 von Thomas Seebeck entdeckt ([http://de.wikipedia.org/wiki/Seebeck-Effekt Seebeck-Effekt] bei Wikipedia). Eine weitere Anwendung ist der thermoelektrische Generator (&amp;quot;Thermogenerator&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
* MCP3421 18bit ADC 15SPS, I2C, auch mit andere Auflösungen erhältlich, Thermoelement kann direkt angeschlossen werden! (Reichelt : 2,10€)&lt;br /&gt;
&lt;br /&gt;
Vorteil:&lt;br /&gt;
* über einen sehr weiten Temperaturbereich einsetzbar&lt;br /&gt;
&lt;br /&gt;
Nachteil:&lt;br /&gt;
* die sehr geringen Temperaturspannungen im Mikrovoltbereich benötigen eine sehr gute Auswertelektronik (guter Analogteil + AD-Wandler). (aber: beachte MCP3421)&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
&amp;lt;!-- Der Link wird von NI umgebogen zur Homepage. Recherche nach dem Autor brachte nix hervor :-(&lt;br /&gt;
* [http://digital.ni.com/worldwide/germany.nsf/web/all/7A4F02BAEFEC22AC802567F6003E0D6E  Temperaturmessung mit Thermoelementen] - Eine Einführung von David Potter (deutsche Überarbeitung: G.Sinkovic) (inkl. Erläuterung der Kaltstellenkompensation) --&amp;gt;&lt;br /&gt;
* [http://www.sensorwell.at/fileadmin/templates/images/data_sheets/temperatur_messtechnik.pdf Warum Thermoelemente Relativtemperaturen messen! oder Was ist eine Kaltstelle?] - Technische Information von www.sensorwell.at (PDF, ca. 600kB)&lt;br /&gt;
&lt;br /&gt;
=== indirekte Messung über die Temperaturabhängigkeit der Schallgeschwindigkeit ===&lt;br /&gt;
&lt;br /&gt;
Acoustic Thermometry Measures Temperature To 0.1 Degree&lt;br /&gt;
http://www.linear.com/solutions/1558&lt;br /&gt;
AN131  http://www.linear.com/docs/39793 (PDF momentan nicht verfügbar) --&amp;gt;&lt;br /&gt;
http://www.mikrocontroller.net/topic/307557#new&lt;br /&gt;
&lt;br /&gt;
== Digitale Temperatursensoren ==&lt;br /&gt;
&lt;br /&gt;
=== DS1621 ===&lt;br /&gt;
&lt;br /&gt;
Der DS1621 ist Temperatursensor und A/D-Wandler in einem. Er gibt seine Daten per [[I²C]]-[[Bus]] aus. Ein Schaltplan für einen elektronischen Thermometer mit diesem IC findet sich [http://www.myplace.nu/avr/thermo/ hier].&lt;br /&gt;
&lt;br /&gt;
Eine Library für den AVR: https://sourceforge.net/projects/ds1621avr/&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* bereits kalibriert&lt;br /&gt;
* kein A/D-Wandler nötig&lt;br /&gt;
* da I²C ein Bus ist, kann man mehrere DS1621 und andere I²C-Bausteine zusammen anschließen und braucht dafür trotzdem nur zwei I/O-Ports.&lt;br /&gt;
* Messbereich -55°C to +125°C &lt;br /&gt;
* Genauigkeit +-0,5°C&lt;br /&gt;
* Auflösung besser 0,01°C, wenn man die beiden Zählerregister (Count-Remain und Count-per-C) auswertet&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* teuer (Segor 5,80&amp;amp;euro;; RS 3,95&amp;amp;euro;; Conrad 5,22&amp;amp;euro;)&lt;br /&gt;
* obwohl die meisten Register [[Speicher#NVRAM | nichtflüchtig]] sind, kann man ihn nicht als Stand-Alone-Thermostat einsetzen, da er erst nach einem Start-Conversion-Befehl zu messen beginnt.&lt;br /&gt;
&lt;br /&gt;
Nachfolger:&lt;br /&gt;
* DS1631, DS1631A (Auto-Start-&amp;gt; Stand-Alone-Thermostat), DS1731&lt;br /&gt;
* weitere Stand-Alone-Thermostaten: DS1821, DS1629&lt;br /&gt;
&lt;br /&gt;
=== LM75 ===&lt;br /&gt;
&lt;br /&gt;
Der LM75 ist so ähnlich wie der DS1621, allerdings nur in SMD erhältlich und nicht so genau. Er ist aber öfters mal auf PC-Mainboards zu finden, so dass man beim Schlachten eines solchen günstig an einen Temperatursensor kommen kann. Eine Beispiel Schaltplan mit einem ATmega8 findet man [http://www.ucblog.de/2010/09/mikrocontroller-thermometer-schaltplan/ hier]&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* bereits kalibriert&lt;br /&gt;
* kein A/D-Wandler nötig&lt;br /&gt;
* I²C-Bus Ausgang&lt;br /&gt;
* billiger als DS1621 (Reichelt 1,45 &amp;amp;euro;; RS 3V: 3,75&amp;amp;euro;; 5V: 2,72&amp;amp;euro;)&lt;br /&gt;
* Auflösung +-0,5°C&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* nur im SMD-Gehäuse erhältlich&lt;br /&gt;
* relativ ungenau (+-2°C), kann man jedoch kalibrieren / kompensieren&lt;br /&gt;
&lt;br /&gt;
Kompatible Typen:&lt;br /&gt;
* AD7415ART&lt;br /&gt;
* DS7505S+&lt;br /&gt;
&lt;br /&gt;
=== LM76 ===&lt;br /&gt;
&lt;br /&gt;
Der LM76 ähnlich dem LM75, bietet aber eine 8-fach höhere Auflösung und eine Genauigkeit von 0.5 bzw. 1°C.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* höhere Auflösung&lt;br /&gt;
* höhere Genauigkeit&lt;br /&gt;
&lt;br /&gt;
Nachteil:&lt;br /&gt;
* schwerer zu beschaffen&lt;br /&gt;
&lt;br /&gt;
=== TMP175 / TMP75 ===&lt;br /&gt;
&lt;br /&gt;
Ähnelt dem LM75 stark! Temperatursensor von Texas Instruments.&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
&lt;br /&gt;
[https://github.com/ManuelSchneid3r/RaspberryPi/blob/master/sensors/src/tmp.c Linux Kommandozeilen Tool für den Zugriff]&lt;br /&gt;
&lt;br /&gt;
=== DS18S20 / DS18B20 ===&lt;br /&gt;
&lt;br /&gt;
Der DS18S20 (Nachfolger des DS1820) und DS18B20 sind scheinbar Temperatursensoren und A/D-Wandler in einem. Wenn man genauer hinschaut, stellt man fest, dass es sich um direktwandelnde Sensoren handelt. Die Temperatur wird ohne Umweg über eine analoge Zwischengröße (Spannung oder Strom) in ein digitales Signal überführt.&lt;br /&gt;
&lt;br /&gt;
Die Datenkommunikation erfolgt über ein 1-Wire-Interface, wodurch man am [[Mikrocontroller]] mit nur einem einzigen I/O-Pin auskommen kann. Außerdem beherrschen sie die parasitäre Stromversorgung, d.h., man braucht für Daten und Stromversorgung zusammen nur zwei Leitungen.&lt;br /&gt;
&lt;br /&gt;
Beim DS18B20 sind Auflösungen von 9, 10, 11 und 12 Bits konfigurierbar. Je kleiner die Auflösung, desto kürzer ist die Messzeit. Der DS18S20 hat eine feste Auflösung von 12 Bits, wobei die unteren 4 Bits aufwändiger auszuwerten sind als beim DS18B20. Der DS18S20 ist als Ersatz für den DS1820 gedacht. Der Hersteller empfiehlt den DS18B20 für Neuentwicklungen.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* bereits kalibriert&lt;br /&gt;
* Genauigkeit +-0,5°C&lt;br /&gt;
* 1-Wire-Ausgang&lt;br /&gt;
&lt;br /&gt;
Nachteil:&lt;br /&gt;
* Reichelt: 1,60&amp;amp;euro; / CSD: 1,59&amp;amp;euro; / Conrad 5,08&amp;amp;euro;&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* [http://www.avr-projekte.de/ds18b20.htm Ein oder mehrere DS18B20 DS18S20 über Romcode einlesen. AVR-Assembler]&lt;br /&gt;
* [http://pic-projekte.de/wiki/index.php?title=Ansteuerung_eines_DS18S20 Ansteuern eines DS18S20 in C (PIC)]&lt;br /&gt;
* [http://pdfserv.maxim-ic.com/en/ds/DS18S20.pdf Datenblatt DS18S20] &lt;br /&gt;
* [http://pdfserv.maxim-ic.com/en/ds/DS18B20.pdf Datenblatt DS18B20]&lt;br /&gt;
* [http://www.maxim-ic.com/app-notes/index.mvp/id/4377 Vergleich DS18B20 &amp;lt;-&amp;gt; DS18S20]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/6505 Code zur Ansteuerung (ASM ATTiny12)]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/14792 Code zur Ansteuerung (AVR-GCC)]&lt;br /&gt;
* [http://gandalf.arubi.uni-kl.de/avr_projects/tempsensor/ Code zur Ansteuerung mit CRC-Prüfung (AVR-GCC)]&lt;br /&gt;
* [http://www.schramm-software.de/tipps/temperaturmessung/digitalsensoren.htm Code zur Ansteuerung mit CRC-Prüfung (AVR-Assembler)]&lt;br /&gt;
* [http://chaokhun.kmitl.ac.th/~kswichit/avrthermo/avrthermo.html LED-Thermometer mit AT90S2313 (C)]&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/read-4-248219.html Webserver zur Ansteuerung von bis zu 63 Bausteinen]&lt;br /&gt;
* [http://www.teslabs.com/openplayer/docs/docs/other/ds18b20_pre1.pdf PDF Anleitung zur Beschaltung und Programmierung (C)]&lt;br /&gt;
*[http://www.digitemp.com/building.shtml Anleitung Sensorfühleraufbau (DigiTemp)]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/14792 Forumsbeitrag]: Onewire + DS18x20 Ansteuerung in C&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/232156 Forumsbeitrag]: Timing der parasitären Versorgung&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/387139#4602608 Projekt]: Onewire + DS18x20 Bibliothek&lt;br /&gt;
&lt;br /&gt;
=== DS1822 ===&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie DS18S20, aber weniger genau (+-2°) und in großen Stückzahlen billiger. Wegen der geringeren Verbreitung kommt der Preisvorteil aber bei Einzelstücken nicht beim Kunden an. So kostet er bei Reichelt mit 3,50&amp;amp;euro; mehr als der DS18S20.&lt;br /&gt;
&lt;br /&gt;
=== DS1921 / DS1922 ===&lt;br /&gt;
&lt;br /&gt;
Sind wie die DS1821 1-wire-Sensoren mit zusätzlicher Logging-Funktion.&lt;br /&gt;
Im iButton-Gehäuse befindet sich eine Lithium-Zelle, eine RTC, CMOS-RAM und der Temp-Sensor. Nach umfangreicher Progammierung startet der Button seine Mission (Aufzeichnung des Temperaturverlaufs).&lt;br /&gt;
Gibt es auch mit zusätzlicher Feuchtemessung (DS1923).&lt;br /&gt;
&lt;br /&gt;
=== TSic ===&lt;br /&gt;
&lt;br /&gt;
Die TSic Sensoren werden baugleich von 2 Herstellern angeboten:&lt;br /&gt;
* IST AG ([http://www.ist-ag.com/en/products-services/temperature-sensors Homepage])&lt;br /&gt;
* B+B Thermo-Technik ([https://shop.bb-sensors.com/Temperaturmesstechnik/Temperatursensoren/Digitaler-TSic-Temperatursensor-TO92.html Homepage])&lt;br /&gt;
&lt;br /&gt;
Die TSic Sensoren ([https://shop.bb-sensors.com/out/media/Datasheet_Digital_Semiconductor_temperatur_sensor_TSIC.pdf Datenblatt]) geben ihre Temperaturmessdaten automatisch in einem festen Intervall aus. Daher muss der Host nur warten bis die nächsten Messdaten rausgeschickt werden. Die TSic Sensoren die es im freien Handel gibt, geben ihre Messdaten alle 100ms (10Hz) aus. &lt;br /&gt;
Zur Übertragung wird das [http://www.ist-ag.com/eh/ist-ag/resource.nsf/imgref/Download_ZACWireAppNotes.pdf/$FILE/ZACWireAppNotes.pdf ZACwire] Protokoll benutzt. Es handelt sich um eine einfach zwei Byte Übertragung per Manchester-Code. Diese zwei Byte repräsentieren den digital gewandelten Temperaturwert. Im Gegensatz zu Sensoren wie den DS18xxx von Dallas muss dieser Wert aber erst auf einen dezimalen Wert umgerechnet werden. &lt;br /&gt;
Die Sensoren kommen mit 3 Pins aus (VCC, GND, Dout).&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* Bereits kalibriert&lt;br /&gt;
* Verschiedene Genauigkeiten lieferbar&lt;br /&gt;
* Sehr einfaches Kommunikationsprotokoll&lt;br /&gt;
* Geringer Stromverbrauch&lt;br /&gt;
* Hochgenau: bis zu +/- 0.1°C (TSic 50x)&lt;br /&gt;
&lt;br /&gt;
Nachteil:&lt;br /&gt;
* Recht teuer (Reichelt: 4,70&amp;amp;euro; für den TSic206)&lt;br /&gt;
* Nur ein Sensor an einem I/O nutzbar (Kein Bussystem)&lt;br /&gt;
&lt;br /&gt;
Achtung! &lt;br /&gt;
Die TSic Sensoren gibt es auch als Version mit analog Ausgang. Bei der Typenbezeichnung gibt die 3. Stelle an ob es sich um die analog- oder Digitalversion handelt (1 = analog, 6 = digital). &lt;br /&gt;
Der TSic201 ist also analog, wärend der TSic206 ein digitaler ist.&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/283615#3025721 ZACwire Protokoll im Logic Analyzer]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/159774?goto=3157908#3157908 C-Code, (ohne Interrupt und ohne Timer) Sensor wird eingeschaltet-&amp;gt;gelesen-&amp;gt;ausgeschaltet]&lt;br /&gt;
* [http://www.avr-projekte.de/zacwireasm.htm Zacwire Protokoll, AVR-Assembler]&lt;br /&gt;
* [http://www.loetstelle.net/projekte2/tsic306/tsic306.php GCC AtMega8 Interruptgesteuerte Statemachine für TSIC206/306]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/45573#347765 Ansatz zum Empfang der Daten]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/225554# Beispiel mit Strobe ohne Interrupt]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/82087 Diskussion mit Beispielcode (MSP430, AVR, PIC) blockierend]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/144424#1367539 C++ Interrupt]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/88847 noch mehr C, problematisch Interrupt]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/151791#1426974 C für ATmega8]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/159149#1510455 auch problematisch]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/188462#1837622 fertiger Code zum Einlesen des Zacwire-Protokolls für PIC in ASM]&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=55103 RN: Bascom]&lt;br /&gt;
* [http://www.avr-projekte.de/tinyclock.htm TSIC206 Thermometer mit Uhr und Kalender. Komplette Bauanleitung mit ASM Quellcode für AT-Tiny2313]&lt;br /&gt;
* [http://www.andeanelectronic.com/?Supporte___Arduino_con_TSic306%2CTSic506_y_TSic716 TSIC Routinen für Arduino von Andean Electronic aus Peru - Quelltext Dokumentation in Englisch]&lt;br /&gt;
&lt;br /&gt;
=== SHT1x/SHT7x ===&lt;br /&gt;
&lt;br /&gt;
Der SHT1x/SHT7x (SHT10, SHT11, SHT15, STH71, SHT75) sind kombinierte Temperatur- und Feuchtesensoren von [http://www.sensirion.com Sensirion]. Sie unterscheiden sich in Bauform und Genauigkeit.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* digitale Schnittstelle mit einfacher [[I²C]]-&#039;&#039;ähnlicher&#039;&#039; Ansteuerung&lt;br /&gt;
* keine Kalibrierung notwendig&lt;br /&gt;
* Beispielcode (C, MC51) auf der Sensirion-Seite verfügbar (relativ leicht portierbar)&lt;br /&gt;
* interne Heizelemente (Funktionsprüfung, &amp;quot;raue&amp;quot; Umgebung)&lt;br /&gt;
* Spannungsmonitor (&amp;quot;Battery fail&amp;quot;)&lt;br /&gt;
* sehr hohe Genauigkeit&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* kann nicht am [[I²C]] Bus betrieben werden, theoretisch gleiche Clockleitung möglich, fixe Adresse&lt;br /&gt;
* relativ teuer (Farnell 18,60&amp;amp;euro;)(SHT11 bei CSD 14€)&lt;br /&gt;
&lt;br /&gt;
[http://www.sensirion.com/de/produkte/feuchte-und-temperatur/ Übersicht] der Temperatur- und Feuchtigkeitssensoren von Sensirion.&lt;br /&gt;
&lt;br /&gt;
=== SHT21 ===&lt;br /&gt;
&lt;br /&gt;
[http://www.sensirion.com Sensirion] bietet auch den SHT21 Feuchtigkeits- und Temperatursensor an, welcher wesentlich genauer ist.&lt;br /&gt;
    &lt;br /&gt;
Vorteile:&lt;br /&gt;
* I2C digital, PWM and SDM/analog Volt Ausgabe&lt;br /&gt;
* Maximal 5 Messungen/s @ 14bit&lt;br /&gt;
* Temperaturbereich von -40 – +125°C&lt;br /&gt;
* Feuchtigkeit mit einer Genauigkeit von +-2%RH&lt;br /&gt;
* Günstig (3-4€ Farnell/RS 2014)&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* nur als SMD-Package&lt;br /&gt;
&lt;br /&gt;
Application Notes und Datenblätter findet man [http://www.sensirion.com/en/products/humidity-temperature/humidity-sensor-sht2x/ hier].&lt;br /&gt;
&lt;br /&gt;
=== ADT7310 / ADT7xxx-Familie von AD ===&lt;br /&gt;
&lt;br /&gt;
Der [http://www.analog.com/en/sensors/digital-temperature-sensors/adt7310/products/product.html ADT7310] von [http://www.analog.com/ Analog Devices] besitzt eine Auflösung von 16 Bit und eine Genauigkeit von ±0.5°C im Bereich von −40°C bis +105°C.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* Ansteuerung per [[SPI]] ADT73xx  oder  [[I2C]] ADT74xx&lt;br /&gt;
* keine Kalibrierung notwendig&lt;br /&gt;
* hohe [[Auflösung und Genauigkeit]]: 16 Bit&lt;br /&gt;
** ADT7x02 2,00°&lt;br /&gt;
** ADT7x01 1,00°&lt;br /&gt;
** ADT7x10 0,40 / 0,50°&lt;br /&gt;
** ADT7x20 0,20 / 0,25°&lt;br /&gt;
* auch für automotive / als Die lieferbar&lt;br /&gt;
* programmierbarer [[Interrupt]]ausgang für Unter- und Übertemperatur&lt;br /&gt;
* relativ günstig (ca. 3-8€ bei Digi-Key, Stand 12/2011)&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* TBD&lt;br /&gt;
&lt;br /&gt;
NB: ONsemi hat auch Temperatursensoren mit der Bezeichnung ADT7xxx, verwendet aber ein anderes Namensschema&lt;br /&gt;
&lt;br /&gt;
=== TSYS01 / G-NICO-018 von Measurement Specialties Inc. ===&lt;br /&gt;
* sehr hohe [[Auflösung und Genauigkeit]]:  0,10° @ -5°C … +50°C   16/24 Bit&lt;br /&gt;
* Gehäuse 16-VQFN Exposed Pad&lt;br /&gt;
* SPI / I2C über Pin auswählbar&lt;br /&gt;
* Preis: 8,60 (4,40 @1k) bei Digikey&lt;br /&gt;
kleiner Nachteil: der Sensor liefert den ADC-Wert und die Kompensationskonstanten (5 Polynom-Koeffizienten), mit denen im µC die Temperatur berechnet werden muss.&lt;br /&gt;
&lt;br /&gt;
=== SE95 ===&lt;br /&gt;
&lt;br /&gt;
Der [http://www.nxp.com/documents/data_sheet/SE95.pdf SE95] von NXP hat 13 Bit Auflösung, Genauigkeit ±2°C im Messbereich von -55°C bis +125°C, I²C, Gehäuse SO8 und TSSOP8. Einzelstück-Preis bei Segor 1,50€ (2012/I)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== BMP085 / BMP180 ===&lt;br /&gt;
Die BMP085 (bzw. der verbesserte, aber Pin- und Software-komapatible Nachfolger BMP180) sind eigentlich Luftdrucksensoren, die jedoch auch einen Temperatursensor mitbringen. Der Anschluss erfolgt über I2C.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* Wenig Stromverbrauch (5µA bei 1 Messung/s)&lt;br /&gt;
* Liefern Luftdruck gleich mit&lt;br /&gt;
* Absolute Genauigkeit (+-1°C typ. über kompletten Temperaturbereich). Relative Genauigkeit ist im Datenblatt nicht spezifiziert, gemessen gegen einen SHT11 ca. +-0.1°C. &lt;br /&gt;
* Auflösung: 0.1°C mit Herstellercode, mehr ist möglich (16Bit)&lt;br /&gt;
* Fertige Platinen für wenig Geld verfügbar (ca. 1,70€ inkl. Versand aus China)&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* Sehr aufwändige Linearisierung (Kalibrationskoeffizienten sind im Sensor gespeichert, müssen aber vom Host-µC verrechnet werden. Code ist im Datenblatt)&lt;br /&gt;
* Nur als SMD&lt;br /&gt;
* Bei Reichelt und Conrad nicht erhältlich. &lt;br /&gt;
&lt;br /&gt;
Preis: Ebay 1,70€ (mit Platine, China), Aliexpress 1,10€ (nackter Chip, China, mind. 10 Stück sonst auch ca. 1,70€)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Preisübersicht ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Preisübersicht 11/2012&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Bauteil   || Segor || RS-Components || Conrad || Farnell || Reichelt || DigiKey&lt;br /&gt;
|-&lt;br /&gt;
| AD592     || 21,40 || 5,74          || 6,43   || 5,90    || 3,95     || 4,61&lt;br /&gt;
|-&lt;br /&gt;
| ADT7310   ||  -    || -             || -      || 4,56    || -        || 3,02&lt;br /&gt;
|-&lt;br /&gt;
| ADT7410   ||  -    || 3,35          || -      || 2,71    || -        || 3,02&lt;br /&gt;
|-&lt;br /&gt;
| DS1621    ||  7,60 || 5,29          || 5,08   || 5,65    || -        || 4,54&lt;br /&gt;
|-&lt;br /&gt;
| DS1629    ||  8,70 || 8,68          || -      || 5,00    || 6,50     || 7,65&lt;br /&gt;
|-&lt;br /&gt;
| DS1631    ||  8,00 || 2,91          || -      || 3,11    || -        || 3,94&lt;br /&gt;
|-&lt;br /&gt;
| DS1731    ||  -    || -             || -      || 9,79    || -        || 3,81&lt;br /&gt;
|-&lt;br /&gt;
| DS1821    ||  5,90 || 5,27          || 6,27   || -       || -        || 5,05&lt;br /&gt;
|-&lt;br /&gt;
| DS18B20   ||  2,50 || 3,06          || -      || 3,26    || 3,20     || 3,93&lt;br /&gt;
|-&lt;br /&gt;
| DS1921    ||  -    || 26,15         || -      || -       || -        || 21,13&lt;br /&gt;
|-&lt;br /&gt;
| DS1922    ||  -    || 62,00         || -      || -       || -        || 43,11&lt;br /&gt;
|-&lt;br /&gt;
| DS1923    ||  -    || 97,96         || -      || -       || -        || 80,30&lt;br /&gt;
|-&lt;br /&gt;
| KTY81/121 ||  -    || -             || -      || 0,79    || 0,59     || 0,85&lt;br /&gt;
|-&lt;br /&gt;
| LM75      ||  1,50 || 0,68          || 3,64   || 0,81    || 1,45     || 0,82&lt;br /&gt;
|-&lt;br /&gt;
| LM76      ||  -    || 2,83          || -      || 3,02    || -        || 2,39&lt;br /&gt;
|-&lt;br /&gt;
| LM135     || 10,10 || 10,28         || -      || 8,95    || 7,95     || 10,26&lt;br /&gt;
|-&lt;br /&gt;
| LM235     ||  -    || -             || -      || 1,80    || 1,40     || 1,26&lt;br /&gt;
|-&lt;br /&gt;
| LM334     ||  0,90 || 0,72          || 1,67   || 1,01    || 0,49     || 0,74&lt;br /&gt;
|-&lt;br /&gt;
| LM335     ||  1,30 || 0,56          || 1,92   || 0,55    || 0,71     || 0,80&lt;br /&gt;
|-&lt;br /&gt;
| PT100     ||  3,80 || 3,99          || 4,00   || 9,79    || 4,27     || 0,68&lt;br /&gt;
|-&lt;br /&gt;
| SE95      ||  1,50 || 0,63          || -      || 1,45    || -        || 1,00&lt;br /&gt;
|-&lt;br /&gt;
| SHT11     || 26,00 || 24,38         || 33,20  || 25,65   || -        || 36,76&lt;br /&gt;
|-&lt;br /&gt;
| SHT15     ||  -    || 27,69         || 36,30  || 28,72   || -        || -&lt;br /&gt;
|-&lt;br /&gt;
| SHT21     || 29,50 || 18,10         || -      || 21,16   || -        || -&lt;br /&gt;
|-&lt;br /&gt;
| SHT71     || 25,40 || 29,06         || 36,89  || 30,88   || -        || -&lt;br /&gt;
|-&lt;br /&gt;
| SHT75     ||  -    || 33,77         || 42,48  || 35,52   || -        || -&lt;br /&gt;
|-&lt;br /&gt;
| SMT160-30 ||  -    || 9,28          || 8,14   || 12,38   || -        || -&lt;br /&gt;
|-&lt;br /&gt;
| TMP75     ||  -    || 0,80          || -      || 0,85    || -        || 1,37&lt;br /&gt;
|-&lt;br /&gt;
| TSic206   ||  -    || -             || 5,84   || -       || 4,20     || -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Sensorik]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Uhr&amp;diff=94400</id>
		<title>AVR-Tutorial: Uhr</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Uhr&amp;diff=94400"/>
		<updated>2016-11-20T22:43:13Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Dito&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine beliebte Übung für jeden Programmierer ist die Implementierung einer Uhr. Die meisten Uhren bestehen aus einem Taktgeber und einer Auswerte- und Anzeigevorrichtung. Wir wollen hier beides mittels eines Programmes in einem Mikrocontroller realisieren. Voraussetzung für diese Fallstudie ist das Verständnis der Kapitel über&lt;br /&gt;
&lt;br /&gt;
* [[AVR-Tutorial: LCD| Ansteuerung eines LC-Displays]]&lt;br /&gt;
* [[AVR-Tutorial: Timer| Timer]]&lt;br /&gt;
&lt;br /&gt;
== Aufbau und Funktion ==&lt;br /&gt;
&lt;br /&gt;
Die Aufgabe des Taktgebers, der uns einen möglichst konstanten und genauen Takt liefert, übernimmt ein Timer. Der Timer ermöglicht einen einfachen Zugang zum Takt, den der AVR vom Quarz abgreift. Wie schon im Einführungskapitel über den [[AVR-Tutorial:_Timer|Timer]] beschrieben, wird dazu ein Timer Overflow Interrupt installiert, und in diesem Interrupt wird die eigentliche Uhr hochgezählt. Die Uhr besteht aus vier Registern. Drei davon repräsentieren die Sekunden, Minuten und Stunden unserer Uhr. Nach jeweils einer Sekunde wird das Sekundenregister um eins erhöht. Sind 60 Sekunden vergangen, wird das Sekundenregister wieder auf Null gesetzt und gleichzeitig das Minutenregister um eins erhöht. Dies ist ein Überlauf. Nach 60 Minuten werden die Minuten wieder auf Null gesetzt und für diese vergangenen 60 Minuten eine Stunde aufaddiert. Nach 24 Stunden schliesslich werden die Stunden wieder auf Null gesetzt, ein ganzer Tag ist vergangen.&lt;br /&gt;
&lt;br /&gt;
Aber wozu das vierte Register?&lt;br /&gt;
&lt;br /&gt;
Der Mikrocontroller wird mit 4 MHz betrieben. Bei einem Teiler von 1024 zählt der Timer also mit 4000000 / 1024 = 3906,25 Pulsen pro Sekunde. Der Timer muss einmal bis 256 zählen, bis er einen Überlauf auslöst. Es ereignen sich also 3906,25 / 256 = 15,2587 Überläufe pro Sekunde. Die Aufgabe des vierten Registers ist es nun, diese 15 Überläufe zu zählen. Bei Auftreten des 15. ist eine Sekunde vergangen. Dies stimmt jedoch nicht exakt, denn die Division weist ja auch Nachkommastellen auf, hat einen Rest, der hier im Moment der Einfachheit halber ignoriert wird. In einem späteren Abschnitt wird darauf noch eingegangen werden.&lt;br /&gt;
&lt;br /&gt;
Im Überlauf-Interrupt wird also diese Kette von Zählvorgängen auf den Sekunden, Minuten und Stunden durchgeführt und anschliessend zur Anzeige gebracht. Dazu werden die in einem vorhergehenden Kapitel entwickelten [[AVR-Tutorial:_LCD|LCD Funktionen]] benutzt.&lt;br /&gt;
&lt;br /&gt;
== Das erste Programm ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
.def temp1 = r16&lt;br /&gt;
.def temp2 = r17&lt;br /&gt;
.def temp3 = r18&lt;br /&gt;
.def flag  = r19&lt;br /&gt;
 &lt;br /&gt;
.def SubCount = r21&lt;br /&gt;
.def Sekunden = r22&lt;br /&gt;
.def Minuten  = r23&lt;br /&gt;
.def Stunden  = r24&lt;br /&gt;
&lt;br /&gt;
.org 0x0000&lt;br /&gt;
        rjmp    main                ; Reset Handler&lt;br /&gt;
.org OVF0addr&lt;br /&gt;
        rjmp    timer0_overflow     ; Timer Overflow Handler&lt;br /&gt;
&lt;br /&gt;
.include &amp;quot;lcd-routines.asm&amp;quot;&lt;br /&gt;
&lt;br /&gt;
main:&lt;br /&gt;
        ldi     temp1, HIGH(RAMEND)&lt;br /&gt;
        out     SPH, temp1&lt;br /&gt;
        ldi     temp1, LOW(RAMEND)  ; Stackpointer initialisieren&lt;br /&gt;
        out     SPL, temp1&lt;br /&gt;
&lt;br /&gt;
        ldi temp1, 0xFF    ; Port D = Ausgang&lt;br /&gt;
        out DDRD, temp1 &lt;br /&gt;
    &lt;br /&gt;
        rcall   lcd_init&lt;br /&gt;
        rcall   lcd_clear&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
        ldi     temp1, (1&amp;lt;&amp;lt;CS02) | (1&amp;lt;&amp;lt;CS00)   ; Teiler 1024&lt;br /&gt;
        out     TCCR0, temp1&lt;br /&gt;
 &lt;br /&gt;
        ldi     temp1, 1&amp;lt;&amp;lt;TOIE0     ; TOIE0: Interrupt bei Timer Overflow&lt;br /&gt;
        out     TIMSK, temp1&lt;br /&gt;
 &lt;br /&gt;
        clr     Minuten             ; Die Uhr auf 0 setzen&lt;br /&gt;
        clr     Sekunden&lt;br /&gt;
        clr     Stunden&lt;br /&gt;
        clr     SubCount&lt;br /&gt;
        clr     Flag                ; Merker löschen&lt;br /&gt;
&lt;br /&gt;
        sei&lt;br /&gt;
 &lt;br /&gt;
loop:&lt;br /&gt;
        cpi     flag,0&lt;br /&gt;
        breq    loop                ; Flag im Interrupt gesetzt?&lt;br /&gt;
        ldi     flag,0              ; flag löschen&lt;br /&gt;
  &lt;br /&gt;
        rcall   lcd_clear           ; das LCD löschen&lt;br /&gt;
        mov     temp1, Stunden      ; und die Stunden ausgeben&lt;br /&gt;
        rcall   lcd_number&lt;br /&gt;
        ldi     temp1, &#039;:&#039;          ; zwischen Stunden und Minuten einen &#039;:&#039;&lt;br /&gt;
        rcall   lcd_data&lt;br /&gt;
        mov     temp1, Minuten      ; dann die Minuten ausgeben&lt;br /&gt;
        rcall   lcd_number&lt;br /&gt;
        ldi     temp1, &#039;:&#039;          ; und noch ein &#039;:&#039;&lt;br /&gt;
        rcall   lcd_data&lt;br /&gt;
        mov     temp1, Sekunden     ; und die Sekunden&lt;br /&gt;
        rcall   lcd_number&lt;br /&gt;
&lt;br /&gt;
        rjmp    loop&lt;br /&gt;
 &lt;br /&gt;
timer0_overflow:                    ; Timer 0 Overflow Handler&lt;br /&gt;
&lt;br /&gt;
        push    temp1               ; temp 1 sichern&lt;br /&gt;
        in      temp1,sreg          ; SREG sichern&lt;br /&gt;
&lt;br /&gt;
        inc     SubCount            ; Wenn dies nicht der 15. Interrupt&lt;br /&gt;
        cpi     SubCount, 15        ; ist, dann passiert gar nichts&lt;br /&gt;
        brne    end_isr&lt;br /&gt;
&lt;br /&gt;
                                    ; Überlauf&lt;br /&gt;
        clr     SubCount            ; SubCount rücksetzen&lt;br /&gt;
        inc     Sekunden            ; plus 1 Sekunde&lt;br /&gt;
        cpi     Sekunden, 60        ; sind 60 Sekunden vergangen?&lt;br /&gt;
        brne    Ausgabe             ; wenn nicht kann die Ausgabe schon&lt;br /&gt;
                                    ; gemacht werden&lt;br /&gt;
&lt;br /&gt;
                                    ; Überlauf&lt;br /&gt;
        clr     Sekunden            ; Sekunden wieder auf 0 und dafür&lt;br /&gt;
        inc     Minuten             ; plus 1 Minute&lt;br /&gt;
        cpi     Minuten, 60         ; sind 60 Minuten vergangen ?&lt;br /&gt;
        brne    Ausgabe             ; wenn nicht, -&amp;gt; Ausgabe&lt;br /&gt;
&lt;br /&gt;
                                    ; Überlauf&lt;br /&gt;
        clr     Minuten             ; Minuten zurücksetzen und dafür&lt;br /&gt;
        inc     Stunden             ; plus 1 Stunde&lt;br /&gt;
        cpi     Stunden, 24         ; nach 24 Stunden, die Stundenanzeige&lt;br /&gt;
        brne    Ausgabe             ; wieder zurücksetzen&lt;br /&gt;
&lt;br /&gt;
                                    ; Überlauf&lt;br /&gt;
        clr     Stunden             ; Stunden rücksetzen&lt;br /&gt;
&lt;br /&gt;
Ausgabe:&lt;br /&gt;
        ldi     flag,1              ; Flag setzen, LCD updaten&lt;br /&gt;
&lt;br /&gt;
end_isr:&lt;br /&gt;
&lt;br /&gt;
        out     sreg,temp1          ; sreg wieder herstellen&lt;br /&gt;
        pop     temp1&lt;br /&gt;
        reti                        ; das wars. Interrupt ist fertig&lt;br /&gt;
&lt;br /&gt;
; Eine Zahl aus dem Register temp1 ausgeben&lt;br /&gt;
&lt;br /&gt;
lcd_number:&lt;br /&gt;
        push    temp2               ; register sichern,&lt;br /&gt;
                                    ; wird für Zwsichenergebnisse gebraucht     &lt;br /&gt;
        ldi     temp2, &#039;0&#039;         &lt;br /&gt;
lcd_number_10:                &lt;br /&gt;
        subi    temp1, 10           ; abzählen wieviele Zehner in&lt;br /&gt;
        brcs    lcd_number_1        ; der Zahl enthalten sind&lt;br /&gt;
        inc     temp2&lt;br /&gt;
        rjmp    lcd_number_10&lt;br /&gt;
lcd_number_1:&lt;br /&gt;
        push    temp1               ; den Rest sichern (http://www.mikrocontroller.net/topic/172026)&lt;br /&gt;
        mov     temp1,temp2         ; &lt;br /&gt;
        rcall   lcd_data            ; die Zehnerstelle ausgeben&lt;br /&gt;
        pop     temp1               ; den Rest wiederherstellen&lt;br /&gt;
        subi    temp1, -10          ; 10 wieder dazuzählen, da die&lt;br /&gt;
                                    ; vorhergehende Schleife 10 zuviel&lt;br /&gt;
                                    ; abgezogen hat&lt;br /&gt;
                                    ; das Subtrahieren von -10&lt;br /&gt;
                                    ; = Addition von +10 ist ein Trick&lt;br /&gt;
                                    ; da kein addi Befehl existiert&lt;br /&gt;
        ldi     temp2, &#039;0&#039;          ; die übrig gebliebenen Einer&lt;br /&gt;
        add     temp1, temp2        ; noch ausgeben&lt;br /&gt;
        rcall   lcd_data&lt;br /&gt;
&lt;br /&gt;
        pop     temp2               ; Register wieder herstellen&lt;br /&gt;
        ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der ISR wird nur die Zeit in den Registern neu berechnet, die Ausgabe auf das LCD erfolgt in der Hauptschleife. Das ist notwendig, da die LCD-Ausgabe bisweilen sehr lange dauern kann. Wenn sie länger als ~2/15 Sekunden dauert werden Timerinterrupts &amp;quot;verschluckt&amp;quot; und unsere Uhr geht noch mehr falsch. Dadurch, dass aber die Ausgabe in der Hauptschleife durchgeführt wird, welche jederzeit durch einen Timerinterrupt unterbrochen werden kann, werden keine Timerinterrupts verschluckt. Das ist vor allem wichtig, wenn mit höheren Interruptfrequenzen gearbeitet wird, z.&amp;amp;nbsp;B. 1/100s im Beispiel weiter unten. Auch wenn in diesem einfachen Beispiel die Ausgabe bei weitem nicht 2/15 Sekunden dauert, sollte man sich diesen Programmierstil allgemein angewöhnen. Siehe auch [[Interrupt]].&lt;br /&gt;
&lt;br /&gt;
Eine weitere Besonderheit ist das Register &#039;&#039;&#039;flag&#039;&#039;&#039; (=r19). Dieses Register fungiert als Anzeiger, wie eine Flagge, daher auch der Name. In der ISR wird dieses Register auf 1 gesetzt. Die Hauptschleife, also alles zwischen &#039;&#039;loop&#039;&#039; und &#039;&#039;rjmp loop&#039;&#039;, prüft dieses Flag und nur dann, wenn das Flag auf 1 steht, wird die LCD Ausgabe gemacht und das Flag wieder auf 0 zurückgesetzt. Auf diese Art wird nur dann Rechenzeit für die LCD Ausgabe verbraucht, wenn dies tatsächlich notwendig ist. Die ISR teilt mit dem Flag der Hauptschleife mit, dass eine bestimmte Aufgabe, nämlich der Update der Anzeige gemacht werden muss und die Hauptschleife reagiert darauf bei nächster Gelegenheit, indem sie diese Aufgabe ausführt und setzt das Flag zurück. Solche Flags werden daher auch &#039;&#039;&#039;Job-Flags&#039;&#039;&#039; genannt, weil durch ihr setzten das Abarbeiten eines Jobs (einer Aufgabe) angestoßen wird. Auch hier gilt wieder: Im Grunde würde man in diesem speziellen Beispiel kein Job-Flag benötigen, weil es in der Hauptschleife nur einen einzigen möglichen Job, die Neuausgabe der Uhrzeit, gibt. Sobald aber Programme komplizierter werden und mehrere Jobs möglich sind, sind Job-Flags eine gute Möglichkeit, ein Programm so zu organsieren, dass bestimmte Dinge nur dann gemacht werden, wenn sie notwendig sind.&lt;br /&gt;
&lt;br /&gt;
Im Moment gibt es keine Möglichkeit, die Uhr auf eine bestimmte Uhrzeit einzustellen. Um dies tun zu können, müssten noch zusätzlich Taster an den Mikrocontroller angeschlossen werden, mit deren Hilfe die Sekunden, Minuten und Stunden händisch vergrößert bzw. verkleinert werden können. Studieren Sie mal die Bedienungsanleitung einer käuflichen Digitaluhr und versuchen sie zu beschreiben, wie dieser Stellvorgang bei dieser Uhr vor sich geht. Sicherlich werden Sie daraus eine Idee entwickeln können, wie ein derartiges Stellen mit der hier vorgestellten Digitaluhr funktionieren könnte. Als Zwischenlösung kann man im Programm die Uhr beim Start anstelle von 00:00:00 z.&amp;amp;nbsp;B. auch auf 20:00:00 stellen und exakt mit dem Start der Tagesschau starten. Wobei der Start der Tagesschau verzögert bei uns ankommt, je nach Übertragung können das mehrere Sekunden sein.&lt;br /&gt;
&lt;br /&gt;
== Ganggenauigkeit ==&lt;br /&gt;
&lt;br /&gt;
Wird die Uhr mit einer gekauften Uhr verglichen, so stellt man schnell fest, dass sie ganz schön ungenau geht. Sie geht vor! Woran liegt das? Die Berechnung sieht so aus:&lt;br /&gt;
* Frequenz des Quarzes: 4.0 MHz&lt;br /&gt;
* Vorteiler des Timers: 1024&lt;br /&gt;
* Überlauf alle 256 Timertakte&lt;br /&gt;
&lt;br /&gt;
Daraus errechnet sich, dass in einer Sekunde 4000000 / 1024 / 256 = 15.258789 Overflow Interrupts auftreten. Im Programm wird aber bereits nach 15 Overflows eine Sekunde weitergeschaltet, daher geht die Uhr vor. Rechnen wir etwas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;F_r = (\frac {15}{15,258789}-1) \cdot 100% = -1,69%&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So wie bisher läuft die Uhr also rund 1.7 % zu schnell. In einer Minute ist das immerhin etwas mehr als eine Sekunde. Im Grunde ist das ein ähnliches Problem wie mit unserer Jahreslänge. Ein Jahr dauert nicht exakt 365 Tage, sondern in etwa einen viertel Tag länger. Die Lösung, die im Kalender dafür gemacht wurde - der Schalttag -, könnte man fast direkt übernehmen. Nach 3 Stück 15er Overflow Sekunden folgt eine Sekunde für die 16 Overflows ablaufen müssen. Wie sieht die Rechnung bei einem 15, 15, 15, 16 Schema aus? Für 4 Sekunden werden exakt 15.258789 * 4 = 61,035156 Overflow Interrupts benötigt. Mit einem 15, 15, 15, 16 Schema werden in 4 Sekunden genau 61 Overflow Interrupts durchgeführt. Der relative Fehler beträgt dann&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;F_r = (\frac {61}{61,035156}-1) \cdot 100% = -0,0575%&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit diesem Schema ist der Fehler beträchtlich gesunken. Nur noch 0.06%. Bei dieser Rate muss die Uhr immerhin etwas länger als 0,5 Stunden laufen, bis der Fehler auf eine Sekunde angewachsen ist. Das sind aber immer noch 48 Sekunden pro Tag bzw. 1488 Sekunden (=24,8 Minuten) pro Monat. So schlecht sind nicht mal billige mechanische Uhren!&lt;br /&gt;
&lt;br /&gt;
Jetzt könnte man natürlich noch weiter gehen und immer kompliziertere &amp;quot;Schalt-Overflow&amp;quot;-Schemata austüfteln und damit die Genauigkeit näher an 100% bringen. Aber gibt es noch andere Möglichkeiten?&lt;br /&gt;
&lt;br /&gt;
Im ersten Ansatz wurde ein Vorteiler von 1024 eingesetzt. Was passiert bei einem anderen Vorteiler? Nehmen wir mal einen Vorteiler von 64. Das heißt, es müssen ( 4000000 / 64 ) / 256 = 244.140625 Overflows auflaufen, bis 1 Sekunde vergangen ist. Wenn also 244 Overflows gezählt werden, dann beläuft sich der Fehler auf&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;F_r = (\frac {244}{244,140625}-1) \cdot 100% = -0,0576%&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nicht schlecht. Nur durch Verändern von 2 Zahlenwerten im Programm (Teilerfaktor und Anzahl der Overflow Interrupts bis zu einer Sekunden) kann die Genauigkeit gegenüber dem ursprünglichen Overflow-Schema beträchtlich gesteigert werden. Aber geht das noch besser? Ja das geht. Allerdings nicht mit dem Overflow Interrupt.&lt;br /&gt;
&lt;br /&gt;
== Der CTC-Modus des Timers ==&lt;br /&gt;
&lt;br /&gt;
Worin liegt denn das eigentliche Problem, mit dem die Uhr zu kämpfen hat? Es liegt darin, dass jedesmal ein kompletter Timerzyklus bis zum Overflow abgewartet werden muss, um darauf zu reagieren. Da aber nur jeweils ganzzahlige Overflowzyklen abgezählt werden können, heißt das auch, dass im ersten Fall nur in Vielfachen von 1024 * 256 = 262.144 Takten operiert werden kann, während im letzten Fall immerhin schon eine Granulierung von 64 * 256 = 16.384 Takten erreicht wird. Aber offensichtlich ist das nicht genau genug. Bei 4 MHz entsprechen 262.144 Takte bereits einem Zeitraum von 65,5 ms, während 16384 Takte einem Zeitbedarf von 4,096 ms entsprechen. Beide Zahlen teilen aber 1.000 ms nicht ganzzahlig, Nachkommareste fallen unter den Tisch und daraus summiert sich der Fehler auf. Angestrebt wird ein Timer, der seinen &amp;lt;em&amp;gt;Overflow&amp;lt;/em&amp;gt; so erreicht, dass sich ein ganzzahliger Teiler von einer Sekunde einstellt. Dann gibt es keinen Rest. Dazu müsste man dem Timer aber vorschreiben können, bei welchem Zählerstand der &amp;lt;em&amp;gt;Overflow&amp;lt;/em&amp;gt; erfolgen soll. Und genau dies ist im &#039;&#039;&#039;CTC&#039;&#039;&#039;-Modus möglich, allerdings nur beim Timer 1. &#039;&#039;&#039;CTC&#039;&#039;&#039; bedeutet &amp;quot;&#039;&#039;&#039;C&#039;&#039;&#039;lear &#039;&#039;&#039;T&#039;&#039;&#039;imer on &#039;&#039;&#039;C&#039;&#039;&#039;ompare match&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Timer 1, ein 16-Bit-Timer, wird mit einem Vorteiler von 1 betrieben. Dadurch wird erreicht, dass der Timer mit höchster Zeitauflösung arbeiten kann. Bei jedem Ticken des Systemtaktes von 4 MHz wird auch der Timer um 1 erhöht. Zusätzlich wird noch das WGM12-Bit bei der Konfiguration gesetzt. Dadurch wird der Timer in den &#039;&#039;&#039;CTC&#039;&#039;&#039;-Modus gesetzt. Dabei wird der Inhalt des Timers hardwaremäßig mit dem Inhalt des &#039;&#039;&#039;OCR1A&#039;&#039;&#039;-Registers verglichen. Stimmen beide überein, so wird der Timer auf 0 zurückgesetzt und im nächsten Taktzyklus ein &#039;&#039;&#039;OCIE1A&#039;&#039;&#039;-Interrupt ausgelöst. Dadurch ist es möglich, exakt die Anzahl an Taktzyklen festzulegen, die von einem Interrupt zum nächsten vergehen sollen. Das Compare Register &#039;&#039;&#039;OCR1A&#039;&#039;&#039; wird mit dem Wert 39.999 vorbelegt. Dadurch vergehen exakt 40.000 Taktzyklen von einem Compare-Interrupt zum nächsten. &amp;quot;Zufällig&amp;quot; ist dieser Wert so gewählt, dass bei einem Systemtakt von 4 MHz von einem Interrupt zum nächsten genau 1/100 Sekunde vergeht, denn 40.000 / 4.000.000 = 0,01. Bei einem möglichen Umbau der Uhr zu einer Stoppuhr könnte sich die Hundertstelsekunde als nützlich erweisen. Im Interrupt wird das Hilfsregister SubCount bis 100 hochgezählt, und nach 100 Interrupts kommt wieder die Sekundenweiterschaltung wie oben in Gang.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
.def temp1 = r16&lt;br /&gt;
.def temp2 = r17&lt;br /&gt;
.def temp3 = r18&lt;br /&gt;
.def Flag  = r19&lt;br /&gt;
 &lt;br /&gt;
.def SubCount = r21&lt;br /&gt;
.def Sekunden = r22&lt;br /&gt;
.def Minuten  = r23&lt;br /&gt;
.def Stunden  = r24&lt;br /&gt;
&lt;br /&gt;
.org 0x0000&lt;br /&gt;
           rjmp    main             ; Reset Handler&lt;br /&gt;
.org OC1Aaddr&lt;br /&gt;
           rjmp    timer1_compare   ; Timer Compare Handler&lt;br /&gt;
&lt;br /&gt;
.include &amp;quot;lcd-routines.asm&amp;quot;&lt;br /&gt;
&lt;br /&gt;
main:&lt;br /&gt;
        ldi     temp1, HIGH(RAMEND)&lt;br /&gt;
        out     SPH, temp1&lt;br /&gt;
        ldi     temp1, LOW(RAMEND)  ; Stackpointer initialisieren&lt;br /&gt;
        out     SPL, temp1&lt;br /&gt;
&lt;br /&gt;
        ldi temp1, 0xFF    ; Port D = Ausgang&lt;br /&gt;
        out DDRD, temp1     &lt;br /&gt;
&lt;br /&gt;
        rcall   lcd_init&lt;br /&gt;
        rcall   lcd_clear&lt;br /&gt;
 &lt;br /&gt;
                                    ; Vergleichswert &lt;br /&gt;
        ldi     temp1, high( 40000 - 1 )&lt;br /&gt;
        out     OCR1AH, temp1&lt;br /&gt;
        ldi     temp1, low( 40000 - 1 )&lt;br /&gt;
        out     OCR1AL, temp1&lt;br /&gt;
                                    ; CTC Modus einschalten&lt;br /&gt;
                                    ; Vorteiler auf 1&lt;br /&gt;
        ldi     temp1, ( 1 &amp;lt;&amp;lt; WGM12 ) | ( 1 &amp;lt;&amp;lt; CS10 )&lt;br /&gt;
        out     TCCR1B, temp1&lt;br /&gt;
 &lt;br /&gt;
        ldi     temp1, 1 &amp;lt;&amp;lt; OCIE1A  ; OCIE1A: Interrupt bei Timer Compare&lt;br /&gt;
        out     TIMSK, temp1&lt;br /&gt;
 &lt;br /&gt;
        clr     Minuten             ; Die Uhr auf 0 setzen&lt;br /&gt;
        clr     Sekunden&lt;br /&gt;
        clr     Stunden&lt;br /&gt;
        clr     SubCount&lt;br /&gt;
        clr     Flag                ; Flag löschen&lt;br /&gt;
&lt;br /&gt;
        sei&lt;br /&gt;
loop:&lt;br /&gt;
        cpi     flag,0&lt;br /&gt;
        breq    loop                ; Flag im Interrupt gesetzt?&lt;br /&gt;
        ldi     flag,0              ; Flag löschen&lt;br /&gt;
  &lt;br /&gt;
        rcall   lcd_clear           ; das LCD löschen&lt;br /&gt;
        mov     temp1, Stunden      ; und die Stunden ausgeben&lt;br /&gt;
        rcall   lcd_number&lt;br /&gt;
        ldi     temp1, &#039;:&#039;          ; zwischen Stunden und Minuten einen &#039;:&#039;&lt;br /&gt;
        rcall   lcd_data&lt;br /&gt;
        mov     temp1, Minuten      ; dann die Minuten ausgeben&lt;br /&gt;
        rcall   lcd_number&lt;br /&gt;
        ldi     temp1, &#039;:&#039;          ; und noch ein &#039;:&#039;&lt;br /&gt;
        rcall   lcd_data&lt;br /&gt;
        mov     temp1, Sekunden     ; und die Sekunden&lt;br /&gt;
        rcall   lcd_number&lt;br /&gt;
&lt;br /&gt;
        rjmp    loop&lt;br /&gt;
 &lt;br /&gt;
timer1_compare:                     ; Timer 1 Output Compare Handler&lt;br /&gt;
&lt;br /&gt;
        push    temp1               ; temp 1 sichern&lt;br /&gt;
        in      temp1,sreg          ; SREG sichern&lt;br /&gt;
&lt;br /&gt;
        inc     SubCount            ; Wenn dies nicht der 100. Interrupt&lt;br /&gt;
        cpi     SubCount, 100       ; ist, dann passiert gar nichts&lt;br /&gt;
        brne    end_isr&lt;br /&gt;
&lt;br /&gt;
                                    ; Überlauf&lt;br /&gt;
        clr     SubCount            ; SubCount rücksetzen&lt;br /&gt;
        inc     Sekunden            ; plus 1 Sekunde&lt;br /&gt;
        cpi     Sekunden, 60        ; sind 60 Sekunden vergangen?&lt;br /&gt;
        brne    Ausgabe             ; wenn nicht kann die Ausgabe schon&lt;br /&gt;
                                    ; gemacht werden&lt;br /&gt;
&lt;br /&gt;
                                    ; Überlauf&lt;br /&gt;
        clr     Sekunden            ; Sekunden wieder auf 0 und dafür&lt;br /&gt;
        inc     Minuten             ; plus 1 Minute&lt;br /&gt;
        cpi     Minuten, 60         ; sind 60 Minuten vergangen ?&lt;br /&gt;
        brne    Ausgabe             ; wenn nicht, -&amp;gt; Ausgabe&lt;br /&gt;
&lt;br /&gt;
                                    ; Überlauf&lt;br /&gt;
        clr     Minuten             ; Minuten zurücksetzen und dafür&lt;br /&gt;
        inc     Stunden             ; plus 1 Stunde&lt;br /&gt;
        cpi     Stunden, 24         ; nach 24 Stunden, die Stundenanzeige&lt;br /&gt;
        brne    Ausgabe             ; wieder zurücksetzen&lt;br /&gt;
&lt;br /&gt;
                                    ; Überlauf&lt;br /&gt;
        clr     Stunden             ; Stunden rücksetzen&lt;br /&gt;
&lt;br /&gt;
Ausgabe:&lt;br /&gt;
        ldi     flag,1              ; Flag setzen, LCD updaten&lt;br /&gt;
&lt;br /&gt;
end_isr:&lt;br /&gt;
&lt;br /&gt;
        out     sreg,temp1          ; sreg wieder herstellen&lt;br /&gt;
        pop     temp1&lt;br /&gt;
        reti                        ; das wars. Interrupt ist fertig&lt;br /&gt;
&lt;br /&gt;
; Eine Zahl aus dem Register temp1 ausgeben&lt;br /&gt;
&lt;br /&gt;
lcd_number:&lt;br /&gt;
        push    temp2               ; register sichern,&lt;br /&gt;
                                    ; wird für Zwsichenergebnisse gebraucht     &lt;br /&gt;
        ldi     temp2, &#039;0&#039;         &lt;br /&gt;
lcd_number_10:                &lt;br /&gt;
        subi    temp1, 10           ; abzählen wieviele Zehner in&lt;br /&gt;
        brcs    lcd_number_1        ; der Zahl enthalten sind&lt;br /&gt;
        inc     temp2&lt;br /&gt;
        rjmp    lcd_number_10&lt;br /&gt;
lcd_number_1:&lt;br /&gt;
        push    temp1               ; den Rest sichern (http://www.mikrocontroller.net/topic/172026)&lt;br /&gt;
        mov     temp1,temp2         ; &lt;br /&gt;
        rcall   lcd_data            ; die Zehnerstelle ausgeben&lt;br /&gt;
        pop     temp1               ; den Rest wieder holen&lt;br /&gt;
        subi    temp1, -10          ; 10 wieder dazuzählen, da die&lt;br /&gt;
                                    ; vorhergehende Schleife 10 zuviel&lt;br /&gt;
                                    ; abgezogen hat&lt;br /&gt;
                                    ; das Subtrahieren von -10&lt;br /&gt;
                                    ; = Addition von +10 ist ein Trick&lt;br /&gt;
                                    ; da kein addi Befehl existiert&lt;br /&gt;
        ldi     temp2, &#039;0&#039;          ; die übrig gebliebenen Einer&lt;br /&gt;
        add     temp1, temp2        ; noch ausgeben&lt;br /&gt;
        rcall   lcd_data&lt;br /&gt;
&lt;br /&gt;
        pop     temp2               ; Register wieder herstellen&lt;br /&gt;
        ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Interrupt-Routine werden wieder, genauso wie vorher, die Anzahl der Interrupt-Aufrufe gezählt. Beim 100. Aufruf sind daher 40.000 * 100 = 4.000.000 Takte vergangen und da der Quarz mit 4.000.000 Schwingungen in der Sekunde arbeitet, ist daher eine Sekunde vergangen. Sie wird genauso wie vorher registriert und die Uhr entsprechend hochgezählt. Wird jetzt die Uhr mit einer kommerziellen verglichen, dann fällt nach einiger Zeit auf ... Sie geht immer noch falsch! Was ist jetzt die Ursache? Die Ursache liegt in einem Problem, das nicht direkt behebbar ist. Am Quarz! Auch wenn auf dem Quarz drauf steht, dass er eine Frequenz von 4MHz hat, so stimmt das nicht exakt. Auch Quarze haben Fertigungstoleranzen und verändern ihre Frequenz mit der Temperatur. Typisch liegt die Fertigungstoleranz bei +/- 100ppm = 0,01% (&#039;&#039;&#039;p&#039;&#039;&#039;arts &#039;&#039;&#039;p&#039;&#039;&#039;er &#039;&#039;&#039;m&#039;&#039;&#039;illion, Millionstel Teile), die Temperaturdrift zwischen -40 Grad und 85 Grad liegt je nach Typ in der selben Größenordnung. Das bedeutet, dass die Uhr pro Monat um bis zu 268 Sekunden (~4 1/2 Minuten) falsch gehen kann. Diese Einflüsse auf die Quarzfrequenz sind aber messbar und per Hardware oder Software behebbar. In Uhren kommen normalerweise genauer gefertigte Uhrenquarze zum Einsatz, die vom Uhrmacher auch noch auf die exakte Frequenz abgeglichen werden (mittels Kondensatoren und Frequenzzähler). Ein Profi verwendet einen sehr genauen Frequenzzähler, womit er innerhalb weniger Sekunden die Frequenz sehr genau messen kann. Als Hobbybastler kann man die Uhr eine zeitlang (Tage, Wochen) laufen lassen und die Abweichung feststellen (z.&amp;amp;nbsp;B. exakt 20:00 Uhr zum Start der Tagsschau). Aus dieser Abweichung lässt sich dann errechnen, wie schnell der Quarz wirklich schwingt. Und da dank CTC die Messperiode taktgenau eingestellt werden kann, ist es möglich, diesen Frequenzfehler auszugleichen. Der genaue Vorgang ist in dem Wikiartikel [[AVR - Die genaue Sekunde / RTC]] beschrieben. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{{Navigation_zurückhochvor|&lt;br /&gt;
zurücktext=Timer|&lt;br /&gt;
zurücklink=AVR-Tutorial: Timer|&lt;br /&gt;
hochtext=Inhaltsverzeichnis|&lt;br /&gt;
hochlink=AVR-Tutorial|&lt;br /&gt;
vortext=ADC|&lt;br /&gt;
vorlink=AVR-Tutorial: ADC}}&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR-Tutorial|Uhr]]&lt;br /&gt;
[[Category:Timer und Uhren]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Uhr&amp;diff=94399</id>
		<title>AVR-Tutorial: Uhr</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Uhr&amp;diff=94399"/>
		<updated>2016-11-20T21:49:44Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Diese push/pop sind unnötig. temp1 wird innerhalb der ISR nur zum Speichern von SREG verwendet.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine beliebte Übung für jeden Programmierer ist die Implementierung einer Uhr. Die meisten Uhren bestehen aus einem Taktgeber und einer Auswerte- und Anzeigevorrichtung. Wir wollen hier beides mittels eines Programmes in einem Mikrocontroller realisieren. Voraussetzung für diese Fallstudie ist das Verständnis der Kapitel über&lt;br /&gt;
&lt;br /&gt;
* [[AVR-Tutorial: LCD| Ansteuerung eines LC-Displays]]&lt;br /&gt;
* [[AVR-Tutorial: Timer| Timer]]&lt;br /&gt;
&lt;br /&gt;
== Aufbau und Funktion ==&lt;br /&gt;
&lt;br /&gt;
Die Aufgabe des Taktgebers, der uns einen möglichst konstanten und genauen Takt liefert, übernimmt ein Timer. Der Timer ermöglicht einen einfachen Zugang zum Takt, den der AVR vom Quarz abgreift. Wie schon im Einführungskapitel über den [[AVR-Tutorial:_Timer|Timer]] beschrieben, wird dazu ein Timer Overflow Interrupt installiert, und in diesem Interrupt wird die eigentliche Uhr hochgezählt. Die Uhr besteht aus vier Registern. Drei davon repräsentieren die Sekunden, Minuten und Stunden unserer Uhr. Nach jeweils einer Sekunde wird das Sekundenregister um eins erhöht. Sind 60 Sekunden vergangen, wird das Sekundenregister wieder auf Null gesetzt und gleichzeitig das Minutenregister um eins erhöht. Dies ist ein Überlauf. Nach 60 Minuten werden die Minuten wieder auf Null gesetzt und für diese vergangenen 60 Minuten eine Stunde aufaddiert. Nach 24 Stunden schliesslich werden die Stunden wieder auf Null gesetzt, ein ganzer Tag ist vergangen.&lt;br /&gt;
&lt;br /&gt;
Aber wozu das vierte Register?&lt;br /&gt;
&lt;br /&gt;
Der Mikrocontroller wird mit 4 MHz betrieben. Bei einem Teiler von 1024 zählt der Timer also mit 4000000 / 1024 = 3906,25 Pulsen pro Sekunde. Der Timer muss einmal bis 256 zählen, bis er einen Überlauf auslöst. Es ereignen sich also 3906,25 / 256 = 15,2587 Überläufe pro Sekunde. Die Aufgabe des vierten Registers ist es nun, diese 15 Überläufe zu zählen. Bei Auftreten des 15. ist eine Sekunde vergangen. Dies stimmt jedoch nicht exakt, denn die Division weist ja auch Nachkommastellen auf, hat einen Rest, der hier im Moment der Einfachheit halber ignoriert wird. In einem späteren Abschnitt wird darauf noch eingegangen werden.&lt;br /&gt;
&lt;br /&gt;
Im Überlauf-Interrupt wird also diese Kette von Zählvorgängen auf den Sekunden, Minuten und Stunden durchgeführt und anschliessend zur Anzeige gebracht. Dazu werden die in einem vorhergehenden Kapitel entwickelten [[AVR-Tutorial:_LCD|LCD Funktionen]] benutzt.&lt;br /&gt;
&lt;br /&gt;
== Das erste Programm ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
.def temp1 = r16&lt;br /&gt;
.def temp2 = r17&lt;br /&gt;
.def temp3 = r18&lt;br /&gt;
.def flag  = r19&lt;br /&gt;
 &lt;br /&gt;
.def SubCount = r21&lt;br /&gt;
.def Sekunden = r22&lt;br /&gt;
.def Minuten  = r23&lt;br /&gt;
.def Stunden  = r24&lt;br /&gt;
&lt;br /&gt;
.org 0x0000&lt;br /&gt;
        rjmp    main                ; Reset Handler&lt;br /&gt;
.org OVF0addr&lt;br /&gt;
        rjmp    timer0_overflow     ; Timer Overflow Handler&lt;br /&gt;
&lt;br /&gt;
.include &amp;quot;lcd-routines.asm&amp;quot;&lt;br /&gt;
&lt;br /&gt;
main:&lt;br /&gt;
        ldi     temp1, HIGH(RAMEND)&lt;br /&gt;
        out     SPH, temp1&lt;br /&gt;
        ldi     temp1, LOW(RAMEND)  ; Stackpointer initialisieren&lt;br /&gt;
        out     SPL, temp1&lt;br /&gt;
&lt;br /&gt;
        ldi temp1, 0xFF    ; Port D = Ausgang&lt;br /&gt;
        out DDRD, temp1 &lt;br /&gt;
    &lt;br /&gt;
        rcall   lcd_init&lt;br /&gt;
        rcall   lcd_clear&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
        ldi     temp1, (1&amp;lt;&amp;lt;CS02) | (1&amp;lt;&amp;lt;CS00)   ; Teiler 1024&lt;br /&gt;
        out     TCCR0, temp1&lt;br /&gt;
 &lt;br /&gt;
        ldi     temp1, 1&amp;lt;&amp;lt;TOIE0     ; TOIE0: Interrupt bei Timer Overflow&lt;br /&gt;
        out     TIMSK, temp1&lt;br /&gt;
 &lt;br /&gt;
        clr     Minuten             ; Die Uhr auf 0 setzen&lt;br /&gt;
        clr     Sekunden&lt;br /&gt;
        clr     Stunden&lt;br /&gt;
        clr     SubCount&lt;br /&gt;
        clr     Flag                ; Merker löschen&lt;br /&gt;
&lt;br /&gt;
        sei&lt;br /&gt;
 &lt;br /&gt;
loop:&lt;br /&gt;
        cpi     flag,0&lt;br /&gt;
        breq    loop                ; Flag im Interrupt gesetzt?&lt;br /&gt;
        ldi     flag,0              ; flag löschen&lt;br /&gt;
  &lt;br /&gt;
        rcall   lcd_clear           ; das LCD löschen&lt;br /&gt;
        mov     temp1, Stunden      ; und die Stunden ausgeben&lt;br /&gt;
        rcall   lcd_number&lt;br /&gt;
        ldi     temp1, &#039;:&#039;          ; zwischen Stunden und Minuten einen &#039;:&#039;&lt;br /&gt;
        rcall   lcd_data&lt;br /&gt;
        mov     temp1, Minuten      ; dann die Minuten ausgeben&lt;br /&gt;
        rcall   lcd_number&lt;br /&gt;
        ldi     temp1, &#039;:&#039;          ; und noch ein &#039;:&#039;&lt;br /&gt;
        rcall   lcd_data&lt;br /&gt;
        mov     temp1, Sekunden     ; und die Sekunden&lt;br /&gt;
        rcall   lcd_number&lt;br /&gt;
&lt;br /&gt;
        rjmp    loop&lt;br /&gt;
 &lt;br /&gt;
timer0_overflow:                    ; Timer 0 Overflow Handler&lt;br /&gt;
&lt;br /&gt;
        push    temp1               ; temp 1 sichern&lt;br /&gt;
        in      temp1,sreg          ; SREG sichern&lt;br /&gt;
        push    temp1&lt;br /&gt;
&lt;br /&gt;
        inc     SubCount            ; Wenn dies nicht der 15. Interrupt&lt;br /&gt;
        cpi     SubCount, 15        ; ist, dann passiert gar nichts&lt;br /&gt;
        brne    end_isr&lt;br /&gt;
&lt;br /&gt;
                                    ; Überlauf&lt;br /&gt;
        clr     SubCount            ; SubCount rücksetzen&lt;br /&gt;
        inc     Sekunden            ; plus 1 Sekunde&lt;br /&gt;
        cpi     Sekunden, 60        ; sind 60 Sekunden vergangen?&lt;br /&gt;
        brne    Ausgabe             ; wenn nicht kann die Ausgabe schon&lt;br /&gt;
                                    ; gemacht werden&lt;br /&gt;
&lt;br /&gt;
                                    ; Überlauf&lt;br /&gt;
        clr     Sekunden            ; Sekunden wieder auf 0 und dafür&lt;br /&gt;
        inc     Minuten             ; plus 1 Minute&lt;br /&gt;
        cpi     Minuten, 60         ; sind 60 Minuten vergangen ?&lt;br /&gt;
        brne    Ausgabe             ; wenn nicht, -&amp;gt; Ausgabe&lt;br /&gt;
&lt;br /&gt;
                                    ; Überlauf&lt;br /&gt;
        clr     Minuten             ; Minuten zurücksetzen und dafür&lt;br /&gt;
        inc     Stunden             ; plus 1 Stunde&lt;br /&gt;
        cpi     Stunden, 24         ; nach 24 Stunden, die Stundenanzeige&lt;br /&gt;
        brne    Ausgabe             ; wieder zurücksetzen&lt;br /&gt;
&lt;br /&gt;
                                    ; Überlauf&lt;br /&gt;
        clr     Stunden             ; Stunden rücksetzen&lt;br /&gt;
&lt;br /&gt;
Ausgabe:&lt;br /&gt;
        ldi     flag,1              ; Flag setzen, LCD updaten&lt;br /&gt;
&lt;br /&gt;
end_isr:&lt;br /&gt;
&lt;br /&gt;
        pop     temp1&lt;br /&gt;
        out     sreg,temp1          ; sreg wieder herstellen&lt;br /&gt;
        pop     temp1&lt;br /&gt;
        reti                        ; das wars. Interrupt ist fertig&lt;br /&gt;
&lt;br /&gt;
; Eine Zahl aus dem Register temp1 ausgeben&lt;br /&gt;
&lt;br /&gt;
lcd_number:&lt;br /&gt;
        push    temp2               ; register sichern,&lt;br /&gt;
                                    ; wird für Zwsichenergebnisse gebraucht     &lt;br /&gt;
        ldi     temp2, &#039;0&#039;         &lt;br /&gt;
lcd_number_10:                &lt;br /&gt;
        subi    temp1, 10           ; abzählen wieviele Zehner in&lt;br /&gt;
        brcs    lcd_number_1        ; der Zahl enthalten sind&lt;br /&gt;
        inc     temp2&lt;br /&gt;
        rjmp    lcd_number_10&lt;br /&gt;
lcd_number_1:&lt;br /&gt;
        push    temp1               ; den Rest sichern (http://www.mikrocontroller.net/topic/172026)&lt;br /&gt;
        mov     temp1,temp2         ; &lt;br /&gt;
        rcall   lcd_data            ; die Zehnerstelle ausgeben&lt;br /&gt;
        pop     temp1               ; den Rest wiederherstellen&lt;br /&gt;
        subi    temp1, -10          ; 10 wieder dazuzählen, da die&lt;br /&gt;
                                    ; vorhergehende Schleife 10 zuviel&lt;br /&gt;
                                    ; abgezogen hat&lt;br /&gt;
                                    ; das Subtrahieren von -10&lt;br /&gt;
                                    ; = Addition von +10 ist ein Trick&lt;br /&gt;
                                    ; da kein addi Befehl existiert&lt;br /&gt;
        ldi     temp2, &#039;0&#039;          ; die übrig gebliebenen Einer&lt;br /&gt;
        add     temp1, temp2        ; noch ausgeben&lt;br /&gt;
        rcall   lcd_data&lt;br /&gt;
&lt;br /&gt;
        pop     temp2               ; Register wieder herstellen&lt;br /&gt;
        ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der ISR wird nur die Zeit in den Registern neu berechnet, die Ausgabe auf das LCD erfolgt in der Hauptschleife. Das ist notwendig, da die LCD-Ausgabe bisweilen sehr lange dauern kann. Wenn sie länger als ~2/15 Sekunden dauert werden Timerinterrupts &amp;quot;verschluckt&amp;quot; und unsere Uhr geht noch mehr falsch. Dadurch, dass aber die Ausgabe in der Hauptschleife durchgeführt wird, welche jederzeit durch einen Timerinterrupt unterbrochen werden kann, werden keine Timerinterrupts verschluckt. Das ist vor allem wichtig, wenn mit höheren Interruptfrequenzen gearbeitet wird, z.&amp;amp;nbsp;B. 1/100s im Beispiel weiter unten. Auch wenn in diesem einfachen Beispiel die Ausgabe bei weitem nicht 2/15 Sekunden dauert, sollte man sich diesen Programmierstil allgemein angewöhnen. Siehe auch [[Interrupt]].&lt;br /&gt;
&lt;br /&gt;
Eine weitere Besonderheit ist das Register &#039;&#039;&#039;flag&#039;&#039;&#039; (=r19). Dieses Register fungiert als Anzeiger, wie eine Flagge, daher auch der Name. In der ISR wird dieses Register auf 1 gesetzt. Die Hauptschleife, also alles zwischen &#039;&#039;loop&#039;&#039; und &#039;&#039;rjmp loop&#039;&#039;, prüft dieses Flag und nur dann, wenn das Flag auf 1 steht, wird die LCD Ausgabe gemacht und das Flag wieder auf 0 zurückgesetzt. Auf diese Art wird nur dann Rechenzeit für die LCD Ausgabe verbraucht, wenn dies tatsächlich notwendig ist. Die ISR teilt mit dem Flag der Hauptschleife mit, dass eine bestimmte Aufgabe, nämlich der Update der Anzeige gemacht werden muss und die Hauptschleife reagiert darauf bei nächster Gelegenheit, indem sie diese Aufgabe ausführt und setzt das Flag zurück. Solche Flags werden daher auch &#039;&#039;&#039;Job-Flags&#039;&#039;&#039; genannt, weil durch ihr setzten das Abarbeiten eines Jobs (einer Aufgabe) angestoßen wird. Auch hier gilt wieder: Im Grunde würde man in diesem speziellen Beispiel kein Job-Flag benötigen, weil es in der Hauptschleife nur einen einzigen möglichen Job, die Neuausgabe der Uhrzeit, gibt. Sobald aber Programme komplizierter werden und mehrere Jobs möglich sind, sind Job-Flags eine gute Möglichkeit, ein Programm so zu organsieren, dass bestimmte Dinge nur dann gemacht werden, wenn sie notwendig sind.&lt;br /&gt;
&lt;br /&gt;
Im Moment gibt es keine Möglichkeit, die Uhr auf eine bestimmte Uhrzeit einzustellen. Um dies tun zu können, müssten noch zusätzlich Taster an den Mikrocontroller angeschlossen werden, mit deren Hilfe die Sekunden, Minuten und Stunden händisch vergrößert bzw. verkleinert werden können. Studieren Sie mal die Bedienungsanleitung einer käuflichen Digitaluhr und versuchen sie zu beschreiben, wie dieser Stellvorgang bei dieser Uhr vor sich geht. Sicherlich werden Sie daraus eine Idee entwickeln können, wie ein derartiges Stellen mit der hier vorgestellten Digitaluhr funktionieren könnte. Als Zwischenlösung kann man im Programm die Uhr beim Start anstelle von 00:00:00 z.&amp;amp;nbsp;B. auch auf 20:00:00 stellen und exakt mit dem Start der Tagesschau starten. Wobei der Start der Tagesschau verzögert bei uns ankommt, je nach Übertragung können das mehrere Sekunden sein.&lt;br /&gt;
&lt;br /&gt;
== Ganggenauigkeit ==&lt;br /&gt;
&lt;br /&gt;
Wird die Uhr mit einer gekauften Uhr verglichen, so stellt man schnell fest, dass sie ganz schön ungenau geht. Sie geht vor! Woran liegt das? Die Berechnung sieht so aus:&lt;br /&gt;
* Frequenz des Quarzes: 4.0 MHz&lt;br /&gt;
* Vorteiler des Timers: 1024&lt;br /&gt;
* Überlauf alle 256 Timertakte&lt;br /&gt;
&lt;br /&gt;
Daraus errechnet sich, dass in einer Sekunde 4000000 / 1024 / 256 = 15.258789 Overflow Interrupts auftreten. Im Programm wird aber bereits nach 15 Overflows eine Sekunde weitergeschaltet, daher geht die Uhr vor. Rechnen wir etwas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;F_r = (\frac {15}{15,258789}-1) \cdot 100% = -1,69%&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So wie bisher läuft die Uhr also rund 1.7 % zu schnell. In einer Minute ist das immerhin etwas mehr als eine Sekunde. Im Grunde ist das ein ähnliches Problem wie mit unserer Jahreslänge. Ein Jahr dauert nicht exakt 365 Tage, sondern in etwa einen viertel Tag länger. Die Lösung, die im Kalender dafür gemacht wurde - der Schalttag -, könnte man fast direkt übernehmen. Nach 3 Stück 15er Overflow Sekunden folgt eine Sekunde für die 16 Overflows ablaufen müssen. Wie sieht die Rechnung bei einem 15, 15, 15, 16 Schema aus? Für 4 Sekunden werden exakt 15.258789 * 4 = 61,035156 Overflow Interrupts benötigt. Mit einem 15, 15, 15, 16 Schema werden in 4 Sekunden genau 61 Overflow Interrupts durchgeführt. Der relative Fehler beträgt dann&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;F_r = (\frac {61}{61,035156}-1) \cdot 100% = -0,0575%&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit diesem Schema ist der Fehler beträchtlich gesunken. Nur noch 0.06%. Bei dieser Rate muss die Uhr immerhin etwas länger als 0,5 Stunden laufen, bis der Fehler auf eine Sekunde angewachsen ist. Das sind aber immer noch 48 Sekunden pro Tag bzw. 1488 Sekunden (=24,8 Minuten) pro Monat. So schlecht sind nicht mal billige mechanische Uhren!&lt;br /&gt;
&lt;br /&gt;
Jetzt könnte man natürlich noch weiter gehen und immer kompliziertere &amp;quot;Schalt-Overflow&amp;quot;-Schemata austüfteln und damit die Genauigkeit näher an 100% bringen. Aber gibt es noch andere Möglichkeiten?&lt;br /&gt;
&lt;br /&gt;
Im ersten Ansatz wurde ein Vorteiler von 1024 eingesetzt. Was passiert bei einem anderen Vorteiler? Nehmen wir mal einen Vorteiler von 64. Das heißt, es müssen ( 4000000 / 64 ) / 256 = 244.140625 Overflows auflaufen, bis 1 Sekunde vergangen ist. Wenn also 244 Overflows gezählt werden, dann beläuft sich der Fehler auf&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;F_r = (\frac {244}{244,140625}-1) \cdot 100% = -0,0576%&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nicht schlecht. Nur durch Verändern von 2 Zahlenwerten im Programm (Teilerfaktor und Anzahl der Overflow Interrupts bis zu einer Sekunden) kann die Genauigkeit gegenüber dem ursprünglichen Overflow-Schema beträchtlich gesteigert werden. Aber geht das noch besser? Ja das geht. Allerdings nicht mit dem Overflow Interrupt.&lt;br /&gt;
&lt;br /&gt;
== Der CTC-Modus des Timers ==&lt;br /&gt;
&lt;br /&gt;
Worin liegt denn das eigentliche Problem, mit dem die Uhr zu kämpfen hat? Es liegt darin, dass jedesmal ein kompletter Timerzyklus bis zum Overflow abgewartet werden muss, um darauf zu reagieren. Da aber nur jeweils ganzzahlige Overflowzyklen abgezählt werden können, heißt das auch, dass im ersten Fall nur in Vielfachen von 1024 * 256 = 262.144 Takten operiert werden kann, während im letzten Fall immerhin schon eine Granulierung von 64 * 256 = 16.384 Takten erreicht wird. Aber offensichtlich ist das nicht genau genug. Bei 4 MHz entsprechen 262.144 Takte bereits einem Zeitraum von 65,5 ms, während 16384 Takte einem Zeitbedarf von 4,096 ms entsprechen. Beide Zahlen teilen aber 1.000 ms nicht ganzzahlig, Nachkommareste fallen unter den Tisch und daraus summiert sich der Fehler auf. Angestrebt wird ein Timer, der seinen &amp;lt;em&amp;gt;Overflow&amp;lt;/em&amp;gt; so erreicht, dass sich ein ganzzahliger Teiler von einer Sekunde einstellt. Dann gibt es keinen Rest. Dazu müsste man dem Timer aber vorschreiben können, bei welchem Zählerstand der &amp;lt;em&amp;gt;Overflow&amp;lt;/em&amp;gt; erfolgen soll. Und genau dies ist im &#039;&#039;&#039;CTC&#039;&#039;&#039;-Modus möglich, allerdings nur beim Timer 1. &#039;&#039;&#039;CTC&#039;&#039;&#039; bedeutet &amp;quot;&#039;&#039;&#039;C&#039;&#039;&#039;lear &#039;&#039;&#039;T&#039;&#039;&#039;imer on &#039;&#039;&#039;C&#039;&#039;&#039;ompare match&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Timer 1, ein 16-Bit-Timer, wird mit einem Vorteiler von 1 betrieben. Dadurch wird erreicht, dass der Timer mit höchster Zeitauflösung arbeiten kann. Bei jedem Ticken des Systemtaktes von 4 MHz wird auch der Timer um 1 erhöht. Zusätzlich wird noch das WGM12-Bit bei der Konfiguration gesetzt. Dadurch wird der Timer in den &#039;&#039;&#039;CTC&#039;&#039;&#039;-Modus gesetzt. Dabei wird der Inhalt des Timers hardwaremäßig mit dem Inhalt des &#039;&#039;&#039;OCR1A&#039;&#039;&#039;-Registers verglichen. Stimmen beide überein, so wird der Timer auf 0 zurückgesetzt und im nächsten Taktzyklus ein &#039;&#039;&#039;OCIE1A&#039;&#039;&#039;-Interrupt ausgelöst. Dadurch ist es möglich, exakt die Anzahl an Taktzyklen festzulegen, die von einem Interrupt zum nächsten vergehen sollen. Das Compare Register &#039;&#039;&#039;OCR1A&#039;&#039;&#039; wird mit dem Wert 39.999 vorbelegt. Dadurch vergehen exakt 40.000 Taktzyklen von einem Compare-Interrupt zum nächsten. &amp;quot;Zufällig&amp;quot; ist dieser Wert so gewählt, dass bei einem Systemtakt von 4 MHz von einem Interrupt zum nächsten genau 1/100 Sekunde vergeht, denn 40.000 / 4.000.000 = 0,01. Bei einem möglichen Umbau der Uhr zu einer Stoppuhr könnte sich die Hundertstelsekunde als nützlich erweisen. Im Interrupt wird das Hilfsregister SubCount bis 100 hochgezählt, und nach 100 Interrupts kommt wieder die Sekundenweiterschaltung wie oben in Gang.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
.def temp1 = r16&lt;br /&gt;
.def temp2 = r17&lt;br /&gt;
.def temp3 = r18&lt;br /&gt;
.def Flag  = r19&lt;br /&gt;
 &lt;br /&gt;
.def SubCount = r21&lt;br /&gt;
.def Sekunden = r22&lt;br /&gt;
.def Minuten  = r23&lt;br /&gt;
.def Stunden  = r24&lt;br /&gt;
&lt;br /&gt;
.org 0x0000&lt;br /&gt;
           rjmp    main             ; Reset Handler&lt;br /&gt;
.org OC1Aaddr&lt;br /&gt;
           rjmp    timer1_compare   ; Timer Compare Handler&lt;br /&gt;
&lt;br /&gt;
.include &amp;quot;lcd-routines.asm&amp;quot;&lt;br /&gt;
&lt;br /&gt;
main:&lt;br /&gt;
        ldi     temp1, HIGH(RAMEND)&lt;br /&gt;
        out     SPH, temp1&lt;br /&gt;
        ldi     temp1, LOW(RAMEND)  ; Stackpointer initialisieren&lt;br /&gt;
        out     SPL, temp1&lt;br /&gt;
&lt;br /&gt;
        ldi temp1, 0xFF    ; Port D = Ausgang&lt;br /&gt;
        out DDRD, temp1     &lt;br /&gt;
&lt;br /&gt;
        rcall   lcd_init&lt;br /&gt;
        rcall   lcd_clear&lt;br /&gt;
 &lt;br /&gt;
                                    ; Vergleichswert &lt;br /&gt;
        ldi     temp1, high( 40000 - 1 )&lt;br /&gt;
        out     OCR1AH, temp1&lt;br /&gt;
        ldi     temp1, low( 40000 - 1 )&lt;br /&gt;
        out     OCR1AL, temp1&lt;br /&gt;
                                    ; CTC Modus einschalten&lt;br /&gt;
                                    ; Vorteiler auf 1&lt;br /&gt;
        ldi     temp1, ( 1 &amp;lt;&amp;lt; WGM12 ) | ( 1 &amp;lt;&amp;lt; CS10 )&lt;br /&gt;
        out     TCCR1B, temp1&lt;br /&gt;
 &lt;br /&gt;
        ldi     temp1, 1 &amp;lt;&amp;lt; OCIE1A  ; OCIE1A: Interrupt bei Timer Compare&lt;br /&gt;
        out     TIMSK, temp1&lt;br /&gt;
 &lt;br /&gt;
        clr     Minuten             ; Die Uhr auf 0 setzen&lt;br /&gt;
        clr     Sekunden&lt;br /&gt;
        clr     Stunden&lt;br /&gt;
        clr     SubCount&lt;br /&gt;
        clr     Flag                ; Flag löschen&lt;br /&gt;
&lt;br /&gt;
        sei&lt;br /&gt;
loop:&lt;br /&gt;
        cpi     flag,0&lt;br /&gt;
        breq    loop                ; Flag im Interrupt gesetzt?&lt;br /&gt;
        ldi     flag,0              ; Flag löschen&lt;br /&gt;
  &lt;br /&gt;
        rcall   lcd_clear           ; das LCD löschen&lt;br /&gt;
        mov     temp1, Stunden      ; und die Stunden ausgeben&lt;br /&gt;
        rcall   lcd_number&lt;br /&gt;
        ldi     temp1, &#039;:&#039;          ; zwischen Stunden und Minuten einen &#039;:&#039;&lt;br /&gt;
        rcall   lcd_data&lt;br /&gt;
        mov     temp1, Minuten      ; dann die Minuten ausgeben&lt;br /&gt;
        rcall   lcd_number&lt;br /&gt;
        ldi     temp1, &#039;:&#039;          ; und noch ein &#039;:&#039;&lt;br /&gt;
        rcall   lcd_data&lt;br /&gt;
        mov     temp1, Sekunden     ; und die Sekunden&lt;br /&gt;
        rcall   lcd_number&lt;br /&gt;
&lt;br /&gt;
        rjmp    loop&lt;br /&gt;
 &lt;br /&gt;
timer1_compare:                     ; Timer 1 Output Compare Handler&lt;br /&gt;
&lt;br /&gt;
        push    temp1               ; temp 1 sichern&lt;br /&gt;
        in      temp1,sreg          ; SREG sichern&lt;br /&gt;
&lt;br /&gt;
        inc     SubCount            ; Wenn dies nicht der 100. Interrupt&lt;br /&gt;
        cpi     SubCount, 100       ; ist, dann passiert gar nichts&lt;br /&gt;
        brne    end_isr&lt;br /&gt;
&lt;br /&gt;
                                    ; Überlauf&lt;br /&gt;
        clr     SubCount            ; SubCount rücksetzen&lt;br /&gt;
        inc     Sekunden            ; plus 1 Sekunde&lt;br /&gt;
        cpi     Sekunden, 60        ; sind 60 Sekunden vergangen?&lt;br /&gt;
        brne    Ausgabe             ; wenn nicht kann die Ausgabe schon&lt;br /&gt;
                                    ; gemacht werden&lt;br /&gt;
&lt;br /&gt;
                                    ; Überlauf&lt;br /&gt;
        clr     Sekunden            ; Sekunden wieder auf 0 und dafür&lt;br /&gt;
        inc     Minuten             ; plus 1 Minute&lt;br /&gt;
        cpi     Minuten, 60         ; sind 60 Minuten vergangen ?&lt;br /&gt;
        brne    Ausgabe             ; wenn nicht, -&amp;gt; Ausgabe&lt;br /&gt;
&lt;br /&gt;
                                    ; Überlauf&lt;br /&gt;
        clr     Minuten             ; Minuten zurücksetzen und dafür&lt;br /&gt;
        inc     Stunden             ; plus 1 Stunde&lt;br /&gt;
        cpi     Stunden, 24         ; nach 24 Stunden, die Stundenanzeige&lt;br /&gt;
        brne    Ausgabe             ; wieder zurücksetzen&lt;br /&gt;
&lt;br /&gt;
                                    ; Überlauf&lt;br /&gt;
        clr     Stunden             ; Stunden rücksetzen&lt;br /&gt;
&lt;br /&gt;
Ausgabe:&lt;br /&gt;
        ldi     flag,1              ; Flag setzen, LCD updaten&lt;br /&gt;
&lt;br /&gt;
end_isr:&lt;br /&gt;
&lt;br /&gt;
        out     sreg,temp1          ; sreg wieder herstellen&lt;br /&gt;
        pop     temp1&lt;br /&gt;
        reti                        ; das wars. Interrupt ist fertig&lt;br /&gt;
&lt;br /&gt;
; Eine Zahl aus dem Register temp1 ausgeben&lt;br /&gt;
&lt;br /&gt;
lcd_number:&lt;br /&gt;
        push    temp2               ; register sichern,&lt;br /&gt;
                                    ; wird für Zwsichenergebnisse gebraucht     &lt;br /&gt;
        ldi     temp2, &#039;0&#039;         &lt;br /&gt;
lcd_number_10:                &lt;br /&gt;
        subi    temp1, 10           ; abzählen wieviele Zehner in&lt;br /&gt;
        brcs    lcd_number_1        ; der Zahl enthalten sind&lt;br /&gt;
        inc     temp2&lt;br /&gt;
        rjmp    lcd_number_10&lt;br /&gt;
lcd_number_1:&lt;br /&gt;
        push    temp1               ; den Rest sichern (http://www.mikrocontroller.net/topic/172026)&lt;br /&gt;
        mov     temp1,temp2         ; &lt;br /&gt;
        rcall   lcd_data            ; die Zehnerstelle ausgeben&lt;br /&gt;
        pop     temp1               ; den Rest wieder holen&lt;br /&gt;
        subi    temp1, -10          ; 10 wieder dazuzählen, da die&lt;br /&gt;
                                    ; vorhergehende Schleife 10 zuviel&lt;br /&gt;
                                    ; abgezogen hat&lt;br /&gt;
                                    ; das Subtrahieren von -10&lt;br /&gt;
                                    ; = Addition von +10 ist ein Trick&lt;br /&gt;
                                    ; da kein addi Befehl existiert&lt;br /&gt;
        ldi     temp2, &#039;0&#039;          ; die übrig gebliebenen Einer&lt;br /&gt;
        add     temp1, temp2        ; noch ausgeben&lt;br /&gt;
        rcall   lcd_data&lt;br /&gt;
&lt;br /&gt;
        pop     temp2               ; Register wieder herstellen&lt;br /&gt;
        ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Interrupt-Routine werden wieder, genauso wie vorher, die Anzahl der Interrupt-Aufrufe gezählt. Beim 100. Aufruf sind daher 40.000 * 100 = 4.000.000 Takte vergangen und da der Quarz mit 4.000.000 Schwingungen in der Sekunde arbeitet, ist daher eine Sekunde vergangen. Sie wird genauso wie vorher registriert und die Uhr entsprechend hochgezählt. Wird jetzt die Uhr mit einer kommerziellen verglichen, dann fällt nach einiger Zeit auf ... Sie geht immer noch falsch! Was ist jetzt die Ursache? Die Ursache liegt in einem Problem, das nicht direkt behebbar ist. Am Quarz! Auch wenn auf dem Quarz drauf steht, dass er eine Frequenz von 4MHz hat, so stimmt das nicht exakt. Auch Quarze haben Fertigungstoleranzen und verändern ihre Frequenz mit der Temperatur. Typisch liegt die Fertigungstoleranz bei +/- 100ppm = 0,01% (&#039;&#039;&#039;p&#039;&#039;&#039;arts &#039;&#039;&#039;p&#039;&#039;&#039;er &#039;&#039;&#039;m&#039;&#039;&#039;illion, Millionstel Teile), die Temperaturdrift zwischen -40 Grad und 85 Grad liegt je nach Typ in der selben Größenordnung. Das bedeutet, dass die Uhr pro Monat um bis zu 268 Sekunden (~4 1/2 Minuten) falsch gehen kann. Diese Einflüsse auf die Quarzfrequenz sind aber messbar und per Hardware oder Software behebbar. In Uhren kommen normalerweise genauer gefertigte Uhrenquarze zum Einsatz, die vom Uhrmacher auch noch auf die exakte Frequenz abgeglichen werden (mittels Kondensatoren und Frequenzzähler). Ein Profi verwendet einen sehr genauen Frequenzzähler, womit er innerhalb weniger Sekunden die Frequenz sehr genau messen kann. Als Hobbybastler kann man die Uhr eine zeitlang (Tage, Wochen) laufen lassen und die Abweichung feststellen (z.&amp;amp;nbsp;B. exakt 20:00 Uhr zum Start der Tagsschau). Aus dieser Abweichung lässt sich dann errechnen, wie schnell der Quarz wirklich schwingt. Und da dank CTC die Messperiode taktgenau eingestellt werden kann, ist es möglich, diesen Frequenzfehler auszugleichen. Der genaue Vorgang ist in dem Wikiartikel [[AVR - Die genaue Sekunde / RTC]] beschrieben. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{{Navigation_zurückhochvor|&lt;br /&gt;
zurücktext=Timer|&lt;br /&gt;
zurücklink=AVR-Tutorial: Timer|&lt;br /&gt;
hochtext=Inhaltsverzeichnis|&lt;br /&gt;
hochlink=AVR-Tutorial|&lt;br /&gt;
vortext=ADC|&lt;br /&gt;
vorlink=AVR-Tutorial: ADC}}&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR-Tutorial|Uhr]]&lt;br /&gt;
[[Category:Timer und Uhren]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Logische_Verkn%C3%BCpfungen&amp;diff=89995</id>
		<title>Logische Verknüpfungen</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Logische_Verkn%C3%BCpfungen&amp;diff=89995"/>
		<updated>2015-10-15T18:12:01Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Änderung 89993 von 2003:63:2B37:8701:4D1E:EC41:1288:7FBE (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;====UND====&lt;br /&gt;
&amp;lt;font size=&amp;quot;9&amp;quot;&amp;gt;&amp;lt;/FONT&amp;gt;(Konjunktion)&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;x = a \wedge b&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
   &amp;lt;td&amp;gt;[[Bild:AND.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;a&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;b&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;x&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
====ODER====&lt;br /&gt;
Verknüpfung (Disjunktion)&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;x = a \vee b&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Bild:ODER.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;a&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;b&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;x&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
====NICHT====&lt;br /&gt;
Verknüpfung (Negation)&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;x = \overline{a}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Bild:NOT.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;a&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;x&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
====NAND====&lt;br /&gt;
Verknüpfung&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;x = \overline{a \wedge b}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Bild:NAND.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;a&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;b&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;x&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
====NOR====&lt;br /&gt;
Verknüpfung (Konjunktion)&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;x = \overline{a \vee b}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Bild:NOR.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;a&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;b&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;x&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
====XOR====&lt;br /&gt;
Exklusiv-ODER-Verknüpfung (Antivalenz)&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;x = (a \wedge \overline{b}) \vee (\overline{a} \wedge b)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Bild:XOR.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;a&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;b&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;x&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
====XNOR====&lt;br /&gt;
Exklusiv-NOR-Verknüpfung (Äquivalenz)&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;x = (a \wedge b) \vee (\overline{a} \wedge \overline{b})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Bild:XNOR.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;a&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;b&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;x&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sperrgatter&#039;&#039;&#039; (Inhibition)&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;x = \overline{a} \wedge b&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Bild:Inhibition.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;a&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;b&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;x&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Subjunktion&#039;&#039;&#039; (Implikation)&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;x = \overline{a} \vee b&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Bild:Implikation.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;a&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;b&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;x&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Logische_Verkn%C3%BCpfungen&amp;diff=89994</id>
		<title>Logische Verknüpfungen</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Logische_Verkn%C3%BCpfungen&amp;diff=89994"/>
		<updated>2015-10-15T18:11:44Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Änderung 89992 von 2003:63:2B37:8701:4D1E:EC41:1288:7FBE (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;====UND====&lt;br /&gt;
&amp;lt;font size=&amp;quot;9&amp;quot;&amp;gt;&amp;lt;/FONT&amp;gt;(Konjunktion)&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;x = a \wedge b&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
   &amp;lt;td&amp;gt;[[Bild:AND.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;a&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;b&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;x&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
====ODER====&lt;br /&gt;
Verknüpfung (Disjunktion)&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;x = a \vee b&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Bild:ODER.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;a&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;b&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;x&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
====NICHT====&lt;br /&gt;
Verknüpfung (Negation)&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;x = \overline{a}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Bild:NOT.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;a&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;x&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
====NAND====&lt;br /&gt;
Verknüpfung&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;x = \overline{a \wedge b}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Bild:NAND.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;a&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;b&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;x&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
====NOR====&lt;br /&gt;
Verknüpfung (Konjunktion)&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;x = \overline{a \vee b}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Bild:NOR.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;a&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;b&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;x&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
====XOR====&lt;br /&gt;
Exklusiv-ODER-Verknüpfung (Antivalenz)&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;x = (a \wedge \overline{b}) \vee (\overline{a} \wedge b)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Bild:XOR.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;a&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;b&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;x&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
====XNOR====&lt;br /&gt;
Exklusiv-NOR-Verknüpfung (Äquivalenz)&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;x = (a \wedge b) \vee (\overline{a} \wedge \overline{b})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Bild:XNOR.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;a&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;b&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;x&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sperrgatter&#039;&#039;&#039; (Inhibition)&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;x = \overline{a} \wedge b&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Bild:Inhibition.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;a&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;b&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;x&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Subjunktion&#039;&#039;&#039; (Implikation)&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;x = \overline{a} \vee b&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Bild:Implikation.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;a&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;b&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;x&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_PWM&amp;diff=89854</id>
		<title>AVR PWM</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_PWM&amp;diff=89854"/>
		<updated>2015-09-28T21:06:39Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Änderung 89850 von 2003:80:CD04:5800:E951:EC8D:85AF:5C66 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Vorwort==&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist noch nicht vollständig!&lt;br /&gt;
Und außerdem überschneidet er sich teilweise mit dem Tutorial, weil PWM und Timer zum Verständnis praktisch dasselbe sind. &lt;br /&gt;
Vielleicht kann ja jemand, der gerade dabei ist, sich diese Dinge anzueignen, die Beschreibung vorantreiben (erweitern/entschlacken)?&lt;br /&gt;
&lt;br /&gt;
Hier sollen die Möglichkeiten und die Funktionsweise der PWM mit AVRs erläutert werden, so daß Anfänger auf ihrem Weg zum Ziel unterstützt werden, ohne sich erst durch die wenig erklärenden Beiträge im Forum zu quälen.&lt;br /&gt;
Auch wenn das Verständnis (hoffentlich) dann nicht mehr aus dem Datenblatt kommen muß, ist dieses für die spezifischen Einstellungen und Feinheiten absolut notwendig. Aber mit dieser Übersicht sollte es leichter fallen, die relevanten Informationen schneller zu finden.&lt;br /&gt;
&lt;br /&gt;
Ich gehe dabei von meiner Situation aus: &amp;quot;Gerade mit AVRs angefangen, die LED blinkt, Taster wird abgefragt, schonmal von PWM gehört und unter den AVR Pins welche mit OC.. entdeckt, das hängt damit irgendwie zusammen.&amp;quot;&lt;br /&gt;
Man sollte sich auch um die Prozessorfrequenz gekümmert haben, also die [[AVR_Fuses]] entsprechend gesetzt haben.&lt;br /&gt;
&lt;br /&gt;
Wer in Begriff steht, sein erstes Board zu ätzen, sollte sich über die verschiedenen Möglichkeiten, die die OCnx Pins bieten, informiert haben.&lt;br /&gt;
&lt;br /&gt;
Übrigens lässt es sich besser lesen, wenn man sein Browserfenster so schmal macht, daß der Text in eine schöne Spalte gezwungen wird.&lt;br /&gt;
&lt;br /&gt;
==Einführung==&lt;br /&gt;
&lt;br /&gt;
Im AVR-GCC-Tutorial werden im Abschnitt [[AVR-GCC-Tutorial#DAC (Digital Analog Converter)|DAC-Optionen]] verschiedene Möglichkeiten angesprochen, analoge Spannungen zu generieren.&lt;br /&gt;
&lt;br /&gt;
Darunter fällt auch die [[Pulsweitenmodulation]], bei der durch schnelles Ein- und  Ausschalten eines Ausgangs (über einen Filter) eine [[analog]]e Spannung generiert werden kann.&lt;br /&gt;
&lt;br /&gt;
Beim Dimmen von Lichtquellen wirkt die Trägheit des Auges als Filter, wenn z.&amp;amp;nbsp;B. eine LED im Mittel die Hälfte der Zeit eingeschaltet ist, scheint es also, als würde sie nur halb so hell leuchten.&lt;br /&gt;
&lt;br /&gt;
Bei Motoren läßt sich PWM gut zum Dosieren des Stroms einsetzen, ohne große Verluste zu haben.  Für einen Teil der Zeit wird also der volle Motorstrom eingeschaltet, d.h. das Drehmoment ist maximal.&lt;br /&gt;
&lt;br /&gt;
Die Rechtecksignale lassen sich mit Mikrocontrollern auf zwei Wegen erzeugen:&lt;br /&gt;
&lt;br /&gt;
PWM per Software&lt;br /&gt;
* Kostet Rechenzeit, erhöhter Softwareaufwand&lt;br /&gt;
* Signalausgabe auf jedem I/O-Pin möglich&lt;br /&gt;
* Höhere Kanalanzahl möglich&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
&lt;br /&gt;
PWM per Hardware&lt;br /&gt;
* Läuft unabhängig vom Programm&lt;br /&gt;
* Bietet mehr Möglichkeiten bei gleichem Softwareaufwand &lt;br /&gt;
* Signalausgabe nur auf bestimmten, fest vorgegebenen Pins möglich&lt;br /&gt;
* Benötigt einen Timer&lt;br /&gt;
* Nur begrenzte Anzahl an PWM-Kanälen vorhanden (viele verbreitete AVR-Typen haben 2 bis 3, neuere auch mehr) &lt;br /&gt;
&lt;br /&gt;
Alles was mit Pulsen und Modulation zu tun hat, hat auch was mit Zeit zu tun &amp;amp;ndash; denn im Prinzip soll mit einer bestimmten Frequenz für eine bestimmte Dauer ein Pin eingeschaltet werden.&lt;br /&gt;
&lt;br /&gt;
Alles was bei Mikrocontrollern mit Zeit zu tun hat, hat wahrscheinlich auch etwas mit einem [[Timer]] bzw. Counter zu tun.&lt;br /&gt;
&lt;br /&gt;
==Timer / Counter==&lt;br /&gt;
&lt;br /&gt;
Unter [[Timer]] bzw. [[Counter]] (T/C) steht noch nicht soviel, aber man sollte kurz mal reinsehen, oder mehr dazu schreiben, oder die fehlende Verknüpfung anlegen.&lt;br /&gt;
&lt;br /&gt;
Ein Timer ist nichts anderes als ein selbständiger Zähler (Counter), der mit einer bestimmten Frequenz einen Wert raufzählt. Und zwar in Hardware, also unabhängig vom Programm. Seine Zählfrequenz wird vom Prozessortakt abgeleitet, das erledigt der [[Prescaler]] in einstellbaren Schritten (Frequenzteiler).&lt;br /&gt;
&lt;br /&gt;
Der Zählerstand läßt sich sowohl in Software als auch von der Hardware selbst überwachen - und schon lassen sich damit periodisch Ereignisse auslösen.&lt;br /&gt;
&lt;br /&gt;
Deswegen lassen sich die T/C für viele Zwecke verwenden, wir wollen den T/C für PWM nutzen (trotzdem gleich eine Übersicht über die verschiedenen Modi).&lt;br /&gt;
&lt;br /&gt;
Es lohnt sich natürlich, das Prinzip der T/C verstanden zu haben. Ein Blick ins GCC-Tutorial lohnt, die Atmel Application Note 130: Setup and Use the AVR Timers schadet auch nicht. &lt;br /&gt;
&lt;br /&gt;
Wie schon angedeutet, gibt es - je nach AVR - einen oder mehrere T/C . Sie unterscheiden sich erwartungsgemäß durch ihre Parameter und Optionen, z.&amp;amp;nbsp;B. die Auflösung, Frequenz, Zählweise und andere Betriebsmodi.&lt;br /&gt;
&lt;br /&gt;
Und natürlich auch durch den Namen, der sich auch in den [[Register]]n widerspiegelt: Sie werden nämlich numeriert (im Folgenden hier und im Datenblatt mit Platzhalter n). &lt;br /&gt;
&lt;br /&gt;
T/C 0 ist beim tiny2313 der &#039;einfache&#039; mit 8 Bit Auflösung (das Aus-An Verhältnis läßt sich in 256 Stufen einstellen), T/C 1 dagegen hat eine Auflösung von 16 Bit und bietet einige weitere Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
=== 8 oder 16 Bit ? ===&lt;br /&gt;
Außer der Tatsache, daß die Auflösung bei 16 Bit mit 65536 Stufen um einiges feiner ist, gibt es noch folgende Unterschiede:&lt;br /&gt;
&lt;br /&gt;
* Er verwendet einige 16 Bit Register&lt;br /&gt;
** Schreiben/Lesen dieser Register erfolgt in Schritten&lt;br /&gt;
* &lt;br /&gt;
&lt;br /&gt;
Mit dem Zähler alleine kann man noch nicht so viel anfangen. Ausgedacht wurde deswegen außerdem die&lt;br /&gt;
&lt;br /&gt;
=== Output Compare Unit ===&lt;br /&gt;
&lt;br /&gt;
was soviel bedeutet wie Ausgangsvergleichseinheit.&lt;br /&gt;
&lt;br /&gt;
Jeder Zähler hat eine oder mehrere voneinander unabhängige Output Compare Units (OC), auch wieder mit den dazugehörigen Registern.&lt;br /&gt;
&lt;br /&gt;
Die verschiedenen OCs und ihre Register werden mit Buchstaben (&#039;A&#039;, &#039;B&#039;) benannt. (Im PWM Modus hängt das direkt mit den Pins zusammen: OC1B ist der Ausgang der OC des T/C 1. Dazu gleich mehr..)&lt;br /&gt;
&lt;br /&gt;
Die OC vergleicht den Zählerstand (im Register TCNTn) ständig mit ihren eigenen Registerinhalten (OCRnx). Wenn diese übereinstimmen, passiert etwas.&lt;br /&gt;
&lt;br /&gt;
Was passiert, wird bestimmt durch die&lt;br /&gt;
&lt;br /&gt;
=== Betriebsmodi ===&lt;br /&gt;
&lt;br /&gt;
Der Zähler zählt. Die OC Unit vergleicht dessen Zählerstand mit einem Wert. Wenn diese übereinstimmen, kann etwas passieren.&lt;br /&gt;
&lt;br /&gt;
Weil es hier gleich mit den Einstellungen in den Registern losgeht, noch ein Hinweis:&lt;br /&gt;
&lt;br /&gt;
Die Kontrolle über das Verhalten der Zähler und OCs wird über Register vorgenommen, deren Namen nichts mit den OC Units zu tun haben!&lt;br /&gt;
Die Einstellungen sind lediglich auf zwei Register verteilt, die Timer/Counter Control Register - TCCRnA &amp;amp; TCCRnB.&lt;br /&gt;
&lt;br /&gt;
Ein paar Notizen:&lt;br /&gt;
* In verschiedenen Modi haben auch Bits in den Registern eine andere Bedeutung!&lt;br /&gt;
* Meist können Interrupts ausgelöst werden.&lt;br /&gt;
* Es kann häufig auch der Zählerstand per Software verändert werden.&lt;br /&gt;
* Die Frequenz der ausgegebenen Waveform hängt ab von&lt;br /&gt;
** I/O Clock (CPU)&lt;br /&gt;
** Prescaler &lt;br /&gt;
** Counter Modus&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die verschiedenen Modi (vorerst die vom 8 Bit Zähler):&lt;br /&gt;
&lt;br /&gt;
* Normal (evtl. für Software PWM)&lt;br /&gt;
* Clear Timer on Compare (CTC) (eingeschränkte PWM)&lt;br /&gt;
* Fast PWM&lt;br /&gt;
* Phase Correct PWM&lt;br /&gt;
&lt;br /&gt;
Dazu hier noch folgende Begriffe im Zusammenhang mit dem Zähler:&lt;br /&gt;
&lt;br /&gt;
 BOTTOM: 0x00&lt;br /&gt;
 MAX   : 0xFF bei 8 Bit, 0xFFFF bei 16 Bit&lt;br /&gt;
 TOP   : MAX oder OCRnx&lt;br /&gt;
&lt;br /&gt;
==== Normal==== &lt;br /&gt;
(evtl. für Software PWM)&lt;br /&gt;
&lt;br /&gt;
Der Zähler zählt rauf (BOTTOM-&amp;gt;MAX), und wird nicht zurückgesetzt, sondern läuft einfach über, und setzt dabei sein Overflow-Flag.&lt;br /&gt;
Dieser Modus wird zur PWM nicht empfohlen, weil er im Vergleich mit Hardware-PWM viel CPU-Zeit benötigt - das ist logisch:&lt;br /&gt;
Bei jedem Nulldurchgang müsste man einen Interrupt verwenden, der dann eine Routine ausführt, die den Ausgang umschaltet. Und man müsste den Zählerstand manipulieren, um die Pulslänge zu verändern.&lt;br /&gt;
&lt;br /&gt;
Für die verhältnismäßig langsame (Menschenzeit) Programmsteuerung ist dieser Modus aber ideal. Während das Hauptprogramm i.A. einfach endlos durchläuft, wird die Programmzeit durch einen Timer(-Interrupt) in Time-Slots gerastert (z.&amp;amp;nbsp;B. 1/10s). Damit lassen sich bequem Wartezeiten bzw. zeitabhängige Ereignisse steuern, ohne das Programm anzuhalten.&lt;br /&gt;
&lt;br /&gt;
====  Clear Timer on Compare (CTC)==== &lt;br /&gt;
(eingeschränkte PWM)&lt;br /&gt;
&lt;br /&gt;
Der Zähler zählt hoch, bis er mit OCRnx übereinstimmt (BOTTOM-&amp;gt;OCRnx: Match!) und wird dann auf Null gesetzt. Der maximale Wert lässt sich also über das Register OCRnx komfortabel bestimmen.&lt;br /&gt;
&lt;br /&gt;
Konkret bedeutet das, dass die in diesem Modus vom Prescaler erzeugte Basisfrequenz nochmals durch den Wert von OCRnx geteilt wird.&lt;br /&gt;
&lt;br /&gt;
Für PWM:&lt;br /&gt;
&lt;br /&gt;
Wenn eingestellt ist, dass der OC-Ausgang bei jedem Match umschaltet (toggle), entspricht der eingestellte Wert dem Pulsweitenverhältnis.&lt;br /&gt;
Bei OCRnx=128 des 8 Bit T/C wäre also etwa die Hälfte der Zeit der Pin eingeschaltet.&lt;br /&gt;
&lt;br /&gt;
Allerdings kann das beim T/C 0 des tiny2313 nur der Ausgang A (OC0A). Also ins Datenblatt gucken!&lt;br /&gt;
&lt;br /&gt;
====  Fast PWM====&lt;br /&gt;
&lt;br /&gt;
Einer von den zwei eigentlichen PWM-Betriebsarten ist der Fast PWM Modus.&lt;br /&gt;
Der Counter zählt von BOTTOM bis TOP, wobei TOP entweder 0xFF oder OCRnx sein kann.&lt;br /&gt;
&lt;br /&gt;
Bei einem Match wird im&lt;br /&gt;
&lt;br /&gt;
a) nicht-invertierenden Modus&lt;br /&gt;
der Zähler gelöscht, und bei BOTTOM gesetzt&lt;br /&gt;
&lt;br /&gt;
b) invertierenden Modus&lt;br /&gt;
der Zähler gesetzt, und bei BOTTOM gelöscht.&lt;br /&gt;
&lt;br /&gt;
Klingt theoretisch kompliziert, praktisch invertiert es nur den Ausgang.&lt;br /&gt;
Aber der Vergleichswert muss anscheinend ständig aktualisiert werden!?&lt;br /&gt;
&lt;br /&gt;
Dieser Modus hat eine asymmetrische Ausgangsform, weil der Ausgang periodisch umgeschaltet wird (also immer nach der gleichen Zeit) und dann nach Ablauf der variablen Pulslänge wieder invertiert wird.&lt;br /&gt;
&lt;br /&gt;
Und es gibt noch einen Toggle-Modus, der allerdings nur für den Ausgang OC0A zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
====  Phase Correct PWM==== &lt;br /&gt;
&lt;br /&gt;
Ist nur halb so schnell wie Fast PWM, dafür aber mit symmetrischer Wellenform.&lt;br /&gt;
&lt;br /&gt;
Erreicht wird das, indem von BOTTOM-&amp;gt;TOP gezählt wird, und dann wieder runter: TOP-BOTTOM.&lt;br /&gt;
&lt;br /&gt;
TOP kann entweder 0xFF oder OCRnx sein.&lt;br /&gt;
&lt;br /&gt;
Auch hier gibt es wieder den nicht-invertierenden, den invertierenden, und den toggle-Modus (nicht an OC0B).&lt;br /&gt;
&lt;br /&gt;
Der symmetrische PWM-Modus wird gerne für Motorsteuerungen verwendet, wenn man den Strom in den Motorwindungen messen möchte.  Da man nicht während der Schaltzeitpunkte der H-Brückentransistoren messen möchte (noise), braucht man einen Messzeitpunkt der maximal weit von diesen Schaltzeitpunkten entfernt ist.  Die BOTTOM und TOP Werte des Counters bieten genau dies, da sie in der Mitte des High- bzw. Lowpegels liegen.&lt;br /&gt;
&lt;br /&gt;
==Praktisches Vorgehen==&lt;br /&gt;
&lt;br /&gt;
* Pins low setzen&lt;br /&gt;
* Pins als Ausgang konfigurieren.&lt;br /&gt;
* Geeignete Wellenform ermitteln&lt;br /&gt;
* Registerinformationen für ausgewählten T/C im Datenblatt aufschlagen&lt;br /&gt;
* Modus &amp;amp; Prescaler setzen und damit starten&lt;br /&gt;
** Bits in Control-Register TCCRnA &amp;amp; TCCRnB schreiben. Siehe [[Bitmanipulation]]&lt;br /&gt;
* Vergleichswert OCRnx setzen&lt;br /&gt;
&lt;br /&gt;
==Programmbeispiele==&lt;br /&gt;
&lt;br /&gt;
===PWM per Software===&lt;br /&gt;
====Pseudocode====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//Initialisierung&lt;br /&gt;
pwm_phase = 0   // von 0 bis 100(99) ergibt ein moduliertes Signal&lt;br /&gt;
pwm_soll = 30  // Tastverhältnis in Prozent (Werte von 0..100)&lt;br /&gt;
&lt;br /&gt;
//alle s Sekunden tue:&lt;br /&gt;
wenn pwm_soll = pwm_phase dann&lt;br /&gt;
  ausgang = LOW&lt;br /&gt;
wenn pwm_phase++ = 100 dann&lt;br /&gt;
  pwm_phase = 0&lt;br /&gt;
  ausgang = HIGH&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das Tastverhältnis ist &amp;lt;math&amp;gt;t_\text{HIGH}=\frac{100}{\text{pwm}\_\text{soll}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Frequenz ist &amp;lt;math&amp;gt;f=\frac{s}{100} \text{Hz}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====ASM====&lt;br /&gt;
Der Code ist nicht von mir, ich hab den John Honniball auch nicht um Erlaubnis gefragt, den Code hier zu posten. Trotzdem finde ich das Ganze recht nützlich und hab&#039; es mir trozdem erlaubt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
; ledpwm.asm --- drive a blue LED with PWM                     21/04/2006&lt;br /&gt;
; Copyright (c) 2006 John Honniball&lt;br /&gt;
&lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
            .org 0x0000&lt;br /&gt;
&lt;br /&gt;
; Blue LED on Port B bit 2&lt;br /&gt;
            .equ LEDPORT = PortB&lt;br /&gt;
            .equ LEDBIT = 0&lt;br /&gt;
&lt;br /&gt;
; This program drives a single LED connected to the AVR&#039;s I/O port.  It&lt;br /&gt;
; is connected so that the cathode of the LED is wired to the AVR pin,&lt;br /&gt;
; and the anode of the LED is wired to the 5V power supply via a&lt;br /&gt;
; resistor.  The value of that resistor depends on the colour of the LED,&lt;br /&gt;
; but is usually a few hundred ohms.&lt;br /&gt;
&lt;br /&gt;
; We control the brightness of the LED with Pulse Width Modulation (PWM),&lt;br /&gt;
; for two reasons.  Firstly, we have no analog outputs on the AVR chip,&lt;br /&gt;
; only digital ones.  Secondly, a LED&#039;s brightness  does not respond&lt;br /&gt;
; linearly to variations in supply voltage, but it responds much better&lt;br /&gt;
; to PWM.&lt;br /&gt;
&lt;br /&gt;
; Pulsating LED looks better if it never quite goes &amp;quot;off&amp;quot;, but cycles from&lt;br /&gt;
; full brightness to a dim state, and back again&lt;br /&gt;
            .equ MINBRIGHT = 25&lt;br /&gt;
            .equ MAXBRIGHT = 255&lt;br /&gt;
&lt;br /&gt;
; This value controls how fast the LED cycles from bright to dim.  It is&lt;br /&gt;
; the number of PWM cycles that we generate for each step in the brightness&lt;br /&gt;
; ramp, up and down.  Larger numbers will make the pulsation slower.&lt;br /&gt;
            .equ NCYCLES = 1&lt;br /&gt;
&lt;br /&gt;
; Start of program execution after a Reset&lt;br /&gt;
            ldi r16,low(RAMEND)                     ; Initialise stack to top of RAM&lt;br /&gt;
            out SPL,r16&lt;br /&gt;
            ldi r16,high(RAMEND)&lt;br /&gt;
            out SPH,r16&lt;br /&gt;
&lt;br /&gt;
; Initialise the hardware&lt;br /&gt;
            ldi r16,0xff                            ; Set Port B to all outputs&lt;br /&gt;
            out DDRB,r16&lt;br /&gt;
&lt;br /&gt;
            sbi LEDPORT,LEDBIT                      ; Switch off blue LED by setting output pin high&lt;br /&gt;
&lt;br /&gt;
; Start with LED at its lowest level, then ramp up to maximum&lt;br /&gt;
dopwm:      ldi r17,MINBRIGHT                       ; R17 holds current brightness level&lt;br /&gt;
l1:         ldi r18,NCYCLES                         ; R18 counts PWM cycles, and hence pulsation speed&lt;br /&gt;
l2:         cbi LEDPORT,LEDBIT                      ; Output pin low, LED on&lt;br /&gt;
            mov r16,r17                             ; R16 controls length of delay (= R17)&lt;br /&gt;
            rcall delayn4us                         ; Call delay subroutine&lt;br /&gt;
            sbi LEDPORT,LEDBIT                      ; Output pin high, LED off&lt;br /&gt;
            ldi r16,255&lt;br /&gt;
            sub r16,r17                             ; R16 controls length of delay (= 255 - R17)&lt;br /&gt;
            rcall delayn4us                         ; Call delay subroutine&lt;br /&gt;
            dec r18                                 ; Decrement PWM cycle counter&lt;br /&gt;
            brne l2&lt;br /&gt;
            inc r17                                 ; Increase brightness by one step&lt;br /&gt;
            brne l1&lt;br /&gt;
&lt;br /&gt;
; Now ramp back down to the minimum brightness&lt;br /&gt;
            ldi r17,MAXBRIGHT                       ; R17 holds current brightness level&lt;br /&gt;
l3:         ldi r18,NCYCLES                         ; R18 counts PWM cycles, and hence pulsation speed&lt;br /&gt;
l4:         cbi LEDPORT,LEDBIT                      ; Output pin low, LED on&lt;br /&gt;
            mov r16,r17                             ; R16 controls length of delay (= R17)&lt;br /&gt;
            rcall delayn4us                         ; Call delay subroutine&lt;br /&gt;
            sbi LEDPORT,LEDBIT                      ; Output pin high, LED off&lt;br /&gt;
            ldi r16,255&lt;br /&gt;
            sub r16,r17                             ; R16 controls length of delay (= 255 - R17)&lt;br /&gt;
            rcall delayn4us                         ; Call delay subroutine&lt;br /&gt;
            dec r18                                 ; Decrement PWM cycle counter&lt;br /&gt;
            brne l4&lt;br /&gt;
            dec r17                                 ; Decrease brightness by one step&lt;br /&gt;
            cpi r17,MINBRIGHT                       ; Have we reached the minimum?&lt;br /&gt;
            brne l3&lt;br /&gt;
&lt;br /&gt;
            rjmp dopwm                              ; Loop back to start&lt;br /&gt;
&lt;br /&gt;
; DELAYN4US&lt;br /&gt;
; Delay for (R16 * 4) microseconds&lt;br /&gt;
delayn4us:  tst r16                                 ; R16 = 0? (no delay)&lt;br /&gt;
            breq dly4&lt;br /&gt;
dly2:       ldi r24,low(16)&lt;br /&gt;
            ldi r25,high(16)&lt;br /&gt;
dly3:       sbiw r24,1                              ; 2 cycles&lt;br /&gt;
            brne dly3                               ; 2 cycles&lt;br /&gt;
            dec r16&lt;br /&gt;
            brne dly2&lt;br /&gt;
dly4:       ret                                     ; Return to caller&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====C====&lt;br /&gt;
&lt;br /&gt;
Dies ist ein einfaches Beispiel einer dimmbaren LED als Software PWM in C. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// F_CPU 4 MHz&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main( void )&lt;br /&gt;
{	&lt;br /&gt;
  uint8_t pwm_soll = 30; // gewünschter Dimmerwert 0..100&lt;br /&gt;
  uint8_t pwm_phase = 0; // Laufwert der Schleife 0..100&lt;br /&gt;
&lt;br /&gt;
  // LED + Widerstand mit PB0 und +5V verbunden&lt;br /&gt;
  // PB0 o-----|&amp;lt;-----###------o Vcc 5V&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB0); // Pin PB0 an Port B als Ausgang&lt;br /&gt;
  // LED ist bereits an&lt;br /&gt;
&lt;br /&gt;
  while( 1 )&lt;br /&gt;
  {&lt;br /&gt;
    if( pwm_soll == pwm_phase )&lt;br /&gt;
    {&lt;br /&gt;
      PORTB |= (1&amp;lt;&amp;lt;PB0); // active low LED aus&lt;br /&gt;
    }&lt;br /&gt;
    pwm_phase++;&lt;br /&gt;
    if( pwm_phase == 100 )&lt;br /&gt;
    {&lt;br /&gt;
      pwm_phase = 0;&lt;br /&gt;
      PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;PB0); // active low LED an&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine komplexere Variante mit Interrupts wird im Artikel [[Soft-PWM]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
====BASCOM====&lt;br /&gt;
Der entsprechende Quelltext in Bascom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$regfile = &amp;quot;m8def.dat&amp;quot;&lt;br /&gt;
$crystal = 4000000&lt;br /&gt;
&lt;br /&gt;
Ddrb = &amp;amp;H01&lt;br /&gt;
&lt;br /&gt;
Dim Pwm_phase As Integer , Pwm_soll As Integer&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
   If Pwm_soll = Pwm_phase Then&lt;br /&gt;
      Portb.0 = 1&lt;br /&gt;
   End If&lt;br /&gt;
   Incr Pwm_phase&lt;br /&gt;
   If Pwm_phase = 100 Then&lt;br /&gt;
      Pwm_phase = 0&lt;br /&gt;
      Portb.0 = 0&lt;br /&gt;
   End If&lt;br /&gt;
Loop&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===PWM per Hardware===&lt;br /&gt;
Programmbeispiele&lt;br /&gt;
&lt;br /&gt;
====ASM====&lt;br /&gt;
Für AtMega8.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include   &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
   .def   temp      = r16&lt;br /&gt;
&lt;br /&gt;
start:&lt;br /&gt;
   ldi    temp, LOW  (RAMEND)&lt;br /&gt;
   out    SPL, temp&lt;br /&gt;
   ldi    temp, HIGH (RAMEND)&lt;br /&gt;
   out    SPH, temp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   ldi    temp, 0xFF&lt;br /&gt;
   out    DDRB, temp								;define PortB as output&lt;br /&gt;
&lt;br /&gt;
   ldi    temp, 0xF3&lt;br /&gt;
   out    TCCR1A, temp							;10bit Phase Correct PWM&lt;br /&gt;
&lt;br /&gt;
   ldi    temp, 0x0A&lt;br /&gt;
   out    TCCR1B, temp							;set Prescaler&lt;br /&gt;
&lt;br /&gt;
   sei&lt;br /&gt;
&lt;br /&gt;
main:&lt;br /&gt;
   ldi    temp, 0x1&lt;br /&gt;
   out    OCR1AH, temp							;set pwm pin 1 highbyte&lt;br /&gt;
&lt;br /&gt;
   ldi    temp, 0x00&lt;br /&gt;
   out    OCR1AL, temp							;set pwm pin 1 lowbyte&lt;br /&gt;
														;pin: PortB1&lt;br /&gt;
&lt;br /&gt;
   ldi    temp, 0x00&lt;br /&gt;
   out    OCR1BH, temp							;set pwm pin 2 highbyte&lt;br /&gt;
&lt;br /&gt;
   ldi    temp, 0x00&lt;br /&gt;
   out    OCR1BL, temp							;set pwm pin 2 lowbyte&lt;br /&gt;
														;pin: PortB2&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
loop: &lt;br /&gt;
	rjmp   loop&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====C====&lt;br /&gt;
Hier wird mit dem 16-Bit-Counter 1 im PWM &#039;&#039;phase correct&#039;&#039; 8-Bit Modus eine LED am Pin OC1A gedimmt. Die Frequenz beträgt &lt;br /&gt;
:&amp;lt;math&amp;gt;f = \frac{\text{Taktfrequenz}}{2 \cdot \text{Prescaler} \cdot 256} \,\text{Hz}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In [http://www.mikrocontroller.net/topic/204969] wurde beobachtet, dass der Ausgabepin OC1A unbedingt vor der Initialisierung der PWM auf Ausgang gesetzt werden muss, wie auch oben unter &#039;&#039;Praktisches Vorgehen&#039;&#039; erläutert ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
DDRB |= (1&amp;lt;&amp;lt;OC1A); // Port OC1A mit angeschlossener LED als Ausgang&lt;br /&gt;
TCCR1A = (1&amp;lt;&amp;lt;WGM10) | (1&amp;lt;&amp;lt;COM1A1); // PWM, phase correct, 8 bit.&lt;br /&gt;
TCCR1B = (1&amp;lt;&amp;lt;CS11) | (1&amp;lt;&amp;lt;CS10); // Prescaler 64 = Enable counter&lt;br /&gt;
OCR1A = 128-1; // Duty cycle 50% (Anm. ob 128 oder 127 bitte prüfen)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein sehr gut erklärtes C PWM Beispielprogramm (inc. vielen Codekommentaren) kann man bei [http://extremeelectronics.co.in/avr-tutorials/pwm-signal-generation-by-using-avr-timers-part-ii/ extremeelectronics.co.in] finden.&lt;br /&gt;
&lt;br /&gt;
== Tiefpassfilter-Berechnung ==&lt;br /&gt;
Die PWM-Frequenz muß meistens mit einem Tiefpassfilter entfernt werden, da sie nachfolgende Verstärkerstufen übersteuert oder den Hörgenuss trübt. Ein einfacher RC-Tiefpass kann für Motorsteuerungen ausreichen, für Audioanwendungen ist der Abstand zwischen höchster Niederfrequenz und PWM-Frequenz zu klein. Ein aktives Filter mit Operationsverstärker kann die Lösung sein, oder ein passiver LC-Tiefpass. Dessen Berechnung mittels [http://www.aade.com AADE Filter Designer] soll hier an einem Fallbeispiel erläutert werden.&lt;br /&gt;
&lt;br /&gt;
Ein ATmega48 mit 20 MHz Quarz soll mittels 10 Bit &amp;quot;fast PWM&amp;quot; des 16 Bit- Timers 1 ein Stereosignal am Pin OC1A und OC1B ausgeben. Die PWM-Frequenz beträgt somit knapp 20 kHz, nach dem Abtasttheorem sind maximal 10 kHz Nutzsignal möglich. Mit der Faustregel &amp;quot;6dB pro Bit&amp;quot; erreichen wir einen Dynamikumfang oder Störabstand von 60 dB. Etwa dieselbe Unterdrückung sollte auch das Tiefpassfilter erreichen.&lt;br /&gt;
&lt;br /&gt;
[[Image:Cauerfilter.png|thumb|right|400px|Cauer-Tiefpass mit 3,3mH und 10 mH Festinduktivität]]&lt;br /&gt;
Zunächst brauchen wir noch eine Abschätzung der zulässigen Ausgangsbelastung. Laut Datenblatt beträgt der maximal zulässige Strom pro Pin 40 mA, entsprechend einem 125Ω Widerstand von 5V nach Masse. Mit 10 bis 20 mA entsprechend 500 bis 250Ω als Maximalwert dürfte also nichts passieren. Der zeitliche Mittelwert liegt für Audioanwendungen bei 2,5V, also der halben Maximalspannung. Ein hochohmiger Kopfhörer, z.&amp;amp;nbsp;B. 600Ω, läßt sich so noch ohne weitere Verstärker anschließen.&lt;br /&gt;
&lt;br /&gt;
Die größte Filtersteilheit erreicht das Cauer- oder Elliptic Filter, auf Kosten von größeren Phasenänderungen/ Gruppenlaufzeit gegenüber anderen Filtertypen. Wir starten also das Filterberechnungsprogramm mit den Vorgaben &amp;quot;lowpass&amp;quot;, &amp;quot;Cauer/Elliptic&amp;quot;, &amp;quot;3.Ordnung&amp;quot;, was eine Schaltung mit einer Induktivität und drei Kapazitäten berechnet. Den Ein- und Ausgangswiderstand geben wir erst mal irgendwo in dem genannten Bereich vor, die Durchlasswelligkeit kann auf 1 dB bleiben, Durchlassfrequenz wie gesagt 10000 Hz, die Sperrfrequenz etwas unterhalb der PWM-Frequenz, ca. 17500Hz, da der Dämpfungspol dann etwa auf 20 kHz fällt. Mit &amp;quot;analyze voltage insertion gain&amp;quot; berechnen wir eine Durchlasskurve und kontrollieren die korrekte Lage des Dämpfungspols. Jetzt variieren wir die beiden Widerstände, bis die Induktivität etwa einem leicht erhältlichen Normwert entspricht. Die drei Kondensatoren werden am Schluß ebenfalls mit dem nächsten Normwert bestückt. Sicherheitshalber kann man diese endgültige Schaltung noch mit einem [http://www.mikrocontroller.net/articles/Schaltungssimulation#Analog Schaltungssimulationsprogramm] überprüfen und die Bauteilwerte leicht korrigieren.&lt;br /&gt;
&lt;br /&gt;
Als Induktivität kommen eher die größeren Bauformen infrage, die &amp;quot;Garnrollen&amp;quot;-Form oder die axiale Bauform 77A von Fastron. Hier gilt: je größer desto höhere Güte, wie man aus den Katalogangaben zum Gleichstromwiderstand schließen kann. Von magnetischen Wechselfeldern wie etwa Schaltregler-Trafos sollte man ein paar Zentimeter Abstand halten.&lt;br /&gt;
&lt;br /&gt;
Im Bild  sind zwei Schaltungen für die genannten Frequenzen mit einer 3,3mH-Drossel und einer 10mH-Drossel gezeigt. Die Kurven sind noch mit verlustlosen Bauteilen und den berechneten krummen Bauteilwerten gezeichnet. Der Widerstand am Ausgang kann auch durch die Last wie der genannte Kopfhörer gebildet werden. Ein größerer Wert hat hier wenig Einfluss auf die Filterkurve, während der Widerstand am Eingang genau den vorgegebenen Wert haben sollte.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[AVR-Tutorial: PWM]]&lt;br /&gt;
* Beiträge im Forum [http://www.mikrocontroller.net/forum/4 Codesammlung], die den Begriff PWM enthalten: [http://www.mikrocontroller.net/search?query=pwm&amp;amp;forums%5B%5D=4 hier]&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Schrittmotoren&amp;diff=89193</id>
		<title>Schrittmotoren</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Schrittmotoren&amp;diff=89193"/>
		<updated>2015-06-30T09:46:12Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Wiederhergestellt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Schrittmotoren eignen sich als Stellmotoren. Sie können eine vorherbestimmte Anzahl von Schritten drehen und dann stehen bleiben. Ein Positionsgeber für die Rückmeldung, ob die gewünschte Position erreicht ist wird nicht zwingend benötigt. Einsatzgebiete sind Robotik und Stellantriebe. Man findet sie auch in alten 5,25 Zöllern (Floppy-Laufwerken), in sehr alten Festplatten, in Faxgeräten, Druckern und Plottern. Die größeren Motoren erreichen teils sehr hohe Drehmomente, die ein Untersetzungsgetriebe unnötig machen.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
===Mechanischer Aufbau===&lt;br /&gt;
Schrittmotoren bestehen aus einem (magnetisierten) Ankerkonstrukt und einem Spulensystem, wodurch bei Stromfluss eine Bewegung generiert werden kann. Kohlebürsten oder Schleifringe braucht der Motor nicht. Der Anker (Innenläufer) kann z. B. aus einem gezahnten Permanentmagneten bestehen. Durch diesen geschickten Aufbau wird erreicht, dass je Motorumdrehung mehrere Schrittpositionen geschaffen werden, in die der Motor einrasten kann. So gibt es Motoren mit 200 Vollschritten je Umdrehung. Aufgrund der Magnetisierung besitzt der Motor Ruhepunkte, in denen ein Haltemoment vorliegt.&lt;br /&gt;
&lt;br /&gt;
===Elektrischer Aufbau===&lt;br /&gt;
Es gibt aus elektrischer Sicht zwei grundlegende Typen von Schrittmotoren. Unipolare und bipolare Schrittmotoren. Die einfachsten Typen haben zwei getrennte Wicklungen, auch Phasen genannt. Der Unterschied besteht in der Ansteuerung der Wicklungen:&lt;br /&gt;
&lt;br /&gt;
==== Unipolare Schrittmotoren ====&lt;br /&gt;
Unipolare Schrittmotoren haben Wicklungen mit Mittelanzapfungen. Die Mittelanzapfungen sind mit der Versorgungsspannung verbunden, die Spulenendanschlüsse über Leistungstransistoren auf Masse. Durch das Einschalten der Transistoren kann man die Spulen jeweils zur Hälfte mit Strom durchfluten.&lt;br /&gt;
&lt;br /&gt;
Vorteil&lt;br /&gt;
* einfache Ansteuerung durch Transistoren (Low Side Driver)&lt;br /&gt;
* kann auch wie ein bipolarer Schrittmotor angesteuert werden, erreicht dann aber nicht ganz das Drehmoment eines vergleichbaren Bipolartyps&lt;br /&gt;
&lt;br /&gt;
Nachteil&lt;br /&gt;
* verringertes Drehmoment, da immer nur eine halbe Spule vom Strom durchflossen ist&lt;br /&gt;
&lt;br /&gt;
==== Bipolare Schrittmotoren ====&lt;br /&gt;
Bipolare Schrittmotoren haben einfache Wicklungen. Die Spulen werden über H-Brücken angesteuert, um sie umpolen zu können. Dadurch fließt der Strom immer durch die ganzen Spulen. Änderung der Drehrichtung von Linearachsen kann durch vertauschen der Spulenanschlüsse am Motortreiber erreicht werden: A -&amp;gt; B, #A -&amp;gt; #B, B -&amp;gt; A, #B -&amp;gt; A#. &lt;br /&gt;
&lt;br /&gt;
Vorteil&lt;br /&gt;
* hohes Drehmoment&lt;br /&gt;
* hohe Präzision&lt;br /&gt;
&lt;br /&gt;
Nachteil&lt;br /&gt;
* erhöhter Ansteuerungsaufwand durch H-Brücken&lt;br /&gt;
&lt;br /&gt;
== Ansteuerung ==&lt;br /&gt;
Durch passendes Anlegen der Spannungen an die Wicklungen wird ein Drehfeld erzeugt, dem der Motor folgt. Bevor der Motor die durch das Feld vorgegebene Position erreicht, muss es weitergeführt werden, um die Drehung zu erhalten. Der Motor wird dadurch hinter dem Feld her geführt. Die Winkeldifferenz zwischen Feld und Position ist ein Maß für die Belastung des Motors und die Beschleunigung.&lt;br /&gt;
&lt;br /&gt;
Es ist etwas Logik und ein Leistungstreiber nötig, damit sich ein Schrittmotor in Bewegung setzt. Bekannteste Vertreter sind die ICs L297 (Ansteuerlogik) und L293/L298 (2fache H-Brücke). Alternativ zur Kombination aus L297/L298 gibt es auch leistungsfähige DMOS ICs wie z.B. [http://www.allegromicro.com/en/Products/Motor-Driver-And-Interface-ICs/Bipolar-Stepper-Motor-Drivers/A4988.aspx Allegromicro A4988] &lt;br /&gt;
===Betriebsarten===&lt;br /&gt;
====Vollschrittbetrieb====&lt;br /&gt;
Die einfachste Betriebsart ist die des Vollschrittbetriebs, bei der das Drehfeld immer um 90 Grad vorgeschoben werden muss, was durch wechselseitiges Ansteuern der Spulen sowie Negation der Ströme nach dem Muster + 0 - 0 sowie  0 + 0 - erfolgt. Es ist dabei immer nur eine einzige Spule aktiv.&lt;br /&gt;
&lt;br /&gt;
====Halbschrittbetrieb====&lt;br /&gt;
Durch Nutzung von zwei Spulen gleichzeitig entstehen Zwischenstufen, die gegenüber dem Vollschritt um 45 Grad gedreht sind, da der Motor z.B. gleichzeit in Nord- als auch in Ostrichtung gezogen wird. Werden beide Betriebsarten gemischt, entsteht das Halbschrittverfahren. Dadurch entstehen 45 Grad-Schritte. Das Bestromungsmuster sieht wie folgt aus: + + 0 - - - 0 +   sowie  0 + + + 0 - - -  für die andere Spule, wobei man wieder eine 90 Grad-Verschiebung der beiden Ströme erkennt.&lt;br /&gt;
&lt;br /&gt;
====Micro-Step-Betrieb====&lt;br /&gt;
Bei weiterer Verfeinerung der Methode entsteht der sogenannte microstep Betrieb, bei dem die beiden Wicklungen mit Sinus/Cosinus-Strömen angesteuert werden. Dennoch bleiben bei Schrittmotoren jeweils die Ruhepunkte pro Vollschritt erhalten, in die sie bei Abschalten des Stromes hineinfallen. In diesen Punkten ist das magnetische Haltemoment vergleichsweise gering (theoretisch null), wächst aber bei infinitisimaler Motordrehung rasch an, um dann wieder abzuflachen, sodass es bei 45 Grad, wenn der Anker gerade zwischen zwei magentischen Positionen steht, wieder Null ist. Vereinfacht kann man sich dies durch einen sinusförmigen Kurvenverlauf, wie im Diagramm rot dargestellt, vorstellen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:schrittmotor-ansteuerung-sin-con-js.gif|thumb|500px]]&lt;br /&gt;
&lt;br /&gt;
Den beiden ansteuernden Strömen Sinus/Cosinus kann nun ein dem Haltemoment eitgegengesetzter Strom aufaddiert werden, der dem Anker dort, wo er am stärksten Widerstand erfährt, mehr Drehmoment von aussen zuführt. Dazu muss eine Welle mit 4facher Frequenz, die immer exakt 90 Grad Vorlauf zur Ankerstellung hat, hinzuaddiert werden.&lt;br /&gt;
&lt;br /&gt;
In Realität ist das Moment nicht sinusförmig und dessen Maximum leicht nach vorne verschoben. Unter der Annahme, dass der Vorlauf des Drehfeldes für den Motor günstig ist, kann vereinfachend eine leichte Abflachung der Kurven in den Maxima von Sinus und Cosinus vorgenommen werden. Dies ist bei der einfachen Methode [[Digitale_Sinusfunktion#Sinus-Approximation_1]] bereits ansatzweise berücksichtigt, da die Kurve im Bereich 30 und 150 Grad steiler verläuft, als der reale Sinus.&lt;br /&gt;
&lt;br /&gt;
{Absatz}&lt;br /&gt;
=== Schrittverlust ===&lt;br /&gt;
Das Hauptziel einer sinnvollen Ansteuerung ist neben dem schnellen Erreichen der Endposition bei möglichst geringem Stromaufwand die Vermeidung des so genannten Schrittverlustes, der auftritt, wenn der Motor dem Drehfeld nicht folgen kann. Der Motor schwingt dann in die Position des letzten Vollschritts zurück, teilweise sogar darüber hinaus, wenn schwere Mechanik über Getriebe angetrieben wird und hohe Torsionsmomente gespeichert waren. Damit wird die Sollvorgabe nicht erreicht.&lt;br /&gt;
&lt;br /&gt;
==== Erkennung ====&lt;br /&gt;
Eine Möglichkeit ist, auf der Achse des Motors einen Winkelsensor (Encoder) zu montieren und die Schritte permanent mitzuzählen. Eine weitere Möglichkeit besteht in der Messung des Gegen-EMK des Motors. Bei einem Schrittverlust entstehen bestimmte Oberwellen, insbesondere die dritte Harmonische. Besser, als die Erkennung des erfolgten Verlustes ist die Vermeidung.&lt;br /&gt;
&lt;br /&gt;
==== Vermeidung ====&lt;br /&gt;
Entscheidend ist, das Drehfeld des Motors zum richtigen Zeitpunkt und im Idealfall kontinuierlich so weiterzuführen, dass immer ein optimaler Lastwinkel besteht. Bei gepulstem Betrieb darf das Weiterführen nicht zu früh passieren. Der kritischste Fall ist der des Starts. Der Motor sieht noch kein Lastmoment, das Drehfeld beginnt sich aber gfs schon, schnell zu bewegen. Daher kommt der richtigen Wahl der Beschleunigungskurve eine grosse Bedeutung zu.&lt;br /&gt;
&lt;br /&gt;
===Beschleunigungsrampen richtig wählen und berechnen===&lt;br /&gt;
Dazu ein kurzer Ausflug zu meinen ersten Schrittmotor-Untersuchungen:&amp;lt;br&amp;gt;&lt;br /&gt;
In einem Matrix-Nadeldrucker der stabilen Bauart (1980: ca. 70 kg) wird der Druckkopf mittels Stepper und Zahnriemen angetrieben. Auf der Welle des Motors sitzt ein Drehgeber (Zahnrad mit Hallsensor). Dieser gibt zum Einen den Takt für die Nadeln, zum Anderen den Zeitpunkt für den nächsten Schritt vor. Das ist ideal, denn der neue Schritt wird im günstigsten Moment ausgeführt und der Motor beschleunigt mit seiner vollen Leistung, auch bei dynamischer Belastung. Der Drehgeber ist natürlich zusätzlicher Aufwand, den man gerne einsparen wollte. Später wurden typische Beschleunigungskurven aufgezeichnet und in SW nachgebildet.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Einfache Rampen wie lineares Dekrementieren der Periode von Schritt zu Schritt sind bestenfalls für kleine Beschleunigungen von sagen wir mal 1 bis 2 kHz ausreichend. Will man auf 5 bis 8 kHz drehen, muss vieles bedacht werden:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. Das größte Manko vorneweg: Das sinkende Drehmoment bei hoher Drehzahl bedingt durch den Abfall der Stromanstiegsgeschwindigkeit und durch steigende Verluste in Eisen und Wicklung (Wirbelstrom).&amp;lt;br&amp;gt;&lt;br /&gt;
Daher muss die Kurve oben flacher verlaufen, da weniger Kraft zum Beschleunigen zur Verfügung steht.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
2. Obwohl im unteren Drehzahlbereich viel Kraft zur Verfügung steht, ist es aus dynamisch-mechanischen Überlegungen manchmal nicht wünschenswert, voll loszubeschleunigen: Eine plötzlich einsetzende oder ausbleibende Kraft (Ruck) kann mechanische Resonanzen in der restlichen Mechanik (Getriebe, Motoraufhängung, Rahmen...) auslösen.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wünschenswert ist ein sin(0..2pi)-förmiger Verlauf der Kraft, also der Beschleunigung. Da diese die erste Ableitung der Geschwindigkeit nach der Zeit ist, ist der Verlauf der Geschwindigkeit 1-cos(0..2pi) = 1+cos(pi..3pi)&amp;lt;br&amp;gt;&lt;br /&gt;
Nachteil: Maximale Beschleunigung in der Mitte 55% höher als bei linear.&amp;lt;br&amp;gt;&lt;br /&gt;
Kompromiss: Quadratische Rampe (Beschleunigung steigt linear an): 33% höheres Drehmoment erforderlich.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Dazu sehr anschauliche Beschreibungen finden sich hier:&amp;lt;br&amp;gt;&lt;br /&gt;
http://sew-eurodrive.com/download/pdf/09191704.pdf (2,28 MB) S. 30/116&amp;lt;br&amp;gt;&lt;br /&gt;
http://sew-eurodrive.com/download/pdf/11220201.pdf (2,68 MB) S. 37-51/72&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Atmel bietet für Steppermotoren eine Application Note (AVR446) und ein entsprechendes Demoprogramm für lineare Rampen:&amp;lt;br&amp;gt;&lt;br /&gt;
http://www.atmel.com/dyn/resources/prod_documents/doc8017.pdf&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Den fertigen Funktionen kann die Beschleunigung, Verlangsamung, gewünschte Geschwindigkeit und Anzahl der zu fahrenden Schritte übergeben werden. Es werden automatisch die Rampen berechnet und die Timersteuerung für 16-bit Timer berechnet.&lt;br /&gt;
Das Programm ist sehr ausführlich dokumentiert (u.a. mit Doxygen) und kann fast komplett in eigene Applikationen übernommen werden.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Achtung:&amp;lt;/b&amp;gt; Das Programm ist für den IAR-Compiler und muss ggf. leicht abgeändert werden.&lt;br /&gt;
&lt;br /&gt;
====Häufigster Fehler====&lt;br /&gt;
&lt;br /&gt;
Die Rampe wird unter der Prämisse erstellt, die Zeit zwischen den Einträgen sei konstant, man könne also die linear berechneten Frequenz- oder Timerwerte einfach so eintragen. DEM IST NICHT SO. Die Mitte der Liste ist bei Weitem nicht nach der halben Rampenzeit erreicht, da Schritte am Anfang wesentlich langsamer ausgeführt werden. Die Liste muss bei niedrigen Geschwindigkeiten grobe, bei hohen Geschwindigkeiten feine Abstufungen haben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Richtig&amp;lt;/b&amp;gt; ist: Nach jedem Step die &amp;lt;b&amp;gt;Zeit seit Beschleunigungsbeginn&amp;lt;/b&amp;gt; (einfach die Timer-Werte aufaddieren), daraus die &amp;lt;b&amp;gt;gewünschte Frequenz&amp;lt;/b&amp;gt; und daraus den benötigten &amp;lt;b&amp;gt;Timer-Wert&amp;lt;/b&amp;gt; berechnen.&lt;br /&gt;
&lt;br /&gt;
====Tipps zur Rampe====&lt;br /&gt;
&lt;br /&gt;
Eine einfache Methode ist es, kontinuierlich steigende Werte auf die Sollfrequenz zu geben. Damit ergibt sich ein beschleunigter Zeitverlauf.&lt;br /&gt;
&lt;br /&gt;
==&#039;&#039;Veraltet&#039;&#039;! Treibermodule==&lt;br /&gt;
&lt;br /&gt;
===Oriental Motor: Vexta AlphaStep ASD16AC und ASD20AC (230 VAC -&amp;gt; 324 VDC, Preisklasse 220-700 Euro)===&lt;br /&gt;
&lt;br /&gt;
* Vorteile&lt;br /&gt;
**verhält sich wie ein Servo, regelt Schlupf und auch statische Laständerungen aus&lt;br /&gt;
** neue AlphaStepPlus sind frei programmierbar; ist extrem gutmütig, läuft ohne mechanische Last auch mal mit 50 kHz (!) Schrittfrequenz = 6000 1/min&lt;br /&gt;
** Drehmomentverlauf über Drehzahl sehr gut wegen hoher Spannung&lt;br /&gt;
** Opto-Trennung&lt;br /&gt;
** Error-Ausgang&lt;br /&gt;
** Enable-Eingang&lt;br /&gt;
** 500, 1000, 5000 oder 10000 Schritte pro Umdrehung einstellbar&lt;br /&gt;
** hoher Wirkungsgrad&lt;br /&gt;
** Strom in 16 Stufen einstellbar&lt;br /&gt;
&lt;br /&gt;
*Nachteile&lt;br /&gt;
**passender Motor (Preis~100-200 Euro) mit Resolver nötig&lt;br /&gt;
**eingebauter v-Filter kann zwar beschleunigen, aber nicht abbremsen, das müßte er ja vorher wissen, leider macht er deshalb zu viel gemachte Schritte nicht zurück -&amp;gt; Rampen müssen doch selbst programmiert werden&lt;br /&gt;
**teuer&lt;br /&gt;
**Motorspannung netzgekoppelt -&amp;gt; VDE&lt;br /&gt;
&lt;br /&gt;
===3 und 4 Achsen blaue TB6560 Schrittmotorplatinen von hyu68.com, wie sie auf eBay angeboten werden (Preisklasse 50 Euro)===&lt;br /&gt;
&lt;br /&gt;
*Vorteile&lt;br /&gt;
**sehr günstig&lt;br /&gt;
**state of the art Schrittmotor-IC (TB6564AHQ ist jedoch der bessere Nachfolger)&lt;br /&gt;
**Mikroschritt bis 16&lt;br /&gt;
**eigener Spannungsregler, benötigt nur die Motorspannung&lt;br /&gt;
**Optokoppler&lt;br /&gt;
**Enable-Eingang&lt;br /&gt;
**Strom in 3 Stufen, 100%, 75%, 50% vom Nennstrom, einstellbar&lt;br /&gt;
**Bedienteil ansteckbar&lt;br /&gt;
&lt;br /&gt;
*Nachteile&lt;br /&gt;
**nur die blanke Platine mit Kühlkörper, ohne Gehäuse&lt;br /&gt;
**trotz Optokoppler nicht galvanisch getrennt&lt;br /&gt;
**wegen der Optokoppler nur langsame Pulse, langsamer als Mach3 überhaupt einstellbar ist. Entfernt man die Optokoppler (überbrücken mit jeweils 1 Draht, unterschiedlich bei DIR/STEP und ENABLE), geht das Handbedienteil nicht mehr.&lt;br /&gt;
**Chopperfrequenz und Nennstrom nur durch Austausch von Bauelementen veränderbar&lt;br /&gt;
**Freilaufdiode am Relais fehlt&lt;br /&gt;
**offiziell darf die Spannung der ICs nicht aus der Motorspannung abgeleitet werden, weil damit die Einschaltsequenz des TB6560 nicht eingehalten wird. Dennoch ist bisher keiner kaputt gegangen.&lt;br /&gt;
**obwohl viele Dioden auf dem Board verbaut sind, haben die Ausgänge nur nach Masse Freilaufdioden (der TB6560A benötigt laut Hersteller keine Freilaufdioden) die anderen entkoppeln die Versorgungsspannung der 3 oder 4 Kanäle und dienen als Verpolschutz. &lt;br /&gt;
**wenn die Schrittmotoren gedreht werden, ohne dass das Board an Versorgungsspannung liegt, können die ICs gehimmelt werden.&lt;br /&gt;
**die Fähigkeiten des TB6560, wie Bremstempo, Umschalten der Mikroschritte während der Fahrt, Fehlermeldungen wie Übertemp, können nicht genutzt werden, werden aber von Mach3 sowieso nicht unterstützt.&lt;br /&gt;
&lt;br /&gt;
===3 und 4 Achsen rote TB6560 Schrittmotorplatinen, wie sie auf eBay angeboten werden (Preisklasse 50 Euro)===&lt;br /&gt;
&lt;br /&gt;
Wesentlich besser als die blauen aber etwas grösser. Tatsächlich galvanisch per (ausreichend schnellem) Optokoppler getrennt dank DC/DC Wandler. Aber auch diese Karten erfordern in MACH3 den Sherline Mode damit die vom TB6560 benötigte Impulslänge eingehalten wird.&lt;br /&gt;
&lt;br /&gt;
===RTA Deutschland / Italy: GMD03, HGD06 (32-85 V, Preisklasse 140-180 Euro)===&lt;br /&gt;
&lt;br /&gt;
*Vorteile&lt;br /&gt;
**sehr günstig&lt;br /&gt;
**wenig EMV-Probleme&lt;br /&gt;
** kann auch 8tel-Schritt&lt;br /&gt;
** HGD-Ein-und Ausgänge über Optokoppler&lt;br /&gt;
** automatische Ruhestromabsenkung&lt;br /&gt;
** Enable-Eingang&lt;br /&gt;
** Error-Ausgang&lt;br /&gt;
** Strom in 8 Stufen einstellbar&lt;br /&gt;
&lt;br /&gt;
*Nachteile&lt;br /&gt;
**nur die blanke Platine mit Kühlkörper, ohne Gehäuse (gibt es vermutlich als Zubehör)&lt;br /&gt;
&lt;br /&gt;
===IMS IB104, IB106, IB110 (Preisklasse 160-300 Euro)===&lt;br /&gt;
&lt;br /&gt;
*Vorteile&lt;br /&gt;
**mechanisch geschickt gelöst&lt;br /&gt;
**Digitaleingänge opto-isoliert&lt;br /&gt;
&lt;br /&gt;
*Nachteile&lt;br /&gt;
**analoger StromSet nicht galvanisch getrennt&lt;br /&gt;
**schlechte EMV&lt;br /&gt;
**weder home noch reset des eingebauten L297 sind herausgeführt, sodass man z.&amp;amp;nbsp;B. zum Umschalten in den Wave-Mode nicht weiß, ob er in einem geraden oder ungeraden Schritt ist&lt;br /&gt;
**Ruhe-Verlustleistung zu hoch (bei 60 V, 150 mA, 9 W, Linearregler)&lt;br /&gt;
**teurer als RTA&lt;br /&gt;
**IB106 und IB110 wesentlich teurer als IB104, obwohl nur ein paar Bauteile andere Werte haben&lt;br /&gt;
&lt;br /&gt;
=== Anregungen ===&lt;br /&gt;
&lt;br /&gt;
*Hohe Versorgungsspannung erforderlich&lt;br /&gt;
*Abbremsrampe ist schneller möglich wg. mechanischer Verluste (Reibung).&lt;br /&gt;
*Besonderheiten der Last (Drehmomentverlauf über Drehzahl) beachten.&lt;br /&gt;
*Startfrequenz knapp oberhalb der Hauptresonanzfrequenz. Nicht so hoch wie es möglich wäre, wg. Ruck beim Starten / Stoppen.&lt;br /&gt;
*Effekte bei Resonanz: kein Drehmoment, sogar Rückwärtslauf.&lt;br /&gt;
*Leistungsverbrauch sehr wohl lastabhängig.&lt;br /&gt;
&lt;br /&gt;
== Alternative Stellantriebe ==&lt;br /&gt;
&lt;br /&gt;
Eine preiswerte Alternative zu Schrittmotoren sind die [[Servo|Modellbau-Servos]], die es schon ab 5,- &amp;amp;#8364; gibt. Sie sind im Vergleich geradezu spielend einfach auch von µC anzusteuern und ermöglichen das exakte Anfahren bestimmter (speicherbarer) Winkel. Da sie nicht den Schrittmotor-typischen Schlupf haben, der gerne beim Anfahren unter mechanischer Last auftritt, eignen sie sich auch gut für größere Kräfte. Das integrierte Getriebe und die Stellautomatik blockieren die angefahrene Position, was bei kleineren Schrittmotoren mitunter problematischer ist. Für höhere Genauigkeit sollte man sogenannte digitale Servos nehmen. Eine Sonderform sind die Servowinden, mit denen man auch mehrere Umdrehungen erreichen kann. (&amp;quot;Segelwinden&amp;quot; bei Modellsegelbooten).&lt;br /&gt;
&lt;br /&gt;
== Diskussionsthreads ==&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/topic/51534&lt;br /&gt;
* http://www.mikrocontroller.net/topic/232355&lt;br /&gt;
* http://www.mikrocontroller.net/topic/215261&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/read-1-113751.html#new Bipolare Schrittmotoren] Forumsbeitrag zum Thema&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/262652#new G-Code-Interpreter und 3-Achs Schrittmotorsteuerung mit ATMega644 und Trinamic TMC260]&lt;br /&gt;
* [http://www.roboternetz.de/wissen/index.php/Schrittmotoren Ausführlicher Grundlagenartikel auf roboternetz.de]&lt;br /&gt;
* Folgende 2 Beiträge beziehen sich auf http://www.mikrocontroller.net/forum/read-1-309923.html?reload=yes#310455&lt;br /&gt;
* [http://de.nanotec.com/support/tutorials/schrittmotor-und-bldc-motoren-animation Onlinetool zur Darstellung verschiedener Ansteuerungsarten von Nanotec.de] (Flash erforderlich)&lt;br /&gt;
* [http://de.nanotec.com/support/motorauswahl-assistent Motor-Assistent] - Onlinetool zur Berechnung von Motorkennzahlen anhand von Drehzahl und Drehmoment von Nanotec.de .&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/AppNotes/00907a.pdf Microchip AN907: Stepping Motors Fundamentals] - Gute und allgemeine Einführung zum Thema Schrittmotoren.&lt;br /&gt;
* [http://www.schrittmotor-blog.de/ Schrittmotor-blog.de] - Blog mit technischen Hintergrundinformationen und Detailwissen zum Schrittmotor&lt;br /&gt;
* [[Schrittmotor-Controller (Stepper)]] Mikrocontrollerprojekt für die Anwendung von (unipolaren) Schrittmotoren als Strahlschalter&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Motoren]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Klangerzeugung&amp;diff=89181</id>
		<title>Klangerzeugung</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Klangerzeugung&amp;diff=89181"/>
		<updated>2015-06-29T10:33:39Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Wiederhergestellt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Methode zur Geräuscherzeugung hängt natürlich von der Hardware und dem gewünschten Ergebnis ab. Im einfachsten Fall macht ein Piezo-Element an einer Messingmembran Piepsgeräusche, aber auch Sprachwiedergabe über Lautsprecher ist möglich.&lt;br /&gt;
&lt;br /&gt;
== Erzeugung der Tonfrequenzen ==&lt;br /&gt;
&lt;br /&gt;
=== Sinustabelle ===&lt;br /&gt;
&lt;br /&gt;
Man kann z.B. im Flash eine Sinustabelle ablegen, die je nach gewünschter Frequenz schneller oder langsamer abgetastet wird und so einen quasi analogen Momentanwert als Vorgabe zur Bildung einer PWM ermöglicht. Damit hat man Sinustöne variabler Frequenzen, die sehr schön rund klingen können, sofern die Abtastung fein genug und die Bildung der PWM schnell genug erfolgt. Mit etwas Rechenaufwand kann man noch Lautstärke-Hüllkurven draufmodulieren (AM) und somit glockenähnliche Sounds erzeugen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;&lt;br /&gt;
# [http://www.microsyl.com/index.php/2010/03/23/door-bell/ Doorbell] bei www.microsyl.com (en, AVR, C)&lt;br /&gt;
&lt;br /&gt;
=== Voltage controlled Oscillator (VCO) ===&lt;br /&gt;
&lt;br /&gt;
* XR8038 oder MAX038&lt;br /&gt;
* XR2206&lt;br /&gt;
&lt;br /&gt;
=== Spezielle Klang-ICs ===&lt;br /&gt;
&lt;br /&gt;
Für spezielle Klänge werden ICs angeboten z.B. &lt;br /&gt;
&lt;br /&gt;
Der klassische Gong-IC SAE800&lt;br /&gt;
-&amp;gt; Conrad, Reichelt, Bausatz bei ELV&lt;br /&gt;
Desweiteren:&lt;br /&gt;
* UM 3561 -&amp;gt; Conrad&lt;br /&gt;
* [http://www1.conrad.de/scripts/wgate/zcop_b2c/?~template=pcat_area&amp;amp;p_load_area=SHOP_AREA_17354&amp;amp;zhmmh_area_kz=13&amp;amp;navi=mitte Module bei Conrad]&lt;br /&gt;
&lt;br /&gt;
Mit Voice-Recorder lassen sich kurze Audiosequenzen über ein Mikrofon aufnehmen und auf Befehl abspielen.&lt;br /&gt;
* ISD25xx z.&amp;amp;nbsp;B. ISD2560 -&amp;gt; Reichelt&lt;br /&gt;
* ISD17xx z.&amp;amp;nbsp;B. ISD1730 -&amp;gt; ?&lt;br /&gt;
* ISD14xx z.&amp;amp;nbsp;B. ISD1416 -&amp;gt; Conrad&lt;br /&gt;
* [http://www.roboternetz.de/wissen/index.php/RN-Speak Beispiel] aus Roboternetz.de&lt;br /&gt;
&lt;br /&gt;
DTMF, Telefongetute&lt;br /&gt;
* MT 8880 -&amp;gt; Conrad&lt;br /&gt;
* MT 8870 -&amp;gt; Conrad&lt;br /&gt;
* CM 8870&lt;br /&gt;
&lt;br /&gt;
Der Klassiker aus dem C64&lt;br /&gt;
* MOS 6581/SID 6581 C64-Soundchip -&amp;gt; eBay&lt;br /&gt;
* [http://www.roboterclub-freiburg.de/atmega_sound/atmegaSID.html SID-Emulator] mit AVR&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/230426] Beitrag hier im Forum, SID an AVR&lt;br /&gt;
&lt;br /&gt;
== Digital-Analog-Wandlung ([[DAC]]) ==&lt;br /&gt;
&lt;br /&gt;
Die Wechselspannung für Verstärker, Lautsprecher und elektronikfreies Piezoelement kann vom µC auf verschiedene Weise erzeugt werden. &lt;br /&gt;
&lt;br /&gt;
Mit einem Kondensator in der Signalleitung kann ein eventuell vorhandener Gleichspannungsanteil (DC-Offset) entfernt werden.&lt;br /&gt;
&lt;br /&gt;
=== R2R-Netzwerk ===&lt;br /&gt;
Siehe [[Widerstandsnetzwerk]], [http://de.wikipedia.org/wiki/R2R-Netzwerk R2R-Netzwerk] Samplerate direkt in der Ausgabe&lt;br /&gt;
&lt;br /&gt;
* http://www.myplace.nu/avr/minidds/index.htm (Englisch)&lt;br /&gt;
&lt;br /&gt;
=== [[PWM]] ===&lt;br /&gt;
Für richtiges Audio:&lt;br /&gt;
schnell laufendes PWM&lt;br /&gt;
Der Controller schnell getaktet &lt;br /&gt;
je nach gewünschter Samplerate (Samplerate x 256)&lt;br /&gt;
&lt;br /&gt;
Wenn Piezo, dann PWM mit 50% Duty-Cycle. Die Toggle-Frequenz entspricht der halben Tonhöhe (zwei mal Umschalten pro Periode).&lt;br /&gt;
&lt;br /&gt;
Meistens liefert eine Direktbeschaltung der Ausgangsstufe an einem Mikrocontroller nicht genügend Leistung. Bereits eine einfache Treiberstufe kann Abhilfe schaffen.  &lt;br /&gt;
&lt;br /&gt;
[[Bild:Pwm-wandler.svg]]&lt;br /&gt;
&lt;br /&gt;
Die 20Ω Widerstand/ 4,7 µF Kondensator Kombination als [[Filter#Tiefpass|Tiefpass]] entfernt die hohen Frequenzen des [[Pulsweitenmodulation|PWM]]-Signals aus dem Audiosignal.&lt;br /&gt;
&lt;br /&gt;
Durch Verringern des Ausgangswiderstandes kann noch etwas mehr Leistung herausgeholt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;&lt;br /&gt;
# [http://elm-chan.org/works/sd8p/report.html Simple SD Audio Player with ATtiny85] (elm-chan.org)&lt;br /&gt;
# [http://projectproto.blogspot.com/2010/05/pic18f-sd-wav-audio-player.html PIC18F SD WAV Audio Player] ähnlich 1 zusätzlich mit Tiefpassfilter&lt;br /&gt;
# [[AVR-Synthesizer]]&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Piezo-Element ===&lt;br /&gt;
&lt;br /&gt;
Piezo-Elemente sind einfach anzusteuern und als Buzzer/Summer von Reichelt, Conrad... erhältlich.&lt;br /&gt;
&lt;br /&gt;
Es gibt hier zwei Typen:&lt;br /&gt;
* Mit integrierter Elektronik; braucht nur mit Gleichspannung versorgt zu werden. &lt;br /&gt;
* Ohne Elektronik; braucht eine Wechselspannung.&lt;br /&gt;
&lt;br /&gt;
Die Piezo-Elemente haben eine Eigenresonanzfrequenz um 1,5 kHz (&amp;quot;Fiep&amp;quot;), und sind damit am lautesten. Fertige Module sind oft mit Resonanzkörper ausgestattet ([http://de.wikipedia.org/wiki/Helmholtz-Resonator Helmholtz-Resonator]).&lt;br /&gt;
&lt;br /&gt;
Piezo Elemente ohne integrierte Elektronik können direkt an die Pins eines AVR oder PIC angeschlossen werden. Um die Lautstärke zu erhöhen, kann man zwei Pins benutzen, die immer abwechselnd auf LOW bzw. HIGH gesetzt werden. Dadurch ergibt sich eine Wechselspannung um V_cc. (Prinzip der H-Brücke)&lt;br /&gt;
&lt;br /&gt;
Bei selbsterregenden Elementen (die aus einer Gleichspannung ihre Frequenz selbst erzeugen) sollte man auf die Daten achten. Im Allgemeinen brauchen kleine Module aber auch nur einige mA.&lt;br /&gt;
&lt;br /&gt;
=== Lautsprecher ===&lt;br /&gt;
Um Lautsprecher an einem µC betreiben zu können, bedarf es in den meisten Fällen eines Verstärkers, da die Portpins des µC i.d.R. nur wenige mA Strom vertragen (Datenblatt!).&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
(TODO: Sichten und den verschiedenen Methoden zuordnen)&lt;br /&gt;
&lt;br /&gt;
* http://elm-chan.org/works/mxb/report_e.html (en, AVR, ASM)&lt;br /&gt;
* http://www.microsyl.com/intercomm/intercomm.html (en, AVR, C)&lt;br /&gt;
* http://www.elby-designs.com/avrsynth/avrsyn-about.htm (en)&lt;br /&gt;
* http://www.mikrocontroller.net/topic/25051 (en,AVR,ASM)&lt;br /&gt;
* AVR314: DTMF Generator&lt;br /&gt;
* AVR335: Digital Sound Recorder with AVR and DataFlash&lt;br /&gt;
* AVR336: ADPCM Decoder&lt;br /&gt;
* http://www.avrfreaks.net/index.php?name=PNphpBB2&amp;amp;file=viewtopic&amp;amp;p=276201 (en, AVR)&lt;br /&gt;
* http://www.hanneslux.de/avr/divers/melody/index.html (de, ASM)&lt;br /&gt;
* http://www.jcwolfram.de/projekte/avr/avrmusicbox/main.php (de, ASM)&lt;br /&gt;
* [http://transistor-man.com/Rage_against_the_arduino.html Rage Against The AVR] - WAV-Daten mit PWM über Atmega48 in Stereo ausgeben (en, BASCOM AVR, PC: Python)&lt;br /&gt;
* [http://hackaday.com/2009/09/29/make-an-arduino-talk-to-you/ Make an Arduino talk to you] auf hackaday.com&lt;br /&gt;
* [http://jeremyblum.com/2010/09/05/driving-5-speakers-simultaneously-with-an-arduino/ Driving 5 speakers simultaneously with an Arduino] by Jeremy Blum.&lt;br /&gt;
&lt;br /&gt;
* [http://www2.hsu-hh.de/ant/dafx2002/papers/DAFX02_Karjalainen_Valimaki_Esquef_bell-like_sounds.pdf Glocken-Ton erzeugen]&lt;br /&gt;
* Im mikrocontroller.net-Forum, Suchbegriffe z. B.&#039;&#039;Sound&#039;&#039; o.ä.&lt;br /&gt;
* [http://www.discovercircuits.com/S/soundsyn.htm discovercircuits.com], Umfangreiche Linksammlung&lt;br /&gt;
*[http://archive.anthonymattox.com/2007-2011-blog/index.html%3Fp=1264.html Arduino Synthesizer] (R2R+DAC)&lt;br /&gt;
*[http://roboterclub-freiburg.de/atmega_sound/atmegaSID.html C64 SID Emulation auf Atmega8 und Atmega168]&lt;br /&gt;
*[http://sourceforge.net/projects/atmegasid/files/ C64 SID mit I2C auf Sourceforge ]&lt;br /&gt;
* 1-Bit Sound:&lt;br /&gt;
** [[OneBitSound]]&lt;br /&gt;
** [http://web.media.mit.edu/~nvawter/projects/1bit/index.html The 1-Bit Groove Box] (Atmega32)&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/135422 1-bit audio example program for Atmega] (Atmega32)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Audio]]&lt;br /&gt;
[[Kategorie:Bauteile]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Interrupt&amp;diff=88813</id>
		<title>Interrupt</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Interrupt&amp;diff=88813"/>
		<updated>2015-06-02T18:41:25Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Änderung 88811 von 84.169.99.147 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bei bestimmten Ereignissen in Prozessoren wird ein &#039;&#039;&#039;Interrupt&#039;&#039;&#039; (Unterbrechungsanforderung) registriert. &lt;br /&gt;
&lt;br /&gt;
Bei [[Mikrocontroller]]n werden Interrupts z.&amp;amp;nbsp;B. ausgelöst wenn:&lt;br /&gt;
* sich der an einem bestimmten Eingangs-Pin anliegende Pegel ändert&lt;br /&gt;
* eine vorher festgelegte Zeitspanne abgelaufen ist ([[Timer]])&lt;br /&gt;
* eine [[Seriell|serielle]] Übertragung abgeschlossen ist&lt;br /&gt;
* eine Messung des [[ADC |Analog-Digital-Wandlers]] abgeschlossen ist&lt;br /&gt;
&lt;br /&gt;
Die Registrierung eines Interrupts setzt ein passend zum Ereignis benanntes &#039;&#039;&#039;Interruptflag&#039;&#039;&#039; in Form eines Bits in einem speziellen Statusregister. Bei der Behandlung des Interrupts wird das Anwendungsprogramm unterbrochen, das auslösende Interruptflag gelöscht und ein Unterprogramm, die sogenannte &#039;&#039;&#039;I&#039;&#039;&#039;nterrupt &#039;&#039;&#039;S&#039;&#039;&#039;ervice &#039;&#039;&#039;R&#039;&#039;&#039;outine (&#039;&#039;&#039;ISR&#039;&#039;&#039;), aufgerufen. Wenn dieses beendet ist, läuft das Anwendungsprogramm ganz normal weiter.&lt;br /&gt;
&lt;br /&gt;
== Wichtige Eigenschaften von ISRs ==&lt;br /&gt;
&lt;br /&gt;
ISRs reagieren auf ein bestimmtes Ereignis, welches relativ oft oder selten passiert. Prinzipiell sollte man ISRs möglichst kurz halten und schnell beenden. &lt;br /&gt;
&lt;br /&gt;
Im Mittel muss die Interruptroutine kürzer sein als die Periodendauer des Ereignisses, andernfalls wird es passieren, dass Interrupts &amp;quot;verschluckt&amp;quot; werden, d.h. beim UART gehen Daten verloren, beim Timer gehen Zählzyklen verloren, beim AD-Wandler gehen Daten verloren etc.. Solche verschluckten Interrupts sind bisweilen schwer zu finden, weil es nur sehr wenige in ganz bestimmten Konstellationen sind. Wenn dann eine per Timer realisierte Uhr in der Stunde um 1s falsch geht, merkt man das oft nicht. Langwierige Berechnungen, Auswertungen, Ausgaben oder gar Warteschleifen haben daher in ISRs nichts zu suchen. Auch typische C-Funktionen wie printf(), scanf(), längere Ausgaben auf ein [[LCD]] etc. sollte man nicht in ISRs vornehmen. &lt;br /&gt;
&lt;br /&gt;
Stattdessen kommt bei Interruptbetrieb sinnvollerweise eine andere Programmiertechnik zu Einsatz, nämlich die Übergabe von Parametern bzw. Steuersignalen an das Hauptprogramm. Hierbei ist wichtig, dass die Steuervariable (&amp;quot;Flag&amp;quot;), welche gemeinsam im Interrupt-Programmteil und im Nicht-Interrupt-Programmteil verwendet wird, mit dem C Schlüsselwort [[Interrupt#Weblinks|volatile]] deklariert wird. Dadurch wird sichergestellt, dass jeder Zugriff auf die Variable im Code auch in die entsprechenden Maschinenbefehle umgesetzt wird und nicht wegoptimiert wird, weil sich die Variable in einem der beiden unabhängigen Programmteile scheinbar nicht ändert. Außerdem müssen sowohl der Lese- als auch Schreibzugriff auf Steuervariablen ununterbrechbar ([[Interrupt#Atomarer Datenzugriff|atomar]]) sein. &lt;br /&gt;
&lt;br /&gt;
=== Interruptsteuerung ===&lt;br /&gt;
&lt;br /&gt;
Interrupts müssen wie alle anderen Module und Funktionen eines Mikrocontrollers gesteuert werden. Dazu wird auf praktisch allen Mikrocontrollern ein zweistufiges System verwendet.&lt;br /&gt;
* Globale Interruptsteuerung über ein CPU-Statusbit: Beim [[AVR]] ist das das I-Bit (Interrupt) im Statusregister (SREG). Dieses Bit wirkt wie ein Hauptschalter und kann global die Ausführung aller Interrupts ein - und ausschalten. Das heisst aber nicht, dass während der Zeit der inaktiven Interrupts diese verloren gehen. Vielmehr wird das jeweilige Interruptbit gesetzt, und wenn die Interrupts wieder freigegeben werden wird der Interrupt ausgeführt. Verloren gehen Interrupts erst dann, wenn die Sperrzeit zu groß ist und währenddessen mehr als ein Interrupt vom selben Typ eintrifft. Siehe [[Interrupt#Zeitverhalten eines Timerinterrupts|Beispiel 1]] und [[Interrupt#Zeitverhalten des UART Empfangsinterrupts|Beispiel 2]].&lt;br /&gt;
* Lokale Interruptsteuerung für jede einzelne Interruptquelle über Maskenbits in mehreren Interruptmaskenregistern. Hier kann jede einzelne Interruptquelle individuell ein- und ausgeschaltet werden.&lt;br /&gt;
&lt;br /&gt;
Dieses System hat eine Reihe von Vorteilen. So können sehr schnell und einfach alle Interrupts kurzzeitig gesperrt werden, wenn beispielsweise [[Interrupt#Atomarer Datenzugriff | atomare]] Operationen durchgeführt werden sollen, oder besonders zeitkritische Abläufe ausgeführt werden. Danach können alle konfigurierten Interrupts einfach wieder freigeschaltet werden, ohne dass die CPU viele verschiedene Interruptmaskenbits verwalten müsste.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine ISR wird demnach nur dann ausgeführt, wenn&lt;br /&gt;
* die Interrupts global freigeschaltet sind&lt;br /&gt;
* das individuelle Maskenbit gesetzt ist&lt;br /&gt;
* der Interrupt eintritt&lt;br /&gt;
&lt;br /&gt;
=== Verschachtelte Interrupts ===&lt;br /&gt;
&lt;br /&gt;
Einige Mikrocontroller, wie z.&amp;amp;nbsp;B. der [[AVR]] kennen nur zwei CPU-Zustände. Normale Programmausführung und Interruptausführung, gesteuert durch das I-Bit der CPU. Die normale Programmausführung kann jederzeit durch Interrupts unterbrochen werden. Die Interruptausführung kann nicht durch neue Interrupts unterbrochen werden. Die ISR wird erst zu Ende bearbeitet, zurück in die normale Programmausführung gesprungen und erst dann werden neue, wartende (engl. pending) Interrupts bearbeitet.&lt;br /&gt;
&lt;br /&gt;
Etwas komplexere Mikrocontroller oder große Prozessoren bieten verschiedene Interruptlevel (Stufen) an . Dabei gilt meist je niedriger die Zahl des Levels, um so höher die Priorität. Ein Interrupt mit höherer Priorität kann einen Interrupt mit niedriger Priorität unterbrechen. Ein Interrupt mit gleicher Priorität wie der gerade bearbeitete Interrupt kann das im allgemeinen nicht. Das nennt man verschachtelte Interrupts (engl. nested interrupts). Klassische Vertreter hierfür sind PIC18, [[8051]], PowerPC, [[X86]] und Motorola 68000.&lt;br /&gt;
&lt;br /&gt;
Auf dem AVR kann man [[AVR-GCC-Tutorial#Unterbrechbare_Interruptroutinen | verschachtelte Interrupts]] sowohl in Assembler als auch in C nachbilden, allerdings mit einigen Einschränkungen und Tücken. Das ist jedoch Leuten vorbehalten, die schon viel Erfahrung auf diesem Gebiet haben. Zu 99,9% braucht man sie nicht.&lt;br /&gt;
&lt;br /&gt;
=== Wie lange dauert meine Interruptroutine? ===&lt;br /&gt;
&lt;br /&gt;
Diese Frage sollte man beantworten können, zumindest sollte eine Worst-Case-Abschätzung gemacht werden. Das geht auf zwei Wegen.&lt;br /&gt;
&lt;br /&gt;
* Simulation, dabei muss in einer verzweigten ISR der längste Pfad simuliert werden. Dazu müssen alle beteiligten Variablen auf den ensprechenden Wert gesetzt werden.&lt;br /&gt;
* Messung mit dem [[Oszilloskop]], dabei wird zum Beginn der ISR ein Pin auf HIGH gesetzt und am Ende auf LOW. Damit kann man in Echtzeit die Dauer der ISR messen. Die zusätzlichen Taktzyklen zum Aufruf und verlassen der ISR sind konstant und im wesentlichen bekannt. Mit einem modernen Digitaloszilloskop und dem &amp;quot;Infinite Persistence Mode&amp;quot; kann man eine Worst-Case-Messung vornehmen&lt;br /&gt;
&lt;br /&gt;
Als Hilfsmittel zur Fehlersuche kann man auch am Ende der ISR prüfen, ob das jeweilige Interrupt-Request-Bit schon wieder gesetzt ist. Wenn ja, dann ist die ISR in den meisten Fällen zu lang. Auch hier kann man einen Ausgang auf HIGH setzen und somit den Fehler anzeigen.&lt;br /&gt;
&lt;br /&gt;
=== Zeitverhalten eines Timerinterrupts ===&lt;br /&gt;
&lt;br /&gt;
Ein Timerinterrupt wird im allgemeinen dazu genutzt, in konstanten, periodischen Abständen bestimmte Funktionen aufzurufen. Es ist möglich, dass während eines Timerinterrupts derselbe Interrupt wieder aktiv wird, weil die Routine sehr verzweigt ist und dieses Mal sehr lange dauert.&lt;br /&gt;
&lt;br /&gt;
Wenn zum Beispiel der Timerinterrupt mit einer Periodendauer von 100ms aufgerufen wird, er aber unter bestimmten Umständen 180ms benötigt, dann wird nach 100ms nach Eintritt in die ISR der Interrupt wieder aktiv, das Timer Interrupt Flag wird gesetzt. Da aber gerade ein Interrupt bearbeitet wird, wird er nicht sofort angesprungen, weil währenddessen die Interruptfunktion global gesperrt ist (beim AVR ist das I-Bit in der CPU gelöscht). Der Interrupt wird zu Ende bearbeitet, die CPU springt zurück zum Hauptprogramm. Dabei werden die Interrupts wieder global eingeschaltet. Der zwischenzeitlich eingetroffene und zwischengespeicherte Interrupt wird nun sofort ausgeführt, sodass das Hauptprogramm praktisch gar nicht weiter kommt, bestenfalls einen Maschinenbefehl. Nun sind aber nur noch 20ms bis zum nächsten Timerinterrupt übrig. Wenn dieser nun wieder 180 ms benötigt werden in dieser Zeit aber &#039;&#039;&#039;zwei&#039;&#039;&#039; Interrupts ausgelöst, nach 20ms und 120ms. Da diese aber nicht gezählt oder andersweitig einzeln gespeichert werden können, geht ein Interrupt verloren. Das ist ein Programmfehler.&lt;br /&gt;
&lt;br /&gt;
=== Zeitverhalten des UART Empfangsinterrupts ===&lt;br /&gt;
&lt;br /&gt;
Ein [[UART]] Interrupt zum Empfang von Daten per [[RS232]] mit 115200 [[Baud]] ist ein recht häufiges Ereignis (1 Zeichen = 10 Bits = 86,8&amp;amp;mu;s). Wenn kontinuierlich Daten empfangen werden, wird nach jeweils 86,8&amp;amp;mu;s ein neuer Interrupt ausgelöst. Dabei wird das empfangene Datenbyte vom UART aus dem Empfangsschiebegregister in einem Puffer kopiert. Während das neue Zeichen Bit für Bit empfangen wird, wird es zunächst im Schieberegister des UART gespeichert. Die Daten im Puffer bleiben davon unberührt. Die CPU muss nun schnell das empfangene Datenbyte aus dem Empfangsbuffer auslesen. Die maximale Verzögerung, die sich die CPU erlauben kann von der Aktivierung des Interrupts bis zum tatsächlichen Auslesen des Datenregisters beträgt ziemlich genau die Übertragungszeit von einem Zeichen. Wenn bis dahin nicht das Zeichen von der CPU ausgelesen wurde, wird es vom UART überschrieben und ein Fehler im Statusregister des UART signalisiert (Overrun, Überlauf des Datenpuffers). Die UARTs in heutigen Mikrocontrollern haben mindestens ein Byte Puffer wie hier beschrieben. Die neueren [[AVR]]s haben sogar effektiv 3 Byte Puffer im UART, praktisch ein kleines [[FIFO]], womit der Datenempfang besser gepuffert werden kann, wenn die CPU gerade mit anderen sehr wichtigen Dingen beschäftigt ist. D.h. kurzzeitig kann sich die CPU erlauben, die Übertragungszeit von bis zu drei Zeichen zu warten, ehe sie die Daten ausliest. Dann müssen sie aber sehr schnell hintereinander gelesen werden. Im Mittel hat die CPU aber nur die Übertragungszeit eines Zeichens zur Verfügung, um es abzuholen.&lt;br /&gt;
&lt;br /&gt;
=== Zusammenfassung ===&lt;br /&gt;
&lt;br /&gt;
Interruptserviceroutinen:&lt;br /&gt;
* sollten so kurz wie möglich gehalten werden&lt;br /&gt;
* können im Einzelfall nahezu doppelt so lange dauern wie die kürzeste Periodendauer des Ereignisses, ohne dass Interrupts verloren gehen (z.&amp;amp;nbsp;B. Timerinterrupt).&lt;br /&gt;
* dürfen im Mittel maximal solange dauern wie die kürzeste Periodendauer des Ereignisses&lt;br /&gt;
* dürfen maximal solange dauern, wie die kürzeste Periodendauer des Ereignisses, wenn man auf Nummer sicher gehen will, dass keine Interrupts verschluckt werden&lt;br /&gt;
* Die Interruptzeit versteht sich immer abzüglich einer kleinen Reserve für das Anspringen und Verlassen des Interrupt minus Panikreserve&lt;br /&gt;
&lt;br /&gt;
==Interruptfeste Programmierung==&lt;br /&gt;
&lt;br /&gt;
=== Atomarer Datenzugriff ===&lt;br /&gt;
&lt;br /&gt;
Von einem atomaren (engl. atomic) Datenzugriff spricht man, wenn der Zugriff innerhalb einer nicht-unterbrechbaren Instruktionsfolge abgearbeitet wird.&lt;br /&gt;
&lt;br /&gt;
Alle Variablen, Steuerregister und I/O-Ports, die sowohl im Hauptprogramm als auch in Interrupts verwendet werden, sind mit viel Sorgfalt zu behandeln.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  port |= 0x03;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
übersetzt sich auf AVR-Prozessoren in&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
  IN  r16,port&lt;br /&gt;
  ORI r16,0x03&lt;br /&gt;
  OUT port,r16&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wenn nun zwischen IN und OUT ein Interrupt auftritt, der beispielsweise Bit&amp;amp;nbsp;7 verändert, dann geht mit dem OUT-Befehl diese Änderung verloren, da der OUT-Befehl den alten Zustand vor dem Interrupt wiederherstellt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gefährlich ist das insbesondere deshalb, weil der Fall nur selten auftritt und dieses Verhalten sehr schlecht reproduzierbar ist.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bei verschiedenen Prozessor-Architekturen tritt das Problem verschieden häufig auf. So übersetzt sich obiger Code bei MSP430 Prozessoren in einen einzelnen Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  OR  #0x03,port&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
und stellt somit kein Problem dar. Im Zweifel hilft nur ein Blick in den erzeugten Assembler-Code. Bei der Übernahme fremden Codes ist dies zu beachten. Was beim [[8051]] kein Problem war, kann beim [[AVR]] zu einem Problem werden, unter Umständen sogar abhängig vom verwendeten Port sein.&lt;br /&gt;
&lt;br /&gt;
Ein ähnliches Problem entsteht bei Variablen, deren Größe die Wortbreite der Maschine übersteigt. Bei 8-Bit-Prozessoren wie AVR oder 8051 also bereits bei normalen &amp;quot;int&amp;quot; Variablen. Diese Variablen werden zwangsläufig byteweise verarbeitet. Wenn genau dazwischen ein Interrupt erfolgt, wird ein falscher Wert gelesen. Wenn beispielsweise eine Interrupt-Routine einen 16-Bit-Zähler verwendet und von 0x00FF auf 0x0100 hochzählt, dann kann das Hauptprogramm auch schon mal versehentlich die Werte 0x01FF oder 0x0000 lesen.&lt;br /&gt;
&lt;br /&gt;
Dies ist auch ein Grund, weshalb für Programmierung auf derart &amp;quot;niedriger&amp;quot; Ebene Kenntnisse in Prozessorarchitektur und Assembler-Programmierung sehr hilfreich sind.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Abhilfe&#039;&#039;&#039;: Wenn man sich nicht wirklich ganz sicher ist, sollten um kritische Aktivitäten herum jedesmal die Interrupts abgeschaltet werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel ([[AVR-GCC]]):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  cli(); // Interrupts abschalten&lt;br /&gt;
  port |= 0x03;&lt;br /&gt;
  sei(); // Interrupts wieder einschalten&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man ein globales Einschalten der Interrupts mit sei() vermeiden will, kann man die folgende Methode benutzen. Hierbei werden die Interrupts nur eingeschaltet, wenn sie vorher bereits eingeschaltet waren (Hinweis aus der FAQ von avr-libc):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  // ...&lt;br /&gt;
  {&lt;br /&gt;
    uint8_t sreg_local; // Lokale Sicherungskopie von SREG&lt;br /&gt;
    sreg_local = SREG;&lt;br /&gt;
    cli();&lt;br /&gt;
    // hierhin kommt der Code mit atomarem Zugriff&lt;br /&gt;
    SREG = sreg_local;&lt;br /&gt;
  } &lt;br /&gt;
  // ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je nach Prozessor kann man das Problem manchmal auch ohne Abschalten von Interrupts durch geeignete Programmierung lösen. So führt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  port = (port &amp;amp; ~0x0F) | lcd_data;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
immer zum beschriebenen Problem,&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  port &amp;amp;= ~0x0F;&lt;br /&gt;
  port |= lcd_data;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
jedoch nicht, wenn die beiden Zeilen zu jeweils einem Assembler-Befehl übersetzt werden. Was dann aber abhängig von den Optimierungs-Einstellungen des Compilers werden kann. Eine Interrupt-feste Variante für AVR-Prozessoren der neuesten Generation, wie beispielsweise Tiny2313 und Mega88 (alle ab 2004):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  PINx = (PORTx &amp;amp; 0x0F) ^ lcd_data;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
   Gibt es einen besonderen Grund, das, was 20 Zeilen obendrüber über&lt;br /&gt;
   atomare Zugriffe steht, hier nochmals durchzukauem?&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Problematisch sind auch Datenzugriffe auf Datentypen, welche mehr als einen Assemblerbefehl benötigt. Beim 8-Bit Prozessoren wie AVR sind dies alle Datentypen mit mehr als 8Bit, aber u.U. auch Bitfeld-Zugriffe:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/* var wird in einer ISR inkrementiert */&lt;br /&gt;
volatile int var;&lt;br /&gt;
&lt;br /&gt;
int get_var (void)&lt;br /&gt;
{&lt;br /&gt;
    /* Folgende Zuweisung besteht aus mehr als einem Maschinenbefehl */&lt;br /&gt;
    return var;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das Lesen von var ist in C nur ein Befehl, in Assembler werden aber mindestens 2 Befehle benötigt, da pro Maschinen-Befehl nur 8&amp;amp;nbsp;Bit bewegt werden können.&lt;br /&gt;
Die Zuweisung kann also unterbrochen werden. Das kann dazu führen, daß ein Teil alter Bits und ein Teil neuer Bits zugewiesen wird:&lt;br /&gt;
&lt;br /&gt;
# var sei 0x00FF&lt;br /&gt;
# Das Lowbyte von var wird für die return-Anweisung gelesen: 0xFF&lt;br /&gt;
# Ein Interrupt inkrementiert var um 1 auf 0x0100&lt;br /&gt;
# Das Highbyte von var wird in für die return-Anweisung gelesen: 0x01&lt;br /&gt;
# Die Funktion gibt 0x01FF zurück&lt;br /&gt;
&lt;br /&gt;
Solche &amp;quot;Glitches&amp;quot; sind sehr schwierig zu finden, da sie nur sehr selten auftreten, denn der Interrupt muß genau zwischen den beiden Befehlen kommen.&lt;br /&gt;
&lt;br /&gt;
=== Reentrante Funktionen ===&lt;br /&gt;
&lt;br /&gt;
Eine Funktion ist reentrant (wiedereintrittsfest), wenn sie mehrmals gleichzeitig aktiv sein kann, ohne dass sich diese Aufrufe gegenseitig beeinflussen. Betrifft beispielsweise Funktionen, die sowohl im Hauptprogramm als auch in Interrupts aufgerufen werden. Manche C Compiler erfordern eine besondere Kennzeichnung solcher Funktionen. Wenn möglich sollte man es jedoch vermeiden, eine Funktion aus dem Hauptprogramm &#039;&#039;&#039;und&#039;&#039;&#039; aus einem Interrupt aus aufzurufen. Das ist meist problemlos machbar.&lt;br /&gt;
&lt;br /&gt;
=== Volatile Variablen ===&lt;br /&gt;
Variablen, auf die sowohl innerhalb wie auch außerhalb einer Interruptserviceroutine zugegriffen wird (schreibend oder lesend), müssen (ähnlich wie Hardwareregister) mit dem Schlüsselwort &#039;&#039;&#039;volatile&#039;&#039;&#039; (flüchtig) versehen werden, damit der C-Compiler berücksichtigen kann, dass diese Variablen jederzeit (durch das Auftreten des Interrupts) gelesen oder geschrieben werden können.&lt;br /&gt;
Ansonsten würde der C-Compiler das regelmäßige Abfragen oder Beschreiben dieser Variablen ggf. wegoptimieren, da er nicht damit rechnet, dass auf die Variable auch &amp;quot;ohne sein Zutun&amp;quot; zugegriffen wird.&lt;br /&gt;
&lt;br /&gt;
Eine ausführlichere Erklärung zu &amp;quot;volatile&amp;quot; ist hier zu finden: &lt;br /&gt;
[http://www.mikrocontroller.net/articles/FAQ#Was_hat_es_mit_volatile_auf_sich FAQ: Was hat es mit volatile auf sich]&lt;br /&gt;
&lt;br /&gt;
== Interrupts und Low Power Modes (Sleep) ==&lt;br /&gt;
&lt;br /&gt;
Wenn der Microcontroller in einen Low Power Mode versetzt wird, wird er durch einen Interrupt wieder aufgeweckt, z.B. in einem festen Zeitraster per Timer-Interrupt oder vom ADC nach Beendigung einer AD-Wandlung.&lt;br /&gt;
Dabei muß sichergestellt werden, daß der Interrupt erst nach dem In-Low-Power-Gehen (z.B. per Befehl &#039;&#039;sleep()&#039;&#039;) kommen kann, da sonst der µC nicht bzw. nicht rechtzeitig geweckt wird. Dazu muß eine Möglichkeit bestehen, daß der Interrupt gesperrt wird und erst mit dem Sleep-Befehl freigegeben wird. Dies scheint auf den ersten Blick unmöglich: Man kann nicht gleichzeitig zwei Befehle (&#039;&#039;sei()&#039;&#039; und &#039;&#039;sleep()&#039;&#039;) ausführen.&lt;br /&gt;
Es gibt spezielle Mechanismen für diesen Fall. Beim C51 und beim AVR ist es z.B. so, daß &#039;&#039;sei()&#039;&#039; erst einen Befehl später &amp;quot;wirksam&amp;quot; wird. Dadurch wird die Kombination &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
sei(); &lt;br /&gt;
sleep();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ununterbrechbar (natürlich sofern zuvor die Interrupts gesperrt wurden).&lt;br /&gt;
Andere Microcontroller bieten andere Mechanismen, z.B. sperrt der Assembler-Befehl&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
DISI&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
beim PIC24 die Interrupts für eine bestimmten Anzahl von CPU-Taktzyklen. Die CPU kann dann eine vorgegebene Anzahl an folgenden Befehlen unter Interruptsperre ausführen und der Interrupt wird automatisch wieder freigegeben.&lt;br /&gt;
&lt;br /&gt;
== (AVR-) Beispiele für die praktische Programmierung ==&lt;br /&gt;
&lt;br /&gt;
Die Beispiele sind mit WINAVR 20060421 compiliert und getestet worden. Als Mikrocontroller wird ein AVR vom Typ ATmega32 verwendet. Alle Programme wurden mit Optimierungsstufe -Os compiliert.&lt;br /&gt;
&lt;br /&gt;
=== Steuersignale zwischen ISR und Hauptprogramm ===&lt;br /&gt;
&lt;br /&gt;
In vielen Anwendungen wird ein [[Timer]] verwendet, um in regelmäßigen Abständen bestimmte Aktionen auszuführen, wie z.&amp;amp;nbsp;B. Tasten abfragen, ADC-auslesen, ein LCD auffrischen etc. Wenn viele Dinge zu erledigen sind, nebenbei aber noch andere Interrupts verwendet werden, dann ist es notwendig die Funktionsaufrufe aus dem Timerinterrupt in die Hauptschleife zu verlagern. Der Interrupt signalisiert über eine Steuervariable (engl. Flag, Flagge), dass ein neuer Timerzyklus begonnen hat. Dadurch wird der Timerinterrupt sehr kurz und die langwierigen, aber meist nicht zeitkritischen Funktionen werden als normales Programm ausgeführt. Damit kann die CPU auf andere Interrupts schnell reagieren.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist auf jeden Fall, dass die Steuervariable, welche in der ISR und in der Hauptschleife verwendet wird, mit [http://www.netrino.com/Embedded-Systems/How-To/C-Volatile-Keyword &#039;&#039;&#039;volatile&#039;&#039;&#039;] deklariert wird. Ausserdem müssen sowohl der Lese- als auch Schreibzugriff auf die Steuersignale [[#Atomarer Datenzugriff | &#039;&#039;&#039;atomar&#039;&#039;&#039;]] sein. Auf dem AVR ist das mit 8-Bit-Variablen direkt möglich, für grössere Variablen müssen die Interrupts kurzzeitig gesperrt werden.&lt;br /&gt;
&lt;br /&gt;
Das Beispiel ist sehr einfach gehalten um das Prinzip zu veranschaulichen. Ein Timer mit einer Überlaufperiodendauer von ca. 65ms stößt periodisch eine Funktion zum Togglen einer LED an, welche dadurch mit ca. 7 Hz blinkt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
*******************************************************************************&lt;br /&gt;
*&lt;br /&gt;
* Timer Interrupt Demo&lt;br /&gt;
*&lt;br /&gt;
* ATmega32 mit internem 1-MHz-Oszillator&lt;br /&gt;
*&lt;br /&gt;
* LOW Fuse Byte = 0xE1&lt;br /&gt;
*&lt;br /&gt;
* An PD5 muss eine LED mit 1-kOhm-Vorwiderstand angeschlossen werden&lt;br /&gt;
*&lt;br /&gt;
*******************************************************************************&lt;br /&gt;
*/&lt;br /&gt;
 &lt;br /&gt;
#define F_CPU 1000000&lt;br /&gt;
 &lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
// globale Variablen&lt;br /&gt;
 &lt;br /&gt;
volatile uint8_t flag;&lt;br /&gt;
 &lt;br /&gt;
int main() {&lt;br /&gt;
 &lt;br /&gt;
// IO konfigurieren&lt;br /&gt;
 &lt;br /&gt;
    DDRA = 0xFF;&lt;br /&gt;
    DDRB = 0xFF;&lt;br /&gt;
    DDRC = 0xFF;&lt;br /&gt;
    DDRD = 0xFF;&lt;br /&gt;
 &lt;br /&gt;
// Timer2 konfigurieren&lt;br /&gt;
 &lt;br /&gt;
    TCCR2  = (1&amp;lt;&amp;lt;CS22) | (1&amp;lt;&amp;lt;CS21); // Vorteiler 256 -&amp;gt; ~65ms Überlaufperiode&lt;br /&gt;
    TIMSK |= (1&amp;lt;&amp;lt;TOIE2);            // Timer Overflow Interrupt freischalten &lt;br /&gt;
 &lt;br /&gt;
// Interrupts freigeben&lt;br /&gt;
 &lt;br /&gt;
    sei();&lt;br /&gt;
 &lt;br /&gt;
// Endlose Hauptschleife&lt;br /&gt;
 &lt;br /&gt;
    while(1) {&lt;br /&gt;
        if (flag == 1) { // Neuer Timerzyklus ?&lt;br /&gt;
            flag = 0;&lt;br /&gt;
 &lt;br /&gt;
            // hier steht jetzt in Normalfall ein grosser Programmblock ;-) &lt;br /&gt;
            PORTD ^= (1 &amp;lt;&amp;lt; PD5);    // LED toggeln&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// Timer2 overflow Interrupt&lt;br /&gt;
// hier wird der Hauptschleife ein neuer Timerinterrupt signalisiert&lt;br /&gt;
 &lt;br /&gt;
ISR( TIMER2_OVF_vect ) {&lt;br /&gt;
    flag = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== UART mit Interrupts ===&lt;br /&gt;
&lt;br /&gt;
Der UART ist ein oft benutztes Modul eines Mikrocontrollers. Anfänger nutzen ihn meist im sogenannten Polling Betrieb (engl. to poll, abfragen). D.h. wenn ein Zeichen empfangen werden soll, fragt eine Funktion den UART in einer Schleife ununterbrochen ab, ob Daten empfangen wurden. In dieser Zeit macht die CPU nichts anderes! Und wenn lange kein Zeichen eintrifft tut sie sehr lange nichts, sie ist praktisch blockiert! Senden verläuft ähnlich, nur dass hier die CPU vor dem Senden prüft, ob der UART ein neues Byte aufnehmen kann. D.h. während der UART selbsttätig das Zeichen sendet ist die CPU zum Warten verdammt. All diese Nachteile haben nur einen Vorteil. Die Funktionen und Mechanismen zur UART-Nutzung sind sehr einfach, klein und leicht anwendbar.&lt;br /&gt;
&lt;br /&gt;
Will man aber die CPU nicht sinnlos warten lassen, was vor allem bei niedrigeren Baudraten ziemlich lange sein kann, muss man die Interrupts nutzen. Der AVR hat gleich drei davon.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RXC&#039;&#039;&#039; (Receive Complete): Ein Zeichen wurde empfangen.&lt;br /&gt;
* &#039;&#039;&#039;UDRE&#039;&#039;&#039; (UART Data Register Empty): Der Zwischenpuffer des Senders ist leer und kann ein neues Zeichen aufnehmen. Dieser Zwischenpuffer ist wichtig, um lückenlos auch bei hohen Baudraten senden zu können.&lt;br /&gt;
* &#039;&#039;&#039;TXC&#039;&#039;&#039; (Transmit Complete): Das aktuelle Zeichen wurde vollständig inclusive Stopbit gesendet und es liegt kein neues Datenbyte im Sendepuffer. Dieser Interrupt ist extrem nützlich für eine Halbduplexkommunikation, z.&amp;amp;nbsp;B. auf einem RS485-[[Bus]]. Hier kann man nach dem vollständigen Senden aller Bytes den Bustranceiver (z.&amp;amp;nbsp;B. MAX485) von Senden auf Empfangen umschalten, um den Bus freizugeben.&lt;br /&gt;
&lt;br /&gt;
Bei Nutzung der Interrupts kann die CPU andere Dinge bearbeiten und muss nur kurz einen Interrupt ausführen, wenn ein Zeichen empfangen oder gesendet wurde.&lt;br /&gt;
&lt;br /&gt;
Die Kommunikation zwischen ISRs und Hauptschleife erfolgt wieder durch Flags und zwei Pufferarrays (uart_rx_buffer und uart_tx_buffer). Es gibt zwei Funktionen, eine zum Senden von Strings, eine zum Empfangen. Das Senden sowie Empfangen kann parallel erfolgen und läuft vollkommen unabhängig vom Hauptprogramm. Die Daten werden in spezielle Puffer kopiert, sodass das Hauptprogramm mit seinen Strings sofort weiterarbeiten kann. Im Beispiel ist die CPU nicht wirklich mit sinnvollen Dingen beschäftigt, zur Demonstration des Prinzips aber ausreichend.&lt;br /&gt;
&lt;br /&gt;
Um das Programm real zu nutzen braucht man ein Terminalprogramm, z.&amp;amp;nbsp;B. Hyperterminal von Windows. Dort muss nur die richtige Baudrate eingestellt werden (9600 8N1, 9600 Baud, 8 Bits, keine Parität, 1 Stopbit, keine Flusskontrolle). Ausserdem muss man im Menu Datei -&amp;gt; Eigenschaften -&amp;gt; Einstellungen -&amp;gt; ASCII Konfiguration den Punkt &amp;quot;Eingegebene Zeichen lokal ausgeben (lokales Echo)&amp;quot; aktivieren. Nun kann man beliebige Texte eintippen. Mit RETURN wird die Eingabe abgeschlossen und der AVR vermittelt den empfangenen String an das Hauptprogramm. Diese sendet ihn einfach zurück, parallel dazu wird der String gemorst per LED angezeigt. Sollte es Probleme bei der Inbetriebnahme des UART geben, so findet man hier wichtige Hinweise zur [[AVR_Checkliste#UART.2FUSART | Fehlersuche]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
*******************************************************************************&lt;br /&gt;
*&lt;br /&gt;
* UART Interrupt Demo&lt;br /&gt;
*&lt;br /&gt;
* ATmega32 mit 3,6864 MHz Quarz an XTAL1/XTAL2&lt;br /&gt;
*&lt;br /&gt;
* LOW Fuse Byte = 0xFF&lt;br /&gt;
*&lt;br /&gt;
* An PD5 muss eine LED mit 1-kOhm-Vorwiderstand angeschlossen werden&lt;br /&gt;
* An PD0/PD1 ist ein MAX232 angeschlosssen, um Daten vom PC zu empfangen/senden&lt;br /&gt;
*&lt;br /&gt;
*******************************************************************************&lt;br /&gt;
*/&lt;br /&gt;
 &lt;br /&gt;
// Systemtakt in Hz, das L am Ende ist wichtig, NICHT UL verwenden!&lt;br /&gt;
#define F_CPU 3686400L               &lt;br /&gt;
// &amp;quot;Morsedauer&amp;quot; für ein Bit in Millisekunden&lt;br /&gt;
#define BITZEIT 100     &lt;br /&gt;
 &lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
// Baudrate, das L am Ende ist wichtig, NICHT UL verwenden!&lt;br /&gt;
#define BAUD 9600L          &lt;br /&gt;
 &lt;br /&gt;
// Berechnungen&lt;br /&gt;
// clever runden&lt;br /&gt;
#define UBRR_VAL  ((F_CPU+BAUD*8)/(BAUD*16)-1)  &lt;br /&gt;
// Reale Baudrate&lt;br /&gt;
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     &lt;br /&gt;
// Fehler in Promille &lt;br /&gt;
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000) &lt;br /&gt;
 &lt;br /&gt;
#if ((BAUD_ERROR&amp;gt;10) || (BAUD_ERROR&amp;lt;-10))&lt;br /&gt;
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! &lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
// globale Variablen für den UART&lt;br /&gt;
 &lt;br /&gt;
// Puffergrösse in Bytes, RX und TX sind gleich gross&lt;br /&gt;
#define uart_buffer_size 32             &lt;br /&gt;
 &lt;br /&gt;
volatile uint8_t uart_rx_flag=0;            // Flag, String komplett empfangen&lt;br /&gt;
volatile uint8_t uart_tx_flag=1;            // Flag, String komplett gesendet&lt;br /&gt;
char uart_rx_buffer[uart_buffer_size];      // Empfangspuffer&lt;br /&gt;
char uart_tx_buffer[uart_buffer_size];      // Sendepuffer&lt;br /&gt;
 &lt;br /&gt;
// lange, variable Wartezeit, Einheit in Millisekunden&lt;br /&gt;
void long_delay(uint16_t ms) {&lt;br /&gt;
    for (; ms&amp;gt;0; ms--) _delay_ms(1);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// einen String senden&lt;br /&gt;
// vor Aufruf der Funktion muss man prüfen, ob uart_t_flag==1 ist&lt;br /&gt;
// nur dann kann ein neuer String gesendet werden&lt;br /&gt;
 &lt;br /&gt;
void put_string(char *daten) {&lt;br /&gt;
 &lt;br /&gt;
   if (uart_tx_flag==1) {&lt;br /&gt;
      // String daten ind en Sendepuffer kopieren&lt;br /&gt;
      strcpy(uart_tx_buffer, daten);      &lt;br /&gt;
      // Flag für &#039;Senden ist komplett&#039; löschen, &lt;br /&gt;
      uart_tx_flag = 0;                    &lt;br /&gt;
      // UDRE Interrupt einschalten, los gehts&lt;br /&gt;
      UCSRB |= (1&amp;lt;&amp;lt;UDRIE); &lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// einen empfangenen String kopieren&lt;br /&gt;
// vor Aufruf der Funktion muss man prüfen, ob uart_rx_flag==1 ist&lt;br /&gt;
// anderenfalls ist der RX Buffer noch ungültig&lt;br /&gt;
 &lt;br /&gt;
void get_string(char *daten) {&lt;br /&gt;
 &lt;br /&gt;
   if (uart_rx_flag==1) {&lt;br /&gt;
      // String kopieren&lt;br /&gt;
      strcpy(daten, uart_rx_buffer);      &lt;br /&gt;
      // Flag löschen&lt;br /&gt;
      uart_rx_flag = 0;                    &lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// Ein Byte im RS232 Format auf eine LED ausgeben&lt;br /&gt;
 &lt;br /&gt;
void morse(uint8_t data) {&lt;br /&gt;
    uint8_t i;&lt;br /&gt;
 &lt;br /&gt;
    // Startbit, immer 0&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PD5);           // LED aus&lt;br /&gt;
    long_delay(BITZEIT);&lt;br /&gt;
 &lt;br /&gt;
    for(i=0; i&amp;lt;8; i++) {&lt;br /&gt;
        if (data &amp;amp; 0x01)            // Prüfe Bit #0&lt;br /&gt;
            PORTD |= (1 &amp;lt;&amp;lt; PD5);    // LED an&lt;br /&gt;
        else&lt;br /&gt;
            PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PD5);   // LED aus      &lt;br /&gt;
        long_delay(BITZEIT);        &lt;br /&gt;
        data &amp;gt;&amp;gt;= 1;                 // nächstes Bit auf Bit #0 schieben&lt;br /&gt;
    }&lt;br /&gt;
    // Stopbit, immer 1&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PD5);            // LED an&lt;br /&gt;
    long_delay(BITZEIT);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// Hauptprogramm&lt;br /&gt;
 &lt;br /&gt;
int main (void) {&lt;br /&gt;
 &lt;br /&gt;
    char stringbuffer[64];  // Allgemeiner Puffer für Strings&lt;br /&gt;
    uint8_t buffer_full=0;  // noch ein Flag, aber nur in der Hauptschleife&lt;br /&gt;
    char * charpointer;     // Hilfszeiger&lt;br /&gt;
    &lt;br /&gt;
// IO konfigurieren&lt;br /&gt;
 &lt;br /&gt;
    DDRA = 0xFF;&lt;br /&gt;
    DDRB = 0xFF;&lt;br /&gt;
    DDRC = 0xFF;&lt;br /&gt;
    DDRD = 0xFF;&lt;br /&gt;
 &lt;br /&gt;
// UART konfigurieren&lt;br /&gt;
 &lt;br /&gt;
    UBRRH = UBRR_VAL &amp;gt;&amp;gt; 8;&lt;br /&gt;
    UBRRL = UBRR_VAL &amp;amp; 0xFF;&lt;br /&gt;
    UCSRB = (1&amp;lt;&amp;lt;RXCIE) | (1&amp;lt;&amp;lt;RXEN) | (1&amp;lt;&amp;lt;TXEN); &lt;br /&gt;
 &lt;br /&gt;
// Stringbuffer initialisieren&lt;br /&gt;
 &lt;br /&gt;
    stringbuffer[0] = &#039;\n&#039;;&lt;br /&gt;
    stringbuffer[1] = &#039;\r&#039;;&lt;br /&gt;
 &lt;br /&gt;
// Interrupts freigeben&lt;br /&gt;
 &lt;br /&gt;
    sei();&lt;br /&gt;
    &lt;br /&gt;
// Endlose Hauptschleife&lt;br /&gt;
 &lt;br /&gt;
    while(1) {&lt;br /&gt;
 &lt;br /&gt;
        // &amp;quot;Sinnvolle&amp;quot; CPU Tätigkeit &lt;br /&gt;
        PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;PD5);&lt;br /&gt;
        long_delay(300);&lt;br /&gt;
        PORTD |= (1&amp;lt;&amp;lt;PD5);&lt;br /&gt;
        long_delay(300);&lt;br /&gt;
    &lt;br /&gt;
        // Wurde ein kompletter String empfangen &lt;br /&gt;
        // und der Buffer ist leer?&lt;br /&gt;
        if (uart_rx_flag==1 &amp;amp;&amp;amp; buffer_full==0) {    &lt;br /&gt;
            // ja, dann String lesen, &lt;br /&gt;
            // die ersten zwei Zeichen &lt;br /&gt;
            // aber nicht überschreiben&lt;br /&gt;
            get_string(stringbuffer+2);             &lt;br /&gt;
            buffer_full=1;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        // Ist letzte Stringsendung abgeschlossen &lt;br /&gt;
        // und ein neuer String verfügbar?&lt;br /&gt;
        if (uart_tx_flag==1 &amp;amp;&amp;amp; buffer_full==1) {    &lt;br /&gt;
            // Newline + Carrige return anfügen&lt;br /&gt;
            strcat(stringbuffer, &amp;quot;\n\r&amp;quot;);           &lt;br /&gt;
            put_string(stringbuffer); // zurücksenden&lt;br /&gt;
            buffer_full=0; // Buffer ist wieder verfügbar&lt;br /&gt;
            // Alle Zeichen per LED morsen&lt;br /&gt;
            charpointer = stringbuffer;&lt;br /&gt;
            while(*charpointer) morse(*charpointer++);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// UART RX complete interrupt&lt;br /&gt;
 &lt;br /&gt;
// hier werden Daten vom PC empfangen und in einem String zwischengespeichert&lt;br /&gt;
// Wird ein Stringterminator empfangen, wird ein Flag gesetzt, welches dem &lt;br /&gt;
// Hauptprogramm den kompletten Empfang signalisiert&lt;br /&gt;
 &lt;br /&gt;
ISR(USART_RXC_vect) {&lt;br /&gt;
    &lt;br /&gt;
    static uint8_t uart_rx_cnt;     // Zähler für empfangene Zeichen&lt;br /&gt;
    char data;&lt;br /&gt;
 &lt;br /&gt;
    // Daten auslesen, dadurch wird das Interruptflag gelöscht              &lt;br /&gt;
    data = UDR;&lt;br /&gt;
    &lt;br /&gt;
    // Ist Puffer frei für neue Daten? &lt;br /&gt;
    if (!uart_rx_flag) {&lt;br /&gt;
        // ja, ist Ende des Strings (RETURN) erreicht?&lt;br /&gt;
        if (data==&#039;\r&#039;) {&lt;br /&gt;
            // ja, dann String terminieren&lt;br /&gt;
            uart_rx_buffer[uart_rx_cnt]=0;              &lt;br /&gt;
            // Flag für &#039;Empfangspuffer voll&#039; setzen&lt;br /&gt;
            uart_rx_flag=1;&lt;br /&gt;
            // Zähler zurücksetzen&lt;br /&gt;
            uart_rx_cnt=0;&lt;br /&gt;
        }&lt;br /&gt;
        else if (uart_rx_cnt&amp;lt;(uart_buffer_size-1)) {     &lt;br /&gt;
            // Daten in Puffer speichern&lt;br /&gt;
            // aber durch if() Pufferüberlauf vermeiden&lt;br /&gt;
            uart_rx_buffer[uart_rx_cnt]=data;          &lt;br /&gt;
            uart_rx_cnt++; // Zähler erhöhen&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// UART TX data register empty interrupt&lt;br /&gt;
// hier werden neue Daten in das UART-Senderegister geladen&lt;br /&gt;
 &lt;br /&gt;
ISR(USART_UDRE_vect) {&lt;br /&gt;
    // Zeiger auf Sendepuffer&lt;br /&gt;
    static char* uart_tx_p = uart_tx_buffer;    &lt;br /&gt;
    char data;&lt;br /&gt;
 &lt;br /&gt;
    // zu sendendes Zeichen lesen, &lt;br /&gt;
    // Zeiger auf Sendepuffer erhöhen&lt;br /&gt;
    data = *uart_tx_p++;&lt;br /&gt;
    &lt;br /&gt;
    // Ende des nullterminierten Strings erreicht?&lt;br /&gt;
    if (data==0 ) {        &lt;br /&gt;
        UCSRB &amp;amp;= ~(1&amp;lt;&amp;lt;UDRIE);       // ja, dann UDRE Interrupt ausschalten        &lt;br /&gt;
        uart_tx_p = uart_tx_buffer; // Pointer zurücksetzen&lt;br /&gt;
        uart_tx_flag = 1;           // Flag setzen, Übertragung beeendet&lt;br /&gt;
    }&lt;br /&gt;
    else UDR = data;                // nein, Daten senden&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Atomarer Zugriff auf eine 16-Bit Variable ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Atmega8 @ 4 MHz&lt;br /&gt;
// Siehe http://www.mikrocontroller.net/topic/206455&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/atomic.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Anm. Für das Programm würde wohl eine 8-Bit Variable genügen.&lt;br /&gt;
// Mit 16-Bit kann der Sinn eines atomaren Zugriffs besser&lt;br /&gt;
// demonstriert werden &lt;br /&gt;
volatile int sekunde;&lt;br /&gt;
&lt;br /&gt;
void setup (void)&lt;br /&gt;
{&lt;br /&gt;
  TCCR0 |= ( 1&amp;lt;&amp;lt;CS02 )|( 1&amp;lt;&amp;lt;CS00 );  // counter0,Prescaler auf 1024&lt;br /&gt;
  TIMSK |= ( 1&amp;lt;&amp;lt;TOIE0 ); // enable counter0 overflow interrupt&lt;br /&gt;
  TCNT0 = 0x00;          // Counter0 auf Null setzen&lt;br /&gt;
  sei();                 // Interrupts global aktivieren&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER0_OVF_vect)&lt;br /&gt;
{&lt;br /&gt;
  sekunde++;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB = (1&amp;lt;&amp;lt;PB0); // Pin PB0 Ausgang&lt;br /&gt;
  setup();&lt;br /&gt;
  while (1) {&lt;br /&gt;
    int sekunde_kopie;&lt;br /&gt;
    ATOMIC_BLOCK(ATOMIC_FORCEON)&lt;br /&gt;
    {&lt;br /&gt;
      sekunde_kopie = sekunde; // 16-Bit Zuweisung ist nicht atomar&lt;br /&gt;
                               // deshalb ATOMIC_BLOCK&lt;br /&gt;
    }&lt;br /&gt;
    if ( sekunde_kopie &amp;gt;= 25 ) {&lt;br /&gt;
      ATOMIC_BLOCK(ATOMIC_FORCEON)&lt;br /&gt;
      {&lt;br /&gt;
        sekunde = 0;  // 16-Bit Zuweisung ist nicht atomar&lt;br /&gt;
                      // deshalb ATOMIC_BLOCK&lt;br /&gt;
      }&lt;br /&gt;
      PORTB ^= (1&amp;lt;&amp;lt;PB0); // Toggle PB0&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[ADC]]&lt;br /&gt;
* [[Timer]]&lt;br /&gt;
* [[FAQ#Timer]]&lt;br /&gt;
* AVR:&lt;br /&gt;
** [[AVR-Tutorial: Interrupts | AVR-Tutorial - Interrupts in Assembler]]&lt;br /&gt;
** [[AVR-GCC-Tutorial#Programmieren_mit_Interrupts | AVR-GCC-Tutorial - Interrupts in C]]&lt;br /&gt;
** [http://www.nongnu.org/avr-libc/user-manual/group__util__atomic.html Atomare Operationen in der avr-libc]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.embedded.com/electronics-blogs/beginner-s-corner/4023801/Introduction-to-the-Volatile-Keyword Introduction to the &#039;&#039;&#039;Volatile&#039;&#039;&#039; Keyword] von Nigel Jones auf [http://www.embedded.com/ Embedded Systems Design]&lt;br /&gt;
* [http://blog.regehr.org/archives/28 Nine ways to break your systems code using volatile]&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]]&lt;br /&gt;
[[Category:Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=ESP8266&amp;diff=88812</id>
		<title>ESP8266</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=ESP8266&amp;diff=88812"/>
		<updated>2015-06-02T18:40:55Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Änderung 88808 von 5.146.126.13 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Datei:ESP8266.jpg|thumb|300px|ESP8266, Funkmodul]]&lt;br /&gt;
Das [[ESP8266]] von dem Hersteller Espressif ist ein programmierbarer WLAN-SoC mit [[UART]]- und [[SPI]]-Schnittstelle. &#039;&#039;&#039;WLAN&#039;&#039;&#039;-Funkmodule mit ESP8266 sind ab 3€ verfügbar. Die UART-Schnitttstelle ermöglicht eine einfache Integration in Mikrocontrollerprojekte.&lt;br /&gt;
&lt;br /&gt;
== Spezifikation ==&lt;br /&gt;
Laut Hersteller &amp;lt;ref&amp;gt;[http://espressif.com/en/products/esp8266 &#039;&#039;Herstellerseite -  unter Details&#039;&#039;] Abgerufen am 26. August 2014.&amp;lt;/ref&amp;gt;. :&lt;br /&gt;
* 802.11 b/g/n&lt;br /&gt;
* Wi-Fi Direct (P2P), soft-AP&lt;br /&gt;
* Integrated TCP/IP protocol stack&lt;br /&gt;
* Integrated TR switch, balun, LNA, power amplifier and matching network&lt;br /&gt;
* Integrated PLLs, regulators, DCXO and power management units&lt;br /&gt;
* +19.5dBm output power in 802.11b mode&lt;br /&gt;
* Power down leakage current of &amp;lt;10uA&lt;br /&gt;
* Integrated low power 32-bit CPU could be used as application processor&lt;br /&gt;
* SDIO 1.1/2.0, SPI, UART&lt;br /&gt;
* STBC, 1×1 MIMO, 2×1 MIMO&lt;br /&gt;
* A-MPDU &amp;amp; A-MSDU aggregation &amp;amp; 0.4ms guard interval&lt;br /&gt;
* Wake up and transmit packets in &amp;lt; 2ms&lt;br /&gt;
* Standby power consumption of &amp;lt; 1.0mW (DTIM3)&lt;br /&gt;
* VCC: 3,3V (Achtung: Eingänge sind &#039;&#039;&#039;NICHT 5V TOLERANT&#039;&#039;&#039;!)&lt;br /&gt;
Weiterhin:&lt;br /&gt;
* GPIOs, ADC&lt;br /&gt;
&lt;br /&gt;
=== Datendurchsatz/Performanz ===&lt;br /&gt;
[https://www.mikrocontroller.net/topic/342240?page=single#3857630 Beitrag im Forum mit Tests: TCP: bis zu 7 MBit/s]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://bbs.espressif.com/viewtopic.php?f=7&amp;amp;t=24 Beitrag Espressif-Form: UART loopback: 4.5 Mbps]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Bei den chinesischen Modulen mit Firmware 0.9.1 werden Ping Befehle unabhängig von der Paketgröße typischerweise in 30-150ms beantwortet. Datenpakete, die man vom PC aus an das Modul sendet werden unabhängig von der Paketgröße typischerweise nach 100-200ms quittiert.&lt;br /&gt;
&lt;br /&gt;
== WLAN-Module mit ESP8266 ==&lt;br /&gt;
Es existieren ca. 11 Varianten von chinesischen Herstellern. Beispielsweise mit PCB- oder Keramik-Antenne oder mit u.fl.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Die Firmware 0.9.1 unterstützt bis zu vier gleichzeitige TCP oder UDP Verbindungen. Sie kann sich in vorhandene WLAN Netze einbuchen, aber auch selbst Access-Point mit DHCP Server sein. Der Access-Point ist zu Android kompatibel (mit 4.1.2 getestet).&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Firmware enthält jedoch keinen Router. Mehrere Computer, die mit dem Modul als Access-Point verbunden sind, können keine Verbindung zueinander aufbauen.&lt;br /&gt;
Das Feature nennt sich AP Isolation.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
#Produktbeschreibung: [[http://playground.boxtec.ch/doku.php/wireless/esp8266]]&lt;br /&gt;
&lt;br /&gt;
=== Pinbelegung einiger ESP8266-Module ===&lt;br /&gt;
====ESP8266-01====&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:ESP8266-PinBelegung1.jpg|Pinbelegung - Groß mit PCB-Antenne&lt;br /&gt;
Datei:ESP8266-PinBelegung2.jpg|Pinbelegung - Klein mit Keramik-Antenne&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
Quelle &amp;lt;ref&amp;gt;[http://pan.baidu.com/share/link?shareid=727869034&amp;amp;uk=1900861665 &#039;&#039;Seller Information&#039;&#039;] Abgerufen am 26. August 2014.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
====ESP8266-07====&lt;br /&gt;
Achtung, beim ESP8266-07 Modul sind einige mit vertauschten Beschriftungen von GPIO4 und GPIO5 unterwegs!!.&lt;br /&gt;
&lt;br /&gt;
== AT-Befehle für eine Firmware auf Basis des SDK-Beispiels &amp;quot;AT&amp;quot;==&lt;br /&gt;
&lt;br /&gt;
Einstellen des Moduls als AP&lt;br /&gt;
&lt;br /&gt;
Da wir nicht wissen, in welchem Modus sich das Modul gerade befindet, fragen wir diesen ab mit dem &lt;br /&gt;
Befehl AT+CWMODE?  Das Modul antwortet mit &lt;br /&gt;
&lt;br /&gt;
    AT+CWMODE?&amp;lt;\r&amp;gt;&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;+CWMODE:1&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    OK&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
In diesem Fall ist das Modul aktuell im Modus 1 ( Station) eingestellt. Also ändern wir den Modus auf 2 ( AP)&lt;br /&gt;
mit dem Befehl AT+CWMODE=2. Nach diesem Befehl ist ein Reset des Moduls erforderlich, damit die Änderung &lt;br /&gt;
sichtbar wird. Mit dem Befehl AT+RST führen wir diesen durch. Das Modul startet neu und die Stromaufnahme&lt;br /&gt;
steigt auf ca 80 mA. Das Modul ist jetzt als WLAN AP im Wireless Lan sichtbar. &lt;br /&gt;
&lt;br /&gt;
Jetzt müssen wir noch einstellen, dass wir mehrere Verbindungen gleichzeitig haben wollen und den TCP Server starten und einstellen. Mit dem Befehl AT+CIPMUX=1 sagen wir dem Modul, dass wir mehrere Verbindungen haben wollen. Und mit dem Befehl AT+CIPSERVER=1,2526 starten wir den TCP Server und lassen ihn auf Port 2526 laufen. Sobald sich ein Client verbindet, sendet das Modul &#039;Link&#039; + LF + CR. Beim Trennen einer Verbindung vom Client kommt &#039;Unlink&#039; + LF + CR.&lt;br /&gt;
&lt;br /&gt;
Ab hier können wir uns über einen TCP Socket auf Port 2526 mit dem Modul verbinden und Daten austauschen. Empfangene Daten werden folgendermaßen angezeigt. Gesendet wurde  &amp;quot;Hallo Leute&amp;quot; + LF + CR.&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
     +IPD,0,11:Hallo Leute&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
     OK&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
&lt;br /&gt;
+IPD kommt immer, 0 ist die erste Verbindung. Wenn 2 Geräte gleichzeitig eine Verbindung aufgebaut haben, steht dort eine 1. 11 Zeichen wurden empfangen, dann kommen die Daten.&lt;br /&gt;
&lt;br /&gt;
Zum Senden von Daten vom Modul zum Client geht man folgenderweise vor. Erstmal sagen wir dem Modul, wieviele Daten wir an welche Verbindung schicken wollen. Mit dem Befehl AT+CIPSEND=0,5 z. B. sagen wir dem Modul wir möchten 5 Bytes an Verbindung 0 senden. Nach diesem Befehl werden die nächsten 5 Zeichen direkt an die Verbindung weitergereicht.&lt;br /&gt;
Sollte keine aktive Verbindung bestehen, sendet das Modul &lt;br /&gt;
     AT+CIPSEND=0,5&amp;lt;\r&amp;gt;&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;link is not&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
ansonsten kommt &lt;br /&gt;
     &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt; &amp;gt;&lt;br /&gt;
und man kann Daten senden. Nach dem absenden der Daten &#039;Leute&#039; + LF + CR sendet das Modul &lt;br /&gt;
    Leute&amp;lt;\r&amp;gt;&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;busy&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    busy&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    &amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
    SEND OK&amp;lt;\r&amp;gt;&amp;lt;\n&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Einstellen des Moduls als Station&lt;br /&gt;
&lt;br /&gt;
== Software Development Kit (SDK) ==&lt;br /&gt;
Mit dem SDK können eigene Applikationen programmiert und die im SDK vorhandenen Beispiele &amp;quot;AT&amp;quot; und &amp;quot;IoT&amp;quot; verändert werden. Das SDK wird vom Hersteller zur Verfügung gestellt (Stand 25.10.2014). Passend zum SDK existiert eine virtuelle Maschine mit eingerichtetem gcc zum Kompilieren. Insbesondere der nun verfügbare gcc basiert auf einer Community-Entwicklung.&lt;br /&gt;
&lt;br /&gt;
[http://bbs.espressif.com/viewforum.php?f=5&amp;amp;sid=3cf7540ab17805367e6a45d2c4682fc9 SDK0.9.2 + virtuelle Linuxmaschine mit eingerichtetem gcc]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/folderview?id=0B5bwBE9A5dBXaExvdDExVFNrUXM&amp;amp;usp=sharing Alternativlink für die virtuelle Maschine + Anleitung/HOWTO für das Setup sowie für das Kompilieren]&lt;br /&gt;
&lt;br /&gt;
=== Firmware updaten ===&lt;br /&gt;
Typischerweise wird eine kompilierte Firmware per UART-Bootloader des ESP8266-SoC auf einen Flash-Chip eines ESP8266-Moduls geladen. Von dort startet der ESP8266-SoC anschließend die Firmware.&lt;br /&gt;
&lt;br /&gt;
[http://bbs.espressif.com/viewtopic.php?f=5&amp;amp;t=433 Flash Download Tool vom Hersteller] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://github.com/themadinventor/esptool Python Tool zum Flashen (von Fredrik Ahlberg)] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://github.com/3s1d/esp_prog Extension zum Tool von Fredrik Ahlberg] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/342240?page=2#3857075 Tool zum Flashen (von Christian Klippel)] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://defcon-cc.dyndns.org/wiki/ESP8266#Update Anleitung, extern] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/342240?page=3#3810559 Anleitung, Forum]&lt;br /&gt;
&lt;br /&gt;
Der Hersteller veröffentlich regelmässig [http://bbs.espressif.com/viewforum.php?f=5 Firmwareupdates] als Bestandteil des esp_iot_sdk. Die Firmware-Dateien befinden sich im Verzeichnis bin. Das Update wird beispielweise für Firmware 0.9.5 folgendermaßen durchgeführt: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python esptool.py --baud 9600 --port com6 write_flash 0x00000 boot_v1.2.bin 0x01000 at/user1.512.new.bin 0x3e000 blank.bin 0x7e000 blank.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abhängig von der Flashgröße muß man die Firmware ab Version 1.0.1 selbst compilieren. Siehe Diskussion [http://www.esp8266.com/viewtopic.php?p=16515 hier] und [http://bbs.espressif.com/viewtopic.php?f=16&amp;amp;t=400 hier].&lt;br /&gt;
&lt;br /&gt;
=== Anmerkung ===&lt;br /&gt;
Mit dem SDK wird der Mikrocontroller progammiert, der sich direkt auf dem ESP8266-SoC-Chip befindet. Dies ist nicht zu verwechseln mit Programmieranleitungen zur UART-Ansteuerung des ESP8266-SoC (meist mit AT-Firmware) mit einem anderen Mikrocontroller.&lt;br /&gt;
&lt;br /&gt;
==Checkliste bei Problemen mit dem Modul/Compiler/SDK==&lt;br /&gt;
Bitte berücksichtige bei der Frage nach Hilfestellung zu Deinem Problem die folgende Checkliste.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bei Problemen mit der AT-Firmware/UART-Ansteuerung mit Mikrocontroller&#039;&#039;&#039;&lt;br /&gt;
# Was nutzt Du für die Stromversorgung?&amp;lt;br/&amp;gt;(Ganz knapp benennen, so dass Rückschlüsse auf Spannung und Stromstärke möglich sind)&lt;br /&gt;
# Welche Firmware-Version verwendest Du und von woher hast Du sie?&lt;br /&gt;
# Welchen Mikrocontroller verwendest Du?&lt;br /&gt;
# Welche Baudrate verwendest Du?&lt;br /&gt;
# &amp;quot;Sieht&amp;quot; das Modul den AP, &amp;quot;sieht&amp;quot; der PC das Modul?&lt;br /&gt;
# Funktioniert ein Connect?&lt;br /&gt;
# Welche AT-Befehlssequenz verwendest Du und was antwortet das Modul?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bei Problemen mit dem SDK/Compiler&#039;&#039;&#039;&lt;br /&gt;
# Benutzt Du die neuste, offizielle VM?&amp;lt;br/&amp;gt;(Diese ist ausgelegt für das neueste SDK)&lt;br /&gt;
# Benutzt Du das neueste, offizielle SDK? Welche Version benutzt Du?&amp;lt;br/&amp;gt;(Es werden regelmäßig Bugfixes und Erweiterungen eingepflegt)&lt;br /&gt;
# Kannst Du die SDK-Beispiele (IoT,AT) entsprechend der offiziellen Anleitung kompilieren, flashen und läuft es?&lt;br /&gt;
&lt;br /&gt;
== SDK Programmers Guide ==&lt;br /&gt;
(ggf. später in eigenen Artikel)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; GPIO Initialisieren, Setzen, Löschen, Lesen: &#039;&#039;&#039; &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// GPIO4 als Eingang deklarieren&lt;br /&gt;
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4);&lt;br /&gt;
// GPIO4 internen Pullup aktivieren&lt;br /&gt;
PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO4_U);&lt;br /&gt;
if(GPIO_INPUT_GET(4) == 1) {&lt;br /&gt;
   os_printf(&amp;quot;GPIO4\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039; UART ECHO LOOP: &#039;&#039;&#039; TODO&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039; ADC lesen: &#039;&#039;&#039; TODO&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Watchdog und Timer ===&lt;br /&gt;
&amp;lt;h4&amp;gt;&lt;br /&gt;
In der C Datei in der der Watchdog an/ausgeschaltet werden soll&lt;br /&gt;
folgendes definieren:&lt;br /&gt;
&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   extern void ets_wdt_enable(void);&lt;br /&gt;
   extern void ets_wdt_disable(void);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;h4&amp;gt;&lt;br /&gt;
Diese beiden Funktionen sind im internen ROM.&lt;br /&gt;
Dann eben diese Funktionen entsprechend aufrufen.&lt;br /&gt;
&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;h4&amp;gt;&lt;br /&gt;
Es gibt auch noch:&lt;br /&gt;
&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   extern void wdt_feed(void);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;h4&amp;gt;&lt;br /&gt;
Wird diese Funktion aufgerufen wird der Watchdog zurückgesetzt und&lt;br /&gt;
startet wieder bei 0.&lt;br /&gt;
&amp;lt;/h4&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Interrupts: &#039;&#039;&#039; TODO&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039; WLAN UDP/TCP ECHO LOOP: &#039;&#039;&#039; TODO&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039; Minimalbeispiel1: GPIO/LED schalten mittels UART: &#039;&#039;&#039; TODO &amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039; Minimalbeispiel2: GPIO/LED schalten von einem zweiten Modul aus: &#039;&#039;&#039; TODO&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Power-/Sleep-Modes ===&lt;br /&gt;
Der Stromverbrauch des ESP8266 ist abhängig von vielen Faktoren, er läßt sich aber durch geschickte Programmierung durchaus deutlich senken.&amp;lt;br/&amp;gt;&lt;br /&gt;
So ist es nicht notwendig, dass das WIFI-Modem oder der Mikrocontroller ständig läuft um z.B. eine WLAN-Türklingel zu realisieren. Im &amp;quot;Deep-Sleep&amp;quot; würde der ESP8266 dann nur 10uA verbrauchen, bis er über einen GPI-Interrupt geweckt wird und die Meldung absetzt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu beachten ist, dass in diesem Moment die WLAN und Netzwerkanmeldung neu startet und hierfür eine gewisse Zeit benötigt wird.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://bbs.espressif.com/viewtopic.php?f=6&amp;amp;t=133 detailierte Übersicht der verschieden Modi und deren Stromverbrauch von Espressif]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
[http://www.esp8266.com/ ESP8266 Community Forum]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://github.com/esp8266 ESP8266 Github mit Wiki und Source-Code Samples]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://defcon-cc.dyndns.org/wiki/ESP8266 ESP8266-Informationen]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/topic/348772 Topic neu im mikrocontroller.net-Forum]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/topic/342240 Topic alt im mikrocontroller.net-Forum]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/342878 Sammelbestellungen im mikrocontroller.net-Forum]&lt;br /&gt;
&lt;br /&gt;
=== Dokumente === &lt;br /&gt;
[https://drive.google.com/folderview?id=0B5bwBE9A5dBXaExvdDExVFNrUXM&amp;amp;usp=sharing Anleitung/HOWTO für das Setup der virtuellen Maschine (SDK) sowie für das Kompilieren]&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://nurdspace.nl/ESP8266 Übersetztes Datenblatt]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.electrodragon.com/w/Wi07c AT Instructions Set (English)] und [http://www.electrodragon.com/w/Wi07c#First_time_use_guide Anleitung zum Betrieb an einem Arduino (inkl. Code)]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://thomaspfeifer.net/esp8266_wlan_seriell_modul_at_kommandos.htm Beschreibung der AT-Kommandos mit Beispielen]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/attachment/229016/Espressif_IoT_AT____v0.1.5.906.pdf Espressif AT Instruction Set(Chinese)]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.seeedstudio.com/document/pdf/ESP8266%20Specifications(Chinese).pdf ESP8266 Specifications(Chinese)]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Daten===&lt;br /&gt;
[http://bbs.espressif.com/viewforum.php?f=5&amp;amp;sid=3cf7540ab17805367e6a45d2c4682fc9 SDK0.9.2 + virtuelle Linuxmaschine mit eingerichtetem gcc]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://drive.google.com/folderview?id=0B5bwBE9A5dBXaExvdDExVFNrUXM&amp;amp;usp=sharing Alternativlink für die virtuelle Maschine]&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://onedrive.live.com/#cid=C4DDF72E6EEA3826&amp;amp;id=C4DDF72E6EEA3826%21631 Dateien (Xplorer+SDK+PDF+etc.)]&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/attachment/230185/esp8266_config_v050.exe Config-Tool] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bezugsquellen ===&lt;br /&gt;
[http://www.aliexpress.com/wholesale?SearchText=ESP8266 aliexpress.com] ~ 3€&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.banggood.com/?zf=283997 banggood.com] ~ 3.50€&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.ebay.de Ebay]&lt;br /&gt;
ab 3€ inkl. Versand, Einzelstückpreis: ESP-01/02/03/04/05&amp;lt;br/&amp;gt;&lt;br /&gt;
(Suchbegriff: ESP8266, Option Artikelstandort: &amp;quot;Weltweit&amp;quot;)&amp;lt;br/&amp;gt;&lt;br /&gt;
(10 Stück ab 27 EUR inkl. Versand; Suchbegriff: 10pcs ESP8266)&amp;lt;br/&amp;gt;&lt;br /&gt;
ab 3.20€ inkl. Versand, Einzelstückpreis: ESP-07/08/09/11&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.electrodragon.com/?s=esp8266&amp;amp;post_type=product electrodragon.com] ~ 3.50€ (zzgl. Versand)&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://ex-store.de/advanced_search_result.php?keywords=esp8266&amp;amp;x=0&amp;amp;y=0 eX-store.de] (ESP-01,ESP-02, ESP-03,ESP-05,ESP-07) ab 5.49€ (zzgl. Versand)&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://www.it-wns.de/themes/suche/index.php?suchekategorie=&amp;amp;sucheallgemein=esp8266 IT-WNS.de] (ESP-01,ESP-03,ESP-07,ESP-12) ab 5.49€ (zzgl. Versand)&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.seeedstudio.com/depot/WiFi-Serial-Transceiver-Module-w-ESP8266-p-1994.html seeedstudio.com] ~ 5.50€&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://shop.in-circuit.de/index.php?cPath=21 In-Circuit.de] ESP-ADC DIL Modul mit ESP8266EX - made in Germany!&amp;lt;br/&amp;gt; professioneller Support, HowTo und Videos&amp;lt;br/&amp;gt; ab 500 Stk. je 3.90€, 9.90€ Einzelpreis&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anderes==&lt;br /&gt;
*[http://www.mikrocontroller.net/articles/ESP8266-CPCB PCB für Community-Modul (Vorschlag)]&lt;br /&gt;
*[http://fkainka.de/esp8266-in-der-arduino-ide/ ESP8266 mit Arduino IDE programmieren]&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--von [[axhieb]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Bauteile]]&lt;br /&gt;
[[Kategorie:Funk]]&lt;br /&gt;
[[Kategorie:Wlan]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Mikrocontroller&amp;diff=88561</id>
		<title>Mikrocontroller</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Mikrocontroller&amp;diff=88561"/>
		<updated>2015-05-08T14:43:36Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Wiederhergestellt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein Mikrocontroller ist ein [[Prozessor]] plus Zusatzmodule. Der Unterschied zu Mikroprozessoren besteht darin, dass bei einem Mikrocontroller Speicher, [[Digital]]- und [[Analog]]- Ein- und Ausgänge, Timer, UART etc. meist auf einem einzigen Chip integriert sind, so dass eine Mikrocontroller-Anwendung oft mit ein paar wenigen Bauteilen auskommt.&lt;br /&gt;
&lt;br /&gt;
Mikrocontroller werden häufig zuerst an der [[Bit]]-Zahl des internen Datenbusses unterschieden: 4/8/16 oder 32 Bit. Diese Bit-Zahl kann man als die Länge der Daten interpretieren, die der Controller in einem Befehl verarbeiten kann. Die größte in 8 [[Digitaltechnik|Bit]] (= 1 [[Digitaltechnik|Byte]]) darstellbare Zahl ist die 255, somit kann ein 8 Bit-Mikrocontroller z.&amp;amp;nbsp;B. in einem Additionsbefehl immer nur Zahlen bis 255 verarbeiten. Zur Bearbeitung von größeren Zahlen werden dann mehrere Befehle hintereinander benötigt, was natürlich länger dauert.&lt;br /&gt;
&lt;br /&gt;
== Taktung ==&lt;br /&gt;
&lt;br /&gt;
Ein Mikrocontroller braucht, wie jeder andere Prozessor auch, zum Betrieb einen [[Taktfrequenz | Takt]]. Dieser kann extern zugeführt werden (Taktgenerator, Quarzoszillator), mittels externem Quarz erzeugt, oder von einem internen Taktgeber (RC-Oszillator) abgeleitet werden. Die maximale Frequenz mit der ein Controller betrieben werden kann reicht von 1 MHz bei alten Controllern bis über 100 MHz bei großen 32-&amp;quot;Bittern&amp;quot;. Diese Taktfrequenz sagt jedoch noch nicht viel über die tatsächliche Geschwindigkeit eines Prozessors aus. So wird z.&amp;amp;nbsp;B. bei den meisten alten [[8051]]-Controllern die Frequenz intern durch 12 geteilt (Maschinentakt), ein mit 24 MHz getakteter 8051 arbeitet also eigentlich nur mit 2 MHz. Benötigt dieser dann für einen Befehl durchschnittlich 2 Taktzyklen, so bleiben &amp;quot;nur&amp;quot; noch 1 Millionen Befehle pro Sekunde übrig. Ein [[AVR]], der ungeteilt mit 8MHz arbeitet und für viele der Befehle nur einen Zyklus braucht, schafft dagegen fast 8 Millionen Befehle pro Sekunde. Neue 8051 Typen verarbeiten ebenfalls einen Befehl in einem Taktzyklus und sind erhältlich bis 100 MHz.&lt;br /&gt;
&lt;br /&gt;
== Wozu ist ein Mikrocontroller gut? ==&lt;br /&gt;
&lt;br /&gt;
Hier ein paar Beispiele, für welche Aufgaben Mikrocontroller verwendet werden können:&lt;br /&gt;
&lt;br /&gt;
* Ladegeräte&lt;br /&gt;
* [[Motoransteuerung mit PWM|Motorsteuerungen]] (z.&amp;amp;nbsp;B. [[Schrittmotoren|Schrittmotor]]-Controller ([[Schrittmotor-Controller (Stepper)|Stepper)]])&lt;br /&gt;
* Roboter&lt;br /&gt;
* [[USB IO Expander|Meßwerterfassung]] (z.&amp;amp;nbsp;B. [[Drehzahlmesser]] im Auto)&lt;br /&gt;
* [[Steuerung und Regelung eines Raums mit dem AVR-Webserver|Temperaturregelung]]&lt;br /&gt;
* [[MP3]]- und DVD-Player&lt;br /&gt;
* Schaltuhren&lt;br /&gt;
* [[ISP|Programmieradapter]]&lt;br /&gt;
&lt;br /&gt;
== Welchen Mikrocontroller soll ich verwenden? ==&lt;br /&gt;
&lt;br /&gt;
Ein Mikrocontroller für Hobbyanwender sollte idealerweise folgende Voraussetzungen erfüllen:&lt;br /&gt;
&lt;br /&gt;
* gute Beschaffbarkeit&lt;br /&gt;
* niedriger Preis spielt bei den kleinen Stückzahlen keine so große Rolle&lt;br /&gt;
* handliche Bauform: ein Controller mit 20 Pins ist leichter handzuhaben als einer mit 128&lt;br /&gt;
* [[Speicher#Flash-ROM | Flash-ROM]]: der Controller sollte mindestens 1000 mal neu programmiert werden können&lt;br /&gt;
* In-System-Programmierbarkeit ([[ISP]]): man benötigt kein teures Programmiergerät und muss den Controller zur Programmierung nicht aus der Schaltung entfernen&lt;br /&gt;
* kostenlose Software verfügbar: [[Assembler]] bekommt man praktisch immer kostenlos vom Hersteller des Controllers, [[C]]-[[Compiler]] seltener&lt;br /&gt;
&lt;br /&gt;
Eine ausführliche Beschreibung der Entscheidungskriterien gibt es auf der Seite [[Entscheidung Mikrocontroller]] sowie [[STM32 für Einsteiger]]&lt;br /&gt;
&lt;br /&gt;
== Verbreitete Mikrocontrollerfamilien ==&lt;br /&gt;
* 1 Bit&lt;br /&gt;
** [[MC14500B]] (Motorola, historisch!)&lt;br /&gt;
&lt;br /&gt;
* 4 Bit&lt;br /&gt;
** [[MARC4]] (Atmel)&lt;br /&gt;
** [[SM62]] (Epson)&lt;br /&gt;
&lt;br /&gt;
* 8 Bit&lt;br /&gt;
** [http://www.analog.com/MicroConverter MicroConverter®] (Analog Devices)&lt;br /&gt;
** [[AVR]] (Atmel)&lt;br /&gt;
** [[PIC]] (Microchip)&lt;br /&gt;
** [[8048]] (Intel)&lt;br /&gt;
** [[8051]] (Intel, versch. Hersteller)&lt;br /&gt;
** [[H8]] (Renesas, früher Hitachi)&lt;br /&gt;
** [[68HC05]] (Freescale, früher Motorola)&lt;br /&gt;
** [[68HC08]] (Freescale, früher Motorola)&lt;br /&gt;
** [[68HC11]] (Freescale, früher Motorola)&lt;br /&gt;
** [[ST62]] (SGS-Thomson)&lt;br /&gt;
** [[78K0S]] (NEC)&lt;br /&gt;
** [[Z8]] (Zilog)&lt;br /&gt;
** [[PSoC]] (Cypress)&lt;br /&gt;
&lt;br /&gt;
* 16 Bit&lt;br /&gt;
** [[C16x]] (Infineon)&lt;br /&gt;
** [[M16C]] (Renesas, früher Mitsubishi)&lt;br /&gt;
** [[R8C]] (Renesas)&lt;br /&gt;
** [[H8]] (Renesas, früher Hitachi)&lt;br /&gt;
** [[68HC12]] (Freescale, früher Motorola)&lt;br /&gt;
** [[68HC16]] (Freescale, früher Motorola)&lt;br /&gt;
** [[dsPIC]] (Microchip)&lt;br /&gt;
** [[PIC24]] (Microchip)&lt;br /&gt;
** [[MSP430]] (Texas Instruments)&lt;br /&gt;
** [[ZNEO]] (Zilog)&lt;br /&gt;
&lt;br /&gt;
* 32 Bit&lt;br /&gt;
** [[ADuC7xxx]] (Analog Devices) [[ARM]]-Core&lt;br /&gt;
** [[AT91SAM]] (Atmel) [[ARM]]-Core&lt;br /&gt;
** [[AVR32]] (Atmel)&lt;br /&gt;
** [[Kinetis]] (Freescale) [[ARM]]-Core&lt;br /&gt;
** [[LPC2000|LPC2xxx]] (NXP ehemals Philips) [[ARM]]-Core&lt;br /&gt;
** [[PIC32]] (Microchip)&lt;br /&gt;
** [[TriCore]] (Infineon)&lt;br /&gt;
** [[XMCxxxx]] (Infineon) [[ARM]]-Core (im Hobbybereich schwerer beschaffbar)&lt;br /&gt;
** [[SuperH]] (Renesas, früher Hitachi)&lt;br /&gt;
** [[STM32]] (STMicroelectronics) [[ARM]] Cortex M-Core&lt;br /&gt;
** [[FR50]] (Fujitsu)&lt;br /&gt;
** [[EFM32]] (Energy Micro) [[ARM]] Cortex M-Core&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://chaosradio.ccc.de/cre067.html Podcast CRE67 Mikrocontroller] bei Chaosradio Express&lt;br /&gt;
* [http://www.edn.com/article/CA6615617.html 36th annual EDN microprocessor/microcontroller directory] bei edn.com (2009)&lt;br /&gt;
&lt;br /&gt;
[[Category:Grundlagen]]&lt;br /&gt;
[[Category:Mikrocontroller| ]]&lt;br /&gt;
[[Category:Bauteile]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_7-Segment-Anzeige&amp;diff=84705</id>
		<title>AVR-Tutorial: 7-Segment-Anzeige</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_7-Segment-Anzeige&amp;diff=84705"/>
		<updated>2014-08-29T11:10:13Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Vandalismus rückgängig gemacht&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Ausgabe von Zahlenwerten auf ein Text-LCD ist sicherlich das Nonplusultra, aber manchmal liegen die Dinge sehr viel einfacher. Um beispielsweise eine Temperatur anzuzeigen ist ein LCD etwas Overkill. In solchen Fällen kann die Ausgabe auf ein paar 7-Segmentanzeigen gemacht werden. Ausserdem haben 7-Segmentanzeigen einen ganz besonderen Charme :-)&lt;br /&gt;
&lt;br /&gt;
==Typen von 7-Segment Anzeigen==&lt;br /&gt;
&lt;br /&gt;
Eine einzelne 7-Segmentanzeige besteht aus sieben (mit Dezimalpunkt acht) einzelnen [[LED]]s in einem gemeinsamen Gehäuse. Aus praktischen Gründen wird einer der beiden Anschlüsse jeder LED mit den gleichen Anschlüssen der anderen LED verbunden und gemeinsam aus dem Gehäuse herausgeführt. Das spart Pins am Gehäuse und später bei der Ansteuerung. Dementsprechend spricht man von Anzeigen mit &#039;&#039;gemeinsamer Anode&#039;&#039; (engl. common anode) bzw. &#039;&#039;gemeinsamer Kathode&#039;&#039; (engl. common cathode).&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tut_7_Seg_00.gif | framed | center | Interne Verschaltung der 7-Segmentanzeigen]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eine einzelne 7-Segment Anzeige==&lt;br /&gt;
&lt;br /&gt;
===Schaltung===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tut_7_Seg_02.gif | thumb| left | 80px| Pin-&amp;lt;br/&amp;gt;belegung einer 7-Segment-&amp;lt;br/&amp;gt;anzeige]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tut_7_Seg_01.gif | thumb | right |240px| Ansteuerung einer einzelnen 7-Segmentanzeige]]&lt;br /&gt;
&lt;br /&gt;
Eine einzelne 7-Segmentanzeige wird nach dem folgenden Schema am &#039;&#039;&#039;Port D&#039;&#039;&#039; des Mega8 angeschlossen. Port D wurde deshalb gewählt, da er am Mega8 als einziger Port aus den vollen 8 Bit besteht. Die 7-Segmentanzeige hat neben den Segmenten &#039;&#039;&#039;a&#039;&#039;&#039; bis &#039;&#039;&#039;g&#039;&#039;&#039;  eine gemeinsame Anode &#039;&#039;&#039;CA&#039;&#039;&#039; sowie einen Dezimalpunkt &#039;&#039;&#039;dp&#039;&#039;&#039; (siehe Bild).&lt;br /&gt;
&lt;br /&gt;
Welcher Pin an der Anzeige welchem Segment (a-g) bzw. dem Dezimalpunkt entspricht wird am besten dem Datenblatt zur Anzeige entnommen. Hat man kein Datenblatt dann kann man auch empirisch die Pinbelegung feststellen, indem  man mit einer 5V Quelle und einem 1k Widerstand einfach probweise alle Pins &#039;abklappert&#039;. 1k deswegen, damit man im Zweifellsfall Low-Current LED nicht überfordert. Eine 7-Segment Anzeige, die auf die üblichen 10 bis 20mA ausgelegt ist, wird damit immer noch leuchten, wenn auch schwach. Aber mehr braucht es ja auch nicht um die Pinbelegung feststellen zu können. Im Folgenden wird von dieser Segmentbelegung ausgegangen:&lt;br /&gt;
&lt;br /&gt;
Wird eine andere Belegung genutzt dann ist das prinzipiell möglich, jedoch müsste das in der Programmierung berücksichtigt werden.&lt;br /&gt;
&lt;br /&gt;
Da eine 7-Segmentanzeige konzeptionell sieben einzelnen LEDs entspricht, ergibt sich im Prinzip keine Änderung in der Ansteuerung einer derartigen Anzeige im Vergleich zur LED Ansteuerung wie sie im [[AVR-Tutorial: IO-Grundlagen]] gezeigt wird. Genau wie bei den einzelnen LEDs wird eine davon eingeschaltet, indem der zugehörige Port Pin auf 0 gesetzt wird. Aber anders als bei einzelnen LED möchte man mit einer derartigen Anzeige eine Ziffernanzeige erhalten. Dazu ist es lediglich notwendig, für eine bestimmte Ziffer die richtigen LEDs einzuschalten.&lt;br /&gt;
&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
===Codetabelle===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tut_7_Seg_02a.gif | right | thumb | 80px | Darstellung der Ziffer &amp;quot;3&amp;quot;]]&lt;br /&gt;
Die Umkodierung von einzelnen Ziffern in ein bestimmtes Ausgabemuster kann über eine sog. Codetabelle geschehen: Die auszugebende Ziffer wird als Offset zum Anfang dieser Tabelle aufgefasst und aus der Tabelle erhält man ein Byte (Code), welches direkt auf den Port ausgegeben werden kann und das entsprechende Bitmuster enthält, sodass die für diese Ziffer notwendigen LED ein- bzw. ausgeschaltet sind.&lt;br /&gt;
&lt;br /&gt;
;Beispiel: Um die Ziffer &#039;&#039;&#039;3&#039;&#039;&#039; anzuzeigen, müssen auf der Anzeige die Segmente &#039;&#039;&#039;a&#039;&#039;&#039;, &#039;&#039;&#039;b&#039;&#039;&#039;, &#039;&#039;&#039;c&#039;&#039;&#039;, &#039;&#039;&#039;d&#039;&#039;&#039; und &#039;&#039;&#039;g&#039;&#039;&#039; aufleuchten. Alle anderen Segmente sollen dunkel sein.&lt;br /&gt;
&lt;br /&gt;
Aus dem Anschlußschema ergibt sich, dass die dazu notwendige Ausgabe am Port binär &#039;&#039;&#039;10110000&#039;&#039;&#039; lauten muss. Untersucht man dies für alle Ziffern, so ergibt sich folgende Tabelle:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    .db  0b11000000     ; 0: a, b, c, d, e, f&lt;br /&gt;
    .db  0b11111001     ; 1: b, c&lt;br /&gt;
    .db  0b10100100     ; 2: a, b, d, e, g&lt;br /&gt;
    .db  0b10110000     ; 3: a, b, c, d, g&lt;br /&gt;
    .db  0b10011001     ; 4: b, c, f, g&lt;br /&gt;
    .db  0b10010010     ; 5: a, c, d, f, g&lt;br /&gt;
    .db  0b10000010     ; 6: a, c, d, e, f, g&lt;br /&gt;
    .db  0b11111000     ; 7: a, b, c&lt;br /&gt;
    .db  0b10000000     ; 8: a, b, c, d, e, f, g&lt;br /&gt;
    .db  0b10010000     ; 9: a, b, c, d, f, g&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Programm===&lt;br /&gt;
&lt;br /&gt;
Das Testprogramm stellt nacheinander die Ziffern 0 bis 9 auf der 7-Segmentanzeige dar. Die jeweils auszugebende Zahl steht im Register &#039;&#039;&#039;count&#039;&#039;&#039; und wird innerhalb der Schleife um jeweils 1 erhöht. Hat das Register den Wert 10 erreicht, so wird es wieder auf 0 zurückgesetzt. Nach der Erhöhung folgt eine Warteschleife, welche dafür sorgt, dass bis zur nächsten Ausgabe eine gewisse Zeit vergeht. Normalerweise macht man keine derartigen langen Warteschleifen, aber hier geht es ja nicht ums Warten sondern um die Ansteuerung einer 7-Segmentanzeige. Einen Timer dafür zu benutzen wäre zunächst zuviel Aufwand.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Ausgabe und damit der in diesem Artikel interessante Teil findet jedoch direkt nach dem Label &amp;lt;i&amp;gt;loop&amp;lt;/i&amp;gt; statt. Die bereits bekannte Codetabelle wird mittels &#039;&#039;&#039;.db&#039;&#039;&#039; Direktive (&#039;&#039;&#039;d&#039;&#039;&#039;efine &#039;&#039;&#039;b&#039;&#039;&#039;yte) in den [[Speicher#Flash-ROM | Flash-Speicher]] gelegt. Der Zugriff darauf erfolgt über den Z-Pointer und dem Befehl &#039;&#039;&#039;lpm&#039;&#039;&#039;. Zusätzlich wird vor dem Zugriff noch der Wert des Registers &#039;&#039;&#039;count&#039;&#039;&#039; und damit der aktuelle Zählerwert zum Z-Pointer addiert.&lt;br /&gt;
&lt;br /&gt;
Beachtet werden muss nur, dass der Zählerwert verdoppelt werden muss. Dies hat folgenden Grund: Wird die Tabelle so wie hier gezeigt mittels einzelnen &#039;&#039;&#039;.db&#039;&#039;&#039; Anweisungen aufgebaut, so fügt der Assembler sog. &#039;&#039;&#039;Padding Bytes&#039;&#039;&#039; zwischen die einzelnen Bytes ein, damit jede &#039;&#039;&#039;.db&#039;&#039;&#039; Anweisung auf einer geraden Speicheradresse liegt. Dies ist eine direkte Folge der Tatsache, dass der Flash-Speicher &#039;&#039;&#039;wortweise&#039;&#039;&#039; (16 Bit) und nicht &#039;&#039;&#039;byteweise&#039;&#039;&#039; (8 Bit) organisiert ist. Da aber von einem .db in der Tabelle zum nächsten .db eine Differenz von 2 Bytes vorliegt, muss dies in der Berechnung berücksichtigt werden. Im zweiten Beispiel auf dieser Seite wird dies anders gemacht. Dort wird gezeigt wie man durch eine andere Schreibweise der Tabelle das Erzeugen der Padding Bytes durch den Assembler verhindern kann.&lt;br /&gt;
&lt;br /&gt;
Aus dem gleichen Grund wird auch der Z-Pointer mit dem 2-fachen der Startadresse der Tabelle geladen. Die Startadresse wird vom Assembler in wortweiser Adressierung eingesetzt, &#039;&#039;&#039;lpm&#039;&#039;&#039; möchte die Zugriffsadresse als Byteadresse angegeben haben.&lt;br /&gt;
&lt;br /&gt;
Interessant ist auch, dass in der Berechnung ein Register benötigt wird, welches den Wert 0 enthält. Dies deshalb, da es im AVR keinen Befehl gibt der eine Konstante mit gleichzeitiger Berücksichtigung des Carry-Bits addieren kann. Daher muss diese Konstante zunächst in ein Register geladen werden und erst dann kann die Addition mithilfe dieses Registers vorgenommen werden. Das Interessante daran ist nun, dass dieser Umstand in sehr vielen Programmen vorkommt und es sich bei der Konstanten in der überwiegenden Mehrzahl der Fälle um die Konstante 0 handelt. Viele Programmierer reservieren daher von vorne herein ein Register für diesen Zweck und nennen es das Zero-Register. Sinnvollerweise legt man dieses Register in den Bereich r0..r15, da diese Register etwas zweitklassig sind (ldi, cpi etc. funktionieren nicht damit).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
.def zero  = r1&lt;br /&gt;
.def count = r16&lt;br /&gt;
.def temp1 = r17&lt;br /&gt;
&lt;br /&gt;
.org 0x0000&lt;br /&gt;
           rjmp    main                ; Reset Handler&lt;br /&gt;
;&lt;br /&gt;
main:&lt;br /&gt;
           ldi     temp1, HIGH(RAMEND)&lt;br /&gt;
           out     SPH, temp1&lt;br /&gt;
           ldi     temp1, LOW(RAMEND)  ; Stackpointer initialisieren&lt;br /&gt;
           out     SPL, temp1&lt;br /&gt;
&lt;br /&gt;
;&lt;br /&gt;
           ldi     temp1, $FF        ; die Anzeige hängt am Port D&lt;br /&gt;
           out     DDRD, temp1       ; alle Pins auf Ausgang&lt;br /&gt;
;&lt;br /&gt;
           ldi     count, 0          ; und den Zähler initialisieren&lt;br /&gt;
           mov     zero, count&lt;br /&gt;
;&lt;br /&gt;
loop:&lt;br /&gt;
           ldi     ZL, LOW(Codes*2)  ; die Startadresse der Tabelle in den&lt;br /&gt;
           ldi     ZH, HIGH(Codes*2) ; Z-Pointer laden&lt;br /&gt;
&lt;br /&gt;
           mov     temp1, count      ; die wortweise Adressierung der Tabelle&lt;br /&gt;
           add     temp1, count      ; berücksichtigen&lt;br /&gt;
&lt;br /&gt;
           add     ZL, temp1         ; und ausgehend vom Tabellenanfang&lt;br /&gt;
           adc     ZH, zero          ; die Adresse des Code Bytes berechnen&lt;br /&gt;
&lt;br /&gt;
           lpm                       ; dieses Code Byte in das Register r0 laden&lt;br /&gt;
&lt;br /&gt;
           out     PORTD, r0         ; und an die Anzeige ausgeben&lt;br /&gt;
;&lt;br /&gt;
           inc     count             ; den Zähler erhöhen, wobei der Zähler&lt;br /&gt;
           cpi     count, 10         ; immer nur von 0 bis 9 zählen soll&lt;br /&gt;
           brne    wait&lt;br /&gt;
           ldi     count, 0&lt;br /&gt;
;&lt;br /&gt;
wait:      ldi     r17, 10           ; und etwas warten, damit die Ziffer auf&lt;br /&gt;
wait0:     ldi     r18, 0            ; der Anzeige auch lesbar ist, bevor die&lt;br /&gt;
wait1:     ldi     r19, 0            ; nächste Ziffer gezeigt wird&lt;br /&gt;
wait2:     dec     r19&lt;br /&gt;
           brne    wait2&lt;br /&gt;
           dec     r18&lt;br /&gt;
           brne    wait1&lt;br /&gt;
           dec     r17&lt;br /&gt;
           brne    wait0&lt;br /&gt;
;&lt;br /&gt;
           rjmp    loop              ; auf zur nächsten Ausgabe&lt;br /&gt;
;&lt;br /&gt;
Codes:                               ; Die Codetabelle für die Ziffern 0 bis 9&lt;br /&gt;
                                     ; sie regelt, welche Segmente für eine bestimmte&lt;br /&gt;
                                     ; Ziffer eingeschaltet werden müssen&lt;br /&gt;
                                     ;&lt;br /&gt;
           .db     0b11000000        ; 0: a, b, c, d, e, f&lt;br /&gt;
           .db     0b11111001        ; 1: b, c&lt;br /&gt;
           .db     0b10100100        ; 2: a, b, d, e, g&lt;br /&gt;
           .db     0b10110000        ; 3: a, b, c, d, g&lt;br /&gt;
           .db     0b10011001        ; 4: b, c, f, g&lt;br /&gt;
           .db     0b10010010        ; 5: a, c, d, f, g&lt;br /&gt;
           .db     0b10000010        ; 6: a, c, d, e, f, g&lt;br /&gt;
           .db     0b11111000        ; 7: a, b, c&lt;br /&gt;
           .db     0b10000000        ; 8: a, b, c, d, e, f, g&lt;br /&gt;
           .db     0b10010000        ; 9: a, b, c, d, f, g &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mehrere 7-Segment Anzeigen (Multiplexen)==&lt;br /&gt;
&lt;br /&gt;
Mit dem bisherigen Vorwissen könnte man sich jetzt daran machen, auch einmal drei oder vier Anzeigen mit dem Mega8 anzusteuern. Leider gibt es da ein Problem, denn für eine Anzeige sind acht Portpins notwendig - vier Anzeigen würden demnach 32 Portpins benötigen. Die hat der Mega8 aber nicht. Dafür gibt es aber mehrere Auswege. Schieberegister sind bereits in einem anderen [[AVR-Tutorial:_Schieberegister|Tutorial]] beschrieben. Damit könnte man sich ganz leicht die benötigten 32 Ausgangsleitungen mit nur 3 Portpins erzeugen. Das Prinzip der Ansteuerung unterscheidet sich in nichts von der Ansteurung einer einzelnen 7-Segment Anzeige, lediglich die Art und Weise, wie die &#039;Ausgangspins&#039; zu ihren Werten kommen ist anders und durch die Verwendung von Schieberegistern vorgegeben. An dieser Stelle soll aber eine andere Variante der Ansteuerung gezeigt werden. Im Folgenden werden wir uns daher das [[Multiplexen]] einmal näher ansehen.&lt;br /&gt;
&lt;br /&gt;
Multiplexen bedeutet, dass nicht alle vier Anzeigen gleichzeitig eingeschaltet sind, sondern immer nur Eine für eine kurze Zeit. Geschieht der Wechsel zwischen den Anzeigen schneller als wir Menschen das wahrnehmen können, so erscheinen uns alle vier Anzeigen gleichzeitig in Betrieb zu sein obwohl immer nur Eine für eine kurze Zeit aufleuchtet. Dabei handelt es sich praktisch um einen Sonderfall einer [[LED-Matrix]] mit nur einer Zeile. Die vier Anzeigen können sich dadurch die einzelnen Segmentleitungen teilen und alles was benötigt wird sind 4 zusätzliche Steuerleitungen für die 4 Anzeigen, mit denen jeweils eine Anzeige eingeschaltet wird. Dieses Ein/Ausschalten wird mit einem pnp-Transistor in der Versorgungsspannung jeder Anzeige realisiert, die vom Mega8 am &#039;&#039;&#039;PortC&#039;&#039;&#039; angesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Ein Aspekt dieser Ansteuerungsart ist die Multiplexfrequenz, also ein kompletter Zyklus das Weiterschaltens von einer Anzeige zur nächsten . Sie muss hoch genug sein, um ein Flimmern der Anzeige zu vermeiden. Das menschliche Auge ist träge, im Kino reichen 24 Bilder pro Sekunde, beim Fernseher sind es 50. Um auf der sicheren Seite zu sein, dass auch Standbilder ruhig wirken, sollen jedes Segment mit mindestens 100 Hz angesteuert werden, es also mindestens alle 10ms angeschaltet ist. In Ausnahmefällen können aber selbst 100 Hz noch flimmern, z.&amp;amp;nbsp;B. wenn die Anzeige schnell bewegt wird oder wenn es zu Interferenzerscheinungen mit künstlichen Lichtquellen kommt, die mit Wechselstrom betrieben werden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tut_7_Seg_03.gif | thumb|right|280px | Ansteuerung von vier 7-Segmentanzeigen per Zeit-Multiplex]]&lt;br /&gt;
Bei genauerer Betrachtung fällt auch auf, dass die vier Anzeigen nicht mehr ganz so hell leuchten wie die eine einzelne Anzeige ohne Multiplexen. Bei wenigen Anzeigen ist dies praktisch kaum sichtbar, erst bei mehreren Anzeigen wird es deutlich. Um dem entgegen zu wirken lässt man pro Segment einfach mehr Strom fließen, bei LEDs dürfen dann 20mA überschritten werden. Als Faustregel gilt, dass der n-fache Strom für die (1/n)-fache Zeit fließen darf. Details finden sich im Datenblatt unter dem Punkt &#039;&#039;&#039;Peak-Current&#039;&#039;&#039; (Spitzenstrom) und &#039;&#039;&#039;Duty-Cycle&#039;&#039;&#039; ([[PWM|Tastverhältnis]]).&lt;br /&gt;
 &lt;br /&gt;
Allerdings gibt es noch ein anderes Problem wenn insgesamt zu viele Anzeigen gemultiplext werden. Die Pulsströme durch die LEDs werden einfach zu hoch. Die meisten LEDs kann man bis 8:1 multiplexen, manchmal auch bis 16:1. Hier fliesst aber schon ein Pulsstrom von 320mA (16 x 20mA), was nicht mehr ganz ungefährlich ist. &#039;&#039;&#039;Strom lässt sich durch Multiplexen nicht sparen&#039;&#039;&#039;, denn die verbrauchte Leistung ändert sich beim n-fachen Strom für 1/n der Zeit nicht. Kritisch wird es aber, wenn das Multiplexen deaktiviert wird (Ausfall der Ansteuerung durch Hardware- oder Softwarefehler) und der n-fache Strom dauerhaft durch eine Segment-LED fließt. Bei 320mA werden die meisten LEDs innerhalb von Sekunden zerstört. Hier muss sichergestellt werden, dass sowohl Programm (Breakpoint im Debugger) als auch Schaltung (Reset, Power-On, [http://www.mikrocontroller.net/topic/107941]) diesen Fall verhindern. Prinzipiell sollte man immer den Pulsstrom und die Multiplexfrequenz einmal überschlagen, bevor der Lötkolben angeworfen wird.&lt;br /&gt;
&lt;br /&gt;
Sollten die Anzeigen zu schwach leuchten so können, wie bereits beschrieben, die Ströme durch die Anzeigen erhöht werden. Dazu werden die 330Ω Widerstände kleiner gemacht. Da hier 4 Anzeigen gemultiplext werden, würden sich Widerstände in der Größenordnung von 100Ω anbieten. Auch muss dann der Basiswiderstand der Transistoren verkleinert werden. Auch muss berücksichtigt werden, dass der Mega8 in Summe an seinen Portpins und an den Versorgungsleitungen nicht beliebig viel Strom liefern oder abführen kann. Auch hier ist daher wieder ein Blick ins Datenblatt angebracht und gegebenenfalls muss wieder ein Transistor als Verstärker eingesetzt werden (oder eben fertige Treiberstufen in IC-Form).&lt;br /&gt;
&lt;br /&gt;
===Programm===&lt;br /&gt;
&lt;br /&gt;
Das folgende Programm zeigt eine Möglichkeit zum Multiplexen. Dazu wird ein Timer benutzt, der in regelmässigen Zeitabständen einen Overflow [[Interrupt]] auslöst. Innerhalb der Overflow Interrupt Routine wird&lt;br /&gt;
* die momentan erleuchtete Anzeige abgeschaltet&lt;br /&gt;
* das Muster für die nächste Anzeige am Port D ausgegeben&lt;br /&gt;
* die nächste Anzeige durch eine entsprechende Ausgabe am Port C eingeschaltet&lt;br /&gt;
&lt;br /&gt;
Da Interruptfunktionen kurz sein sollten, holt die Interrupt Routine das auszugebende Muster für jede Stelle direkt aus dem SRAM, wo sie die Ausgabefunktion hinterlassen hat. Dies hat 2 Vorteile:&lt;br /&gt;
* Zum einen braucht die Interrupt Routine die Umrechnung einer Ziffer in das entsprechende Bitmuster nicht selbst machen&lt;br /&gt;
* Zum anderen ist die Anzeigefunktion dadurch unabhängig von dem was angezeigt wird. Die Interrupt Routine gibt das Bitmuster so aus, wie sie es aus dem SRAM liest. Werden die SRAM Zellen mit geeigneten Bitmustern gefüllt, können so auch einige Buchstaben oder Balkengrafik oder auch kleine Balken-Animationen abgespielt werden. Insbesondere letzteres sieht man manchmal bei Consumer-Geräten kurz nach dem Einschalten des Gerätes um eine Art Defektkontrolle zu ermöglichen oder einfach nur als optischer Aufputz.&lt;br /&gt;
&lt;br /&gt;
Die Funktion out_number ist in einer ähnlichen Form auch schon an anderer Stelle vorgekommen: Sie verwendet die Technik der fortgesetzten Subtraktionen um eine Zahl in einzelne Ziffern zu zerlegen. Sobald jede Stelle feststeht, wird über die Codetabelle das Bitmuster aufgesucht, welches für die Interrupt Funktion an der entsprechenden Stelle im SRAM abgelegt wird.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung&#039;&#039;&#039;: Anders als bei der weiter oben gezeigten Variante wurde die Codetabelle ohne Padding Bytes angelegt. Dadurch ist es auch nicht notwendig derartige Padding Bytes in der Programmierung zu berücksichtigen.&lt;br /&gt;
&lt;br /&gt;
Der Rest ist wieder die übliche Portinitialisierung, Timerinitialisierung und eine einfache Anwendung, indem ein 16 Bit Zähler laufend erhöht und über die Funktion out_number ausgegeben wird. Wie schon im ersten Beispiel, wurde auch hier kein Aufwand getrieben: Zähler um 1 erhöhen und mit Warteschleifen eine gewisse Verzögerungszeit einhalten. In einer realen Applikation wird man das natürlich nicht so machen, sondern ebenfalls einen Timer für diesen Teilaspekt der Aufgabenstellung einsetzen.&lt;br /&gt;
&lt;br /&gt;
Weiterhin ist auch noch interessant. Die Overflow Interrupt Funktion ist wieder so ausgelegt, dass sie völlig transparent zum restlichen Programm ablaufen kann. Dies bedeutet, dass alle verwendeten Register beim Aufruf der Interrupt Funktion gesichert und beim Verlassen wiederhergestellt werden. Dadurch ist man auf der absolut sicheren Seite, hat aber den Nachteil etwas Rechenzeit für manchmal unnötige Sicherungs- und Aufräumarbeiten zu &#039;verschwenden&#039;. Stehen genug freie Register zur Verfügung, dann wird man natürlich diesen Aufwand nicht treiben, sondern ein paar Register ausschließlich für die Zwecke der Behandlung der 7-Segment Anzeige abstellen und sich damit den Aufwand der Registersicherung sparen (mit Ausnahme von &#039;&#039;&#039;SREG&#039;&#039;&#039; natürlich!).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
.def temp  = r16&lt;br /&gt;
.def temp1 = r17&lt;br /&gt;
.def temp2 = r18&lt;br /&gt;
&lt;br /&gt;
.org 0x0000&lt;br /&gt;
           rjmp    main                ; Reset Handler&lt;br /&gt;
.org OVF0addr&lt;br /&gt;
           rjmp    multiplex&lt;br /&gt;
&lt;br /&gt;
;&lt;br /&gt;
;********************************************************************&lt;br /&gt;
; Die Multiplexfunktion&lt;br /&gt;
;&lt;br /&gt;
; Aufgabe dieser Funktion ist es, bei jedem Durchlauf eine andere Stelle&lt;br /&gt;
; der 7-Segmentanzeige zu aktivieren und das dort vorgesehene Muster&lt;br /&gt;
; auszugeben&lt;br /&gt;
; Die Funktion wird regelmässig in einem Timer Interrupt aufgerufen&lt;br /&gt;
;&lt;br /&gt;
; verwendet werden 6 Bytes im SRAM (siehe .DSEG weiter unten im Programm)&lt;br /&gt;
;    NextDigit    Bitmuster für die Aktivierung des nächsten Segments&lt;br /&gt;
;    NextSegment  Nummer des nächsten aktiven Segments&lt;br /&gt;
;    Segment0     Ausgabemuster für Segment 0&lt;br /&gt;
;    Segment1     Ausgabemuster für Segment 1&lt;br /&gt;
;    Segment2     Ausgabemuster für Segment 2&lt;br /&gt;
;    Segment3     Ausgabemuster für Segment 3&lt;br /&gt;
;&lt;br /&gt;
; NextSegment ist einfach nur ein Zähler, der bei jedem Aufruf der Funktion&lt;br /&gt;
;   um 1 weitergezählt wird und bei 4 wieder auf 0 zurückgestellt wird.&lt;br /&gt;
;   er wird benutzt, um ausgehend von der Adresse von Segment0, auf das&lt;br /&gt;
;   jeweils als nächstes auszugebende Muster aus Segement0, Segment1,&lt;br /&gt;
;   Segment2 oder Segment3 zuzugreifen. Die Adresse von Segment0 wird&lt;br /&gt;
;   in den Z-Pointer geladen und NextSegment addiert.&lt;br /&gt;
;&lt;br /&gt;
; NextDigit enthält das Bitmuster, welches direkt an den Port C ausgegeben&lt;br /&gt;
;   wird und den jeweils nächsten Transistor durchschaltet.&lt;br /&gt;
;   Dazu enthält NextDigit am Anfang das Bitmuster 0b11111110, welches&lt;br /&gt;
;   bei jedem Aufruf um 1 Stelle nach links verschoben wird. Beim nächsten&lt;br /&gt;
;   Aufruf findet sich dann 0b11111101 in NextDigit, dann 0b11111011 und&lt;br /&gt;
;   zu guter letzt 0b11110111. Wird beim nächsten Schiebevorgang 0b11101111&lt;br /&gt;
;   erkannt, dann wird NextDigit auf 0b11111110 zurückgesetzt (und NextSegment&lt;br /&gt;
;   auf 0) und das ganze Spiel beginnt beim nächsten Funktionsaufruf wieder&lt;br /&gt;
;   von vorne.&lt;br /&gt;
;&lt;br /&gt;
; Segment0 .. 3  enthalten die auszugebenden Bitmuster für die Einzelleds&lt;br /&gt;
;   der jeweiligen 7-Segment Anzeigen. Diese Muster werden so wie sie sind&lt;br /&gt;
;   einfach ausgegeben. Soll eine der Anzeigen etwas bestimmtes anzeigen&lt;br /&gt;
;   (zb eine Ziffer), so obliegt es dem Code, der Werte in diese SRAM&lt;br /&gt;
;   Zellen schreibt, das dafür zuständige Bitmuster dort zu hinterlassen.&lt;br /&gt;
;   Die Multiplexroutine kümmert sich nicht darum, dass diese Bitmuster&lt;br /&gt;
;   in irgendeiner Art und Weise sinnvoll (oder was man dafür halten könnte)&lt;br /&gt;
;   sind.&lt;br /&gt;
;&lt;br /&gt;
; veränderte CPU-Register: keine&lt;br /&gt;
;&lt;br /&gt;
multiplex:&lt;br /&gt;
           push    temp                ; Alle verwendeten Register sichern&lt;br /&gt;
           push    temp1&lt;br /&gt;
           in      temp, SREG&lt;br /&gt;
           push    temp&lt;br /&gt;
           push    ZL&lt;br /&gt;
           push    ZH&lt;br /&gt;
&lt;br /&gt;
           ldi     temp1, 0            ; Die 7 Segment ausschalten&lt;br /&gt;
           out     PORTC, temp1&lt;br /&gt;
&lt;br /&gt;
                                       ; Das Muster für die nächste Stelle ausgeben&lt;br /&gt;
                                       ; Dazu zunächst mal berechnen, welches Segment als&lt;br /&gt;
                                       ; nächstest ausgegeben werden muss&lt;br /&gt;
           ldi     ZL, LOW( Segment0 ) &lt;br /&gt;
           ldi     ZH, HIGH( Segment0 )&lt;br /&gt;
           lds     temp, NextSegment&lt;br /&gt;
           add     ZL, temp&lt;br /&gt;
           adc     ZH, temp1&lt;br /&gt;
&lt;br /&gt;
           ld      temp, Z             ; das entsprechende Muster holen und ausgeben&lt;br /&gt;
           out     PORTD, temp&lt;br /&gt;
&lt;br /&gt;
           lds     temp1, NextDigit    ; Und die betreffende Stelle einschalten&lt;br /&gt;
           out     PORTC, temp1&lt;br /&gt;
&lt;br /&gt;
           lds     temp, NextSegment&lt;br /&gt;
           inc     temp&lt;br /&gt;
           sec&lt;br /&gt;
           rol     temp1               ; beim nächsten Interrupt kommt reihum die&lt;br /&gt;
           cpi     temp1, 0b11101111   ; nächste Stelle dran.&lt;br /&gt;
           brne    multi1&lt;br /&gt;
           ldi     temp, 0&lt;br /&gt;
           ldi     temp1, 0b11111110&lt;br /&gt;
&lt;br /&gt;
multi1:&lt;br /&gt;
           sts     NextSegment, temp&lt;br /&gt;
           sts     NextDigit, temp1&lt;br /&gt;
&lt;br /&gt;
           pop     ZH                  ; die gesicherten Register wiederherstellen&lt;br /&gt;
           pop     ZL&lt;br /&gt;
           pop     temp&lt;br /&gt;
           out     SREG, temp&lt;br /&gt;
           pop     temp1&lt;br /&gt;
           pop     temp&lt;br /&gt;
           reti&lt;br /&gt;
;&lt;br /&gt;
;************************************************************************&lt;br /&gt;
; 16 Bit-Zahl aus dem Registerpaar temp (=low), temp1 (=high) ausgeben&lt;br /&gt;
; die Zahl muss kleiner als 10000 sein, da die Zehntausenderstelle&lt;br /&gt;
; nicht berücksichtigt wird.&lt;br /&gt;
; Werden mehr als 4 7-Segmentanzeigen eingesetzt, dann muss dies&lt;br /&gt;
; natürlich auch hier berücksichtigt werden&lt;br /&gt;
;&lt;br /&gt;
out_number:&lt;br /&gt;
           push    temp&lt;br /&gt;
           push    temp1&lt;br /&gt;
&lt;br /&gt;
           ldi     temp2, -1            ; Die Tausenderstelle bestimmen&lt;br /&gt;
_out_tausend:&lt;br /&gt;
           inc     temp2&lt;br /&gt;
           subi    temp, low(1000)      ; -1000&lt;br /&gt;
           sbci    temp1, high(1000)&lt;br /&gt;
           brcc    _out_tausend&lt;br /&gt;
&lt;br /&gt;
           ldi     ZL, low(2*Codes)     ; fuer diese Ziffer das Codemuster fuer&lt;br /&gt;
           ldi     ZH, high(2*Codes)    ; die Anzeige in der Codetabelle nachschlagen&lt;br /&gt;
           add     ZL, temp2&lt;br /&gt;
&lt;br /&gt;
           lpm&lt;br /&gt;
           sts     Segment3, r0         ; und dieses Muster im SRAM ablegen&lt;br /&gt;
                                        ; die OvI Routine sorgt dann duer die Anzeige&lt;br /&gt;
           ldi     temp2, 10&lt;br /&gt;
&lt;br /&gt;
_out_hundert:                           ; die Hunderterstelle bestimmen&lt;br /&gt;
           dec     temp2                &lt;br /&gt;
           subi    temp, low(-100)      ; +100&lt;br /&gt;
           sbci    temp1, high(-100)&lt;br /&gt;
           brcs    _out_hundert&lt;br /&gt;
&lt;br /&gt;
           ldi     ZL, low(2*Codes)     ; wieder in der Codetabelle das entsprechende&lt;br /&gt;
           ldi     ZH, high(2*Codes)    ; Muster nachschlagen&lt;br /&gt;
           add     ZL, temp2&lt;br /&gt;
&lt;br /&gt;
           lpm&lt;br /&gt;
           sts     Segment2, r0         ; und im SRAM hinterlassen&lt;br /&gt;
&lt;br /&gt;
           ldi     temp2, -1&lt;br /&gt;
_out_zehn:                              ; die Zehnerstelle bestimmen&lt;br /&gt;
           inc     temp2&lt;br /&gt;
           subi    temp, low(10)        ; -10&lt;br /&gt;
           sbci    temp1, high(10)&lt;br /&gt;
           brcc    _out_zehn&lt;br /&gt;
&lt;br /&gt;
           ldi     ZL, low(2*Codes)     ; wie gehabt: Die Ziffer in der Codetabelle&lt;br /&gt;
           ldi     ZH, high(2*Codes)    ; aufsuchen&lt;br /&gt;
           add     ZL, temp2&lt;br /&gt;
&lt;br /&gt;
           lpm&lt;br /&gt;
           sts     Segment1, r0         ; und entsprechend im SRAM ablegen&lt;br /&gt;
&lt;br /&gt;
_out_einer:                             ; bleiben noch die Einer&lt;br /&gt;
           subi    temp, low(-10)       ; +10&lt;br /&gt;
           sbci    temp1, high(-10)&lt;br /&gt;
&lt;br /&gt;
           ldi     ZL, low(2*Codes)     ; ... Codetabelle&lt;br /&gt;
           ldi     ZH, high(2*Codes)&lt;br /&gt;
           add     ZL, temp&lt;br /&gt;
&lt;br /&gt;
           lpm&lt;br /&gt;
           sts     Segment0, r0         ; und ans SRAm ausgeben&lt;br /&gt;
&lt;br /&gt;
           pop     temp1&lt;br /&gt;
           pop     temp&lt;br /&gt;
&lt;br /&gt;
           ret&lt;br /&gt;
;&lt;br /&gt;
;**************************************************************************&lt;br /&gt;
;&lt;br /&gt;
main:&lt;br /&gt;
           ldi     temp, HIGH(RAMEND)&lt;br /&gt;
           out     SPH, temp&lt;br /&gt;
           ldi     temp, LOW(RAMEND)  ; Stackpointer initialisieren&lt;br /&gt;
           out     SPL, temp&lt;br /&gt;
;                                     die Segmenttreiber initialisieren&lt;br /&gt;
           ldi     temp, $FF&lt;br /&gt;
           out     DDRD, temp&lt;br /&gt;
;                                     die Treiber für die einzelnen Stellen&lt;br /&gt;
           ldi     temp, $0F&lt;br /&gt;
           out     DDRC, temp&lt;br /&gt;
;                                     initialisieren der Steuerung für die&lt;br /&gt;
;                                     Interrupt Routine&lt;br /&gt;
           ldi     temp, 0b11111110&lt;br /&gt;
           sts     NextDigit, temp&lt;br /&gt;
&lt;br /&gt;
           ldi     temp, 0&lt;br /&gt;
           sts     NextSegment, temp&lt;br /&gt;
&lt;br /&gt;
           ldi     temp, ( 1 &amp;lt;&amp;lt; CS01 ) | ( 1 &amp;lt;&amp;lt; CS00 )&lt;br /&gt;
           out     TCCR0, temp&lt;br /&gt;
&lt;br /&gt;
           ldi     temp, 1 &amp;lt;&amp;lt; TOIE0&lt;br /&gt;
           out     TIMSK, temp&lt;br /&gt;
&lt;br /&gt;
           sei&lt;br /&gt;
&lt;br /&gt;
           ldi     temp, 0&lt;br /&gt;
           ldi     temp1, 0&lt;br /&gt;
&lt;br /&gt;
loop:&lt;br /&gt;
           inc     temp&lt;br /&gt;
           brne    _loop&lt;br /&gt;
           inc     temp1&lt;br /&gt;
_loop:&lt;br /&gt;
           rcall    out_number&lt;br /&gt;
&lt;br /&gt;
           cpi     temp, low( 4000 )&lt;br /&gt;
           brne    wait&lt;br /&gt;
           cpi     temp1, high( 4000 )&lt;br /&gt;
           brne    wait&lt;br /&gt;
&lt;br /&gt;
           ldi     temp, 0&lt;br /&gt;
           ldi     temp1, 0&lt;br /&gt;
&lt;br /&gt;
wait:      ldi     r21, 1&lt;br /&gt;
wait0:     ldi     r22, 0&lt;br /&gt;
wait1:     ldi     r23, 0&lt;br /&gt;
wait2:     dec     r23&lt;br /&gt;
           brne    wait2&lt;br /&gt;
           dec     r22&lt;br /&gt;
           brne    wait1&lt;br /&gt;
           dec     r21&lt;br /&gt;
           brne    wait0&lt;br /&gt;
&lt;br /&gt;
           rjmp    loop&lt;br /&gt;
&lt;br /&gt;
Codes:&lt;br /&gt;
    .db  0b11000000, 0b11111001     ; 0: a, b, c, d, e, f&lt;br /&gt;
                                    ; 1: b, c&lt;br /&gt;
    .db  0b10100100, 0b10110000     ; 2: a, b, d, e, g&lt;br /&gt;
                                    ; 3: a, b, c, d, g&lt;br /&gt;
    .db  0b10011001, 0b10010010     ; 4: b, c, f, g&lt;br /&gt;
                                    ; 5: a, c, d, f, g&lt;br /&gt;
    .db  0b10000010, 0b11111000     ; 6: a, c, d, e, f, g&lt;br /&gt;
                                    ; 7: a, b, c&lt;br /&gt;
    .db  0b10000000, 0b10010000     ; 8: a, b, c, d, e, f, g&lt;br /&gt;
                                    ; 9: a, b, c, d, f, g &lt;br /&gt;
&lt;br /&gt;
           .DSEG&lt;br /&gt;
NextDigit:   .byte 1         ; Bitmuster für die Aktivierung des nächsten Segments&lt;br /&gt;
NextSegment: .byte 1         ; Nummer des nächsten aktiven Segments&lt;br /&gt;
Segment0:    .byte 1         ; Ausgabemuster für Segment 0&lt;br /&gt;
Segment1:    .byte 1         ; Ausgabemuster für Segment 1&lt;br /&gt;
Segment2:    .byte 1         ; Ausgabemuster für Segment 2&lt;br /&gt;
Segment3:    .byte 1         ; Ausgabemuster für Segment 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Forenbeiträge ==&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/154257 Geisterleuchten bei 7-Segment Anzeige]&lt;br /&gt;
&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/262337#2736074 Re: Zehn 7Segmente im Multiplexbetrieb : Hilfe !] - Ausführliche Erklärung wie und warum man entweder die &#039;&#039;&#039;Stellen&#039;&#039;&#039; oder die &#039;&#039;&#039;Segmente&#039;&#039;&#039; multiplext.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{{Navigation_zurückhochvor|&lt;br /&gt;
zurücktext=SRAM|&lt;br /&gt;
zurücklink=AVR-Tutorial: SRAM|&lt;br /&gt;
hochtext=Inhaltsverzeichnis|&lt;br /&gt;
hochlink=AVR-Tutorial|&lt;br /&gt;
vortext=Servos|&lt;br /&gt;
vorlink=AVR-Tutorial: Servo}}&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR-Tutorial|7-Segment-Anzeige]]&lt;br /&gt;
[[Category:Displays und Anzeigen]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=MOSFET-%C3%9Cbersicht&amp;diff=83566</id>
		<title>MOSFET-Übersicht</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=MOSFET-%C3%9Cbersicht&amp;diff=83566"/>
		<updated>2014-07-10T19:28:33Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Änderung 83565 von 68.77.171.20 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Im Forum wird immer wieder gefragt, welchen Mosfet-Transistor man für ein Projekt einsetzen sollte. Und wo man die herbekommt. Deshalb soll hier eine Übersicht mit gängigen Mosfet-Transistoren entstehen, wo auch die Bezugsquellen angegeben sind. Bezugsquellen sollten nach Möglichkeit solche sein, die auch für den privaten Bastler in Frage kommen.&lt;br /&gt;
&lt;br /&gt;
Der Thread zum Thema: http://www.mikrocontroller.net/topic/41588&lt;br /&gt;
&lt;br /&gt;
siehe auch : [[Transistor-Übersicht]] - [[Dioden-Übersicht]] - [[Standardbauelemente]]&lt;br /&gt;
&lt;br /&gt;
== P-Kanal MOSFET==&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;pkanalmosfets&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Package&lt;br /&gt;
! Hersteller&lt;br /&gt;
! U&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;/V&lt;br /&gt;
! U&amp;lt;sub&amp;gt;DS&amp;lt;/sub&amp;gt;/V&lt;br /&gt;
! I&amp;lt;sub&amp;gt;D&amp;lt;/sub&amp;gt;/A&lt;br /&gt;
! P/W&lt;br /&gt;
! R&amp;lt;sub&amp;gt;DS,on&amp;lt;/sub&amp;gt;/mOhm&lt;br /&gt;
! Bemerkung&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Einzelpreis&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BS250 BS250]&lt;br /&gt;
| TO-92/SOT-23&lt;br /&gt;
| Siliconix&lt;br /&gt;
| 4,0&lt;br /&gt;
| 60&lt;br /&gt;
| 0,12&lt;br /&gt;
| 0,35&lt;br /&gt;
| 10000&lt;br /&gt;
| -&lt;br /&gt;
|[[Elektronikversender#Reichelt|Rei]],[[Elektronikversender#Buerklin|Bü]]&lt;br /&gt;
| 0,32 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BSH205 BSH205]&lt;br /&gt;
| SOT23&lt;br /&gt;
| Phi&lt;br /&gt;
| 1,0&lt;br /&gt;
| 12&lt;br /&gt;
| 0,75&lt;br /&gt;
| 0,4&lt;br /&gt;
| 500&lt;br /&gt;
| kleine Gatekapazität (3.8nC)&lt;br /&gt;
| [[Elektronikversender#csd-electronics|csd]] (a.A.)&lt;br /&gt;
| 0,30 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/SI2301 SI2301]&lt;br /&gt;
| SOT23&lt;br /&gt;
| Vishay&lt;br /&gt;
| 1,5&lt;br /&gt;
| 20&lt;br /&gt;
| 2,0&lt;br /&gt;
| 0,7&lt;br /&gt;
| 150&lt;br /&gt;
| kleine Gatekapazität (typ 4.5nC)&lt;br /&gt;
| [[Elektronikversender#farnell|farnell]]&lt;br /&gt;
| 0,30 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRLML6402  IRLML6402PBF]&lt;br /&gt;
| SOT23&lt;br /&gt;
| IRF&lt;br /&gt;
| 1,2&lt;br /&gt;
| 20&lt;br /&gt;
| 3,7&lt;br /&gt;
| 1,3&lt;br /&gt;
| 65&lt;br /&gt;
| Ultra-Low On-Resistance, Logic-level&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]],[[Elektronikversender#csd-electronics|csd]],[[Elektronikversender#Buerklin|Bü]]&lt;br /&gt;
| 0,15 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRLML6302  IRLML6302PBF]&lt;br /&gt;
| SOT23&lt;br /&gt;
| IRF&lt;br /&gt;
| 1,5&lt;br /&gt;
| 20&lt;br /&gt;
| 0,75&lt;br /&gt;
| 0,54&lt;br /&gt;
| 600&lt;br /&gt;
| ähnlich BSH205&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]],[[Elektronikversender#csd-electronics|csd]],[[Elektronikversender#Buerklin|Bü]]&lt;br /&gt;
| 0,18 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BSS83P BSS83P]&lt;br /&gt;
| SOT23&lt;br /&gt;
| Inf&lt;br /&gt;
| 2,0&lt;br /&gt;
| 60&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,36&lt;br /&gt;
| 2000&lt;br /&gt;
| nicht mit BSS83 (ohne P) verwechseln&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,11 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BSS84 BSS84]&lt;br /&gt;
| SOT23&lt;br /&gt;
| Fairchild,NXP&lt;br /&gt;
| 2,0&lt;br /&gt;
| 50&lt;br /&gt;
| 0,13&lt;br /&gt;
| 0,35&lt;br /&gt;
| 10000&lt;br /&gt;
| -&lt;br /&gt;
| [[Elektronikversender#Farnell|Fa]]&lt;br /&gt;
| 0,28 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BSS110 BSS110]&lt;br /&gt;
| TO-97, SOT23&lt;br /&gt;
| Phi&lt;br /&gt;
| 3,0&lt;br /&gt;
| 50&lt;br /&gt;
| 0,17&lt;br /&gt;
| 0,35&lt;br /&gt;
| 10000&lt;br /&gt;
| -&lt;br /&gt;
| ?&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/PMV65XP PMV65XP]&lt;br /&gt;
| SOT23&lt;br /&gt;
| Phi&lt;br /&gt;
| 1,4&lt;br /&gt;
| 20&lt;br /&gt;
| 3,9&lt;br /&gt;
| ?&lt;br /&gt;
| 76&lt;br /&gt;
| grosser ID für Bauform&lt;br /&gt;
| [[Elektronikversender#Spoerle|Spo]], [[Elektronikversender#RS_Components|RS]]&lt;br /&gt;
| 0,10 € (3000er-Rolle)&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF4905S IRF4905S]&lt;br /&gt;
| D2Pack&lt;br /&gt;
| irf&lt;br /&gt;
| 4,0&lt;br /&gt;
| 55&lt;br /&gt;
| 64&lt;br /&gt;
| 3,8&lt;br /&gt;
| 20&lt;br /&gt;
| -&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]], [[Elektronikversender#Conrad|Con]]&lt;br /&gt;
| 1,10 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF4905 IRF4905]&lt;br /&gt;
| TO-220AB&lt;br /&gt;
| irf&lt;br /&gt;
| 4,0&lt;br /&gt;
| 55&lt;br /&gt;
| 74&lt;br /&gt;
| 3,8&lt;br /&gt;
| 20&lt;br /&gt;
| -&lt;br /&gt;
|[[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,93 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF5210 IRF5210]&lt;br /&gt;
| TO-220AB&lt;br /&gt;
| irf&lt;br /&gt;
| 10,0&lt;br /&gt;
| 100&lt;br /&gt;
| 40&lt;br /&gt;
| 200&lt;br /&gt;
| 60&lt;br /&gt;
| -&lt;br /&gt;
|[[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 1,15 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF5210S IRF5210S]&lt;br /&gt;
| D2Pack&lt;br /&gt;
| irf&lt;br /&gt;
| 10,0&lt;br /&gt;
| 100&lt;br /&gt;
| 40&lt;br /&gt;
| ?&lt;br /&gt;
| 60&lt;br /&gt;
| -&lt;br /&gt;
|[[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 1,25 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF7205 IRF7205]&lt;br /&gt;
| SO-8&lt;br /&gt;
| irf&lt;br /&gt;
| 3,0&lt;br /&gt;
| 30&lt;br /&gt;
| 4,6&lt;br /&gt;
| 2,5&lt;br /&gt;
| 70&lt;br /&gt;
| ?&lt;br /&gt;
|[[Elektronikversender#Reichelt|Rei]] &lt;br /&gt;
| 0,34 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/FDC604P FDC604P]&lt;br /&gt;
| SuperSOT-6&lt;br /&gt;
| Fairchild&lt;br /&gt;
| 1,5&lt;br /&gt;
| 20&lt;br /&gt;
| 5,5&lt;br /&gt;
| 0,8-1,6&lt;br /&gt;
| 33&lt;br /&gt;
| -&lt;br /&gt;
| [[Elektronikversender#csd-electronics|csd]] (a.A.)&lt;br /&gt;
| 0,70 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/NDS0610 NDS0610]&lt;br /&gt;
| SOT-23&lt;br /&gt;
| Fairchild&lt;br /&gt;
| 1,8&lt;br /&gt;
| 60&lt;br /&gt;
| 0,12&lt;br /&gt;
| 0,36&lt;br /&gt;
| 10000&lt;br /&gt;
| -&lt;br /&gt;
| [[Elektronikversender#csd-electronics|csd]]&lt;br /&gt;
| 0,07 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF5305 IRF5305]&lt;br /&gt;
| TO-220AB&lt;br /&gt;
| irf&lt;br /&gt;
| 3,0&lt;br /&gt;
| 55&lt;br /&gt;
| 31&lt;br /&gt;
| 110&lt;br /&gt;
| 60&lt;br /&gt;
| -&lt;br /&gt;
|[[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,59 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/NDS352P NDS352P]&lt;br /&gt;
| SOT23&lt;br /&gt;
| Fairchild&lt;br /&gt;
| 4,5&lt;br /&gt;
| 20&lt;br /&gt;
| 0,85&lt;br /&gt;
| 0,5&lt;br /&gt;
| 500&lt;br /&gt;
| -&lt;br /&gt;
| [[Elektronikversender#Conrad|Con]]&lt;br /&gt;
| 0,76 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BSP171 BSP171]&lt;br /&gt;
| SOT-223&lt;br /&gt;
| Siemens&lt;br /&gt;
| 1,4&lt;br /&gt;
| 60&lt;br /&gt;
| 1,7&lt;br /&gt;
| 1,8&lt;br /&gt;
| 350&lt;br /&gt;
| -&lt;br /&gt;
|[-]&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRFD9014 IRFD9014]&lt;br /&gt;
| HEXDIP/DIP4&lt;br /&gt;
| irf&lt;br /&gt;
| 2,0&lt;br /&gt;
| 60&lt;br /&gt;
| 1,1&lt;br /&gt;
| 1,3&lt;br /&gt;
| 500&lt;br /&gt;
| -&lt;br /&gt;
| [[Elektronikversender#Conrad|Con]]&lt;br /&gt;
| 0,65 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRFD9024 IRFD9024]&lt;br /&gt;
| HEXDIP/DIP4&lt;br /&gt;
| irf&lt;br /&gt;
| 2,0&lt;br /&gt;
| 60&lt;br /&gt;
| 1,6&lt;br /&gt;
| 1,3&lt;br /&gt;
| 280&lt;br /&gt;
| -&lt;br /&gt;
| [[Elektronikversender#Conrad|Con]],[[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,50 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF7416 IRF7416]&lt;br /&gt;
| SO-8&lt;br /&gt;
| irf&lt;br /&gt;
| 1,0&lt;br /&gt;
| 30&lt;br /&gt;
| 10&lt;br /&gt;
| 2,5&lt;br /&gt;
| 20&lt;br /&gt;
| -&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]],[[Elektronikversender#Conrad|Con]]&lt;br /&gt;
| 0,43 € / 0,60 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/SUP75P03 SUP75P03-007]&lt;br /&gt;
| TO-220AB&lt;br /&gt;
| VISHAY&lt;br /&gt;
| 3,0&lt;br /&gt;
| 30&lt;br /&gt;
| 75&lt;br /&gt;
| 187&lt;br /&gt;
| 7&lt;br /&gt;
| -&lt;br /&gt;
| nessel-elektronik.de&lt;br /&gt;
| 2,30 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF7220 IRF7220]&lt;br /&gt;
| SO-8&lt;br /&gt;
| irf&lt;br /&gt;
| 0,6&lt;br /&gt;
| 14&lt;br /&gt;
| 11&lt;br /&gt;
| 2,5&lt;br /&gt;
| 8,2&lt;br /&gt;
| spezifiziert ab 2,5V Vgs, Qg=84nC&lt;br /&gt;
| [[Elektronikversender#Conrad|Con]], [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,58 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF7410 IRF7410]&lt;br /&gt;
| SO-8&lt;br /&gt;
| irf&lt;br /&gt;
| 0,4...0,9&lt;br /&gt;
| 12&lt;br /&gt;
| 16&lt;br /&gt;
| 2,5&lt;br /&gt;
| 7&lt;br /&gt;
| spezifiziert ab 1,8V Vgs, Qg=91nC &lt;br /&gt;
| distrelec.de&amp;lt;br/&amp;gt;[[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 1,80 €&amp;lt;br/&amp;gt;0,85 €&lt;br /&gt;
|-&lt;br /&gt;
| AOC2413&lt;br /&gt;
| MCSP&lt;br /&gt;
| Alpha&amp;amp;Omega&lt;br /&gt;
| 0,42&lt;br /&gt;
| 8&lt;br /&gt;
| 3,5&lt;br /&gt;
| 0,55&lt;br /&gt;
| 28&lt;br /&gt;
| spezifiziert ab 1,2V Vgs, Qg=19nC &lt;br /&gt;
| Digikey&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(Tabelle mit Click im Kopfbereich sortierbar; a.A. = Auf Anfrage)&lt;br /&gt;
&lt;br /&gt;
== N-Kanal MOSFET==&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;nkanalmosfets&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Package&lt;br /&gt;
! Hersteller&lt;br /&gt;
! U&amp;lt;sub&amp;gt;GS(th)&amp;lt;/sub&amp;gt;/V&lt;br /&gt;
! U&amp;lt;sub&amp;gt;DS&amp;lt;/sub&amp;gt;/V&lt;br /&gt;
! I&amp;lt;sub&amp;gt;D&amp;lt;/sub&amp;gt;/A&lt;br /&gt;
! P/W&lt;br /&gt;
! R&amp;lt;sub&amp;gt;DS,on&amp;lt;/sub&amp;gt;/mOhm&lt;br /&gt;
! Bemerkung&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Preis/EUR&lt;br /&gt;
|-&lt;br /&gt;
| IRFP 4310Z &lt;br /&gt;
| TO-247AC&lt;br /&gt;
| irf&lt;br /&gt;
| 2-4&lt;br /&gt;
| 100&lt;br /&gt;
| 120&lt;br /&gt;
| 280&lt;br /&gt;
| 4,8&lt;br /&gt;
| &lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 1,80&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRFP450 IRFP450]&lt;br /&gt;
| TO-247&lt;br /&gt;
| irf&lt;br /&gt;
| 3&lt;br /&gt;
| 500&lt;br /&gt;
| 14&lt;br /&gt;
| 190&lt;br /&gt;
| 400&lt;br /&gt;
| &lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 1,20&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF530 IRF530]&lt;br /&gt;
| TO-220&lt;br /&gt;
| irf&lt;br /&gt;
| 2,9&lt;br /&gt;
| 100&lt;br /&gt;
| 16&lt;br /&gt;
| 94&lt;br /&gt;
| 160&lt;br /&gt;
| Linearbetrieb möglich&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,44&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRL3103 IRL3103]&lt;br /&gt;
| TO-220AB&lt;br /&gt;
| irf&lt;br /&gt;
| 1,0&lt;br /&gt;
| 30&lt;br /&gt;
| 64&lt;br /&gt;
| 94&lt;br /&gt;
| 12&lt;br /&gt;
| Qg=33nC (!)&lt;br /&gt;
| [[Elektronikversender#Segor-electronics|Seg]]&lt;br /&gt;
| 0,95&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF730A IRF730A]&lt;br /&gt;
| TO-220AB&lt;br /&gt;
| irf&lt;br /&gt;
| 2,0&lt;br /&gt;
| 400&lt;br /&gt;
| 5,5&lt;br /&gt;
| 74&lt;br /&gt;
| 1000&lt;br /&gt;
| Qg=22nC (!)&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,54&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRFP064 IRFP064]&lt;br /&gt;
| TO-247AC&lt;br /&gt;
| irf&lt;br /&gt;
| 2,0&lt;br /&gt;
| 60&lt;br /&gt;
| 70&lt;br /&gt;
| 300&lt;br /&gt;
| 9&lt;br /&gt;
| Qg=190 nC&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 1,65&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF3205 IRF3205]&lt;br /&gt;
| TO-220AB&lt;br /&gt;
| irf&lt;br /&gt;
| 2,0&lt;br /&gt;
| 55&lt;br /&gt;
| 110&lt;br /&gt;
| 200&lt;br /&gt;
| 8&lt;br /&gt;
|&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,69&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRL3803 IRL3803]&lt;br /&gt;
| TO-220AB&lt;br /&gt;
| irf&lt;br /&gt;
| 1,0&lt;br /&gt;
| 30&lt;br /&gt;
| 140&lt;br /&gt;
| 200&lt;br /&gt;
| 6&lt;br /&gt;
| Qg=140nC&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,96&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF540 IRF540]&lt;br /&gt;
| TO-220AB&lt;br /&gt;
| irf&lt;br /&gt;
| 3&lt;br /&gt;
| 100&lt;br /&gt;
| 28&lt;br /&gt;
| 150&lt;br /&gt;
| 77&lt;br /&gt;
| Linearbetrieb möglich&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]],[[Elektronikversender#Kessler|Kes]]&lt;br /&gt;
| 0,52&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF7401 IRF7401]&lt;br /&gt;
| SO-8&lt;br /&gt;
| irf&lt;br /&gt;
| 2,7&lt;br /&gt;
| 20&lt;br /&gt;
| 8,7&lt;br /&gt;
| 2,0&lt;br /&gt;
| 22&lt;br /&gt;
| spezifiziert ab 2,7V Vgs&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,72&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF7403 IRF7403]&lt;br /&gt;
| SO-8&lt;br /&gt;
| irf&lt;br /&gt;
| 4,85&lt;br /&gt;
| 30&lt;br /&gt;
| 8,5&lt;br /&gt;
| 2,5&lt;br /&gt;
| 22&lt;br /&gt;
| &lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,42&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF7413 IRF7413]&lt;br /&gt;
| SO-8&lt;br /&gt;
| irf&lt;br /&gt;
| 3,0&lt;br /&gt;
| 30&lt;br /&gt;
| 13,0&lt;br /&gt;
| 2,5&lt;br /&gt;
| 11&lt;br /&gt;
| &lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]],[[Elektronikversender#Kessler|Kes]]&lt;br /&gt;
| 0,41&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BUZ11 BUZ11]&lt;br /&gt;
| TO-220&lt;br /&gt;
| ST&lt;br /&gt;
| 5,0&lt;br /&gt;
| 50&lt;br /&gt;
| 33,0&lt;br /&gt;
| 90,0&lt;br /&gt;
| 30&lt;br /&gt;
| Linearbetrieb möglich, Achtung! Der BUZ11 von STM hat deutlich niedrigere SOA-Grenzen als von anderen Herstellern!&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,50&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BSS83 BSS83]&lt;br /&gt;
| SOT143&lt;br /&gt;
| NXP&lt;br /&gt;
| 2,0&lt;br /&gt;
| 10&lt;br /&gt;
| 0,05&lt;br /&gt;
| 0,23&lt;br /&gt;
| 45000&lt;br /&gt;
| nicht mit BSS83&#039;&#039;&#039;P&#039;&#039;&#039; verwechseln, Substratanschluss herausgeführt&lt;br /&gt;
| [[Elektronikversender#RS_Components|RS]],[[Elektronikversender#TME_.28Transfer_Multisort_Elektronik.29|TME]]&lt;br /&gt;
| 0,10&lt;br /&gt;
|- &lt;br /&gt;
| [http://www.mikrocontroller.net/part/BS170 BS170]&lt;br /&gt;
| TO-92&lt;br /&gt;
&lt;br /&gt;
| gs&lt;br /&gt;
| 2,0&lt;br /&gt;
| 60&lt;br /&gt;
| 0,3&lt;br /&gt;
| 0,83&lt;br /&gt;
| 5000&lt;br /&gt;
| Linearbetrieb möglich&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,13&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BSN20 BSN20]&lt;br /&gt;
| SOT-23&lt;br /&gt;
| gs&lt;br /&gt;
| 1,8&lt;br /&gt;
| 50&lt;br /&gt;
| 0,18&lt;br /&gt;
| 0,35&lt;br /&gt;
| 6000&lt;br /&gt;
| Linearbetrieb möglich&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,092&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BSS138 BSS138]&lt;br /&gt;
| SOT-23&lt;br /&gt;
| div&lt;br /&gt;
| 0,8-1,6&lt;br /&gt;
| 50&lt;br /&gt;
| 0,22&lt;br /&gt;
| 0,36&lt;br /&gt;
| 2000&lt;br /&gt;
| Linearbetrieb möglich&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,06&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BSS123 BSS123]&lt;br /&gt;
| SOT-23&lt;br /&gt;
| div&lt;br /&gt;
| 0,8-1,6&lt;br /&gt;
| 100&lt;br /&gt;
| 0,17&lt;br /&gt;
| 0,36&lt;br /&gt;
| 10000 @ 4,5V, &lt;br /&gt;
| Linearbetrieb möglich&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,06&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRFP2907 IRFP2907]&lt;br /&gt;
| TO-247AC&lt;br /&gt;
| irf&lt;br /&gt;
| 4,0&lt;br /&gt;
| 75&lt;br /&gt;
| 209&lt;br /&gt;
| 470&lt;br /&gt;
| 4,5&lt;br /&gt;
|&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 2,70&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/2N7000 2N7000]&lt;br /&gt;
| TO-92&lt;br /&gt;
| ON&lt;br /&gt;
| 3,0&lt;br /&gt;
| 60&lt;br /&gt;
| 0,2&lt;br /&gt;
| 0,35&lt;br /&gt;
| 5000&lt;br /&gt;
| Linearbetrieb möglich&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]],[[Elektronikversender#Kessler|Kes]]&lt;br /&gt;
| 0,13&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BS107 BS107]&lt;br /&gt;
| TO-92&lt;br /&gt;
| ON, Phi&lt;br /&gt;
| 3,0&lt;br /&gt;
| 200&lt;br /&gt;
| 0,25&lt;br /&gt;
| 0,35&lt;br /&gt;
| 6400/14000&lt;br /&gt;
| Linearbetrieb möglich&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,18&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BS108 BS108]&lt;br /&gt;
| TO-92&lt;br /&gt;
| ON, Phi&lt;br /&gt;
| 2,0&lt;br /&gt;
| 200&lt;br /&gt;
| 0,25&lt;br /&gt;
| 0,35&lt;br /&gt;
| 8000&lt;br /&gt;
| Linearbetrieb möglich&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,14&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BUK100 BUK100]&lt;br /&gt;
| TO-220&lt;br /&gt;
| Phi&lt;br /&gt;
| 3,0&lt;br /&gt;
| 50&lt;br /&gt;
| 13,5&lt;br /&gt;
| 40&lt;br /&gt;
| 125&lt;br /&gt;
| Overload-Protection, ESD-Protection&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 1,40&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRL3705N IRL3705N]&lt;br /&gt;
| TO-220AB&lt;br /&gt;
| irf&lt;br /&gt;
| 2,0&lt;br /&gt;
| 55&lt;br /&gt;
| 89&lt;br /&gt;
| 170&lt;br /&gt;
| 10&lt;br /&gt;
| Qg=98nC&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 1,20&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BUZ72 BUZ72A]&lt;br /&gt;
| TO-220&lt;br /&gt;
| Infineon&lt;br /&gt;
| 4,0&lt;br /&gt;
| 100&lt;br /&gt;
| 9,0&lt;br /&gt;
| 40&lt;br /&gt;
| 250&lt;br /&gt;
| Linearbetrieb möglich&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,45&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRLZ34N IRLZ34N]&lt;br /&gt;
| TO-220&lt;br /&gt;
| irf&lt;br /&gt;
| 2,5&lt;br /&gt;
| 55&lt;br /&gt;
| 30&lt;br /&gt;
| 68&lt;br /&gt;
| 35&lt;br /&gt;
| 5V Logic-Level, Linearbetrieb möglich&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]],[[Elektronikversender#Farnell|Far]],[[Elektronikversender#Conrad|Con]] &lt;br /&gt;
| 0,45&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRLML2502 IRLML2502]&lt;br /&gt;
| SOT23&lt;br /&gt;
| irf&lt;br /&gt;
| 1,2&lt;br /&gt;
| 20&lt;br /&gt;
| 4,2&lt;br /&gt;
| 1&lt;br /&gt;
| 45&lt;br /&gt;
| Logic-Level&lt;br /&gt;
| [[Elektronikversender#csd-electronics|csd]] [[Elektronikversender#Reichelt|Rei (neu)]]&lt;br /&gt;
| 0,17&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF1404 IRF1404]&lt;br /&gt;
| TO-220AB&lt;br /&gt;
| irf&lt;br /&gt;
| 4,0&lt;br /&gt;
| 40&lt;br /&gt;
| 202&lt;br /&gt;
| 333&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 1,10&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRL1004 IRL1004]&lt;br /&gt;
| TO-220&lt;br /&gt;
| irf&lt;br /&gt;
| 2,7&lt;br /&gt;
| 40&lt;br /&gt;
| 130&lt;br /&gt;
| 200&lt;br /&gt;
| 6,5&lt;br /&gt;
| -&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 1,25&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRL530 IRL530]&lt;br /&gt;
| TO220, D2Pack&lt;br /&gt;
| irf&lt;br /&gt;
| 2&lt;br /&gt;
| 100&lt;br /&gt;
| 15,0&lt;br /&gt;
| 88&lt;br /&gt;
| 160&lt;br /&gt;
| &lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,57/0,78&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF830 IRF830]&lt;br /&gt;
| TO220AB&lt;br /&gt;
| irf&lt;br /&gt;
| 2,0-4,5   &lt;br /&gt;
| 500&lt;br /&gt;
| 5,0&lt;br /&gt;
| 74&lt;br /&gt;
| 1400&lt;br /&gt;
| Linearbetrieb möglich&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]],[[Elektronikversender#Kessler|Kes]]&lt;br /&gt;
| 0,57&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF840 IRF840]&lt;br /&gt;
| TO220AB&lt;br /&gt;
| irf&lt;br /&gt;
| 2,0-4,0   &lt;br /&gt;
| 500&lt;br /&gt;
| 8,0&lt;br /&gt;
| 125&lt;br /&gt;
| 850&lt;br /&gt;
| &lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,57&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/FDC645N FDC645N]&lt;br /&gt;
| SuperSOT-6&lt;br /&gt;
| Fairchild&lt;br /&gt;
| 1,5&lt;br /&gt;
| 30&lt;br /&gt;
| 5,5&lt;br /&gt;
| 0,8/1,6&lt;br /&gt;
| 30&lt;br /&gt;
| -&lt;br /&gt;
| [[Elektronikversender#csd-electronics|csd]] (a.A.), Far&lt;br /&gt;
| 0,7&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BSP297 BSP297]&lt;br /&gt;
| SOT-223&lt;br /&gt;
| Siemens/Infineon&lt;br /&gt;
| 0,8-2,4&lt;br /&gt;
| 200&lt;br /&gt;
| 0,65&lt;br /&gt;
| 1,8&lt;br /&gt;
| 6000&lt;br /&gt;
| 200V &amp;lt;math&amp;gt;U_{DS}&amp;lt;/math&amp;gt;, SMD und Logic Level (seltene Kombinaton), Linearbetrieb möglich&lt;br /&gt;
| [[Elektronikversender#Farnell|Far]], [[Elektronikversender#Schuricht|Schu]], [[Elektronikversender#RS_Components|RS]]&lt;br /&gt;
| 0,56&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF7455 IRF7455]&lt;br /&gt;
| SO-8&lt;br /&gt;
| irf&lt;br /&gt;
| 4,5&lt;br /&gt;
| 30&lt;br /&gt;
| 15&lt;br /&gt;
| 2,5&lt;br /&gt;
| 7,5&lt;br /&gt;
| &lt;br /&gt;
| [[Elektronikversender#Kessler|Kes]]&lt;br /&gt;
| 1,04&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/SI4442DY SI4442DY]&lt;br /&gt;
| SO-8&lt;br /&gt;
| vis&lt;br /&gt;
| 2,5&lt;br /&gt;
| 30&lt;br /&gt;
| 22&lt;br /&gt;
| 2,5&lt;br /&gt;
| 5/4,5V&lt;br /&gt;
| &lt;br /&gt;
| [[Elektronikversender#Kessler|Kes]]&lt;br /&gt;
| 1,64&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRLU2905 IRLU2905]&lt;br /&gt;
| TO251, DPack&lt;br /&gt;
| irf&lt;br /&gt;
| 2,0&lt;br /&gt;
| 55&lt;br /&gt;
| 42&lt;br /&gt;
| 110&lt;br /&gt;
| 27&lt;br /&gt;
| Logic-Level&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]],[[Elektronikversender#Farnell|Far]]&lt;br /&gt;
| 1,89&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRFD014 IRFD014]&lt;br /&gt;
| HEXDIP/DIP4&lt;br /&gt;
| irf&lt;br /&gt;
| 2,0-4,0&lt;br /&gt;
| 60&lt;br /&gt;
| 1,7&lt;br /&gt;
| 1,3&lt;br /&gt;
| 200&lt;br /&gt;
| &lt;br /&gt;
| [[Elektronikversender#Conrad|Con]],[[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,52&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRFD024 IRFD024]&lt;br /&gt;
| HEXDIP/DIP4&lt;br /&gt;
| irf&lt;br /&gt;
| 2,0-4,0&lt;br /&gt;
| 60&lt;br /&gt;
| 2,5&lt;br /&gt;
| 1,3&lt;br /&gt;
| 100&lt;br /&gt;
| &lt;br /&gt;
| [[Elektronikversender#Conrad|Con]],[[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,54&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRLD024 IRLD024]&lt;br /&gt;
| HEXDIP/DIP4&lt;br /&gt;
| irf&lt;br /&gt;
| 1,0-2,0&lt;br /&gt;
| 60&lt;br /&gt;
| 2,5&lt;br /&gt;
| 1,3&lt;br /&gt;
| 100&lt;br /&gt;
| Logic-Level&lt;br /&gt;
| [[Elektronikversender#Conrad|Con]],[[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,47&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRLU3717 IRLU3717]&lt;br /&gt;
| I-Pak&lt;br /&gt;
| irf&lt;br /&gt;
| 2,0&lt;br /&gt;
| 20&lt;br /&gt;
| 120&lt;br /&gt;
| 1,5/89&lt;br /&gt;
| 4&lt;br /&gt;
| Qg=21nC&lt;br /&gt;
| [[Elektronikversender#Conrad|Con]],[[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 1,15&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRFP3703 IRFP3703]&lt;br /&gt;
| TO-247AC&lt;br /&gt;
| irf&lt;br /&gt;
| 4,0&lt;br /&gt;
| 30&lt;br /&gt;
| 210&lt;br /&gt;
| 230&lt;br /&gt;
| 2,8&lt;br /&gt;
| &lt;br /&gt;
| [[Elektronikversender#Conrad|Con]]&lt;br /&gt;
| 5,08&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF3710 IRF3710]&lt;br /&gt;
| TO-220AB&lt;br /&gt;
| irf&lt;br /&gt;
| 5&lt;br /&gt;
| 100&lt;br /&gt;
| 57&lt;br /&gt;
| 200&lt;br /&gt;
| 23&lt;br /&gt;
| &lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]],[[Elektronikversender#Conrad|Con]]&lt;br /&gt;
| 0,83&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRLR7843 IRLR7843]&lt;br /&gt;
| D-Pack&lt;br /&gt;
| irf&lt;br /&gt;
| 2,3&lt;br /&gt;
| 30&lt;br /&gt;
| 164&lt;br /&gt;
| 140&lt;br /&gt;
| 3,3&lt;br /&gt;
| Qg: 34nC, Rds_on bei GS=4.5V: max. 4.0mOhm&lt;br /&gt;
| [http://www.flymotec.de/]&lt;br /&gt;
| 0,70&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF1010N IRF1010N]&lt;br /&gt;
| TO-220AB&lt;br /&gt;
| irf&lt;br /&gt;
| 4&lt;br /&gt;
| 55&lt;br /&gt;
| 85&lt;br /&gt;
| 180&lt;br /&gt;
| 11&lt;br /&gt;
| &lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]],[[Elektronikversender#Farnell|Far]]&lt;br /&gt;
| 1,99&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF1010Z IRF1010Z]&lt;br /&gt;
| TO-220AB&lt;br /&gt;
| irf&lt;br /&gt;
| 4&lt;br /&gt;
| 55&lt;br /&gt;
| 75&lt;br /&gt;
| 140&lt;br /&gt;
| 7,5&lt;br /&gt;
| &lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]],[[Elektronikversender#Conrad|Con]], [[Elektronikversender#Farnell|Far]]&lt;br /&gt;
| 1,99&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRLIZ44N IRLIZ44N]&lt;br /&gt;
| TO-220-Fullpak &lt;br /&gt;
| irf&lt;br /&gt;
| 1,0 - 2,0&lt;br /&gt;
| 55&lt;br /&gt;
| 30&lt;br /&gt;
| 45&lt;br /&gt;
| 25&lt;br /&gt;
| Logic Level&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]],[[Elektronikversender#Conrad|Con]]&lt;br /&gt;
| 0,80&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRLU024N IRLU024N]&lt;br /&gt;
| TO-251AA&lt;br /&gt;
| irf&lt;br /&gt;
| 1,0 - 2,0&lt;br /&gt;
| 55&lt;br /&gt;
| 17&lt;br /&gt;
| 45&lt;br /&gt;
| 80&lt;br /&gt;
| Logic Level, Q&amp;lt;sub&amp;gt;g&amp;lt;/sub&amp;gt;=15 nC (!)&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]],[[Elektronikversender#Conrad|Con]]&lt;br /&gt;
| 0,40&lt;br /&gt;
|-&lt;br /&gt;
| IRFZ48N&lt;br /&gt;
| TO-220AB&lt;br /&gt;
| irf&lt;br /&gt;
| 3&lt;br /&gt;
| 55&lt;br /&gt;
| 64&lt;br /&gt;
| 130&lt;br /&gt;
| 14&lt;br /&gt;
| &lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]],[[Elektronikversender#Conrad|Con]]&lt;br /&gt;
| 0,60&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.irf.com/product-info/datasheets/data/irl2505.pdf IRL2505]&lt;br /&gt;
| TO-220AB&lt;br /&gt;
| irf&lt;br /&gt;
| 2,5&lt;br /&gt;
| 55&lt;br /&gt;
| 104&lt;br /&gt;
| &lt;br /&gt;
| 8&lt;br /&gt;
| &lt;br /&gt;
| [[Elektronikversender#Farnell|Far]]&lt;br /&gt;
| 3,99&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.irf.com/product-info/datasheets/data/irf7607.pdf IRF7607]&lt;br /&gt;
| Micro8&lt;br /&gt;
| irf&lt;br /&gt;
| 12&lt;br /&gt;
| 20&lt;br /&gt;
| 6,5&lt;br /&gt;
| 1,8&lt;br /&gt;
| 3&lt;br /&gt;
| &lt;br /&gt;
| [[Elektronikversender#Conrad|Con]]&lt;br /&gt;
| 1,89&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.irf.com/product-info/datasheets/data/irf3708.pdf IRF3708]&lt;br /&gt;
| TO-220AB&lt;br /&gt;
| irf&lt;br /&gt;
| 0,6 - 2&lt;br /&gt;
| 30&lt;br /&gt;
| 62&lt;br /&gt;
| 87&lt;br /&gt;
| 8&lt;br /&gt;
| &lt;br /&gt;
| [[Elektronikversender#Conrad|Con]]&lt;br /&gt;
| 1,49&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/GF2304 GF2304]&lt;br /&gt;
| SOT-23&lt;br /&gt;
| gs&lt;br /&gt;
| 1,0&lt;br /&gt;
| 30&lt;br /&gt;
| 2,5&lt;br /&gt;
| 1,25&lt;br /&gt;
| 135&lt;br /&gt;
| Qg=3,7nC&lt;br /&gt;
| [[Elektronikversender#Pollin_Electronic|Pol]]&lt;br /&gt;
| 0,05&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRLR8743 IRLR8743]&lt;br /&gt;
| I-Pak, D2Pack&lt;br /&gt;
| IRF&lt;br /&gt;
| 1,9&lt;br /&gt;
| 30&lt;br /&gt;
| 50&lt;br /&gt;
| 68&lt;br /&gt;
| 3,1&lt;br /&gt;
| Logic-Level, D2Pack, Qg=39nC&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]] [[Elektronikversender#Conrad|Con]] &lt;br /&gt;
| 1,15&lt;br /&gt;
|-&lt;br /&gt;
| AOC2414&lt;br /&gt;
| MCSP&lt;br /&gt;
| Alpha&amp;amp;Omega&lt;br /&gt;
| 0,52&lt;br /&gt;
| 8&lt;br /&gt;
| 4,5&lt;br /&gt;
| 0,55&lt;br /&gt;
| 19&lt;br /&gt;
| spezifiziert ab 1,2V Vgs, Qg=21,5nC&lt;br /&gt;
| Digikey &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(Tabelle mit Click im Kopfbereich sortierbar, a.A.=Auf Anfrage)&lt;br /&gt;
&lt;br /&gt;
== N-Kanal J-FET==&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;fetpaare&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Package&lt;br /&gt;
! Hersteller&lt;br /&gt;
! U&amp;lt;sub&amp;gt;GS(co)&amp;lt;/sub&amp;gt;/V&lt;br /&gt;
! U&amp;lt;sub&amp;gt;DS&amp;lt;/sub&amp;gt;/V&lt;br /&gt;
! I&amp;lt;sub&amp;gt;D(max)&amp;lt;/sub&amp;gt;/mA&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Einzelpreis&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BF245 BF245A]&lt;br /&gt;
| TO-92&lt;br /&gt;
| diverse&lt;br /&gt;
| -2,2&lt;br /&gt;
| 30&lt;br /&gt;
| 6,5&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,15 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BF245 BF245B]&lt;br /&gt;
| TO-92&lt;br /&gt;
| diverse&lt;br /&gt;
| -3,8&lt;br /&gt;
| 30&lt;br /&gt;
| 15&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,15 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BF245 BF245C]&lt;br /&gt;
| TO-92&lt;br /&gt;
| diverse&lt;br /&gt;
| -7,5&lt;br /&gt;
| 30&lt;br /&gt;
| 25&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,15 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BF246 BF246A]&lt;br /&gt;
| TO-92&lt;br /&gt;
| diverse&lt;br /&gt;
| -4&lt;br /&gt;
| 25&lt;br /&gt;
| 80&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,15 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BF246 BF246B]&lt;br /&gt;
| TO-92&lt;br /&gt;
| diverse&lt;br /&gt;
| -7&lt;br /&gt;
| 25&lt;br /&gt;
| 140&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,17 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BF246 BF246C]&lt;br /&gt;
| TO-92&lt;br /&gt;
| diverse&lt;br /&gt;
| -12&lt;br /&gt;
| 25&lt;br /&gt;
| 250&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BF511 BF511]&lt;br /&gt;
| SOT-23&lt;br /&gt;
| diverse&lt;br /&gt;
| -1,5&lt;br /&gt;
| 20&lt;br /&gt;
| 7&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,36 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BFR30 BFR30]&lt;br /&gt;
| SOT-23&lt;br /&gt;
| diverse&lt;br /&gt;
| -4&lt;br /&gt;
| 25&lt;br /&gt;
| 10&lt;br /&gt;
| ?&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BFR31 BFR31]&lt;br /&gt;
| SOT-23&lt;br /&gt;
| diverse&lt;br /&gt;
| -2&lt;br /&gt;
| 25&lt;br /&gt;
| 5&lt;br /&gt;
| ?&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MMBF4416 MMBF4416]&lt;br /&gt;
| SOT-23&lt;br /&gt;
| Fairchild&lt;br /&gt;
| -5,5&lt;br /&gt;
| 15&lt;br /&gt;
| 5&lt;br /&gt;
| [[Elektronikversender#Conrad|Con]]&lt;br /&gt;
| 0,52 €&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(Tabelle mit Click im Kopfbereich sortierbar)&lt;br /&gt;
&lt;br /&gt;
== FET-Paare ==&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;fetpaare&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Package&lt;br /&gt;
! Hersteller&lt;br /&gt;
! UGS/V&lt;br /&gt;
! UDS/V&lt;br /&gt;
! ID/A&lt;br /&gt;
! P/W&lt;br /&gt;
! RDSon/mOhm&lt;br /&gt;
! Bemerkung&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Einzelpreis&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF7389 IRF7389]&lt;br /&gt;
| SO-8&lt;br /&gt;
| IRF&lt;br /&gt;
| 3,0&lt;br /&gt;
| 30&lt;br /&gt;
| 7,3/-5,3&lt;br /&gt;
| 2,0&lt;br /&gt;
| 29/58&lt;br /&gt;
| P+N&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,56 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF7501 IRF7501]&lt;br /&gt;
| micro8&lt;br /&gt;
| IRF&lt;br /&gt;
| 2,7&lt;br /&gt;
| 20&lt;br /&gt;
| 2,4&lt;br /&gt;
| ?&lt;br /&gt;
| 135 @4,5V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;&lt;br /&gt;
| 2*N&lt;br /&gt;
| [[Elektronikversender#Kessler|Kessler]], [[Elektronikversender#Conrad|Con]]&lt;br /&gt;
| 1,64 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF7506 IRF7506]&lt;br /&gt;
| micro8&lt;br /&gt;
| IRF&lt;br /&gt;
| 4,5&lt;br /&gt;
| 30&lt;br /&gt;
| 1,7&lt;br /&gt;
| ?&lt;br /&gt;
| 270 @10V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;&lt;br /&gt;
| 2*P&lt;br /&gt;
| [[Elektronikversender#Kessler|Kessler]], [[Elektronikversender#Conrad|Con]]&lt;br /&gt;
| 0,56 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF7103 IRF7103]&lt;br /&gt;
| SO-8&lt;br /&gt;
| IRF&lt;br /&gt;
| 4,5&lt;br /&gt;
| 50&lt;br /&gt;
| 2,3&lt;br /&gt;
| 2&lt;br /&gt;
| 130 @10V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;&lt;br /&gt;
| 2*N&lt;br /&gt;
|[[Elektronikversender#Reichelt|Rei]], [[Elektronikversender#Conrad|Con]]&lt;br /&gt;
| 0,32 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF7104 IRF7104]&lt;br /&gt;
| SO-8&lt;br /&gt;
| IRF&lt;br /&gt;
| 4,5&lt;br /&gt;
| 20&lt;br /&gt;
| 2,3&lt;br /&gt;
| 2&lt;br /&gt;
| 250 @10V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;&lt;br /&gt;
| 2*P&lt;br /&gt;
|[[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,32 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF7316 IRF7316]&lt;br /&gt;
| SO-8&lt;br /&gt;
| IRF&lt;br /&gt;
| 4,5&lt;br /&gt;
| 30&lt;br /&gt;
| 4,9&lt;br /&gt;
| ?&lt;br /&gt;
| 58 @10V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;&lt;br /&gt;
| 2*P&lt;br /&gt;
|[[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,49 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF7313 IRF7313]&lt;br /&gt;
| SO-8&lt;br /&gt;
| IRF&lt;br /&gt;
| 4,5&lt;br /&gt;
| 30&lt;br /&gt;
| 6,5&lt;br /&gt;
| ?&lt;br /&gt;
| 46 @4.5V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;&lt;br /&gt;
| 2*N&lt;br /&gt;
| [[Elektronikversender#Kessler|Kessler]], [[Elektronikversender#Conrad|Con]]&lt;br /&gt;
| 0,66 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/FDD8424H FDD8424H]&lt;br /&gt;
| Dual DPAK4L&lt;br /&gt;
| Fairchild&lt;br /&gt;
| &lt;br /&gt;
| 40&lt;br /&gt;
| 9/-6,5&lt;br /&gt;
| 3&lt;br /&gt;
| 24/54 @10V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt; &amp;lt;br&amp;gt; 30/70 @4,5V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;&lt;br /&gt;
| P+N&lt;br /&gt;
| [[Elektronikversender#Digi-Key|Digi-Key]] &lt;br /&gt;
| 0,73 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/SUD50NP04-94 SUD50NP04-94]&lt;br /&gt;
| TO252-4L DPAK4L&lt;br /&gt;
| Vishay&lt;br /&gt;
| 2&lt;br /&gt;
| 40 &lt;br /&gt;
| 8&lt;br /&gt;
| 8?&lt;br /&gt;
| 41/53 @10V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt; &amp;lt;br&amp;gt; 45/72 @4,5V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;&lt;br /&gt;
| P+N&lt;br /&gt;
| [[Elektronikversender#Farnell|Farnell]]&lt;br /&gt;
| 0,56 €&lt;br /&gt;
|-&lt;br /&gt;
| IRF7309&lt;br /&gt;
| SO-8&lt;br /&gt;
| IRF&lt;br /&gt;
| &amp;amp;nbsp;4,5 &amp;lt;br&amp;gt; -4,5&lt;br /&gt;
| &amp;amp;nbsp;30 &amp;lt;br&amp;gt; -30 &lt;br /&gt;
| &amp;amp;nbsp;4 &amp;lt;br&amp;gt; -3&lt;br /&gt;
| 1,4&lt;br /&gt;
| 50/100 @10V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt; &amp;lt;br&amp;gt; 80/160 @4,5V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;&lt;br /&gt;
| P+N&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,38 €&lt;br /&gt;
|-&lt;br /&gt;
| IRF7307&lt;br /&gt;
| SO-8&lt;br /&gt;
| IRF&lt;br /&gt;
| &amp;amp;nbsp;2 &amp;lt;br&amp;gt; -2,5&lt;br /&gt;
| &amp;amp;nbsp;20 &amp;lt;br&amp;gt; -20 &lt;br /&gt;
| &amp;amp;nbsp;5,2 &amp;lt;br&amp;gt; -4,3&lt;br /&gt;
| 2&lt;br /&gt;
| 50/90 @4,5V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt; &amp;lt;br&amp;gt; 70/140 @2,7V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;&lt;br /&gt;
| P+N&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,47 €&lt;br /&gt;
|-&lt;br /&gt;
| IRF7343&lt;br /&gt;
| SO-8&lt;br /&gt;
| IRF&lt;br /&gt;
| &amp;amp;nbsp;3 &amp;lt;br&amp;gt; -3,5&lt;br /&gt;
| &amp;amp;nbsp;55 &amp;lt;br&amp;gt; -55 &lt;br /&gt;
| &amp;amp;nbsp;4,7 &amp;lt;br&amp;gt; -3,4&lt;br /&gt;
| 2&lt;br /&gt;
| 43/95 @10V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt; &amp;lt;br&amp;gt; 56/150 @4,5V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;&lt;br /&gt;
| P+N&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,47 €&lt;br /&gt;
|-&lt;br /&gt;
| IRF7319&lt;br /&gt;
| SO-8&lt;br /&gt;
| IRF&lt;br /&gt;
| &amp;amp;nbsp;3 &amp;lt;br&amp;gt; -3,5&lt;br /&gt;
| &amp;amp;nbsp;30 &amp;lt;br&amp;gt; -30 &lt;br /&gt;
| &amp;amp;nbsp;6,5 &amp;lt;br&amp;gt; -4,9&lt;br /&gt;
| 2&lt;br /&gt;
| 23/42 @10V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt; &amp;lt;br&amp;gt; 32/76 @4,5V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;&lt;br /&gt;
| P+N&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,50 €&lt;br /&gt;
|-&lt;br /&gt;
| IRF7314&lt;br /&gt;
| SO-8&lt;br /&gt;
| IRF&lt;br /&gt;
| -2,0&lt;br /&gt;
| -20 &lt;br /&gt;
| -5,3&lt;br /&gt;
| 2,0&lt;br /&gt;
| 49 @-4,5V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt; &amp;lt;br&amp;gt; 82 @-2,7V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;&lt;br /&gt;
| 2*P&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,45 €&lt;br /&gt;
|-&lt;br /&gt;
| IRF7314&lt;br /&gt;
| SO-8&lt;br /&gt;
| IRF&lt;br /&gt;
| -2,0&lt;br /&gt;
| -20 &lt;br /&gt;
| -5,3&lt;br /&gt;
| 2,0&lt;br /&gt;
| 49 @-4,5V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt; &amp;lt;br&amp;gt; 82 @-2,7V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;&lt;br /&gt;
| 2*P&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,45 €&lt;br /&gt;
|-&lt;br /&gt;
| IRF7304&lt;br /&gt;
| SO-8&lt;br /&gt;
| IRF&lt;br /&gt;
| -2,5&lt;br /&gt;
| -20&lt;br /&gt;
| -4,3&lt;br /&gt;
| 2,0&lt;br /&gt;
| 90 @-4,5V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt; &amp;lt;br&amp;gt; 140 @-2,7V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;&lt;br /&gt;
| 2*P&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,46 €&lt;br /&gt;
|-&lt;br /&gt;
| IRF7306&lt;br /&gt;
| SO-8&lt;br /&gt;
| IRF&lt;br /&gt;
| -4,5&lt;br /&gt;
| -30&lt;br /&gt;
| -3,6&lt;br /&gt;
| 2,0&lt;br /&gt;
| 100 @-10V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt; &amp;lt;br&amp;gt; 160 @-4,5V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;&lt;br /&gt;
| 2*P&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,47 €&lt;br /&gt;
|-&lt;br /&gt;
| IRF7342&lt;br /&gt;
| SO-8&lt;br /&gt;
| IRF&lt;br /&gt;
| -3,5&lt;br /&gt;
| -55&lt;br /&gt;
| -3,4&lt;br /&gt;
| 2,0&lt;br /&gt;
| 95 @-10V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt; &amp;lt;br&amp;gt; 150 @-4,5V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;&lt;br /&gt;
| 2*P&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,50 €&lt;br /&gt;
|-&lt;br /&gt;
| IRF7328&lt;br /&gt;
| SO-8&lt;br /&gt;
| IRF&lt;br /&gt;
| -3,5&lt;br /&gt;
| -30&lt;br /&gt;
| -8,0&lt;br /&gt;
| 2,0&lt;br /&gt;
| 17 @-10V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt; &amp;lt;br&amp;gt; 26,8 @-4,5V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;&lt;br /&gt;
| 2*P&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,80 €&lt;br /&gt;
|-&lt;br /&gt;
| IRF7324&lt;br /&gt;
| SO-8&lt;br /&gt;
| IRF&lt;br /&gt;
| -1,5&lt;br /&gt;
| -20&lt;br /&gt;
| -9,0&lt;br /&gt;
| 2,0&lt;br /&gt;
| 18 @-4,5V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt; &amp;lt;br&amp;gt; 26 @-2,5V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;&lt;br /&gt;
| 2*P&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,87 €&lt;br /&gt;
|-&lt;br /&gt;
| IRF7303&lt;br /&gt;
| SO-8&lt;br /&gt;
| IRF&lt;br /&gt;
| 4,5&lt;br /&gt;
| 30 &lt;br /&gt;
| 4,9&lt;br /&gt;
| 2,0&lt;br /&gt;
| 50 @10V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt; &amp;lt;br&amp;gt; 80 @4,5V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;&lt;br /&gt;
| 2*N&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,43 €&lt;br /&gt;
|-&lt;br /&gt;
| IRF7301&lt;br /&gt;
| SO-8&lt;br /&gt;
| IRF&lt;br /&gt;
| 2&lt;br /&gt;
| 20 &lt;br /&gt;
| 5,2&lt;br /&gt;
| 2,0&lt;br /&gt;
| 50 @4,5V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt; &amp;lt;br&amp;gt; 70 @2,7V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;&lt;br /&gt;
| 2*N&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,46 €&lt;br /&gt;
|-&lt;br /&gt;
| IRF7341&lt;br /&gt;
| SO-8&lt;br /&gt;
| IRF&lt;br /&gt;
| 3&lt;br /&gt;
| 55 &lt;br /&gt;
| 4,7&lt;br /&gt;
| 2,0&lt;br /&gt;
| 43 @10V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt; &amp;lt;br&amp;gt; 56 @4,5V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;&lt;br /&gt;
| 2*N&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,46 €&lt;br /&gt;
|-&lt;br /&gt;
| IRF7311&lt;br /&gt;
| SO-8&lt;br /&gt;
| IRF&lt;br /&gt;
| 2&lt;br /&gt;
| 20 &lt;br /&gt;
| 6,6&lt;br /&gt;
| 2,0&lt;br /&gt;
| 23 @4,5V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt; &amp;lt;br&amp;gt; 30 @2,7V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;&lt;br /&gt;
| 2*N&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,60 €&lt;br /&gt;
|-&lt;br /&gt;
| IRF7380&lt;br /&gt;
| SO-8&lt;br /&gt;
| IRF&lt;br /&gt;
| 4,5&lt;br /&gt;
| 80 &lt;br /&gt;
| 3,6&lt;br /&gt;
| 2,0&lt;br /&gt;
| 61 @10V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;&lt;br /&gt;
| 2*N&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,57 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRFI4024H-117P IRFI4024H-117P]&lt;br /&gt;
| TO-220-5&lt;br /&gt;
| IRF&lt;br /&gt;
| 2&lt;br /&gt;
| 55&lt;br /&gt;
| 11&lt;br /&gt;
| 14&lt;br /&gt;
| 50 @10V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;&lt;br /&gt;
| 2*N&lt;br /&gt;
| [[Elektronikversender#Reichelt|Reichelt]]&lt;br /&gt;
| 2,10 €&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(Tabelle mit Click im Kopfbereich sortierbar)&lt;br /&gt;
&lt;br /&gt;
== MOSFET-Treiber ==&lt;br /&gt;
* Detaillierte [[Treiber]]-Dimensionierung&lt;br /&gt;
{| {{Tabelle}} border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;fettreiber&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color:#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Low / High-Side&lt;br /&gt;
! Strom&lt;br /&gt;
! Spannung&lt;br /&gt;
! Logikeingang&lt;br /&gt;
! Sockel&lt;br /&gt;
! Lieferant / Datenblatt&lt;br /&gt;
! Einzelpreis&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IR2101 IR2101]&lt;br /&gt;
| High &amp;amp; Low-Side Driver&lt;br /&gt;
| 130/270mA&lt;br /&gt;
| 600V&lt;br /&gt;
| 3,3V&lt;br /&gt;
| DIL8/SO8&lt;br /&gt;
| [[Elektronikversender#Conrad|Con]] &lt;br /&gt;
| 2,30 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IR2104 IR2104]&lt;br /&gt;
| Half Bridge Driver&lt;br /&gt;
| 130/270mA&lt;br /&gt;
| 600V&lt;br /&gt;
| 3,3V/5V/15V&lt;br /&gt;
| DIL8/SO8&lt;br /&gt;
| [[Elektronikversender#Conrad|Con]] &lt;br /&gt;
| 2,00 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IR2110 IR2110]&lt;br /&gt;
| High &amp;amp; Low-Side Driver&lt;br /&gt;
| 2A&lt;br /&gt;
| 500V&lt;br /&gt;
| 3,3V&lt;br /&gt;
| DIL14/SO16&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]] [[Elektronikversender#Conrad|Con]] &lt;br /&gt;
| 1,55 €&lt;br /&gt;
|- &lt;br /&gt;
| [http://www.mikrocontroller.net/part/IR2111 IR2111]&lt;br /&gt;
| Half Bridge Driver&lt;br /&gt;
| 200/430mA&lt;br /&gt;
| 600V&lt;br /&gt;
| 10-20V CMOS Eingang&lt;br /&gt;
| DIL8/SO8, maximale Kriechwege&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]] [[Elektronikversender#Conrad|Con]]&lt;br /&gt;
| 1,10 €&lt;br /&gt;
|- &lt;br /&gt;
| [http://www.mikrocontroller.net/part/IR2112 IR2112]&lt;br /&gt;
| High &amp;amp; Low-Side Driver&lt;br /&gt;
| 200/420mA&lt;br /&gt;
| 600V&lt;br /&gt;
| 3,3V&lt;br /&gt;
| DIL14/SO16&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]] [[Elektronikversender#Conrad|Con]] &lt;br /&gt;
| 1,45 €&lt;br /&gt;
|- &lt;br /&gt;
| [http://www.mikrocontroller.net/part/IR2113 IR2113]&lt;br /&gt;
| High &amp;amp; Low-Side Driver&lt;br /&gt;
| 2A&lt;br /&gt;
| 600V&lt;br /&gt;
| 3,3V&lt;br /&gt;
| DIL14/SO16&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]] [[Elektronikversender#Conrad|Con]] &lt;br /&gt;
| 1,85 €&lt;br /&gt;
|- &lt;br /&gt;
| [http://www.mikrocontroller.net/part/IR2117 IR2117]&lt;br /&gt;
| Single High Side Driver&lt;br /&gt;
| 200/420mA&lt;br /&gt;
| 600V&lt;br /&gt;
| 10-20V CMOS Eingang&lt;br /&gt;
| DIL8/SO8, maximale Kriechwege&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]] [[Elektronikversender#Conrad|Con]] &lt;br /&gt;
| 1,20 €&lt;br /&gt;
|- &lt;br /&gt;
| [http://www.mikrocontroller.net/part/IR2121 IR2121]&lt;br /&gt;
| Low Side Driver&lt;br /&gt;
| 1A/2A&lt;br /&gt;
| ?&lt;br /&gt;
| 2,5V&lt;br /&gt;
| DIL8/SO8, Strombegrenzung&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]] [[Elektronikversender#Conrad|Con]]&lt;br /&gt;
| 2,15 €&lt;br /&gt;
|- &lt;br /&gt;
| [http://www.mikrocontroller.net/part/IR2125 IR2125]&lt;br /&gt;
| Single Channel High Side Driver&lt;br /&gt;
| 1A/2A&lt;br /&gt;
| 500V&lt;br /&gt;
| 2,5V&lt;br /&gt;
| DIL8/SO8, Strombegrenzung, maximale Kriechwege&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]] [[Elektronikversender#Conrad|Con]] &lt;br /&gt;
| 4,20 €&lt;br /&gt;
|- &lt;br /&gt;
| [http://www.mikrocontroller.net/part/IR2127 IR2127]&lt;br /&gt;
| Single Channel High Side Driver&lt;br /&gt;
| 200/420mA&lt;br /&gt;
| ?&lt;br /&gt;
| 3,3V&lt;br /&gt;
| DIL8/SO8, maximale Kriechwege, Fehlerausgang&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]] [[Elektronikversender#Conrad|Con]] &lt;br /&gt;
| 2,40 €&lt;br /&gt;
|- &lt;br /&gt;
| [http://www.mikrocontroller.net/part/IR2130 IR2130]&lt;br /&gt;
| 3-Phase Bridge Driver&lt;br /&gt;
| 200/420mA&lt;br /&gt;
| 600V&lt;br /&gt;
| 2,5V&lt;br /&gt;
| DIL28/SO28&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]] [[Elektronikversender#Conrad|Con]] &lt;br /&gt;
| 2,50 €&lt;br /&gt;
|- &lt;br /&gt;
| [http://www.mikrocontroller.net/part/IR2151 IR2151]&lt;br /&gt;
| Self Oscillating Half Bridge Driver&lt;br /&gt;
| 100/210mA&lt;br /&gt;
| 600V&lt;br /&gt;
| ?&lt;br /&gt;
| DIL8/SO8&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]] [[Elektronikversender#Conrad|Con]] &lt;br /&gt;
| 2,50 €&lt;br /&gt;
|- &lt;br /&gt;
| [http://www.mikrocontroller.net/part/IR2153 IR2153]&lt;br /&gt;
| Self Oscillating Half Bridge Driver&lt;br /&gt;
| 100/210mA&lt;br /&gt;
| 600V&lt;br /&gt;
| n/a&lt;br /&gt;
| DIL8/SO8&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]] [[Elektronikversender#Conrad|Con]]&lt;br /&gt;
| 1,20 €&lt;br /&gt;
|- &lt;br /&gt;
| [http://www.mikrocontroller.net/part/IR2155 IR2155]&lt;br /&gt;
| Self Oscillating Half Bridge Driver&lt;br /&gt;
| 210/420mA&lt;br /&gt;
| 600V&lt;br /&gt;
| n/a&lt;br /&gt;
| DIL8/SO8&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]] [[Elektronikversender#Conrad|Con]]&lt;br /&gt;
| 3,50 €&lt;br /&gt;
|- &lt;br /&gt;
| [http://www.mikrocontroller.net/part/IR2181 IR2181]&lt;br /&gt;
| High &amp;amp; Low-Side Driver&lt;br /&gt;
| 1.4A/1.8A&lt;br /&gt;
| 600V&lt;br /&gt;
| 3,3V/5V&lt;br /&gt;
| DIL8/SO8&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]] [[Elektronikversender#Conrad|Con]]&lt;br /&gt;
| 2,10 €&lt;br /&gt;
|- &lt;br /&gt;
| [http://www.mikrocontroller.net/part/IR2183 IR2183]&lt;br /&gt;
| Half Bridge Driver&lt;br /&gt;
| 1.4A/1.8A&lt;br /&gt;
| 600V&lt;br /&gt;
| 3,3V&lt;br /&gt;
| DIL8/SO8&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 4,00 €&lt;br /&gt;
|- &lt;br /&gt;
| [http://www.mikrocontroller.net/part/IR2184 IR2184]&lt;br /&gt;
| Half Bridge Driver&lt;br /&gt;
| 1.4A/1.8A&lt;br /&gt;
| 600V&lt;br /&gt;
| 3,3V/5V&lt;br /&gt;
| DIL8/SO8&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]] [[Elektronikversender#Conrad|Con]] &lt;br /&gt;
| 3,20 €&lt;br /&gt;
|- &lt;br /&gt;
| [http://www.mikrocontroller.net/part/IR2136 IR2136]&lt;br /&gt;
| 3 Phase Driver&lt;br /&gt;
| 120/250mA&lt;br /&gt;
| 600V&lt;br /&gt;
| 3,3V&lt;br /&gt;
| DIP28/SOIC28,&lt;br /&gt;
| [[Elektronikversender#Conrad|Con]]&lt;br /&gt;
| 1,80 €&lt;br /&gt;
|- &lt;br /&gt;
| [http://www.mikrocontroller.net/part/ICL7667 ICL7667]&lt;br /&gt;
| Dual Power MOSFET Driver&lt;br /&gt;
| ?&lt;br /&gt;
| 4.5-15V, 7Ω&lt;br /&gt;
| 3,3V&lt;br /&gt;
| DIL8/SO8 &lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 2,00 €&lt;br /&gt;
|- &lt;br /&gt;
| [http://www.mikrocontroller.net/part/HIP4081A HIP4081A]&lt;br /&gt;
| Full Bridge Driver&lt;br /&gt;
| 2,5A&lt;br /&gt;
| 80V&lt;br /&gt;
| ?&lt;br /&gt;
| DIP20/SOIC20&lt;br /&gt;
| [[Elektronikversender#Farnell|Far]]&lt;br /&gt;
| 8,00 €&lt;br /&gt;
|- &lt;br /&gt;
| [http://www.mikrocontroller.net/part/HIP4082 HIP4082]&lt;br /&gt;
| Full Bridge Driver&lt;br /&gt;
| 1,2A&lt;br /&gt;
| 80V&lt;br /&gt;
| ?&lt;br /&gt;
| DIP16/SOIC16&lt;br /&gt;
| [[Elektronikversender#Farnell|Far]] [[Elektronikversender#Farnell|Far]]&lt;br /&gt;
| 6,20 €&lt;br /&gt;
|- &lt;br /&gt;
| [http://www.mikrocontroller.net/part/HIP4083 HIP4083]&lt;br /&gt;
| 3 Phase High side N-channel MOSFET driver&lt;br /&gt;
| 0,3A&lt;br /&gt;
| 80V&lt;br /&gt;
| ?&lt;br /&gt;
| DIP16/SOIC16&lt;br /&gt;
| [[Elektronikversender#Farnell|Far]]&lt;br /&gt;
| 4,80 €&lt;br /&gt;
&amp;lt;!-- ohne Preis und Lieferant&lt;br /&gt;
|- &lt;br /&gt;
| [http://www.mikrocontroller.net/part/HIP4084 HIP4084]&lt;br /&gt;
| 4 Phase Driver&lt;br /&gt;
| 0,5A&lt;br /&gt;
| 80V&lt;br /&gt;
| ?&lt;br /&gt;
| DIP28/SOIC28&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| [http://www.mikrocontroller.net/part/HIP4086 HIP4086]&lt;br /&gt;
| 3 Phase Driver&lt;br /&gt;
| 0.5A&lt;br /&gt;
| 80V&lt;br /&gt;
| ?&lt;br /&gt;
| DIP24/SOIC24&lt;br /&gt;
| [[Elektronikversender#Farnell|Far]]&lt;br /&gt;
| 8,00 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TC4451 TC4451/TC4452]&lt;br /&gt;
| High Speed MOSFET Driver&lt;br /&gt;
| 12A peak, 2,5A DC&lt;br /&gt;
| ?&lt;br /&gt;
| 4,5-18V&lt;br /&gt;
| DIL8/SO8&lt;br /&gt;
| [[Elektronikversender#Farnell|Far]]&lt;br /&gt;
| 3,00 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM5104 LM5104]&lt;br /&gt;
| Half Bridge Driver&lt;br /&gt;
| 1,6/1,8A&lt;br /&gt;
| 100V&lt;br /&gt;
| 2,5V&lt;br /&gt;
| SO8/LLP10 &lt;br /&gt;
| [[Elektronikversender#RS_Components|RS]]&lt;br /&gt;
| 3,20 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MCP1407 MCP1407-E/P]&lt;br /&gt;
| High Speed MOSFET Driver&lt;br /&gt;
| 6A peak, 1,3A DC&lt;br /&gt;
| ?&lt;br /&gt;
| 4,5-18V&lt;br /&gt;
| DIL8/SO8&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 0,95 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MAX626 MAX626]&lt;br /&gt;
| Dual Power MOSFET drivers, inverting&lt;br /&gt;
| ?&lt;br /&gt;
| ?&lt;br /&gt;
| 4,5-18 V&lt;br /&gt;
| DIL8/SO8&lt;br /&gt;
| [[Elektronikversender#Reichelt|Rei]]&lt;br /&gt;
| 3,40 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/NCP5106 NCP5106]&lt;br /&gt;
| High Voltage, High and Low Side Driver&lt;br /&gt;
| 250/500mA&lt;br /&gt;
| 600V&lt;br /&gt;
| 2,3-20V&lt;br /&gt;
| DIL8/SO8&lt;br /&gt;
| [[Elektronikversender#Farnell|Far]]&lt;br /&gt;
| 2,37 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/NCP5304 NCP5304]&lt;br /&gt;
| High Voltage, High and Low Side Driver&lt;br /&gt;
| 250/500mA&lt;br /&gt;
| 600V&lt;br /&gt;
| 2,3-20V&lt;br /&gt;
| DIL8/SO8&lt;br /&gt;
| [[Elektronikversender#Farnell|Far]]&lt;br /&gt;
| 2,02 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/FAN7380 FAN7380]&lt;br /&gt;
| Half-Bridge Gate Driver&lt;br /&gt;
| 90/180mA&lt;br /&gt;
| 600V&lt;br /&gt;
| 2,5-25V&lt;br /&gt;
| SO8&lt;br /&gt;
| [[Elektronikversender#Farnell|Far]]&lt;br /&gt;
| 0,99 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/FAN7382 FAN7382]&lt;br /&gt;
| High- and Low-Side Gate Driver&lt;br /&gt;
| 350/650mA&lt;br /&gt;
| 600V&lt;br /&gt;
| 2,9-20V&lt;br /&gt;
| DIL8/SO8/S014&lt;br /&gt;
| [[Elektronikversender#Farnell|Far]]&lt;br /&gt;
| 1,25 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/FAN7361 FAN7361]&lt;br /&gt;
| Half-Bridge Gate Driver&lt;br /&gt;
| 250/500mA&lt;br /&gt;
| 600V&lt;br /&gt;
| 3,6-25V&lt;br /&gt;
| SO8&lt;br /&gt;
| [[Elektronikversender#Farnell|Far]]&lt;br /&gt;
| 1,18 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/FAN7362 FAN7362]&lt;br /&gt;
| Half-Bridge Gate Driver&lt;br /&gt;
| 250/500mA&lt;br /&gt;
| 600V&lt;br /&gt;
| 2,9-25V&lt;br /&gt;
| SO8&lt;br /&gt;
| [[Elektronikversender#Farnell|Far]]&lt;br /&gt;
| 1,71 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/FAN7842 FAN7842]&lt;br /&gt;
| High and Low Side Gate Driver&lt;br /&gt;
| 350/650mA&lt;br /&gt;
| 200V&lt;br /&gt;
| 2,9-25V&lt;br /&gt;
| SO8&lt;br /&gt;
| [[Elektronikversender#Farnell|Far]]&lt;br /&gt;
| 1,05 €&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Anmerkungen ==&lt;br /&gt;
* U&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt; - minimale Gatespannung, bei welcher der MOSFET zu leiten anfängt (100µA..1mA, nicht genormt). Zur vollständigen Durchschaltung bei maximalem Strom braucht es höhere Spannungen.&lt;br /&gt;
* Logic Level - FET schaltet bei niedrigen Gatespannungen von typisch 4,5V (z.&amp;amp;nbsp;B. CMOS Logikpegel) hinreichend durch. Normale MOSFETs brauchen hierfür typisch 10V.&lt;br /&gt;
* U&amp;lt;sub&amp;gt;GS(co)&amp;lt;/sub&amp;gt; - Gate Source Cut Off Spannung, bei welcher der Drainstrom I&amp;lt;sub&amp;gt;D&amp;lt;/sub&amp;gt; eines JFETs praktisch Null ist. Die Messbedingung ist jedoch nicht genormt (0,5nA..200µA).&lt;br /&gt;
* N-Kanal MOSFETs mit niedrigem R&amp;lt;sub&amp;gt;DS,On&amp;lt;/sub&amp;gt; sind technologisch einfacher herzustellen als P-Kanal MOSFETs. Deshalb gibt es bei P-Kanal keine so große Auswahl und oft werden Schaltungen angestrebt, in denen ausschließlich N-Kanal MOSFETs verwendet werden. Es gibt spezielle Treiberbausteine, die über eine Ladungspumpe für entsprechend hohe Gatespannung auch für die High-Side N-Fets sorgen (&amp;quot;Bootstrap Circuits&amp;quot;, siehe Artikel [[Treiber]]).&lt;br /&gt;
* Bei der Dimensionierung ist zu beachten, dass die Stromangabe im allgemeinen für 25°C gilt. Geht man davon aus, dass der MOSFET mit maximal zulässigem Strom betrieben wird und mit passend dimensioniertem [[Kühlkörper]] ausgestattet ist, so beträgt die Sperrschichttemperatur bis zu 150°C, folglich gilt z.&amp;amp;nbsp;B. für den IRF540 nicht mehr 28A, sondern nur noch ca. 12-15A.&lt;br /&gt;
* Restströme sind auch stark von der Temperatur abhängig. Bei höherer Temperatur nehmen die Restströme exponentiell zu. So können bei 100°C durchaus 100 µA zwischen Source und Drain auch im gesperrten Zustand fließen. Bei 25°C ist dieser Reststrom meist bei 1µA spezifiziert. Real sind es meist weniger.&lt;br /&gt;
* Der Gate-Charge-Wert Qg (s. Datenblatt) bestimmt, wie schnell das Gate beim Schalten umgeladen werden kann. Auch wenn MOSFETs stromlos den durchgeschalteten Zustand halten können, braucht man während des Umschaltvorganges einen Strom, der das Gate umlädt (ähnlich wie ein Kondensator). Je höher dieser Strom, um so schneller ist der Umschaltvorgang und um so geringer die Verlustleistung während dieser Phase. Leistungs-MOSFETs können bei höheren Frequenzen (&amp;gt;1KHz) oft nur mit höheren Gateströmen von 0,1A-2A sinnvoll geschaltet werden. Man kann das Gate also nicht direkt an einen Digitalpin anschließen. Man braucht einen [[MOSFET-Übersicht#MOSFET-Treiber | MOSFET-Treiber]]. Manche MOSFETs haben eine sehr geringe Total Gate Charge (z.&amp;amp;nbsp;B. 4-10nC). Diese können in gewissen Grenzen recht gut direkt an digitalen [[Ausgangsstufen Logik-ICs | Logikausgängen]] betrieben werden. Zur Abschätzung kann man sich merken: Wenn man das Gate eines MOSFETs mit einer Eingangskapazität von 1nF (~10nC) in 100ns auf 10V aufladen will, braucht man dazu 100mA.&lt;br /&gt;
&lt;br /&gt;
== Lieferantenübersicht ==&lt;br /&gt;
* [[Elektronikversender#Reichelt|Rei]]&amp;lt;nowiki&amp;gt;chelt&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* [[Elektronikversender#elpro-Darmstadt|el]]&amp;lt;nowiki&amp;gt;pro&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* [[Elektronikversender#Conrad|Con]]&amp;lt;nowiki&amp;gt;rad&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* [[Elektronikversender#Kessler|Kes]]&amp;lt;nowiki&amp;gt;sler&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* [[Elektronikversender#csd-electronics|csd]]&amp;lt;nowiki&amp;gt;-electronics&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* [[Elektronikversender#Farnell|Far]]&amp;lt;nowiki&amp;gt;nell&amp;lt;/nowiki&amp;gt; (nur gewerbliche Kunden oder Studenten)&lt;br /&gt;
* HBE-Shop (FARNELL-Fachhändler, auch als nichtgewerblicher Kunde)&lt;br /&gt;
* [[Elektronikversender#Schuricht|Schu]]&amp;lt;nowiki&amp;gt;richt&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* [[Elektronikversender#RS_Components|RS]]&lt;br /&gt;
* [[Elektronikversender#Spoerle|Spo]]&amp;lt;nowiki&amp;gt;erle&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Herstellerübersicht ==&lt;br /&gt;
* [irf] [http://www.irf.com International Rectifier]&lt;br /&gt;
* [Siliconix] [http://www.vishay.com/company/brands/siliconix/ Vishay Siliconix]&lt;br /&gt;
* [st] [http://www.st.com/web/en/home.html STMicroelectronics]&lt;br /&gt;
&lt;br /&gt;
== IRF MOSFET-Codierung ==&lt;br /&gt;
* IRF: Alle &amp;quot;Standardtransistoren&amp;quot;, also TO-220-Gehäuse&lt;br /&gt;
* IRFB: Hochspannungs-MosFETs&lt;br /&gt;
* IRFD: MosFETs im Dip-4-Gehäuse&lt;br /&gt;
* IRFI: MosFETs im isolierten TO-220-Gehäuse&lt;br /&gt;
* IRFP: MosFETs im TO-247AC-Gehäuse&lt;br /&gt;
* IRFR: MosFETs im D-Pak&lt;br /&gt;
* IRFU: MosFETs im I-Pak&lt;br /&gt;
* IRFZ: Also die die ich kenne liegen alle so bei 50-60V mit relativ niedrigem Rds(on), also so für mittlere Leistungen&lt;br /&gt;
* IRG:  Afaik sind das IGBTs&lt;br /&gt;
* IRL:  Logic-Level MosFETs&lt;br /&gt;
* IRLD: Logic-Level MosFETs im Dip-4 Gehäuse&lt;br /&gt;
* IRLI: Logic-Level MosFETs im isolierten TO-220-Gehäuse&lt;br /&gt;
* IRLR: Logic-Level MosFETs im D-Pak&lt;br /&gt;
* IRLU: Logic-Level MosFETs im I-Pak&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [[FET]]&lt;br /&gt;
* [[IGBT]]&lt;br /&gt;
* [[Treiber]]&lt;br /&gt;
* [[H-Brücken Übersicht]]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/280480#2960070 Forumsbeitrag]: Clevere MOSFET-Treiber mit kleinsten Trafos&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/283585#3004839 Forumsbeitrag]: Galvanisch getrennte Ansteuerung eines MOSFETs mittels Übertrager und 100% Tastverhältnis&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://www.sprut.de/electronic/switch/nkanal/nkanal.html N-Kanal MOSFET leicht erklärt bei sprut.de]&lt;br /&gt;
* [http://www.sprut.de/electronic/switch/pkanal/pkanal.html P-Kanal MOSFET leicht erklärt bei sprut.de]&lt;br /&gt;
* [http://elektronik-kompendium.de/sites/bau/0510161.htm MOSFET im ElKo]&lt;br /&gt;
* [http://elektronik-kompendium.de/public/schaerer/battoff.htm Abschaltverzögerung beim ElKo]&lt;br /&gt;
* [http://elektronik-kompendium.de/sites/bau/0207011.htm FET beim ElKo]&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Mosfet MOSFET bei Wikipedia]&lt;br /&gt;
&amp;lt;!-- * [http://www.irf.com/product-info/auto/autogdic.html IR21xx Familienvergleich] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parametrische Suche beim Hersteller ==&lt;br /&gt;
* [http://www.infineon.com/cms/de/product/channel.html?channel=db3a304319c6f18c011a14e5341b25f1 Infineon]&lt;br /&gt;
* [http://www.nxp.com/#/ps/ps=%5Bi%3D48014%5D%7Cpp%3D%5Bt%3Dpfp%2Ci%3D48014%5D NXP standard Mosfets]&lt;br /&gt;
* [http://www.onsemi.com/PowerSolutions/parametrics.do?id=809&amp;amp;lctn=home ONsemi]&lt;br /&gt;
* [http://www.diodes.com/zetex/?ztx=3.0/3-3-1@tcatid~7 Diodes (vormals Zetex)]&lt;br /&gt;
* [http://www.irf.com/product-info/hexfet/ IRF]&lt;br /&gt;
* [http://www.vishay.com/mosfets/ Vishay]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Liste mit Bauteilen]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Equipment&amp;diff=83404</id>
		<title>AVR-Tutorial: Equipment</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Equipment&amp;diff=83404"/>
		<updated>2014-06-27T07:29:04Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Änderung 83403 von 78.48.189.91 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AVR-Tutorial - Benötigte Ausrüstung =&lt;br /&gt;
==Hardware==&lt;br /&gt;
&lt;br /&gt;
Ein Mikrocontroller alleine ist noch zu nichts nützlich. Damit man etwas damit anfangen kann, braucht man eine Schaltung, in die der Controller eingesetzt wird. Dazu werden bei Elektronikhändlern Platinen angeboten, die alles nötige (Taster, LEDs, Steckverbinder...) enthalten. Häufig enthalten diese Platinen nicht nur Platz für den Mikroprozessor, sondern auch einen ISP-Programmierer (Näheres dazu später)&lt;br /&gt;
&lt;br /&gt;
Da es eine Unmenge verschiedener Mikrocontroller allein aus der AVR-Familie gibt, ist der Anfänger mit der Auswahl bereits überfordert. Dieses Tutorial (und viele andere auch) beginnt mit dem &#039;&#039;mittelgroßen&#039;&#039; Controller &#039;&#039;&#039;ATmega8&#039;&#039;&#039;. Die 8 steht für 8 Kilobyte Flash-Speicher. Er gilt als ideal für Einsteiger, und auch von „alten Hasen“ wird dieser Typ gern verwendet. Es gibt ihn im 28-poligen DIL-Gehäuse, ideal für Bastelschaltungen auf dem Steckbrett, als auch in verschiedenen SMD-Gehäusen, wenn das Endgerät klein werden soll.&lt;br /&gt;
&lt;br /&gt;
=== Fertige Evaluations-Boards und Starterkits ===&lt;br /&gt;
&lt;br /&gt;
==== AVR Starterkit aus dem Mikrocontroller.net-Shop ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Damit der Programmer mit AS5.x zusammen arbeitet, muss die Firmware aktualisiert werden: http://www.usbprog.org/index.php/Firmwares (siehe Update Hinweis)&lt;br /&gt;
&lt;br /&gt;
Sehr gut für dieses Tutorial geeignet ist das [http://shop.embedded-projects.net/index.php?module=artikel&amp;amp;action=artikel&amp;amp;id=108 AVR-Starterkit aus dem Mikrocontroller.net-Shop]. Das Kit enthält eine Platine mit dem Controller ATmega8, einen USB-ISP-Programmieradapter und ein Steckernetzteil. Die im Starterkit enthaltene [http://www.eproo.de/index.php?module=artikel&amp;amp;action=artikel&amp;amp;id=74 AVR Entwicklungsplatine für 28-pol. AVRs] gibt es auch einzeln. Diese enthält eine Fassung für den Controller, einen Spannungswandler, die Beschaltung für die serielle Schnittstelle und einen Anschluss für den Programmieradapter. Die restliche Hardware wie LEDs und Taster kann man sich selber nach Belieben auf das Lochrasterfeld löten.&lt;br /&gt;
&lt;br /&gt;
==== STK500 ====&lt;br /&gt;
[[Bild:Stk500.jpg|right]]&lt;br /&gt;
Das STK500 ist das Standard-Board für AVR Entwicklung, direkt von Atmel. Es enthält auch einen ISP-Programmer und ist fertig aufgebaut. Es ist unter Entwicklern sehr beliebt und wird natürlich von Atmel unterstützt. Es gilt allgemein als gute Investition, wenn man ernsthaft in das Thema einsteigen möchte.&lt;br /&gt;
&lt;br /&gt;
Das STK500 kostet bei Reichelt ca. 80 Euro (ein geeignetes Netzteil muss zusätzlich erworben werden).&lt;br /&gt;
&lt;br /&gt;
==== Pollin ATMEL Evaluations-Board Version 2.x ====&lt;br /&gt;
&lt;br /&gt;
Bei Pollin Elektronik gibt es für ca. 15 Euro ein Evaluations-Board als Bausatz zum Selbstlöten. Im Bausatz sind die Aufbauanleitung, die Platine und Bauteile enthalten. Der/die Mikrocontroller und eine Stromversorgung müssen separat beschafft werden. Auf dem Board ist ein einfacher ISP-Programmer (serielles &#039;&#039;bit-banging&#039;&#039;) integriert. &lt;br /&gt;
&lt;br /&gt;
Siehe: &lt;br /&gt;
* [[Pollin ATMEL Evaluations-Board]]&lt;br /&gt;
* http://www.pollin.de&lt;br /&gt;
&lt;br /&gt;
==== Pollin Funk-AVR-Evaluationsboard v1.x ====&lt;br /&gt;
&lt;br /&gt;
Bei diesem Board besteht die Möglichkeit, Funkmodule wie das [[RFM12]], RFM01 oder RFM02 auf dem Board aufzulöten.&lt;br /&gt;
&lt;br /&gt;
Siehe: &lt;br /&gt;
* [[Pollin Funk-AVR-Evaluationsboard]]&lt;br /&gt;
* [http://www.pollin.de http://www.pollin.de]&lt;br /&gt;
&lt;br /&gt;
==== Rumpus Board von lochraster.org ====&lt;br /&gt;
&lt;br /&gt;
Lochraster.org bietet ein Entwicklungsboard namens Rumpus an. Es kommt als Bausatz mit allen Teilen und Microcontroller (Atmega 168), auf dem Microcontroller ist bereits ein USB Bootloader installiert so dass man nach dem Zusammenbau sofort starten kann. Das Board wird direkt über USB mit Strom versorgt und auch über USB programmiert, es kann auch selbst als Programmer für AVR Microcontroller benutzt  werden. Das Board ist mit recht umfangreicher Peripherie ausgestattet, so das sich von sehr einfachen Anwendungen wie dem Blinken einer LED bis hin zu komplexen Aufgaben wie senden und empfangen von Infrarot Signalen eine Vielzahl von Anwendungen realisieren lassen. Mit 45 Euro gehört es sicher nicht zu den ganz billigen Einsteigerboards, für den ambitionierten Amateur bietet die reichhaltige Peripherie den Vorteil, das Board während des gesamten Lernprozesses zu nutzen ohne für die Realisierung komplexerer Aufgaben neue Hardware auflöten zu müssen. Auch relativiert sich dieser Preis wieder dadurch, dass kein ISP Programmer benötigt wird. Beim Umstieg auf ein anderes Board, für welches man dann einen ISP Programmer benötigt, kann der Rumpus diese Aufgabe übernehmen anstatt zum alten Eisen geworfen zu werden (s. Infos im [http://www.mikrocontroller.net/topic/217122#2165435 Forumbeitrag von Sebastian Noack]).&lt;br /&gt;
&lt;br /&gt;
Weitere Infos unter http://www.lochraster.org/ und http://wiki.lochraster.org/&lt;br /&gt;
&lt;br /&gt;
==== RN-Control ====&lt;br /&gt;
&lt;br /&gt;
Die Forengemeinde von Roboternetz hat ebenfalls ein Evaluierungsboard entwickelt, das mittlerweile sehr ausgereift ist und viele Erweiterungsmöglichkeiten bietet.&lt;br /&gt;
&lt;br /&gt;
Siehe:&lt;br /&gt;
* [http://robotikhardware.de/ http://robotikhardware.de/]&lt;br /&gt;
* [http://www.roboternetz.de/ http://www.roboternetz.de/]&lt;br /&gt;
&lt;br /&gt;
==== Arduino ====&lt;br /&gt;
Die Boards der [http://www.arduino.cc Arduino-Familie] bieten z.B. einen ATmega328P mit 16MHz und lassen sich über einen integrierten USB-seriell-Wandler und [[Bootloader]] programmieren. Die Ports sind auf Buchsenleisten herausgeführt. Arduino-Boards können auch unabhängig von der Arduino-Entwicklungsumgebung (Arduino-IDE) als AVR-Entwicklungsboard genutzt werden.&lt;br /&gt;
&lt;br /&gt;
==== Andere ====&lt;br /&gt;
&lt;br /&gt;
Das Angebot an AVR-Evaluationboards, -Experimentierplatinen, -Entwicklerplatinen oder wie die jeweiligen Hersteller ihre Produkte auch immer bezeichnen, ist mittlerweile recht groß geworden. Sie alle zu bewerten ist unmöglich geworden.&lt;br /&gt;
&lt;br /&gt;
===Selbstbau===&lt;br /&gt;
&lt;br /&gt;
Ein fertiges Board ist gar nicht nötig, man kann die benötigte Schaltung auch selbst auf einem kleinen Steckbrett oder einer Lochrasterplatine aufbauen. So kompliziert wie das STK500 wird es nicht, es reichen eine Handvoll Bauteile. Wie man das macht, wird im Folgenden beschrieben.&lt;br /&gt;
Steckbretter (Breadboards) gibt&#039;s z.&amp;amp;nbsp;B. bei [http://www.reichelt.de Reichelt],  [http://www.conelek.com/Steckplatinen ConeleK], [http://www.elv.de/ ELV] oder [http://www.conrad.de/ Conrad]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mega8_Tutorial.png|center|framed| Die Grundschaltung eines ATmega8/ATmega8A.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG:&#039;&#039;&#039; Die Pinbelegung der 6-poligen ISP-Verbindung weicht von den ATMEL Angaben ab! Wenn ATMEL oder ATMEL-kompatible ISP-Adapter benutzt werden, die Pinbelegung aus [http://www.atmel.com/images/atmel-2521-avr-hardware-design-considerations_application-note_avr042.pdf AVR042] (PDF) bzw. [[AVR_In_System_Programmer#Pinbelegung]] benutzen]]&lt;br /&gt;
&lt;br /&gt;
Über den Takteingang &#039;&#039;&#039;XTAL1&#039;&#039;&#039; ist der Mikrocontroller mit dem &#039;&#039;&#039;Quarzoszillator&#039;&#039;&#039; verbunden, der den benötigten Takt von 4 MHz liefert (siehe unten). Achtung: die Pins werden, wenn man den Oszillator mit der Schrift nach oben vor sich liegen hat, von unten links aus abgezählt. Unten links ist Pin 1, unten rechts Pin 7, oben rechts Pin 8 und oben links Pin 14 (natürlich hat der Oszillator nur 4 Pins. Die Nummerierung kommt daher, dass bei einem normalen IC dieser Größe an den gleichen Positionen die Pins Nr. 1, 7, 8 und 14 wären). Zu den Pins Datenblatt beachten [http://www.mikrocontroller.net/topic/204429#2015503].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PD0-PD7&#039;&#039;&#039; und &#039;&#039;&#039;PB0-PB5&#039;&#039;&#039; sind die &#039;&#039;&#039;IO-Ports&#039;&#039;&#039; des Mikrocontrollers. Hier können Bauteile wie LEDs, Taster oder LCDs angeschlossen werden.&lt;br /&gt;
Der &#039;&#039;&#039;Port C (PC0-PC5)&#039;&#039;&#039; spielt beim Atmega8 eine Sonderrolle: mit diesem Port können Analog-Spannungen gemessen werden. Aber dazu später mehr!&lt;br /&gt;
An &#039;&#039;&#039;Pin 17-19&#039;&#039;&#039; ist die Stiftleiste zur Verbindung mit dem ISP-Programmer angeschlossen, über den der AVR vom PC programmiert wird (Achtung: Pins in Abbildung entsprechen nicht der Belegung des AVRISP mkII. Die korrekte Pin-Belegung kann im Handbuch des AVRISP mkII eingesehen werden).&lt;br /&gt;
Die Resetschaltung, bestehend aus &#039;&#039;&#039;R1&#039;&#039;&#039; und &#039;&#039;&#039;C1&#039;&#039;&#039;, sorgt dafür, dass der Reseteingang des Controllers standardmäßig auf Vcc=+5V liegt.&lt;br /&gt;
Zum Programmieren zieht der ISP-Adapter die Resetleitung auf Masse (GND), die Programmausführung wird dadurch unterbrochen und der interne Speicher des Controllers kann neu programmiert werden.&lt;br /&gt;
Zwischen Vcc und GND kommen noch jeweils ein 100nF Keramik- oder Folienkondensator C3 und C4, um Störungen in der Versorgungsspannung zu unterdrücken. Diese [[Kondensator#Entkoppelkondensator | Abblockkondensatoren]] sollten so nah wie möglich am Controller platziert werden. An den Ausgang ARef wird ebenfalls ein 100nF Kondensator angeschlossen. Dieser wird allerdings erst benötigt, wenn der Analog/Digital Konverter des µC in Betrieb genommen wird.&lt;br /&gt;
&lt;br /&gt;
Für den Anschluss des ISP-Programmiergerätes kann man im Grunde jede beliebige Pin-Belegung des ISP Steckers benutzen, solange nur alle benötigten Leitungen mit dem Programmiergerät verbunden sind. In der Praxis haben sich allerdings bestimmte Belegungen durchgesetzt. Im Schaltbild ist eine &#039;&#039;&#039;eigene&#039;&#039;&#039; Belegung des 6-poligen Steckers gezeigt. Die alternative Pinbelegung eines 2-reihigen/10-poligen Steckers ist eine übliche Belegung. Benutzt man so eine übliche Belegung, so reicht normalerweise ein 10-poliges Flachbandkabel, um den vorhandenen ISP-Programmer so mit der Schaltung zu verbinden, dass alle Signale am richtigen Prozessorpin ankommen. Siehe auch [[AVR_In_System_Programmer]].&lt;br /&gt;
&lt;br /&gt;
Hier die Liste der benötigten Bauteile: &lt;br /&gt;
&lt;br /&gt;
* R1         Widerstand 10 kOhm&lt;br /&gt;
* C1         Keramikkondensator 47 nF&lt;br /&gt;
* C2, C3, C4 Keramik- oder Folienkondensator 100 nF&lt;br /&gt;
*            Stiftleiste 6-polig&lt;br /&gt;
*            Mikrocontroller ATmega8 oder ATmega8A (kann u.a. auf [http://shop.mikrocontroller.net/ http://shop.mikrocontroller.net/] bestellt werden)&lt;br /&gt;
*            Quarzoszillator 4 MHz&lt;br /&gt;
&lt;br /&gt;
Beim Steckbrett ist darauf zu achten, dass man die parallellaufenden Schienen für GND (blau) und Vcc (rot) jeweils mit Drähten verbindet (nicht Vcc und GND miteinander!).&lt;br /&gt;
&lt;br /&gt;
Eine Zusammenstellung der benötigten Bauteile befindet sich in der [[AVR-Tutorial_Bestellliste|Bestellliste]].&lt;br /&gt;
&lt;br /&gt;
Eine weitere Beschreibung für ein Minimalsystem gibt es [http://conelek.org/Mikrocontroller_Minimalsystem_mit_AVR_ATMega8 hier.]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 1px solid grey; padding: 1ex; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ergänzende Hinweise zur Taktversorgung (kann übersprungen werden) ===&lt;br /&gt;
&lt;br /&gt;
Ein Mikrocontroller benötigt, wie jeder Computer, eine Taktversorgung. Der Takt ist notwendig, um die internen Abläufe im Prozessor in einer zeitlich geordneten Reihenfolge ausführen zu können. Die Frequenz des Taktes bestimmt im Wesentlichen, wie schnell ein Mikrocontroller arbeitet. Bei einem ATMega8 gibt es viele Möglichkeiten zur Taktversorgung, die Wichtigsten sollen hier gezeigt werden.&lt;br /&gt;
&lt;br /&gt;
* interner RC-Oszillator, das ist der Auslieferungszustand&lt;br /&gt;
* Keramikresonator&lt;br /&gt;
* Quarz&lt;br /&gt;
* Quarzoszillator&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Vergleich der AVR-Taktquellen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Typ || Genauigkeit || Vorteile || Nachteile&lt;br /&gt;
|-&lt;br /&gt;
| interner&amp;lt;br&amp;gt;RC-Oszillator || 1-5% || Xtal1/2 Pins verfügbar&amp;lt;br&amp;gt;kostenlos&amp;lt;br&amp;gt;kein Platzbedarf&amp;lt;br&amp;gt;schnellstes Einschwingen (wenige Takte) || ungenau&amp;lt;br&amp;gt;Betrieb der [[UART]] riskant&lt;br /&gt;
|-&lt;br /&gt;
| Keramikresonator || 0,5-1% || ausreichend genau für [[UART]]&amp;lt;br&amp;gt;in sehr hohen Stückzahlen billiger als Quarz&amp;lt;br&amp;gt;schnelleres Einschwingen als Quarz (ca. 1ms) || XTAL1/2 Pins nicht verfügbar&amp;lt;br&amp;gt;Platzbedarf&lt;br /&gt;
|-&lt;br /&gt;
| Quarz || 10-100ppm || sehr genau&amp;lt;br&amp;gt;temperaturstabil || XTAL1/2 Pins nicht verfügbar&amp;lt;br&amp;gt;Platzbedarf&amp;lt;br&amp;gt;Kosten bei sehr hohen Stückzahlen (1000++)&amp;lt;br&amp;gt;langsames Anschwingen (ca. 10ms)&amp;lt;br&amp;gt;2 zusätzliche Ballast-Kondensatoren typ. 22 pF&lt;br /&gt;
|-&lt;br /&gt;
| Quarzoszillator || 1-100ppm || hochgenau&amp;lt;br&amp;gt;sehr temperaturstabil&amp;lt;br&amp;gt;liefert selbst ein Signal, kann dadurch [[AVR_Fuses#Taktquellen_Fuse_Einstellung | verfuste AVRs]] retten&amp;lt;br&amp;gt;kann mehrere Takteingänge treiben || XTAL1 Pin nicht verfügbar&amp;lt;br&amp;gt;Platzbedarf&amp;lt;br&amp;gt;Kosten bei sehr hohen Stückzahlen (1000++)&amp;lt;br&amp;gt;langsames Anschwingen (ca. 10ms)&lt;br /&gt;
|}&lt;br /&gt;
1ppm = 0,0001% (engl. one &#039;&#039;&#039;p&#039;&#039;&#039;art &#039;&#039;&#039;p&#039;&#039;&#039;er &#039;&#039;&#039;m&#039;&#039;&#039;illion, der millionste Teil) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;FF0000&amp;quot;&amp;gt;Achtung: Ein ATMega8 wird mit aktiviertem internen RC-Oszillator ausgeliefert. Um eine andere Taktquelle zu aktivieren, müssen die [[AVR Fuses#Taktquellen Fuse Einstellung|AVR Fuses]] des Prozessors verändert werden. Das muss jedoch sehr vorsichtig gemacht werden, siehe Artikel.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Keramikresonator ====&lt;br /&gt;
&lt;br /&gt;
Die Anbindung des Keramikresonators sieht so aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Resonator.png|framed|center| Resonator Standardbeschaltung]]&lt;br /&gt;
&lt;br /&gt;
Es werden keine Kondensatoren benötigt, diese sind schon eingebaut, daher ist der Anschluss eines Keramikschwingers kinderleicht. Achtung: Keramikresonatoren gibt es mit zwei oder drei Pins. Nur die mit drei Pins besitzen interne Kondensatoren.&lt;br /&gt;
&lt;br /&gt;
==== Quarz ====&lt;br /&gt;
&lt;br /&gt;
Die Anbindung des Quarzes sieht so aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:tutorial-quarz-schaltplan.png|center|framed| Quarz Standardbeschaltung]]&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren &#039;&#039;&#039;C3&#039;&#039;&#039; und &#039;&#039;&#039;C4&#039;&#039;&#039; sind zum Betrieb des Quarzes notwendig. Ihre Größe ist abhängig von den Daten des Quarzes. Zur Berechnung ihrer Größe gibt es die folgende Formel:&lt;br /&gt;
&lt;br /&gt;
C=2xCL-(CP+CI)&lt;br /&gt;
&lt;br /&gt;
* CP: Leiterbahnen bedingte Kapazität&lt;br /&gt;
* CI: Portbedingte Kapazität&lt;br /&gt;
* CL: Datenblatt des Quarzes&lt;br /&gt;
CP+CI ca. 5pF ?&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von CL = 32pF:&lt;br /&gt;
&lt;br /&gt;
C = 2x32pF-5pF = 59pF&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Spannungsversorgung ===&lt;br /&gt;
&lt;br /&gt;
Die Versorgungsspannung &#039;&#039;&#039;U&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt;&#039;&#039;&#039; beträgt 5V und kann z.&amp;amp;nbsp;B. mit der in diesem Kapitel beschriebenen Schaltung erzeugt werden. Falls zum Programmieren des Mikrocontrollers ein [[AVR_In_System_Programmer|ISP-Programmiergerät]] verwendet wird, das an die USB-Schnittstelle angeschlossen ist, kann man die Schaltung auch darüber mit Strom versorgen und dieses Kapitel überspringen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:V_Regler.gif|framed|center|Standard-Netzteilbeschaltung eines 7805]]&lt;br /&gt;
&lt;br /&gt;
Bauteile:&lt;br /&gt;
* IC1: 5V-Spannungsregler 7805&lt;br /&gt;
* C1: Elko 10µF (Polung beachten!)&lt;br /&gt;
* C2,C3: 2x Kondensator 100nF (kein Elektrolyt)&lt;br /&gt;
* D1: Diode 1N4001&lt;br /&gt;
&lt;br /&gt;
Hauptelement der Schaltung ist das IC 7805. Seine Aufgabe ist es aus der Versorgungsspannung stabile 5 V zu erzeugen. Dieses IC gibt es seit vielen Jahren und wird von vielen Chipherstellern produziert. Er stellt die einfachste Möglichkeit dar, aus einer vorhandenen Gleichspannung definierte 5 V zu erzeugen. Den 7805 gibt es in verschiedenen Ausführungen, was seine maximale Strombelastung angeht. Für die Zwecke dieses Tutorials ist die Standard-Variante, welche maximal 1 A abgeben kann, völlig ausreichend. Der 7805 enthält eine Übertemperatursicherung, so dass er abschaltet, wenn es ihm zu heiß wird. Auch ansonsten ist dieser Spannungsregler-IC kaum kaputt zu bekommen.&lt;br /&gt;
&lt;br /&gt;
Die beiden 100-nF-Kondensatoren haben die Aufgabe, eine mögliche Schwingneigung des 7805 zu unterdrücken. Sie müssen so nahe wie möglich an den Anschlusspins des 7805 angeschlossen werden, um ihre Wirkung zu entfalten.&lt;br /&gt;
&lt;br /&gt;
An den Eingang (+ und – im Schaltplan) wird ein Steckernetzteil mit einer Spannung von 7 .. 12 V angeschlossen. Der 7805 benötigt an seinem Eingang eine Gleichspannung, die mindestens 7 V beträgt. Auf der anderen Seite ergibt es auch keinen Sinn, wesentlich über 12 V Eingangsspannung hinauszugehen. Der 7805 ist ein Linearregler. Salopp gesagt, wird die überschüssige Spannung in Form von Wärme vernichtet. Deshalb die Kühlfahne zum thermischen Anschluss an eine Wärmesenke. Liegt die Eingangsspannung weit über 12 V, so wird schon wesentlich mehr Energie in Form von Wärme umgesetzt, als am Ausgang entnommen werden kann. Mal ganz davon abgesehen, dass der 7805 davon brennend heiß wird. Je nach Strombedarf der Gesamtschaltung kann es zweckmäßig sein, einen Schaltregler vorzusehen, wenn die Eingangsspannung stark schwanken kann, etwa für die alternative Speisung mit 24 V aus einem Schaltschrank oder dem LKW-Bordnetz. Für Anfänger führt das zu weit, und ein Kühlblech am 7805 tut es dann auch.&lt;br /&gt;
&lt;br /&gt;
Hier ein paar kleine Rechenbeispiele:&lt;br /&gt;
12 V Eingangsspannung – 5 V Ausgangsspannung = 7 V Differenz x 0,1 A Strombedarf der Schaltung ergibt die Verlustwärme die abgeführt werden muss.&lt;br /&gt;
&lt;br /&gt;
7 V × 0,1 A = 0,7 Watt&lt;br /&gt;
&lt;br /&gt;
Wenn man jetzt eine Eingangsspannung von 7 V nimmt, so dass die Mindestdifferenz von 2V noch eingehalten wird kommen wir zu diesen Werten&lt;br /&gt;
&lt;br /&gt;
2 V ×  0,1 A = 0,2 Watt Abwärme&lt;br /&gt;
2 V × 0,35 A = 0,7 Watt Abwärme oder anders gesagt, können wir der Schaltung 350 mA entnehmen und haben die gleiche Abwärme wie im oberen Beispiel mit nur 100 mA Stromentnahme.&lt;br /&gt;
&lt;br /&gt;
Man sieht, dass man die Eingangsspannung so klein wie möglich wählen sollte um dadurch die Verluste in Grenzen halten zu können. Außerdem ist es meist so, dass für eine geringere Stromentnahme auch eine niedrigere Differenzspannung ausreicht. In manchen Datenblätter ist z.B. angegeben 0,5 A = 1 V Spannungsgefälle und bei 1 A = 2 V Gefälle …&lt;br /&gt;
&lt;br /&gt;
Weiterhin sei gesagt, dass es so genannte Low-Drop-, Ultra-Low-Drop- usw. -Regler gibt, die mit einer viel kleineren Differenz zwischen Ein- und Ausgangsspannung zurechtkommen, wodurch man die Verluste noch weiter drücken kann.&lt;br /&gt;
&lt;br /&gt;
Eine Stromversorgung mit Batterien ist grundsätzlich auch möglich, wenn die elektrischen Grenzdaten des Mikrocontrollers eingehalten werden (max. Spannung, min. Spannung). Bei der geregelten Stromversorgung oben sollte die Batteriespannung ca. 1,5 .. 2,5 V (Dropout-Spannung des Linearreglers) größer sein als die Versorgungsspannung des Controllers. Die [[Versorgung aus einer Zelle]] ist ein Thema für Fortgeschrittene. In der Regel verzichtet man dabei auf die Spannungsregelung, da der Controller in einem weiten Speisespannungsbereich betriebsfähig ist.&lt;br /&gt;
&lt;br /&gt;
=== Beispielhafter Aufbau auf einem [[Steckbrett]] ===&lt;br /&gt;
&lt;br /&gt;
Auf einem [[Steckbrett]] könnte eine Schaltung etwa so aussehen:&lt;br /&gt;
&lt;br /&gt;
[[Bild:tutorial_grundschaltung_breadboard.jpg|600px|center|Steckbrett mit Selbstschaltung Atmega8 und Quarz als externe Taktquelle]]&lt;br /&gt;
&lt;br /&gt;
Hier ist die oben beschriebene Selbstbauschaltung zu sehen.  Spannungsversorgung (links), 6-poliger ISP-Anschluss (rechts hinter dem µC), Quarz mit 2 Kondensatoren statt Oszillator, erweitert um eine LED mit Vorwiderstand an PB0 (rechts vor dem µC), einem Resettaster (links vor dem µC) und einem Stützkondensator zwischen +5V und GND (rechts unten).&lt;br /&gt;
&lt;br /&gt;
=== Der ISP-Programmierer (In-System-Programmer)===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mikrocontroller.gif|framed|right|ISP Programmierer]]&lt;br /&gt;
Dann braucht man nur noch den &#039;&#039;&#039;ISP-Programmieradapter&#039;&#039;&#039;, über den man die Programme vom PC in den Controller übertragen kann. Eine Übersicht über mögliche ISP-Programmer Varianten findet sich im Artikel [[AVR_In_System_Programmer]].&lt;br /&gt;
&lt;br /&gt;
Fertige ISP-Programmer zum Anschluss an den Parallelport oder USB gibt es z.&amp;amp;nbsp;B. auf http://shop.mikrocontroller.net/. &lt;br /&gt;
&lt;br /&gt;
Eine Bauanleitung gibt es u.a. auf [http://www.rn-wissen.de/index.php/AVR-ISP_Programmierkabel http://www.rn-wissen.de/index.php/AVR-ISP_Programmierkabel] oder [http://rumil.de/hardware/avrisp.html http://rumil.de/hardware/avrisp.html].&lt;br /&gt;
&lt;br /&gt;
Den ISP-Adapter schließt man an den Parallelport an und verbindet ihn mit der Stiftleiste SV1 über ein 6-adriges Kabel (siehe Schaltplan).&lt;br /&gt;
&lt;br /&gt;
=== Sonstiges ===&lt;br /&gt;
&lt;br /&gt;
Wer vorausschauend kauft, kauft mehr als einen Mikrocontroller. Bis der erste Controller defekt ist, oder man durch Austauschen sicher gehen möchte, ob der Fehler im Programm oder im Controller ist, vergeht nur wenig Zeit.&lt;br /&gt;
&lt;br /&gt;
Tipp: Die Preise für Mikrocontroller haben eine deutliche Spannweite, nicht selten ist ein und derselbe Typ für 3 oder 8 Euro zu haben. Oft sind neuere oder größere Modelle billiger (ATmega8A statt ATmega8, ATmega328 statt ATmega8A). Eine Suche im Internet lohnt sich. Das Gleiche gilt für den Kauf von ISP-Programmierern.&lt;br /&gt;
&lt;br /&gt;
Für weitere Kapitel dieses Tutorials sollte man sich noch die folgenden Bauteile besorgen: &lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 2 (I/O-Grundlagen)&lt;br /&gt;
* 6 LEDs 5mm (Standard-LED, ruhig auch in unterschiedlichen Farben, rot/gelb/grün)&lt;br /&gt;
* 5 Taster&lt;br /&gt;
* 6 Widerstände 1k&lt;br /&gt;
* 5 Widerstände 10k&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 6 (LC-Display)&lt;br /&gt;
* 1 Potentiometer 10k&lt;br /&gt;
* 1 HD44780-kompatibles LCD, z.&amp;amp;nbsp;B. 4x20 oder 2x16 Zeichen&lt;br /&gt;
*   besitzt das LCD eine Hintergrundbeleuchtung, dann noch einen Vorwiderstand dafür. Details dazu stehen im Datenblatt des LCD. Ein Wert von 50Ω sollte aber in jedem Fall passen. Schlimmstenfalls ist die Hintergrundbeleuchtung dann etwas zu dunkel.&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 10 (Der UART)&lt;br /&gt;
* 1 Pegelwandler MAX232, MAX232&#039;&#039;&#039;A&#039;&#039;&#039; oder MAX202&lt;br /&gt;
* 5 Kondensatoren&lt;br /&gt;
** Bei einem MAX232: je 1µF Elektrolytkondensator&lt;br /&gt;
** Bei einem MAX202 oder MAX232&#039;&#039;&#039;A&#039;&#039;&#039;: je  100nF Keramik- oder Elektrolytkondensator&lt;br /&gt;
:Die Kondensatoren dürfen auch größer sein. Ist man sich nicht sicher, welchen MAX232 man hat (A oder nicht A), dann die größeren Kondensatoren 1µF nehmen, die funktionieren auch beim MAX232A oder MAX202.&lt;br /&gt;
* 1 9-polige SUBD-Buchse (female)&lt;br /&gt;
* 1 dazu passendes Modem(nicht Nullmodem!)-Kabel&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 14 (ADC)&lt;br /&gt;
* 1 Kondensator 100n&lt;br /&gt;
* 1 Potentiometer 10k&lt;br /&gt;
* nach Lust und Laune temperatur- oder lichtabhängige Widerstände und jeweils einen Widerstand in der gleichen Größenordnung wie der Sensor&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 17 (Schieberegister)&lt;br /&gt;
* 2 Schieberegister 74HC595&lt;br /&gt;
* einige LED, damit man an die Schieberegister auch etwas anschließen kann, samt passenden Vorwiderständen&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 19 (7-Segmentanzeige)&lt;br /&gt;
* 4 7-Segmentanzeigen mit gemeinsamer Anode&lt;br /&gt;
* 4 PNP-Transistoren BC328&lt;br /&gt;
* 4 Widerstände 1k&lt;br /&gt;
* 7 Widerstände 100Ω&lt;br /&gt;
&lt;br /&gt;
Für weitere Bauteile, die man als angehender µC Bastler auch des Öfteren mal benötigt, empfiehlt sich ein Blick in die Liste der [[Standardbauelemente]] bzw. in die [[Absolute_beginner|Grundausstattung]]. Wenn Ihr Händler Großpackungen (zb. 100 Stück) von 100n Kondensatoren, 10k, 1k oder 100Ω Widerständen anbietet, sollten Sie deren Erwerb in Erwägung ziehen. Diese Bauteile benötigt man oft, und derartige Großpackungen sind meist nicht teurer, als wenn man einige wenige Exemplare einzeln kauft. Dies hängt damit zusammen, dass das Herauszählen von 9 Bauteilen für den Verkäufer teurer kommt, als 100 Bauteile abgepackt aus dem Regal zu nehmen.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
In diesem Tutorial wird nur auf die Programmierung in Assembler eingegangen, da Assembler für das Verständnis der Hardware am besten geeignet ist.&lt;br /&gt;
&lt;br /&gt;
=== Assembler ===&lt;br /&gt;
&lt;br /&gt;
Zuerst braucht man einen &#039;&#039;&#039;Assembler&#039;&#039;&#039;, der in Assemblersprache geschriebene Programme in Maschinencode übersetzt. Windows-User können das [http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2725 AVR-Studio] von Atmel verwenden, das neben dem Assembler auch einen Simulator enthält, mit dem sich die Programme vor der Übertragung in den Controller testen lassen; für Linux gibt es [http://www.tavrasm.org/ tavrasm], [http://avra.sourceforge.net/ avra] und [http://avr-asm-tutorial.net/gavrasm/index_de.html gavrasm]. &lt;br /&gt;
&lt;br /&gt;
Um die vom Assembler erzeugte &amp;quot;.hex&amp;quot;-Datei über den ISP-Adapter in den Mikrocontroller zu programmieren, kann man unter Windows z.&amp;amp;nbsp;B. das Programm [http://www.myplace.nu/avr/yaap/ yaap] verwenden, für Linux gibt es [http://savannah.nongnu.org/projects/uisp/ uisp], für beide [http://www.mikrocontroller.net/articles/AVRDUDE avrdude].&lt;br /&gt;
&lt;br /&gt;
=== C ===&lt;br /&gt;
Wer in C programmieren möchte, kann den kostenlosen GNU-C-Compiler AVR-GCC (unter Windows &amp;quot;WinAVR&amp;quot;) ausprobieren. Dieser C-Compiler kann auch in das für Assembler-Programmierung notwendige AVR-Studio integriert werden. In der Artikelsammlung gibt es ein umfangreiches [[AVR-GCC-Tutorial|Tutorial]] zu diesem Compiler;&lt;br /&gt;
&lt;br /&gt;
Wer unter Windows und Linux gleichermassen kostenlos entwickeln will, der sollte sich die [http://www.eclipse.org/ IDE Eclipse for C/C++ Developers] und das [http://avr-eclipse.sourceforge.net/wiki/index.php/The_AVR_Eclipse_Plugin AVR-Eclipse Plugin ] ansehen, beide sind unter Windows und Linux einfach zu installieren. Hier wird auch der AVR-GCC benutzt. In der Artikelsammlung gibt es ein umfangreiches [[AVR Eclipse|AVR Eclipse Tutorial]] zu dieser IDE.&lt;br /&gt;
Ebenfalls unter Linux und Windows verfügbar ist die Entwicklungsumgebung [http://www.codeblocks.org/ Code::Blocks] (aktuelle, stabile Versionen sind als Nightly Builds regelmäßig im [http://forums.codeblocks.org/ Forum] verfügbar). Innerhalb dieser Entwicklungsumgebung können ohne die Installation zusätzlicher Plugins &amp;quot;AVR-Projekte&amp;quot; angelegt werden.&lt;br /&gt;
&lt;br /&gt;
Fragen dazu stellt man am besten hier im [http://www.mikrocontroller.net/forum/list-2-1.html GCC-Forum].&lt;br /&gt;
&lt;br /&gt;
=== Pascal ===&lt;br /&gt;
Wer in Pascal programmieren muss, kann [http://www.e-lab.de AVRPascal] ausprobieren.&amp;lt;br&amp;gt; &lt;br /&gt;
Dieser Pascalcompiler ist kostenfrei bis 4kb Code und bietet viele ausgereifte Bibliotheken für Servoansteuerung, Serielle Schnittstellen (COM, TWI, SPI), PWM, Timernutzung, LC-Displays usw.&amp;lt;br&amp;gt; &lt;br /&gt;
Außerdem gibt es eine kostenfreie Version für den Mega8 und den Mega88.&lt;br /&gt;
[http://www.e-lab.de E-LAB].&lt;br /&gt;
&lt;br /&gt;
=== Basic ===&lt;br /&gt;
Auch Basic-Fans kommen nicht zu kurz, für die gibt es z.&amp;amp;nbsp;B. [[Bascom AVR]] ($69, Demo verfügbar) oder das kostenlose [[http://avr.myluna.de LunaAVR]].&lt;br /&gt;
&lt;br /&gt;
=== Forth ===&lt;br /&gt;
Wer einen direkten und interaktiven Zugang zum Controller haben will, sollte sich [http://amforth.sourceforge.net Forth] anschauen. Voraussetzung ist ein serieller Anschluß (Max232), also etwas mehr als die Minimalbeschaltung.&lt;br /&gt;
&lt;br /&gt;
== Bereit für das erste Programm? ==&lt;br /&gt;
&lt;br /&gt;
Zum nächsten Kapitel geht es erst, wenn man Hard- und Software in einer Weise zum Funktionieren gebracht hat, dass:&lt;br /&gt;
* die Programmiersoftware das Programmiergerät erkennt&lt;br /&gt;
* die Programmiersoftware den Mikrocontroller erkennt (alle heute üblichen Controller haben eine typspezifische Selbsterkennung), dazu muss der Controller mit Strom versorgt sein&lt;br /&gt;
* die verwendete Erstell-Software (bspw. der Assembler) aus einem leeren oder Beispiel-Projekt eine Programmier-Datei erstellt (meistens eine .HEX-Datei), die man in die Programmiersoftware laden kann (noch nicht in den Controller programmieren!)&lt;br /&gt;
Diesen arbeitsfähigen Zustand zu erreichen ist im Eigenbau (etwa dem Steckbrett) schwieriger als mit einem Starterkit — und der wichtigste Grund warum viele das Geld für das ansonsten nutzlose Starterkit ausgeben.&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
Bevor man anfängt, sollte man sich die folgenden PDF-Dateien runterladen und zumindest mal reinschauen:&lt;br /&gt;
&lt;br /&gt;
* [http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf Datenblatt des ATmega8 (4,54 MB)]&lt;br /&gt;
* [http://www.atmel.com/dyn/resources/prod_documents/doc0856.pdf Befehlssatz der AVRs (1,27 MB)]&lt;br /&gt;
* oder [http://www.avr-modelleisenbahn.de/controller/befehle/avr-befehle.htm Befehlssatz in deutscher Übersetzung online]&lt;br /&gt;
* oder [http://www.avr-modelleisenbahn.de/controller/atmega8/atmega8.htm Datenblatt des ATmega8 in deutscher Übersetzung online]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Datenblatt eines Controllers ist das wichtigste Dokument für einen Entwickler. Es enthält Informationen über die Pinbelegung, Versorgungsspannung, Beschaltung, Speicher, die Verwendung der IO-Komponenten und vieles mehr.&lt;br /&gt;
&lt;br /&gt;
Im Befehlssatz sind alle Assemblerbefehle der AVR-Controllerfamilie aufgelistet und erklärt.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
{{Navigation_hochvor|	 &lt;br /&gt;
hochtext=Inhaltsverzeichnis|	 &lt;br /&gt;
hochlink=AVR-Tutorial|	 &lt;br /&gt;
vortext=I/O Grundlagen|	 &lt;br /&gt;
vorlink=AVR-Tutorial: IO-Grundlagen}}	 &lt;br /&gt;
 &lt;br /&gt;
[[Category:AVR-Tutorial|Equipment]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=FAQ&amp;diff=82894</id>
		<title>FAQ</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=FAQ&amp;diff=82894"/>
		<updated>2014-05-04T11:50:43Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Wiederhergestellt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein Verzeichnis von im Forum oft gestellten und immer wieder beantworteten Fragen und den zugehörigen Antworten:&lt;br /&gt;
&lt;br /&gt;
=Wie kann ich Zahlen auf [[LCD]]/[[UART]] ausgeben?=&lt;br /&gt;
&lt;br /&gt;
Aber die Bibliothek, die du benutzt, stellt nur eine Funktion zur Verfügung, mit der man einen String ausgeben kann... Was tun? &lt;br /&gt;
&lt;br /&gt;
In den folgenden Beispielen wird eine selbstgeschriebene Funktion zur Stringausgabe auf LCD - die Funktion lcd_string() - aus dem [[AVR-GCC-Tutorial/LCD-Ansteuerung|LCD-Teil des AVR-GCC-Tutorials]] verwendet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
lcd_string( &amp;quot;Hallo Welt&amp;quot; );  // ggf. auch lcd_out() o.ä. in anderen Libraries&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um also eine Zahl (numerische Konstante oder Variableninhalt) auszugeben, muss von dieser Zahl zunächst ihre String-Repräsentation ermittelt werden. Hier geht es aber nur darum, zu zeigen wie man diese String Repräsenation erzeugen kann. Was man dann mit diesem String weiter macht, ob das dann eine LCD-Ausgabe oder eine UART-Übertragung oder das Abspeichern auf SD-Karte oder ... ist, spielt eine untergeordnete Rolle.&lt;br /&gt;
&lt;br /&gt;
Es gibt mehrere Möglichkeiten, sich die Stringrepräsentation zu erzeugen:&lt;br /&gt;
&lt;br /&gt;
===itoa() (utoa(), ltoa(), ultoa(), ftoa() )===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;itoa()&amp;lt;/b&amp;gt; ist keine C-Standardfunktion (wohl aber ihre Umkehrung &amp;lt;b&amp;gt;atoi()&amp;lt;/b&amp;gt; ). Auf manchen Compilern heisst diese Funktion dann folgerichtig &amp;lt;b&amp;gt;_itoa()&amp;lt;/b&amp;gt;, wobei der führende _ eben anzeigt, dass es sich um eine Erweiterung des C-Standards handelt. Bei [[WinAVR]] ist itoa() Bestandteil der mitgelieferten Library avr-libc, in der Library [http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html&#039;&#039;stdlib.h&#039;&#039;].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
  char Buffer[20];&lt;br /&gt;
  int i = 25;&lt;br /&gt;
&lt;br /&gt;
  itoa( i, Buffer, 10 );&lt;br /&gt;
  lcd_string( Buffer ); // ggf. auch lcd_out() o.ä. in anderen Libraries&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;itoa( i, Buffer, 10 );&amp;lt;/b&amp;gt; - Die Zahl i wird nach ASCII gewandelt und die String Repräsentierung davon wird in Buffer abgelegt. Die Basis, in der diese Wandlung erfolgt, ist das 10-er System. Wird das dritte Argument von 10 in zb. 2 oder auch 16 abgewandelt, erhält man die binäre oder eben eine hexadezimale Repräsentierung des Wertes. Auch wenn 10, 2 und 16 die häufigsten Angaben an dieser Stelle sind, kann itoa aber grundsätzlich in jedes beliebige Zahlensystem wandlen.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist, darauf zu achten, dass das Array &amp;lt;i&amp;gt;Buffer&amp;lt;/i&amp;gt; groß genug dimensioniert wird, um alle Zeichen der Textrepräsentation der Zahl aufzunehmen - inklusive der 0, die den String abschließt, sowie ein mögliches Vorzeichen.&lt;br /&gt;
&lt;br /&gt;
Anzumerken bleibt weiter, dass es normalerweise für alle Datentypen entsprechende Umwandlungsfunktionen gibt, wenn es sie für einen Datentyp gibt. Die Namensgebung lehnt sich an das Schema an: &#039;&#039;Kürzel_für_den_Datentyp to a&#039;&#039;. Eine Funktion die einen unsigned int wandelt, heißt dann utoa (oder _utoa), Floating Point heißt dann ftoa (oder _ftoa), etc.&lt;br /&gt;
&lt;br /&gt;
===sprintf()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  char Buffer[20];&lt;br /&gt;
  int i = 25;&lt;br /&gt;
&lt;br /&gt;
  sprintf( Buffer, &amp;quot;%d&amp;quot;, i );&lt;br /&gt;
  lcd_string( Buffer ); // ggf. auch lcd_out() o.ä. in anderen Libraries&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Methode funktioniert auch bei long oder float Werten. Unbedingt beachtet werden muss allerdings, dass die Typkennzeichnungen im sog. Format-String (hier &amp;quot;%d&amp;quot;) mit den tatsächlichen Typen der auszugebenden Werten übereinstimmt. Und dass der Buffer, der den Text aufnimmt, auch groß genug dimensioniert wird. Dabei sollte die 0, die den String terminiert, nicht vergessen werden.&lt;br /&gt;
&lt;br /&gt;
Mit sprintf() hat man dieselben Möglichkeiten zur Formatierung wie bei &amp;lt;b&amp;gt;printf()&amp;lt;/b&amp;gt; (siehe unten). Insbesondere gibt es natürlich die Möglichkeit die Zahl gleich in einen umgebenden Text einzubetten bzw. Formatierungen anzugeben:&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  char Buffer[20];&lt;br /&gt;
  int i = 25;&lt;br /&gt;
&lt;br /&gt;
  sprintf( Buffer, &amp;quot;Anzahl: %d Stueck&amp;quot;, i );&lt;br /&gt;
  lcd_out( Buffer );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;Haken&amp;quot; an der mächtigen Funktion sprintf() ist, daß sie auch bei minimalisierter Konfiguration verhältnismäßig viel Programmspeicher (Flash-ROM) belegt und relativ viel Prozesszeit benötigt. Daher sollte man sprintf() nur verwenden, wenn kein Speicher- und Prozesszeitmangel besteht. Sonst sollte itoa() oder eine eigene, auf die Bedürfnisse optimierte Implementierung auf jeden Fall vorgezogen werden. Der große Vorteil von sprintf liegt darin, dass man über sehr mächtige Formatiermöglichkeiten verfügt, mit der man die Ausgabe einfach steuern und an seine Bedürfnisse anpassen kann. Dinge die man mit einer Funktion wie itoa alle selbst &#039;händisch&#039; erledigen muss.&lt;br /&gt;
&lt;br /&gt;
====Formatierungen mit printf====&lt;br /&gt;
&lt;br /&gt;
Für jedes auszugebende Argument muss es im Formatstring einen entsprechenden Formatbezeichner geben. Der Aufbau eines Formatbezeichners ist immer&lt;br /&gt;
&lt;br /&gt;
  %[Modifizierer][Feldbreite][.Präzision]Typ&lt;br /&gt;
&lt;br /&gt;
(Die in eckigen Klammern [ ] angegebenen Elemente können auch weggelassen werden, wenn man sie nicht benötigt. Im einfachsten Fall benötigt man also nur das % und den Buchstaben zur Typ-Kennung.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Typ&amp;lt;/b&amp;gt; ist dabei eine Kennung, der mit dem Datentyp des jeweiligen auszugebenden Argumentes übereinstimmen muss. Einige oft benutzte Kennungen, ohne Anspruch auf Vollständigkeit, sind:&lt;br /&gt;
  &amp;lt;b&amp;gt;c&amp;lt;/b&amp;gt;    char&lt;br /&gt;
  &amp;lt;b&amp;gt;d&amp;lt;/b&amp;gt;    int&lt;br /&gt;
  &amp;lt;b&amp;gt;f&amp;lt;/b&amp;gt;    float, double&lt;br /&gt;
  &amp;lt;b&amp;gt;ld&amp;lt;/b&amp;gt;   long&lt;br /&gt;
  &amp;lt;b&amp;gt;u&amp;lt;/b&amp;gt;    unsigned int&lt;br /&gt;
  &amp;lt;b&amp;gt;lu&amp;lt;/b&amp;gt;   unsigned long&lt;br /&gt;
  &amp;lt;b&amp;gt;p&amp;lt;/b&amp;gt;    pointer&lt;br /&gt;
  &amp;lt;b&amp;gt;s&amp;lt;/b&amp;gt;    string&lt;br /&gt;
  &amp;lt;b&amp;gt;x&amp;lt;/b&amp;gt;    ein int wird ausgegeben, die Ausgabe erfolgt&lt;br /&gt;
       aber als Hexadezimalzahl&lt;br /&gt;
  &amp;lt;b&amp;gt;X&amp;lt;/b&amp;gt;    ein int wird ausgegeben, die Ausgabe erfolgt&lt;br /&gt;
       aber als Hexadezimalzahl, wobei Grossbuchstaben verwendet werden&lt;br /&gt;
&lt;br /&gt;
Der&#039;&#039;Modifizierer&#039;&#039; bestimmt, wie und womit nicht benutzte Felder des Ausgabefeldes gefüllt werden sollen, wie die Ausrichtung innerhalb des Feldes erfolgen soll und ob ein Vorzeichen auch dann ausgegeben werden soll wenn die auszugebende Zahl positiv ist. Wird kein Modifizierer angegeben, so werden nicht benutzte Felder mit einem Leerzeichen gefüllt, positive Vorzeichen unterdrückt und die Ausgabe im Feld rechts ausgerichtet.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;b&amp;gt;+&amp;lt;/b&amp;gt;    Vorzeichen wird immer ausgegeben&lt;br /&gt;
  &amp;lt;b&amp;gt;-&amp;lt;/b&amp;gt;    Die Ausgabe wird im Ausgabefeld linksbündig ausgerichtet&lt;br /&gt;
  &amp;lt;b&amp;gt;0&amp;lt;/b&amp;gt;    anstelle von Leerzeichen werden führende 0-en ausgegeben&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;Feldbreite&#039;&#039; gibt die Breite des Ausgabefeldes an, in die die Ausgabe durchgeführt werden soll. Reicht die angegebene Feldbreite nicht aus, so vergrößert printf diese Breite eigenmächtig. Die Feldbreite muß nicht angegeben werden. In diesem Fall bestimmt printf selbst die Feldbreite, so dass die Ausgabe darin Platz findet. Mit der Feldbreite hat man eine simple Möglichkeit dafür zu sorgen, dass der erzeugte String immer eine konstante Länge hat, selbst wenn die auszugebende Zahl diese Länge gar nicht benötigen würde (wichtig zb. bei Tabellen, damit die Einerstellen der Tabelleneinträge auch sauber untereinander stehen, auch dann wenn die Zahlen sich in unterschiedlichen Wertebereichen bewegen).&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;Präzision&#039;&#039; kommt nur bei float oder double Zahlen zum Einsatz. Sie legt fest, wieviele Positionen der kompletten Feldbreite für die Ausgabe von Nachkommastellen reserviert werden sollen. Auch sie muss wiederrum nicht angegeben werden und printf benutzt in so einem Fall Standardvorgaben.&lt;br /&gt;
&lt;br /&gt;
===== Beispiele =====&lt;br /&gt;
;&amp;lt;tt&amp;gt;&amp;quot;%d&amp;quot;&amp;lt;/tt&amp;gt;: Ausgabe eines Integer&lt;br /&gt;
;&amp;lt;tt&amp;gt;&amp;quot;%5d&amp;quot;&amp;lt;/tt&amp;gt;: Ausgabe eines Integer in einem Feld mit 5 Zeichen Breite&lt;br /&gt;
;&amp;lt;tt&amp;gt;&amp;quot;%05d&amp;quot;&amp;lt;/tt&amp;gt;: Ausgabe eines Integer in einem Feld mit 5 Zeichen Breite, wobei das Feld links mit führenden Nullen auf 5 Zeichen aufgefüllt wird&lt;br /&gt;
;&amp;lt;tt&amp;gt;&amp;quot;%-5d&amp;quot;&amp;lt;/tt&amp;gt;: Ausgabe eines Integer in einem Feld mit 5 Zeichen Breite. Die Zahl wird linksbündig in das Feld gestellt.&lt;br /&gt;
;&amp;lt;tt&amp;gt;&amp;quot;%6.3f&amp;quot;&amp;lt;/tt&amp;gt;: Ausgabe eines float (oder double). Die Ausgabe erfolgt in einem Feld mit 6 Zeichen Breite, wobei 3 Nachkommastellen ausgegeben werden. Achtung: In der Feldbreite ist auch ein eventuelles Vorzeichen sowie der Dezimalpunkt enthalten. Bei einer Feldbreite von 6 Zeichen und 3 Nachkommastellen, bleiben bei einer positiven Zahl daher nur 2 Positionen für den Vorkommaanteil, bei negativen sogar nur 1 Stelle (6 - 3 Nachkommastellen - 1 Dezimalpunkt - 1 Vorzeichen = 1)&lt;br /&gt;
&lt;br /&gt;
===Eigene Umwandlungsfunktionen===&lt;br /&gt;
&lt;br /&gt;
Möchte man &amp;lt;b&amp;gt;itoa()&amp;lt;/b&amp;gt; nicht benutzen oder hat es gar auf seinem System nicht zur Verfügung, dann ist es auch nicht schwer, sich selbst eine Funktion dafür zu schreiben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void ItoA( int z, char* Buffer )&lt;br /&gt;
{&lt;br /&gt;
  int i = 0;&lt;br /&gt;
  int j;&lt;br /&gt;
  char tmp;&lt;br /&gt;
  unsigned u;    // In u bearbeiten wir den Absolutbetrag von z.&lt;br /&gt;
  &lt;br /&gt;
    // ist die Zahl negativ?&lt;br /&gt;
    // gleich mal ein - hinterlassen und die Zahl positiv machen&lt;br /&gt;
    if( z &amp;lt; 0 ) {&lt;br /&gt;
      Buffer[0] = &#039;-&#039;;&lt;br /&gt;
      Buffer++;&lt;br /&gt;
      // -INT_MIN ist idR. größer als INT_MAX und nicht mehr &lt;br /&gt;
      // als int darstellbar! Man muss daher bei der Bildung &lt;br /&gt;
      // des Absolutbetrages aufpassen.&lt;br /&gt;
      u = ( (unsigned)-(z+1) ) + 1; &lt;br /&gt;
    }&lt;br /&gt;
    else { &lt;br /&gt;
      u = (unsigned)z;&lt;br /&gt;
    }&lt;br /&gt;
    // die einzelnen Stellen der Zahl berechnen&lt;br /&gt;
    do {&lt;br /&gt;
      Buffer[i++] = &#039;0&#039; + u % 10;&lt;br /&gt;
      u /= 10;&lt;br /&gt;
    } while( u &amp;gt; 0 );&lt;br /&gt;
&lt;br /&gt;
    // den String in sich spiegeln&lt;br /&gt;
    for( j = 0; j &amp;lt; i / 2; ++j ) {&lt;br /&gt;
      tmp = Buffer[j];&lt;br /&gt;
      Buffer[j] = Buffer[i-j-1];&lt;br /&gt;
      Buffer[i-j-1] = tmp;&lt;br /&gt;
    }&lt;br /&gt;
    Buffer[i] = &#039;\0&#039;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Grundprinzip ist einfach:&amp;lt;br&amp;gt;&lt;br /&gt;
Die Ermittlung der einzelnen Stellen erfolgt in der zentralen Schleife&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    do {&lt;br /&gt;
      Buffer[i++] = &#039;0&#039; + u % 10;&lt;br /&gt;
      u /= 10;&lt;br /&gt;
    } while( u &amp;gt; 0 );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
durch fortgesetzte Division durch 10 und Restbildung.&lt;br /&gt;
&lt;br /&gt;
    8392&lt;br /&gt;
&lt;br /&gt;
    8392 % 10           -&amp;gt; &amp;lt;b&amp;gt;2&amp;lt;/b&amp;gt;&lt;br /&gt;
    8392 / 10  -&amp;gt; 839&lt;br /&gt;
&lt;br /&gt;
     839 % 10           -&amp;gt; &amp;lt;b&amp;gt;9&amp;lt;/b&amp;gt;&lt;br /&gt;
     839 / 10  -&amp;gt; 83&lt;br /&gt;
&lt;br /&gt;
      83 % 10           -&amp;gt; &amp;lt;b&amp;gt;3&amp;lt;/b&amp;gt;&lt;br /&gt;
      83 / 10  -&amp;gt; 8&lt;br /&gt;
&lt;br /&gt;
       8 % 10           -&amp;gt; &amp;lt;b&amp;gt;8&amp;lt;/b&amp;gt;&lt;br /&gt;
       8 / 10  -&amp;gt; 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nur leider erhält man dadurch die einzelnen Ziffern der Zahl in umgekehrter Reihenfolge im String (&#039;2&#039; &#039;9&#039; &#039;3&#039; &#039;8&#039; anstelle von &#039;8&#039; &#039;3&#039; &#039;9&#039; &#039;2&#039;). Dies ist aber kein Problem, die nachfolgende Schleife&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  for( j = 0; j &amp;lt; i / 2; ++j ) {&lt;br /&gt;
    tmp = Buffer[j];&lt;br /&gt;
    Buffer[j] = Buffer[i-j-1];&lt;br /&gt;
    Buffer[i-j-1] = tmp;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
spiegelt den String in sich, sodass danach der String eine korrekte Repräsentation der ursprünglichen Zahl darstellt. Der Funktionsteil vor der &#039;Zerlegeschleife&#039; behandelt den Sonderfall daß die Zahl negativ ist. Negative Zahlen werden behandelt indem im Endergebnis ein &#039;-&#039; vermerkt wird und danach die Zahl positiv gemacht wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* Forenbeitrag [http://www.mikrocontroller.net/topic/67405#541885 Integer-Zahl in String mit bestimmter Zeichenlänge]&lt;br /&gt;
* Forenbeitrag [http://www.mikrocontroller.net/topic/84005#704736 (Resourcenschonend) Wert einer Variable am LCD ausgeben] von Niels Hüsken &lt;br /&gt;
* Forenbeitrag [http://www.mikrocontroller.net/topic/121526?goto=new#new Formatierte Zahlenausgabe in C] von  Peter Dannegger&lt;br /&gt;
* [[Festkommaarithmetik]]&lt;br /&gt;
&lt;br /&gt;
=Datentypen in Operationen=&lt;br /&gt;
Ein häufiges Problem betrifft die Auswertung von Ausdrücken. Konkret die Frage nach den beteiligten Datentypen.&lt;br /&gt;
zb&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
double i;&lt;br /&gt;
int j, k;&lt;br /&gt;
&lt;br /&gt;
i = j / k;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Frage lautet dann: Warum erhalte ich keine Kommastellen, ich weise doch das Ergebnis einem double zu?&lt;br /&gt;
&lt;br /&gt;
Dazu ist zu sagen, dass C nicht so funktioniert. Die Tatsache dass i eine double Variable ist, ist für die Auswahl der Operation, welche die Division durchführt, völlig irrelevant. C orientiert sich ausschliesslich an den &lt;br /&gt;
Datentypen der beteiligten Operanden, um zu entscheiden ob die Division als Integer- oder als Gleitkommadivision durchzuführen ist. Und da sowohl j als auch k ein Integer sind, wird die Division als Integerdivision durchgeführt&lt;br /&gt;
unabhängig davon, was mit dem Ergebnis weiter passiert. Erst nach der Division wird das Ergebnis in einen double überführt, um es an i zuweisen zu können. Zu diesem Zeitpunkt gibt es aber keine Kommastellen mehr, eine Integerdivision erzeugt keine. Und damit tauchen klarerweise auch im Ergebnis keine auf.&lt;br /&gt;
&lt;br /&gt;
Aus genau diesem Grund ist zb das Ergebnis von&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
double i;&lt;br /&gt;
i = 5 / 8;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
eine glatte 0 und nicht 0.625. Die Division 5 / 8 wird als Integer Division gemacht und liefert als solche keine Nachkommastellen. Wird das Ergebnis der Division in einen double umgewandelt, um es an i zuweisen zu können, ist das Kind schon in den Brunnen gefallen: Die Nachkommastellen sind schon längst weg bzw. waren nie vorhanden.&lt;br /&gt;
&lt;br /&gt;
Will man den Compiler dazu zwingen, die Division als Gleitkommadivision durchzuführen, so muss man daher dafür sorgen, dass mindestens einer der beteiligten Operanden ein double Wert ist. Dann bleibt dem Compiler nichts anderes übrig, als auch den zweiten Operanden ebenfalls zu einem double zu machen und die Operation als Gleitkommaoperation durchzuführen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
double i;&lt;br /&gt;
i = 5.0 / 8.0;&lt;br /&gt;
&lt;br /&gt;
i = (double)j / k;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generell implementiert der Compiler eine Operation immer im &#039;höchsten&#039; Datentyp, der in dieser Operation vorkommenden Operanden. Operanden in einem &#039;niedrigeren&#039; Datentyp werden automatisch immer in diesen &#039;höchsten&#039; Datentyp umgewandelt, zumindest aber int. Die Reihung orientiert sich dabei an der Regel: Ein &#039;höherer&#039; Datentyp kann alle Werte eines &#039;niedrigeren&#039; Datentyps aufnehmen.&lt;br /&gt;
&lt;br /&gt;
    int&lt;br /&gt;
    unsigned int&lt;br /&gt;
    long&lt;br /&gt;
    unsigned long&lt;br /&gt;
    long long&lt;br /&gt;
    unsigned long long&lt;br /&gt;
    double&lt;br /&gt;
    &lt;br /&gt;
float kommt in dieser Tabelle gar nicht vor, da Gleitkommaoperationen grundsätzlich immer als double-Operationen durchgeführt werden. Wohl kann es aber sein, dass double und float dieselbe Anzahl an Bits benutzen. Damit reduziert sich eine double Operation effektiv auf eine float Operation. (Anmerkung: mit dem C99-Standard hat sich dieses geändert. Dort gibt es dann auch echte float Operationen)&lt;br /&gt;
&lt;br /&gt;
Hat man also in einer Operation 2 Operanden der Datentypen int und long, so wird der int implizit zu einem long gemacht und die Operation als long Operation durchgeführt. Das Ergebnis hat dann den Datentyp long.&lt;br /&gt;
&lt;br /&gt;
==Welche Datentypen haben Konstanten==&lt;br /&gt;
&lt;br /&gt;
Auch Zahlenkonstante besitzen einen Datentyp, der selbstverständlich vom Compiler bei der Auswahl der Operation berücksichtigt wird. Hier gilt die Regel: Benutzt wird der Datentyp, der die Zahl gerade noch aufnehmen kann. Eine Zahlenkonstante 5 hat daher den Datentyp int. Die Zahl 32767 passt gerade noch in einen int, und hat daher den Datentyp int. 32768 ist für einen int bereits zu groß und hat daher den Datentyp long. 5.0 ist hingegem immer eine double-Konstante. Der Dezimalpunkt erzwingt dieses.&lt;br /&gt;
&lt;br /&gt;
Eine kleine Feinheit gibt es noch zu beachten. Konstanten in dezimaler Schreibweise haben immer einen signed Datentyp, während Konstanten in hexadezimaler bzw. oktaler Schreibweise je nach Wert einen signed oder einen unsigned Datentyp haben können.&lt;br /&gt;
&lt;br /&gt;
Möchte man einer Konstanten einen bestimmten Datentyp aufzwingen, so gibt es dazu 2 (ein halb) Möglichkeiten:&lt;br /&gt;
* Entweder man castet die Konstante in den gewünschten Datentyp&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
   (long)5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* oder man benutzt die in C dafür vorgesehene Schreibweise, indem man der Konstanten einen Suffix anhängt, der den gewünschten Datentyp beschreibt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    5L&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Beides ergibt eine dezimale 5, die vom Datentyp long ist.&lt;br /&gt;
&lt;br /&gt;
* eine Zahl in mit einem Dezimalkomma&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    5.0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ist immer eine double Zahl. Es sei denn sie hat explizit einen Suffix&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    5.0F&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
dann hat man es mit einer float Zahl zu tun.&lt;br /&gt;
&lt;br /&gt;
Die gültigen Suffixe für Zahlen sind U, L, UL und F:&lt;br /&gt;
&lt;br /&gt;
* U wie unsigned; dabei wird zuerst int angenommen. Es erfolgt eine automatische Ausweitung auf long, wenn die Zahl den Wertebereich eines unsigned int überschreitet. &lt;br /&gt;
* L wie long; die Zahl selbst kann int oder double sein.&lt;br /&gt;
* UL wie unsigned long. Eigentlich eine Zusammensetzung aus U und L&lt;br /&gt;
* F wie float.&lt;br /&gt;
&lt;br /&gt;
Präprozessordefinitionen besitzen keine eigene Datentypen, da sie eine reine Textersetzungen durchführen. Deren Inhalte können aber ggf. zu Werten aufgelöst werden, die datentypbehaftet sind.&lt;br /&gt;
&lt;br /&gt;
=Aktivieren der Floating Point Version von sprintf bei WinAVR bzw AVR-Studio=&lt;br /&gt;
[[Bild:AVR_Studio_float1.gif|thumb|right|300px|Project → Configuration Options  → Libraries → Available Link Objects]]&lt;br /&gt;
[[Bild:AVR_Studio_float2.gif|thumb|right|300px|Custom Options → Custom Compilation Options → Linker Options]]&lt;br /&gt;
Beim WinAVR/AVR-Studio wird standardmässig eine Version der printf-Bibliothek verwendet, die keine Floatingpoint-Verarbeitung unterstützt. Die meisten Programme benötigen keine Floatingpoint-Unterstützung, so dass dadurch wertvoller Programmspeicherplatz gespart werden kann.&lt;br /&gt;
&lt;br /&gt;
Benutzt man allerdings eine printf-Variante für die Ausgabe von Floatingpoint-Zahlen, so erscheint an Stelle der korrekt formatierten Zahl lediglich ein &#039;?&#039;. Dies ist ein Indiz dafür, dass die Floatingpoint-Verarbeitung im Projekt aktiviert werden muss.&lt;br /&gt;
&lt;br /&gt;
Um die Floatingpoint-Verarbeitung zu aktivieren, geht man im &#039;&#039;&#039;AVR Studio 4&#039;&#039;&#039; wie folgt vor: &lt;br /&gt;
* Menüpunkt: &#039;&#039;Project → Configuration Options&#039;&#039;&lt;br /&gt;
* Im sich öffnenden Dialog wird in der linken Navigationsleiste der Eintrag &#039;&#039;Libraries&#039;&#039; ausgewählt.&lt;br /&gt;
* Unter &#039;&#039;Available Link Objects&#039;&#039; werden Bibliotheken angeboten. Für die Aktivierung der Floatingpoint-Unterstützung sind 2 interessant&amp;lt;ref&amp;gt;&amp;lt;tt&amp;gt;libc.a&amp;lt;/tt&amp;gt; sollte nicht zu den Bibliotheken hinzugefügt werden, da sie automatisch eingebunden wird. Etwas Hintergrundinformationen gibt es in [http://www.mikrocontroller.net/topic/173630 diesem Thread.]&lt;br /&gt;
&amp;lt;/ref&amp;gt;:&lt;br /&gt;
** &amp;lt;tt&amp;gt;libprintf_flt.a&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;libm.a&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Beide Bibliotheken werden durch Aktivieren und einen Druck auf &#039;&#039;Add Library → &#039;&#039; in die rechte Spalte übernommen.&lt;br /&gt;
* Danach wählt man in der Navigationsleiste den Eintrag &#039;&#039;Custom Options&#039;&#039;.&lt;br /&gt;
* Unter &#039;&#039;Custom Compilation Options&#039;&#039; wird &#039;&#039;Linker Options&#039;&#039; ausgewählt und in das Textfeld rechts/unten folgender Text eingetragen:&lt;br /&gt;
         -Wl,-u,vfprintf&lt;br /&gt;
* Ein Druck auf &#039;&#039;Add&#039;&#039; befördert die Zeile in das Listenfeld darüber, welches Optionen für den Linker enthält.&lt;br /&gt;
* Mit &#039;&#039;OK&#039;&#039; wird die Konfiguration abgeschlossen.&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;AVR Studio 5&#039;&#039;&#039; trägt man die Optionen an anderen Stellen ein ([http://www.mikrocontroller.net/topic/221583#2219612 Beitrag von Hal Smith]): &lt;br /&gt;
*&#039;&#039;Project Properties → Toolchain → AVR/GNU C-Linker → Libraries&#039;&#039;&amp;lt;br/&amp;gt;In &#039;&#039;Libraries&#039;&#039; &amp;lt;tt&amp;gt;(-WI, -I), libprintf_flt.a libm.a&amp;lt;/tt&amp;gt; eintragen.&lt;br /&gt;
* &#039;&#039;Project Properties → Toolchain → AVR/GNU C-Linker → Miscellaneous&#039;&#039;&amp;lt;br/&amp;gt;In &#039;&#039;Other Linker Flags&#039;&#039; &amp;lt;tt&amp;gt;-Wl,-u,vfprintf&amp;lt;/tt&amp;gt; eintragen.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
= Wie funktioniert String-Verarbeitung in C? =&lt;br /&gt;
: → Siehe: &#039;&#039;[[String-Verarbeitung in C]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= struct Strukturen =&lt;br /&gt;
&lt;br /&gt;
: → Siehe: &#039;&#039;[[Strukturen in C]]&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
= Funktionszeiger =&lt;br /&gt;
&lt;br /&gt;
: → Siehe: &#039;&#039;[[Funktionszeiger in C]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Header File - wie geht das =&lt;br /&gt;
&lt;br /&gt;
Ein Header File ist im Grunde nichts anderes als eine Sammlung aller Informationen, die ein &#039;Aussenstehender&#039; benötigt, um die in einem C-File gesammlten Funktionen benutzen zu können.&lt;br /&gt;
&lt;br /&gt;
Trotzdem gibt es immer wieder Schwierigkeiten, wie sich die Sache mit Header Files und/oder #include verhält und wie man eine derartige Lösung aufbauen kann.&lt;br /&gt;
&lt;br /&gt;
Gegeben sei ein System bestehend aus 3 Funktionen&lt;br /&gt;
* main()&lt;br /&gt;
* functionA()&lt;br /&gt;
* functionB()&lt;br /&gt;
und einigen globalen Variablen. Für dieses System soll eine Aufteilung erfolgen, so dass funtionA samt seinen zugehörigen globalen Variablen in einer eigenen C-Datei residiert (FileA.c), functionB in einem eigenen File residiert (FileB.c) und main() als Hautpfunktion seine eigens C-File (Main.c) darstellt und jeweils die entsprechenden Header Files existieren.&lt;br /&gt;
&lt;br /&gt;
Kochrezeptartig kann man in vielen Fällen einfach so vorgehen:&lt;br /&gt;
Man schreibt erst mal den C-Code der Funktion, die man implementieren möchte. Zb fängt man an mit FileA.c&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileA.c&lt;br /&gt;
&lt;br /&gt;
int VarExtA;&lt;br /&gt;
int VarIntA;&lt;br /&gt;
&lt;br /&gt;
#define PortpinX PortA.1&lt;br /&gt;
&lt;br /&gt;
int functionIntA( void )&lt;br /&gt;
{&lt;br /&gt;
  VarIntA = VarExtB;&lt;br /&gt;
  functionB();&lt;br /&gt;
  PortpinX = 1;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt geht man das File, so wie es auch der Compiler macht, von oben nach unten durch schaut den Code durch. Damit functionB aufgerufen werden kann, ist ein Prototyp dafür notwendig. Der kommt aus einem Header File, welches noch nicht existiert, aber im Laufe des Prozesses entstehen und FileB.h heissen wird. FileB.h deshalb, weil die Funktion in FileB.c enthalten ist und man zur Vermeidung von Konfusion die Header Files immer gleich benennt wie die C-Files, nur eben mit einer anderen Dateiendung. FileB.h wird noch geschrieben werden, das hindert uns jetzt aber nicht daran, so zu tun als ob es dieses schon geben würde und ein entsprechender #include ergänzt. (Solange nicht compiliert wird ist das ja auch kein Problem. Irgendwo muss man ja schliesslich mal anfangen die Ergänzungen zu machen.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileA.c&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FileB.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int VarExtA;&lt;br /&gt;
int VarIntA;&lt;br /&gt;
&lt;br /&gt;
#define PortpinX PortA.1&lt;br /&gt;
&lt;br /&gt;
int functionA( void )&lt;br /&gt;
{&lt;br /&gt;
  VarIntA = VarExtB;&lt;br /&gt;
  functionB();&lt;br /&gt;
  PortpinX = 1;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gut. Die Variable VarExtB wird ebenfalls über den include hereingezogen&lt;br /&gt;
werden. Damit ist FileA.c erst mal vollständig. Da fehlt jetzt erst mal nichts mehr. Alles was in FileA.c vorkommt sind entweder C-Schlüsselwörter, durch FileA.c selbst definiert oder kommt über den #include herein.&lt;br /&gt;
&lt;br /&gt;
Der nächste Schritt ist die Überlegung: Was von dem Zeugs in FileA.C soll von anderer Stelle (von anderen C-Files aus) benutzt und verwendet werden können.&lt;br /&gt;
Welche Dinge muss FileA von sich preis geben.&lt;br /&gt;
&lt;br /&gt;
Da sind zu erst mal die beiden Variablen. Was soll mit denen geschehen?&lt;br /&gt;
VarExtA soll von aussen zugreifbar sein, VarIntA nicht. Und dann&lt;br /&gt;
natürlich die Funktion, die aufrufbar sein soll.&lt;br /&gt;
&lt;br /&gt;
Also beginnt man ein Header File für FileA.c zu schreiben, in das all das&lt;br /&gt;
reinkommt, was FileA.c nach aussen sichtbar machen will.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileA.h&lt;br /&gt;
&lt;br /&gt;
extern int VarExtA;&lt;br /&gt;
&lt;br /&gt;
int functionA( void );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Variable kriegt ein extern davor (und wird damit zu einer Deklaration), bei der Funktion wird einfach die Implementierung weggenommen und die somit zu einer Deklaration veränderte Zeile mit einem ; abgeschlossen. Wenn man möchte kann man den so geschaffenen Prototypen auch mit einem extern einleiten. Notwendig ist es aber nicht.&lt;br /&gt;
&lt;br /&gt;
Erneuter Blick aufs Header File. Kommt da irgendwas vor, was nicht&lt;br /&gt;
Standard C Schlüsselwort ist? Nein. Nichts.&lt;br /&gt;
Also ist dieses Header File somit ebenfalls in sich vollständig.&lt;br /&gt;
&lt;br /&gt;
Zur Sicherheit wird in FileA.c noch einen Include auf das&lt;br /&gt;
eigene Header File hinzugefügt, denn dann kann der Compiler überprüfen ob die&lt;br /&gt;
Angaben im Header File mit der tatsächlichen Implementierung&lt;br /&gt;
übereinstimmen. Und da VarIntA von aussen nicht sichtbar sein soll (auch&lt;br /&gt;
nicht durch Tricks), wird sie static gemacht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileA.c&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FileA.h&amp;quot;&lt;br /&gt;
#include &amp;quot;FileB.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int VarExtA;&lt;br /&gt;
static int VarIntA;&lt;br /&gt;
&lt;br /&gt;
#define PortpinX PortA.1&lt;br /&gt;
&lt;br /&gt;
int functionA( void )&lt;br /&gt;
{&lt;br /&gt;
  VarIntA = VarExtB;&lt;br /&gt;
  functionB();&lt;br /&gt;
  PortpinX = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dasselbe für FileB.c. Erst mal einfach runterschreiben&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileB.c&lt;br /&gt;
&lt;br /&gt;
int VarExtB;&lt;br /&gt;
int VarIntB;&lt;br /&gt;
&lt;br /&gt;
#define SettingB 0x01&lt;br /&gt;
&lt;br /&gt;
int functionB( void )&lt;br /&gt;
{&lt;br /&gt;
  VarExtA = 1;&lt;br /&gt;
  functionA();&lt;br /&gt;
  VarIntB = SettingB;&lt;br /&gt;
&lt;br /&gt;
  MeinePrivateFunktion();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MeinePrivateFunktion()&lt;br /&gt;
{&lt;br /&gt;
  VarIntB = 8;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
damit functionA aufgerufen werden kann, braucht es wieder einen Prototypen. Den&lt;br /&gt;
kriegt man über von FileA.h, welches daher includiert wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileB.c&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FileA.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int VarExtB;&lt;br /&gt;
int VarIntB;&lt;br /&gt;
&lt;br /&gt;
#define SettingB 0x01&lt;br /&gt;
&lt;br /&gt;
int functionB( void )&lt;br /&gt;
{&lt;br /&gt;
  VarExtA = 1;&lt;br /&gt;
  functionA();&lt;br /&gt;
  VarIntB = SettingB;&lt;br /&gt;
  MeinePrivateFunktion();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MeinePrivateFunktion()&lt;br /&gt;
{&lt;br /&gt;
  VarIntB = 8;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was noch? VarExtA. Diese Variable wird aber ebenfalls durch den #include als extern Deklaration ins FileB.c hereingezogen und ist somit bei der Übersetzung von FileB.c bekannt. Kommt sonst noch etwas vor? MeinePrivateFunktion. Diese Funktion soll nur in FileB.c benutzt werden und ist für jemanden ausserhalb FileB.c völlig uninteressant. Nichts destotrotz gilt die Regel: compiliert wird von oben nach unten und verwendet werden kann nur etwas, was auch bekannt ist. D.h. bevor der Aufruf der Funktion in functionB gemacht werden kann, muss es einen Protoypen der Funktion geben. Da diese Funktion aber nicht nach &#039;aussen&#039; exportiert wird, macht man den Protoypen gleich in das C-File mit hinein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileB.c&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FileA.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int VarExtB;&lt;br /&gt;
int VarIntB;&lt;br /&gt;
&lt;br /&gt;
#define SettingB 0x01&lt;br /&gt;
&lt;br /&gt;
void MeinePrivateFunktion();&lt;br /&gt;
&lt;br /&gt;
int functionB( void )&lt;br /&gt;
{&lt;br /&gt;
  VarExtA = 1;&lt;br /&gt;
  functionA();&lt;br /&gt;
  VarIntB = SettingB;&lt;br /&gt;
  MeinePrivateFunktion();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MeinePrivateFunktion()&lt;br /&gt;
{&lt;br /&gt;
  VarIntB = 8;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Würde man die Funktion vorziehen, so dass der Funktionskörper vor der ersten Verwendung steht, dann würde man auch keinen Protoypen benötigen. Eine Funktionsdefinition fungiert als ihr eigener Protoyp.&lt;br /&gt;
&lt;br /&gt;
Kommt sonst noch etwas vor? Nix mehr. In FileB.c wird sonst nix mehr verwendet was nicht entweder C Schlüsselwort oder im File selber oder durch einen #include reinkommt.&lt;br /&gt;
&lt;br /&gt;
Dann wieder: das Header File für B schreiben. Dabei einfach nur überlegen: was soll von FileB.c nach aussen getragen werden?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileB.h&lt;br /&gt;
&lt;br /&gt;
extern int VarExtB;&lt;br /&gt;
&lt;br /&gt;
int functionB( void );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und zur Sicherheit wieder ins eigene C-File includen und alle Variablen&lt;br /&gt;
(oder auch Funktionen), die von aussen nicht sichtbar sein sollen, als&lt;br /&gt;
static markieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileB.c&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FileB.h&amp;quot;&lt;br /&gt;
#include &amp;quot;FileA.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int VarExtB;&lt;br /&gt;
static int VarIntB;&lt;br /&gt;
&lt;br /&gt;
#define SettingB 0x01&lt;br /&gt;
&lt;br /&gt;
static void MeinePrivateFunktion();&lt;br /&gt;
&lt;br /&gt;
int functionB( void )&lt;br /&gt;
{&lt;br /&gt;
  VarExtA = 1;&lt;br /&gt;
  functionA();&lt;br /&gt;
  VarIntB = SettingB;&lt;br /&gt;
  MeinePrivateFunktion();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MeinePrivateFunktion()&lt;br /&gt;
{&lt;br /&gt;
  VarIntB = 8;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
damit bleibt nur noch main.c. Auch dieses wird erst mal einfach runtergeschrieben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int c;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  functionA();&lt;br /&gt;
  functionB();&lt;br /&gt;
  VarExtA = 1;&lt;br /&gt;
  VarExtB = c;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit functionA aufgerufen werden kann, braucht es einen Prototypen. Woher kommt er? Aus FileA.h. Also gleich mal includen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;FileA.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int c;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  functionA();&lt;br /&gt;
  functionB();&lt;br /&gt;
  VarExtA = 1;&lt;br /&gt;
  VarExtB = c;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit functionB aufgerufen werden kann, braucht es einen Prototypen. Wo&lt;br /&gt;
kommt der her? Aus FileB.h. Also noch ein #include&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;FileA.h&amp;quot;&lt;br /&gt;
#include &amp;quot;FileB.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int c;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  functionA();&lt;br /&gt;
  functionB();&lt;br /&gt;
  VarExtA = 1;&lt;br /&gt;
  VarExtB = c;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fehlt noch was? VarExtA ist durch den #include von FileA.h bereits&lt;br /&gt;
abgedeckt und VarExtB ist durch den #include von FileB.h bereits&lt;br /&gt;
abgedeckt. Also fehlt nix mehr. Auch in main.c sind damit alle Sachen&lt;br /&gt;
abgedeckt und es ist in sich vollständig.&lt;br /&gt;
&lt;br /&gt;
Das ist der Standardmechanismus:&lt;br /&gt;
* Implementierung der Funktionen im C File schreiben&lt;br /&gt;
* Überlegen, was von dieser Implementierung von aussen sichtbar sein soll.&lt;br /&gt;
* Dasjenige kommt als Deklaration ins Header File, alles andere am besten static machen.&lt;br /&gt;
* Für alles im C-File, das seinerseits woanders herkommt, gibt es einen #include, der das jeweils notwendige Header File einbindet.&lt;br /&gt;
* Werden im Header File Dinge von woanders benutzt, dann enthält das Header File einen entsprechenden #include&lt;br /&gt;
* Jedes File, sowohl Header-File als auch C-File ist in sich vollständig. Werden dort Dinge benutzt, dann müssen diese vor der Verwendung deklariert worden sein. Wie und wo diese Deklaration herkommt, ist dabei zweitrangig. Es kann sein, dass die Deklaration vor der Verwendung steht, es kann aber auch sein, dass die Deklaration über einen weiteren Include mit aufgenommen wird.&lt;br /&gt;
&lt;br /&gt;
= Ich hab da mehrere *.c und *.h Dateien. Was mache ich damit? =&lt;br /&gt;
&lt;br /&gt;
[[Bild:c-flow.svg|right|thumb|260px|C-Programmierung: Workflow]]&lt;br /&gt;
Zunächst ist es wichtig, sich zu vergegenwärtigen, wie C-Compiler und Linker zusammenarbeiten. Ein komplettes Programmier-Projekt kann und wird im Normalfall aus mehreren Quelldateien bestehen, die alle zusammengenommen das komplette Programm bilden.&lt;br /&gt;
&lt;br /&gt;
Der Prozess des Erstellens des Programmes geschieht in mehrerern Schritten:&lt;br /&gt;
;Compilieren: zunächst werden alle Einzelteile (jede *.c Datei) für sich &#039;&#039;compiliert&#039;&#039;. Dabei ensteht aus jeder c-Datei eine sogenannte Object-Datei, in der bereits der Maschinencode für die im c-File programmierten Funktionen enthalten ist&lt;br /&gt;
;Linken: die einzelnen Object-Dateien werden mit zusätzlichen Bibliotheken und dem Startup-Code zum fertigen Programm &#039;&#039;gelinkt&#039;&#039;.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
Angenommen, das komplette Projekt besteht aus 2 Dateien:&lt;br /&gt;
&lt;br /&gt;
;main.c:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int twice (int);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  twice (5);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;func.c:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int twice (int number)&lt;br /&gt;
{&lt;br /&gt;
  return 2 * number;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann werden &amp;lt;tt&amp;gt;main.c&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;func.c&amp;lt;/tt&amp;gt; &#039;&#039;unabhängig&#039;&#039; voneinander compiliert. Als Ergebnis erhält man die Dateien &amp;lt;tt&amp;gt;main.o&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;func.o&amp;lt;/tt&amp;gt;, die den besagten Object-Code enthalten.&lt;br /&gt;
Diese beiden Zwischenergebnisse werden dann zusammen mit Bibliotheken zum fertigen Programm gebunden (gelinkt), das dann ausgeführt werden kann.&lt;br /&gt;
&lt;br /&gt;
Bekommt man also von irgendwo bereits fertige *.c (und zugehörige *.h) Dateien, so genügt es, die *.c Dateien in das Projekt mit aufzunehmen. Dadurch wird das entsprechende C-File compiliert und das Ergebnis davon, das Object-file, wird dann in das fertige Programm mit eingelinkt.&lt;br /&gt;
&lt;br /&gt;
;Achtung: Da jede der C-Dateien unabhängig von allen anderen compiliert wird, bedeutet das auch, dass jede der C-Dateien in sich vollständig sein muss!&lt;br /&gt;
&lt;br /&gt;
Wie eine C-Datei in das Projekt mit aufgenommen wird, hängt im wesentlichen von der benutzten Entwicklungsumgebung ab.&lt;br /&gt;
&lt;br /&gt;
== Makefile ==&lt;br /&gt;
&lt;br /&gt;
Die zusätzliche *.c Datei wird in die SRC Zeile im makefile eingetragen.&lt;br /&gt;
&lt;br /&gt;
== AVR-Studio ==&lt;br /&gt;
&lt;br /&gt;
Hier ist es besonders einfach, eine Datei in das Projekt mit aufzunehmen. Dazu wird im Projektbaum der Knoten &amp;quot;Source Files&amp;quot; aktiviert und mit der rechten Maustaste das Kontextmenü geöffnet. Im Menü wird der Punkt &amp;quot;Add existing Source File(s)&amp;quot; ausgewählt, und anschliessend zeigt man AVR-Studio das zusätzliche C-File. AVR-Studio berücksicht dann diese Datei bei der Projekterzeugung, compiliert es und sorgt dafür, dass es zum fertigen Programm dazugelinkt wird.&lt;br /&gt;
&lt;br /&gt;
=Globale Variablen über mehrere Dateien=&lt;br /&gt;
Ein häufiger Problemkreis in der C Programmierung sind auch globale Variablen, die von mehreren *.c Dateien aus benutzt werden sollen. Was hat es damit auf sich?&lt;br /&gt;
&lt;br /&gt;
Zunächst mal muß man bei der Vereinbarung von Variablen zwischen &#039;&#039;Definition&#039;&#039; und &#039;&#039;Deklaration&#039;&#039; unterscheiden:&lt;br /&gt;
;Definition: Mit einer Definition wird der Compiler angewiesen, eine Variable tatsächlich zu erzeugen. Damit er das kann, muß ihm selbstverständlich der exakte Datentyp und auch der Name der Variablen zur Verfügung stehen. Eine Definition sorgt also dafür, dass im späteren Programm Speicherplatz für diese Variable reserviert wird&lt;br /&gt;
;Deklaration: Mit einer Deklaration teilt man dem Compiler lediglich mit, dass eine Variable existiert. An dieser Stelle soll der Compiler also keinen Speicherplatz reservieren, sondern der Compiler soll einfach nur zur Kenntniss nehmen, daß es eine Variable mit einem bestimmten Namen gibt und von welchem Datentyp sie ist.&lt;br /&gt;
&lt;br /&gt;
Aus obigem folgt sofort, dass eine Definition auch immer eine Deklaration ist. Denn dadurch, daß der Compiler angewiesen wird eine Variable auch tatsächlich zu erzeugen, folgt, dass er dazu auch dieselben Informationen benötigt, die auch in einer Deklaration angegeben werden müssen. Der einzige Unterschied: Bei einer Deklaration trägt der Compiler nur in seinen internen Tabellen ein, dass es diese Variable tatsächlich gibt, während er bei einer Definition zusätzlich auch noch dafür sorgt, dass im fertigen Programm auch Speicher für diese Variable bereitgestellt wird.&lt;br /&gt;
&lt;br /&gt;
Warum ist diese Unterscheidung wichtig?&lt;br /&gt;
&lt;br /&gt;
Weil es in C die sog. &#039;&#039;One Definition Rule&#039;&#039; (ODR). Sie besagt, dass in einem vollständigen Programm, also über alle *.c Dateien gesehen, es für eine Variable nur &amp;lt;b&amp;gt;eine&amp;lt;/b&amp;gt; Definition geben darf. Es darf allerdings beliebig viele Deklarationen geben, solange diese Deklarationen alle im Datentyp übereinstimmen. Kurz gesagt: Man darf den Compiler nur einmal auffordern, eine Variable zu erzeugen (Definition), kann sich aber beliebig oft auf diese eine Variable beziehen (Deklarationen). Aber Vorsicht! Da der Compiler jede einzelne *.c Datei für sich alleine übersetzt und dabei kein Wissen von ausserhalb benutzt, obliegt es der Verantwortung des Programmierers dafür zu sorgen, dass alle Deklarationen im Datentyp übereinstimmen. Der Compiler kann diese Einhaltung prinzipbedingt nicht überwachen!&lt;br /&gt;
&lt;br /&gt;
Woran erkennt man eine Definition bzw. Deklaration?&lt;br /&gt;
&lt;br /&gt;
Eine Definition einer globalen Variable steht immer ausserhalb eines Funktionsblocks. Zb.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int  MyData;         // Globale Variable namens MyData. Sie ist vom Typ int&lt;br /&gt;
char Name[30];       // Globales Array&lt;br /&gt;
long NrElements = 5; // Globale Variable, die auch noch initialisiert wird&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Deklaration unterscheidet sich von einer Definition in 2 Punkten&lt;br /&gt;
* Es wird das Schlüsselwort &amp;lt;tt&amp;gt;extern&amp;lt;/tt&amp;gt; vorangestellt.&lt;br /&gt;
* Es kann keine Initialisierung geben. Sobald eine Initialisierung vorhanden ist, wird das Schlüsselwort &amp;lt;tt&amp;gt;extern&amp;lt;/tt&amp;gt; ignoriert und aus der Deklaration wird eine Definition.&lt;br /&gt;
&lt;br /&gt;
Beispiele für Deklarationen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
extern int  MyData;&lt;br /&gt;
extern char Name[30];&lt;br /&gt;
extern long NrElements;&lt;br /&gt;
extern long NrElements = 5;  // Achtung: Dies ist eine Definition!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Besitzt man also 2 *.c Dateien, main.c und helpers.c, und sollen sich diese beiden Dateien eine globale Variable teilen, so muss in eine Datei eine Definition hinein, während in die andere Datei eine Deklaration derselben Variablen erfolgen muß. Traditionell werden die Definitionen in der *.c-Datei gemacht, die als Hauptdatei des Moduls fungiert, zu der diese Variable konzeptionell gehört. Im Zweifel ist das die *.c Datei, in der main() enthalten ist. Das muss nicht so sein, ist aber eine Konvention, die oft Sinn macht. Alternativ wird auch gerne oft eine eigene *.c Datei (zb. globals.c) gemacht, die einzig und alleine die Defintionen der globalen Variablen enthält.&lt;br /&gt;
&lt;br /&gt;
main.c&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int  AnzahlElemente;        // Dies ist die Definition. Hier wird die globale&lt;br /&gt;
                            // Variable AnzahlElemente tatsächlich erzeugt.&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  AnzahlElemente = 8;&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
helpers.c&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
extern int AnzahlElemente;   // Dies ist die Deklaration die auf die globale&lt;br /&gt;
                             // Variable AnzahlElemente in main.c verweist.&lt;br /&gt;
                             // Wichtig: Der Datentyp muss mit dem in main.c&lt;br /&gt;
                             // angegebenen übereinstimmen&lt;br /&gt;
&lt;br /&gt;
void foo()&lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
  j = AnzahlElemente;&lt;br /&gt;
  AnzahlElemente = 9;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Praktische Durchführung==&lt;br /&gt;
Besteht ein vollständiges Programm aus mehreren *.c Dateien, dann kann man sich vorstellen, daß es mühsam ist, alle Deklarationen immer auf gleich zu halten. Hier bietet sich der Einsatz eines Header Files an, in der die Deklarationen stehen und welches in die jeweiligen *.c Dateien inkludiert wird&lt;br /&gt;
&lt;br /&gt;
Bsp:&lt;br /&gt;
&lt;br /&gt;
Global.h&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
extern int Anzahl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
main.c&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;Global.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int Anzahl;      // auch wenn Global.h inkludiert wurde, so muss es eine&lt;br /&gt;
                 // Definition der Variablen geben. In Global.h sind ja nur&lt;br /&gt;
                 // Deklarationen.&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  Anzahl = 5;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
foo.c&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;Global.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void foo()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  Anzahl = 8;&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bar.c&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;Global.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void bar()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  j = Anzahl;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf diese Art kann man erreichen, dass zumindest alle Deklarationen ein und derselben Variablen in einem Programm übereinstimmen. Die Datei Global.h wird auch in main.c inkludiert, obwohl man das eigentlich nicht müsste, denn dort wird die Variable ja definiert. Durch die Inclusion ermöglicht man aber dem Compiler die Überprüfung ob die Deklaration auch tatsächlich mit der Definition übereinstimmt.&lt;br /&gt;
&lt;br /&gt;
Solange kein Initialisierungen der globalen Variablen notwendig sind, gibt es noch einen weiteren Trick, um sich selbst das Leben und die Verwaltung der globalen Variablen zu erleichtern.&lt;br /&gt;
Worin besteht das Problem?&lt;br /&gt;
Das Problem besteht darin, dass man bei Einführung einer neuen globalen Variablen an 2 Stellen erweitern muss: Zum einen in der Header-Datei, die die &#039;extern&#039;-Deklaration der Variablen enthält, zum anderen muss in einer C-Datei die Definition der Variablen erfolgen. Das kann man sich mit etwas Präprozessorarbeit auch einfacher machen:&lt;br /&gt;
&lt;br /&gt;
Global.h&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef EXTERN&lt;br /&gt;
#define EXTERN extern&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
EXTERN int Anzahl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
main.c&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define EXTERN&lt;br /&gt;
#include &amp;quot;Global.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  Anzahl = 5;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
foo.c&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;Global.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void foo()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  Anzahl = 8;&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie funktioniert das Ganze? Im Grunde muss man nur dafür sorgen, dass der Compiler an &#039;&#039;einer&#039;&#039; Stelle das Schlüsselwort &#039;&#039;&#039;extern&#039;&#039;&#039; ignoriert (hier in main.c) und bei allen anderen Inclusionen beibehält. Dadurch das ein Präprozessor-ifndef benutzt wird, kann dieses erreicht werden. Wird das Header File includiert und ist zu diesem Zeitpunkt das Makro &#039;&#039;&#039;EXTERN&#039;&#039;&#039; noch nicht definiert, so wird innerhalb des Header Files &#039;&#039;&#039;EXTERN&#039;&#039;&#039; zu &#039;&#039;&#039;extern&#039;&#039;&#039; definiert und damit in weiterer Folge im Quelltext &#039;&#039;&#039;EXTERN&#039;&#039;&#039; durch &#039;&#039;&#039;extern&#039;&#039;&#039; ersetzt. Wenn daher foo.c das Header File inkludiert, wird die Zeile&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
EXTERN int Anzahl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
vom Präprozessor zu&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
extern int Anzahl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
umgewandelt.&lt;br /&gt;
&lt;br /&gt;
In main.c hingegen sieht die Include-Sequenz so aus&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define EXTERN&lt;br /&gt;
#include &amp;quot;Global.h&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wenn Global.h bearbeitet wird, existiert bereits ein Makro &#039;&#039;&#039;EXTERN&#039;&#039;&#039;, das auf einen leeren Text expandiert. Dadurch wird verhindert, dass innerhalb von Global.h das Makro &#039;&#039;&#039;EXTERN&#039;&#039;&#039; mit dem Text &#039;&#039;&#039;extern&#039;&#039;&#039; belegt wird und&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
EXTERN int Anzahl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
wird daher vom Präprozessor zu&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int Anzahl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
erweitert, genau wie es benötigt wird.&lt;br /&gt;
&lt;br /&gt;
= Was hat es mit volatile auf sich =&lt;br /&gt;
Immer wieder hört man im Forum die pauschale Aussage &amp;quot;Variablen die in einer ISR verwendet werden, müssen volatile sein&amp;quot;. Nun, das ist so nicht ganz richtig.&lt;br /&gt;
Welches Problem löst denn eigentlich volatile? Was ist denn das eigentliche Problem, das einer Lösung bedarf?&lt;br /&gt;
&lt;br /&gt;
Das Problem findet sich diesmal im Optimierer eines C Compilers. C Compiler übersetzen, wenn sie optimieren dürfen, den C Code nicht direkt so, wie ihn der Programmierer geschrieben hat, sondern sie versuchen Ressourcen einzusparen. Das kann sowohl Programmspeicher als auch Laufzeit, häufig auch beides gemeinsam sein. Zu diesem Zweck untersuchen sie das Programm und versuchen in der funktional gleichwertigen, in Maschinensprache übersetzen Version, Anweisungen einzusparen. Das dürfen sie auch. Der C-Standard erlaubt Optimierungen, solange die &#039;As-If&#039;-Regel eingehalten wird. Das bedeutet: Der Compiler darf das Programm umstellen und verändern, solange die Programmergebnisse dieselben bleiben. Eben &amp;quot;As-if&amp;quot; die Optimierung nie stattgefunden hätte.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir ein Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  i = 2;&lt;br /&gt;
&lt;br /&gt;
  if( i == 5 )&lt;br /&gt;
    j = 8;&lt;br /&gt;
  else&lt;br /&gt;
    j = 6;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In diesem Programmausschnitt darf der Compiler seine Kenntnisse ausnutzen. Er weiß an dieser Stelle, dass i den Wert 2 hat. Damit ist aber auch klar, dass die Bedingung niemals wahr sein kann, denn 2 kann niemals gleich 5 sein. Wenn die Bedingung aber niemals wahr sein kann, dann kann auch die Zuweisung von 8 an j niemals ausgeführt werden. Der Compiler kann also diesen Programmtext zu diesem hier kürzen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  i = 2;&lt;br /&gt;
  j = 6;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ohne das sich an den Programmergebnissen etwas ändert. Die zweite Version ist aber kürzer und wird, wegen des Wegfalles des Vergleiches, auch schneller ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Eine andere Form der Optimierung betrifft die Verwaltung von µC-Ressourcen und da wieder ganz speziell die Register. Variablen werden ja erst mal im SRAM-Speicher des µC angelegt. Um mit den Werten von Variablen arbeiten zu können, müssen diese Wert aber vom SRAM-Speicher in µC-Register überführt werden (Register kann man sich wie Speicherstellen in der eigentlichen CPU vorstellen). Nur dort können diese Werte mittels Maschinenbefehlen manipuliert werden.&lt;br /&gt;
Jetzt haben aber µC nicht beliebig viele Register. Das bedeutet aber auch, der Compiler muss darüber Buch führen, welche Werte (welche Variablen) gerade in welchen Registern liegen und wenn alle Register belegt sind, muss ein anderes Register freigeräumt werden, in dem der Wert aus dem Register wieder ins SRAM zurück übertragen wird.&lt;br /&gt;
Allerdings kostet das auch Zeit. Der Compiler wird daher versuchen, Variablen, die in einem Programmstück oft benötigt werden, für längere Zeit in den Registern zu halten, um das Registerladen bzw. -zurückschreiben einzusparen. Die Grundannahme lautet dabei immer: In Anweisungen, in denen eine Variable nicht vorkommt, kann diese Variable auch nicht verändert werden. Im Programmstück&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  while( 1 ) {&lt;br /&gt;
    if( i == 5 )&lt;br /&gt;
      j = 8;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
gibt es für i keine Möglichkeit, verändert zu werden. Der Compiler kann daher entscheiden, dass er diese Variable, *an dieser Stelle*, gar nicht aus dem SRAM laden muss, sondern sich den entsprechenden Wert in einem Register vorhält und dieses Register ausschließlich dafür reserviert. (Er könnte auch entscheiden, dass der Code nie ausgeführt werden kann, aber das ist eine andere Geschichte)&lt;br /&gt;
&lt;br /&gt;
Der springende Punkt ist nun, dass der Compiler hier eine zu kleine Sicht der Dinge hat. Betrachtet man nur dieses Code Stück, dann gibt es tatsächlich für i keine Möglichkeit, seinen Wert zu verändern. Aber die Dinge ändern sich, wenn Interrupts ins Spiel kommen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uint8_t i;&lt;br /&gt;
&lt;br /&gt;
ISR( irgendein_Interrupt )&lt;br /&gt;
{&lt;br /&gt;
  i = 5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
  while( 1 ) {&lt;br /&gt;
    if( i == 5 )&lt;br /&gt;
      j = 8;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Jetzt gibt es plötzlich eine Möglichkeit, wie i seinen Wert ändern kann: Wenn der entsprechende Interrupt ausgelöst wird, dann wird i auf den Wert 5 gesetzt. i, das ist aber nichts anderes als ein bestimmter Speicherbereich im SRAM. D.h. im SRAM wird die Variable tatsächlich korrekt auf den Wert 5 gesetzt. Nur: Als der Compiler die while-Schleife übersetzt hat, wusste er nichts davon, dass diese Möglichkeit existiert. Er hat entschieden, dass er an dieser Stelle den Wert der Variablen in einem CPU-Register halten wird, um Zugriffe einzusparen. Nur wird diese Kopie des Wertes im Register natürlich nicht verändert, wenn in der ISR das Original von i im SRAM verändert wird.&lt;br /&gt;
Fazit: Obwohl die ISR die Variable tatsächlich verändert, kriegt das der Code im while nicht mit, weil der Compiler es mit der Optimierung an dieser Stelle übertrieben hat. In der while-Schleife wird mit einer Kopie des Wertes von i in einem Register gearbeitet und nicht mit dem originalen Wert von i im SRAM.&lt;br /&gt;
&lt;br /&gt;
Und an dieser Stelle kommt jetzt volatile ins Spiel.&lt;br /&gt;
&lt;br /&gt;
volatile teilt dem Compiler mit, dass ausnahmslos alle Zugriffe auf eine Variable auch tatsächlich auszuführen sind und keine Optimierungen gemacht werden dürfen, weil eine Variable auf Wegen benutzt werden kann, die für den Compiler prinzipiell nicht einsichtig sind. Im obigen Beispiel könnte man argumentieren, dass der Compiler ja wohl die ISR bemerken könne und daher feststellen könnte, dass i tatsächlich verändert wird. Aber das stimmt so in der allgemeinen Form nicht. Niemand sagt, dass der Compiler die ISR überhaupt zu Gesicht bekommen muss, die könnte ja auch in einem ganz anderen C File stecken.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
volatile uint8_t i;&lt;br /&gt;
&lt;br /&gt;
ISR( irgendein_Interrupt )&lt;br /&gt;
{&lt;br /&gt;
  i = 5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
  while( 1 ) {&lt;br /&gt;
    if( i == 5 )&lt;br /&gt;
      j = 8;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
wird i volatile gemacht, so verbietet man damit dem Compiler explizit, Annahmen über den Datenfluss von i zu treffen. Innerhalb der Schleife muss also tatsächlich jedes Mal wieder erneut i aus dem SRAM geholt werden und mit 5 verglichen werden. Abkürzungen durch Mehrfachverwendung von Registern oder sonstigen Optimierungstricks sind nicht erlaubt. Und damit ist das Problem gelöst. Wird i in der ISR verändert, so bekommt das auch die Abfrage mit, weil ja jetzt auf jeden Fall auf das Original im SRAM zurückgegriffen wird.&lt;br /&gt;
&lt;br /&gt;
Das Gleiche gilt auch ebenso &amp;quot;in die andere Richtung&amp;quot;, wenn also i in der Schleife geändert und in der ISR nur gelesen wird. Auch hier könnte die Optimierung negativ zuschlagen und den Schreibzugriff nur auf eine lokale Kopie der Variable in einem Register durchführen (oder gar ganz wegfallen) lassen, weil der Lesezugriff außerhalb des direkten Programmflusses (in der ISR) für den Compiler nicht ersichtlich ist.&lt;br /&gt;
&lt;br /&gt;
Ein anderes Problem (das ebenfalls mittels volatile gelöst wird) sind Variablen, die tatsächlich im Code überhaupt nie aktiv verändert werden, sondern es sich um Zusatzhardware handelt, die so verschaltet ist, dass sie im Programm in Form einer Variablen auftaucht, z.B. ein Uhren-IC (oder auch ganz banal: Portpins). In diesem Fall wird z.B. die Variable für Sekunden vom Programm gar nicht vom Programm selber verändert, ändert aber trotzdem ihren Inhalt. Die Zusatzhardware selbst macht das. Aus Programmsicht handelt es sich um Speicherzellen, die magisch selbsttätig ihren Wert ändern. Und damit dürfen selbstverständlich auch hier keinerlei Annahmen über den Inhalt der Variablen getroffen werden. Eine derart angebundene externe Hardware nennt man übrigens &amp;quot;memory-mapped&amp;quot;, weil sie ihre Werte ins Memory (=Hauptspeicher) mapped (=einblendet).&lt;br /&gt;
&lt;br /&gt;
Allerdings kann volatile nur bei den Variablen sinnvoll genutzt werden, die &amp;quot;von außen&amp;quot; auch änderbar sind. Bei lokalen Variablen, auch statischen, einer Funktion kann das nur passieren, wenn ihre Adresse einer ISR z.B. durch einen globalen Pointer bekannt gemacht wird.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uint8_t *v;&lt;br /&gt;
ISR( irgendein_Interrupt )&lt;br /&gt;
{&lt;br /&gt;
  i = 5;&lt;br /&gt;
  *v = 42;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  uint8_t i; // kann sich nie unerwartet ändern -&amp;gt; volatile nutzlos, behindert nur Optimizer&lt;br /&gt;
&lt;br /&gt;
  volatile uint8_t j; // kann sich unerwartet ändern (über globalen *v)&lt;br /&gt;
  v = &amp;amp;j;&lt;br /&gt;
  ...&lt;br /&gt;
  while( 1 ) {&lt;br /&gt;
    if( i == 5 )&lt;br /&gt;
      j = 8;&lt;br /&gt;
    if( j == 5 )&lt;br /&gt;
      i = 3;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Konstanten an fester Flash-Adresse =&lt;br /&gt;
&lt;br /&gt;
Wie kann man eine Konstante an entsprechender Adresse im Flash ablegen?&lt;br /&gt;
&lt;br /&gt;
Mehmet Kendi hat eine Lösung für [[AVR Studio]] &amp;amp; [[WinAVR]] in &lt;br /&gt;
[http://www.mikrocontroller.net/topic/142704#1453079] angegeben.&lt;br /&gt;
&lt;br /&gt;
= Timer =&lt;br /&gt;
== Was macht ein Timer? ==&lt;br /&gt;
Oft hört man im Forum die Aussage: Timer sind so kompliziert!&lt;br /&gt;
&lt;br /&gt;
Aber eigentlich stimmt das nicht. Ganz im Gegenteil, Timer sind eigentlich eine sehr einfache Sache. Was genau macht eigentlich ein Timer? Die Antwort lautet: er zählt unabhängig vom restlichen Programmfluss vor sich hin. Und? Was macht er noch? Nichts. Das wars schon. Im Kern ist genau das auch schon alles was ein Timer macht.&lt;br /&gt;
[[Bild:Timer_Basis.gif|framed|center|ein 8-Bit Timer bei der Arbeit]]&lt;br /&gt;
&lt;br /&gt;
== Wie schnell macht er es? ==&lt;br /&gt;
Aber so einfach ist die Sache dann doch wieder nicht. Da erhebt sich zunächst mal die Frage: wie schnell zählt denn eigentlich so ein Timer? Normalerweise ist der Timer mit der Taktfrequenz des Prozessors gekoppelt, so dass zb bei einer Taktfrequnz von 1Mhz der Timer auch genau so schnell zählt. In 1 Sekunde zählt ein Timer also von 0 bis 1000000, also 1 Mio Zählschritte. Nun kann aber ein beispielsweise 8-Bit Timer nicht bis 1000000 zählen, dazu ist er nicht groß genug. Mit 8 Bit kann man bis 255 zählen. Zählt man da dann noch 1 dazu, dann läuft der Timer über und beginnt wieder bei 0. Man kann daher ruhigen Gewissens sagen: In 1 Sekunde zählt dieser Timer 3906 mal den Bereich von 0 bis 255 (und weiter auf 0) durch (das sind 256 Zählschritte) und zuätzlich schafft er es danach noch bis 64 zu zählen. Denn 3906 * 256 + 64 = 1000000 und wir haben wieder die 1 Mio Zählschritte, die der Timer in 1 Sekunde erledigt.&lt;br /&gt;
&lt;br /&gt;
Das ist ganz schön schnell. Und weil das oft zu schnell ist, hat jeder Timer noch die Möglichkeit sogenannte Vorteiler (Prescaler) vor den Zähltakt zu schalten. Zb einen Vorteiler von 8. Anstelle von 1Mhz bekommt der Timer dann eine Frequenz von 1Mhz / 8 (= 125kHz) präsentiert. Und dementsprechend würde er in 1 Sekunde dann nur noch von 0 bis 125000 (= 1.000.000 / 8) zählen. Als 8 Bit Timer bedeutet das, dass er in 1 Sekunde jetzt nur noch 488 komplette Zyklen 0 bis 255 schafft und dann noch bis 72 zählen kann. Denn 488 * 256 + 72 = 125000&lt;br /&gt;
&lt;br /&gt;
== Das kann aber nicht alles gewesen sein? ==&lt;br /&gt;
Bis jetzt ist das alles noch unspektakulär und man fragt sich: Was hab ich jetzt davon, wenn der Timer vor sich hinzählt? Nun, die Situation ändert sich, wenn man weiß, dass man bei bestimmten Ereignissen und/oder Zählerständen etwas auslösen lassen kann. So ist zb. dieser Überlauf von 255 auf 0 so ein Ereignis. Mittels eines Interrupts kann man auf dieses Ereignis reagieren lassen und als Folge davon wird eine Funktion vollautomatisch aufgerufen. Und zwar unabhängig davon, was der µC gerade sonst so tut. Und das ist schon recht cool, denn es bedeutet, dass man regelmäßig zu erfolgende Dinge in so eine ISR (Interrupt Service Routine, die Funktion die aufgerufen wird) stecken kann und der Timer sorgt ganz von alleine dafür, dass diese Funktionalität auch tatsächlich regelmäßig ausgeführt wird. Regelmäßig bedeutet in diesem Fall dann auch wirklich regelmäßig. Denn der Timer zählt ja losgelöst von den restlichen Arbeiten, die der µC sonst so erledigt, vor sich hin. Es spielt keine Rolle, ob der µC gerade mitten in einer komplizierten Berechnung steckt oder nicht. Der Timer zählt vor sich hin, und wenn das entsprechende Ereignis eintritt, wird der Interrupt ausgelöst. Und wenn der entsprechende Interrupt mit einer ISR-Funktion gekoppelt ist, dann wird der normale Programmfluss unterbrochen und der µC arbeitet genau diese eine Funktion ab. Und zwar in regelmässigen Zeitabständen, weil ja auch der Interrupt regelmässig auftritt.&lt;br /&gt;
[[Bild:Timer_ISR.gif|framed|center|ein 8-Bit Timer löst durch seinen Overflow regelmäßige ISR Aufrufe aus]]&lt;br /&gt;
Gut, beispielsweise 488 mal in der Sekunde mag für so manchen Zweck zu oft sein, aber es gibt ja auch noch andere Vorteiler (welche steht im Datenblatt) und dann kann man ja auch innerhalb der ISR in einer lokalen Variablen mitzählen und zb nur bei jedem 2.ten Aufruf eine Aktion machen, die dann nur noch 244 mal in der Sekunde ausgeführt wird. Hier gibt es also mehrere Möglichkeiten, wie man die Aufrufhäufigkeit weiter herunterteilen kann, so dass man sich der Zahl annähert, die man benötigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Für einen Mega16.&lt;br /&gt;
// Andere Prozessoren: siehe Datenblatt wie die Timerkonfiguration einzustellen ist&lt;br /&gt;
&lt;br /&gt;
#define F_CPU 1000000UL&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
// der Timer wird mit 1Mhz getaktet. Vorteiler ist 8&lt;br /&gt;
// d.h. der Timer läuft mit 125kHz und würde daher in 1 Sekunde&lt;br /&gt;
// von 0 bis 124999 zaehlen.&lt;br /&gt;
// Aber nach jeweils 256 Zaehlungen erfolgt ein Overflow.&lt;br /&gt;
// Daher werden in 1 Sekunde 125000 / 256 = 488.28125 Overflows erzeugt&lt;br /&gt;
// Oder anders ausgedrückt:  1 / 488.2815 = 0.002048&lt;br /&gt;
// alle 0.002048 Sekunden erfolgt ein Overflow&lt;br /&gt;
//&lt;br /&gt;
ISR( TIMER0_OVF_vect )       // Overflow Interrupt Vector&lt;br /&gt;
{&lt;br /&gt;
  static uint8_t swTeiler = 0;&lt;br /&gt;
&lt;br /&gt;
  swTeiler++;&lt;br /&gt;
  if( swTeiler == 200 ) {    // nur bei jedem 200.ten Aufruf. Effektiv teilt dieses die&lt;br /&gt;
                             // die Aufruffrequenz des nachfolgenden Codes nochmal um&lt;br /&gt;
    swTeiler = 0;            // einen Faktor 200. Der nachfolgende Code wird daher nicht&lt;br /&gt;
                             // alle 0.002 Sekunden sondern alle 0.4096 Sekunden ausgeführt.&lt;br /&gt;
                             // Das reicht, dass man eine LED am Port schon blinken sieht.&lt;br /&gt;
    PORTD = PORTD ^ 0xFF;    // alle Bits am Port umdrehen, einfach damit sich was tut&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  DDRD = 0xFF;          // irgendein Port, damit wir auch was sehen&lt;br /&gt;
&lt;br /&gt;
  TIMSK |= (1&amp;lt;&amp;lt;TOIE0);  // den Overflow Interrupt des Timers freigeben&lt;br /&gt;
  TCCR0 = (1&amp;lt;&amp;lt;CS01);    // Vorteiler 8, jetzt zählt der Timer bereits&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  sei();                // und Interrupts generell freigeben&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  while( 1 )&lt;br /&gt;
  {                     // hier braucht nichts mehr gemacht werden.&lt;br /&gt;
  }                     // der Timer selbst sorgt dafür, dass die ISR Funktion&lt;br /&gt;
}                       // regelmäßig aufgerufen wird&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CTC Modus ==&lt;br /&gt;
Manchmal reicht das aber nicht. Benötigt man zb nicht 488 sondern möglichst genau 500 ISR Aufrufe in der Sekunde, so wird man weder mit Vorteiler noch durch Softwaremässiges Weiterteilen in der ISR zum Ziel kommen. Man kann natürlich die Taktfrequenz des kompletten Systems soweit umstellen, dass sich das alles ausgeht, aber oft ist das einfach nicht möglich. Was tun?&lt;br /&gt;
&lt;br /&gt;
Die Sache wäre einfacher, wenn man dem Timer vorschreiben könnte, nicht einfach nur von 0 bis 255 zu zählen, sondern wenn man ihm eine Obergrenze vorgeben könnte. Denn dann könnte man sich eine Obergrenze so bestimmen, dass dieser neue Zählbereich in 1 Sekunde ganz genau so oft durchlaufen werden kann, wie man es benötigt. Und hier kommt der sog. &amp;lt;b&amp;gt;CTC&amp;lt;/b&amp;gt; Modus ins Spiel. Denn genau darin besteht sein Wesen: Man gibt dem Timer eine Obergrenze vor. Erreicht seine Zählung diesen Wert, so wird der Timer auf 0 zurückgesetzt und beginnt wieder von vorne. Genau das was wir benötigen. Wollen wir exakt 500 ISR Ausfrufe in der Sekunde haben (bei 1 Mhz Systemtakt), dann wählen wir einen Vorteiler von 8 und setzen die Obergrenze auf 250-1 (nicht vergessen: wir brauchen 250 Zählschritte, das bedeutet der Timer muss von 0 bis 249 zählen, denn auch der Überlauf von 249 zurück auf 0 ist ein Zählschritt). Der Timer taktet dann mit 1Mhz / 8 = 125kHz und da nach jeweils 250 Zählschritten die Obergrenze erreicht ist, wird diese Obergrenze in 1 Sekunde 125000 / 250 = 500 mal erreicht. Genau so wie wir das wollten.&lt;br /&gt;
Wie wird dem Timer nun mitgeteilt, dass er eine spezielle Obergrenze benutzen soll? Nun, jeder Timer hat verschiedene Modi. Welche das bei einem konkreten µC und bei einem konkreten Timer genau sind, findet sich im Datenblatt im Abschnitt über die Timer. Normalerweise ist immer eines der letzteren Abschnitte eines jeden Kapitels im Datenblatt das interessantere: &amp;quot;Register Summary&amp;quot; oder &amp;quot;Register Description&amp;quot; genannt (die Datenblätter sind da nicht ganz einheitlich). So auch hier.&lt;br /&gt;
[[Bild:FAQ_Datenblatt_Timer_Mega16.png|framed|center|Auszug aus dem Atmel Datenblatt für den Mega16 - Suche im Datenblatt]]&lt;br /&gt;
In jedem Atmel Datenblatt findet sich bei jedem Timer immer auch besagter Abschnitt (im Inhaltsverzeichnis beim Kapitel über den jeweiligen Timer suchen. Im Datenblatt-PDF daher immer das Inhaltsverzeichnis anzeigen lassen!), und in diesem Abschnitt gibt es eine Tabelle, aus der hervorgeht, welche Modi es gibt, welche Bits dazu in den Konfigurationsregistern gesetzt werden müssen, wie sich dann die Obergrenze des Timer-Zählbereichs zusammensetzt und noch ein paar Angaben mehr. Beim Mega16 findet sich diese Tabelle für den Timer 0 zb auf Seite 83 und dort ist es die Tabelle 14.2. Diese Tabelle sieht im Datenblatt so aus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle}} &lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
! Mode || WGM01 || WGM00 || Timer/Counter || TOP || Update of || TOV0 Flag&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!      || (CTC0) || (PWM0) || Mode of Operation || || OCR0 || Set-on&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || Normal || 0xFF || Immediate || MAX&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || 1 || PWM, Phase Correct || 0xFF || TOP|| BOTTOM&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 1 || 0 || CTC || OCR0 || Immediate || MAX&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 1 || 1 || Fast PWM || 0xFF || BOTTOM || MAX&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dort beginnt man mit der Recherche und sucht sich die Bits für den gewünschten Modus raus. Mit diesen Bits sieht man dann in den Konfigurationsregistern nach, welches Bit zu welchem Register gehört und setzt es ganz einfach. In unserem Fall möchten wir den CTC Modus, also den Modus 2. Dazu muss das Bit WGM01 gesetzt werden und WGM00 muss auf 0 bleiben. Im Datenblatt ein wenig zurückscrollen bringt ans Licht, dass das Bit WGM01 im Konfigurationsregister TCCR0 angesiedelt ist. Weiters entnehmen wir der Tabelle, dass der Timer bis zum Wert in OCR0 zählen wird (die Spalte &amp;lt;b&amp;gt;TOP&amp;lt;/b&amp;gt;). Dort hinein müssen also die 250-1 als Obergrenze geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist auch noch: Dieser Spezialmodus CTC löst keinen Overflow Interrupt aus, sondern einen sog. Compare Match Interrupt. Dies deshalb, weil die gewünschte Obergrenze ja laut Datenblatt in eines der sog. Compare Match Register geschrieben werden muss (OCR0). Das sind Spezialregister, die nach jedem Zählvorgang mit dem Zählregister verglichen werden. Stimmt ihr Inhalt mit dem des Zählregisters überein, so hat man einen Compare-Match und kann daran wieder eine Aktion (ISR) knüpfen. In diesem speziellen Fall des CTC Modus beinhaltet dieser Compare Match dann auch noch das automatische Rücksetzen des Timers auf 0.&lt;br /&gt;
&lt;br /&gt;
Und natürlich können auch mehrere Techniken kombiniert werden. Z. B. CTC Modus und zusätzliches weiteres softwaremässiges Herunterteilen in der ISR sieht dann so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Für einen Mega16.&lt;br /&gt;
// Andere Prozessoren: siehe Datenblatt wie die Timerkonfiguration einzustellen ist&lt;br /&gt;
 &lt;br /&gt;
#define F_CPU 1000000UL&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
ISR( TIMER0_COMP_vect )    // Compare Match Interrupt Vector&lt;br /&gt;
{&lt;br /&gt;
  static uint8_t swTeiler = 0;&lt;br /&gt;
 &lt;br /&gt;
  swTeiler++;&lt;br /&gt;
  if( swTeiler == 200 ) {&lt;br /&gt;
    swTeiler = 0;&lt;br /&gt;
    PORTD = PORTD ^ 0xFF;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  DDRD = 0xFF;          // irgendein Port, damit wir auch was sehen&lt;br /&gt;
 &lt;br /&gt;
  TIMSK = (1&amp;lt;&amp;lt;OCIE0);               // den Output Compare Interrupt des Timers freigeben&lt;br /&gt;
  OCR0  = 250 - 1;                    // nach 250 Zaehlschritten -&amp;gt; Interrupt und Timer auf 0&lt;br /&gt;
  TCCR0 = (1&amp;lt;&amp;lt;WGM01) | (1&amp;lt;&amp;lt;CS01);    // Vorteiler 8, CTC Modus&lt;br /&gt;
 &lt;br /&gt;
  &lt;br /&gt;
  sei();                // und Interrupts generell freigeben&lt;br /&gt;
 &lt;br /&gt;
  &lt;br /&gt;
  while( 1 )&lt;br /&gt;
  {                     // hier braucht nichts mehr gemacht werden.&lt;br /&gt;
  }                     // der Timer selbst sorgt dafür, dass die ISR Funktion&lt;br /&gt;
}                       // regelmässig aufgerufen wird &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fast PWM ==&lt;br /&gt;
&lt;br /&gt;
Aber der Timer kann noch mehr. Wenn der Timer so vor sich hinzählt, dann kann man bestimmte Output-Pins des µC an diesen Timer koppeln. Der Timer kann dann diesen Pin bei erreichen von bestimmten Zählerständen ganz von alleine wahlweise auf 0 schalten, auf 1 schalten oder umdrehen.&lt;br /&gt;
&lt;br /&gt;
Was passiert da genau? Im folgenden sei von der einfachsten Form der PWM auf einem Mega16 ausgegangen: Wenn der Timer in seiner Zählerei bei 0 ist, dann schaltet er den Pin auf 1, bei einem bestimmten Zählerstand soll er den Pin wieder auf 0 zurücksetzen und ansonsten soll der Timer wie gewohnt laufend von 0 bis 255 durchzählen.&lt;br /&gt;
Es ist die Rede vom Timer-Modus 3, siehe die vorhergehende Tabelle aus dem Datenblatt.&lt;br /&gt;
&lt;br /&gt;
Der Tabelle entnehmen wir wieder: Die Bits WGM01 und WGM00 müssen auf 1 gestellt werden. Der TOP Wert (also der Wert, bis zu dem der Timer zählt) ist 0xFF (also 255) und das OCR0 Register steuert, bei welchem Zählerstand die Timerhardware den Pin wieder auf 0 zurück schaltet. Das Einschalten auf 1 ist vorgegeben (auch das kann man ändern, dazu später mehr).&lt;br /&gt;
&lt;br /&gt;
Stellt man also genau diese Konfiguration her und schreibt in das Register OCR0 beispielsweise den Wert 253, dann beginnt der Timer bei 0 zu zählen, wobei der den Ausgangspin auf 1 schaltet. Wird der Zählerstand 253 erreicht, dann schaltet der Timer den Pin wieder auf 0 zurück und zählt weiter bis 255 um dann wieder erneut bei 0 zu beginnen (und den Ausgansg-Pin wieder auf 1 zu schalten). Der Ausgangspin ist in diesem Fall also die meiste Zeit auf 1 und nur ganz kurz (während der Timer von 253 bis 255 zählt) auf 0.&lt;br /&gt;
&lt;br /&gt;
Schreibt am auf der anderen Seite in das Register OCR0 den Wert 3, dann passiert konzeptionell genau dasselbe nur mit anderen Zahlenwerten. Der Timer beginnt bei 0 zu zählen und schaltet den Ausgansgpin auf 1. Aber diesmal ist es bereits beim Zählerstand 3 so weit: Der Zählerstand stimmt mit dem Wert in OCR0 überein und als Folge davon wird der Ausgangspin wieder auf 0 gestellt. Der Timer zählt natürlich wie immer weiter bis 255 ehe dann das ganze Spiel wieder von vorne beginnt. In diesem Fall war also der Ausgangspin nur ganz kurze Zeit auf 1 (nämich in der Zeit, die der Timer benötigt um von 0 bis 3 zu zählen) und dann die meiste Zeit auf 0. Und genau darum geht es bei PWM: Mit dem Register OCR0 lässt sich daher der zeitliche Anteil steuern, in dem der Pin auf 1 liegt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Für einen Mega16.&lt;br /&gt;
// Andere Prozessoren: siehe Datenblatt wie die Timerkonfiguration einzustellen ist&lt;br /&gt;
 &lt;br /&gt;
#define F_CPU 1000000UL&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  uint8_t i;&lt;br /&gt;
&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB3);       // PB3 auf Ausgang stellen. Dieser Pin&lt;br /&gt;
                          // trägt auch die Bezeichnung OC0 und ist der Pin&lt;br /&gt;
                          // an dem der Timer 0 seine PWM ausgibt&lt;br /&gt;
&lt;br /&gt;
  OCR0  = 250;&lt;br /&gt;
  TCCR0 = (1&amp;lt;&amp;lt;WGM01) | (1&amp;lt;&amp;lt;WGM00) | (1&amp;lt;&amp;lt;CS01);    // Vorteiler 8, Fast PWM 8 Bit&lt;br /&gt;
  TCCR0 = (1&amp;lt;&amp;lt;COM01); &lt;br /&gt;
  &lt;br /&gt;
  while( 1 )&lt;br /&gt;
  {                     // hier braucht nichts mehr gemacht werden.&lt;br /&gt;
                        // der Timer selbst sorgt dafür, dass die PWM läuft&lt;br /&gt;
                        // wir wollen aber ein wenig Action haben.&lt;br /&gt;
                        // Also setzen wir das OCR0 Register auf verschiedene&lt;br /&gt;
                        // Werte, damit eine angeschlossene LED unterschiedliche&lt;br /&gt;
                        // Helligkeiten zeigt&lt;br /&gt;
    OCR0 = 30;&lt;br /&gt;
    _delay_ms( 1000 );&lt;br /&gt;
    OCR0 = 200;&lt;br /&gt;
    _delay_ms( 1000 );&lt;br /&gt;
&lt;br /&gt;
    for( i = 0; i &amp;lt; 255; ++i ) {&lt;br /&gt;
      OCR0 = i;&lt;br /&gt;
      _delay_ms( 10 );&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bleibt noch das gesetzte Bit COM01. Was hat es damit auf sich? Bisher war immer die Rede davon, das der Ausganspin bei einem Zählerstand von 0 auf 1 geschaltet wird usw. Das regelt genau dieses Bit. Im Datenblatt findet sich die Tabelle 14.4 auf der Seite 83, die genau regelt welche Bedeutung die Bits COM01 bzw COM00 haben, wenn der Timer Modus auf Fast-PWM eingestellt ist. Achtung: Je nach Timer-Modus haben diese Bits andere Bedeutungen! Man muss sich also immer die zum jeweiligen Timer-Modus gehörende Tabelle im Datenblatt suchen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:C]]&lt;br /&gt;
[[Kategorie:avr-gcc]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=FAQ&amp;diff=82872</id>
		<title>FAQ</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=FAQ&amp;diff=82872"/>
		<updated>2014-05-02T11:58:28Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Wiederhergestellt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein Verzeichnis von im Forum oft gestellten und immer wieder beantworteten Fragen und den zugehörigen Antworten:&lt;br /&gt;
&lt;br /&gt;
=Wie kann ich Zahlen auf [[LCD]]/[[UART]] ausgeben?=&lt;br /&gt;
&lt;br /&gt;
Aber die Bibliothek, die du benutzt, stellt nur eine Funktion zur Verfügung, mit der man einen String ausgeben kann... Was tun? &lt;br /&gt;
&lt;br /&gt;
In den folgenden Beispielen wird eine selbstgeschriebene Funktion zur Stringausgabe auf LCD - die Funktion lcd_string() - aus dem [[AVR-GCC-Tutorial/LCD-Ansteuerung|LCD-Teil des AVR-GCC-Tutorials]] verwendet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
lcd_string( &amp;quot;Hallo Welt&amp;quot; );  // ggf. auch lcd_out() o.ä. in anderen Libraries&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um also eine Zahl (numerische Konstante oder Variableninhalt) auszugeben, muss von dieser Zahl zunächst ihre String-Repräsentation ermittelt werden. Hier geht es aber nur darum, zu zeigen wie man diese String Repräsenation erzeugen kann. Was man dann mit diesem String weiter macht, ob das dann eine LCD-Ausgabe oder eine UART-Übertragung oder das Abspeichern auf SD-Karte oder ... ist, spielt eine untergeordnete Rolle.&lt;br /&gt;
&lt;br /&gt;
Es gibt mehrere Möglichkeiten, sich die Stringrepräsentation zu erzeugen:&lt;br /&gt;
&lt;br /&gt;
===itoa() (utoa(), ltoa(), ultoa(), ftoa() )===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;itoa()&amp;lt;/b&amp;gt; ist keine C-Standardfunktion (wohl aber ihre Umkehrung &amp;lt;b&amp;gt;atoi()&amp;lt;/b&amp;gt; ). Auf manchen Compilern heisst diese Funktion dann folgerichtig &amp;lt;b&amp;gt;_itoa()&amp;lt;/b&amp;gt;, wobei der führende _ eben anzeigt, dass es sich um eine Erweiterung des C-Standards handelt. Bei [[WinAVR]] ist itoa() Bestandteil der mitgelieferten Library avr-libc, in der Library [http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html&#039;&#039;stdlib.h&#039;&#039;].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
  char Buffer[20];&lt;br /&gt;
  int i = 25;&lt;br /&gt;
&lt;br /&gt;
  itoa( i, Buffer, 10 );&lt;br /&gt;
  lcd_string( Buffer ); // ggf. auch lcd_out() o.ä. in anderen Libraries&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;itoa( i, Buffer, 10 );&amp;lt;/b&amp;gt; - Die Zahl i wird nach ASCII gewandelt und die String Repräsentierung davon wird in Buffer abgelegt. Die Basis, in der diese Wandlung erfolgt, ist das 10-er System. Wird das dritte Argument von 10 in zb. 2 oder auch 16 abgewandelt, erhält man die binäre oder eben eine hexadezimale Repräsentierung des Wertes. Auch wenn 10, 2 und 16 die häufigsten Angaben an dieser Stelle sind, kann itoa aber grundsätzlich in jedes beliebige Zahlensystem wandlen.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist, darauf zu achten, dass das Array &amp;lt;i&amp;gt;Buffer&amp;lt;/i&amp;gt; groß genug dimensioniert wird, um alle Zeichen der Textrepräsentation der Zahl aufzunehmen - inklusive der 0, die den String abschließt, sowie ein mögliches Vorzeichen.&lt;br /&gt;
&lt;br /&gt;
Anzumerken bleibt weiter, dass es normalerweise für alle Datentypen entsprechende Umwandlungsfunktionen gibt, wenn es sie für einen Datentyp gibt. Die Namensgebung lehnt sich an das Schema an: &#039;&#039;Kürzel_für_den_Datentyp to a&#039;&#039;. Eine Funktion die einen unsigned int wandelt, heißt dann utoa (oder _utoa), Floating Point heißt dann ftoa (oder _ftoa), etc.&lt;br /&gt;
&lt;br /&gt;
===sprintf()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  char Buffer[20];&lt;br /&gt;
  int i = 25;&lt;br /&gt;
&lt;br /&gt;
  sprintf( Buffer, &amp;quot;%d&amp;quot;, i );&lt;br /&gt;
  lcd_string( Buffer ); // ggf. auch lcd_out() o.ä. in anderen Libraries&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Methode funktioniert auch bei long oder float Werten. Unbedingt beachtet werden muss allerdings, dass die Typkennzeichnungen im sog. Format-String (hier &amp;quot;%d&amp;quot;) mit den tatsächlichen Typen der auszugebenden Werten übereinstimmt. Und dass der Buffer, der den Text aufnimmt, auch groß genug dimensioniert wird. Dabei sollte die 0, die den String terminiert, nicht vergessen werden.&lt;br /&gt;
&lt;br /&gt;
Mit sprintf() hat man dieselben Möglichkeiten zur Formatierung wie bei &amp;lt;b&amp;gt;printf()&amp;lt;/b&amp;gt; (siehe unten). Insbesondere gibt es natürlich die Möglichkeit die Zahl gleich in einen umgebenden Text einzubetten bzw. Formatierungen anzugeben:&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  char Buffer[20];&lt;br /&gt;
  int i = 25;&lt;br /&gt;
&lt;br /&gt;
  sprintf( Buffer, &amp;quot;Anzahl: %d Stueck&amp;quot;, i );&lt;br /&gt;
  lcd_out( Buffer );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;Haken&amp;quot; an der mächtigen Funktion sprintf() ist, daß sie auch bei minimalisierter Konfiguration verhältnismäßig viel Programmspeicher (Flash-ROM) belegt und relativ viel Prozesszeit benötigt. Daher sollte man sprintf() nur verwenden, wenn kein Speicher- und Prozesszeitmangel besteht. Sonst sollte itoa() oder eine eigene, auf die Bedürfnisse optimierte Implementierung auf jeden Fall vorgezogen werden. Der große Vorteil von sprintf liegt darin, dass man über sehr mächtige Formatiermöglichkeiten verfügt, mit der man die Ausgabe einfach steuern und an seine Bedürfnisse anpassen kann. Dinge die man mit einer Funktion wie itoa alle selbst &#039;händisch&#039; erledigen muss.&lt;br /&gt;
&lt;br /&gt;
====Formatierungen mit printf====&lt;br /&gt;
&lt;br /&gt;
Für jedes auszugebende Argument muss es im Formatstring einen entsprechenden Formatbezeichner geben. Der Aufbau eines Formatbezeichners ist immer&lt;br /&gt;
&lt;br /&gt;
  %[Modifizierer][Feldbreite][.Präzision]Typ&lt;br /&gt;
&lt;br /&gt;
(Die in eckigen Klammern [ ] angegebenen Elemente können auch weggelassen werden, wenn man sie nicht benötigt. Im einfachsten Fall benötigt man also nur das % und den Buchstaben zur Typ-Kennung.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Typ&amp;lt;/b&amp;gt; ist dabei eine Kennung, der mit dem Datentyp des jeweiligen auszugebenden Argumentes übereinstimmen muss. Einige oft benutzte Kennungen, ohne Anspruch auf Vollständigkeit, sind:&lt;br /&gt;
  &amp;lt;b&amp;gt;c&amp;lt;/b&amp;gt;    char&lt;br /&gt;
  &amp;lt;b&amp;gt;d&amp;lt;/b&amp;gt;    int&lt;br /&gt;
  &amp;lt;b&amp;gt;f&amp;lt;/b&amp;gt;    float, double&lt;br /&gt;
  &amp;lt;b&amp;gt;ld&amp;lt;/b&amp;gt;   long&lt;br /&gt;
  &amp;lt;b&amp;gt;u&amp;lt;/b&amp;gt;    unsigned int&lt;br /&gt;
  &amp;lt;b&amp;gt;lu&amp;lt;/b&amp;gt;   unsigned long&lt;br /&gt;
  &amp;lt;b&amp;gt;p&amp;lt;/b&amp;gt;    pointer&lt;br /&gt;
  &amp;lt;b&amp;gt;s&amp;lt;/b&amp;gt;    string&lt;br /&gt;
  &amp;lt;b&amp;gt;x&amp;lt;/b&amp;gt;    ein int wird ausgegeben, die Ausgabe erfolgt&lt;br /&gt;
       aber als Hexadezimalzahl&lt;br /&gt;
  &amp;lt;b&amp;gt;X&amp;lt;/b&amp;gt;    ein int wird ausgegeben, die Ausgabe erfolgt&lt;br /&gt;
       aber als Hexadezimalzahl, wobei Grossbuchstaben verwendet werden&lt;br /&gt;
&lt;br /&gt;
Der&#039;&#039;Modifizierer&#039;&#039; bestimmt, wie und womit nicht benutzte Felder des Ausgabefeldes gefüllt werden sollen, wie die Ausrichtung innerhalb des Feldes erfolgen soll und ob ein Vorzeichen auch dann ausgegeben werden soll wenn die auszugebende Zahl positiv ist. Wird kein Modifizierer angegeben, so werden nicht benutzte Felder mit einem Leerzeichen gefüllt, positive Vorzeichen unterdrückt und die Ausgabe im Feld rechts ausgerichtet.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;b&amp;gt;+&amp;lt;/b&amp;gt;    Vorzeichen wird immer ausgegeben&lt;br /&gt;
  &amp;lt;b&amp;gt;-&amp;lt;/b&amp;gt;    Die Ausgabe wird im Ausgabefeld linksbündig ausgerichtet&lt;br /&gt;
  &amp;lt;b&amp;gt;0&amp;lt;/b&amp;gt;    anstelle von Leerzeichen werden führende 0-en ausgegeben&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;Feldbreite&#039;&#039; gibt die Breite des Ausgabefeldes an, in die die Ausgabe durchgeführt werden soll. Reicht die angegebene Feldbreite nicht aus, so vergrößert printf diese Breite eigenmächtig. Die Feldbreite muß nicht angegeben werden. In diesem Fall bestimmt printf selbst die Feldbreite, so dass die Ausgabe darin Platz findet. Mit der Feldbreite hat man eine simple Möglichkeit dafür zu sorgen, dass der erzeugte String immer eine konstante Länge hat, selbst wenn die auszugebende Zahl diese Länge gar nicht benötigen würde (wichtig zb. bei Tabellen, damit die Einerstellen der Tabelleneinträge auch sauber untereinander stehen, auch dann wenn die Zahlen sich in unterschiedlichen Wertebereichen bewegen).&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;Präzision&#039;&#039; kommt nur bei float oder double Zahlen zum Einsatz. Sie legt fest, wieviele Positionen der kompletten Feldbreite für die Ausgabe von Nachkommastellen reserviert werden sollen. Auch sie muss wiederrum nicht angegeben werden und printf benutzt in so einem Fall Standardvorgaben.&lt;br /&gt;
&lt;br /&gt;
===== Beispiele =====&lt;br /&gt;
;&amp;lt;tt&amp;gt;&amp;quot;%d&amp;quot;&amp;lt;/tt&amp;gt;: Ausgabe eines Integer&lt;br /&gt;
;&amp;lt;tt&amp;gt;&amp;quot;%5d&amp;quot;&amp;lt;/tt&amp;gt;: Ausgabe eines Integer in einem Feld mit 5 Zeichen Breite&lt;br /&gt;
;&amp;lt;tt&amp;gt;&amp;quot;%05d&amp;quot;&amp;lt;/tt&amp;gt;: Ausgabe eines Integer in einem Feld mit 5 Zeichen Breite, wobei das Feld links mit führenden Nullen auf 5 Zeichen aufgefüllt wird&lt;br /&gt;
;&amp;lt;tt&amp;gt;&amp;quot;%-5d&amp;quot;&amp;lt;/tt&amp;gt;: Ausgabe eines Integer in einem Feld mit 5 Zeichen Breite. Die Zahl wird linksbündig in das Feld gestellt.&lt;br /&gt;
;&amp;lt;tt&amp;gt;&amp;quot;%6.3f&amp;quot;&amp;lt;/tt&amp;gt;: Ausgabe eines float (oder double). Die Ausgabe erfolgt in einem Feld mit 6 Zeichen Breite, wobei 3 Nachkommastellen ausgegeben werden. Achtung: In der Feldbreite ist auch ein eventuelles Vorzeichen sowie der Dezimalpunkt enthalten. Bei einer Feldbreite von 6 Zeichen und 3 Nachkommastellen, bleiben bei einer positiven Zahl daher nur 2 Positionen für den Vorkommaanteil, bei negativen sogar nur 1 Stelle (6 - 3 Nachkommastellen - 1 Dezimalpunkt - 1 Vorzeichen = 1)&lt;br /&gt;
&lt;br /&gt;
===Eigene Umwandlungsfunktionen===&lt;br /&gt;
&lt;br /&gt;
Möchte man &amp;lt;b&amp;gt;itoa()&amp;lt;/b&amp;gt; nicht benutzen oder hat es gar auf seinem System nicht zur Verfügung, dann ist es auch nicht schwer, sich selbst eine Funktion dafür zu schreiben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void ItoA( int z, char* Buffer )&lt;br /&gt;
{&lt;br /&gt;
  int i = 0;&lt;br /&gt;
  int j;&lt;br /&gt;
  char tmp;&lt;br /&gt;
  unsigned u;    // In u bearbeiten wir den Absolutbetrag von z.&lt;br /&gt;
  &lt;br /&gt;
    // ist die Zahl negativ?&lt;br /&gt;
    // gleich mal ein - hinterlassen und die Zahl positiv machen&lt;br /&gt;
    if( z &amp;lt; 0 ) {&lt;br /&gt;
      Buffer[0] = &#039;-&#039;;&lt;br /&gt;
      Buffer++;&lt;br /&gt;
      // -INT_MIN ist idR. größer als INT_MAX und nicht mehr &lt;br /&gt;
      // als int darstellbar! Man muss daher bei der Bildung &lt;br /&gt;
      // des Absolutbetrages aufpassen.&lt;br /&gt;
      u = ( (unsigned)-(z+1) ) + 1; &lt;br /&gt;
    }&lt;br /&gt;
    else { &lt;br /&gt;
      u = (unsigned)z;&lt;br /&gt;
    }&lt;br /&gt;
    // die einzelnen Stellen der Zahl berechnen&lt;br /&gt;
    do {&lt;br /&gt;
      Buffer[i++] = &#039;0&#039; + u % 10;&lt;br /&gt;
      u /= 10;&lt;br /&gt;
    } while( u &amp;gt; 0 );&lt;br /&gt;
&lt;br /&gt;
    // den String in sich spiegeln&lt;br /&gt;
    for( j = 0; j &amp;lt; i / 2; ++j ) {&lt;br /&gt;
      tmp = Buffer[j];&lt;br /&gt;
      Buffer[j] = Buffer[i-j-1];&lt;br /&gt;
      Buffer[i-j-1] = tmp;&lt;br /&gt;
    }&lt;br /&gt;
    Buffer[i] = &#039;\0&#039;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Grundprinzip ist einfach:&amp;lt;br&amp;gt;&lt;br /&gt;
Die Ermittlung der einzelnen Stellen erfolgt in der zentralen Schleife&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    do {&lt;br /&gt;
      Buffer[i++] = &#039;0&#039; + u % 10;&lt;br /&gt;
      u /= 10;&lt;br /&gt;
    } while( u &amp;gt; 0 );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
durch fortgesetzte Division durch 10 und Restbildung.&lt;br /&gt;
&lt;br /&gt;
    8392&lt;br /&gt;
&lt;br /&gt;
    8392 % 10           -&amp;gt; &amp;lt;b&amp;gt;2&amp;lt;/b&amp;gt;&lt;br /&gt;
    8392 / 10  -&amp;gt; 839&lt;br /&gt;
&lt;br /&gt;
     839 % 10           -&amp;gt; &amp;lt;b&amp;gt;9&amp;lt;/b&amp;gt;&lt;br /&gt;
     839 / 10  -&amp;gt; 83&lt;br /&gt;
&lt;br /&gt;
      83 % 10           -&amp;gt; &amp;lt;b&amp;gt;3&amp;lt;/b&amp;gt;&lt;br /&gt;
      83 / 10  -&amp;gt; 8&lt;br /&gt;
&lt;br /&gt;
       8 % 10           -&amp;gt; &amp;lt;b&amp;gt;8&amp;lt;/b&amp;gt;&lt;br /&gt;
       8 / 10  -&amp;gt; 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nur leider erhält man dadurch die einzelnen Ziffern der Zahl in umgekehrter Reihenfolge im String (&#039;2&#039; &#039;9&#039; &#039;3&#039; &#039;8&#039; anstelle von &#039;8&#039; &#039;3&#039; &#039;9&#039; &#039;2&#039;). Dies ist aber kein Problem, die nachfolgende Schleife&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  for( j = 0; j &amp;lt; i / 2; ++j ) {&lt;br /&gt;
    tmp = Buffer[j];&lt;br /&gt;
    Buffer[j] = Buffer[i-j-1];&lt;br /&gt;
    Buffer[i-j-1] = tmp;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
spiegelt den String in sich, sodass danach der String eine korrekte Repräsentation der ursprünglichen Zahl darstellt. Der Funktionsteil vor der &#039;Zerlegeschleife&#039; behandelt den Sonderfall daß die Zahl negativ ist. Negative Zahlen werden behandelt indem im Endergebnis ein &#039;-&#039; vermerkt wird und danach die Zahl positiv gemacht wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* Forenbeitrag [http://www.mikrocontroller.net/topic/67405#541885 Integer-Zahl in String mit bestimmter Zeichenlänge]&lt;br /&gt;
* Forenbeitrag [http://www.mikrocontroller.net/topic/84005#704736 (Resourcenschonend) Wert einer Variable am LCD ausgeben] von Niels Hüsken &lt;br /&gt;
* Forenbeitrag [http://www.mikrocontroller.net/topic/121526?goto=new#new Formatierte Zahlenausgabe in C] von  Peter Dannegger&lt;br /&gt;
* [[Festkommaarithmetik]]&lt;br /&gt;
&lt;br /&gt;
=Datentypen in Operationen=&lt;br /&gt;
Ein häufiges Problem betrifft die Auswertung von Ausdrücken. Konkret die Frage nach den beteiligten Datentypen.&lt;br /&gt;
zb&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
double i;&lt;br /&gt;
int j, k;&lt;br /&gt;
&lt;br /&gt;
i = j / k;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Frage lautet dann: Warum erhalte ich keine Kommastellen, ich weise doch das Ergebnis einem double zu?&lt;br /&gt;
&lt;br /&gt;
Dazu ist zu sagen, dass C nicht so funktioniert. Die Tatsache dass i eine double Variable ist, ist für die Auswahl der Operation, welche die Division durchführt, völlig irrelevant. C orientiert sich ausschliesslich an den &lt;br /&gt;
Datentypen der beteiligten Operanden, um zu entscheiden ob die Division als Integer- oder als Gleitkommadivision durchzuführen ist. Und da sowohl j als auch k ein Integer sind, wird die Division als Integerdivision durchgeführt&lt;br /&gt;
unabhängig davon, was mit dem Ergebnis weiter passiert. Erst nach der Division wird das Ergebnis in einen double überführt, um es an i zuweisen zu können. Zu diesem Zeitpunkt gibt es aber keine Kommastellen mehr, eine Integerdivision erzeugt keine. Und damit tauchen klarerweise auch im Ergebnis keine auf.&lt;br /&gt;
&lt;br /&gt;
Aus genau diesem Grund ist zb das Ergebnis von&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
double i;&lt;br /&gt;
i = 5 / 8;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
eine glatte 0 und nicht 0.625. Die Division 5 / 8 wird als Integer Division gemacht und liefert als solche keine Nachkommastellen. Wird das Ergebnis der Division in einen double umgewandelt, um es an i zuweisen zu können, ist das Kind schon in den Brunnen gefallen: Die Nachkommastellen sind schon längst weg bzw. waren nie vorhanden.&lt;br /&gt;
&lt;br /&gt;
Will man den Compiler dazu zwingen, die Division als Gleitkommadivision durchzuführen, so muss man daher dafür sorgen, dass mindestens einer der beteiligten Operanden ein double Wert ist. Dann bleibt dem Compiler nichts anderes übrig, als auch den zweiten Operanden ebenfalls zu einem double zu machen und die Operation als Gleitkommaoperation durchzuführen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
double i;&lt;br /&gt;
i = 5.0 / 8.0;&lt;br /&gt;
&lt;br /&gt;
i = (double)j / k;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generell implementiert der Compiler eine Operation immer im &#039;höchsten&#039; Datentyp, der in dieser Operation vorkommenden Operanden. Operanden in einem &#039;niedrigeren&#039; Datentyp werden automatisch immer in diesen &#039;höchsten&#039; Datentyp umgewandelt, zumindest aber int. Die Reihung orientiert sich dabei an der Regel: Ein &#039;höherer&#039; Datentyp kann alle Werte eines &#039;niedrigeren&#039; Datentyps aufnehmen.&lt;br /&gt;
&lt;br /&gt;
    int&lt;br /&gt;
    unsigned int&lt;br /&gt;
    long&lt;br /&gt;
    unsigned long&lt;br /&gt;
    long long&lt;br /&gt;
    unsigned long long&lt;br /&gt;
    double&lt;br /&gt;
    &lt;br /&gt;
float kommt in dieser Tabelle gar nicht vor, da Gleitkommaoperationen grundsätzlich immer als double-Operationen durchgeführt werden. Wohl kann es aber sein, dass double und float dieselbe Anzahl an Bits benutzen. Damit reduziert sich eine double Operation effektiv auf eine float Operation. (Anmerkung: mit dem C99-Standard hat sich dieses geändert. Dort gibt es dann auch echte float Operationen)&lt;br /&gt;
&lt;br /&gt;
Hat man also in einer Operation 2 Operanden der Datentypen int und long, so wird der int implizit zu einem long gemacht und die Operation als long Operation durchgeführt. Das Ergebnis hat dann den Datentyp long.&lt;br /&gt;
&lt;br /&gt;
==Welche Datentypen haben Konstanten==&lt;br /&gt;
&lt;br /&gt;
Auch Zahlenkonstante besitzen einen Datentyp, der selbstverständlich vom Compiler bei der Auswahl der Operation berücksichtigt wird. Hier gilt die Regel: Benutzt wird der Datentyp, der die Zahl gerade noch aufnehmen kann. Eine Zahlenkonstante 5 hat daher den Datentyp int. Die Zahl 32767 passt gerade noch in einen int, und hat daher den Datentyp int. 32768 ist für einen int bereits zu groß und hat daher den Datentyp long. 5.0 ist hingegem immer eine double-Konstante. Der Dezimalpunkt erzwingt dieses.&lt;br /&gt;
&lt;br /&gt;
Eine kleine Feinheit gibt es noch zu beachten. Konstanten in dezimaler Schreibweise haben immer einen signed Datentyp, während Konstanten in hexadezimaler bzw. oktaler Schreibweise je nach Wert einen signed oder einen unsigned Datentyp haben können.&lt;br /&gt;
&lt;br /&gt;
Möchte man einer Konstanten einen bestimmten Datentyp aufzwingen, so gibt es dazu 2 (ein halb) Möglichkeiten:&lt;br /&gt;
* Entweder man castet die Konstante in den gewünschten Datentyp&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
   (long)5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* oder man benutzt die in C dafür vorgesehene Schreibweise, indem man der Konstanten einen Suffix anhängt, der den gewünschten Datentyp beschreibt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    5L&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Beides ergibt eine dezimale 5, die vom Datentyp long ist.&lt;br /&gt;
&lt;br /&gt;
* eine Zahl in mit einem Dezimalkomma&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    5.0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ist immer eine double Zahl. Es sei denn sie hat explizit einen Suffix&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    5.0F&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
dann hat man es mit einer float Zahl zu tun.&lt;br /&gt;
&lt;br /&gt;
Die gültigen Suffixe für Zahlen sind U, L, UL und F:&lt;br /&gt;
&lt;br /&gt;
* U wie unsigned; dabei wird zuerst int angenommen. Es erfolgt eine automatische Ausweitung auf long, wenn die Zahl den Wertebereich eines unsigned int überschreitet. &lt;br /&gt;
* L wie long; die Zahl selbst kann int oder double sein.&lt;br /&gt;
* UL wie unsigned long. Eigentlich eine Zusammensetzung aus U und L&lt;br /&gt;
* F wie float.&lt;br /&gt;
&lt;br /&gt;
Präprozessordefinitionen besitzen keine eigene Datentypen, da sie eine reine Textersetzungen durchführen. Deren Inhalte können aber ggf. zu Werten aufgelöst werden, die datentypbehaftet sind.&lt;br /&gt;
&lt;br /&gt;
=Aktivieren der Floating Point Version von sprintf bei WinAVR bzw AVR-Studio=&lt;br /&gt;
[[Bild:AVR_Studio_float1.gif|thumb|right|300px|Project → Configuration Options  → Libraries → Available Link Objects]]&lt;br /&gt;
[[Bild:AVR_Studio_float2.gif|thumb|right|300px|Custom Options → Custom Compilation Options → Linker Options]]&lt;br /&gt;
Beim WinAVR/AVR-Studio wird standardmässig eine Version der printf-Bibliothek verwendet, die keine Floatingpoint-Verarbeitung unterstützt. Die meisten Programme benötigen keine Floatingpoint-Unterstützung, so dass dadurch wertvoller Programmspeicherplatz gespart werden kann.&lt;br /&gt;
&lt;br /&gt;
Benutzt man allerdings eine printf-Variante für die Ausgabe von Floatingpoint-Zahlen, so erscheint an Stelle der korrekt formatierten Zahl lediglich ein &#039;?&#039;. Dies ist ein Indiz dafür, dass die Floatingpoint-Verarbeitung im Projekt aktiviert werden muss.&lt;br /&gt;
&lt;br /&gt;
Um die Floatingpoint-Verarbeitung zu aktivieren, geht man im &#039;&#039;&#039;AVR Studio 4&#039;&#039;&#039; wie folgt vor: &lt;br /&gt;
* Menüpunkt: &#039;&#039;Project → Configuration Options&#039;&#039;&lt;br /&gt;
* Im sich öffnenden Dialog wird in der linken Navigationsleiste der Eintrag &#039;&#039;Libraries&#039;&#039; ausgewählt.&lt;br /&gt;
* Unter &#039;&#039;Available Link Objects&#039;&#039; werden Bibliotheken angeboten. Für die Aktivierung der Floatingpoint-Unterstützung sind 2 interessant&amp;lt;ref&amp;gt;&amp;lt;tt&amp;gt;libc.a&amp;lt;/tt&amp;gt; sollte nicht zu den Bibliotheken hinzugefügt werden, da sie automatisch eingebunden wird. Etwas Hintergrundinformationen gibt es in [http://www.mikrocontroller.net/topic/173630 diesem Thread.]&lt;br /&gt;
&amp;lt;/ref&amp;gt;:&lt;br /&gt;
** &amp;lt;tt&amp;gt;libprintf_flt.a&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;libm.a&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Beide Bibliotheken werden durch Aktivieren und einen Druck auf &#039;&#039;Add Library → &#039;&#039; in die rechte Spalte übernommen.&lt;br /&gt;
* Danach wählt man in der Navigationsleiste den Eintrag &#039;&#039;Custom Options&#039;&#039;.&lt;br /&gt;
* Unter &#039;&#039;Custom Compilation Options&#039;&#039; wird &#039;&#039;Linker Options&#039;&#039; ausgewählt und in das Textfeld rechts/unten folgender Text eingetragen:&lt;br /&gt;
         -Wl,-u,vfprintf&lt;br /&gt;
* Ein Druck auf &#039;&#039;Add&#039;&#039; befördert die Zeile in das Listenfeld darüber, welches Optionen für den Linker enthält.&lt;br /&gt;
* Mit &#039;&#039;OK&#039;&#039; wird die Konfiguration abgeschlossen.&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;AVR Studio 5&#039;&#039;&#039; trägt man die Optionen an anderen Stellen ein ([http://www.mikrocontroller.net/topic/221583#2219612 Beitrag von Hal Smith]): &lt;br /&gt;
*&#039;&#039;Project Properties → Toolchain → AVR/GNU C-Linker → Libraries&#039;&#039;&amp;lt;br/&amp;gt;In &#039;&#039;Libraries&#039;&#039; &amp;lt;tt&amp;gt;(-WI, -I), libprintf_flt.a libm.a&amp;lt;/tt&amp;gt; eintragen.&lt;br /&gt;
* &#039;&#039;Project Properties → Toolchain → AVR/GNU C-Linker → Miscellaneous&#039;&#039;&amp;lt;br/&amp;gt;In &#039;&#039;Other Linker Flags&#039;&#039; &amp;lt;tt&amp;gt;-Wl,-u,vfprintf&amp;lt;/tt&amp;gt; eintragen.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
= Wie funktioniert String-Verarbeitung in C? =&lt;br /&gt;
: → Siehe: &#039;&#039;[[String-Verarbeitung in C]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= struct Strukturen =&lt;br /&gt;
&lt;br /&gt;
: → Siehe: &#039;&#039;[[Strukturen in C]]&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
= Funktionszeiger =&lt;br /&gt;
&lt;br /&gt;
: → Siehe: &#039;&#039;[[Funktionszeiger in C]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Header File - wie geht das =&lt;br /&gt;
&lt;br /&gt;
Ein Header File ist im Grunde nichts anderes als eine Sammlung aller Informationen, die ein &#039;Aussenstehender&#039; benötigt, um die in einem C-File gesammlten Funktionen benutzen zu können.&lt;br /&gt;
&lt;br /&gt;
Trotzdem gibt es immer wieder Schwierigkeiten, wie sich die Sache mit Header Files und/oder #include verhält und wie man eine derartige Lösung aufbauen kann.&lt;br /&gt;
&lt;br /&gt;
Gegeben sei ein System bestehend aus 3 Funktionen&lt;br /&gt;
* main()&lt;br /&gt;
* functionA()&lt;br /&gt;
* functionB()&lt;br /&gt;
und einigen globalen Variablen. Für dieses System soll eine Aufteilung erfolgen, so dass funtionA samt seinen zugehörigen globalen Variablen in einer eigenen C-Datei residiert (FileA.c), functionB in einem eigenen File residiert (FileB.c) und main() als Hautpfunktion seine eigens C-File (Main.c) darstellt und jeweils die entsprechenden Header Files existieren.&lt;br /&gt;
&lt;br /&gt;
Kochrezeptartig kann man in vielen Fällen einfach so vorgehen:&lt;br /&gt;
Man schreibt erst mal den C-Code der Funktion, die man implementieren möchte. Zb fängt man an mit FileA.c&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileA.c&lt;br /&gt;
&lt;br /&gt;
int VarExtA;&lt;br /&gt;
int VarIntA;&lt;br /&gt;
&lt;br /&gt;
#define PortpinX PortA.1&lt;br /&gt;
&lt;br /&gt;
int functionIntA( void )&lt;br /&gt;
{&lt;br /&gt;
  VarIntA = VarExtB;&lt;br /&gt;
  functionB();&lt;br /&gt;
  PortpinX = 1;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt geht man das File, so wie es auch der Compiler macht, von oben nach unten durch schaut den Code durch. Damit functionB aufgerufen werden kann, ist ein Prototyp dafür notwendig. Der kommt aus einem Header File, welches noch nicht existiert, aber im Laufe des Prozesses entstehen und FileB.h heissen wird. FileB.h deshalb, weil die Funktion in FileB.c enthalten ist und man zur Vermeidung von Konfusion die Header Files immer gleich benennt wie die C-Files, nur eben mit einer anderen Dateiendung. FileB.h wird noch geschrieben werden, das hindert uns jetzt aber nicht daran, so zu tun als ob es dieses schon geben würde und ein entsprechender #include ergänzt. (Solange nicht compiliert wird ist das ja auch kein Problem. Irgendwo muss man ja schliesslich mal anfangen die Ergänzungen zu machen.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileA.c&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FileB.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int VarExtA;&lt;br /&gt;
int VarIntA;&lt;br /&gt;
&lt;br /&gt;
#define PortpinX PortA.1&lt;br /&gt;
&lt;br /&gt;
int functionA( void )&lt;br /&gt;
{&lt;br /&gt;
  VarIntA = VarExtB;&lt;br /&gt;
  functionB();&lt;br /&gt;
  PortpinX = 1;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gut. Die Variable VarExtB wird ebenfalls über den include hereingezogen&lt;br /&gt;
werden. Damit ist FileA.c erst mal vollständig. Da fehlt jetzt erst mal nichts mehr. Alles was in FileA.c vorkommt sind entweder C-Schlüsselwörter, durch FileA.c selbst definiert oder kommt über den #include herein.&lt;br /&gt;
&lt;br /&gt;
Der nächste Schritt ist die Überlegung: Was von dem Zeugs in FileA.C soll von anderer Stelle (von anderen C-Files aus) benutzt und verwendet werden können.&lt;br /&gt;
Welche Dinge muss FileA von sich preis geben.&lt;br /&gt;
&lt;br /&gt;
Da sind zu erst mal die beiden Variablen. Was soll mit denen geschehen?&lt;br /&gt;
VarExtA soll von aussen zugreifbar sein, VarIntA nicht. Und dann&lt;br /&gt;
natürlich die Funktion, die aufrufbar sein soll.&lt;br /&gt;
&lt;br /&gt;
Also beginnt man ein Header File für FileA.c zu schreiben, in das all das&lt;br /&gt;
reinkommt, was FileA.c nach aussen sichtbar machen will.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileA.h&lt;br /&gt;
&lt;br /&gt;
extern int VarExtA;&lt;br /&gt;
&lt;br /&gt;
int functionA( void );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Variable kriegt ein extern davor (und wird damit zu einer Deklaration), bei der Funktion wird einfach die Implementierung weggenommen und die somit zu einer Deklaration veränderte Zeile mit einem ; abgeschlossen. Wenn man möchte kann man den so geschaffenen Prototypen auch mit einem extern einleiten. Notwendig ist es aber nicht.&lt;br /&gt;
&lt;br /&gt;
Erneuter Blick aufs Header File. Kommt da irgendwas vor, was nicht&lt;br /&gt;
Standard C Schlüsselwort ist? Nein. Nichts.&lt;br /&gt;
Also ist dieses Header File somit ebenfalls in sich vollständig.&lt;br /&gt;
&lt;br /&gt;
Zur Sicherheit wird in FileA.c noch einen Include auf das&lt;br /&gt;
eigene Header File hinzugefügt, denn dann kann der Compiler überprüfen ob die&lt;br /&gt;
Angaben im Header File mit der tatsächlichen Implementierung&lt;br /&gt;
übereinstimmen. Und da VarIntA von aussen nicht sichtbar sein soll (auch&lt;br /&gt;
nicht durch Tricks), wird sie static gemacht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileA.c&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FileA.h&amp;quot;&lt;br /&gt;
#include &amp;quot;FileB.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int VarExtA;&lt;br /&gt;
static int VarIntA;&lt;br /&gt;
&lt;br /&gt;
#define PortpinX PortA.1&lt;br /&gt;
&lt;br /&gt;
int functionA( void )&lt;br /&gt;
{&lt;br /&gt;
  VarIntA = VarExtB;&lt;br /&gt;
  functionB();&lt;br /&gt;
  PortpinX = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dasselbe für FileB.c. Erst mal einfach runterschreiben&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileB.c&lt;br /&gt;
&lt;br /&gt;
int VarExtB;&lt;br /&gt;
int VarIntB;&lt;br /&gt;
&lt;br /&gt;
#define SettingB 0x01&lt;br /&gt;
&lt;br /&gt;
int functionB( void )&lt;br /&gt;
{&lt;br /&gt;
  VarExtA = 1;&lt;br /&gt;
  functionA();&lt;br /&gt;
  VarIntB = SettingB;&lt;br /&gt;
&lt;br /&gt;
  MeinePrivateFunktion();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MeinePrivateFunktion()&lt;br /&gt;
{&lt;br /&gt;
  VarIntB = 8;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
damit functionA aufgerufen werden kann, braucht es wieder einen Prototypen. Den&lt;br /&gt;
kriegt man über von FileA.h, welches daher includiert wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileB.c&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FileA.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int VarExtB;&lt;br /&gt;
int VarIntB;&lt;br /&gt;
&lt;br /&gt;
#define SettingB 0x01&lt;br /&gt;
&lt;br /&gt;
int functionB( void )&lt;br /&gt;
{&lt;br /&gt;
  VarExtA = 1;&lt;br /&gt;
  functionA();&lt;br /&gt;
  VarIntB = SettingB;&lt;br /&gt;
  MeinePrivateFunktion();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MeinePrivateFunktion()&lt;br /&gt;
{&lt;br /&gt;
  VarIntB = 8;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was noch? VarExtA. Diese Variable wird aber ebenfalls durch den #include als extern Deklaration ins FileB.c hereingezogen und ist somit bei der Übersetzung von FileB.c bekannt. Kommt sonst noch etwas vor? MeinePrivateFunktion. Diese Funktion soll nur in FileB.c benutzt werden und ist für jemanden ausserhalb FileB.c völlig uninteressant. Nichts destotrotz gilt die Regel: compiliert wird von oben nach unten und verwendet werden kann nur etwas, was auch bekannt ist. D.h. bevor der Aufruf der Funktion in functionB gemacht werden kann, muss es einen Protoypen der Funktion geben. Da diese Funktion aber nicht nach &#039;aussen&#039; exportiert wird, macht man den Protoypen gleich in das C-File mit hinein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileB.c&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FileA.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int VarExtB;&lt;br /&gt;
int VarIntB;&lt;br /&gt;
&lt;br /&gt;
#define SettingB 0x01&lt;br /&gt;
&lt;br /&gt;
void MeinePrivateFunktion();&lt;br /&gt;
&lt;br /&gt;
int functionB( void )&lt;br /&gt;
{&lt;br /&gt;
  VarExtA = 1;&lt;br /&gt;
  functionA();&lt;br /&gt;
  VarIntB = SettingB;&lt;br /&gt;
  MeinePrivateFunktion();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MeinePrivateFunktion()&lt;br /&gt;
{&lt;br /&gt;
  VarIntB = 8;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Würde man die Funktion vorziehen, so dass der Funktionskörper vor der ersten Verwendung steht, dann würde man auch keinen Protoypen benötigen. Eine Funktionsdefinition fungiert als ihr eigener Protoyp.&lt;br /&gt;
&lt;br /&gt;
Kommt sonst noch etwas vor? Nix mehr. In FileB.c wird sonst nix mehr verwendet was nicht entweder C Schlüsselwort oder im File selber oder durch einen #include reinkommt.&lt;br /&gt;
&lt;br /&gt;
Dann wieder: das Header File für B schreiben. Dabei einfach nur überlegen: was soll von FileB.c nach aussen getragen werden?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileB.h&lt;br /&gt;
&lt;br /&gt;
extern int VarExtB;&lt;br /&gt;
&lt;br /&gt;
int functionB( void );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und zur Sicherheit wieder ins eigene C-File includen und alle Variablen&lt;br /&gt;
(oder auch Funktionen), die von aussen nicht sichtbar sein sollen, als&lt;br /&gt;
static markieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileB.c&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FileB.h&amp;quot;&lt;br /&gt;
#include &amp;quot;FileA.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int VarExtB;&lt;br /&gt;
static int VarIntB;&lt;br /&gt;
&lt;br /&gt;
#define SettingB 0x01&lt;br /&gt;
&lt;br /&gt;
static void MeinePrivateFunktion();&lt;br /&gt;
&lt;br /&gt;
int functionB( void )&lt;br /&gt;
{&lt;br /&gt;
  VarExtA = 1;&lt;br /&gt;
  functionA();&lt;br /&gt;
  VarIntB = SettingB;&lt;br /&gt;
  MeinePrivateFunktion();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MeinePrivateFunktion()&lt;br /&gt;
{&lt;br /&gt;
  VarIntB = 8;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
damit bleibt nur noch main.c. Auch dieses wird erst mal einfach runtergeschrieben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int c;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  functionA();&lt;br /&gt;
  functionB();&lt;br /&gt;
  VarExtA = 1;&lt;br /&gt;
  VarExtB = c;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit functionA aufgerufen werden kann, braucht es einen Prototypen. Woher kommt er? Aus FileA.h. Also gleich mal includen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;FileA.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int c;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  functionA();&lt;br /&gt;
  functionB();&lt;br /&gt;
  VarExtA = 1;&lt;br /&gt;
  VarExtB = c;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit functionB aufgerufen werden kann, braucht es einen Prototypen. Wo&lt;br /&gt;
kommt der her? Aus FileB.h. Also noch ein #include&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;FileA.h&amp;quot;&lt;br /&gt;
#include &amp;quot;FileB.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int c;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  functionA();&lt;br /&gt;
  functionB();&lt;br /&gt;
  VarExtA = 1;&lt;br /&gt;
  VarExtB = c;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fehlt noch was? VarExtA ist durch den #include von FileA.h bereits&lt;br /&gt;
abgedeckt und VarExtB ist durch den #include von FileB.h bereits&lt;br /&gt;
abgedeckt. Also fehlt nix mehr. Auch in main.c sind damit alle Sachen&lt;br /&gt;
abgedeckt und es ist in sich vollständig.&lt;br /&gt;
&lt;br /&gt;
Das ist der Standardmechanismus:&lt;br /&gt;
* Implementierung der Funktionen im C File schreiben&lt;br /&gt;
* Überlegen, was von dieser Implementierung von aussen sichtbar sein soll.&lt;br /&gt;
* Dasjenige kommt als Deklaration ins Header File, alles andere am besten static machen.&lt;br /&gt;
* Für alles im C-File, das seinerseits woanders herkommt, gibt es einen #include, der das jeweils notwendige Header File einbindet.&lt;br /&gt;
* Werden im Header File Dinge von woanders benutzt, dann enthält das Header File einen entsprechenden #include&lt;br /&gt;
* Jedes File, sowohl Header-File als auch C-File ist in sich vollständig. Werden dort Dinge benutzt, dann müssen diese vor der Verwendung deklariert worden sein. Wie und wo diese Deklaration herkommt, ist dabei zweitrangig. Es kann sein, dass die Deklaration vor der Verwendung steht, es kann aber auch sein, dass die Deklaration über einen weiteren Include mit aufgenommen wird.&lt;br /&gt;
&lt;br /&gt;
= Ich hab da mehrere *.c und *.h Dateien. Was mache ich damit? =&lt;br /&gt;
&lt;br /&gt;
[[Bild:c-flow.svg|right|thumb|260px|C-Programmierung: Workflow]]&lt;br /&gt;
Zunächst ist es wichtig, sich zu vergegenwärtigen, wie C-Compiler und Linker zusammenarbeiten. Ein komplettes Programmier-Projekt kann und wird im Normalfall aus mehreren Quelldateien bestehen, die alle zusammengenommen das komplette Programm bilden.&lt;br /&gt;
&lt;br /&gt;
Der Prozess des Erstellens des Programmes geschieht in mehrerern Schritten:&lt;br /&gt;
;Compilieren: zunächst werden alle Einzelteile (jede *.c Datei) für sich &#039;&#039;compiliert&#039;&#039;. Dabei ensteht aus jeder c-Datei eine sogenannte Object-Datei, in der bereits der Maschinencode für die im c-File programmierten Funktionen enthalten ist&lt;br /&gt;
;Linken: die einzelnen Object-Dateien werden mit zusätzlichen Bibliotheken und dem Startup-Code zum fertigen Programm &#039;&#039;gelinkt&#039;&#039;.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
Angenommen, das komplette Projekt besteht aus 2 Dateien:&lt;br /&gt;
&lt;br /&gt;
;main.c:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int twice (int);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  twice (5);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;func.c:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int twice (int number)&lt;br /&gt;
{&lt;br /&gt;
  return 2 * number;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann werden &amp;lt;tt&amp;gt;main.c&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;func.c&amp;lt;/tt&amp;gt; &#039;&#039;unabhängig&#039;&#039; voneinander compiliert. Als Ergebnis erhält man die Dateien &amp;lt;tt&amp;gt;main.o&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;func.o&amp;lt;/tt&amp;gt;, die den besagten Object-Code enthalten.&lt;br /&gt;
Diese beiden Zwischenergebnisse werden dann zusammen mit Bibliotheken zum fertigen Programm gebunden (gelinkt), das dann ausgeführt werden kann.&lt;br /&gt;
&lt;br /&gt;
Bekommt man also von irgendwo bereits fertige *.c (und zugehörige *.h) Dateien, so genügt es, die *.c Dateien in das Projekt mit aufzunehmen. Dadurch wird das entsprechende C-File compiliert und das Ergebnis davon, das Object-file, wird dann in das fertige Programm mit eingelinkt.&lt;br /&gt;
&lt;br /&gt;
;Achtung: Da jede der C-Dateien unabhängig von allen anderen compiliert wird, bedeutet das auch, dass jede der C-Dateien in sich vollständig sein muss!&lt;br /&gt;
&lt;br /&gt;
Wie eine C-Datei in das Projekt mit aufgenommen wird, hängt im wesentlichen von der benutzten Entwicklungsumgebung ab.&lt;br /&gt;
&lt;br /&gt;
== Makefile ==&lt;br /&gt;
&lt;br /&gt;
Die zusätzliche *.c Datei wird in die SRC Zeile im makefile eingetragen.&lt;br /&gt;
&lt;br /&gt;
== AVR-Studio ==&lt;br /&gt;
&lt;br /&gt;
Hier ist es besonders einfach, eine Datei in das Projekt mit aufzunehmen. Dazu wird im Projektbaum der Knoten &amp;quot;Source Files&amp;quot; aktiviert und mit der rechten Maustaste das Kontextmenü geöffnet. Im Menü wird der Punkt &amp;quot;Add existing Source File(s)&amp;quot; ausgewählt, und anschliessend zeigt man AVR-Studio das zusätzliche C-File. AVR-Studio berücksicht dann diese Datei bei der Projekterzeugung, compiliert es und sorgt dafür, dass es zum fertigen Programm dazugelinkt wird.&lt;br /&gt;
&lt;br /&gt;
=Globale Variablen über mehrere Dateien=&lt;br /&gt;
Ein häufiger Problemkreis in der C Programmierung sind auch globale Variablen, die von mehreren *.c Dateien aus benutzt werden sollen. Was hat es damit auf sich?&lt;br /&gt;
&lt;br /&gt;
Zunächst mal muß man bei der Vereinbarung von Variablen zwischen &#039;&#039;Definition&#039;&#039; und &#039;&#039;Deklaration&#039;&#039; unterscheiden:&lt;br /&gt;
;Definition: Mit einer Definition wird der Compiler angewiesen, eine Variable tatsächlich zu erzeugen. Damit er das kann, muß ihm selbstverständlich der exakte Datentyp und auch der Name der Variablen zur Verfügung stehen. Eine Definition sorgt also dafür, dass im späteren Programm Speicherplatz für diese Variable reserviert wird&lt;br /&gt;
;Deklaration: Mit einer Deklaration teilt man dem Compiler lediglich mit, dass eine Variable existiert. An dieser Stelle soll der Compiler also keinen Speicherplatz reservieren, sondern der Compiler soll einfach nur zur Kenntniss nehmen, daß es eine Variable mit einem bestimmten Namen gibt und von welchem Datentyp sie ist.&lt;br /&gt;
&lt;br /&gt;
Aus obigem folgt sofort, dass eine Definition auch immer eine Deklaration ist. Denn dadurch, daß der Compiler angewiesen wird eine Variable auch tatsächlich zu erzeugen, folgt, dass er dazu auch dieselben Informationen benötigt, die auch in einer Deklaration angegeben werden müssen. Der einzige Unterschied: Bei einer Deklaration trägt der Compiler nur in seinen internen Tabellen ein, dass es diese Variable tatsächlich gibt, während er bei einer Definition zusätzlich auch noch dafür sorgt, dass im fertigen Programm auch Speicher für diese Variable bereitgestellt wird.&lt;br /&gt;
&lt;br /&gt;
Warum ist diese Unterscheidung wichtig?&lt;br /&gt;
&lt;br /&gt;
Weil es in C die sog. &#039;&#039;One Definition Rule&#039;&#039; (ODR). Sie besagt, dass in einem vollständigen Programm, also über alle *.c Dateien gesehen, es für eine Variable nur &amp;lt;b&amp;gt;eine&amp;lt;/b&amp;gt; Definition geben darf. Es darf allerdings beliebig viele Deklarationen geben, solange diese Deklarationen alle im Datentyp übereinstimmen. Kurz gesagt: Man darf den Compiler nur einmal auffordern, eine Variable zu erzeugen (Definition), kann sich aber beliebig oft auf diese eine Variable beziehen (Deklarationen). Aber Vorsicht! Da der Compiler jede einzelne *.c Datei für sich alleine übersetzt und dabei kein Wissen von ausserhalb benutzt, obliegt es der Verantwortung des Programmierers dafür zu sorgen, dass alle Deklarationen im Datentyp übereinstimmen. Der Compiler kann diese Einhaltung prinzipbedingt nicht überwachen!&lt;br /&gt;
&lt;br /&gt;
Woran erkennt man eine Definition bzw. Deklaration?&lt;br /&gt;
&lt;br /&gt;
Eine Definition einer globalen Variable steht immer ausserhalb eines Funktionsblocks. Zb.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int  MyData;         // Globale Variable namens MyData. Sie ist vom Typ int&lt;br /&gt;
char Name[30];       // Globales Array&lt;br /&gt;
long NrElements = 5; // Globale Variable, die auch noch initialisiert wird&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Deklaration unterscheidet sich von einer Definition in 2 Punkten&lt;br /&gt;
* Es wird das Schlüsselwort &amp;lt;tt&amp;gt;extern&amp;lt;/tt&amp;gt; vorangestellt.&lt;br /&gt;
* Es kann keine Initialisierung geben. Sobald eine Initialisierung vorhanden ist, wird das Schlüsselwort &amp;lt;tt&amp;gt;extern&amp;lt;/tt&amp;gt; ignoriert und aus der Deklaration wird eine Definition.&lt;br /&gt;
&lt;br /&gt;
Beispiele für Deklarationen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
extern int  MyData;&lt;br /&gt;
extern char Name[30];&lt;br /&gt;
extern long NrElements;&lt;br /&gt;
extern long NrElements = 5;  // Achtung: Dies ist eine Definition!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Besitzt man also 2 *.c Dateien, main.c und helpers.c, und sollen sich diese beiden Dateien eine globale Variable teilen, so muss in eine Datei eine Definition hinein, während in die andere Datei eine Deklaration derselben Variablen erfolgen muß. Traditionell werden die Definitionen in der *.c-Datei gemacht, die als Hauptdatei des Moduls fungiert, zu der diese Variable konzeptionell gehört. Im Zweifel ist das die *.c Datei, in der main() enthalten ist. Das muss nicht so sein, ist aber eine Konvention, die oft Sinn macht. Alternativ wird auch gerne oft eine eigene *.c Datei (zb. globals.c) gemacht, die einzig und alleine die Defintionen der globalen Variablen enthält.&lt;br /&gt;
&lt;br /&gt;
main.c&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int  AnzahlElemente;        // Dies ist die Definition. Hier wird die globale&lt;br /&gt;
                            // Variable AnzahlElemente tatsächlich erzeugt.&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  AnzahlElemente = 8;&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
helpers.c&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
extern int AnzahlElemente;   // Dies ist die Deklaration die auf die globale&lt;br /&gt;
                             // Variable AnzahlElemente in main.c verweist.&lt;br /&gt;
                             // Wichtig: Der Datentyp muss mit dem in main.c&lt;br /&gt;
                             // angegebenen übereinstimmen&lt;br /&gt;
&lt;br /&gt;
void foo()&lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
  j = AnzahlElemente;&lt;br /&gt;
  AnzahlElemente = 9;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Praktische Durchführung==&lt;br /&gt;
Besteht ein vollständiges Programm aus mehreren *.c Dateien, dann kann man sich vorstellen, daß es mühsam ist, alle Deklarationen immer auf gleich zu halten. Hier bietet sich der Einsatz eines Header Files an, in der die Deklarationen stehen und welches in die jeweiligen *.c Dateien inkludiert wird&lt;br /&gt;
&lt;br /&gt;
Bsp:&lt;br /&gt;
&lt;br /&gt;
Global.h&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
extern int Anzahl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
main.c&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;Global.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int Anzahl;      // auch wenn Global.h inkludiert wurde, so muss es eine&lt;br /&gt;
                 // Definition der Variablen geben. In Global.h sind ja nur&lt;br /&gt;
                 // Deklarationen.&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  Anzahl = 5;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
foo.c&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;Global.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void foo()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  Anzahl = 8;&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bar.c&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;Global.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void bar()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  j = Anzahl;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf diese Art kann man erreichen, dass zumindest alle Deklarationen ein und derselben Variablen in einem Programm übereinstimmen. Die Datei Global.h wird auch in main.c inkludiert, obwohl man das eigentlich nicht müsste, denn dort wird die Variable ja definiert. Durch die Inclusion ermöglicht man aber dem Compiler die Überprüfung ob die Deklaration auch tatsächlich mit der Definition übereinstimmt.&lt;br /&gt;
&lt;br /&gt;
Solange kein Initialisierungen der globalen Variablen notwendig sind, gibt es noch einen weiteren Trick, um sich selbst das Leben und die Verwaltung der globalen Variablen zu erleichtern.&lt;br /&gt;
Worin besteht das Problem?&lt;br /&gt;
Das Problem besteht darin, dass man bei Einführung einer neuen globalen Variablen an 2 Stellen erweitern muss: Zum einen in der Header-Datei, die die &#039;extern&#039;-Deklaration der Variablen enthält, zum anderen muss in einer C-Datei die Definition der Variablen erfolgen. Das kann man sich mit etwas Präprozessorarbeit auch einfacher machen:&lt;br /&gt;
&lt;br /&gt;
Global.h&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef EXTERN&lt;br /&gt;
#define EXTERN extern&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
EXTERN int Anzahl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
main.c&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define EXTERN&lt;br /&gt;
#include &amp;quot;Global.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  Anzahl = 5;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
foo.c&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;Global.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void foo()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  Anzahl = 8;&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie funktioniert das Ganze? Im Grunde muss man nur dafür sorgen, dass der Compiler an &#039;&#039;einer&#039;&#039; Stelle das Schlüsselwort &#039;&#039;&#039;extern&#039;&#039;&#039; ignoriert (hier in main.c) und bei allen anderen Inclusionen beibehält. Dadurch das ein Präprozessor-ifndef benutzt wird, kann dieses erreicht werden. Wird das Header File includiert und ist zu diesem Zeitpunkt das Makro &#039;&#039;&#039;EXTERN&#039;&#039;&#039; noch nicht definiert, so wird innerhalb des Header Files &#039;&#039;&#039;EXTERN&#039;&#039;&#039; zu &#039;&#039;&#039;extern&#039;&#039;&#039; definiert und damit in weiterer Folge im Quelltext &#039;&#039;&#039;EXTERN&#039;&#039;&#039; durch &#039;&#039;&#039;extern&#039;&#039;&#039; ersetzt. Wenn daher foo.c das Header File inkludiert, wird die Zeile&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
EXTERN int Anzahl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
vom Präprozessor zu&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
extern int Anzahl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
umgewandelt.&lt;br /&gt;
&lt;br /&gt;
In main.c hingegen sieht die Include-Sequenz so aus&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define EXTERN&lt;br /&gt;
#include &amp;quot;Global.h&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wenn Global.h bearbeitet wird, existiert bereits ein Makro &#039;&#039;&#039;EXTERN&#039;&#039;&#039;, das auf einen leeren Text expandiert. Dadurch wird verhindert, dass innerhalb von Global.h das Makro &#039;&#039;&#039;EXTERN&#039;&#039;&#039; mit dem Text &#039;&#039;&#039;extern&#039;&#039;&#039; belegt wird und&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
EXTERN int Anzahl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
wird daher vom Präprozessor zu&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int Anzahl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
erweitert, genau wie es benötigt wird.&lt;br /&gt;
&lt;br /&gt;
= Was hat es mit volatile auf sich =&lt;br /&gt;
Immer wieder hört man im Forum die pauschale Aussage &amp;quot;Variablen die in einer ISR verwendet werden, müssen volatile sein&amp;quot;. Nun, das ist so nicht ganz richtig.&lt;br /&gt;
Welches Problem löst denn eigentlich volatile? Was ist denn das eigentliche Problem, das einer Lösung bedarf?&lt;br /&gt;
&lt;br /&gt;
Das Problem findet sich diesmal im Optimierer eines C Compilers. C Compiler übersetzen, wenn sie optimieren dürfen, den C Code nicht direkt so, wie ihn der Programmierer geschrieben hat, sondern sie versuchen Ressourcen einzusparen. Das kann sowohl Programmspeicher als auch Laufzeit, häufig auch beides gemeinsam sein. Zu diesem Zweck untersuchen sie das Programm und versuchen in der funktional gleichwertigen, in Maschinensprache übersetzen Version, Anweisungen einzusparen. Das dürfen sie auch. Der C-Standard erlaubt Optimierungen, solange die &#039;As-If&#039;-Regel eingehalten wird. Das bedeutet: Der Compiler darf das Programm umstellen und verändern, solange die Programmergebnisse dieselben bleiben. Eben &amp;quot;As-if&amp;quot; die Optimierung nie stattgefunden hätte.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir ein Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  i = 2;&lt;br /&gt;
&lt;br /&gt;
  if( i == 5 )&lt;br /&gt;
    j = 8;&lt;br /&gt;
  else&lt;br /&gt;
    j = 6;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In diesem Programmausschnitt darf der Compiler seine Kenntnisse ausnutzen. Er weiß an dieser Stelle, dass i den Wert 2 hat. Damit ist aber auch klar, dass die Bedingung niemals wahr sein kann, denn 2 kann niemals gleich 5 sein. Wenn die Bedingung aber niemals wahr sein kann, dann kann auch die Zuweisung von 8 an j niemals ausgeführt werden. Der Compiler kann also diesen Programmtext zu diesem hier kürzen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  i = 2;&lt;br /&gt;
  j = 6;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ohne das sich an den Programmergebnissen etwas ändert. Die zweite Version ist aber kürzer und wird, wegen des Wegfalles des Vergleiches, auch schneller ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Eine andere Form der Optimierung betrifft die Verwaltung von µC-Ressourcen und da wieder ganz speziell die Register. Variablen werden ja erst mal im SRAM-Speicher des µC angelegt. Um mit den Werten von Variablen arbeiten zu können, müssen diese Wert aber vom SRAM-Speicher in µC-Register überführt werden (Register kann man sich wie Speicherstellen in der eigentlichen CPU vorstellen). Nur dort können diese Werte mittels Maschinenbefehlen manipuliert werden.&lt;br /&gt;
Jetzt haben aber µC nicht beliebig viele Register. Das bedeutet aber auch, der Compiler muss darüber Buch führen, welche Werte (welche Variablen) gerade in welchen Registern liegen und wenn alle Register belegt sind, muss ein anderes Register freigeräumt werden, in dem der Wert aus dem Register wieder ins SRAM zurück übertragen wird.&lt;br /&gt;
Allerdings kostet das auch Zeit. Der Compiler wird daher versuchen, Variablen, die in einem Programmstück oft benötigt werden, für längere Zeit in den Registern zu halten, um das Registerladen bzw. -zurückschreiben einzusparen. Die Grundannahme lautet dabei immer: In Anweisungen, in denen eine Variable nicht vorkommt, kann diese Variable auch nicht verändert werden. Im Programmstück&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  while( 1 ) {&lt;br /&gt;
    if( i == 5 )&lt;br /&gt;
      j = 8;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
gibt es für i keine Möglichkeit, verändert zu werden. Der Compiler kann daher entscheiden, dass er diese Variable, *an dieser Stelle*, gar nicht aus dem SRAM laden muss, sondern sich den entsprechenden Wert in einem Register vorhält und dieses Register ausschließlich dafür reserviert. (Er könnte auch entscheiden, dass der Code nie ausgeführt werden kann, aber das ist eine andere Geschichte)&lt;br /&gt;
&lt;br /&gt;
Der springende Punkt ist nun, dass der Compiler hier eine zu kleine Sicht der Dinge hat. Betrachtet man nur dieses Code Stück, dann gibt es tatsächlich für i keine Möglichkeit, seinen Wert zu verändern. Aber die Dinge ändern sich, wenn Interrupts ins Spiel kommen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uint8_t i;&lt;br /&gt;
&lt;br /&gt;
ISR( irgendein_Interrupt )&lt;br /&gt;
{&lt;br /&gt;
  i = 5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
  while( 1 ) {&lt;br /&gt;
    if( i == 5 )&lt;br /&gt;
      j = 8;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Jetzt gibt es plötzlich eine Möglichkeit, wie i seinen Wert ändern kann: Wenn der entsprechende Interrupt ausgelöst wird, dann wird i auf den Wert 5 gesetzt. i, das ist aber nichts anderes als ein bestimmter Speicherbereich im SRAM. D.h. im SRAM wird die Variable tatsächlich korrekt auf den Wert 5 gesetzt. Nur: Als der Compiler die while-Schleife übersetzt hat, wusste er nichts davon, dass diese Möglichkeit existiert. Er hat entschieden, dass er an dieser Stelle den Wert der Variablen in einem CPU-Register halten wird, um Zugriffe einzusparen. Nur wird diese Kopie des Wertes im Register natürlich nicht verändert, wenn in der ISR das Original von i im SRAM verändert wird.&lt;br /&gt;
Fazit: Obwohl die ISR die Variable tatsächlich verändert, kriegt das der Code im while nicht mit, weil der Compiler es mit der Optimierung an dieser Stelle übertrieben hat. In der while-Schleife wird mit einer Kopie des Wertes von i in einem Register gearbeitet und nicht mit dem originalen Wert von i im SRAM.&lt;br /&gt;
&lt;br /&gt;
Und an dieser Stelle kommt jetzt volatile ins Spiel.&lt;br /&gt;
&lt;br /&gt;
volatile teilt dem Compiler mit, dass ausnahmslos alle Zugriffe auf eine Variable auch tatsächlich auszuführen sind und keine Optimierungen gemacht werden dürfen, weil eine Variable auf Wegen benutzt werden kann, die für den Compiler prinzipiell nicht einsichtig sind. Im obigen Beispiel könnte man argumentieren, dass der Compiler ja wohl die ISR bemerken könne und daher feststellen könnte, dass i tatsächlich verändert wird. Aber das stimmt so in der allgemeinen Form nicht. Niemand sagt, dass der Compiler die ISR überhaupt zu Gesicht bekommen muss, die könnte ja auch in einem ganz anderen C File stecken.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
volatile uint8_t i;&lt;br /&gt;
&lt;br /&gt;
ISR( irgendein_Interrupt )&lt;br /&gt;
{&lt;br /&gt;
  i = 5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
  while( 1 ) {&lt;br /&gt;
    if( i == 5 )&lt;br /&gt;
      j = 8;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
wird i volatile gemacht, so verbietet man damit dem Compiler explizit, Annahmen über den Datenfluss von i zu treffen. Innerhalb der Schleife muss also tatsächlich jedes Mal wieder erneut i aus dem SRAM geholt werden und mit 5 verglichen werden. Abkürzungen durch Mehrfachverwendung von Registern oder sonstigen Optimierungstricks sind nicht erlaubt. Und damit ist das Problem gelöst. Wird i in der ISR verändert, so bekommt das auch die Abfrage mit, weil ja jetzt auf jeden Fall auf das Original im SRAM zurückgegriffen wird.&lt;br /&gt;
&lt;br /&gt;
Das Gleiche gilt auch ebenso &amp;quot;in die andere Richtung&amp;quot;, wenn also i in der Schleife geändert und in der ISR nur gelesen wird. Auch hier könnte die Optimierung negativ zuschlagen und den Schreibzugriff nur auf eine lokale Kopie der Variable in einem Register durchführen (oder gar ganz wegfallen) lassen, weil der Lesezugriff außerhalb des direkten Programmflusses (in der ISR) für den Compiler nicht ersichtlich ist.&lt;br /&gt;
&lt;br /&gt;
Ein anderes Problem (das ebenfalls mittels volatile gelöst wird) sind Variablen, die tatsächlich im Code überhaupt nie aktiv verändert werden, sondern es sich um Zusatzhardware handelt, die so verschaltet ist, dass sie im Programm in Form einer Variablen auftaucht, z.B. ein Uhren-IC (oder auch ganz banal: Portpins). In diesem Fall wird z.B. die Variable für Sekunden vom Programm gar nicht vom Programm selber verändert, ändert aber trotzdem ihren Inhalt. Die Zusatzhardware selbst macht das. Aus Programmsicht handelt es sich um Speicherzellen, die magisch selbsttätig ihren Wert ändern. Und damit dürfen selbstverständlich auch hier keinerlei Annahmen über den Inhalt der Variablen getroffen werden. Eine derart angebundene externe Hardware nennt man übrigens &amp;quot;memory-mapped&amp;quot;, weil sie ihre Werte ins Memory (=Hauptspeicher) mapped (=einblendet).&lt;br /&gt;
&lt;br /&gt;
Allerdings kann volatile nur bei den Variablen sinnvoll genutzt werden, die &amp;quot;von außen&amp;quot; auch änderbar sind. Bei lokalen Variablen, auch statischen, einer Funktion kann das nur passieren, wenn ihre Adresse einer ISR z.B. durch einen globalen Pointer bekannt gemacht wird.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uint8_t *v;&lt;br /&gt;
ISR( irgendein_Interrupt )&lt;br /&gt;
{&lt;br /&gt;
  i = 5;&lt;br /&gt;
  *v = 42;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  uint8_t i; // kann sich nie unerwartet ändern -&amp;gt; volatile nutzlos, behindert nur Optimizer&lt;br /&gt;
&lt;br /&gt;
  volatile uint8_t j; // kann sich unerwartet ändern (über globalen *v)&lt;br /&gt;
  v = &amp;amp;j;&lt;br /&gt;
  ...&lt;br /&gt;
  while( 1 ) {&lt;br /&gt;
    if( i == 5 )&lt;br /&gt;
      j = 8;&lt;br /&gt;
    if( j == 5 )&lt;br /&gt;
      i = 3;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Konstanten an fester Flash-Adresse =&lt;br /&gt;
&lt;br /&gt;
Wie kann man eine Konstante an entsprechender Adresse im Flash ablegen?&lt;br /&gt;
&lt;br /&gt;
Mehmet Kendi hat eine Lösung für [[AVR Studio]] &amp;amp; [[WinAVR]] in &lt;br /&gt;
[http://www.mikrocontroller.net/topic/142704#1453079] angegeben.&lt;br /&gt;
&lt;br /&gt;
= Timer =&lt;br /&gt;
== Was macht ein Timer? ==&lt;br /&gt;
Oft hört man im Forum die Aussage: Timer sind so kompliziert!&lt;br /&gt;
&lt;br /&gt;
Aber eigentlich stimmt das nicht. Ganz im Gegenteil, Timer sind eigentlich eine sehr einfache Sache. Was genau macht eigentlich ein Timer? Die Antwort lautet: er zählt unabhängig vom restlichen Programmfluss vor sich hin. Und? Was macht er noch? Nichts. Das wars schon. Im Kern ist genau das auch schon alles was ein Timer macht.&lt;br /&gt;
[[Bild:Timer_Basis.gif|framed|center|ein 8-Bit Timer bei der Arbeit]]&lt;br /&gt;
&lt;br /&gt;
== Wie schnell macht er es? ==&lt;br /&gt;
Aber so einfach ist die Sache dann doch wieder nicht. Da erhebt sich zunächst mal die Frage: wie schnell zählt denn eigentlich so ein Timer? Normalerweise ist der Timer mit der Taktfrequenz des Prozessors gekoppelt, so dass zb bei einer Taktfrequnz von 1Mhz der Timer auch genau so schnell zählt. In 1 Sekunde zählt ein Timer also von 0 bis 1000000, also 1 Mio Zählschritte. Nun kann aber ein beispielsweise 8-Bit Timer nicht bis 1000000 zählen, dazu ist er nicht groß genug. Mit 8 Bit kann man bis 255 zählen. Zählt man da dann noch 1 dazu, dann läuft der Timer über und beginnt wieder bei 0. Man kann daher ruhigen Gewissens sagen: In 1 Sekunde zählt dieser Timer 3906 mal den Bereich von 0 bis 255 (und weiter auf 0) durch (das sind 256 Zählschritte) und zuätzlich schafft er es danach noch bis 64 zu zählen. Denn 3906 * 256 + 64 = 1000000 und wir haben wieder die 1 Mio Zählschritte, die der Timer in 1 Sekunde erledigt.&lt;br /&gt;
&lt;br /&gt;
Das ist ganz schön schnell. Und weil das oft zu schnell ist, hat jeder Timer noch die Möglichkeit sogenannte Vorteiler (Prescaler) vor den Zähltakt zu schalten. Zb einen Vorteiler von 8. Anstelle von 1Mhz bekommt der Timer dann eine Frequenz von 1Mhz / 8 (= 125kHz) präsentiert. Und dementsprechend würde er in 1 Sekunde dann nur noch von 0 bis 125000 (= 1.000.000 / 8) zählen. Als 8 Bit Timer bedeutet das, dass er in 1 Sekunde jetzt nur noch 488 komplette Zyklen 0 bis 255 schafft und dann noch bis 72 zählen kann. Denn 488 * 256 + 72 = 125000&lt;br /&gt;
&lt;br /&gt;
== Das kann aber nicht alles gewesen sein? ==&lt;br /&gt;
Bis jetzt ist das alles noch unspektakulär und man fragt sich: Was hab ich jetzt davon, wenn der Timer vor sich hinzählt? Nun, die Situation ändert sich, wenn man weiß, dass man bei bestimmten Ereignissen und/oder Zählerständen etwas auslösen lassen kann. So ist zb. dieser Überlauf von 255 auf 0 so ein Ereignis. Mittels eines Interrupts kann man auf dieses Ereignis reagieren lassen und als Folge davon wird eine Funktion vollautomatisch aufgerufen. Und zwar unabhängig davon, was der µC gerade sonst so tut. Und das ist schon recht cool, denn es bedeutet, dass man regelmäßig zu erfolgende Dinge in so eine ISR (Interrupt Service Routine, die Funktion die aufgerufen wird) stecken kann und der Timer sorgt ganz von alleine dafür, dass diese Funktionalität auch tatsächlich regelmäßig ausgeführt wird. Regelmäßig bedeutet in diesem Fall dann auch wirklich regelmäßig. Denn der Timer zählt ja losgelöst von den restlichen Arbeiten, die der µC sonst so erledigt, vor sich hin. Es spielt keine Rolle, ob der µC gerade mitten in einer komplizierten Berechnung steckt oder nicht. Der Timer zählt vor sich hin, und wenn das entsprechende Ereignis eintritt, wird der Interrupt ausgelöst. Und wenn der entsprechende Interrupt mit einer ISR-Funktion gekoppelt ist, dann wird der normale Programmfluss unterbrochen und der µC arbeitet genau diese eine Funktion ab. Und zwar in regelmässigen Zeitabständen, weil ja auch der Interrupt regelmässig auftritt.&lt;br /&gt;
[[Bild:Timer_ISR.gif|framed|center|ein 8-Bit Timer löst durch seinen Overflow regelmäßige ISR Aufrufe aus]]&lt;br /&gt;
Gut, beispielsweise 488 mal in der Sekunde mag für so manchen Zweck zu oft sein, aber es gibt ja auch noch andere Vorteiler (welche steht im Datenblatt) und dann kann man ja auch innerhalb der ISR in einer lokalen Variablen mitzählen und zb nur bei jedem 2.ten Aufruf eine Aktion machen, die dann nur noch 244 mal in der Sekunde ausgeführt wird. Hier gibt es also mehrere Möglichkeiten, wie man die Aufrufhäufigkeit weiter herunterteilen kann, so dass man sich der Zahl annähert, die man benötigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Für einen Mega16.&lt;br /&gt;
// Andere Prozessoren: siehe Datenblatt wie die Timerkonfiguration einzustellen ist&lt;br /&gt;
&lt;br /&gt;
#define F_CPU 1000000UL&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
// der Timer wird mit 1Mhz getaktet. Vorteiler ist 8&lt;br /&gt;
// d.h. der Timer läuft mit 125kHz und würde daher in 1 Sekunde&lt;br /&gt;
// von 0 bis 124999 zaehlen.&lt;br /&gt;
// Aber nach jeweils 256 Zaehlungen erfolgt ein Overflow.&lt;br /&gt;
// Daher werden in 1 Sekunde 125000 / 256 = 488.28125 Overflows erzeugt&lt;br /&gt;
// Oder anders ausgedrückt:  1 / 488.2815 = 0.002048&lt;br /&gt;
// alle 0.002048 Sekunden erfolgt ein Overflow&lt;br /&gt;
//&lt;br /&gt;
ISR( TIMER0_OVF_vect )       // Overflow Interrupt Vector&lt;br /&gt;
{&lt;br /&gt;
  static uint8_t swTeiler = 0;&lt;br /&gt;
&lt;br /&gt;
  swTeiler++;&lt;br /&gt;
  if( swTeiler == 200 ) {    // nur bei jedem 200.ten Aufruf. Effektiv teilt dieses die&lt;br /&gt;
                             // die Aufruffrequenz des nachfolgenden Codes nochmal um&lt;br /&gt;
    swTeiler = 0;            // einen Faktor 200. Der nachfolgende Code wird daher nicht&lt;br /&gt;
                             // alle 0.002 Sekunden sondern alle 0.4096 Sekunden ausgeführt.&lt;br /&gt;
                             // Das reicht, dass man eine LED am Port schon blinken sieht.&lt;br /&gt;
    PORTD = PORTD ^ 0xFF;    // alle Bits am Port umdrehen, einfach damit sich was tut&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  DDRD = 0xFF;          // irgendein Port, damit wir auch was sehen&lt;br /&gt;
&lt;br /&gt;
  TIMSK |= (1&amp;lt;&amp;lt;TOIE0);  // den Overflow Interrupt des Timers freigeben&lt;br /&gt;
  TCCR0 = (1&amp;lt;&amp;lt;CS01);    // Vorteiler 8, jetzt zählt der Timer bereits&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  sei();                // und Interrupts generell freigeben&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  while( 1 )&lt;br /&gt;
  {                     // hier braucht nichts mehr gemacht werden.&lt;br /&gt;
  }                     // der Timer selbst sorgt dafür, dass die ISR Funktion&lt;br /&gt;
}                       // regelmäßig aufgerufen wird&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CTC Modus ==&lt;br /&gt;
Manchmal reicht das aber nicht. Benötigt man zb nicht 488 sondern möglichst genau 500 ISR Aufrufe in der Sekunde, so wird man weder mit Vorteiler noch durch Softwaremässiges Weiterteilen in der ISR zum Ziel kommen. Man kann natürlich die Taktfrequenz des kompletten Systems soweit umstellen, dass sich das alles ausgeht, aber oft ist das einfach nicht möglich. Was tun?&lt;br /&gt;
&lt;br /&gt;
Die Sache wäre einfacher, wenn man dem Timer vorschreiben könnte, nicht einfach nur von 0 bis 255 zu zählen, sondern wenn man ihm eine Obergrenze vorgeben könnte. Denn dann könnte man sich eine Obergrenze so bestimmen, dass dieser neue Zählbereich in 1 Sekunde ganz genau so oft durchlaufen werden kann, wie man es benötigt. Und hier kommt der sog. &amp;lt;b&amp;gt;CTC&amp;lt;/b&amp;gt; Modus ins Spiel. Denn genau darin besteht sein Wesen: Man gibt dem Timer eine Obergrenze vor. Erreicht seine Zählung diesen Wert, so wird der Timer auf 0 zurückgesetzt und beginnt wieder von vorne. Genau das was wir benötigen. Wollen wir exakt 500 ISR Ausfrufe in der Sekunde haben (bei 1 Mhz Systemtakt), dann wählen wir einen Vorteiler von 8 und setzen die Obergrenze auf 250-1 (nicht vergessen: wir brauchen 250 Zählschritte, das bedeutet der Timer muss von 0 bis 249 zählen, denn auch der Überlauf von 249 zurück auf 0 ist ein Zählschritt). Der Timer taktet dann mit 1Mhz / 8 = 125kHz und da nach jeweils 250 Zählschritten die Obergrenze erreicht ist, wird diese Obergrenze in 1 Sekunde 125000 / 250 = 500 mal erreicht. Genau so wie wir das wollten.&lt;br /&gt;
Wie wird dem Timer nun mitgeteilt, dass er eine spezielle Obergrenze benutzen soll? Nun, jeder Timer hat verschiedene Modi. Welche das bei einem konkreten µC und bei einem konkreten Timer genau sind, findet sich im Datenblatt im Abschnitt über die Timer. Normalerweise ist immer eines der letzteren Abschnitte eines jeden Kapitels im Datenblatt das interessantere: &amp;quot;Register Summary&amp;quot; oder &amp;quot;Register Description&amp;quot; genannt (die Datenblätter sind da nicht ganz einheitlich). So auch hier.&lt;br /&gt;
[[Bild:FAQ_Datenblatt_Timer_Mega16.png|framed|center|Auszug aus dem Atmel Datenblatt für den Mega16 - Suche im Datenblatt]]&lt;br /&gt;
In jedem Atmel Datenblatt findet sich bei jedem Timer immer auch besagter Abschnitt (im Inhaltsverzeichnis beim Kapitel über den jeweiligen Timer suchen. Im Datenblatt-PDF daher immer das Inhaltsverzeichnis anzeigen lassen!), und in diesem Abschnitt gibt es eine Tabelle, aus der hervorgeht, welche Modi es gibt, welche Bits dazu in den Konfigurationsregistern gesetzt werden müssen, wie sich dann die Obergrenze des Timer-Zählbereichs zusammensetzt und noch ein paar Angaben mehr. Beim Mega16 findet sich diese Tabelle für den Timer 0 zb auf Seite 83 und dort ist es die Tabelle 14.2. Diese Tabelle sieht im Datenblatt so aus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle}} &lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
! Mode || WGM01 || WGM00 || Timer/Counter || TOP || Update of || TOV0 Flag&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!      || (CTC0) || (PWM0) || Mode of Operation || || OCR0 || Set-on&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || Normal || 0xFF || Immediate || MAX&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || 1 || PWM, Phase Correct || 0xFF || TOP|| BOTTOM&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 1 || 0 || CTC || OCR0 || Immediate || MAX&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 1 || 1 || Fast PWM || 0xFF || BOTTOM || MAX&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dort beginnt man mit der Recherche und sucht sich die Bits für den gewünschten Modus raus. Mit diesen Bits sieht man dann in den Konfigurationsregistern nach, welches Bit zu welchem Register gehört und setzt es ganz einfach. In unserem Fall möchten wir den CTC Modus, also den Modus 2. Dazu muss das Bit WGM01 gesetzt werden und WGM00 muss auf 0 bleiben. Im Datenblatt ein wenig zurückscrollen bringt ans Licht, dass das Bit WGM01 im Konfigurationsregister TCCR0 angesiedelt ist. Weiters entnehmen wir der Tabelle, dass der Timer bis zum Wert in OCR0 zählen wird (die Spalte &amp;lt;b&amp;gt;TOP&amp;lt;/b&amp;gt;). Dort hinein müssen also die 250-1 als Obergrenze geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist auch noch: Dieser Spezialmodus CTC löst keinen Overflow Interrupt aus, sondern einen sog. Compare Match Interrupt. Dies deshalb, weil die gewünschte Obergrenze ja laut Datenblatt in eines der sog. Compare Match Register geschrieben werden muss (OCR0). Das sind Spezialregister, die nach jedem Zählvorgang mit dem Zählregister verglichen werden. Stimmt ihr Inhalt mit dem des Zählregisters überein, so hat man einen Compare-Match und kann daran wieder eine Aktion (ISR) knüpfen. In diesem speziellen Fall des CTC Modus beinhaltet dieser Compare Match dann auch noch das automatische Rücksetzen des Timers auf 0.&lt;br /&gt;
&lt;br /&gt;
Und natürlich können auch mehrere Techniken kombiniert werden. Z. B. CTC Modus und zusätzliches weiteres softwaremässiges Herunterteilen in der ISR sieht dann so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Für einen Mega16.&lt;br /&gt;
// Andere Prozessoren: siehe Datenblatt wie die Timerkonfiguration einzustellen ist&lt;br /&gt;
 &lt;br /&gt;
#define F_CPU 1000000UL&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
ISR( TIMER0_COMP_vect )    // Compare Match Interrupt Vector&lt;br /&gt;
{&lt;br /&gt;
  static uint8_t swTeiler = 0;&lt;br /&gt;
 &lt;br /&gt;
  swTeiler++;&lt;br /&gt;
  if( swTeiler == 200 ) {&lt;br /&gt;
    swTeiler = 0;&lt;br /&gt;
    PORTD = PORTD ^ 0xFF;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  DDRD = 0xFF;          // irgendein Port, damit wir auch was sehen&lt;br /&gt;
 &lt;br /&gt;
  TIMSK = (1&amp;lt;&amp;lt;OCIE0);               // den Output Compare Interrupt des Timers freigeben&lt;br /&gt;
  OCR0  = 250 - 1;                    // nach 250 Zaehlschritten -&amp;gt; Interrupt und Timer auf 0&lt;br /&gt;
  TCCR0 = (1&amp;lt;&amp;lt;WGM01) | (1&amp;lt;&amp;lt;CS01);    // Vorteiler 8, CTC Modus&lt;br /&gt;
 &lt;br /&gt;
  &lt;br /&gt;
  sei();                // und Interrupts generell freigeben&lt;br /&gt;
 &lt;br /&gt;
  &lt;br /&gt;
  while( 1 )&lt;br /&gt;
  {                     // hier braucht nichts mehr gemacht werden.&lt;br /&gt;
  }                     // der Timer selbst sorgt dafür, dass die ISR Funktion&lt;br /&gt;
}                       // regelmässig aufgerufen wird &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fast PWM ==&lt;br /&gt;
&lt;br /&gt;
Aber der Timer kann noch mehr. Wenn der Timer so vor sich hinzählt, dann kann man bestimmte Output-Pins des µC an diesen Timer koppeln. Der Timer kann dann diesen Pin bei erreichen von bestimmten Zählerständen ganz von alleine wahlweise auf 0 schalten, auf 1 schalten oder umdrehen.&lt;br /&gt;
&lt;br /&gt;
Was passiert da genau? Im folgenden sei von der einfachsten Form der PWM auf einem Mega16 ausgegangen: Wenn der Timer in seiner Zählerei bei 0 ist, dann schaltet er den Pin auf 1, bei einem bestimmten Zählerstand soll er den Pin wieder auf 0 zurücksetzen und ansonsten soll der Timer wie gewohnt laufend von 0 bis 255 durchzählen.&lt;br /&gt;
Es ist die Rede vom Timer-Modus 3, siehe die vorhergehende Tabelle aus dem Datenblatt.&lt;br /&gt;
&lt;br /&gt;
Der Tabelle entnehmen wir wieder: Die Bits WGM01 und WGM00 müssen auf 1 gestellt werden. Der TOP Wert (also der Wert, bis zu dem der Timer zählt) ist 0xFF (also 255) und das OCR0 Register steuert, bei welchem Zählerstand die Timerhardware den Pin wieder auf 0 zurück schaltet. Das Einschalten auf 1 ist vorgegeben (auch das kann man ändern, dazu später mehr).&lt;br /&gt;
&lt;br /&gt;
Stellt man also genau diese Konfiguration her und schreibt in das Register OCR0 beispielsweise den Wert 253, dann beginnt der Timer bei 0 zu zählen, wobei der den Ausgangspin auf 1 schaltet. Wird der Zählerstand 253 erreicht, dann schaltet der Timer den Pin wieder auf 0 zurück und zählt weiter bis 255 um dann wieder erneut bei 0 zu beginnen (und den Ausgansg-Pin wieder auf 1 zu schalten). Der Ausgangspin ist in diesem Fall also die meiste Zeit auf 1 und nur ganz kurz (während der Timer von 253 bis 255 zählt) auf 0.&lt;br /&gt;
&lt;br /&gt;
Schreibt am auf der anderen Seite in das Register OCR0 den Wert 3, dann passiert konzeptionell genau dasselbe nur mit anderen Zahlenwerten. Der Timer beginnt bei 0 zu zählen und schaltet den Ausgansgpin auf 1. Aber diesmal ist es bereits beim Zählerstand 3 so weit: Der Zählerstand stimmt mit dem Wert in OCR0 überein und als Folge davon wird der Ausgangspin wieder auf 0 gestellt. Der Timer zählt natürlich wie immer weiter bis 255 ehe dann das ganze Spiel wieder von vorne beginnt. In diesem Fall war also der Ausgangspin nur ganz kurze Zeit auf 1 (nämich in der Zeit, die der Timer benötigt um von 0 bis 3 zu zählen) und dann die meiste Zeit auf 0. Und genau darum geht es bei PWM: Mit dem Register OCR0 lässt sich daher der zeitliche Anteil steuern, in dem der Pin auf 1 liegt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Für einen Mega16.&lt;br /&gt;
// Andere Prozessoren: siehe Datenblatt wie die Timerkonfiguration einzustellen ist&lt;br /&gt;
 &lt;br /&gt;
#define F_CPU 1000000UL&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  uint8_t i;&lt;br /&gt;
&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB3);       // PB3 auf Ausgang stellen. Dieser Pin&lt;br /&gt;
                          // trägt auch die Bezeichnung OC0 und ist der Pin&lt;br /&gt;
                          // an dem der Timer 0 seine PWM ausgibt&lt;br /&gt;
&lt;br /&gt;
  OCR0  = 250;&lt;br /&gt;
  TCCR0 = (1&amp;lt;&amp;lt;WGM01) | (1&amp;lt;&amp;lt;WGM00) | (1&amp;lt;&amp;lt;CS01);    // Vorteiler 8, Fast PWM 8 Bit&lt;br /&gt;
  TCCR0 = (1&amp;lt;&amp;lt;COM01); &lt;br /&gt;
  &lt;br /&gt;
  while( 1 )&lt;br /&gt;
  {                     // hier braucht nichts mehr gemacht werden.&lt;br /&gt;
                        // der Timer selbst sorgt dafür, dass die PWM läuft&lt;br /&gt;
                        // wir wollen aber ein wenig Action haben.&lt;br /&gt;
                        // Also setzen wir das OCR0 Register auf verschiedene&lt;br /&gt;
                        // Werte, damit eine angeschlossene LED unterschiedliche&lt;br /&gt;
                        // Helligkeiten zeigt&lt;br /&gt;
    OCR0 = 30;&lt;br /&gt;
    _delay_ms( 1000 );&lt;br /&gt;
    OCR0 = 200;&lt;br /&gt;
    _delay_ms( 1000 );&lt;br /&gt;
&lt;br /&gt;
    for( i = 0; i &amp;lt; 255; ++i ) {&lt;br /&gt;
      OCR0 = i;&lt;br /&gt;
      _delay_ms( 10 );&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bleibt noch das gesetzte Bit COM01. Was hat es damit auf sich? Bisher war immer die Rede davon, das der Ausganspin bei einem Zählerstand von 0 auf 1 geschaltet wird usw. Das regelt genau dieses Bit. Im Datenblatt findet sich die Tabelle 14.4 auf der Seite 83, die genau regelt welche Bedeutung die Bits COM01 bzw COM00 haben, wenn der Timer Modus auf Fast-PWM eingestellt ist. Achtung: Je nach Timer-Modus haben diese Bits andere Bedeutungen! Man muss sich also immer die zum jeweiligen Timer-Modus gehörende Tabelle im Datenblatt suchen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:C]]&lt;br /&gt;
[[Kategorie:avr-gcc]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=FAQ&amp;diff=82861</id>
		<title>FAQ</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=FAQ&amp;diff=82861"/>
		<updated>2014-05-01T12:45:57Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Vandalismus&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein Verzeichnis von im Forum oft gestellten und immer wieder beantworteten Fragen und den zugehörigen Antworten:&lt;br /&gt;
&lt;br /&gt;
=Wie kann ich Zahlen auf [[LCD]]/[[UART]] ausgeben?=&lt;br /&gt;
&lt;br /&gt;
Aber die Bibliothek, die du benutzt, stellt nur eine Funktion zur Verfügung, mit der man einen String ausgeben kann... Was tun? &lt;br /&gt;
&lt;br /&gt;
In den folgenden Beispielen wird eine selbstgeschriebene Funktion zur Stringausgabe auf LCD - die Funktion lcd_string() - aus dem [[AVR-GCC-Tutorial/LCD-Ansteuerung|LCD-Teil des AVR-GCC-Tutorials]] verwendet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
lcd_string( &amp;quot;Hallo Welt&amp;quot; );  // ggf. auch lcd_out() o.ä. in anderen Libraries&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um also eine Zahl (numerische Konstante oder Variableninhalt) auszugeben, muss von dieser Zahl zunächst ihre String-Repräsentation ermittelt werden. Hier geht es aber nur darum, zu zeigen wie man diese String Repräsenation erzeugen kann. Was man dann mit diesem String weiter macht, ob das dann eine LCD-Ausgabe oder eine UART-Übertragung oder das Abspeichern auf SD-Karte oder ... ist, spielt eine untergeordnete Rolle.&lt;br /&gt;
&lt;br /&gt;
Es gibt mehrere Möglichkeiten, sich die Stringrepräsentation zu erzeugen:&lt;br /&gt;
&lt;br /&gt;
===itoa() (utoa(), ltoa(), ultoa(), ftoa() )===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;itoa()&amp;lt;/b&amp;gt; ist keine C-Standardfunktion (wohl aber ihre Umkehrung &amp;lt;b&amp;gt;atoi()&amp;lt;/b&amp;gt; ). Auf manchen Compilern heisst diese Funktion dann folgerichtig &amp;lt;b&amp;gt;_itoa()&amp;lt;/b&amp;gt;, wobei der führende _ eben anzeigt, dass es sich um eine Erweiterung des C-Standards handelt. Bei [[WinAVR]] ist itoa() Bestandteil der mitgelieferten Library avr-libc, in der Library [http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html&#039;&#039;stdlib.h&#039;&#039;].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
  char Buffer[20];&lt;br /&gt;
  int i = 25;&lt;br /&gt;
&lt;br /&gt;
  itoa( i, Buffer, 10 );&lt;br /&gt;
  lcd_string( Buffer ); // ggf. auch lcd_out() o.ä. in anderen Libraries&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;itoa( i, Buffer, 10 );&amp;lt;/b&amp;gt; - Die Zahl i wird nach ASCII gewandelt und die String Repräsentierung davon wird in Buffer abgelegt. Die Basis, in der diese Wandlung erfolgt, ist das 10-er System. Wird das dritte Argument von 10 in zb. 2 oder auch 16 abgewandelt, erhält man die binäre oder eben eine hexadezimale Repräsentierung des Wertes. Auch wenn 10, 2 und 16 die häufigsten Angaben an dieser Stelle sind, kann itoa aber grundsätzlich in jedes beliebige Zahlensystem wandlen.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist, darauf zu achten, dass das Array &amp;lt;i&amp;gt;Buffer&amp;lt;/i&amp;gt; groß genug dimensioniert wird, um alle Zeichen der Textrepräsentation der Zahl aufzunehmen - inklusive der 0, die den String abschließt, sowie ein mögliches Vorzeichen.&lt;br /&gt;
&lt;br /&gt;
Anzumerken bleibt weiter, dass es normalerweise für alle Datentypen entsprechende Umwandlungsfunktionen gibt, wenn es sie für einen Datentyp gibt. Die Namensgebung lehnt sich an das Schema an: &#039;&#039;Kürzel_für_den_Datentyp to a&#039;&#039;. Eine Funktion die einen unsigned int wandelt, heißt dann utoa (oder _utoa), Floating Point heißt dann ftoa (oder _ftoa), etc.&lt;br /&gt;
&lt;br /&gt;
===sprintf()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  char Buffer[20];&lt;br /&gt;
  int i = 25;&lt;br /&gt;
&lt;br /&gt;
  sprintf( Buffer, &amp;quot;%d&amp;quot;, i );&lt;br /&gt;
  lcd_string( Buffer ); // ggf. auch lcd_out() o.ä. in anderen Libraries&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Methode funktioniert auch bei long oder float Werten. Unbedingt beachtet werden muss allerdings, dass die Typkennzeichnungen im sog. Format-String (hier &amp;quot;%d&amp;quot;) mit den tatsächlichen Typen der auszugebenden Werten übereinstimmt. Und dass der Buffer, der den Text aufnimmt, auch groß genug dimensioniert wird. Dabei sollte die 0, die den String terminiert, nicht vergessen werden.&lt;br /&gt;
&lt;br /&gt;
Mit sprintf() hat man dieselben Möglichkeiten zur Formatierung wie bei &amp;lt;b&amp;gt;printf()&amp;lt;/b&amp;gt; (siehe unten). Insbesondere gibt es natürlich die Möglichkeit die Zahl gleich in einen umgebenden Text einzubetten bzw. Formatierungen anzugeben:&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  char Buffer[20];&lt;br /&gt;
  int i = 25;&lt;br /&gt;
&lt;br /&gt;
  sprintf( Buffer, &amp;quot;Anzahl: %d Stueck&amp;quot;, i );&lt;br /&gt;
  lcd_out( Buffer );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;Haken&amp;quot; an der mächtigen Funktion sprintf() ist, daß sie auch bei minimalisierter Konfiguration verhältnismäßig viel Programmspeicher (Flash-ROM) belegt und relativ viel Prozesszeit benötigt. Daher sollte man sprintf() nur verwenden, wenn kein Speicher- und Prozesszeitmangel besteht. Sonst sollte itoa() oder eine eigene, auf die Bedürfnisse optimierte Implementierung auf jeden Fall vorgezogen werden. Der große Vorteil von sprintf liegt darin, dass man über sehr mächtige Formatiermöglichkeiten verfügt, mit der man die Ausgabe einfach steuern und an seine Bedürfnisse anpassen kann. Dinge die man mit einer Funktion wie itoa alle selbst &#039;händisch&#039; erledigen muss.&lt;br /&gt;
&lt;br /&gt;
====Formatierungen mit printf====&lt;br /&gt;
&lt;br /&gt;
Für jedes auszugebende Argument muss es im Formatstring einen entsprechenden Formatbezeichner geben. Der Aufbau eines Formatbezeichners ist immer&lt;br /&gt;
&lt;br /&gt;
  %[Modifizierer][Feldbreite][.Präzision]Typ&lt;br /&gt;
&lt;br /&gt;
(Die in eckigen Klammern [ ] angegebenen Elemente können auch weggelassen werden, wenn man sie nicht benötigt. Im einfachsten Fall benötigt man also nur das % und den Buchstaben zur Typ-Kennung.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Typ&amp;lt;/b&amp;gt; ist dabei eine Kennung, der mit dem Datentyp des jeweiligen auszugebenden Argumentes übereinstimmen muss. Einige oft benutzte Kennungen, ohne Anspruch auf Vollständigkeit, sind:&lt;br /&gt;
  &amp;lt;b&amp;gt;c&amp;lt;/b&amp;gt;    char&lt;br /&gt;
  &amp;lt;b&amp;gt;d&amp;lt;/b&amp;gt;    int&lt;br /&gt;
  &amp;lt;b&amp;gt;f&amp;lt;/b&amp;gt;    float, double&lt;br /&gt;
  &amp;lt;b&amp;gt;ld&amp;lt;/b&amp;gt;   long&lt;br /&gt;
  &amp;lt;b&amp;gt;u&amp;lt;/b&amp;gt;    unsigned int&lt;br /&gt;
  &amp;lt;b&amp;gt;lu&amp;lt;/b&amp;gt;   unsigned long&lt;br /&gt;
  &amp;lt;b&amp;gt;p&amp;lt;/b&amp;gt;    pointer&lt;br /&gt;
  &amp;lt;b&amp;gt;s&amp;lt;/b&amp;gt;    string&lt;br /&gt;
  &amp;lt;b&amp;gt;x&amp;lt;/b&amp;gt;    ein int wird ausgegeben, die Ausgabe erfolgt&lt;br /&gt;
       aber als Hexadezimalzahl&lt;br /&gt;
  &amp;lt;b&amp;gt;X&amp;lt;/b&amp;gt;    ein int wird ausgegeben, die Ausgabe erfolgt&lt;br /&gt;
       aber als Hexadezimalzahl, wobei Grossbuchstaben verwendet werden&lt;br /&gt;
&lt;br /&gt;
Der&#039;&#039;Modifizierer&#039;&#039; bestimmt, wie und womit nicht benutzte Felder des Ausgabefeldes gefüllt werden sollen, wie die Ausrichtung innerhalb des Feldes erfolgen soll und ob ein Vorzeichen auch dann ausgegeben werden soll wenn die auszugebende Zahl positiv ist. Wird kein Modifizierer angegeben, so werden nicht benutzte Felder mit einem Leerzeichen gefüllt, positive Vorzeichen unterdrückt und die Ausgabe im Feld rechts ausgerichtet.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;b&amp;gt;+&amp;lt;/b&amp;gt;    Vorzeichen wird immer ausgegeben&lt;br /&gt;
  &amp;lt;b&amp;gt;-&amp;lt;/b&amp;gt;    Die Ausgabe wird im Ausgabefeld linksbündig ausgerichtet&lt;br /&gt;
  &amp;lt;b&amp;gt;0&amp;lt;/b&amp;gt;    anstelle von Leerzeichen werden führende 0-en ausgegeben&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;Feldbreite&#039;&#039; gibt die Breite des Ausgabefeldes an, in die die Ausgabe durchgeführt werden soll. Reicht die angegebene Feldbreite nicht aus, so vergrößert printf diese Breite eigenmächtig. Die Feldbreite muß nicht angegeben werden. In diesem Fall bestimmt printf selbst die Feldbreite, so dass die Ausgabe darin Platz findet. Mit der Feldbreite hat man eine simple Möglichkeit dafür zu sorgen, dass der erzeugte String immer eine konstante Länge hat, selbst wenn die auszugebende Zahl diese Länge gar nicht benötigen würde (wichtig zb. bei Tabellen, damit die Einerstellen der Tabelleneinträge auch sauber untereinander stehen, auch dann wenn die Zahlen sich in unterschiedlichen Wertebereichen bewegen).&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;Präzision&#039;&#039; kommt nur bei float oder double Zahlen zum Einsatz. Sie legt fest, wieviele Positionen der kompletten Feldbreite für die Ausgabe von Nachkommastellen reserviert werden sollen. Auch sie muss wiederrum nicht angegeben werden und printf benutzt in so einem Fall Standardvorgaben.&lt;br /&gt;
&lt;br /&gt;
===== Beispiele =====&lt;br /&gt;
;&amp;lt;tt&amp;gt;&amp;quot;%d&amp;quot;&amp;lt;/tt&amp;gt;: Ausgabe eines Integer&lt;br /&gt;
;&amp;lt;tt&amp;gt;&amp;quot;%5d&amp;quot;&amp;lt;/tt&amp;gt;: Ausgabe eines Integer in einem Feld mit 5 Zeichen Breite&lt;br /&gt;
;&amp;lt;tt&amp;gt;&amp;quot;%05d&amp;quot;&amp;lt;/tt&amp;gt;: Ausgabe eines Integer in einem Feld mit 5 Zeichen Breite, wobei das Feld links mit führenden Nullen auf 5 Zeichen aufgefüllt wird&lt;br /&gt;
;&amp;lt;tt&amp;gt;&amp;quot;%-5d&amp;quot;&amp;lt;/tt&amp;gt;: Ausgabe eines Integer in einem Feld mit 5 Zeichen Breite. Die Zahl wird linksbündig in das Feld gestellt.&lt;br /&gt;
;&amp;lt;tt&amp;gt;&amp;quot;%6.3f&amp;quot;&amp;lt;/tt&amp;gt;: Ausgabe eines float (oder double). Die Ausgabe erfolgt in einem Feld mit 6 Zeichen Breite, wobei 3 Nachkommastellen ausgegeben werden. Achtung: In der Feldbreite ist auch ein eventuelles Vorzeichen sowie der Dezimalpunkt enthalten. Bei einer Feldbreite von 6 Zeichen und 3 Nachkommastellen, bleiben bei einer positiven Zahl daher nur 2 Positionen für den Vorkommaanteil, bei negativen sogar nur 1 Stelle (6 - 3 Nachkommastellen - 1 Dezimalpunkt - 1 Vorzeichen = 1)&lt;br /&gt;
&lt;br /&gt;
===Eigene Umwandlungsfunktionen===&lt;br /&gt;
&lt;br /&gt;
Möchte man &amp;lt;b&amp;gt;itoa()&amp;lt;/b&amp;gt; nicht benutzen oder hat es gar auf seinem System nicht zur Verfügung, dann ist es auch nicht schwer, sich selbst eine Funktion dafür zu schreiben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void ItoA( int z, char* Buffer )&lt;br /&gt;
{&lt;br /&gt;
  int i = 0;&lt;br /&gt;
  int j;&lt;br /&gt;
  char tmp;&lt;br /&gt;
  unsigned u;    // In u bearbeiten wir den Absolutbetrag von z.&lt;br /&gt;
  &lt;br /&gt;
    // ist die Zahl negativ?&lt;br /&gt;
    // gleich mal ein - hinterlassen und die Zahl positiv machen&lt;br /&gt;
    if( z &amp;lt; 0 ) {&lt;br /&gt;
      Buffer[0] = &#039;-&#039;;&lt;br /&gt;
      Buffer++;&lt;br /&gt;
      // -INT_MIN ist idR. größer als INT_MAX und nicht mehr &lt;br /&gt;
      // als int darstellbar! Man muss daher bei der Bildung &lt;br /&gt;
      // des Absolutbetrages aufpassen.&lt;br /&gt;
      u = ( (unsigned)-(z+1) ) + 1; &lt;br /&gt;
    }&lt;br /&gt;
    else { &lt;br /&gt;
      u = (unsigned)z;&lt;br /&gt;
    }&lt;br /&gt;
    // die einzelnen Stellen der Zahl berechnen&lt;br /&gt;
    do {&lt;br /&gt;
      Buffer[i++] = &#039;0&#039; + u % 10;&lt;br /&gt;
      u /= 10;&lt;br /&gt;
    } while( u &amp;gt; 0 );&lt;br /&gt;
&lt;br /&gt;
    // den String in sich spiegeln&lt;br /&gt;
    for( j = 0; j &amp;lt; i / 2; ++j ) {&lt;br /&gt;
      tmp = Buffer[j];&lt;br /&gt;
      Buffer[j] = Buffer[i-j-1];&lt;br /&gt;
      Buffer[i-j-1] = tmp;&lt;br /&gt;
    }&lt;br /&gt;
    Buffer[i] = &#039;\0&#039;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Grundprinzip ist einfach:&amp;lt;br&amp;gt;&lt;br /&gt;
Die Ermittlung der einzelnen Stellen erfolgt in der zentralen Schleife&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    do {&lt;br /&gt;
      Buffer[i++] = &#039;0&#039; + u % 10;&lt;br /&gt;
      u /= 10;&lt;br /&gt;
    } while( u &amp;gt; 0 );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
durch fortgesetzte Division durch 10 und Restbildung.&lt;br /&gt;
&lt;br /&gt;
    8392&lt;br /&gt;
&lt;br /&gt;
    8392 % 10           -&amp;gt; &amp;lt;b&amp;gt;2&amp;lt;/b&amp;gt;&lt;br /&gt;
    8392 / 10  -&amp;gt; 839&lt;br /&gt;
&lt;br /&gt;
     839 % 10           -&amp;gt; &amp;lt;b&amp;gt;9&amp;lt;/b&amp;gt;&lt;br /&gt;
     839 / 10  -&amp;gt; 83&lt;br /&gt;
&lt;br /&gt;
      83 % 10           -&amp;gt; &amp;lt;b&amp;gt;3&amp;lt;/b&amp;gt;&lt;br /&gt;
      83 / 10  -&amp;gt; 8&lt;br /&gt;
&lt;br /&gt;
       8 % 10           -&amp;gt; &amp;lt;b&amp;gt;8&amp;lt;/b&amp;gt;&lt;br /&gt;
       8 / 10  -&amp;gt; 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nur leider erhält man dadurch die einzelnen Ziffern der Zahl in umgekehrter Reihenfolge im String (&#039;2&#039; &#039;9&#039; &#039;3&#039; &#039;8&#039; anstelle von &#039;8&#039; &#039;3&#039; &#039;9&#039; &#039;2&#039;). Dies ist aber kein Problem, die nachfolgende Schleife&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  for( j = 0; j &amp;lt; i / 2; ++j ) {&lt;br /&gt;
    tmp = Buffer[j];&lt;br /&gt;
    Buffer[j] = Buffer[i-j-1];&lt;br /&gt;
    Buffer[i-j-1] = tmp;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
spiegelt den String in sich, sodass danach der String eine korrekte Repräsentation der ursprünglichen Zahl darstellt. Der Funktionsteil vor der &#039;Zerlegeschleife&#039; behandelt den Sonderfall daß die Zahl negativ ist. Negative Zahlen werden behandelt indem im Endergebnis ein &#039;-&#039; vermerkt wird und danach die Zahl positiv gemacht wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* Forenbeitrag [http://www.mikrocontroller.net/topic/67405#541885 Integer-Zahl in String mit bestimmter Zeichenlänge]&lt;br /&gt;
* Forenbeitrag [http://www.mikrocontroller.net/topic/84005#704736 (Resourcenschonend) Wert einer Variable am LCD ausgeben] von Niels Hüsken &lt;br /&gt;
* Forenbeitrag [http://www.mikrocontroller.net/topic/121526?goto=new#new Formatierte Zahlenausgabe in C] von  Peter Dannegger&lt;br /&gt;
* [[Festkommaarithmetik]]&lt;br /&gt;
&lt;br /&gt;
=Datentypen in Operationen=&lt;br /&gt;
Ein häufiges Problem betrifft die Auswertung von Ausdrücken. Konkret die Frage nach den beteiligten Datentypen.&lt;br /&gt;
zb&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
double i;&lt;br /&gt;
int j, k;&lt;br /&gt;
&lt;br /&gt;
i = j / k;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Frage lautet dann: Warum erhalte ich keine Kommastellen, ich weise doch das Ergebnis einem double zu?&lt;br /&gt;
&lt;br /&gt;
Dazu ist zu sagen, dass C nicht so funktioniert. Die Tatsache dass i eine double Variable ist, ist für die Auswahl der Operation, welche die Division durchführt, völlig irrelevant. C orientiert sich ausschliesslich an den &lt;br /&gt;
Datentypen der beteiligten Operanden, um zu entscheiden ob die Division als Integer- oder als Gleitkommadivision durchzuführen ist. Und da sowohl j als auch k ein Integer sind, wird die Division als Integerdivision durchgeführt&lt;br /&gt;
unabhängig davon, was mit dem Ergebnis weiter passiert. Erst nach der Division wird das Ergebnis in einen double überführt, um es an i zuweisen zu können. Zu diesem Zeitpunkt gibt es aber keine Kommastellen mehr, eine Integerdivision erzeugt keine. Und damit tauchen klarerweise auch im Ergebnis keine auf.&lt;br /&gt;
&lt;br /&gt;
Aus genau diesem Grund ist zb das Ergebnis von&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
double i;&lt;br /&gt;
i = 5 / 8;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
eine glatte 0 und nicht 0.625. Die Division 5 / 8 wird als Integer Division gemacht und liefert als solche keine Nachkommastellen. Wird das Ergebnis der Division in einen double umgewandelt, um es an i zuweisen zu können, ist das Kind schon in den Brunnen gefallen: Die Nachkommastellen sind schon längst weg bzw. waren nie vorhanden.&lt;br /&gt;
&lt;br /&gt;
Will man den Compiler dazu zwingen, die Division als Gleitkommadivision durchzuführen, so muss man daher dafür sorgen, dass mindestens einer der beteiligten Operanden ein double Wert ist. Dann bleibt dem Compiler nichts anderes übrig, als auch den zweiten Operanden ebenfalls zu einem double zu machen und die Operation als Gleitkommaoperation durchzuführen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
double i;&lt;br /&gt;
i = 5.0 / 8.0;&lt;br /&gt;
&lt;br /&gt;
i = (double)j / k;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generell implementiert der Compiler eine Operation immer im &#039;höchsten&#039; Datentyp, der in dieser Operation vorkommenden Operanden. Operanden in einem &#039;niedrigeren&#039; Datentyp werden automatisch immer in diesen &#039;höchsten&#039; Datentyp umgewandelt, zumindest aber int. Die Reihung orientiert sich dabei an der Regel: Ein &#039;höherer&#039; Datentyp kann alle Werte eines &#039;niedrigeren&#039; Datentyps aufnehmen.&lt;br /&gt;
&lt;br /&gt;
    int&lt;br /&gt;
    unsigned int&lt;br /&gt;
    long&lt;br /&gt;
    unsigned long&lt;br /&gt;
    long long&lt;br /&gt;
    unsigned long long&lt;br /&gt;
    double&lt;br /&gt;
    &lt;br /&gt;
float kommt in dieser Tabelle gar nicht vor, da Gleitkommaoperationen grundsätzlich immer als double-Operationen durchgeführt werden. Wohl kann es aber sein, dass double und float dieselbe Anzahl an Bits benutzen. Damit reduziert sich eine double Operation effektiv auf eine float Operation. (Anmerkung: mit dem C99-Standard hat sich dieses geändert. Dort gibt es dann auch echte float Operationen)&lt;br /&gt;
&lt;br /&gt;
Hat man also in einer Operation 2 Operanden der Datentypen int und long, so wird der int implizit zu einem long gemacht und die Operation als long Operation durchgeführt. Das Ergebnis hat dann den Datentyp long.&lt;br /&gt;
&lt;br /&gt;
==Welche Datentypen haben Konstanten==&lt;br /&gt;
&lt;br /&gt;
Auch Zahlenkonstante besitzen einen Datentyp, der selbstverständlich vom Compiler bei der Auswahl der Operation berücksichtigt wird. Hier gilt die Regel: Benutzt wird der Datentyp, der die Zahl gerade noch aufnehmen kann. Eine Zahlenkonstante 5 hat daher den Datentyp int. Die Zahl 32767 passt gerade noch in einen int, und hat daher den Datentyp int. 32768 ist für einen int bereits zu groß und hat daher den Datentyp long. 5.0 ist hingegem immer eine double-Konstante. Der Dezimalpunkt erzwingt dieses.&lt;br /&gt;
&lt;br /&gt;
Eine kleine Feinheit gibt es noch zu beachten. Konstanten in dezimaler Schreibweise haben immer einen signed Datentyp, während Konstanten in hexadezimaler bzw. oktaler Schreibweise je nach Wert einen signed oder einen unsigned Datentyp haben können.&lt;br /&gt;
&lt;br /&gt;
Möchte man einer Konstanten einen bestimmten Datentyp aufzwingen, so gibt es dazu 2 (ein halb) Möglichkeiten:&lt;br /&gt;
* Entweder man castet die Konstante in den gewünschten Datentyp&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
   (long)5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* oder man benutzt die in C dafür vorgesehene Schreibweise, indem man der Konstanten einen Suffix anhängt, der den gewünschten Datentyp beschreibt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    5L&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Beides ergibt eine dezimale 5, die vom Datentyp long ist.&lt;br /&gt;
&lt;br /&gt;
* eine Zahl in mit einem Dezimalkomma&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    5.0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ist immer eine double Zahl. Es sei denn sie hat explizit einen Suffix&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    5.0F&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
dann hat man es mit einer float Zahl zu tun.&lt;br /&gt;
&lt;br /&gt;
Die gültigen Suffixe für Zahlen sind U, L, UL und F:&lt;br /&gt;
&lt;br /&gt;
* U wie unsigned; dabei wird zuerst int angenommen. Es erfolgt eine automatische Ausweitung auf long, wenn die Zahl den Wertebereich eines unsigned int überschreitet. &lt;br /&gt;
* L wie long; die Zahl selbst kann int oder double sein.&lt;br /&gt;
* UL wie unsigned long. Eigentlich eine Zusammensetzung aus U und L&lt;br /&gt;
* F wie float.&lt;br /&gt;
&lt;br /&gt;
Präprozessordefinitionen besitzen keine eigene Datentypen, da sie eine reine Textersetzungen durchführen. Deren Inhalte können aber ggf. zu Werten aufgelöst werden, die datentypbehaftet sind.&lt;br /&gt;
&lt;br /&gt;
=Aktivieren der Floating Point Version von sprintf bei WinAVR bzw AVR-Studio=&lt;br /&gt;
[[Bild:AVR_Studio_float1.gif|thumb|right|300px|Project → Configuration Options  → Libraries → Available Link Objects]]&lt;br /&gt;
[[Bild:AVR_Studio_float2.gif|thumb|right|300px|Custom Options → Custom Compilation Options → Linker Options]]&lt;br /&gt;
Beim WinAVR/AVR-Studio wird standardmässig eine Version der printf-Bibliothek verwendet, die keine Floatingpoint-Verarbeitung unterstützt. Die meisten Programme benötigen keine Floatingpoint-Unterstützung, so dass dadurch wertvoller Programmspeicherplatz gespart werden kann.&lt;br /&gt;
&lt;br /&gt;
Benutzt man allerdings eine printf-Variante für die Ausgabe von Floatingpoint-Zahlen, so erscheint an Stelle der korrekt formatierten Zahl lediglich ein &#039;?&#039;. Dies ist ein Indiz dafür, dass die Floatingpoint-Verarbeitung im Projekt aktiviert werden muss.&lt;br /&gt;
&lt;br /&gt;
Um die Floatingpoint-Verarbeitung zu aktivieren, geht man im &#039;&#039;&#039;AVR Studio 4&#039;&#039;&#039; wie folgt vor: &lt;br /&gt;
* Menüpunkt: &#039;&#039;Project → Configuration Options&#039;&#039;&lt;br /&gt;
* Im sich öffnenden Dialog wird in der linken Navigationsleiste der Eintrag &#039;&#039;Libraries&#039;&#039; ausgewählt.&lt;br /&gt;
* Unter &#039;&#039;Available Link Objects&#039;&#039; werden Bibliotheken angeboten. Für die Aktivierung der Floatingpoint-Unterstützung sind 2 interessant&amp;lt;ref&amp;gt;&amp;lt;tt&amp;gt;libc.a&amp;lt;/tt&amp;gt; sollte nicht zu den Bibliotheken hinzugefügt werden, da sie automatisch eingebunden wird. Etwas Hintergrundinformationen gibt es in [http://www.mikrocontroller.net/topic/173630 diesem Thread.]&lt;br /&gt;
&amp;lt;/ref&amp;gt;:&lt;br /&gt;
** &amp;lt;tt&amp;gt;libprintf_flt.a&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;libm.a&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Beide Bibliotheken werden durch Aktivieren und einen Druck auf &#039;&#039;Add Library → &#039;&#039; in die rechte Spalte übernommen.&lt;br /&gt;
* Danach wählt man in der Navigationsleiste den Eintrag &#039;&#039;Custom Options&#039;&#039;.&lt;br /&gt;
* Unter &#039;&#039;Custom Compilation Options&#039;&#039; wird &#039;&#039;Linker Options&#039;&#039; ausgewählt und in das Textfeld rechts/unten folgender Text eingetragen:&lt;br /&gt;
         -Wl,-u,vfprintf&lt;br /&gt;
* Ein Druck auf &#039;&#039;Add&#039;&#039; befördert die Zeile in das Listenfeld darüber, welches Optionen für den Linker enthält.&lt;br /&gt;
* Mit &#039;&#039;OK&#039;&#039; wird die Konfiguration abgeschlossen.&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;AVR Studio 5&#039;&#039;&#039; trägt man die Optionen an anderen Stellen ein ([http://www.mikrocontroller.net/topic/221583#2219612 Beitrag von Hal Smith]): &lt;br /&gt;
*&#039;&#039;Project Properties → Toolchain → AVR/GNU C-Linker → Libraries&#039;&#039;&amp;lt;br/&amp;gt;In &#039;&#039;Libraries&#039;&#039; &amp;lt;tt&amp;gt;(-WI, -I), libprintf_flt.a libm.a&amp;lt;/tt&amp;gt; eintragen.&lt;br /&gt;
* &#039;&#039;Project Properties → Toolchain → AVR/GNU C-Linker → Miscellaneous&#039;&#039;&amp;lt;br/&amp;gt;In &#039;&#039;Other Linker Flags&#039;&#039; &amp;lt;tt&amp;gt;-Wl,-u,vfprintf&amp;lt;/tt&amp;gt; eintragen.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
= Wie funktioniert String-Verarbeitung in C? =&lt;br /&gt;
: → Siehe: &#039;&#039;[[String-Verarbeitung in C]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= struct Strukturen =&lt;br /&gt;
&lt;br /&gt;
: → Siehe: &#039;&#039;[[Strukturen in C]]&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
= Funktionszeiger =&lt;br /&gt;
&lt;br /&gt;
: → Siehe: &#039;&#039;[[Funktionszeiger in C]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Header File - wie geht das =&lt;br /&gt;
&lt;br /&gt;
Ein Header File ist im Grunde nichts anderes als eine Sammlung aller Informationen, die ein &#039;Aussenstehender&#039; benötigt, um die in einem C-File gesammlten Funktionen benutzen zu können.&lt;br /&gt;
&lt;br /&gt;
Trotzdem gibt es immer wieder Schwierigkeiten, wie sich die Sache mit Header Files und/oder #include verhält und wie man eine derartige Lösung aufbauen kann.&lt;br /&gt;
&lt;br /&gt;
Gegeben sei ein System bestehend aus 3 Funktionen&lt;br /&gt;
* main()&lt;br /&gt;
* functionA()&lt;br /&gt;
* functionB()&lt;br /&gt;
und einigen globalen Variablen. Für dieses System soll eine Aufteilung erfolgen, so dass funtionA samt seinen zugehörigen globalen Variablen in einer eigenen C-Datei residiert (FileA.c), functionB in einem eigenen File residiert (FileB.c) und main() als Hautpfunktion seine eigens C-File (Main.c) darstellt und jeweils die entsprechenden Header Files existieren.&lt;br /&gt;
&lt;br /&gt;
Kochrezeptartig kann man in vielen Fällen einfach so vorgehen:&lt;br /&gt;
Man schreibt erst mal den C-Code der Funktion, die man implementieren möchte. Zb fängt man an mit FileA.c&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileA.c&lt;br /&gt;
&lt;br /&gt;
int VarExtA;&lt;br /&gt;
int VarIntA;&lt;br /&gt;
&lt;br /&gt;
#define PortpinX PortA.1&lt;br /&gt;
&lt;br /&gt;
int functionIntA( void )&lt;br /&gt;
{&lt;br /&gt;
  VarIntA = VarExtB;&lt;br /&gt;
  functionB();&lt;br /&gt;
  PortpinX = 1;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt geht man das File, so wie es auch der Compiler macht, von oben nach unten durch schaut den Code durch. Damit functionB aufgerufen werden kann, ist ein Prototyp dafür notwendig. Der kommt aus einem Header File, welches noch nicht existiert, aber im Laufe des Prozesses entstehen und FileB.h heissen wird. FileB.h deshalb, weil die Funktion in FileB.c enthalten ist und man zur Vermeidung von Konfusion die Header Files immer gleich benennt wie die C-Files, nur eben mit einer anderen Dateiendung. FileB.h wird noch geschrieben werden, das hindert uns jetzt aber nicht daran, so zu tun als ob es dieses schon geben würde und ein entsprechender #include ergänzt. (Solange nicht compiliert wird ist das ja auch kein Problem. Irgendwo muss man ja schliesslich mal anfangen die Ergänzungen zu machen.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileA.c&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FileB.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int VarExtA;&lt;br /&gt;
int VarIntA;&lt;br /&gt;
&lt;br /&gt;
#define PortpinX PortA.1&lt;br /&gt;
&lt;br /&gt;
int functionA( void )&lt;br /&gt;
{&lt;br /&gt;
  VarIntA = VarExtB;&lt;br /&gt;
  functionB();&lt;br /&gt;
  PortpinX = 1;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gut. Die Variable VarExtB wird ebenfalls über den include hereingezogen&lt;br /&gt;
werden. Damit ist FileA.c erst mal vollständig. Da fehlt jetzt erst mal nichts mehr. Alles was in FileA.c vorkommt sind entweder C-Schlüsselwörter, durch FileA.c selbst definiert oder kommt über den #include herein.&lt;br /&gt;
&lt;br /&gt;
Der nächste Schritt ist die Überlegung: Was von dem Zeugs in FileA.C soll von anderer Stelle (von anderen C-Files aus) benutzt und verwendet werden können.&lt;br /&gt;
Welche Dinge muss FileA von sich preis geben.&lt;br /&gt;
&lt;br /&gt;
Da sind zu erst mal die beiden Variablen. Was soll mit denen geschehen?&lt;br /&gt;
VarExtA soll von aussen zugreifbar sein, VarIntA nicht. Und dann&lt;br /&gt;
natürlich die Funktion, die aufrufbar sein soll.&lt;br /&gt;
&lt;br /&gt;
Also beginnt man ein Header File für FileA.c zu schreiben, in das all das&lt;br /&gt;
reinkommt, was FileA.c nach aussen sichtbar machen will.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileA.h&lt;br /&gt;
&lt;br /&gt;
extern int VarExtA;&lt;br /&gt;
&lt;br /&gt;
int functionA( void );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Variable kriegt ein extern davor (und wird damit zu einer Deklaration), bei der Funktion wird einfach die Implementierung weggenommen und die somit zu einer Deklaration veränderte Zeile mit einem ; abgeschlossen. Wenn man möchte kann man den so geschaffenen Prototypen auch mit einem extern einleiten. Notwendig ist es aber nicht.&lt;br /&gt;
&lt;br /&gt;
Erneuter Blick aufs Header File. Kommt da irgendwas vor, was nicht&lt;br /&gt;
Standard C Schlüsselwort ist? Nein. Nichts.&lt;br /&gt;
Also ist dieses Header File somit ebenfalls in sich vollständig.&lt;br /&gt;
&lt;br /&gt;
Zur Sicherheit wird in FileA.c noch einen Include auf das&lt;br /&gt;
eigene Header File hinzugefügt, denn dann kann der Compiler überprüfen ob die&lt;br /&gt;
Angaben im Header File mit der tatsächlichen Implementierung&lt;br /&gt;
übereinstimmen. Und da VarIntA von aussen nicht sichtbar sein soll (auch&lt;br /&gt;
nicht durch Tricks), wird sie static gemacht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileA.c&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FileA.h&amp;quot;&lt;br /&gt;
#include &amp;quot;FileB.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int VarExtA;&lt;br /&gt;
static int VarIntA;&lt;br /&gt;
&lt;br /&gt;
#define PortpinX PortA.1&lt;br /&gt;
&lt;br /&gt;
int functionA( void )&lt;br /&gt;
{&lt;br /&gt;
  VarIntA = VarExtB;&lt;br /&gt;
  functionB();&lt;br /&gt;
  PortpinX = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dasselbe für FileB.c. Erst mal einfach runterschreiben&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileB.c&lt;br /&gt;
&lt;br /&gt;
int VarExtB;&lt;br /&gt;
int VarIntB;&lt;br /&gt;
&lt;br /&gt;
#define SettingB 0x01&lt;br /&gt;
&lt;br /&gt;
int functionB( void )&lt;br /&gt;
{&lt;br /&gt;
  VarExtA = 1;&lt;br /&gt;
  functionA();&lt;br /&gt;
  VarIntB = SettingB;&lt;br /&gt;
&lt;br /&gt;
  MeinePrivateFunktion();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MeinePrivateFunktion()&lt;br /&gt;
{&lt;br /&gt;
  VarIntB = 8;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
damit functionA aufgerufen werden kann, braucht es wieder einen Prototypen. Den&lt;br /&gt;
kriegt man über von FileA.h, welches daher includiert wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileB.c&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FileA.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int VarExtB;&lt;br /&gt;
int VarIntB;&lt;br /&gt;
&lt;br /&gt;
#define SettingB 0x01&lt;br /&gt;
&lt;br /&gt;
int functionB( void )&lt;br /&gt;
{&lt;br /&gt;
  VarExtA = 1;&lt;br /&gt;
  functionA();&lt;br /&gt;
  VarIntB = SettingB;&lt;br /&gt;
  MeinePrivateFunktion();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MeinePrivateFunktion()&lt;br /&gt;
{&lt;br /&gt;
  VarIntB = 8;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was noch? VarExtA. Diese Variable wird aber ebenfalls durch den #include als extern Deklaration ins FileB.c hereingezogen und ist somit bei der Übersetzung von FileB.c bekannt. Kommt sonst noch etwas vor? MeinePrivateFunktion. Diese Funktion soll nur in FileB.c benutzt werden und ist für jemanden ausserhalb FileB.c völlig uninteressant. Nichts destotrotz gilt die Regel: compiliert wird von oben nach unten und verwendet werden kann nur etwas, was auch bekannt ist. D.h. bevor der Aufruf der Funktion in functionB gemacht werden kann, muss es einen Protoypen der Funktion geben. Da diese Funktion aber nicht nach &#039;aussen&#039; exportiert wird, macht man den Protoypen gleich in das C-File mit hinein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileB.c&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FileA.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int VarExtB;&lt;br /&gt;
int VarIntB;&lt;br /&gt;
&lt;br /&gt;
#define SettingB 0x01&lt;br /&gt;
&lt;br /&gt;
void MeinePrivateFunktion();&lt;br /&gt;
&lt;br /&gt;
int functionB( void )&lt;br /&gt;
{&lt;br /&gt;
  VarExtA = 1;&lt;br /&gt;
  functionA();&lt;br /&gt;
  VarIntB = SettingB;&lt;br /&gt;
  MeinePrivateFunktion();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MeinePrivateFunktion()&lt;br /&gt;
{&lt;br /&gt;
  VarIntB = 8;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Würde man die Funktion vorziehen, so dass der Funktionskörper vor der ersten Verwendung steht, dann würde man auch keinen Protoypen benötigen. Eine Funktionsdefinition fungiert als ihr eigener Protoyp.&lt;br /&gt;
&lt;br /&gt;
Kommt sonst noch etwas vor? Nix mehr. In FileB.c wird sonst nix mehr verwendet was nicht entweder C Schlüsselwort oder im File selber oder durch einen #include reinkommt.&lt;br /&gt;
&lt;br /&gt;
Dann wieder: das Header File für B schreiben. Dabei einfach nur überlegen: was soll von FileB.c nach aussen getragen werden?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileB.h&lt;br /&gt;
&lt;br /&gt;
extern int VarExtB;&lt;br /&gt;
&lt;br /&gt;
int functionB( void );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und zur Sicherheit wieder ins eigene C-File includen und alle Variablen&lt;br /&gt;
(oder auch Funktionen), die von aussen nicht sichtbar sein sollen, als&lt;br /&gt;
static markieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileB.c&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FileB.h&amp;quot;&lt;br /&gt;
#include &amp;quot;FileA.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int VarExtB;&lt;br /&gt;
static int VarIntB;&lt;br /&gt;
&lt;br /&gt;
#define SettingB 0x01&lt;br /&gt;
&lt;br /&gt;
static void MeinePrivateFunktion();&lt;br /&gt;
&lt;br /&gt;
int functionB( void )&lt;br /&gt;
{&lt;br /&gt;
  VarExtA = 1;&lt;br /&gt;
  functionA();&lt;br /&gt;
  VarIntB = SettingB;&lt;br /&gt;
  MeinePrivateFunktion();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MeinePrivateFunktion()&lt;br /&gt;
{&lt;br /&gt;
  VarIntB = 8;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
damit bleibt nur noch main.c. Auch dieses wird erst mal einfach runtergeschrieben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int c;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  functionA();&lt;br /&gt;
  functionB();&lt;br /&gt;
  VarExtA = 1;&lt;br /&gt;
  VarExtB = c;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit functionA aufgerufen werden kann, braucht es einen Prototypen. Woher kommt er? Aus FileA.h. Also gleich mal includen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;FileA.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int c;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  functionA();&lt;br /&gt;
  functionB();&lt;br /&gt;
  VarExtA = 1;&lt;br /&gt;
  VarExtB = c;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit functionB aufgerufen werden kann, braucht es einen Prototypen. Wo&lt;br /&gt;
kommt der her? Aus FileB.h. Also noch ein #include&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;FileA.h&amp;quot;&lt;br /&gt;
#include &amp;quot;FileB.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int c;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  functionA();&lt;br /&gt;
  functionB();&lt;br /&gt;
  VarExtA = 1;&lt;br /&gt;
  VarExtB = c;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fehlt noch was? VarExtA ist durch den #include von FileA.h bereits&lt;br /&gt;
abgedeckt und VarExtB ist durch den #include von FileB.h bereits&lt;br /&gt;
abgedeckt. Also fehlt nix mehr. Auch in main.c sind damit alle Sachen&lt;br /&gt;
abgedeckt und es ist in sich vollständig.&lt;br /&gt;
&lt;br /&gt;
Das ist der Standardmechanismus:&lt;br /&gt;
* Implementierung der Funktionen im C File schreiben&lt;br /&gt;
* Überlegen, was von dieser Implementierung von aussen sichtbar sein soll.&lt;br /&gt;
* Dasjenige kommt als Deklaration ins Header File, alles andere am besten static machen.&lt;br /&gt;
* Für alles im C-File, das seinerseits woanders herkommt, gibt es einen #include, der das jeweils notwendige Header File einbindet.&lt;br /&gt;
* Werden im Header File Dinge von woanders benutzt, dann enthält das Header File einen entsprechenden #include&lt;br /&gt;
* Jedes File, sowohl Header-File als auch C-File ist in sich vollständig. Werden dort Dinge benutzt, dann müssen diese vor der Verwendung deklariert worden sein. Wie und wo diese Deklaration herkommt, ist dabei zweitrangig. Es kann sein, dass die Deklaration vor der Verwendung steht, es kann aber auch sein, dass die Deklaration über einen weiteren Include mit aufgenommen wird.&lt;br /&gt;
&lt;br /&gt;
= Ich hab da mehrere *.c und *.h Dateien. Was mache ich damit? =&lt;br /&gt;
&lt;br /&gt;
[[Bild:c-flow.svg|right|thumb|260px|C-Programmierung: Workflow]]&lt;br /&gt;
Zunächst ist es wichtig, sich zu vergegenwärtigen, wie C-Compiler und Linker zusammenarbeiten. Ein komplettes Programmier-Projekt kann und wird im Normalfall aus mehreren Quelldateien bestehen, die alle zusammengenommen das komplette Programm bilden.&lt;br /&gt;
&lt;br /&gt;
Der Prozess des Erstellens des Programmes geschieht in mehrerern Schritten:&lt;br /&gt;
;Compilieren: zunächst werden alle Einzelteile (jede *.c Datei) für sich &#039;&#039;compiliert&#039;&#039;. Dabei ensteht aus jeder c-Datei eine sogenannte Object-Datei, in der bereits der Maschinencode für die im c-File programmierten Funktionen enthalten ist&lt;br /&gt;
;Linken: die einzelnen Object-Dateien werden mit zusätzlichen Bibliotheken und dem Startup-Code zum fertigen Programm &#039;&#039;gelinkt&#039;&#039;.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
Angenommen, das komplette Projekt besteht aus 2 Dateien:&lt;br /&gt;
&lt;br /&gt;
;main.c:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int twice (int);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  twice (5);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;func.c:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int twice (int number)&lt;br /&gt;
{&lt;br /&gt;
  return 2 * number;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann werden &amp;lt;tt&amp;gt;main.c&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;func.c&amp;lt;/tt&amp;gt; &#039;&#039;unabhängig&#039;&#039; voneinander compiliert. Als Ergebnis erhält man die Dateien &amp;lt;tt&amp;gt;main.o&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;func.o&amp;lt;/tt&amp;gt;, die den besagten Object-Code enthalten.&lt;br /&gt;
Diese beiden Zwischenergebnisse werden dann zusammen mit Bibliotheken zum fertigen Programm gebunden (gelinkt), das dann ausgeführt werden kann.&lt;br /&gt;
&lt;br /&gt;
Bekommt man also von irgendwo bereits fertige *.c (und zugehörige *.h) Dateien, so genügt es, die *.c Dateien in das Projekt mit aufzunehmen. Dadurch wird das entsprechende C-File compiliert und das Ergebnis davon, das Object-file, wird dann in das fertige Programm mit eingelinkt.&lt;br /&gt;
&lt;br /&gt;
;Achtung: Da jede der C-Dateien unabhängig von allen anderen compiliert wird, bedeutet das auch, dass jede der C-Dateien in sich vollständig sein muss!&lt;br /&gt;
&lt;br /&gt;
Wie eine C-Datei in das Projekt mit aufgenommen wird, hängt im wesentlichen von der benutzten Entwicklungsumgebung ab.&lt;br /&gt;
&lt;br /&gt;
== Makefile ==&lt;br /&gt;
&lt;br /&gt;
Die zusätzliche *.c Datei wird in die SRC Zeile im makefile eingetragen.&lt;br /&gt;
&lt;br /&gt;
== AVR-Studio ==&lt;br /&gt;
&lt;br /&gt;
Hier ist es besonders einfach, eine Datei in das Projekt mit aufzunehmen. Dazu wird im Projektbaum der Knoten &amp;quot;Source Files&amp;quot; aktiviert und mit der rechten Maustaste das Kontextmenü geöffnet. Im Menü wird der Punkt &amp;quot;Add existing Source File(s)&amp;quot; ausgewählt, und anschliessend zeigt man AVR-Studio das zusätzliche C-File. AVR-Studio berücksicht dann diese Datei bei der Projekterzeugung, compiliert es und sorgt dafür, dass es zum fertigen Programm dazugelinkt wird.&lt;br /&gt;
&lt;br /&gt;
=Globale Variablen über mehrere Dateien=&lt;br /&gt;
Ein häufiger Problemkreis in der C Programmierung sind auch globale Variablen, die von mehreren *.c Dateien aus benutzt werden sollen. Was hat es damit auf sich?&lt;br /&gt;
&lt;br /&gt;
Zunächst mal muß man bei der Vereinbarung von Variablen zwischen &#039;&#039;Definition&#039;&#039; und &#039;&#039;Deklaration&#039;&#039; unterscheiden:&lt;br /&gt;
;Definition: Mit einer Definition wird der Compiler angewiesen, eine Variable tatsächlich zu erzeugen. Damit er das kann, muß ihm selbstverständlich der exakte Datentyp und auch der Name der Variablen zur Verfügung stehen. Eine Definition sorgt also dafür, dass im späteren Programm Speicherplatz für diese Variable reserviert wird&lt;br /&gt;
;Deklaration: Mit einer Deklaration teilt man dem Compiler lediglich mit, dass eine Variable existiert. An dieser Stelle soll der Compiler also keinen Speicherplatz reservieren, sondern der Compiler soll einfach nur zur Kenntniss nehmen, daß es eine Variable mit einem bestimmten Namen gibt und von welchem Datentyp sie ist.&lt;br /&gt;
&lt;br /&gt;
Aus obigem folgt sofort, dass eine Definition auch immer eine Deklaration ist. Denn dadurch, daß der Compiler angewiesen wird eine Variable auch tatsächlich zu erzeugen, folgt, dass er dazu auch dieselben Informationen benötigt, die auch in einer Deklaration angegeben werden müssen. Der einzige Unterschied: Bei einer Deklaration trägt der Compiler nur in seinen internen Tabellen ein, dass es diese Variable tatsächlich gibt, während er bei einer Definition zusätzlich auch noch dafür sorgt, dass im fertigen Programm auch Speicher für diese Variable bereitgestellt wird.&lt;br /&gt;
&lt;br /&gt;
Warum ist diese Unterscheidung wichtig?&lt;br /&gt;
&lt;br /&gt;
Weil es in C die sog. &#039;&#039;One Definition Rule&#039;&#039; (ODR). Sie besagt, dass in einem vollständigen Programm, also über alle *.c Dateien gesehen, es für eine Variable nur &amp;lt;b&amp;gt;eine&amp;lt;/b&amp;gt; Definition geben darf. Es darf allerdings beliebig viele Deklarationen geben, solange diese Deklarationen alle im Datentyp übereinstimmen. Kurz gesagt: Man darf den Compiler nur einmal auffordern, eine Variable zu erzeugen (Definition), kann sich aber beliebig oft auf diese eine Variable beziehen (Deklarationen). Aber Vorsicht! Da der Compiler jede einzelne *.c Datei für sich alleine übersetzt und dabei kein Wissen von ausserhalb benutzt, obliegt es der Verantwortung des Programmierers dafür zu sorgen, dass alle Deklarationen im Datentyp übereinstimmen. Der Compiler kann diese Einhaltung prinzipbedingt nicht überwachen!&lt;br /&gt;
&lt;br /&gt;
Woran erkennt man eine Definition bzw. Deklaration?&lt;br /&gt;
&lt;br /&gt;
Eine Definition einer globalen Variable steht immer ausserhalb eines Funktionsblocks. Zb.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int  MyData;         // Globale Variable namens MyData. Sie ist vom Typ int&lt;br /&gt;
char Name[30];       // Globales Array&lt;br /&gt;
long NrElements = 5; // Globale Variable, die auch noch initialisiert wird&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Deklaration unterscheidet sich von einer Definition in 2 Punkten&lt;br /&gt;
* Es wird das Schlüsselwort &amp;lt;tt&amp;gt;extern&amp;lt;/tt&amp;gt; vorangestellt.&lt;br /&gt;
* Es kann keine Initialisierung geben. Sobald eine Initialisierung vorhanden ist, wird das Schlüsselwort &amp;lt;tt&amp;gt;extern&amp;lt;/tt&amp;gt; ignoriert und aus der Deklaration wird eine Definition.&lt;br /&gt;
&lt;br /&gt;
Beispiele für Deklarationen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
extern int  MyData;&lt;br /&gt;
extern char Name[30];&lt;br /&gt;
extern long NrElements;&lt;br /&gt;
extern long NrElements = 5;  // Achtung: Dies ist eine Definition!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Besitzt man also 2 *.c Dateien, main.c und helpers.c, und sollen sich diese beiden Dateien eine globale Variable teilen, so muss in eine Datei eine Definition hinein, während in die andere Datei eine Deklaration derselben Variablen erfolgen muß. Traditionell werden die Definitionen in der *.c-Datei gemacht, die als Hauptdatei des Moduls fungiert, zu der diese Variable konzeptionell gehört. Im Zweifel ist das die *.c Datei, in der main() enthalten ist. Das muss nicht so sein, ist aber eine Konvention, die oft Sinn macht. Alternativ wird auch gerne oft eine eigene *.c Datei (zb. globals.c) gemacht, die einzig und alleine die Defintionen der globalen Variablen enthält.&lt;br /&gt;
&lt;br /&gt;
main.c&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int  AnzahlElemente;        // Dies ist die Definition. Hier wird die globale&lt;br /&gt;
                            // Variable AnzahlElemente tatsächlich erzeugt.&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  AnzahlElemente = 8;&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
helpers.c&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
extern int AnzahlElemente;   // Dies ist die Deklaration die auf die globale&lt;br /&gt;
                             // Variable AnzahlElemente in main.c verweist.&lt;br /&gt;
                             // Wichtig: Der Datentyp muss mit dem in main.c&lt;br /&gt;
                             // angegebenen übereinstimmen&lt;br /&gt;
&lt;br /&gt;
void foo()&lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
  j = AnzahlElemente;&lt;br /&gt;
  AnzahlElemente = 9;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Praktische Durchführung==&lt;br /&gt;
Besteht ein vollständiges Programm aus mehreren *.c Dateien, dann kann man sich vorstellen, daß es mühsam ist, alle Deklarationen immer auf gleich zu halten. Hier bietet sich der Einsatz eines Header Files an, in der die Deklarationen stehen und welches in die jeweiligen *.c Dateien inkludiert wird&lt;br /&gt;
&lt;br /&gt;
Bsp:&lt;br /&gt;
&lt;br /&gt;
Global.h&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
extern int Anzahl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
main.c&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;Global.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int Anzahl;      // auch wenn Global.h inkludiert wurde, so muss es eine&lt;br /&gt;
                 // Definition der Variablen geben. In Global.h sind ja nur&lt;br /&gt;
                 // Deklarationen.&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  Anzahl = 5;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
foo.c&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;Global.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void foo()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  Anzahl = 8;&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bar.c&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;Global.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void bar()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  j = Anzahl;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf diese Art kann man erreichen, dass zumindest alle Deklarationen ein und derselben Variablen in einem Programm übereinstimmen. Die Datei Global.h wird auch in main.c inkludiert, obwohl man das eigentlich nicht müsste, denn dort wird die Variable ja definiert. Durch die Inclusion ermöglicht man aber dem Compiler die Überprüfung ob die Deklaration auch tatsächlich mit der Definition übereinstimmt.&lt;br /&gt;
&lt;br /&gt;
Solange kein Initialisierungen der globalen Variablen notwendig sind, gibt es noch einen weiteren Trick, um sich selbst das Leben und die Verwaltung der globalen Variablen zu erleichtern.&lt;br /&gt;
Worin besteht das Problem?&lt;br /&gt;
Das Problem besteht darin, dass man bei Einführung einer neuen globalen Variablen an 2 Stellen erweitern muss: Zum einen in der Header-Datei, die die &#039;extern&#039;-Deklaration der Variablen enthält, zum anderen muss in einer C-Datei die Definition der Variablen erfolgen. Das kann man sich mit etwas Präprozessorarbeit auch einfacher machen:&lt;br /&gt;
&lt;br /&gt;
Global.h&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef EXTERN&lt;br /&gt;
#define EXTERN extern&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
EXTERN int Anzahl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
main.c&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define EXTERN&lt;br /&gt;
#include &amp;quot;Global.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  Anzahl = 5;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
foo.c&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;Global.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void foo()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  Anzahl = 8;&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie funktioniert das Ganze? Im Grunde muss man nur dafür sorgen, dass der Compiler an &#039;&#039;einer&#039;&#039; Stelle das Schlüsselwort &#039;&#039;&#039;extern&#039;&#039;&#039; ignoriert (hier in main.c) und bei allen anderen Inclusionen beibehält. Dadurch das ein Präprozessor-ifndef benutzt wird, kann dieses erreicht werden. Wird das Header File includiert und ist zu diesem Zeitpunkt das Makro &#039;&#039;&#039;EXTERN&#039;&#039;&#039; noch nicht definiert, so wird innerhalb des Header Files &#039;&#039;&#039;EXTERN&#039;&#039;&#039; zu &#039;&#039;&#039;extern&#039;&#039;&#039; definiert und damit in weiterer Folge im Quelltext &#039;&#039;&#039;EXTERN&#039;&#039;&#039; durch &#039;&#039;&#039;extern&#039;&#039;&#039; ersetzt. Wenn daher foo.c das Header File inkludiert, wird die Zeile&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
EXTERN int Anzahl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
vom Präprozessor zu&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
extern int Anzahl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
umgewandelt.&lt;br /&gt;
&lt;br /&gt;
In main.c hingegen sieht die Include-Sequenz so aus&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define EXTERN&lt;br /&gt;
#include &amp;quot;Global.h&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wenn Global.h bearbeitet wird, existiert bereits ein Makro &#039;&#039;&#039;EXTERN&#039;&#039;&#039;, das auf einen leeren Text expandiert. Dadurch wird verhindert, dass innerhalb von Global.h das Makro &#039;&#039;&#039;EXTERN&#039;&#039;&#039; mit dem Text &#039;&#039;&#039;extern&#039;&#039;&#039; belegt wird und&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
EXTERN int Anzahl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
wird daher vom Präprozessor zu&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int Anzahl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
erweitert, genau wie es benötigt wird.&lt;br /&gt;
&lt;br /&gt;
= Was hat es mit volatile auf sich =&lt;br /&gt;
Immer wieder hört man im Forum die pauschale Aussage &amp;quot;Variablen die in einer ISR verwendet werden, müssen volatile sein&amp;quot;. Nun, das ist so nicht ganz richtig.&lt;br /&gt;
Welches Problem löst denn eigentlich volatile? Was ist denn das eigentliche Problem, das einer Lösung bedarf?&lt;br /&gt;
&lt;br /&gt;
Das Problem findet sich diesmal im Optimierer eines C Compilers. C Compiler übersetzen, wenn sie optimieren dürfen, den C Code nicht direkt so, wie ihn der Programmierer geschrieben hat, sondern sie versuchen Ressourcen einzusparen. Das kann sowohl Programmspeicher als auch Laufzeit, häufig auch beides gemeinsam sein. Zu diesem Zweck untersuchen sie das Programm und versuchen in der funktional gleichwertigen, in Maschinensprache übersetzen Version, Anweisungen einzusparen. Das dürfen sie auch. Der C-Standard erlaubt Optimierungen, solange die &#039;As-If&#039;-Regel eingehalten wird. Das bedeutet: Der Compiler darf das Programm umstellen und verändern, solange die Programmergebnisse dieselben bleiben. Eben &amp;quot;As-if&amp;quot; die Optimierung nie stattgefunden hätte.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir ein Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  i = 2;&lt;br /&gt;
&lt;br /&gt;
  if( i == 5 )&lt;br /&gt;
    j = 8;&lt;br /&gt;
  else&lt;br /&gt;
    j = 6;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In diesem Programmausschnitt darf der Compiler seine Kenntnisse ausnutzen. Er weiß an dieser Stelle, dass i den Wert 2 hat. Damit ist aber auch klar, dass die Bedingung niemals wahr sein kann, denn 2 kann niemals gleich 5 sein. Wenn die Bedingung aber niemals wahr sein kann, dann kann auch die Zuweisung von 8 an j niemals ausgeführt werden. Der Compiler kann also diesen Programmtext zu diesem hier kürzen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  i = 2;&lt;br /&gt;
  j = 6;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ohne das sich an den Programmergebnissen etwas ändert. Die zweite Version ist aber kürzer und wird, wegen des Wegfalles des Vergleiches, auch schneller ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Eine andere Form der Optimierung betrifft die Verwaltung von µC-Ressourcen und da wieder ganz speziell die Register. Variablen werden ja erst mal im SRAM-Speicher des µC angelegt. Um mit den Werten von Variablen arbeiten zu können, müssen diese Wert aber vom SRAM-Speicher in µC-Register überführt werden (Register kann man sich wie Speicherstellen in der eigentlichen CPU vorstellen). Nur dort können diese Werte mittels Maschinenbefehlen manipuliert werden.&lt;br /&gt;
Jetzt haben aber µC nicht beliebig viele Register. Das bedeutet aber auch, der Compiler muss darüber Buch führen, welche Werte (welche Variablen) gerade in welchen Registern liegen und wenn alle Register belegt sind, muss ein anderes Register freigeräumt werden, in dem der Wert aus dem Register wieder ins SRAM zurück übertragen wird.&lt;br /&gt;
Allerdings kostet das auch Zeit. Der Compiler wird daher versuchen, Variablen, die in einem Programmstück oft benötigt werden, für längere Zeit in den Registern zu halten, um das Registerladen bzw. -zurückschreiben einzusparen. Die Grundannahme lautet dabei immer: In Anweisungen, in denen eine Variable nicht vorkommt, kann diese Variable auch nicht verändert werden. Im Programmstück&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  while( 1 ) {&lt;br /&gt;
    if( i == 5 )&lt;br /&gt;
      j = 8;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
gibt es für i keine Möglichkeit, verändert zu werden. Der Compiler kann daher entscheiden, dass er diese Variable, *an dieser Stelle*, gar nicht aus dem SRAM laden muss, sondern sich den entsprechenden Wert in einem Register vorhält und dieses Register ausschließlich dafür reserviert. (Er könnte auch entscheiden, dass der Code nie ausgeführt werden kann, aber das ist eine andere Geschichte)&lt;br /&gt;
&lt;br /&gt;
Der springende Punkt ist nun, dass der Compiler hier eine zu kleine Sicht der Dinge hat. Betrachtet man nur dieses Code Stück, dann gibt es tatsächlich für i keine Möglichkeit, seinen Wert zu verändern. Aber die Dinge ändern sich, wenn Interrupts ins Spiel kommen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uint8_t i;&lt;br /&gt;
&lt;br /&gt;
ISR( irgendein_Interrupt )&lt;br /&gt;
{&lt;br /&gt;
  i = 5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
  while( 1 ) {&lt;br /&gt;
    if( i == 5 )&lt;br /&gt;
      j = 8;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Jetzt gibt es plötzlich eine Möglichkeit, wie i seinen Wert ändern kann: Wenn der entsprechende Interrupt ausgelöst wird, dann wird i auf den Wert 5 gesetzt. i, das ist aber nichts anderes als ein bestimmter Speicherbereich im SRAM. D.h. im SRAM wird die Variable tatsächlich korrekt auf den Wert 5 gesetzt. Nur: Als der Compiler die while-Schleife übersetzt hat, wusste er nichts davon, dass diese Möglichkeit existiert. Er hat entschieden, dass er an dieser Stelle den Wert der Variablen in einem CPU-Register halten wird, um Zugriffe einzusparen. Nur wird diese Kopie des Wertes im Register natürlich nicht verändert, wenn in der ISR das Original von i im SRAM verändert wird.&lt;br /&gt;
Fazit: Obwohl die ISR die Variable tatsächlich verändert, kriegt das der Code im while nicht mit, weil der Compiler es mit der Optimierung an dieser Stelle übertrieben hat. In der while-Schleife wird mit einer Kopie des Wertes von i in einem Register gearbeitet und nicht mit dem originalen Wert von i im SRAM.&lt;br /&gt;
&lt;br /&gt;
Und an dieser Stelle kommt jetzt volatile ins Spiel.&lt;br /&gt;
&lt;br /&gt;
volatile teilt dem Compiler mit, dass ausnahmslos alle Zugriffe auf eine Variable auch tatsächlich auszuführen sind und keine Optimierungen gemacht werden dürfen, weil eine Variable auf Wegen benutzt werden kann, die für den Compiler prinzipiell nicht einsichtig sind. Im obigen Beispiel könnte man argumentieren, dass der Compiler ja wohl die ISR bemerken könne und daher feststellen könnte, dass i tatsächlich verändert wird. Aber das stimmt so in der allgemeinen Form nicht. Niemand sagt, dass der Compiler die ISR überhaupt zu Gesicht bekommen muss, die könnte ja auch in einem ganz anderen C File stecken.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
volatile uint8_t i;&lt;br /&gt;
&lt;br /&gt;
ISR( irgendein_Interrupt )&lt;br /&gt;
{&lt;br /&gt;
  i = 5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
  while( 1 ) {&lt;br /&gt;
    if( i == 5 )&lt;br /&gt;
      j = 8;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
wird i volatile gemacht, so verbietet man damit dem Compiler explizit, Annahmen über den Datenfluss von i zu treffen. Innerhalb der Schleife muss also tatsächlich jedes Mal wieder erneut i aus dem SRAM geholt werden und mit 5 verglichen werden. Abkürzungen durch Mehrfachverwendung von Registern oder sonstigen Optimierungstricks sind nicht erlaubt. Und damit ist das Problem gelöst. Wird i in der ISR verändert, so bekommt das auch die Abfrage mit, weil ja jetzt auf jeden Fall auf das Original im SRAM zurückgegriffen wird.&lt;br /&gt;
&lt;br /&gt;
Das Gleiche gilt auch ebenso &amp;quot;in die andere Richtung&amp;quot;, wenn also i in der Schleife geändert und in der ISR nur gelesen wird. Auch hier könnte die Optimierung negativ zuschlagen und den Schreibzugriff nur auf eine lokale Kopie der Variable in einem Register durchführen (oder gar ganz wegfallen) lassen, weil der Lesezugriff außerhalb des direkten Programmflusses (in der ISR) für den Compiler nicht ersichtlich ist.&lt;br /&gt;
&lt;br /&gt;
Ein anderes Problem (das ebenfalls mittels volatile gelöst wird) sind Variablen, die tatsächlich im Code überhaupt nie aktiv verändert werden, sondern es sich um Zusatzhardware handelt, die so verschaltet ist, dass sie im Programm in Form einer Variablen auftaucht, z.B. ein Uhren-IC (oder auch ganz banal: Portpins). In diesem Fall wird z.B. die Variable für Sekunden vom Programm gar nicht vom Programm selber verändert, ändert aber trotzdem ihren Inhalt. Die Zusatzhardware selbst macht das. Aus Programmsicht handelt es sich um Speicherzellen, die magisch selbsttätig ihren Wert ändern. Und damit dürfen selbstverständlich auch hier keinerlei Annahmen über den Inhalt der Variablen getroffen werden. Eine derart angebundene externe Hardware nennt man übrigens &amp;quot;memory-mapped&amp;quot;, weil sie ihre Werte ins Memory (=Hauptspeicher) mapped (=einblendet).&lt;br /&gt;
&lt;br /&gt;
Allerdings kann volatile nur bei den Variablen sinnvoll genutzt werden, die &amp;quot;von außen&amp;quot; auch änderbar sind. Bei lokalen Variablen, auch statischen, einer Funktion kann das nur passieren, wenn ihre Adresse einer ISR z.B. durch einen globalen Pointer bekannt gemacht wird.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uint8_t *v;&lt;br /&gt;
ISR( irgendein_Interrupt )&lt;br /&gt;
{&lt;br /&gt;
  i = 5;&lt;br /&gt;
  *v = 42;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  uint8_t i; // kann sich nie unerwartet ändern -&amp;gt; volatile nutzlos, behindert nur Optimizer&lt;br /&gt;
&lt;br /&gt;
  volatile uint8_t j; // kann sich unerwartet ändern (über globalen *v)&lt;br /&gt;
  v = &amp;amp;j;&lt;br /&gt;
  ...&lt;br /&gt;
  while( 1 ) {&lt;br /&gt;
    if( i == 5 )&lt;br /&gt;
      j = 8;&lt;br /&gt;
    if( j == 5 )&lt;br /&gt;
      i = 3;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Konstanten an fester Flash-Adresse =&lt;br /&gt;
&lt;br /&gt;
Wie kann man eine Konstante an entsprechender Adresse im Flash ablegen?&lt;br /&gt;
&lt;br /&gt;
Mehmet Kendi hat eine Lösung für [[AVR Studio]] &amp;amp; [[WinAVR]] in &lt;br /&gt;
[http://www.mikrocontroller.net/topic/142704#1453079] angegeben.&lt;br /&gt;
&lt;br /&gt;
= Timer =&lt;br /&gt;
== Was macht ein Timer? ==&lt;br /&gt;
Oft hört man im Forum die Aussage: Timer sind so kompliziert!&lt;br /&gt;
&lt;br /&gt;
Aber eigentlich stimmt das nicht. Ganz im Gegenteil, Timer sind eigentlich eine sehr einfache Sache. Was genau macht eigentlich ein Timer? Die Antwort lautet: er zählt unabhängig vom restlichen Programmfluss vor sich hin. Und? Was macht er noch? Nichts. Das wars schon. Im Kern ist genau das auch schon alles was ein Timer macht.&lt;br /&gt;
[[Bild:Timer_Basis.gif|framed|center|ein 8-Bit Timer bei der Arbeit]]&lt;br /&gt;
&lt;br /&gt;
== Wie schnell macht er es? ==&lt;br /&gt;
Aber so einfach ist die Sache dann doch wieder nicht. Da erhebt sich zunächst mal die Frage: wie schnell zählt denn eigentlich so ein Timer? Normalerweise ist der Timer mit der Taktfrequenz des Prozessors gekoppelt, so dass zb bei einer Taktfrequnz von 1Mhz der Timer auch genau so schnell zählt. In 1 Sekunde zählt ein Timer also von 0 bis 1000000, also 1 Mio Zählschritte. Nun kann aber ein beispielsweise 8-Bit Timer nicht bis 1000000 zählen, dazu ist er nicht groß genug. Mit 8 Bit kann man bis 255 zählen. Zählt man da dann noch 1 dazu, dann läuft der Timer über und beginnt wieder bei 0. Man kann daher ruhigen Gewissens sagen: In 1 Sekunde zählt dieser Timer 3906 mal den Bereich von 0 bis 255 (und weiter auf 0) durch (das sind 256 Zählschritte) und zuätzlich schafft er es danach noch bis 64 zu zählen. Denn 3906 * 256 + 64 = 1000000 und wir haben wieder die 1 Mio Zählschritte, die der Timer in 1 Sekunde erledigt.&lt;br /&gt;
&lt;br /&gt;
Das ist ganz schön schnell. Und weil das oft zu schnell ist, hat jeder Timer noch die Möglichkeit sogenannte Vorteiler (Prescaler) vor den Zähltakt zu schalten. Zb einen Vorteiler von 8. Anstelle von 1Mhz bekommt der Timer dann eine Frequenz von 1Mhz / 8 (= 125kHz) präsentiert. Und dementsprechend würde er in 1 Sekunde dann nur noch von 0 bis 125000 (= 1.000.000 / 8) zählen. Als 8 Bit Timer bedeutet das, dass er in 1 Sekunde jetzt nur noch 488 komplette Zyklen 0 bis 255 schafft und dann noch bis 72 zählen kann. Denn 488 * 256 + 72 = 125000&lt;br /&gt;
&lt;br /&gt;
== Das kann aber nicht alles gewesen sein? ==&lt;br /&gt;
Bis jetzt ist das alles noch unspektakulär und man fragt sich: Was hab ich jetzt davon, wenn der Timer vor sich hinzählt? Nun, die Situation ändert sich, wenn man weiß, dass man bei bestimmten Ereignissen und/oder Zählerständen etwas auslösen lassen kann. So ist zb. dieser Überlauf von 255 auf 0 so ein Ereignis. Mittels eines Interrupts kann man auf dieses Ereignis reagieren lassen und als Folge davon wird eine Funktion vollautomatisch aufgerufen. Und zwar unabhängig davon, was der µC gerade sonst so tut. Und das ist schon recht cool, denn es bedeutet, dass man regelmäßig zu erfolgende Dinge in so eine ISR (Interrupt Service Routine, die Funktion die aufgerufen wird) stecken kann und der Timer sorgt ganz von alleine dafür, dass diese Funktionalität auch tatsächlich regelmäßig ausgeführt wird. Regelmäßig bedeutet in diesem Fall dann auch wirklich regelmäßig. Denn der Timer zählt ja losgelöst von den restlichen Arbeiten, die der µC sonst so erledigt, vor sich hin. Es spielt keine Rolle, ob der µC gerade mitten in einer komplizierten Berechnung steckt oder nicht. Der Timer zählt vor sich hin, und wenn das entsprechende Ereignis eintritt, wird der Interrupt ausgelöst. Und wenn der entsprechende Interrupt mit einer ISR-Funktion gekoppelt ist, dann wird der normale Programmfluss unterbrochen und der µC arbeitet genau diese eine Funktion ab. Und zwar in regelmässigen Zeitabständen, weil ja auch der Interrupt regelmässig auftritt.&lt;br /&gt;
[[Bild:Timer_ISR.gif|framed|center|ein 8-Bit Timer löst durch seinen Overflow regelmäßige ISR Aufrufe aus]]&lt;br /&gt;
Gut, beispielsweise 488 mal in der Sekunde mag für so manchen Zweck zu oft sein, aber es gibt ja auch noch andere Vorteiler (welche steht im Datenblatt) und dann kann man ja auch innerhalb der ISR in einer lokalen Variablen mitzählen und zb nur bei jedem 2.ten Aufruf eine Aktion machen, die dann nur noch 244 mal in der Sekunde ausgeführt wird. Hier gibt es also mehrere Möglichkeiten, wie man die Aufrufhäufigkeit weiter herunterteilen kann, so dass man sich der Zahl annähert, die man benötigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Für einen Mega16.&lt;br /&gt;
// Andere Prozessoren: siehe Datenblatt wie die Timerkonfiguration einzustellen ist&lt;br /&gt;
&lt;br /&gt;
#define F_CPU 1000000UL&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
// der Timer wird mit 1Mhz getaktet. Vorteiler ist 8&lt;br /&gt;
// d.h. der Timer läuft mit 125kHz und würde daher in 1 Sekunde&lt;br /&gt;
// von 0 bis 124999 zaehlen.&lt;br /&gt;
// Aber nach jeweils 256 Zaehlungen erfolgt ein Overflow.&lt;br /&gt;
// Daher werden in 1 Sekunde 125000 / 256 = 488.28125 Overflows erzeugt&lt;br /&gt;
// Oder anders ausgedrückt:  1 / 488.2815 = 0.002048&lt;br /&gt;
// alle 0.002048 Sekunden erfolgt ein Overflow&lt;br /&gt;
//&lt;br /&gt;
ISR( TIMER0_OVF_vect )       // Overflow Interrupt Vector&lt;br /&gt;
{&lt;br /&gt;
  static uint8_t swTeiler = 0;&lt;br /&gt;
&lt;br /&gt;
  swTeiler++;&lt;br /&gt;
  if( swTeiler == 200 ) {    // nur bei jedem 200.ten Aufruf. Effektiv teilt dieses die&lt;br /&gt;
                             // die Aufruffrequenz des nachfolgenden Codes nochmal um&lt;br /&gt;
    swTeiler = 0;            // einen Faktor 200. Der nachfolgende Code wird daher nicht&lt;br /&gt;
                             // alle 0.002 Sekunden sondern alle 0.4096 Sekunden ausgeführt.&lt;br /&gt;
                             // Das reicht, dass man eine LED am Port schon blinken sieht.&lt;br /&gt;
    PORTD = PORTD ^ 0xFF;    // alle Bits am Port umdrehen, einfach damit sich was tut&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  DDRD = 0xFF;          // irgendein Port, damit wir auch was sehen&lt;br /&gt;
&lt;br /&gt;
  TIMSK |= (1&amp;lt;&amp;lt;TOIE0);  // den Overflow Interrupt des Timers freigeben&lt;br /&gt;
  TCCR0 = (1&amp;lt;&amp;lt;CS01);    // Vorteiler 8, jetzt zählt der Timer bereits&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  sei();                // und Interrupts generell freigeben&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  while( 1 )&lt;br /&gt;
  {                     // hier braucht nichts mehr gemacht werden.&lt;br /&gt;
  }                     // der Timer selbst sorgt dafür, dass die ISR Funktion&lt;br /&gt;
}                       // regelmäßig aufgerufen wird&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CTC Modus ==&lt;br /&gt;
Manchmal reicht das aber nicht. Benötigt man zb nicht 488 sondern möglichst genau 500 ISR Aufrufe in der Sekunde, so wird man weder mit Vorteiler noch durch Softwaremässiges Weiterteilen in der ISR zum Ziel kommen. Man kann natürlich die Taktfrequenz des kompletten Systems soweit umstellen, dass sich das alles ausgeht, aber oft ist das einfach nicht möglich. Was tun?&lt;br /&gt;
&lt;br /&gt;
Die Sache wäre einfacher, wenn man dem Timer vorschreiben könnte, nicht einfach nur von 0 bis 255 zu zählen, sondern wenn man ihm eine Obergrenze vorgeben könnte. Denn dann könnte man sich eine Obergrenze so bestimmen, dass dieser neue Zählbereich in 1 Sekunde ganz genau so oft durchlaufen werden kann, wie man es benötigt. Und hier kommt der sog. &amp;lt;b&amp;gt;CTC&amp;lt;/b&amp;gt; Modus ins Spiel. Denn genau darin besteht sein Wesen: Man gibt dem Timer eine Obergrenze vor. Erreicht seine Zählung diesen Wert, so wird der Timer auf 0 zurückgesetzt und beginnt wieder von vorne. Genau das was wir benötigen. Wollen wir exakt 500 ISR Ausfrufe in der Sekunde haben (bei 1 Mhz Systemtakt), dann wählen wir einen Vorteiler von 8 und setzen die Obergrenze auf 250-1 (nicht vergessen: wir brauchen 250 Zählschritte, das bedeutet der Timer muss von 0 bis 249 zählen, denn auch der Überlauf von 249 zurück auf 0 ist ein Zählschritt). Der Timer taktet dann mit 1Mhz / 8 = 125kHz und da nach jeweils 250 Zählschritten die Obergrenze erreicht ist, wird diese Obergrenze in 1 Sekunde 125000 / 250 = 500 mal erreicht. Genau so wie wir das wollten.&lt;br /&gt;
Wie wird dem Timer nun mitgeteilt, dass er eine spezielle Obergrenze benutzen soll? Nun, jeder Timer hat verschiedene Modi. Welche das bei einem konkreten µC und bei einem konkreten Timer genau sind, findet sich im Datenblatt im Abschnitt über die Timer. Normalerweise ist immer eines der letzteren Abschnitte eines jeden Kapitels im Datenblatt das interessantere: &amp;quot;Register Summary&amp;quot; oder &amp;quot;Register Description&amp;quot; genannt (die Datenblätter sind da nicht ganz einheitlich). So auch hier.&lt;br /&gt;
[[Bild:FAQ_Datenblatt_Timer_Mega16.png|framed|center|Auszug aus dem Atmel Datenblatt für den Mega16 - Suche im Datenblatt]]&lt;br /&gt;
In jedem Atmel Datenblatt findet sich bei jedem Timer immer auch besagter Abschnitt (im Inhaltsverzeichnis beim Kapitel über den jeweiligen Timer suchen. Im Datenblatt-PDF daher immer das Inhaltsverzeichnis anzeigen lassen!), und in diesem Abschnitt gibt es eine Tabelle, aus der hervorgeht, welche Modi es gibt, welche Bits dazu in den Konfigurationsregistern gesetzt werden müssen, wie sich dann die Obergrenze des Timer-Zählbereichs zusammensetzt und noch ein paar Angaben mehr. Beim Mega16 findet sich diese Tabelle für den Timer 0 zb auf Seite 83 und dort ist es die Tabelle 14.2. Diese Tabelle sieht im Datenblatt so aus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle}} &lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
! Mode || WGM01 || WGM00 || Timer/Counter || TOP || Update of || TOV0 Flag&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!      || (CTC0) || (PWM0) || Mode of Operation || || OCR0 || Set-on&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || Normal || 0xFF || Immediate || MAX&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || 1 || PWM, Phase Correct || 0xFF || TOP|| BOTTOM&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 1 || 0 || CTC || OCR0 || Immediate || MAX&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 1 || 1 || Fast PWM || 0xFF || BOTTOM || MAX&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dort beginnt man mit der Recherche und sucht sich die Bits für den gewünschten Modus raus. Mit diesen Bits sieht man dann in den Konfigurationsregistern nach, welches Bit zu welchem Register gehört und setzt es ganz einfach. In unserem Fall möchten wir den CTC Modus, also den Modus 2. Dazu muss das Bit WGM01 gesetzt werden und WGM00 muss auf 0 bleiben. Im Datenblatt ein wenig zurückscrollen bringt ans Licht, dass das Bit WGM01 im Konfigurationsregister TCCR0 angesiedelt ist. Weiters entnehmen wir der Tabelle, dass der Timer bis zum Wert in OCR0 zählen wird (die Spalte &amp;lt;b&amp;gt;TOP&amp;lt;/b&amp;gt;). Dort hinein müssen also die 250-1 als Obergrenze geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist auch noch: Dieser Spezialmodus CTC löst keinen Overflow Interrupt aus, sondern einen sog. Compare Match Interrupt. Dies deshalb, weil die gewünschte Obergrenze ja laut Datenblatt in eines der sog. Compare Match Register geschrieben werden muss (OCR0). Das sind Spezialregister, die nach jedem Zählvorgang mit dem Zählregister verglichen werden. Stimmt ihr Inhalt mit dem des Zählregisters überein, so hat man einen Compare-Match und kann daran wieder eine Aktion (ISR) knüpfen. In diesem speziellen Fall des CTC Modus beinhaltet dieser Compare Match dann auch noch das automatische Rücksetzen des Timers auf 0.&lt;br /&gt;
&lt;br /&gt;
Und natürlich können auch mehrere Techniken kombiniert werden. Z. B. CTC Modus und zusätzliches weiteres softwaremässiges Herunterteilen in der ISR sieht dann so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Für einen Mega16.&lt;br /&gt;
// Andere Prozessoren: siehe Datenblatt wie die Timerkonfiguration einzustellen ist&lt;br /&gt;
 &lt;br /&gt;
#define F_CPU 1000000UL&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
ISR( TIMER0_COMP_vect )    // Compare Match Interrupt Vector&lt;br /&gt;
{&lt;br /&gt;
  static uint8_t swTeiler = 0;&lt;br /&gt;
 &lt;br /&gt;
  swTeiler++;&lt;br /&gt;
  if( swTeiler == 200 ) {&lt;br /&gt;
    swTeiler = 0;&lt;br /&gt;
    PORTD = PORTD ^ 0xFF;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  DDRD = 0xFF;          // irgendein Port, damit wir auch was sehen&lt;br /&gt;
 &lt;br /&gt;
  TIMSK = (1&amp;lt;&amp;lt;OCIE0);               // den Output Compare Interrupt des Timers freigeben&lt;br /&gt;
  OCR0  = 250 - 1;                    // nach 250 Zaehlschritten -&amp;gt; Interrupt und Timer auf 0&lt;br /&gt;
  TCCR0 = (1&amp;lt;&amp;lt;WGM01) | (1&amp;lt;&amp;lt;CS01);    // Vorteiler 8, CTC Modus&lt;br /&gt;
 &lt;br /&gt;
  &lt;br /&gt;
  sei();                // und Interrupts generell freigeben&lt;br /&gt;
 &lt;br /&gt;
  &lt;br /&gt;
  while( 1 )&lt;br /&gt;
  {                     // hier braucht nichts mehr gemacht werden.&lt;br /&gt;
  }                     // der Timer selbst sorgt dafür, dass die ISR Funktion&lt;br /&gt;
}                       // regelmässig aufgerufen wird &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fast PWM ==&lt;br /&gt;
&lt;br /&gt;
Aber der Timer kann noch mehr. Wenn der Timer so vor sich hinzählt, dann kann man bestimmte Output-Pins des µC an diesen Timer koppeln. Der Timer kann dann diesen Pin bei erreichen von bestimmten Zählerständen ganz von alleine wahlweise auf 0 schalten, auf 1 schalten oder umdrehen.&lt;br /&gt;
&lt;br /&gt;
Was passiert da genau? Im folgenden sei von der einfachsten Form der PWM auf einem Mega16 ausgegangen: Wenn der Timer in seiner Zählerei bei 0 ist, dann schaltet er den Pin auf 1, bei einem bestimmten Zählerstand soll er den Pin wieder auf 0 zurücksetzen und ansonsten soll der Timer wie gewohnt laufend von 0 bis 255 durchzählen.&lt;br /&gt;
Es ist die Rede vom Timer-Modus 3, siehe die vorhergehende Tabelle aus dem Datenblatt.&lt;br /&gt;
&lt;br /&gt;
Der Tabelle entnehmen wir wieder: Die Bits WGM01 und WGM00 müssen auf 1 gestellt werden. Der TOP Wert (also der Wert, bis zu dem der Timer zählt) ist 0xFF (also 255) und das OCR0 Register steuert, bei welchem Zählerstand die Timerhardware den Pin wieder auf 0 zurück schaltet. Das Einschalten auf 1 ist vorgegeben (auch das kann man ändern, dazu später mehr).&lt;br /&gt;
&lt;br /&gt;
Stellt man also genau diese Konfiguration her und schreibt in das Register OCR0 beispielsweise den Wert 253, dann beginnt der Timer bei 0 zu zählen, wobei der den Ausgangspin auf 1 schaltet. Wird der Zählerstand 253 erreicht, dann schaltet der Timer den Pin wieder auf 0 zurück und zählt weiter bis 255 um dann wieder erneut bei 0 zu beginnen (und den Ausgansg-Pin wieder auf 1 zu schalten). Der Ausgangspin ist in diesem Fall also die meiste Zeit auf 1 und nur ganz kurz (während der Timer von 253 bis 255 zählt) auf 0.&lt;br /&gt;
&lt;br /&gt;
Schreibt am auf der anderen Seite in das Register OCR0 den Wert 3, dann passiert konzeptionell genau dasselbe nur mit anderen Zahlenwerten. Der Timer beginnt bei 0 zu zählen und schaltet den Ausgansgpin auf 1. Aber diesmal ist es bereits beim Zählerstand 3 so weit: Der Zählerstand stimmt mit dem Wert in OCR0 überein und als Folge davon wird der Ausgangspin wieder auf 0 gestellt. Der Timer zählt natürlich wie immer weiter bis 255 ehe dann das ganze Spiel wieder von vorne beginnt. In diesem Fall war also der Ausgangspin nur ganz kurze Zeit auf 1 (nämich in der Zeit, die der Timer benötigt um von 0 bis 3 zu zählen) und dann die meiste Zeit auf 0. Und genau darum geht es bei PWM: Mit dem Register OCR0 lässt sich daher der zeitliche Anteil steuern, in dem der Pin auf 1 liegt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Für einen Mega16.&lt;br /&gt;
// Andere Prozessoren: siehe Datenblatt wie die Timerkonfiguration einzustellen ist&lt;br /&gt;
 &lt;br /&gt;
#define F_CPU 1000000UL&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  uint8_t i;&lt;br /&gt;
&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB3);       // PB3 auf Ausgang stellen. Dieser Pin&lt;br /&gt;
                          // trägt auch die Bezeichnung OC0 und ist der Pin&lt;br /&gt;
                          // an dem der Timer 0 seine PWM ausgibt&lt;br /&gt;
&lt;br /&gt;
  OCR0  = 250;&lt;br /&gt;
  TCCR0 = (1&amp;lt;&amp;lt;WGM01) | (1&amp;lt;&amp;lt;WGM00) | (1&amp;lt;&amp;lt;CS01);    // Vorteiler 8, Fast PWM 8 Bit&lt;br /&gt;
  TCCR0 = (1&amp;lt;&amp;lt;COM01); &lt;br /&gt;
  &lt;br /&gt;
  while( 1 )&lt;br /&gt;
  {                     // hier braucht nichts mehr gemacht werden.&lt;br /&gt;
                        // der Timer selbst sorgt dafür, dass die PWM läuft&lt;br /&gt;
                        // wir wollen aber ein wenig Action haben.&lt;br /&gt;
                        // Also setzen wir das OCR0 Register auf verschiedene&lt;br /&gt;
                        // Werte, damit eine angeschlossene LED unterschiedliche&lt;br /&gt;
                        // Helligkeiten zeigt&lt;br /&gt;
    OCR0 = 30;&lt;br /&gt;
    _delay_ms( 1000 );&lt;br /&gt;
    OCR0 = 200;&lt;br /&gt;
    _delay_ms( 1000 );&lt;br /&gt;
&lt;br /&gt;
    for( i = 0; i &amp;lt; 255; ++i ) {&lt;br /&gt;
      OCR0 = i;&lt;br /&gt;
      _delay_ms( 10 );&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bleibt noch das gesetzte Bit COM01. Was hat es damit auf sich? Bisher war immer die Rede davon, das der Ausganspin bei einem Zählerstand von 0 auf 1 geschaltet wird usw. Das regelt genau dieses Bit. Im Datenblatt findet sich die Tabelle 14.4 auf der Seite 83, die genau regelt welche Bedeutung die Bits COM01 bzw COM00 haben, wenn der Timer Modus auf Fast-PWM eingestellt ist. Achtung: Je nach Timer-Modus haben diese Bits andere Bedeutungen! Man muss sich also immer die zum jeweiligen Timer-Modus gehörende Tabelle im Datenblatt suchen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:C]]&lt;br /&gt;
[[Kategorie:avr-gcc]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Logische_Verkn%C3%BCpfungen&amp;diff=82845</id>
		<title>Logische Verknüpfungen</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Logische_Verkn%C3%BCpfungen&amp;diff=82845"/>
		<updated>2014-04-30T10:57:27Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Änderung 82842 von 80.149.100.18 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;====UND====&lt;br /&gt;
&amp;lt;font size=&amp;quot;9&amp;quot;&amp;gt;&amp;lt;/FONT&amp;gt;(Konjunktion)&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;x = a \wedge b&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
   &amp;lt;td&amp;gt;[[Bild:AND.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;a&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;b&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;x&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
====ODER====&lt;br /&gt;
Verknüpfung (Disjunktion)&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;x = a \vee b&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Bild:ODER.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;a&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;b&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;x&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
====NICHT====&lt;br /&gt;
Verknüpfung (Negation)&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;x = \overline{a}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Bild:NOT.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;a&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;x&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
====NAND====&lt;br /&gt;
Verknüpfung&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;x = \overline{a \wedge b}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Bild:NAND.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;a&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;b&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;x&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
====NOR====&lt;br /&gt;
Verknüpfung (Konjunktion)&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;x = \overline{a \vee b}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Bild:NOR.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;a&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;b&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;x&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
====XOR====&lt;br /&gt;
Exklusiv-ODER-Verknüpfung (Antivalenz)&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;x = (a \wedge \overline{b}) \vee (\overline{a} \wedge b)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Bild:XOR.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;a&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;b&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;x&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
====XNOR====&lt;br /&gt;
Exklusiv-NOR-Verknüpfung (Äquivalenz)&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;x = (a \wedge b) \vee (\overline{a} \wedge \overline{b})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Bild:XNOR.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;a&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;b&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;x&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sperrgatter&#039;&#039;&#039; (Inhibition)&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;x = \overline{a} \wedge b&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Bild:Inhibition.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;a&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;b&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;x&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Subjunktion&#039;&#039;&#039; (Implikation)&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;x = \overline{a} \vee b&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Bild:Implikation.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;a&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;b&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &#039;&#039;&#039;x&#039;&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=FAQ&amp;diff=82844</id>
		<title>FAQ</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=FAQ&amp;diff=82844"/>
		<updated>2014-04-30T10:56:47Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Änderung 82843 von 164.138.237.50 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein Verzeichnis von im Forum oft gestellten und immer wieder beantworteten Fragen und den zugehörigen Antworten:&lt;br /&gt;
&lt;br /&gt;
=Wie kann ich Zahlen auf [[LCD]]/[[UART]] ausgeben?=&lt;br /&gt;
&lt;br /&gt;
Aber die Bibliothek, die du benutzt, stellt nur eine Funktion zur Verfügung, mit der man einen String ausgeben kann... Was tun? &lt;br /&gt;
&lt;br /&gt;
In den folgenden Beispielen wird eine selbstgeschriebene Funktion zur Stringausgabe auf LCD - die Funktion lcd_string() - aus dem [[AVR-GCC-Tutorial/LCD-Ansteuerung|LCD-Teil des AVR-GCC-Tutorials]] verwendet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
lcd_string( &amp;quot;Hallo Welt&amp;quot; );  // ggf. auch lcd_out() o.ä. in anderen Libraries&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um also eine Zahl (numerische Konstante oder Variableninhalt) auszugeben, muss von dieser Zahl zunächst ihre String-Repräsentation ermittelt werden. Hier geht es aber nur darum, zu zeigen wie man diese String Repräsenation erzeugen kann. Was man dann mit diesem String weiter macht, ob das dann eine LCD-Ausgabe oder eine UART-Übertragung oder das Abspeichern auf SD-Karte oder ... ist, spielt eine untergeordnete Rolle.&lt;br /&gt;
&lt;br /&gt;
Es gibt mehrere Möglichkeiten, sich die Stringrepräsentation zu erzeugen:&lt;br /&gt;
&lt;br /&gt;
===itoa() (utoa(), ltoa(), ultoa(), ftoa() )===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;itoa()&amp;lt;/b&amp;gt; ist keine C-Standardfunktion (wohl aber ihre Umkehrung &amp;lt;b&amp;gt;atoi()&amp;lt;/b&amp;gt; ). Auf manchen Compilern heisst diese Funktion dann folgerichtig &amp;lt;b&amp;gt;_itoa()&amp;lt;/b&amp;gt;, wobei der führende _ eben anzeigt, dass es sich um eine Erweiterung des C-Standards handelt. Bei [[WinAVR]] ist itoa() Bestandteil der mitgelieferten Library avr-libc, in der Library [http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html&#039;&#039;stdlib.h&#039;&#039;].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
  char Buffer[20];&lt;br /&gt;
  int i = 25;&lt;br /&gt;
&lt;br /&gt;
  itoa( i, Buffer, 10 );&lt;br /&gt;
  lcd_string( Buffer ); // ggf. auch lcd_out() o.ä. in anderen Libraries&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;itoa( i, Buffer, 10 );&amp;lt;/b&amp;gt; - Die Zahl i wird nach ASCII gewandelt und die String Repräsentierung davon wird in Buffer abgelegt. Die Basis, in der diese Wandlung erfolgt, ist das 10-er System. Wird das dritte Argument von 10 in zb. 2 oder auch 16 abgewandelt, erhält man die binäre oder eben eine hexadezimale Repräsentierung des Wertes. Auch wenn 10, 2 und 16 die häufigsten Angaben an dieser Stelle sind, kann itoa aber grundsätzlich in jedes beliebige Zahlensystem wandlen.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist, darauf zu achten, dass das Array &amp;lt;i&amp;gt;Buffer&amp;lt;/i&amp;gt; groß genug dimensioniert wird, um alle Zeichen der Textrepräsentation der Zahl aufzunehmen - inklusive der 0, die den String abschließt, sowie ein mögliches Vorzeichen.&lt;br /&gt;
&lt;br /&gt;
Anzumerken bleibt weiter, dass es normalerweise für alle Datentypen entsprechende Umwandlungsfunktionen gibt, wenn es sie für einen Datentyp gibt. Die Namensgebung lehnt sich an das Schema an: &#039;&#039;Kürzel_für_den_Datentyp to a&#039;&#039;. Eine Funktion die einen unsigned int wandelt, heißt dann utoa (oder _utoa), Floating Point heißt dann ftoa (oder _ftoa), etc.&lt;br /&gt;
&lt;br /&gt;
===sprintf()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  char Buffer[20];&lt;br /&gt;
  int i = 25;&lt;br /&gt;
&lt;br /&gt;
  sprintf( Buffer, &amp;quot;%d&amp;quot;, i );&lt;br /&gt;
  lcd_string( Buffer ); // ggf. auch lcd_out() o.ä. in anderen Libraries&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Methode funktioniert auch bei long oder float Werten. Unbedingt beachtet werden muss allerdings, dass die Typkennzeichnungen im sog. Format-String (hier &amp;quot;%d&amp;quot;) mit den tatsächlichen Typen der auszugebenden Werten übereinstimmt. Und dass der Buffer, der den Text aufnimmt, auch groß genug dimensioniert wird. Dabei sollte die 0, die den String terminiert, nicht vergessen werden.&lt;br /&gt;
&lt;br /&gt;
Mit sprintf() hat man dieselben Möglichkeiten zur Formatierung wie bei &amp;lt;b&amp;gt;printf()&amp;lt;/b&amp;gt; (siehe unten). Insbesondere gibt es natürlich die Möglichkeit die Zahl gleich in einen umgebenden Text einzubetten bzw. Formatierungen anzugeben:&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  char Buffer[20];&lt;br /&gt;
  int i = 25;&lt;br /&gt;
&lt;br /&gt;
  sprintf( Buffer, &amp;quot;Anzahl: %d Stueck&amp;quot;, i );&lt;br /&gt;
  lcd_out( Buffer );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;Haken&amp;quot; an der mächtigen Funktion sprintf() ist, daß sie auch bei minimalisierter Konfiguration verhältnismäßig viel Programmspeicher (Flash-ROM) belegt und relativ viel Prozesszeit benötigt. Daher sollte man sprintf() nur verwenden, wenn kein Speicher- und Prozesszeitmangel besteht. Sonst sollte itoa() oder eine eigene, auf die Bedürfnisse optimierte Implementierung auf jeden Fall vorgezogen werden. Der große Vorteil von sprintf liegt darin, dass man über sehr mächtige Formatiermöglichkeiten verfügt, mit der man die Ausgabe einfach steuern und an seine Bedürfnisse anpassen kann. Dinge die man mit einer Funktion wie itoa alle selbst &#039;händisch&#039; erledigen muss.&lt;br /&gt;
&lt;br /&gt;
====Formatierungen mit printf====&lt;br /&gt;
&lt;br /&gt;
Für jedes auszugebende Argument muss es im Formatstring einen entsprechenden Formatbezeichner geben. Der Aufbau eines Formatbezeichners ist immer&lt;br /&gt;
&lt;br /&gt;
  %[Modifizierer][Feldbreite][.Präzision]Typ&lt;br /&gt;
&lt;br /&gt;
(Die in eckigen Klammern [ ] angegebenen Elemente können auch weggelassen werden, wenn man sie nicht benötigt. Im einfachsten Fall benötigt man also nur das % und den Buchstaben zur Typ-Kennung.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Typ&amp;lt;/b&amp;gt; ist dabei eine Kennung, der mit dem Datentyp des jeweiligen auszugebenden Argumentes übereinstimmen muss. Einige oft benutzte Kennungen, ohne Anspruch auf Vollständigkeit, sind:&lt;br /&gt;
  &amp;lt;b&amp;gt;c&amp;lt;/b&amp;gt;    char&lt;br /&gt;
  &amp;lt;b&amp;gt;d&amp;lt;/b&amp;gt;    int&lt;br /&gt;
  &amp;lt;b&amp;gt;f&amp;lt;/b&amp;gt;    float, double&lt;br /&gt;
  &amp;lt;b&amp;gt;ld&amp;lt;/b&amp;gt;   long&lt;br /&gt;
  &amp;lt;b&amp;gt;u&amp;lt;/b&amp;gt;    unsigned int&lt;br /&gt;
  &amp;lt;b&amp;gt;lu&amp;lt;/b&amp;gt;   unsigned long&lt;br /&gt;
  &amp;lt;b&amp;gt;p&amp;lt;/b&amp;gt;    pointer&lt;br /&gt;
  &amp;lt;b&amp;gt;s&amp;lt;/b&amp;gt;    string&lt;br /&gt;
  &amp;lt;b&amp;gt;x&amp;lt;/b&amp;gt;    ein int wird ausgegeben, die Ausgabe erfolgt&lt;br /&gt;
       aber als Hexadezimalzahl&lt;br /&gt;
  &amp;lt;b&amp;gt;X&amp;lt;/b&amp;gt;    ein int wird ausgegeben, die Ausgabe erfolgt&lt;br /&gt;
       aber als Hexadezimalzahl, wobei Grossbuchstaben verwendet werden&lt;br /&gt;
&lt;br /&gt;
Der&#039;&#039;Modifizierer&#039;&#039; bestimmt, wie und womit nicht benutzte Felder des Ausgabefeldes gefüllt werden sollen, wie die Ausrichtung innerhalb des Feldes erfolgen soll und ob ein Vorzeichen auch dann ausgegeben werden soll wenn die auszugebende Zahl positiv ist. Wird kein Modifizierer angegeben, so werden nicht benutzte Felder mit einem Leerzeichen gefüllt, positive Vorzeichen unterdrückt und die Ausgabe im Feld rechts ausgerichtet.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;b&amp;gt;+&amp;lt;/b&amp;gt;    Vorzeichen wird immer ausgegeben&lt;br /&gt;
  &amp;lt;b&amp;gt;-&amp;lt;/b&amp;gt;    Die Ausgabe wird im Ausgabefeld linksbündig ausgerichtet&lt;br /&gt;
  &amp;lt;b&amp;gt;0&amp;lt;/b&amp;gt;    anstelle von Leerzeichen werden führende 0-en ausgegeben&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;Feldbreite&#039;&#039; gibt die Breite des Ausgabefeldes an, in die die Ausgabe durchgeführt werden soll. Reicht die angegebene Feldbreite nicht aus, so vergrößert printf diese Breite eigenmächtig. Die Feldbreite muß nicht angegeben werden. In diesem Fall bestimmt printf selbst die Feldbreite, so dass die Ausgabe darin Platz findet. Mit der Feldbreite hat man eine simple Möglichkeit dafür zu sorgen, dass der erzeugte String immer eine konstante Länge hat, selbst wenn die auszugebende Zahl diese Länge gar nicht benötigen würde (wichtig zb. bei Tabellen, damit die Einerstellen der Tabelleneinträge auch sauber untereinander stehen, auch dann wenn die Zahlen sich in unterschiedlichen Wertebereichen bewegen).&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;Präzision&#039;&#039; kommt nur bei float oder double Zahlen zum Einsatz. Sie legt fest, wieviele Positionen der kompletten Feldbreite für die Ausgabe von Nachkommastellen reserviert werden sollen. Auch sie muss wiederrum nicht angegeben werden und printf benutzt in so einem Fall Standardvorgaben.&lt;br /&gt;
&lt;br /&gt;
===== Beispiele =====&lt;br /&gt;
;&amp;lt;tt&amp;gt;&amp;quot;%d&amp;quot;&amp;lt;/tt&amp;gt;: Ausgabe eines Integer&lt;br /&gt;
;&amp;lt;tt&amp;gt;&amp;quot;%5d&amp;quot;&amp;lt;/tt&amp;gt;: Ausgabe eines Integer in einem Feld mit 5 Zeichen Breite&lt;br /&gt;
;&amp;lt;tt&amp;gt;&amp;quot;%05d&amp;quot;&amp;lt;/tt&amp;gt;: Ausgabe eines Integer in einem Feld mit 5 Zeichen Breite, wobei das Feld links mit führenden Nullen auf 5 Zeichen aufgefüllt wird&lt;br /&gt;
;&amp;lt;tt&amp;gt;&amp;quot;%-5d&amp;quot;&amp;lt;/tt&amp;gt;: Ausgabe eines Integer in einem Feld mit 5 Zeichen Breite. Die Zahl wird linksbündig in das Feld gestellt.&lt;br /&gt;
;&amp;lt;tt&amp;gt;&amp;quot;%6.3f&amp;quot;&amp;lt;/tt&amp;gt;: Ausgabe eines float (oder double). Die Ausgabe erfolgt in einem Feld mit 6 Zeichen Breite, wobei 3 Nachkommastellen ausgegeben werden. Achtung: In der Feldbreite ist auch ein eventuelles Vorzeichen sowie der Dezimalpunkt enthalten. Bei einer Feldbreite von 6 Zeichen und 3 Nachkommastellen, bleiben bei einer positiven Zahl daher nur 2 Positionen für den Vorkommaanteil, bei negativen sogar nur 1 Stelle (6 - 3 Nachkommastellen - 1 Dezimalpunkt - 1 Vorzeichen = 1)&lt;br /&gt;
&lt;br /&gt;
===Eigene Umwandlungsfunktionen===&lt;br /&gt;
&lt;br /&gt;
Möchte man &amp;lt;b&amp;gt;itoa()&amp;lt;/b&amp;gt; nicht benutzen oder hat es gar auf seinem System nicht zur Verfügung, dann ist es auch nicht schwer, sich selbst eine Funktion dafür zu schreiben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void ItoA( int z, char* Buffer )&lt;br /&gt;
{&lt;br /&gt;
  int i = 0;&lt;br /&gt;
  int j;&lt;br /&gt;
  char tmp;&lt;br /&gt;
  unsigned u;    // In u bearbeiten wir den Absolutbetrag von z.&lt;br /&gt;
  &lt;br /&gt;
    // ist die Zahl negativ?&lt;br /&gt;
    // gleich mal ein - hinterlassen und die Zahl positiv machen&lt;br /&gt;
    if( z &amp;lt; 0 ) {&lt;br /&gt;
      Buffer[0] = &#039;-&#039;;&lt;br /&gt;
      Buffer++;&lt;br /&gt;
      // -INT_MIN ist idR. größer als INT_MAX und nicht mehr &lt;br /&gt;
      // als int darstellbar! Man muss daher bei der Bildung &lt;br /&gt;
      // des Absolutbetrages aufpassen.&lt;br /&gt;
      u = ( (unsigned)-(z+1) ) + 1; &lt;br /&gt;
    }&lt;br /&gt;
    else { &lt;br /&gt;
      u = (unsigned)z;&lt;br /&gt;
    }&lt;br /&gt;
    // die einzelnen Stellen der Zahl berechnen&lt;br /&gt;
    do {&lt;br /&gt;
      Buffer[i++] = &#039;0&#039; + u % 10;&lt;br /&gt;
      u /= 10;&lt;br /&gt;
    } while( u &amp;gt; 0 );&lt;br /&gt;
&lt;br /&gt;
    // den String in sich spiegeln&lt;br /&gt;
    for( j = 0; j &amp;lt; i / 2; ++j ) {&lt;br /&gt;
      tmp = Buffer[j];&lt;br /&gt;
      Buffer[j] = Buffer[i-j-1];&lt;br /&gt;
      Buffer[i-j-1] = tmp;&lt;br /&gt;
    }&lt;br /&gt;
    Buffer[i] = &#039;\0&#039;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Grundprinzip ist einfach:&amp;lt;br&amp;gt;&lt;br /&gt;
Die Ermittlung der einzelnen Stellen erfolgt in der zentralen Schleife&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    do {&lt;br /&gt;
      Buffer[i++] = &#039;0&#039; + u % 10;&lt;br /&gt;
      u /= 10;&lt;br /&gt;
    } while( u &amp;gt; 0 );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
durch fortgesetzte Division durch 10 und Restbildung.&lt;br /&gt;
&lt;br /&gt;
    8392&lt;br /&gt;
&lt;br /&gt;
    8392 % 10           -&amp;gt; &amp;lt;b&amp;gt;2&amp;lt;/b&amp;gt;&lt;br /&gt;
    8392 / 10  -&amp;gt; 839&lt;br /&gt;
&lt;br /&gt;
     839 % 10           -&amp;gt; &amp;lt;b&amp;gt;9&amp;lt;/b&amp;gt;&lt;br /&gt;
     839 / 10  -&amp;gt; 83&lt;br /&gt;
&lt;br /&gt;
      83 % 10           -&amp;gt; &amp;lt;b&amp;gt;3&amp;lt;/b&amp;gt;&lt;br /&gt;
      83 / 10  -&amp;gt; 8&lt;br /&gt;
&lt;br /&gt;
       8 % 10           -&amp;gt; &amp;lt;b&amp;gt;8&amp;lt;/b&amp;gt;&lt;br /&gt;
       8 / 10  -&amp;gt; 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nur leider erhält man dadurch die einzelnen Ziffern der Zahl in umgekehrter Reihenfolge im String (&#039;2&#039; &#039;9&#039; &#039;3&#039; &#039;8&#039; anstelle von &#039;8&#039; &#039;3&#039; &#039;9&#039; &#039;2&#039;). Dies ist aber kein Problem, die nachfolgende Schleife&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  for( j = 0; j &amp;lt; i / 2; ++j ) {&lt;br /&gt;
    tmp = Buffer[j];&lt;br /&gt;
    Buffer[j] = Buffer[i-j-1];&lt;br /&gt;
    Buffer[i-j-1] = tmp;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
spiegelt den String in sich, sodass danach der String eine korrekte Repräsentation der ursprünglichen Zahl darstellt. Der Funktionsteil vor der &#039;Zerlegeschleife&#039; behandelt den Sonderfall daß die Zahl negativ ist. Negative Zahlen werden behandelt indem im Endergebnis ein &#039;-&#039; vermerkt wird und danach die Zahl positiv gemacht wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* Forenbeitrag [http://www.mikrocontroller.net/topic/67405#541885 Integer-Zahl in String mit bestimmter Zeichenlänge]&lt;br /&gt;
* Forenbeitrag [http://www.mikrocontroller.net/topic/84005#704736 (Resourcenschonend) Wert einer Variable am LCD ausgeben] von Niels Hüsken &lt;br /&gt;
* Forenbeitrag [http://www.mikrocontroller.net/topic/121526?goto=new#new Formatierte Zahlenausgabe in C] von  Peter Dannegger&lt;br /&gt;
* [[Festkommaarithmetik]]&lt;br /&gt;
&lt;br /&gt;
=Datentypen in Operationen=&lt;br /&gt;
Ein häufiges Problem betrifft die Auswertung von Ausdrücken. Konkret die Frage nach den beteiligten Datentypen.&lt;br /&gt;
zb&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
double i;&lt;br /&gt;
int j, k;&lt;br /&gt;
&lt;br /&gt;
i = j / k;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Frage lautet dann: Warum erhalte ich keine Kommastellen, ich weise doch das Ergebnis einem double zu?&lt;br /&gt;
&lt;br /&gt;
Dazu ist zu sagen, dass C nicht so funktioniert. Die Tatsache dass i eine double Variable ist, ist für die Auswahl der Operation, welche die Division durchführt, völlig irrelevant. C orientiert sich ausschliesslich an den &lt;br /&gt;
Datentypen der beteiligten Operanden, um zu entscheiden ob die Division als Integer- oder als Gleitkommadivision durchzuführen ist. Und da sowohl j als auch k ein Integer sind, wird die Division als Integerdivision durchgeführt&lt;br /&gt;
unabhängig davon, was mit dem Ergebnis weiter passiert. Erst nach der Division wird das Ergebnis in einen double überführt, um es an i zuweisen zu können. Zu diesem Zeitpunkt gibt es aber keine Kommastellen mehr, eine Integerdivision erzeugt keine. Und damit tauchen klarerweise auch im Ergebnis keine auf.&lt;br /&gt;
&lt;br /&gt;
Aus genau diesem Grund ist zb das Ergebnis von&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
double i;&lt;br /&gt;
i = 5 / 8;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
eine glatte 0 und nicht 0.625. Die Division 5 / 8 wird als Integer Division gemacht und liefert als solche keine Nachkommastellen. Wird das Ergebnis der Division in einen double umgewandelt, um es an i zuweisen zu können, ist das Kind schon in den Brunnen gefallen: Die Nachkommastellen sind schon längst weg bzw. waren nie vorhanden.&lt;br /&gt;
&lt;br /&gt;
Will man den Compiler dazu zwingen, die Division als Gleitkommadivision durchzuführen, so muss man daher dafür sorgen, dass mindestens einer der beteiligten Operanden ein double Wert ist. Dann bleibt dem Compiler nichts anderes übrig, als auch den zweiten Operanden ebenfalls zu einem double zu machen und die Operation als Gleitkommaoperation durchzuführen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
double i;&lt;br /&gt;
i = 5.0 / 8.0;&lt;br /&gt;
&lt;br /&gt;
i = (double)j / k;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generell implementiert der Compiler eine Operation immer im &#039;höchsten&#039; Datentyp, der in dieser Operation vorkommenden Operanden. Operanden in einem &#039;niedrigeren&#039; Datentyp werden automatisch immer in diesen &#039;höchsten&#039; Datentyp umgewandelt, zumindest aber int. Die Reihung orientiert sich dabei an der Regel: Ein &#039;höherer&#039; Datentyp kann alle Werte eines &#039;niedrigeren&#039; Datentyps aufnehmen.&lt;br /&gt;
&lt;br /&gt;
    int&lt;br /&gt;
    unsigned int&lt;br /&gt;
    long&lt;br /&gt;
    unsigned long&lt;br /&gt;
    long long&lt;br /&gt;
    unsigned long long&lt;br /&gt;
    double&lt;br /&gt;
    &lt;br /&gt;
float kommt in dieser Tabelle gar nicht vor, da Gleitkommaoperationen grundsätzlich immer als double-Operationen durchgeführt werden. Wohl kann es aber sein, dass double und float dieselbe Anzahl an Bits benutzen. Damit reduziert sich eine double Operation effektiv auf eine float Operation. (Anmerkung: mit dem C99-Standard hat sich dieses geändert. Dort gibt es dann auch echte float Operationen)&lt;br /&gt;
&lt;br /&gt;
Hat man also in einer Operation 2 Operanden der Datentypen int und long, so wird der int implizit zu einem long gemacht und die Operation als long Operation durchgeführt. Das Ergebnis hat dann den Datentyp long.&lt;br /&gt;
&lt;br /&gt;
==Welche Datentypen haben Konstanten==&lt;br /&gt;
&lt;br /&gt;
Auch Zahlenkonstante besitzen einen Datentyp, der selbstverständlich vom Compiler bei der Auswahl der Operation berücksichtigt wird. Hier gilt die Regel: Benutzt wird der Datentyp, der die Zahl gerade noch aufnehmen kann. Eine Zahlenkonstante 5 hat daher den Datentyp int. Die Zahl 32767 passt gerade noch in einen int, und hat daher den Datentyp int. 32768 ist für einen int bereits zu groß und hat daher den Datentyp long. 5.0 ist hingegem immer eine double-Konstante. Der Dezimalpunkt erzwingt dieses.&lt;br /&gt;
&lt;br /&gt;
Eine kleine Feinheit gibt es noch zu beachten. Konstanten in dezimaler Schreibweise haben immer einen signed Datentyp, während Konstanten in hexadezimaler bzw. oktaler Schreibweise je nach Wert einen signed oder einen unsigned Datentyp haben können.&lt;br /&gt;
&lt;br /&gt;
Möchte man einer Konstanten einen bestimmten Datentyp aufzwingen, so gibt es dazu 2 (ein halb) Möglichkeiten:&lt;br /&gt;
* Entweder man castet die Konstante in den gewünschten Datentyp&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
   (long)5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* oder man benutzt die in C dafür vorgesehene Schreibweise, indem man der Konstanten einen Suffix anhängt, der den gewünschten Datentyp beschreibt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    5L&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Beides ergibt eine dezimale 5, die vom Datentyp long ist.&lt;br /&gt;
&lt;br /&gt;
* eine Zahl in mit einem Dezimalkomma&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    5.0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ist immer eine double Zahl. Es sei denn sie hat explizit einen Suffix&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    5.0F&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
dann hat man es mit einer float Zahl zu tun.&lt;br /&gt;
&lt;br /&gt;
Die gültigen Suffixe für Zahlen sind U, L, UL und F:&lt;br /&gt;
&lt;br /&gt;
* U wie unsigned; dabei wird zuerst int angenommen. Es erfolgt eine automatische Ausweitung auf long, wenn die Zahl den Wertebereich eines unsigned int überschreitet. &lt;br /&gt;
* L wie long; die Zahl selbst kann int oder double sein.&lt;br /&gt;
* UL wie unsigned long. Eigentlich eine Zusammensetzung aus U und L&lt;br /&gt;
* F wie float.&lt;br /&gt;
&lt;br /&gt;
Präprozessordefinitionen besitzen keine eigene Datentypen, da sie eine reine Textersetzungen durchführen. Deren Inhalte können aber ggf. zu Werten aufgelöst werden, die datentypbehaftet sind.&lt;br /&gt;
&lt;br /&gt;
=Aktivieren der Floating Point Version von sprintf bei WinAVR bzw AVR-Studio=&lt;br /&gt;
[[Bild:AVR_Studio_float1.gif|thumb|right|300px|Project → Configuration Options  → Libraries → Available Link Objects]]&lt;br /&gt;
[[Bild:AVR_Studio_float2.gif|thumb|right|300px|Custom Options → Custom Compilation Options → Linker Options]]&lt;br /&gt;
Beim WinAVR/AVR-Studio wird standardmässig eine Version der printf-Bibliothek verwendet, die keine Floatingpoint-Verarbeitung unterstützt. Die meisten Programme benötigen keine Floatingpoint-Unterstützung, so dass dadurch wertvoller Programmspeicherplatz gespart werden kann.&lt;br /&gt;
&lt;br /&gt;
Benutzt man allerdings eine printf-Variante für die Ausgabe von Floatingpoint-Zahlen, so erscheint an Stelle der korrekt formatierten Zahl lediglich ein &#039;?&#039;. Dies ist ein Indiz dafür, dass die Floatingpoint-Verarbeitung im Projekt aktiviert werden muss.&lt;br /&gt;
&lt;br /&gt;
Um die Floatingpoint-Verarbeitung zu aktivieren, geht man im &#039;&#039;&#039;AVR Studio 4&#039;&#039;&#039; wie folgt vor: &lt;br /&gt;
* Menüpunkt: &#039;&#039;Project → Configuration Options&#039;&#039;&lt;br /&gt;
* Im sich öffnenden Dialog wird in der linken Navigationsleiste der Eintrag &#039;&#039;Libraries&#039;&#039; ausgewählt.&lt;br /&gt;
* Unter &#039;&#039;Available Link Objects&#039;&#039; werden Bibliotheken angeboten. Für die Aktivierung der Floatingpoint-Unterstützung sind 2 interessant&amp;lt;ref&amp;gt;&amp;lt;tt&amp;gt;libc.a&amp;lt;/tt&amp;gt; sollte nicht zu den Bibliotheken hinzugefügt werden, da sie automatisch eingebunden wird. Etwas Hintergrundinformationen gibt es in [http://www.mikrocontroller.net/topic/173630 diesem Thread.]&lt;br /&gt;
&amp;lt;/ref&amp;gt;:&lt;br /&gt;
** &amp;lt;tt&amp;gt;libprintf_flt.a&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;libm.a&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Beide Bibliotheken werden durch Aktivieren und einen Druck auf &#039;&#039;Add Library → &#039;&#039; in die rechte Spalte übernommen.&lt;br /&gt;
* Danach wählt man in der Navigationsleiste den Eintrag &#039;&#039;Custom Options&#039;&#039;.&lt;br /&gt;
* Unter &#039;&#039;Custom Compilation Options&#039;&#039; wird &#039;&#039;Linker Options&#039;&#039; ausgewählt und in das Textfeld rechts/unten folgender Text eingetragen:&lt;br /&gt;
         -Wl,-u,vfprintf&lt;br /&gt;
* Ein Druck auf &#039;&#039;Add&#039;&#039; befördert die Zeile in das Listenfeld darüber, welches Optionen für den Linker enthält.&lt;br /&gt;
* Mit &#039;&#039;OK&#039;&#039; wird die Konfiguration abgeschlossen.&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;AVR Studio 5&#039;&#039;&#039; trägt man die Optionen an anderen Stellen ein ([http://www.mikrocontroller.net/topic/221583#2219612 Beitrag von Hal Smith]): &lt;br /&gt;
*&#039;&#039;Project Properties → Toolchain → AVR/GNU C-Linker → Libraries&#039;&#039;&amp;lt;br/&amp;gt;In &#039;&#039;Libraries&#039;&#039; &amp;lt;tt&amp;gt;(-WI, -I), libprintf_flt.a libm.a&amp;lt;/tt&amp;gt; eintragen.&lt;br /&gt;
* &#039;&#039;Project Properties → Toolchain → AVR/GNU C-Linker → Miscellaneous&#039;&#039;&amp;lt;br/&amp;gt;In &#039;&#039;Other Linker Flags&#039;&#039; &amp;lt;tt&amp;gt;-Wl,-u,vfprintf&amp;lt;/tt&amp;gt; eintragen.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
= Wie funktioniert String-Verarbeitung in C? =&lt;br /&gt;
: → Siehe: &#039;&#039;[[String-Verarbeitung in C]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= struct Strukturen =&lt;br /&gt;
&lt;br /&gt;
: → Siehe: &#039;&#039;[[Strukturen in C]]&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
= Funktionszeiger =&lt;br /&gt;
&lt;br /&gt;
: → Siehe: &#039;&#039;[[Funktionszeiger in C]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Header File - wie geht das =&lt;br /&gt;
&lt;br /&gt;
Ein Header File ist im Grunde nichts anderes als eine Sammlung aller Informationen, die ein &#039;Aussenstehender&#039; benötigt, um die in einem C-File gesammlten Funktionen benutzen zu können.&lt;br /&gt;
&lt;br /&gt;
Trotzdem gibt es immer wieder Schwierigkeiten, wie sich die Sache mit Header Files und/oder #include verhält und wie man eine derartige Lösung aufbauen kann.&lt;br /&gt;
&lt;br /&gt;
Gegeben sei ein System bestehend aus 3 Funktionen&lt;br /&gt;
* main()&lt;br /&gt;
* functionA()&lt;br /&gt;
* functionB()&lt;br /&gt;
und einigen globalen Variablen. Für dieses System soll eine Aufteilung erfolgen, so dass funtionA samt seinen zugehörigen globalen Variablen in einer eigenen C-Datei residiert (FileA.c), functionB in einem eigenen File residiert (FileB.c) und main() als Hautpfunktion seine eigens C-File (Main.c) darstellt und jeweils die entsprechenden Header Files existieren.&lt;br /&gt;
&lt;br /&gt;
Kochrezeptartig kann man in vielen Fällen einfach so vorgehen:&lt;br /&gt;
Man schreibt erst mal den C-Code der Funktion, die man implementieren möchte. Zb fängt man an mit FileA.c&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileA.c&lt;br /&gt;
&lt;br /&gt;
int VarExtA;&lt;br /&gt;
int VarIntA;&lt;br /&gt;
&lt;br /&gt;
#define PortpinX PortA.1&lt;br /&gt;
&lt;br /&gt;
int functionIntA( void )&lt;br /&gt;
{&lt;br /&gt;
  VarIntA = VarExtB;&lt;br /&gt;
  functionB();&lt;br /&gt;
  PortpinX = 1;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt geht man das File, so wie es auch der Compiler macht, von oben nach unten durch schaut den Code durch. Damit functionB aufgerufen werden kann, ist ein Prototyp dafür notwendig. Der kommt aus einem Header File, welches noch nicht existiert, aber im Laufe des Prozesses entstehen und FileB.h heissen wird. FileB.h deshalb, weil die Funktion in FileB.c enthalten ist und man zur Vermeidung von Konfusion die Header Files immer gleich benennt wie die C-Files, nur eben mit einer anderen Dateiendung. FileB.h wird noch geschrieben werden, das hindert uns jetzt aber nicht daran, so zu tun als ob es dieses schon geben würde und ein entsprechender #include ergänzt. (Solange nicht compiliert wird ist das ja auch kein Problem. Irgendwo muss man ja schliesslich mal anfangen die Ergänzungen zu machen.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileA.c&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FileB.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int VarExtA;&lt;br /&gt;
int VarIntA;&lt;br /&gt;
&lt;br /&gt;
#define PortpinX PortA.1&lt;br /&gt;
&lt;br /&gt;
int functionA( void )&lt;br /&gt;
{&lt;br /&gt;
  VarIntA = VarExtB;&lt;br /&gt;
  functionB();&lt;br /&gt;
  PortpinX = 1;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gut. Die Variable VarExtB wird ebenfalls über den include hereingezogen&lt;br /&gt;
werden. Damit ist FileA.c erst mal vollständig. Da fehlt jetzt erst mal nichts mehr. Alles was in FileA.c vorkommt sind entweder C-Schlüsselwörter, durch FileA.c selbst definiert oder kommt über den #include herein.&lt;br /&gt;
&lt;br /&gt;
Der nächste Schritt ist die Überlegung: Was von dem Zeugs in FileA.C soll von anderer Stelle (von anderen C-Files aus) benutzt und verwendet werden können.&lt;br /&gt;
Welche Dinge muss FileA von sich preis geben.&lt;br /&gt;
&lt;br /&gt;
Da sind zu erst mal die beiden Variablen. Was soll mit denen geschehen?&lt;br /&gt;
VarExtA soll von aussen zugreifbar sein, VarIntA nicht. Und dann&lt;br /&gt;
natürlich die Funktion, die aufrufbar sein soll.&lt;br /&gt;
&lt;br /&gt;
Also beginnt man ein Header File für FileA.c zu schreiben, in das all das&lt;br /&gt;
reinkommt, was FileA.c nach aussen sichtbar machen will.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileA.h&lt;br /&gt;
&lt;br /&gt;
extern int VarExtA;&lt;br /&gt;
&lt;br /&gt;
int functionA( void );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Variable kriegt ein extern davor (und wird damit zu einer Deklaration), bei der Funktion wird einfach die Implementierung weggenommen und die somit zu einer Deklaration veränderte Zeile mit einem ; abgeschlossen. Wenn man möchte kann man den so geschaffenen Prototypen auch mit einem extern einleiten. Notwendig ist es aber nicht.&lt;br /&gt;
&lt;br /&gt;
Erneuter Blick aufs Header File. Kommt da irgendwas vor, was nicht&lt;br /&gt;
Standard C Schlüsselwort ist? Nein. Nichts.&lt;br /&gt;
Also ist dieses Header File somit ebenfalls in sich vollständig.&lt;br /&gt;
&lt;br /&gt;
Zur Sicherheit wird in FileA.c noch einen Include auf das&lt;br /&gt;
eigene Header File hinzugefügt, denn dann kann der Compiler überprüfen ob die&lt;br /&gt;
Angaben im Header File mit der tatsächlichen Implementierung&lt;br /&gt;
übereinstimmen. Und da VarIntA von aussen nicht sichtbar sein soll (auch&lt;br /&gt;
nicht durch Tricks), wird sie static gemacht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileA.c&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FileA.h&amp;quot;&lt;br /&gt;
#include &amp;quot;FileB.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int VarExtA;&lt;br /&gt;
static int VarIntA;&lt;br /&gt;
&lt;br /&gt;
#define PortpinX PortA.1&lt;br /&gt;
&lt;br /&gt;
int functionA( void )&lt;br /&gt;
{&lt;br /&gt;
  VarIntA = VarExtB;&lt;br /&gt;
  functionB();&lt;br /&gt;
  PortpinX = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dasselbe für FileB.c. Erst mal einfach runterschreiben&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileB.c&lt;br /&gt;
&lt;br /&gt;
int VarExtB;&lt;br /&gt;
int VarIntB;&lt;br /&gt;
&lt;br /&gt;
#define SettingB 0x01&lt;br /&gt;
&lt;br /&gt;
int functionB( void )&lt;br /&gt;
{&lt;br /&gt;
  VarExtA = 1;&lt;br /&gt;
  functionA();&lt;br /&gt;
  VarIntB = SettingB;&lt;br /&gt;
&lt;br /&gt;
  MeinePrivateFunktion();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MeinePrivateFunktion()&lt;br /&gt;
{&lt;br /&gt;
  VarIntB = 8;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
damit functionA aufgerufen werden kann, braucht es wieder einen Prototypen. Den&lt;br /&gt;
kriegt man über von FileA.h, welches daher includiert wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileB.c&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FileA.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int VarExtB;&lt;br /&gt;
int VarIntB;&lt;br /&gt;
&lt;br /&gt;
#define SettingB 0x01&lt;br /&gt;
&lt;br /&gt;
int functionB( void )&lt;br /&gt;
{&lt;br /&gt;
  VarExtA = 1;&lt;br /&gt;
  functionA();&lt;br /&gt;
  VarIntB = SettingB;&lt;br /&gt;
  MeinePrivateFunktion();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MeinePrivateFunktion()&lt;br /&gt;
{&lt;br /&gt;
  VarIntB = 8;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was noch? VarExtA. Diese Variable wird aber ebenfalls durch den #include als extern Deklaration ins FileB.c hereingezogen und ist somit bei der Übersetzung von FileB.c bekannt. Kommt sonst noch etwas vor? MeinePrivateFunktion. Diese Funktion soll nur in FileB.c benutzt werden und ist für jemanden ausserhalb FileB.c völlig uninteressant. Nichts destotrotz gilt die Regel: compiliert wird von oben nach unten und verwendet werden kann nur etwas, was auch bekannt ist. D.h. bevor der Aufruf der Funktion in functionB gemacht werden kann, muss es einen Protoypen der Funktion geben. Da diese Funktion aber nicht nach &#039;aussen&#039; exportiert wird, macht man den Protoypen gleich in das C-File mit hinein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileB.c&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FileA.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int VarExtB;&lt;br /&gt;
int VarIntB;&lt;br /&gt;
&lt;br /&gt;
#define SettingB 0x01&lt;br /&gt;
&lt;br /&gt;
void MeinePrivateFunktion();&lt;br /&gt;
&lt;br /&gt;
int functionB( void )&lt;br /&gt;
{&lt;br /&gt;
  VarExtA = 1;&lt;br /&gt;
  functionA();&lt;br /&gt;
  VarIntB = SettingB;&lt;br /&gt;
  MeinePrivateFunktion();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MeinePrivateFunktion()&lt;br /&gt;
{&lt;br /&gt;
  VarIntB = 8;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Würde man die Funktion vorziehen, so dass der Funktionskörper vor der ersten Verwendung steht, dann würde man auch keinen Protoypen benötigen. Eine Funktionsdefinition fungiert als ihr eigener Protoyp.&lt;br /&gt;
&lt;br /&gt;
Kommt sonst noch etwas vor? Nix mehr. In FileB.c wird sonst nix mehr verwendet was nicht entweder C Schlüsselwort oder im File selber oder durch einen #include reinkommt.&lt;br /&gt;
&lt;br /&gt;
Dann wieder: das Header File für B schreiben. Dabei einfach nur überlegen: was soll von FileB.c nach aussen getragen werden?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileB.h&lt;br /&gt;
&lt;br /&gt;
extern int VarExtB;&lt;br /&gt;
&lt;br /&gt;
int functionB( void );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und zur Sicherheit wieder ins eigene C-File includen und alle Variablen&lt;br /&gt;
(oder auch Funktionen), die von aussen nicht sichtbar sein sollen, als&lt;br /&gt;
static markieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// FileB.c&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FileB.h&amp;quot;&lt;br /&gt;
#include &amp;quot;FileA.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int VarExtB;&lt;br /&gt;
static int VarIntB;&lt;br /&gt;
&lt;br /&gt;
#define SettingB 0x01&lt;br /&gt;
&lt;br /&gt;
static void MeinePrivateFunktion();&lt;br /&gt;
&lt;br /&gt;
int functionB( void )&lt;br /&gt;
{&lt;br /&gt;
  VarExtA = 1;&lt;br /&gt;
  functionA();&lt;br /&gt;
  VarIntB = SettingB;&lt;br /&gt;
  MeinePrivateFunktion();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MeinePrivateFunktion()&lt;br /&gt;
{&lt;br /&gt;
  VarIntB = 8;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
damit bleibt nur noch main.c. Auch dieses wird erst mal einfach runtergeschrieben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int c;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  functionA();&lt;br /&gt;
  functionB();&lt;br /&gt;
  VarExtA = 1;&lt;br /&gt;
  VarExtB = c;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit functionA aufgerufen werden kann, braucht es einen Prototypen. Woher kommt er? Aus FileA.h. Also gleich mal includen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;FileA.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int c;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  functionA();&lt;br /&gt;
  functionB();&lt;br /&gt;
  VarExtA = 1;&lt;br /&gt;
  VarExtB = c;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit functionB aufgerufen werden kann, braucht es einen Prototypen. Wo&lt;br /&gt;
kommt der her? Aus FileB.h. Also noch ein #include&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;FileA.h&amp;quot;&lt;br /&gt;
#include &amp;quot;FileB.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int c;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  functionA();&lt;br /&gt;
  functionB();&lt;br /&gt;
  VarExtA = 1;&lt;br /&gt;
  VarExtB = c;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fehlt noch was? VarExtA ist durch den #include von FileA.h bereits&lt;br /&gt;
abgedeckt und VarExtB ist durch den #include von FileB.h bereits&lt;br /&gt;
abgedeckt. Also fehlt nix mehr. Auch in main.c sind damit alle Sachen&lt;br /&gt;
abgedeckt und es ist in sich vollständig.&lt;br /&gt;
&lt;br /&gt;
Das ist der Standardmechanismus:&lt;br /&gt;
* Implementierung der Funktionen im C File schreiben&lt;br /&gt;
* Überlegen, was von dieser Implementierung von aussen sichtbar sein soll.&lt;br /&gt;
* Dasjenige kommt als Deklaration ins Header File, alles andere am besten static machen.&lt;br /&gt;
* Für alles im C-File, das seinerseits woanders herkommt, gibt es einen #include, der das jeweils notwendige Header File einbindet.&lt;br /&gt;
* Werden im Header File Dinge von woanders benutzt, dann enthält das Header File einen entsprechenden #include&lt;br /&gt;
* Jedes File, sowohl Header-File als auch C-File ist in sich vollständig. Werden dort Dinge benutzt, dann müssen diese vor der Verwendung deklariert worden sein. Wie und wo diese Deklaration herkommt, ist dabei zweitrangig. Es kann sein, dass die Deklaration vor der Verwendung steht, es kann aber auch sein, dass die Deklaration über einen weiteren Include mit aufgenommen wird.&lt;br /&gt;
&lt;br /&gt;
= Ich hab da mehrere *.c und *.h Dateien. Was mache ich damit? =&lt;br /&gt;
&lt;br /&gt;
[[Bild:c-flow.svg|right|thumb|260px|C-Programmierung: Workflow]]&lt;br /&gt;
Zunächst ist es wichtig, sich zu vergegenwärtigen, wie C-Compiler und Linker zusammenarbeiten. Ein komplettes Programmier-Projekt kann und wird im Normalfall aus mehreren Quelldateien bestehen, die alle zusammengenommen das komplette Programm bilden.&lt;br /&gt;
&lt;br /&gt;
Der Prozess des Erstellens des Programmes geschieht in mehrerern Schritten:&lt;br /&gt;
;Compilieren: zunächst werden alle Einzelteile (jede *.c Datei) für sich &#039;&#039;compiliert&#039;&#039;. Dabei ensteht aus jeder c-Datei eine sogenannte Object-Datei, in der bereits der Maschinencode für die im c-File programmierten Funktionen enthalten ist&lt;br /&gt;
;Linken: die einzelnen Object-Dateien werden mit zusätzlichen Bibliotheken und dem Startup-Code zum fertigen Programm &#039;&#039;gelinkt&#039;&#039;.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
Angenommen, das komplette Projekt besteht aus 2 Dateien:&lt;br /&gt;
&lt;br /&gt;
;main.c:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int twice (int);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  twice (5);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;func.c:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int twice (int number)&lt;br /&gt;
{&lt;br /&gt;
  return 2 * number;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann werden &amp;lt;tt&amp;gt;main.c&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;func.c&amp;lt;/tt&amp;gt; &#039;&#039;unabhängig&#039;&#039; voneinander compiliert. Als Ergebnis erhält man die Dateien &amp;lt;tt&amp;gt;main.o&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;func.o&amp;lt;/tt&amp;gt;, die den besagten Object-Code enthalten.&lt;br /&gt;
Diese beiden Zwischenergebnisse werden dann zusammen mit Bibliotheken zum fertigen Programm gebunden (gelinkt), das dann ausgeführt werden kann.&lt;br /&gt;
&lt;br /&gt;
Bekommt man also von irgendwo bereits fertige *.c (und zugehörige *.h) Dateien, so genügt es, die *.c Dateien in das Projekt mit aufzunehmen. Dadurch wird das entsprechende C-File compiliert und das Ergebnis davon, das Object-file, wird dann in das fertige Programm mit eingelinkt.&lt;br /&gt;
&lt;br /&gt;
;Achtung: Da jede der C-Dateien unabhängig von allen anderen compiliert wird, bedeutet das auch, dass jede der C-Dateien in sich vollständig sein muss!&lt;br /&gt;
&lt;br /&gt;
Wie eine C-Datei in das Projekt mit aufgenommen wird, hängt im wesentlichen von der benutzten Entwicklungsumgebung ab.&lt;br /&gt;
&lt;br /&gt;
== Makefile ==&lt;br /&gt;
&lt;br /&gt;
Die zusätzliche *.c Datei wird in die SRC Zeile im makefile eingetragen.&lt;br /&gt;
&lt;br /&gt;
== AVR-Studio ==&lt;br /&gt;
&lt;br /&gt;
Hier ist es besonders einfach, eine Datei in das Projekt mit aufzunehmen. Dazu wird im Projektbaum der Knoten &amp;quot;Source Files&amp;quot; aktiviert und mit der rechten Maustaste das Kontextmenü geöffnet. Im Menü wird der Punkt &amp;quot;Add existing Source File(s)&amp;quot; ausgewählt, und anschliessend zeigt man AVR-Studio das zusätzliche C-File. AVR-Studio berücksicht dann diese Datei bei der Projekterzeugung, compiliert es und sorgt dafür, dass es zum fertigen Programm dazugelinkt wird.&lt;br /&gt;
&lt;br /&gt;
=Globale Variablen über mehrere Dateien=&lt;br /&gt;
Ein häufiger Problemkreis in der C Programmierung sind auch globale Variablen, die von mehreren *.c Dateien aus benutzt werden sollen. Was hat es damit auf sich?&lt;br /&gt;
&lt;br /&gt;
Zunächst mal muß man bei der Vereinbarung von Variablen zwischen &#039;&#039;Definition&#039;&#039; und &#039;&#039;Deklaration&#039;&#039; unterscheiden:&lt;br /&gt;
;Definition: Mit einer Definition wird der Compiler angewiesen, eine Variable tatsächlich zu erzeugen. Damit er das kann, muß ihm selbstverständlich der exakte Datentyp und auch der Name der Variablen zur Verfügung stehen. Eine Definition sorgt also dafür, dass im späteren Programm Speicherplatz für diese Variable reserviert wird&lt;br /&gt;
;Deklaration: Mit einer Deklaration teilt man dem Compiler lediglich mit, dass eine Variable existiert. An dieser Stelle soll der Compiler also keinen Speicherplatz reservieren, sondern der Compiler soll einfach nur zur Kenntniss nehmen, daß es eine Variable mit einem bestimmten Namen gibt und von welchem Datentyp sie ist.&lt;br /&gt;
&lt;br /&gt;
Aus obigem folgt sofort, dass eine Definition auch immer eine Deklaration ist. Denn dadurch, daß der Compiler angewiesen wird eine Variable auch tatsächlich zu erzeugen, folgt, dass er dazu auch dieselben Informationen benötigt, die auch in einer Deklaration angegeben werden müssen. Der einzige Unterschied: Bei einer Deklaration trägt der Compiler nur in seinen internen Tabellen ein, dass es diese Variable tatsächlich gibt, während er bei einer Definition zusätzlich auch noch dafür sorgt, dass im fertigen Programm auch Speicher für diese Variable bereitgestellt wird.&lt;br /&gt;
&lt;br /&gt;
Warum ist diese Unterscheidung wichtig?&lt;br /&gt;
&lt;br /&gt;
Weil es in C die sog. &#039;&#039;One Definition Rule&#039;&#039; (ODR). Sie besagt, dass in einem vollständigen Programm, also über alle *.c Dateien gesehen, es für eine Variable nur &amp;lt;b&amp;gt;eine&amp;lt;/b&amp;gt; Definition geben darf. Es darf allerdings beliebig viele Deklarationen geben, solange diese Deklarationen alle im Datentyp übereinstimmen. Kurz gesagt: Man darf den Compiler nur einmal auffordern, eine Variable zu erzeugen (Definition), kann sich aber beliebig oft auf diese eine Variable beziehen (Deklarationen). Aber Vorsicht! Da der Compiler jede einzelne *.c Datei für sich alleine übersetzt und dabei kein Wissen von ausserhalb benutzt, obliegt es der Verantwortung des Programmierers dafür zu sorgen, dass alle Deklarationen im Datentyp übereinstimmen. Der Compiler kann diese Einhaltung prinzipbedingt nicht überwachen!&lt;br /&gt;
&lt;br /&gt;
Woran erkennt man eine Definition bzw. Deklaration?&lt;br /&gt;
&lt;br /&gt;
Eine Definition einer globalen Variable steht immer ausserhalb eines Funktionsblocks. Zb.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int  MyData;         // Globale Variable namens MyData. Sie ist vom Typ int&lt;br /&gt;
char Name[30];       // Globales Array&lt;br /&gt;
long NrElements = 5; // Globale Variable, die auch noch initialisiert wird&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Deklaration unterscheidet sich von einer Definition in 2 Punkten&lt;br /&gt;
* Es wird das Schlüsselwort &amp;lt;tt&amp;gt;extern&amp;lt;/tt&amp;gt; vorangestellt.&lt;br /&gt;
* Es kann keine Initialisierung geben. Sobald eine Initialisierung vorhanden ist, wird das Schlüsselwort &amp;lt;tt&amp;gt;extern&amp;lt;/tt&amp;gt; ignoriert und aus der Deklaration wird eine Definition.&lt;br /&gt;
&lt;br /&gt;
Beispiele für Deklarationen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
extern int  MyData;&lt;br /&gt;
extern char Name[30];&lt;br /&gt;
extern long NrElements;&lt;br /&gt;
extern long NrElements = 5;  // Achtung: Dies ist eine Definition!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Besitzt man also 2 *.c Dateien, main.c und helpers.c, und sollen sich diese beiden Dateien eine globale Variable teilen, so muss in eine Datei eine Definition hinein, während in die andere Datei eine Deklaration derselben Variablen erfolgen muß. Traditionell werden die Definitionen in der *.c-Datei gemacht, die als Hauptdatei des Moduls fungiert, zu der diese Variable konzeptionell gehört. Im Zweifel ist das die *.c Datei, in der main() enthalten ist. Das muss nicht so sein, ist aber eine Konvention, die oft Sinn macht. Alternativ wird auch gerne oft eine eigene *.c Datei (zb. globals.c) gemacht, die einzig und alleine die Defintionen der globalen Variablen enthält.&lt;br /&gt;
&lt;br /&gt;
main.c&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int  AnzahlElemente;        // Dies ist die Definition. Hier wird die globale&lt;br /&gt;
                            // Variable AnzahlElemente tatsächlich erzeugt.&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  AnzahlElemente = 8;&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
helpers.c&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
extern int AnzahlElemente;   // Dies ist die Deklaration die auf die globale&lt;br /&gt;
                             // Variable AnzahlElemente in main.c verweist.&lt;br /&gt;
                             // Wichtig: Der Datentyp muss mit dem in main.c&lt;br /&gt;
                             // angegebenen übereinstimmen&lt;br /&gt;
&lt;br /&gt;
void foo()&lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
  j = AnzahlElemente;&lt;br /&gt;
  AnzahlElemente = 9;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Praktische Durchführung==&lt;br /&gt;
Besteht ein vollständiges Programm aus mehreren *.c Dateien, dann kann man sich vorstellen, daß es mühsam ist, alle Deklarationen immer auf gleich zu halten. Hier bietet sich der Einsatz eines Header Files an, in der die Deklarationen stehen und welches in die jeweiligen *.c Dateien inkludiert wird&lt;br /&gt;
&lt;br /&gt;
Bsp:&lt;br /&gt;
&lt;br /&gt;
Global.h&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
extern int Anzahl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
main.c&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;Global.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int Anzahl;      // auch wenn Global.h inkludiert wurde, so muss es eine&lt;br /&gt;
                 // Definition der Variablen geben. In Global.h sind ja nur&lt;br /&gt;
                 // Deklarationen.&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  Anzahl = 5;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
foo.c&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;Global.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void foo()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  Anzahl = 8;&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bar.c&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;Global.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void bar()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  j = Anzahl;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf diese Art kann man erreichen, dass zumindest alle Deklarationen ein und derselben Variablen in einem Programm übereinstimmen. Die Datei Global.h wird auch in main.c inkludiert, obwohl man das eigentlich nicht müsste, denn dort wird die Variable ja definiert. Durch die Inclusion ermöglicht man aber dem Compiler die Überprüfung ob die Deklaration auch tatsächlich mit der Definition übereinstimmt.&lt;br /&gt;
&lt;br /&gt;
Solange kein Initialisierungen der globalen Variablen notwendig sind, gibt es noch einen weiteren Trick, um sich selbst das Leben und die Verwaltung der globalen Variablen zu erleichtern.&lt;br /&gt;
Worin besteht das Problem?&lt;br /&gt;
Das Problem besteht darin, dass man bei Einführung einer neuen globalen Variablen an 2 Stellen erweitern muss: Zum einen in der Header-Datei, die die &#039;extern&#039;-Deklaration der Variablen enthält, zum anderen muss in einer C-Datei die Definition der Variablen erfolgen. Das kann man sich mit etwas Präprozessorarbeit auch einfacher machen:&lt;br /&gt;
&lt;br /&gt;
Global.h&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef EXTERN&lt;br /&gt;
#define EXTERN extern&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
EXTERN int Anzahl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
main.c&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define EXTERN&lt;br /&gt;
#include &amp;quot;Global.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  Anzahl = 5;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
foo.c&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;Global.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void foo()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  Anzahl = 8;&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie funktioniert das Ganze? Im Grunde muss man nur dafür sorgen, dass der Compiler an &#039;&#039;einer&#039;&#039; Stelle das Schlüsselwort &#039;&#039;&#039;extern&#039;&#039;&#039; ignoriert (hier in main.c) und bei allen anderen Inclusionen beibehält. Dadurch das ein Präprozessor-ifndef benutzt wird, kann dieses erreicht werden. Wird das Header File includiert und ist zu diesem Zeitpunkt das Makro &#039;&#039;&#039;EXTERN&#039;&#039;&#039; noch nicht definiert, so wird innerhalb des Header Files &#039;&#039;&#039;EXTERN&#039;&#039;&#039; zu &#039;&#039;&#039;extern&#039;&#039;&#039; definiert und damit in weiterer Folge im Quelltext &#039;&#039;&#039;EXTERN&#039;&#039;&#039; durch &#039;&#039;&#039;extern&#039;&#039;&#039; ersetzt. Wenn daher foo.c das Header File inkludiert, wird die Zeile&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
EXTERN int Anzahl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
vom Präprozessor zu&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
extern int Anzahl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
umgewandelt.&lt;br /&gt;
&lt;br /&gt;
In main.c hingegen sieht die Include-Sequenz so aus&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define EXTERN&lt;br /&gt;
#include &amp;quot;Global.h&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wenn Global.h bearbeitet wird, existiert bereits ein Makro &#039;&#039;&#039;EXTERN&#039;&#039;&#039;, das auf einen leeren Text expandiert. Dadurch wird verhindert, dass innerhalb von Global.h das Makro &#039;&#039;&#039;EXTERN&#039;&#039;&#039; mit dem Text &#039;&#039;&#039;extern&#039;&#039;&#039; belegt wird und&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
EXTERN int Anzahl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
wird daher vom Präprozessor zu&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int Anzahl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
erweitert, genau wie es benötigt wird.&lt;br /&gt;
&lt;br /&gt;
= Was hat es mit volatile auf sich =&lt;br /&gt;
Immer wieder hört man im Forum die pauschale Aussage &amp;quot;Variablen die in einer ISR verwendet werden, müssen volatile sein&amp;quot;. Nun, das ist so nicht ganz richtig.&lt;br /&gt;
Welches Problem löst denn eigentlich volatile? Was ist denn das eigentliche Problem, das einer Lösung bedarf?&lt;br /&gt;
&lt;br /&gt;
Das Problem findet sich diesmal im Optimierer eines C Compilers. C Compiler übersetzen, wenn sie optimieren dürfen, den C Code nicht direkt so, wie ihn der Programmierer geschrieben hat, sondern sie versuchen Ressourcen einzusparen. Das kann sowohl Programmspeicher als auch Laufzeit, häufig auch beides gemeinsam sein. Zu diesem Zweck untersuchen sie das Programm und versuchen in der funktional gleichwertigen, in Maschinensprache übersetzen Version, Anweisungen einzusparen. Das dürfen sie auch. Der C-Standard erlaubt Optimierungen, solange die &#039;As-If&#039;-Regel eingehalten wird. Das bedeutet: Der Compiler darf das Programm umstellen und verändern, solange die Programmergebnisse dieselben bleiben. Eben &amp;quot;As-if&amp;quot; die Optimierung nie stattgefunden hätte.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir ein Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  i = 2;&lt;br /&gt;
&lt;br /&gt;
  if( i == 5 )&lt;br /&gt;
    j = 8;&lt;br /&gt;
  else&lt;br /&gt;
    j = 6;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In diesem Programmausschnitt darf der Compiler seine Kenntnisse ausnutzen. Er weiß an dieser Stelle, dass i den Wert 2 hat. Damit ist aber auch klar, dass die Bedingung niemals wahr sein kann, denn 2 kann niemals gleich 5 sein. Wenn die Bedingung aber niemals wahr sein kann, dann kann auch die Zuweisung von 8 an j niemals ausgeführt werden. Der Compiler kann also diesen Programmtext zu diesem hier kürzen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  i = 2;&lt;br /&gt;
  j = 6;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ohne das sich an den Programmergebnissen etwas ändert. Die zweite Version ist aber kürzer und wird, wegen des Wegfalles des Vergleiches, auch schneller ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Eine andere Form der Optimierung betrifft die Verwaltung von µC-Ressourcen und da wieder ganz speziell die Register. Variablen werden ja erst mal im SRAM-Speicher des µC angelegt. Um mit den Werten von Variablen arbeiten zu können, müssen diese Wert aber vom SRAM-Speicher in µC-Register überführt werden (Register kann man sich wie Speicherstellen in der eigentlichen CPU vorstellen). Nur dort können diese Werte mittels Maschinenbefehlen manipuliert werden.&lt;br /&gt;
Jetzt haben aber µC nicht beliebig viele Register. Das bedeutet aber auch, der Compiler muss darüber Buch führen, welche Werte (welche Variablen) gerade in welchen Registern liegen und wenn alle Register belegt sind, muss ein anderes Register freigeräumt werden, in dem der Wert aus dem Register wieder ins SRAM zurück übertragen wird.&lt;br /&gt;
Allerdings kostet das auch Zeit. Der Compiler wird daher versuchen, Variablen, die in einem Programmstück oft benötigt werden, für längere Zeit in den Registern zu halten, um das Registerladen bzw. -zurückschreiben einzusparen. Die Grundannahme lautet dabei immer: In Anweisungen, in denen eine Variable nicht vorkommt, kann diese Variable auch nicht verändert werden. Im Programmstück&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  while( 1 ) {&lt;br /&gt;
    if( i == 5 )&lt;br /&gt;
      j = 8;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
gibt es für i keine Möglichkeit, verändert zu werden. Der Compiler kann daher entscheiden, dass er diese Variable, *an dieser Stelle*, gar nicht aus dem SRAM laden muss, sondern sich den entsprechenden Wert in einem Register vorhält und dieses Register ausschließlich dafür reserviert. (Er könnte auch entscheiden, dass der Code nie ausgeführt werden kann, aber das ist eine andere Geschichte)&lt;br /&gt;
&lt;br /&gt;
Der springende Punkt ist nun, dass der Compiler hier eine zu kleine Sicht der Dinge hat. Betrachtet man nur dieses Code Stück, dann gibt es tatsächlich für i keine Möglichkeit, seinen Wert zu verändern. Aber die Dinge ändern sich, wenn Interrupts ins Spiel kommen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uint8_t i;&lt;br /&gt;
&lt;br /&gt;
ISR( irgendein_Interrupt )&lt;br /&gt;
{&lt;br /&gt;
  i = 5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
  while( 1 ) {&lt;br /&gt;
    if( i == 5 )&lt;br /&gt;
      j = 8;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Jetzt gibt es plötzlich eine Möglichkeit, wie i seinen Wert ändern kann: Wenn der entsprechende Interrupt ausgelöst wird, dann wird i auf den Wert 5 gesetzt. i, das ist aber nichts anderes als ein bestimmter Speicherbereich im SRAM. D.h. im SRAM wird die Variable tatsächlich korrekt auf den Wert 5 gesetzt. Nur: Als der Compiler die while-Schleife übersetzt hat, wusste er nichts davon, dass diese Möglichkeit existiert. Er hat entschieden, dass er an dieser Stelle den Wert der Variablen in einem CPU-Register halten wird, um Zugriffe einzusparen. Nur wird diese Kopie des Wertes im Register natürlich nicht verändert, wenn in der ISR das Original von i im SRAM verändert wird.&lt;br /&gt;
Fazit: Obwohl die ISR die Variable tatsächlich verändert, kriegt das der Code im while nicht mit, weil der Compiler es mit der Optimierung an dieser Stelle übertrieben hat. In der while-Schleife wird mit einer Kopie des Wertes von i in einem Register gearbeitet und nicht mit dem originalen Wert von i im SRAM.&lt;br /&gt;
&lt;br /&gt;
Und an dieser Stelle kommt jetzt volatile ins Spiel.&lt;br /&gt;
&lt;br /&gt;
volatile teilt dem Compiler mit, dass ausnahmslos alle Zugriffe auf eine Variable auch tatsächlich auszuführen sind und keine Optimierungen gemacht werden dürfen, weil eine Variable auf Wegen benutzt werden kann, die für den Compiler prinzipiell nicht einsichtig sind. Im obigen Beispiel könnte man argumentieren, dass der Compiler ja wohl die ISR bemerken könne und daher feststellen könnte, dass i tatsächlich verändert wird. Aber das stimmt so in der allgemeinen Form nicht. Niemand sagt, dass der Compiler die ISR überhaupt zu Gesicht bekommen muss, die könnte ja auch in einem ganz anderen C File stecken.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
volatile uint8_t i;&lt;br /&gt;
&lt;br /&gt;
ISR( irgendein_Interrupt )&lt;br /&gt;
{&lt;br /&gt;
  i = 5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
  while( 1 ) {&lt;br /&gt;
    if( i == 5 )&lt;br /&gt;
      j = 8;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
wird i volatile gemacht, so verbietet man damit dem Compiler explizit, Annahmen über den Datenfluss von i zu treffen. Innerhalb der Schleife muss also tatsächlich jedes Mal wieder erneut i aus dem SRAM geholt werden und mit 5 verglichen werden. Abkürzungen durch Mehrfachverwendung von Registern oder sonstigen Optimierungstricks sind nicht erlaubt. Und damit ist das Problem gelöst. Wird i in der ISR verändert, so bekommt das auch die Abfrage mit, weil ja jetzt auf jeden Fall auf das Original im SRAM zurückgegriffen wird.&lt;br /&gt;
&lt;br /&gt;
Das Gleiche gilt auch ebenso &amp;quot;in die andere Richtung&amp;quot;, wenn also i in der Schleife geändert und in der ISR nur gelesen wird. Auch hier könnte die Optimierung negativ zuschlagen und den Schreibzugriff nur auf eine lokale Kopie der Variable in einem Register durchführen (oder gar ganz wegfallen) lassen, weil der Lesezugriff außerhalb des direkten Programmflusses (in der ISR) für den Compiler nicht ersichtlich ist.&lt;br /&gt;
&lt;br /&gt;
Ein anderes Problem (das ebenfalls mittels volatile gelöst wird) sind Variablen, die tatsächlich im Code überhaupt nie aktiv verändert werden, sondern es sich um Zusatzhardware handelt, die so verschaltet ist, dass sie im Programm in Form einer Variablen auftaucht, z.B. ein Uhren-IC (oder auch ganz banal: Portpins). In diesem Fall wird z.B. die Variable für Sekunden vom Programm gar nicht vom Programm selber verändert, ändert aber trotzdem ihren Inhalt. Die Zusatzhardware selbst macht das. Aus Programmsicht handelt es sich um Speicherzellen, die magisch selbsttätig ihren Wert ändern. Und damit dürfen selbstverständlich auch hier keinerlei Annahmen über den Inhalt der Variablen getroffen werden. Eine derart angebundene externe Hardware nennt man übrigens &amp;quot;memory-mapped&amp;quot;, weil sie ihre Werte ins Memory (=Hauptspeicher) mapped (=einblendet).&lt;br /&gt;
&lt;br /&gt;
Allerdings kann volatile nur bei den Variablen sinnvoll genutzt werden, die &amp;quot;von außen&amp;quot; auch änderbar sind. Bei lokalen Variablen, auch statischen, einer Funktion kann das nur passieren, wenn ihre Adresse einer ISR z.B. durch einen globalen Pointer bekannt gemacht wird.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uint8_t *v;&lt;br /&gt;
ISR( irgendein_Interrupt )&lt;br /&gt;
{&lt;br /&gt;
  i = 5;&lt;br /&gt;
  *v = 42;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  uint8_t i; // kann sich nie unerwartet ändern -&amp;gt; volatile nutzlos, behindert nur Optimizer&lt;br /&gt;
&lt;br /&gt;
  volatile uint8_t j; // kann sich unerwartet ändern (über globalen *v)&lt;br /&gt;
  v = &amp;amp;j;&lt;br /&gt;
  ...&lt;br /&gt;
  while( 1 ) {&lt;br /&gt;
    if( i == 5 )&lt;br /&gt;
      j = 8;&lt;br /&gt;
    if( j == 5 )&lt;br /&gt;
      i = 3;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Konstanten an fester Flash-Adresse =&lt;br /&gt;
&lt;br /&gt;
Wie kann man eine Konstante an entsprechender Adresse im Flash ablegen?&lt;br /&gt;
&lt;br /&gt;
Mehmet Kendi hat eine Lösung für [[AVR Studio]] &amp;amp; [[WinAVR]] in &lt;br /&gt;
[http://www.mikrocontroller.net/topic/142704#1453079] angegeben.&lt;br /&gt;
&lt;br /&gt;
= Timer =&lt;br /&gt;
== Was macht ein Timer? ==&lt;br /&gt;
Oft hört man im Forum die Aussage: Timer sind so kompliziert!&lt;br /&gt;
&lt;br /&gt;
Aber eigentlich stimmt das nicht. Ganz im Gegenteil, Timer sind eigentlich eine sehr einfache Sache. Was genau macht eigentlich ein Timer? Die Antwort lautet: er zählt unabhängig vom restlichen Programmfluss vor sich hin. Und? Was macht er noch? Nichts. Das wars schon. Im Kern ist genau das auch schon alles was ein Timer macht.&lt;br /&gt;
[[Bild:Timer_Basis.gif|framed|center|ein 8-Bit Timer bei der Arbeit]]&lt;br /&gt;
&lt;br /&gt;
== Wie schnell macht er es? ==&lt;br /&gt;
Aber so einfach ist die Sache dann doch wieder nicht. Da erhebt sich zunächst mal die Frage: wie schnell zählt denn eigentlich so ein Timer? Normalerweise ist der Timer mit der Taktfrequenz des Prozessors gekoppelt, so dass zb bei einer Taktfrequnz von 1Mhz der Timer auch genau so schnell zählt. In 1 Sekunde zählt ein Timer also von 0 bis 1000000, also 1 Mio Zählschritte. Nun kann aber ein beispielsweise 8-Bit Timer nicht bis 1000000 zählen, dazu ist er nicht groß genug. Mit 8 Bit kann man bis 255 zählen. Zählt man da dann noch 1 dazu, dann läuft der Timer über und beginnt wieder bei 0. Man kann daher ruhigen Gewissens sagen: In 1 Sekunde zählt dieser Timer 3906 mal den Bereich von 0 bis 255 (und weiter auf 0) durch (das sind 256 Zählschritte) und zuätzlich schafft er es danach noch bis 64 zu zählen. Denn 3906 * 256 + 64 = 1000000 und wir haben wieder die 1 Mio Zählschritte, die der Timer in 1 Sekunde erledigt.&lt;br /&gt;
&lt;br /&gt;
Das ist ganz schön schnell. Und weil das oft zu schnell ist, hat jeder Timer noch die Möglichkeit sogenannte Vorteiler (Prescaler) vor den Zähltakt zu schalten. Zb einen Vorteiler von 8. Anstelle von 1Mhz bekommt der Timer dann eine Frequenz von 1Mhz / 8 (= 125kHz) präsentiert. Und dementsprechend würde er in 1 Sekunde dann nur noch von 0 bis 125000 (= 1.000.000 / 8) zählen. Als 8 Bit Timer bedeutet das, dass er in 1 Sekunde jetzt nur noch 488 komplette Zyklen 0 bis 255 schafft und dann noch bis 72 zählen kann. Denn 488 * 256 + 72 = 125000&lt;br /&gt;
&lt;br /&gt;
== Das kann aber nicht alles gewesen sein? ==&lt;br /&gt;
Bis jetzt ist das alles noch unspektakulär und man fragt sich: Was hab ich jetzt davon, wenn der Timer vor sich hinzählt? Nun, die Situation ändert sich, wenn man weiß, dass man bei bestimmten Ereignissen und/oder Zählerständen etwas auslösen lassen kann. So ist zb. dieser Überlauf von 255 auf 0 so ein Ereignis. Mittels eines Interrupts kann man auf dieses Ereignis reagieren lassen und als Folge davon wird eine Funktion vollautomatisch aufgerufen. Und zwar unabhängig davon, was der µC gerade sonst so tut. Und das ist schon recht cool, denn es bedeutet, dass man regelmäßig zu erfolgende Dinge in so eine ISR (Interrupt Service Routine, die Funktion die aufgerufen wird) stecken kann und der Timer sorgt ganz von alleine dafür, dass diese Funktionalität auch tatsächlich regelmäßig ausgeführt wird. Regelmäßig bedeutet in diesem Fall dann auch wirklich regelmäßig. Denn der Timer zählt ja losgelöst von den restlichen Arbeiten, die der µC sonst so erledigt, vor sich hin. Es spielt keine Rolle, ob der µC gerade mitten in einer komplizierten Berechnung steckt oder nicht. Der Timer zählt vor sich hin, und wenn das entsprechende Ereignis eintritt, wird der Interrupt ausgelöst. Und wenn der entsprechende Interrupt mit einer ISR-Funktion gekoppelt ist, dann wird der normale Programmfluss unterbrochen und der µC arbeitet genau diese eine Funktion ab. Und zwar in regelmässigen Zeitabständen, weil ja auch der Interrupt regelmässig auftritt.&lt;br /&gt;
[[Bild:Timer_ISR.gif|framed|center|ein 8-Bit Timer löst durch seinen Overflow regelmäßige ISR Aufrufe aus]]&lt;br /&gt;
Gut, beispielsweise 488 mal in der Sekunde mag für so manchen Zweck zu oft sein, aber es gibt ja auch noch andere Vorteiler (welche steht im Datenblatt) und dann kann man ja auch innerhalb der ISR in einer lokalen Variablen mitzählen und zb nur bei jedem 2.ten Aufruf eine Aktion machen, die dann nur noch 244 mal in der Sekunde ausgeführt wird. Hier gibt es also mehrere Möglichkeiten, wie man die Aufrufhäufigkeit weiter herunterteilen kann, so dass man sich der Zahl annähert, die man benötigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Für einen Mega16.&lt;br /&gt;
// Andere Prozessoren: siehe Datenblatt wie die Timerkonfiguration einzustellen ist&lt;br /&gt;
&lt;br /&gt;
#define F_CPU 1000000UL&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
// der Timer wird mit 1Mhz getaktet. Vorteiler ist 8&lt;br /&gt;
// d.h. der Timer läuft mit 125kHz und würde daher in 1 Sekunde&lt;br /&gt;
// von 0 bis 124999 zaehlen.&lt;br /&gt;
// Aber nach jeweils 256 Zaehlungen erfolgt ein Overflow.&lt;br /&gt;
// Daher werden in 1 Sekunde 125000 / 256 = 488.28125 Overflows erzeugt&lt;br /&gt;
// Oder anders ausgedrückt:  1 / 488.2815 = 0.002048&lt;br /&gt;
// alle 0.002048 Sekunden erfolgt ein Overflow&lt;br /&gt;
//&lt;br /&gt;
ISR( TIMER0_OVF_vect )       // Overflow Interrupt Vector&lt;br /&gt;
{&lt;br /&gt;
  static uint8_t swTeiler = 0;&lt;br /&gt;
&lt;br /&gt;
  swTeiler++;&lt;br /&gt;
  if( swTeiler == 200 ) {    // nur bei jedem 200.ten Aufruf. Effektiv teilt dieses die&lt;br /&gt;
                             // die Aufruffrequenz des nachfolgenden Codes nochmal um&lt;br /&gt;
    swTeiler = 0;            // einen Faktor 200. Der nachfolgende Code wird daher nicht&lt;br /&gt;
                             // alle 0.002 Sekunden sondern alle 0.4096 Sekunden ausgeführt.&lt;br /&gt;
                             // Das reicht, dass man eine LED am Port schon blinken sieht.&lt;br /&gt;
    PORTD = PORTD ^ 0xFF;    // alle Bits am Port umdrehen, einfach damit sich was tut&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  DDRD = 0xFF;          // irgendein Port, damit wir auch was sehen&lt;br /&gt;
&lt;br /&gt;
  TIMSK |= (1&amp;lt;&amp;lt;TOIE0);  // den Overflow Interrupt des Timers freigeben&lt;br /&gt;
  TCCR0 = (1&amp;lt;&amp;lt;CS01);    // Vorteiler 8, jetzt zählt der Timer bereits&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  sei();                // und Interrupts generell freigeben&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  while( 1 )&lt;br /&gt;
  {                     // hier braucht nichts mehr gemacht werden.&lt;br /&gt;
  }                     // der Timer selbst sorgt dafür, dass die ISR Funktion&lt;br /&gt;
}                       // regelmäßig aufgerufen wird&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CTC Modus ==&lt;br /&gt;
Manchmal reicht das aber nicht. Benötigt man zb nicht 488 sondern möglichst genau 500 ISR Aufrufe in der Sekunde, so wird man weder mit Vorteiler noch durch Softwaremässiges Weiterteilen in der ISR zum Ziel kommen. Man kann natürlich die Taktfrequenz des kompletten Systems soweit umstellen, dass sich das alles ausgeht, aber oft ist das einfach nicht möglich. Was tun?&lt;br /&gt;
&lt;br /&gt;
Die Sache wäre einfacher, wenn man dem Timer vorschreiben könnte, nicht einfach nur von 0 bis 255 zu zählen, sondern wenn man ihm eine Obergrenze vorgeben könnte. Denn dann könnte man sich eine Obergrenze so bestimmen, dass dieser neue Zählbereich in 1 Sekunde ganz genau so oft durchlaufen werden kann, wie man es benötigt. Und hier kommt der sog. &amp;lt;b&amp;gt;CTC&amp;lt;/b&amp;gt; Modus ins Spiel. Denn genau darin besteht sein Wesen: Man gibt dem Timer eine Obergrenze vor. Erreicht seine Zählung diesen Wert, so wird der Timer auf 0 zurückgesetzt und beginnt wieder von vorne. Genau das was wir benötigen. Wollen wir exakt 500 ISR Ausfrufe in der Sekunde haben (bei 1 Mhz Systemtakt), dann wählen wir einen Vorteiler von 8 und setzen die Obergrenze auf 250-1 (nicht vergessen: wir brauchen 250 Zählschritte, das bedeutet der Timer muss von 0 bis 249 zählen, denn auch der Überlauf von 249 zurück auf 0 ist ein Zählschritt). Der Timer taktet dann mit 1Mhz / 8 = 125kHz und da nach jeweils 250 Zählschritten die Obergrenze erreicht ist, wird diese Obergrenze in 1 Sekunde 125000 / 250 = 500 mal erreicht. Genau so wie wir das wollten.&lt;br /&gt;
Wie wird dem Timer nun mitgeteilt, dass er eine spezielle Obergrenze benutzen soll? Nun, jeder Timer hat verschiedene Modi. Welche das bei einem konkreten µC und bei einem konkreten Timer genau sind, findet sich im Datenblatt im Abschnitt über die Timer. Normalerweise ist immer eines der letzteren Abschnitte eines jeden Kapitels im Datenblatt das interessantere: &amp;quot;Register Summary&amp;quot; oder &amp;quot;Register Description&amp;quot; genannt (die Datenblätter sind da nicht ganz einheitlich). So auch hier.&lt;br /&gt;
[[Bild:FAQ_Datenblatt_Timer_Mega16.png|framed|center|Auszug aus dem Atmel Datenblatt für den Mega16 - Suche im Datenblatt]]&lt;br /&gt;
In jedem Atmel Datenblatt findet sich bei jedem Timer immer auch besagter Abschnitt (im Inhaltsverzeichnis beim Kapitel über den jeweiligen Timer suchen. Im Datenblatt-PDF daher immer das Inhaltsverzeichnis anzeigen lassen!), und in diesem Abschnitt gibt es eine Tabelle, aus der hervorgeht, welche Modi es gibt, welche Bits dazu in den Konfigurationsregistern gesetzt werden müssen, wie sich dann die Obergrenze des Timer-Zählbereichs zusammensetzt und noch ein paar Angaben mehr. Beim Mega16 findet sich diese Tabelle für den Timer 0 zb auf Seite 83 und dort ist es die Tabelle 14.2. Diese Tabelle sieht im Datenblatt so aus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle}} &lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
! Mode || WGM01 || WGM00 || Timer/Counter || TOP || Update of || TOV0 Flag&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!      || (CTC0) || (PWM0) || Mode of Operation || || OCR0 || Set-on&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || Normal || 0xFF || Immediate || MAX&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || 1 || PWM, Phase Correct || 0xFF || TOP|| BOTTOM&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 1 || 0 || CTC || OCR0 || Immediate || MAX&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 1 || 1 || Fast PWM || 0xFF || BOTTOM || MAX&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dort beginnt man mit der Recherche und sucht sich die Bits für den gewünschten Modus raus. Mit diesen Bits sieht man dann in den Konfigurationsregistern nach, welches Bit zu welchem Register gehört und setzt es ganz einfach. In unserem Fall möchten wir den CTC Modus, also den Modus 2. Dazu muss das Bit WGM01 gesetzt werden und WGM00 muss auf 0 bleiben. Im Datenblatt ein wenig zurückscrollen bringt ans Licht, dass das Bit WGM01 im Konfigurationsregister TCCR0 angesiedelt ist. Weiters entnehmen wir der Tabelle, dass der Timer bis zum Wert in OCR0 zählen wird (die Spalte &amp;lt;b&amp;gt;TOP&amp;lt;/b&amp;gt;). Dort hinein müssen also die 250-1 als Obergrenze geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist auch noch: Dieser Spezialmodus CTC löst keinen Overflow Interrupt aus, sondern einen sog. Compare Match Interrupt. Dies deshalb, weil die gewünschte Obergrenze ja laut Datenblatt in eines der sog. Compare Match Register geschrieben werden muss (OCR0). Das sind Spezialregister, die nach jedem Zählvorgang mit dem Zählregister verglichen werden. Stimmt ihr Inhalt mit dem des Zählregisters überein, so hat man einen Compare-Match und kann daran wieder eine Aktion (ISR) knüpfen. In diesem speziellen Fall des CTC Modus beinhaltet dieser Compare Match dann auch noch das automatische Rücksetzen des Timers auf 0.&lt;br /&gt;
&lt;br /&gt;
Und natürlich können auch mehrere Techniken kombiniert werden. Z. B. CTC Modus und zusätzliches weiteres softwaremässiges Herunterteilen in der ISR sieht dann so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Für einen Mega16.&lt;br /&gt;
// Andere Prozessoren: siehe Datenblatt wie die Timerkonfiguration einzustellen ist&lt;br /&gt;
 &lt;br /&gt;
#define F_CPU 1000000UL&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
ISR( TIMER0_COMP_vect )    // Compare Match Interrupt Vector&lt;br /&gt;
{&lt;br /&gt;
  static uint8_t swTeiler = 0;&lt;br /&gt;
 &lt;br /&gt;
  swTeiler++;&lt;br /&gt;
  if( swTeiler == 200 ) {&lt;br /&gt;
    swTeiler = 0;&lt;br /&gt;
    PORTD = PORTD ^ 0xFF;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  DDRD = 0xFF;          // irgendein Port, damit wir auch was sehen&lt;br /&gt;
 &lt;br /&gt;
  TIMSK = (1&amp;lt;&amp;lt;OCIE0);               // den Output Compare Interrupt des Timers freigeben&lt;br /&gt;
  OCR0  = 250 - 1;                    // nach 250 Zaehlschritten -&amp;gt; Interrupt und Timer auf 0&lt;br /&gt;
  TCCR0 = (1&amp;lt;&amp;lt;WGM01) | (1&amp;lt;&amp;lt;CS01);    // Vorteiler 8, CTC Modus&lt;br /&gt;
 &lt;br /&gt;
  &lt;br /&gt;
  sei();                // und Interrupts generell freigeben&lt;br /&gt;
 &lt;br /&gt;
  &lt;br /&gt;
  while( 1 )&lt;br /&gt;
  {                     // hier braucht nichts mehr gemacht werden.&lt;br /&gt;
  }                     // der Timer selbst sorgt dafür, dass die ISR Funktion&lt;br /&gt;
}                       // regelmässig aufgerufen wird &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fast PWM ==&lt;br /&gt;
&lt;br /&gt;
Aber der Timer kann noch mehr. Wenn der Timer so vor sich hinzählt, dann kann man bestimmte Output-Pins des µC an diesen Timer koppeln. Der Timer kann dann diesen Pin bei erreichen von bestimmten Zählerständen ganz von alleine wahlweise auf 0 schalten, auf 1 schalten oder umdrehen.&lt;br /&gt;
&lt;br /&gt;
Was passiert da genau? Im folgenden sei von der einfachsten Form der PWM auf einem Mega16 ausgegangen: Wenn der Timer in seiner Zählerei bei 0 ist, dann schaltet er den Pin auf 1, bei einem bestimmten Zählerstand soll er den Pin wieder auf 0 zurücksetzen und ansonsten soll der Timer wie gewohnt laufend von 0 bis 255 durchzählen.&lt;br /&gt;
Es ist die Rede vom Timer-Modus 3, siehe die vorhergehende Tabelle aus dem Datenblatt.&lt;br /&gt;
&lt;br /&gt;
Der Tabelle entnehmen wir wieder: Die Bits WGM01 und WGM00 müssen auf 1 gestellt werden. Der TOP Wert (also der Wert, bis zu dem der Timer zählt) ist 0xFF (also 255) und das OCR0 Register steuert, bei welchem Zählerstand die Timerhardware den Pin wieder auf 0 zurück schaltet. Das Einschalten auf 1 ist vorgegeben (auch das kann man ändern, dazu später mehr).&lt;br /&gt;
&lt;br /&gt;
Stellt man also genau diese Konfiguration her und schreibt in das Register OCR0 beispielsweise den Wert 253, dann beginnt der Timer bei 0 zu zählen, wobei der den Ausgangspin auf 1 schaltet. Wird der Zählerstand 253 erreicht, dann schaltet der Timer den Pin wieder auf 0 zurück und zählt weiter bis 255 um dann wieder erneut bei 0 zu beginnen (und den Ausgansg-Pin wieder auf 1 zu schalten). Der Ausgangspin ist in diesem Fall also die meiste Zeit auf 1 und nur ganz kurz (während der Timer von 253 bis 255 zählt) auf 0.&lt;br /&gt;
&lt;br /&gt;
Schreibt am auf der anderen Seite in das Register OCR0 den Wert 3, dann passiert konzeptionell genau dasselbe nur mit anderen Zahlenwerten. Der Timer beginnt bei 0 zu zählen und schaltet den Ausgansgpin auf 1. Aber diesmal ist es bereits beim Zählerstand 3 so weit: Der Zählerstand stimmt mit dem Wert in OCR0 überein und als Folge davon wird der Ausgangspin wieder auf 0 gestellt. Der Timer zählt natürlich wie immer weiter bis 255 ehe dann das ganze Spiel wieder von vorne beginnt. In diesem Fall war also der Ausgangspin nur ganz kurze Zeit auf 1 (nämich in der Zeit, die der Timer benötigt um von 0 bis 3 zu zählen) und dann die meiste Zeit auf 0. Und genau darum geht es bei PWM: Mit dem Register OCR0 lässt sich daher der zeitliche Anteil steuern, in dem der Pin auf 1 liegt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Für einen Mega16.&lt;br /&gt;
// Andere Prozessoren: siehe Datenblatt wie die Timerkonfiguration einzustellen ist&lt;br /&gt;
 &lt;br /&gt;
#define F_CPU 1000000UL&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  uint8_t i;&lt;br /&gt;
&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB3);       // PB3 auf Ausgang stellen. Dieser Pin&lt;br /&gt;
                          // trägt auch die Bezeichnung OC0 und ist der Pin&lt;br /&gt;
                          // an dem der Timer 0 seine PWM ausgibt&lt;br /&gt;
&lt;br /&gt;
  OCR0  = 250;&lt;br /&gt;
  TCCR0 = (1&amp;lt;&amp;lt;WGM01) | (1&amp;lt;&amp;lt;WGM00) | (1&amp;lt;&amp;lt;CS01);    // Vorteiler 8, Fast PWM 8 Bit&lt;br /&gt;
  TCCR0 = (1&amp;lt;&amp;lt;COM01); &lt;br /&gt;
  &lt;br /&gt;
  while( 1 )&lt;br /&gt;
  {                     // hier braucht nichts mehr gemacht werden.&lt;br /&gt;
                        // der Timer selbst sorgt dafür, dass die PWM läuft&lt;br /&gt;
                        // wir wollen aber ein wenig Action haben.&lt;br /&gt;
                        // Also setzen wir das OCR0 Register auf verschiedene&lt;br /&gt;
                        // Werte, damit eine angeschlossene LED unterschiedliche&lt;br /&gt;
                        // Helligkeiten zeigt&lt;br /&gt;
    OCR0 = 30;&lt;br /&gt;
    _delay_ms( 1000 );&lt;br /&gt;
    OCR0 = 200;&lt;br /&gt;
    _delay_ms( 1000 );&lt;br /&gt;
&lt;br /&gt;
    for( i = 0; i &amp;lt; 255; ++i ) {&lt;br /&gt;
      OCR0 = i;&lt;br /&gt;
      _delay_ms( 10 );&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bleibt noch das gesetzte Bit COM01. Was hat es damit auf sich? Bisher war immer die Rede davon, das der Ausganspin bei einem Zählerstand von 0 auf 1 geschaltet wird usw. Das regelt genau dieses Bit. Im Datenblatt findet sich die Tabelle 14.4 auf der Seite 83, die genau regelt welche Bedeutung die Bits COM01 bzw COM00 haben, wenn der Timer Modus auf Fast-PWM eingestellt ist. Achtung: Je nach Timer-Modus haben diese Bits andere Bedeutungen! Man muss sich also immer die zum jeweiligen Timer-Modus gehörende Tabelle im Datenblatt suchen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:C]]&lt;br /&gt;
[[Kategorie:avr-gcc]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_LCD&amp;diff=82668</id>
		<title>AVR-Tutorial: LCD</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_LCD&amp;diff=82668"/>
		<updated>2014-04-16T15:28:23Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Vandalismus&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Kaum ein elektronisches Gerät kommt heutzutage noch ohne ein LCD daher. Ist doch auch praktisch, Informationen im Klartext anzeigen zu können, ohne irgendwelche LEDs blinken zu lassen. Kein Wunder also, dass die häufigste Frage in Mikrocontroller-Foren ist: &amp;quot;Wie kann ich ein LCD anschließen?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Das LCD und sein Controller==&lt;br /&gt;
&lt;br /&gt;
Die meisten Text-LCDs verwenden den Controller [[HD44780|&#039;&#039;&#039;HD44780&#039;&#039;&#039;]] oder einen kompatiblen (z.&amp;amp;nbsp;B. KS0070) und haben 14 oder 16 Pins.&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Pinbelegung ist meist (Ausnahme z.&amp;amp;nbsp;B. TC1602E (Pollin 120420): V&amp;lt;sub&amp;gt;DD&amp;lt;/sub&amp;gt; und V&amp;lt;sub&amp;gt;SS&amp;lt;/sub&amp;gt; vertauscht) folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;ACHTUNG: Es gibt Displays mit abweichender Anschluss-Belegung, falscher Anschluss kann zur Zerstörung führen! Daher immer das zugehörige Datenblatt zu Rate ziehen!&amp;lt;/span&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Einzelheiten unter [http://www.mikrocontroller.net/articles/HD44780 Artikel zum Controller HD44780]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
! Pin # || Bezeichnung || Funktion&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  V&amp;lt;sub&amp;gt;SS&amp;lt;/sub&amp;gt; (selten: V&amp;lt;sub&amp;gt;DD&amp;lt;/sub&amp;gt;)&lt;br /&gt;
||  GND (selten: +5 V)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  2&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  V&amp;lt;sub&amp;gt;DD&amp;lt;/sub&amp;gt; (selten: V&amp;lt;sub&amp;gt;SS&amp;lt;/sub&amp;gt;)&lt;br /&gt;
||  +5 V (selten: GND)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  3&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  V&amp;lt;sub&amp;gt;EE&amp;lt;/sub&amp;gt;, V0, V5&lt;br /&gt;
||  Kontrastspannung (-5 V / 0 V bis 5 V)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  4&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  RS&lt;br /&gt;
||  Register Select (0=Befehl/Status 1=Daten)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  5&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  RW&lt;br /&gt;
||  1=Read 0=Write&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  6&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  E&lt;br /&gt;
||  0=Disable 1=Enable&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  7&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  DB0&lt;br /&gt;
||  Datenbit 0&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  8&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  DB1&lt;br /&gt;
||  Datenbit 1&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  9&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  DB2&lt;br /&gt;
||  Datenbit 2&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  10&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  DB3&lt;br /&gt;
||  Datenbit 3&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  11&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  DB4&lt;br /&gt;
||  Datenbit 4&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  12&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  DB5&lt;br /&gt;
||  Datenbit 5&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  13&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  DB6&lt;br /&gt;
||  Datenbit 6&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  14&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  DB7&lt;br /&gt;
||  Datenbit 7&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  15&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  A&lt;br /&gt;
||  LED-Beleuchtung, meist Anode&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  16&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  K&lt;br /&gt;
||  LED-Beleuchtung, meist Kathode&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung: Unbedingt von der richtigen Seite zu zählen anfangen! Meistens ist das Pin1-Pad eckig oder daneben eine kleine 1 auf der LCD-Platine, ansonsten im Datenblatt nachschauen.&lt;br /&gt;
&lt;br /&gt;
Bei der DIL-Version (2x7, 2x8 Kontakte) auch darauf achten, auf welcher Platinen-Seite der Stecker montiert wird: auf der falschen (meist hinteren) Seite sind dann die Flachbandleitungen 1 und 2, 3 und 4  usw. vertauscht. Das kann man kompensieren, indem man es auf der anderen Kabelseite genauso permutiert oder es auf dem Layout bewusst so legt (Stecker auf der Bottom-Seite plazieren). Man kann es NICHT kompensieren, indem man das Flachbandkabel auf der anderen Seite in den Stecker führt.&lt;br /&gt;
&lt;br /&gt;
Bei LCDs mit 16-poligem Anschluss sind die beiden letzten Pins für die Hintergrundbeleuchtung reserviert. Hier unbedingt das Datenblatt zu Rate ziehen. Die beiden Anschlüsse sind je nach Hersteller verdreht beschaltet. Falls kein Datenblatt vorliegt, kann man mit einem Durchgangsprüfer feststellen, welcher Anschluss mit Masse (GND) verbunden ist.&lt;br /&gt;
&lt;br /&gt;
V&amp;lt;sub&amp;gt;SS&amp;lt;/sub&amp;gt; wird ganz einfach an GND angeschlossen und V&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt;=V&amp;lt;sub&amp;gt;DD&amp;lt;/sub&amp;gt; an +5 V. V&amp;lt;sub&amp;gt;EE&amp;lt;/sub&amp;gt; = V0 = V5 kann man testweise auch an GND legen. Wenn das LCD dann zu dunkel sein sollte, muss man ein 10k&amp;amp;Omega;-Potentiometer zwischen GND und 5 V schalten, mit dem Schleifer an V&amp;lt;sub&amp;gt;EE&amp;lt;/sub&amp;gt;. Meist kann man den +5 V-Anschluss am Poti weglassen, da im Display ein Pull-up-Widerstand ist:&lt;br /&gt;
&lt;br /&gt;
[[Bild:LCD_Vee.gif|framed|center| Gewinnung der Kontrastspannung]]&lt;br /&gt;
&lt;br /&gt;
Wenn der Kontrast zu schwach sein sollte (z.B. bei tiefen Temperaturen), kann man anstelle von GND eine negative Spannung ans Kontrast-Poti legen. Diese kann bis -5 V gehen und kann leicht aus einem Timerpin des µC, einem Widerstand, zwei Dioden und zwei Kondensatoren erzeugt werden. So wird auch ein digital einstellbarer Kontrast mittels PWM ermöglicht.&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei verschiedene Möglichkeiten zur Ansteuerung eines solchen Displays: den &#039;&#039;&#039;8-Bit-&#039;&#039;&#039; und den &#039;&#039;&#039;4-Bit-&#039;&#039;&#039;Modus.&lt;br /&gt;
* Für den &#039;&#039;&#039;8-Bit-Modus&#039;&#039;&#039; werden (wie der Name schon sagt) alle acht Datenleitungen zur Ansteuerung verwendet, somit kann durch einen Zugriff immer ein ganzes Byte übertragen werden.&lt;br /&gt;
* Der &#039;&#039;&#039;4-Bit-Modus&#039;&#039;&#039; verwendet nur die oberen vier Datenleitungen (&#039;&#039;&#039;DB4-DB7&#039;&#039;&#039;). Um ein Byte zu übertragen, braucht man somit zwei Zugriffe, wobei zuerst das höherwertige &#039;&#039;&#039;&amp;quot;Nibble&amp;quot;&#039;&#039;&#039; (= 4 Bits), also Bit 4 bis Bit 7 übertragen wird und dann das niederwertige, also Bit 0 bis Bit 3. Die unteren Datenleitungen des LCDs, die beim Lesezyklus Ausgänge sind, lässt man offen (siehe Datasheets, z.&amp;amp;nbsp;B. vom KS0070).&lt;br /&gt;
&lt;br /&gt;
Der 4-Bit-Modus hat den Vorteil, dass man 4 IO-Pins weniger benötigt als beim 8-Bit-Modus. 6 bzw. 7 Pins (eines Portes) reichen aus.&lt;br /&gt;
&lt;br /&gt;
Neben den vier Datenleitungen (DB4, DB5, DB6 und DB7) werden noch die Anschlüsse &#039;&#039;&#039;RS&#039;&#039;&#039;, &#039;&#039;&#039;RW&#039;&#039;&#039; und &#039;&#039;&#039;E&#039;&#039;&#039; benötigt. &lt;br /&gt;
&lt;br /&gt;
* Über &#039;&#039;&#039;RS&#039;&#039;&#039; wird ausgewählt, ob man einen Befehl oder ein Datenbyte an das LCD schicken möchte. Beim Schreiben gilt: ist RS Low, dann wird das ankommende Byte als Befehl interpretiert; Ist RS high, wird das Byte auf dem LCD angezeigt (genauer: ins Data-Register geschrieben, kann auch für den CG bestimmt sein). &lt;br /&gt;
* &#039;&#039;&#039;RW&#039;&#039;&#039; legt fest, ob geschrieben oder gelesen werden soll. High bedeutet lesen, low bedeutet schreiben. Wenn man RW auf lesen einstellt und RS auf Befehl, dann kann man das &#039;&#039;&#039;Busy-Flag&#039;&#039;&#039; an DB7 lesen, das anzeigt, ob das LCD den vorhergehenden Befehl fertig verarbeitet hat. Ist RS auf Daten eingestellt, dann kann man z.&amp;amp;nbsp;B. den Inhalt des Displays lesen - was jedoch nur in den wenigsten Fällen Sinn macht. Deshalb kann man RW dauerhaft auf low lassen (= an GND anschließen), so dass man noch ein IO-Pin am Controller einspart. Der Nachteil ist, dass man dann das Busy-Flag nicht lesen kann, weswegen man nach jedem Befehl ca. 50 µs (beim Return Home 2 ms, beim Clear Display 20 ms) warten sollte, um dem LCD Zeit zum Ausführen des Befehls zu geben. Dummerweise schwankt die Ausführungszeit von Display zu Display und ist auch von der Betriebsspannung abhängig. Für professionellere Sachen also lieber den IO-Pin opfern und Busy abfragen.&lt;br /&gt;
* Der &#039;&#039;&#039;E&#039;&#039;&#039; Anschluss schließlich signalisiert dem LCD, dass die übrigen Datenleitungen jetzt korrekte Pegel angenommen haben und es die gewünschten Daten von den Datenleitungen bzw. Kommandos von den Datenleitungen übernehmen kann. Beim Lesen gibt das Display die Daten / Status so lange aus, wie E high ist. Beim Schreiben übernimmt das Display die Daten mit der fallenden Flanke.&lt;br /&gt;
&lt;br /&gt;
== Anschluss an den Controller ==&lt;br /&gt;
&lt;br /&gt;
Jetzt, da wir wissen, welche Anschlüsse das LCD benötigt, können wir das LCD mit dem Mikrocontroller verbinden: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;ACHTUNG: Es gibt Displays mit abweichender Anschluss-Belegung (z. B. TC1602E (Pollin 120420): Vdd und Vss vertauscht), falscher Anschluss kann zur Zerstörung führen! Daher immer das zugehörige Datenblatt zu Rate ziehen.&amp;lt;/span&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Einzelheiten unter [http://www.mikrocontroller.net/articles/HD44780 Artikel zum Controller HD44780]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!Pinnummer&amp;lt;BR&amp;gt;LCD || Bezeichnung || Anschluss&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |1 || V&amp;lt;sub&amp;gt;SS&amp;lt;/sub&amp;gt; || GND (beim TC1602E: V&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |2 || V&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt; || +5 V (beim TC1602E: Gnd)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |3 || V&amp;lt;sub&amp;gt;EE&amp;lt;/sub&amp;gt; || GND oder [[Potentiometer | Poti]] &lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |4 || RS || PD4 am AVR&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |5 || RW || GND &lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |6 || E || PD5 am AVR&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |7 || DB0 || nicht angeschlossen &lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |8 || DB1 || nicht angeschlossen&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |9 || DB2 || nicht angeschlossen&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |10 || DB3 || nicht angeschlossen&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |11 || DB4 || PD0 am AVR&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |12 || DB5 || PD1 am AVR&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |13 || DB6 || PD2 am AVR&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |14 || DB7 || PD3 am AVR&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |15 || A || Vorsicht! Meistens nicht direkt an +5 V abschließbar,&amp;lt;br /&amp;gt; sondern nur über einen Vorwiderstand, der an die Daten&amp;lt;br /&amp;gt;der Hintergrundbeleuchtung angepasst werden muss.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |16 || K || GND&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ok. Alles ist verbunden. Wenn man jetzt den Strom einschaltet, sollten ein oder zwei schwarze Balken auf dem Display angezeigt werden. &lt;br /&gt;
&lt;br /&gt;
Doch wie bekommt man jetzt die Befehle und Daten in das Display? Dazu muss das LCD initialisiert werden und man muss Befehle (Commands) und seine Daten an das LCD senden. Weil die Initialisierung ein Spezialfall der Übertragung von Befehlen ist, im Folgenden zunächst die Erklärung für die Übertragung von Werten an das LCD.&lt;br /&gt;
&lt;br /&gt;
== Ansteuerung des LCDs im 4-Bit-Modus ==&lt;br /&gt;
&lt;br /&gt;
Um ein Byte zu übertragen, muss man es erstmal in die beiden Nibbles zerlegen, die getrennt übertragen werden. Da das obere Nibble (Bit 4 - Bit 7) als erstes übertragen wird, die 4 Datenleitungen jedoch an die vier unteren Bits des Port D angeschlossen sind, muss man die beiden Nibbles des zu übertragenden Bytes erstmal vertauschen. Der AVR kennt dazu praktischerweise einen eigenen Befehl: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
           swap r16               ; vertauscht die beiden Nibbles von r16&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aus 0b00100101 wird so z.&amp;amp;nbsp;B. 0b01010010. &lt;br /&gt;
&lt;br /&gt;
Jetzt sind die Bits für die erste Phase der Übertragung an der richtigen Stelle. Trotzdem wollen wir das Ergebnis nicht einfach so mit &#039;&#039;&#039;out PORTD, r16&#039;&#039;&#039; an den Port geben. Um die Hälfte des Bytes, die jetzt nicht an die Datenleitungen des LCDs gegeben wird auf null zu setzen, verwendet man folgenden Befehl: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
           andi r16, 0b00001111   ; Nur die vier unteren (mit 1 markierten)&lt;br /&gt;
                                  ; Bits werden übernommen, alle anderen werden null&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also: Das obere Nibble wird erst mit dem unteren vertauscht, damit es unten ist. Dann wird das obere (das wir jetzt noch nicht brauchen) auf null gesetzt. &lt;br /&gt;
&lt;br /&gt;
Jetzt müssen wir dem LCD noch mitteilen, ob wir Daten oder Befehle senden wollen. Das machen wir, indem wir das Bit, an dem RS angeschlossen ist (PD4), auf 0 (Befehl senden) oder auf 1 (Daten senden) setzen. Um ein Bit in einem normalen Register zu setzen, gibt es den Befehl sbr (Set Bits in Register). Dieser Befehl unterscheidet sich jedoch von sbi (das nur für IO-Register gilt) dadurch, dass man nicht die Nummer des zu setzenden Bits angibt, sondern eine Bitmaske. Das geht so: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
           sbr r16, 0b00010000     ; Bit 4 setzen, alle anderen Bits bleiben gleich&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RS ist an PD4 angeschlossen. Wenn wir r16 an den Port D ausgeben, ist RS jetzt also high und das LCD erwartet Daten anstatt von Befehlen. &lt;br /&gt;
&lt;br /&gt;
Das Ergebnis können wir jetzt endlich direkt an den Port D übergeben: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
           out PORTD, r16&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Natürlich muss vorher der Port D auf Ausgang geschaltet werden, indem man 0xFF ins Datenrichtungsregister DDRD schreibt. &lt;br /&gt;
&lt;br /&gt;
Um dem LCD zu signalisieren, dass es das an den Datenleitungen anliegende Nibble übernehmen kann, wird die E-Leitung (Enable, an PD5 angeschlossen) auf high und kurz darauf wieder auf low gesetzt. Ein Puls an dieser Leitung teilt also dem LCD mit, das die restlichen Leitungen jetzt ihren vom Programm gewollten Pegel eingenommen haben und gültig sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
           sbi PORTD, 5              ; Enable high&lt;br /&gt;
           nop                       ; 3 Taktzyklen warten (&amp;quot;nop&amp;quot; = nichts tun)&lt;br /&gt;
           nop&lt;br /&gt;
           nop&lt;br /&gt;
           cbi PORTD, 5              ; Enable wieder low&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die eine Hälfte des Bytes wäre damit geschafft! Die andere Hälfte kommt direkt hinterher: Alles, was an der obenstehenden Vorgehensweise geändert werden muss, ist, das &amp;quot;swap&amp;quot; (Vertauschen der beiden Nibbles) wegzulassen.&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des Displays ==&lt;br /&gt;
&lt;br /&gt;
Allerdings gibt es noch ein Problem. Wenn ein LCD eingeschaltet wird, dann läuft es zunächst im 8 Bit Modus. Irgendwie muss das Display initialisiert und auf den 4 Bit Modus umgeschaltet werden, und zwar nur mit den 4 zur Verfügung stehenden Datenleitungen.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn es Probleme gibt, dann meistens an diesem Punkt. Die &amp;quot;kompatiblen&amp;quot; Kontroller sind gelegentlich doch nicht 100% identisch. Es lohnt sich, das Datenblatt (siehe Weblinks im Artikel [[LCD]]) genau zu lesen, in welcher Reihenfolge und mit welchen Abständen (Delays) die Initialisierungbefehle gesendet werden. Eine weitere Hilfe können Ansteuerungsbeispiele in Forenbeiträgen geben z.&amp;amp;nbsp;B.&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/79609#664268 (A) KS0066U oder Ähnliche --- LCD Treiber]&lt;br /&gt;
&lt;br /&gt;
=== Initialisierung für 4 Bit Modus ===&lt;br /&gt;
&lt;br /&gt;
Achtung: Im Folgenden sind alle Bytes aus Sicht des LCD-Kontrollers angegeben! Da LCD-seitig nur die Leitungen DB4 - DB7 verwendet werden, ist daher immer nur das höherwertige Nibble gültig. Durch die Art der Verschaltung (DB4 - DB7 wurde auf dem PORT an PD0 bis PD3 angeschlossen) ergibt sich eine Verschiebung, so dass das am Kontroller auszugebende Byte nibblemässig vertauscht ist!&lt;br /&gt;
&lt;br /&gt;
Die Sequenz, aus Sicht des Kontrollers, sieht so aus:&lt;br /&gt;
&lt;br /&gt;
* Nach dem Anlegen der Betriebsspannung muss eine Zeit von mindestens ca. 15ms gewartet werden, um dem LCD-Kontroller Zeit für seine eigene Initialisierung zu geben&lt;br /&gt;
* $3 ins Steuerregister schreiben (RS = 0)&lt;br /&gt;
* Mindestens 4.1ms warten&lt;br /&gt;
* $3 ins Steuerregister schreiben (RS = 0)&lt;br /&gt;
* Mindestens 100µs warten&lt;br /&gt;
* $3 ins Steuerregister schreiben (RS = 0)&lt;br /&gt;
* $2 ins Steuerregister schreiben (RS = 0), dadurch wird auf 4 Bit Daten umgestellt&lt;br /&gt;
* Ab jetzt muss für die Übertragung eines Bytes jeweils zuerst das höherwertige Nibble und dann das niederwertige Nibble übertragen werden, wie oben beschrieben&lt;br /&gt;
* Mit dem Konfigurier-Befehl $20 das Display konfigurieren (4-Bit, 1 oder 2 Zeilen, 5x7 Format)&lt;br /&gt;
* Mit den restlichen Konfigurierbefehlen die Konfiguration vervollständigen: Display ein/aus, Cursor ein/aus, etc.&lt;br /&gt;
&lt;br /&gt;
Eine Begründung, warum die ersten Befehle dreifach geschickt werden sollen, findet sich [http://www.mikrocontroller.net/topic/158983#1508510 im Forum].&lt;br /&gt;
&lt;br /&gt;
=== Initialisierung für 8 Bit Modus ===&lt;br /&gt;
&lt;br /&gt;
Der Vollständigkeit halber hier noch die notwendige Initialiserungssequenz für den 8 Bit Modus. Da hier die Daten komplett als 1 Byte übertragen werden können, sind einige Klimmzüge wie im 4 Bit Modus nicht notwendig. Begründung für die anfänglichen Wiederholungen siehe oben.&lt;br /&gt;
&lt;br /&gt;
* Nach dem Anlegen der Betriebsspannung muss eine Zeit von mindestens ca. 15ms gewartet werden, um dem LCD-Kontroller Zeit für seine eigene Initialisierung zu geben&lt;br /&gt;
* $30 ins Steuerregister schreiben (RS = 0)&lt;br /&gt;
* Mindestens 4.1ms warten&lt;br /&gt;
* $30 ins Steuerregister schreiben (RS = 0)&lt;br /&gt;
* Mindestens 100µs warten&lt;br /&gt;
* $30 ins Steuerregister schreiben (RS = 0)&lt;br /&gt;
* Mit dem Konfigurier-Befehl 0x30 das Display konfigurieren (8-Bit, 1 oder 2 Zeilen, 5x7 Format)&lt;br /&gt;
* Mit den restlichen Konfigurierbefehlen die Konfiguration vervollständigen: Display ein/aus, Cursor ein/aus, etc.&lt;br /&gt;
&lt;br /&gt;
== Routinen zur LCD-Ansteuerung im 4-Bit-Modus ==&lt;br /&gt;
&lt;br /&gt;
Im Folgenden werden die bisherigen Grundroutinen zur LCD-Ansteuerung im 4-Bit-Modus zusammengefasst und kommentiert. Die darin enthaltenen Symbole (temp1, PORTD,...) müssen in einem dazugehörenden Hauptprogramm definiert werden. Dies wird nächsten Abschnitt &#039;&#039;Anwendung&#039;&#039; weiter erklärt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;br /&gt;
;;                 LCD-Routinen                ;;&lt;br /&gt;
;;                 ============                ;;&lt;br /&gt;
;;              (c)andreas-s@web.de            ;;&lt;br /&gt;
;;                                             ;;&lt;br /&gt;
;; 4bit-Interface                              ;;&lt;br /&gt;
;; DB4-DB7:       PD0-PD3                      ;;&lt;br /&gt;
;; RS:            PD4                          ;;&lt;br /&gt;
;; E:             PD5                          ;;&lt;br /&gt;
;;                                             ;;&lt;br /&gt;
;; Takt:          4 MHz                        ;;&lt;br /&gt;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 ;sendet ein Datenbyte an das LCD&lt;br /&gt;
lcd_data:&lt;br /&gt;
           mov temp2, temp1             ; &amp;quot;Sicherungskopie&amp;quot; für&lt;br /&gt;
                                        ; die Übertragung des 2.Nibbles&lt;br /&gt;
           swap temp1                   ; Vertauschen&lt;br /&gt;
           andi temp1, 0b00001111       ; oberes Nibble auf Null setzen&lt;br /&gt;
           sbr temp1, 1&amp;lt;&amp;lt;4              ; entspricht 0b00010000 (Anm.1)&lt;br /&gt;
           out PORTD, temp1             ; ausgeben&lt;br /&gt;
           rcall lcd_enable             ; Enable-Routine aufrufen&lt;br /&gt;
                                        ; 2. Nibble, kein swap da es schon&lt;br /&gt;
                                        ; an der richtigen stelle ist&lt;br /&gt;
           andi temp2, 0b00001111       ; obere Hälfte auf Null setzen &lt;br /&gt;
           sbr temp2, 1&amp;lt;&amp;lt;4              ; entspricht 0b00010000&lt;br /&gt;
           out PORTD, temp2             ; ausgeben&lt;br /&gt;
           rcall lcd_enable             ; Enable-Routine aufrufen&lt;br /&gt;
           rcall delay50us              ; Delay-Routine aufrufen&lt;br /&gt;
           ret                          ; zurück zum Hauptprogramm&lt;br /&gt;
&lt;br /&gt;
 ; sendet einen Befehl an das LCD&lt;br /&gt;
lcd_command:                            ; wie lcd_data, nur RS=0&lt;br /&gt;
           mov temp2, temp1&lt;br /&gt;
           swap temp1&lt;br /&gt;
           andi temp1, 0b00001111&lt;br /&gt;
           out PORTD, temp1&lt;br /&gt;
           rcall lcd_enable&lt;br /&gt;
           andi temp2, 0b00001111&lt;br /&gt;
           out PORTD, temp2&lt;br /&gt;
           rcall lcd_enable&lt;br /&gt;
           rcall delay50us&lt;br /&gt;
           ret&lt;br /&gt;
&lt;br /&gt;
 ; erzeugt den Enable-Puls&lt;br /&gt;
 ;&lt;br /&gt;
 ; Bei höherem Takt (&amp;gt;= 8 MHz) kann es notwendig sein, &lt;br /&gt;
 ; vor dem Enable High 1-2 Wartetakte (nop) einzufügen. &lt;br /&gt;
 ; Siehe dazu http://www.mikrocontroller.net/topic/81974#685882&lt;br /&gt;
lcd_enable:&lt;br /&gt;
           sbi PORTD, 5                 ; Enable high&lt;br /&gt;
           nop                          ; mindestens 3 Taktzyklen warten&lt;br /&gt;
           nop&lt;br /&gt;
           nop&lt;br /&gt;
           cbi PORTD, 5                 ; Enable wieder low&lt;br /&gt;
           ret                          ; Und wieder zurück                     &lt;br /&gt;
&lt;br /&gt;
 ; Pause nach jeder Übertragung&lt;br /&gt;
delay50us:                              ; 50µs Pause (bei 4 MHz)&lt;br /&gt;
           ldi  temp1, $42&lt;br /&gt;
delay50us_:dec  temp1&lt;br /&gt;
           brne delay50us_&lt;br /&gt;
           ret                          ; wieder zurück&lt;br /&gt;
&lt;br /&gt;
 ; Längere Pause für manche Befehle&lt;br /&gt;
delay5ms:                               ; 5ms Pause (bei 4 MHz)&lt;br /&gt;
           ldi  temp1, $21&lt;br /&gt;
WGLOOP0:   ldi  temp2, $C9&lt;br /&gt;
WGLOOP1:   dec  temp2&lt;br /&gt;
           brne WGLOOP1&lt;br /&gt;
           dec  temp1&lt;br /&gt;
           brne WGLOOP0&lt;br /&gt;
           ret                          ; wieder zurück&lt;br /&gt;
&lt;br /&gt;
 ; Initialisierung: muss ganz am Anfang des Programms aufgerufen werden&lt;br /&gt;
lcd_init:&lt;br /&gt;
           ldi  temp3,50&lt;br /&gt;
powerupwait:&lt;br /&gt;
           rcall  delay5ms&lt;br /&gt;
           dec  temp3&lt;br /&gt;
           brne powerupwait&lt;br /&gt;
           ldi temp1, 0b00000011        ; muss 3mal hintereinander gesendet&lt;br /&gt;
           out PORTD, temp1             ; werden zur Initialisierung&lt;br /&gt;
           rcall lcd_enable             ; 1&lt;br /&gt;
           rcall delay5ms&lt;br /&gt;
           rcall lcd_enable             ; 2&lt;br /&gt;
           rcall delay5ms&lt;br /&gt;
           rcall lcd_enable             ; und 3!&lt;br /&gt;
           rcall delay5ms&lt;br /&gt;
           ldi temp1, 0b00000010        ; 4bit-Modus einstellen&lt;br /&gt;
           out PORTD, temp1&lt;br /&gt;
           rcall lcd_enable&lt;br /&gt;
           rcall delay5ms&lt;br /&gt;
           ldi temp1, 0b00101000        ; 4Bit / 2 Zeilen / 5x8&lt;br /&gt;
           rcall lcd_command&lt;br /&gt;
           ldi temp1, 0b00001100        ; Display ein / Cursor aus / kein Blinken&lt;br /&gt;
           rcall lcd_command&lt;br /&gt;
           ldi temp1, 0b00000100        ; inkrement / kein Scrollen&lt;br /&gt;
           rcall lcd_command&lt;br /&gt;
           ret&lt;br /&gt;
&lt;br /&gt;
 ; Sendet den Befehl zur Löschung des Displays&lt;br /&gt;
lcd_clear:&lt;br /&gt;
           ldi temp1, 0b00000001   ; Display löschen&lt;br /&gt;
           rcall lcd_command&lt;br /&gt;
           rcall delay5ms&lt;br /&gt;
           ret&lt;br /&gt;
&lt;br /&gt;
 ; Sendet den Befehl: Cursor Home&lt;br /&gt;
lcd_home:&lt;br /&gt;
           ldi temp1, 0b00000010   ; Cursor Home&lt;br /&gt;
           rcall lcd_command&lt;br /&gt;
           rcall delay5ms&lt;br /&gt;
           ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anm.1: Siehe [[Bitmanipulation]]&lt;br /&gt;
&lt;br /&gt;
Weitere Funktionen (wie z.&amp;amp;nbsp;B. Cursorposition verändern) sollten mit Hilfe der [[AVR-Tutorial:_LCD#Welche_Befehle_versteht_das_LCD.3F|Befehlscodeliste]] nicht schwer zu realisieren sein. Einfach den Code in temp laden, lcd_command aufrufen und ggf. eine Pause einfügen.&amp;lt;br&amp;gt; &lt;br /&gt;
Natürlich kann man die LCD-Ansteuerung auch an einen anderen Port des Mikrocontrollers &amp;quot;verschieben&amp;quot;: Wenn das LCD z.&amp;amp;nbsp;B. an Port B angeschlossen ist, dann reicht es, im Programm alle &amp;quot;PORTD&amp;quot; durch &amp;quot;PORTB&amp;quot; und &amp;quot;DDRD&amp;quot; durch &amp;quot;DDRB&amp;quot; zu ersetzen.&amp;lt;br&amp;gt; &lt;br /&gt;
Wer eine höhere Taktfrequenz als 4 MHz verwendet, der sollte daran denken, die Dauer der Verzögerungsschleifen anzupassen.&lt;br /&gt;
&lt;br /&gt;
==Anwendung==&lt;br /&gt;
&lt;br /&gt;
Ein Programm, das diese Routinen zur Anzeige von Text verwendet, kann z.&amp;amp;nbsp;B. so aussehen (die Datei lcd-routines.asm muss sich im gleichen Verzeichnis befinden). Nach der Initialisierung wird zuerst der Displayinhalt gelöscht. Um dem LCD ein Zeichen zu schicken, lädt man es in temp1 und ruft die Routine &amp;quot;lcd_data&amp;quot; auf. Das folgende Beispiel zeigt das Wort &amp;quot;Test&amp;quot; auf dem LCD an. &lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/sourcecode/tutorial/lcd-test.asm Download lcd-test.asm] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; .def definiert ein Synonym (Namen) für ein µC Register&lt;br /&gt;
.def temp1 = r16&lt;br /&gt;
.def temp2 = r17&lt;br /&gt;
.def temp3 = r18&lt;br /&gt;
&lt;br /&gt;
           ldi temp1, LOW(RAMEND)      ; LOW-Byte der obersten RAM-Adresse&lt;br /&gt;
           out SPL, temp1&lt;br /&gt;
           ldi temp1, HIGH(RAMEND)     ; HIGH-Byte der obersten RAM-Adresse&lt;br /&gt;
           out SPH, temp1&lt;br /&gt;
&lt;br /&gt;
           ldi temp1, 0xFF    ; Port D = Ausgang&lt;br /&gt;
           out DDRD, temp1&lt;br /&gt;
&lt;br /&gt;
           rcall lcd_init     ; Display initialisieren&lt;br /&gt;
           rcall lcd_clear    ; Display löschen&lt;br /&gt;
&lt;br /&gt;
           ldi temp1, &#039;T&#039;     ; Zeichen anzeigen&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
&lt;br /&gt;
           ldi temp1, &#039;e&#039;     ; Zeichen anzeigen&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
           &lt;br /&gt;
           ldi temp1, &#039;s&#039;     ; Zeichen anzeigen&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
&lt;br /&gt;
           ldi temp1, &#039;t&#039;     ; Zeichen anzeigen&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
&lt;br /&gt;
loop:&lt;br /&gt;
           rjmp loop&lt;br /&gt;
&lt;br /&gt;
.include &amp;quot;lcd-routines.asm&amp;quot;            ; LCD-Routinen werden hier eingefügt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für längere Texte ist die Methode, jedes Zeichen einzeln in das Register zu laden und &amp;quot;lcd_data&amp;quot; aufzurufen natürlich nicht sehr praktisch. Dazu später aber mehr.&lt;br /&gt;
&lt;br /&gt;
Bisher wurden in Register immer irgendwelche Zahlenwerte geladen, aber in diesem Programm kommt plötzlich die Anweisung&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
           ldi temp1, &#039;T&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
vor. Wie ist diese zu verstehen? Passiert hier etwas grundlegend anderes als beim Laden einer Zahl in ein Register?&lt;br /&gt;
&lt;br /&gt;
Die Antwort darauf lautet: Nein. Auch hier wird letztendlich nur eine Zahl in ein Register geladen. Der Schlüssel zum Verständnis beruht darauf, dass zum LCD, so wie zu allen Ausgabegeräten, für die Ausgabe von Texten immer nur Zahlen übertragen werden, sog. Codes. Zum Beispiel könnte man vereinbaren, dass ein LCD, wenn es den Ausgabecode 65 erhält, ein &#039;A&#039; anzeigt, bei einem Ausgabecode von 66 ein &#039;B&#039; usw. Naturgemäß gibt es daher viele verschiedene Code-Buchstaben Zuordnungen. Damit hier etwas Ordnung in das potentielle Chaos kommt, hat man sich bereits in der Steinzeit der Programmierung auf bestimmte Codetabellen geeinigt, von denen die verbreitetste sicherlich die ASCII-Zuordnung ist.&lt;br /&gt;
&lt;br /&gt;
==ASCII==&lt;br /&gt;
&lt;br /&gt;
ASCII steht für &#039;&#039;American Standard Code for Information Interchange&#039;&#039; und ist ein standardisierter Code zur Zeichenumsetzung. Die Codetabelle sieht hexadezimal dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!   ||x0||x1||x2||x3||x4||x5||x6||x7||x8||x9||xA||xB||xC||xD||xE||xF&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background-color:#ffddcc&amp;quot;| 0x&lt;br /&gt;
|NUL||SOH||STX||ETX||EOT||ENQ||ACK||BEL||BS||HT||LF||VT||FF||CR||SO||SI&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background-color:#ffddcc&amp;quot;| 1x&lt;br /&gt;
|DLE||DC1||DC2||DC3||DC4||NAK||SYN||ETB||CAN||EM||SUB||ESC||FS||GS||RS||US&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background-color:#ffddcc&amp;quot;| 2x&lt;br /&gt;
|SP||!||&amp;quot;||#||$||%||&amp;amp;||&#039;||(||)||*||+||,||-||.||/&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background-color:#ffddcc&amp;quot;| 3x&lt;br /&gt;
|0||1||2||3||4||5||6||7||8||9||:||;||&amp;lt;||=||&amp;gt;||?&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background-color:#ffddcc&amp;quot;| 4x&lt;br /&gt;
|@||A||B||C||D||E||F||G||H||I||J||K||L||M||N||O&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background-color:#ffddcc&amp;quot;| 5x&lt;br /&gt;
|P||Q||R||S||T||U||V||W||X||Y||Z||[||\||]||^||_&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background-color:#ffddcc&amp;quot;| 6x&lt;br /&gt;
|`||a||b||c||d||e||f||g||h||i||j||k||l||m||n||o&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background-color:#ffddcc&amp;quot;| 7x&lt;br /&gt;
|p||q||r||s||t||u||v||w||x||y||z||{|| &amp;amp;#124; ||}||~||DEL&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die ersten beiden Zeilen enthalten die Codes für einige Steuerzeichen, ihre vollständige Beschreibung würde hier zu weit führen. Das Zeichen &#039;&#039;&#039;SP&#039;&#039;&#039; steht für ein &#039;&#039;Space&#039;&#039;, also ein Leerzeichen. &#039;&#039;&#039;BS&#039;&#039;&#039; steht für &#039;&#039;Backspace&#039;&#039;, also ein Zeichen zurück. &#039;&#039;&#039;DEL&#039;&#039;&#039; steht für &#039;&#039;Delete&#039;&#039;, also das Löschen eines Zeichens. &#039;&#039;&#039;CR&#039;&#039;&#039; steht für &#039;&#039;Carriage Return&#039;&#039;, also wörtlich: der Wagenrücklauf (einer Schreibmaschine), während &#039;&#039;&#039;LF&#039;&#039;&#039; für &#039;&#039;Line feed&#039;&#039;, also einen Zeilenvorschub steht.&lt;br /&gt;
&lt;br /&gt;
Der Assembler kennt diese Codetabelle und ersetzt die Zeile&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
           ldi temp1, &#039;T&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
durch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
           ldi temp1, $54&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
was letztendlich auch der Lesbarkeit des Programmes zugute kommt. Funktional besteht kein Unterschied zwischen den beiden Anweisungen. Beide bewirken, dass das Register temp1 mit dem Bitmuster 01010100 ( = hexadezimal 54, = dezimal 84 oder eben der ASCII Code für &#039;&#039;&#039;T&#039;&#039;&#039;) geladen wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das LCD wiederrum kennt diese Code-Tabelle ebenfalls und wenn es über den Datenbus die Codezahl $54 zur Anzeige empfängt, dann schreibt es ein &#039;&#039;&#039;T&#039;&#039;&#039; an die aktuelle Cursorposition. Genauer gesagt, weiss das LCD nichts von einem &#039;&#039;&#039;T&#039;&#039;&#039;. Es sieht einfach in seinen internen Tabellen nach, welche Pixel beim Empfang der Codezahl $54 auf schwarz zu setzen sind. &#039;Zufällig&#039; sind das genau jene Pixel, die für uns Menschen ein &#039;&#039;&#039;T&#039;&#039;&#039; ergeben.&lt;br /&gt;
&lt;br /&gt;
==Welche Befehle versteht das LCD?==&lt;br /&gt;
&lt;br /&gt;
Auf dem LCD arbeitet ein Controller vom Typ HD44780. Dieser Kontroller versteht eine Reihe von Befehlen, die allesamt mittels lcd_command gesendet werden können. Ein Kommando ist dabei nichts anderes als ein Befehlsbyte, in dem die verschiedenen Bits verschiedene Bedeutungen haben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
! Bitwert   || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
||dieses Bit muss 0 sein&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
||dieses Bit muss 1 sein&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  x&lt;br /&gt;
||der Zustand dieses Bits ist egal&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; | sonstige Buchstaben&lt;br /&gt;
||das Bit muss je nach gewünschter Funktionalität gesetzt werden.&amp;lt;br /&amp;gt;Die mögliche Funktionalität des jeweiligen Bits geht aus der Befehlsbeschreibung hervor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel: Das Kommando &#039;ON/OFF Control&#039; soll benutzt werden, um das Display einzuschalten, der Cursor soll eingeschaltet werden und der Cursor soll blinken.&lt;br /&gt;
Das Befehlsbyte ist so aufgebaut:&lt;br /&gt;
   0b00001dcb&lt;br /&gt;
Aus der Befehlsbeschreibung entnimmt man:&lt;br /&gt;
* Display ein bedeutet, dass an der Bitposition d eine 1 stehen muss.&amp;lt;br&amp;gt;&lt;br /&gt;
* Cursor ein bedeutet, dass an der Bitposition c ein 1 stehen muss.&amp;lt;br&amp;gt;&lt;br /&gt;
* Cursor blinken bedeutet, dass an der Bitposition b eine 1 stehen muss.&amp;lt;br&amp;gt;&lt;br /&gt;
Das dafür zu übertragende Befehlsbyte hat also die Gestalt 0b00001111 oder in hexadezimaler Schreibweise $0F.&lt;br /&gt;
&lt;br /&gt;
===Clear display: 0b00000001===&lt;br /&gt;
&lt;br /&gt;
Die Anzeige wird gelöscht und der Ausgabecursor kehrt an die Home Position (links, erste Zeile) zurück.&lt;br /&gt;
&lt;br /&gt;
Ausführungszeit: 1.64ms&lt;br /&gt;
&lt;br /&gt;
===Cursor home: 0b0000001x===&lt;br /&gt;
&lt;br /&gt;
Der Cursor kehrt an die Home Position (links, erste Zeile) zurück. Ein verschobenes Display wird auf die Grundeinstellung zurückgesetzt.&lt;br /&gt;
&lt;br /&gt;
Ausführungszeit: 40µs bis 1.64ms&lt;br /&gt;
&lt;br /&gt;
===Entry mode: 0b000001is===&lt;br /&gt;
&lt;br /&gt;
Legt die Cursor Richtung sowie eine mögliche Verschiebung des Displays fest&lt;br /&gt;
* i = 1, Cursorposition bei Ausgabe eines Zeichens erhöhen&lt;br /&gt;
* i = 0, Cursorposition bei Ausgabe eines Zeichens vermindern&lt;br /&gt;
* s = 1, Display wird gescrollt, wenn der Cursor das Ende/Anfang, je nach Einstellung von i, erreicht hat.&lt;br /&gt;
&lt;br /&gt;
Ausführungszeit: 40µs&lt;br /&gt;
&lt;br /&gt;
===On/off control: 0b00001dcb===&lt;br /&gt;
&lt;br /&gt;
Display insgesamt ein/ausschalten; den Cursor ein/ausschalten; den Cursor auf blinken schalten/blinken aus. Wenn das Display ausgeschaltet wird, geht der Inhalt des Displays nicht verloren. Der vorher angezeigte Text wird nach wiedereinschalten erneut angezeigt.&lt;br /&gt;
Ist der Cursor eingeschaltet, aber Blinken ausgeschaltet, so wird der Cursor als Cursorzeile in Pixelzeile 8 dargestellt. Ist Blinken eingeschaltet, wird der Cursor als blinkendes ausgefülltes Rechteck dargestellt, welches abwechselnd mit dem Buchstaben an dieser Stelle angezeigt wird.&lt;br /&gt;
&lt;br /&gt;
* d = 0, Display aus&lt;br /&gt;
* d = 1, Display ein&lt;br /&gt;
* c = 0, Cursor aus&lt;br /&gt;
* c = 1, Cursor ein&lt;br /&gt;
* b = 0, Cursor blinken aus&lt;br /&gt;
* b = 1, Cursor blinken ein&lt;br /&gt;
 &lt;br /&gt;
Ausführungszeit: 40µs&lt;br /&gt;
&lt;br /&gt;
===Cursor/Scrollen: 0b0001srxx===&lt;br /&gt;
&lt;br /&gt;
Bewegt den Cursor oder scrollt das Display um eine Position entweder nach rechts oder nach links.&lt;br /&gt;
&lt;br /&gt;
* s = 1, Display scrollen&lt;br /&gt;
* s = 0, Cursor bewegen&lt;br /&gt;
* r = 1, nach rechts&lt;br /&gt;
* r = 0, nach links &lt;br /&gt;
&lt;br /&gt;
Ausführungszeit: 40µs&lt;br /&gt;
&lt;br /&gt;
===Konfiguration: 0b001dnfxx===&lt;br /&gt;
&lt;br /&gt;
Einstellen der Interface Art, Modus, Font&lt;br /&gt;
* d = 0, 4-Bit Interface&lt;br /&gt;
* d = 1, 8-Bit Interface&lt;br /&gt;
* n = 0, 1 zeilig&lt;br /&gt;
* n = 1, 2 zeilig&lt;br /&gt;
* f = 0, 5x7 Pixel&lt;br /&gt;
* f = 1, 5x11 Pixel&lt;br /&gt;
&lt;br /&gt;
Ausführungszeit: 40µs&lt;br /&gt;
&lt;br /&gt;
===Character RAM Address Set: 0b01aaaaaa===&lt;br /&gt;
&lt;br /&gt;
Mit diesem Kommando werden maximal 8 selbst definierte Zeichen definiert. Dazu wird der Character RAM Zeiger auf den Anfang des Character Generator (CG) RAM gesetzt und das Zeichen durch die Ausgabe von 8 Byte definiert. Der Adresszeiger wird nach Ausgabe jeder Pixelspalte (8 Bit) vom LCD selbst erhöht. Nach Beendigung der Zeichendefinition muss die Schreibposition explizit mit dem Kommando &amp;quot;Display RAM Address Set&amp;quot; wieder in den DD-RAM Bereich gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
aaaaaa 6-bit CG RAM Adresse&lt;br /&gt;
&lt;br /&gt;
Ausführungszeit: 40µs&lt;br /&gt;
&lt;br /&gt;
===Display RAM Address Set: 0b1aaaaaaa===&lt;br /&gt;
&lt;br /&gt;
Den Cursor neu positionieren. Display Data (DD) Ram ist vom Character Generator (CG) Ram unabhängig. Der Adresszeiger wird bei Ausgabe eines Zeichens ins DD Ram automatisch erhöht. Das Display verhält sich so, als ob eine Zeile immer aus 40 logischen Zeichen besteht, von der, je nach konkretem Displaytyp (16 Zeichen, 20 Zeichen) immer nur ein Teil sichtbar ist.&lt;br /&gt;
&lt;br /&gt;
aaaaaaa 7-bit DD RAM Adresse. Auf 2-zeiligen Displays (und den meisten 16x1 Displays), kann die Adressangabe wie folgt interpretiert werden:&lt;br /&gt;
&lt;br /&gt;
1laaaaaa&lt;br /&gt;
* l = Zeilennummer (0 oder 1)&lt;br /&gt;
* a = 6-Bit Spaltennummer&lt;br /&gt;
&lt;br /&gt;
 --------------------------------&lt;br /&gt;
 DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0&lt;br /&gt;
 --- --- --- --- --- --- --- ---&lt;br /&gt;
  1   A   A   A   A   A   A   A &lt;br /&gt;
&lt;br /&gt;
Setzt die DDRAM Adresse:&lt;br /&gt;
&lt;br /&gt;
Wenn N = 0 (1 line display)&lt;br /&gt;
    AAAAAAA = &amp;quot;00h&amp;quot; - &amp;quot;4Fh&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wenn N = 1 (2 line display) ((1x16))&lt;br /&gt;
    AAAAAAA = &amp;quot;00h&amp;quot; - &amp;quot;27h&amp;quot; Zeile 1. (0x80) &lt;br /&gt;
    AAAAAAA = &amp;quot;40h&amp;quot; - &amp;quot;67h&amp;quot; Zeile 2. (0xC0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ausführungszeit: 40µs&lt;br /&gt;
&lt;br /&gt;
==Einschub: Code aufräumen==&lt;br /&gt;
&lt;br /&gt;
Es wird Zeit, sich einmal etwas kritisch mit den bisher geschriebenen Funktionen auseinander zu setzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Portnamen aus dem Code herausziehen===&lt;br /&gt;
&lt;br /&gt;
Wenn wir die LCD-Funktionen einmal genauer betrachten, dann fällt sofort auf, dass über die Funktionen verstreut immer wieder das &#039;&#039;&#039;PORTD&#039;&#039;&#039; sowie einzelne Zahlen für die Pins an diesem Port auftauchen. Wenn das LCD an einem anderen Port betrieben werden soll, oder sich die Pin-Belegung ändert, dann muss an all diesen Stellen eine Anpassung vorgenommen werden. Dabei darf keine einzige Stelle übersehen werden, ansonsten würden die LCD-Funktionen nicht oder nicht vollständig funktionieren.&lt;br /&gt;
&lt;br /&gt;
Eine Möglichkeit, dem vorzubeugen, ist es, diese immer gleichbleibenden Dinge an den Anfang der LCD-Funktionen vorzuziehen. Anstelle von PORTD wird dann im Code ein anderer Name benutzt, den man frei vergeben kann. Dem Assembler wird nur noch mitgeteilt, das dieser Name für PORTD steht. Muss das LCD an einen anderen Port angeschlossen werden, so wird nur diese Zurodnung geändert und der Assembler passt dann im restlichen Code alle davon abhängigen Anweisungen an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;br /&gt;
;;                 LCD-Routinen                ;;&lt;br /&gt;
;;                 ============                ;;&lt;br /&gt;
;;              (c)andreas-s@web.de            ;;&lt;br /&gt;
;;                                             ;;&lt;br /&gt;
;; 4bit-Interface                              ;;&lt;br /&gt;
;; DB4-DB7:       PD0-PD3                      ;;&lt;br /&gt;
;; RS:            PD4                          ;;&lt;br /&gt;
;; E:             PD5                          ;;&lt;br /&gt;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;br /&gt;
 &lt;br /&gt;
; .equ definiert ein Symbol und dessen Wert&lt;br /&gt;
.equ LCD_PORT = PORTD&lt;br /&gt;
.equ LCD_DDR  = DDRD&lt;br /&gt;
.equ PIN_E    = 5&lt;br /&gt;
.equ PIN_RS   = 4&lt;br /&gt;
&lt;br /&gt;
 ;sendet ein Datenbyte an das LCD&lt;br /&gt;
lcd_data:&lt;br /&gt;
           mov temp2, temp1             ; &amp;quot;Sicherungskopie&amp;quot; für&lt;br /&gt;
                                        ; die Übertragung des 2.Nibbles&lt;br /&gt;
           swap temp1                   ; Vertauschen&lt;br /&gt;
           andi temp1, 0b00001111       ; oberes Nibble auf Null setzen&lt;br /&gt;
           sbr temp1, 1&amp;lt;&amp;lt;PIN_RS         ; entspricht 0b00010000&lt;br /&gt;
           out LCD_PORT, temp1          ; ausgeben&lt;br /&gt;
           rcall lcd_enable             ; Enable-Routine aufrufen&lt;br /&gt;
                                        ; 2. Nibble, kein swap da es schon&lt;br /&gt;
                                        ; an der richtigen stelle ist&lt;br /&gt;
           andi temp2, 0b00001111       ; obere Hälfte auf Null setzen &lt;br /&gt;
           sbr temp2, 1&amp;lt;&amp;lt;PIN_RS         ; entspricht 0b00010000&lt;br /&gt;
           out LCD_PORT, temp2          ; ausgeben&lt;br /&gt;
           rcall lcd_enable             ; Enable-Routine aufrufen&lt;br /&gt;
           rcall delay50us              ; Delay-Routine aufrufen&lt;br /&gt;
           ret                          ; zurück zum Hauptprogramm&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 ; sendet einen Befehl an das LCD&lt;br /&gt;
&lt;br /&gt;
lcd_command:                            ; wie lcd_data, nur RS=0&lt;br /&gt;
           mov temp2, temp1&lt;br /&gt;
           swap temp1&lt;br /&gt;
           andi temp1, 0b00001111&lt;br /&gt;
           out LCD_PORT, temp1&lt;br /&gt;
           rcall lcd_enable&lt;br /&gt;
           andi temp2, 0b00001111&lt;br /&gt;
           out LCD_PORT, temp2&lt;br /&gt;
           rcall lcd_enable&lt;br /&gt;
           rcall delay50us&lt;br /&gt;
           ret&lt;br /&gt;
 &lt;br /&gt;
 ; erzeugt den Enable-Puls&lt;br /&gt;
lcd_enable:&lt;br /&gt;
           sbi LCD_PORT, PIN_E          ; Enable high&lt;br /&gt;
           nop                          ; 3 Taktzyklen warten&lt;br /&gt;
           nop&lt;br /&gt;
           nop&lt;br /&gt;
           cbi LCD_PORT, PIN_E          ; Enable wieder low&lt;br /&gt;
           ret                          ; Und wieder zurück                     &lt;br /&gt;
 &lt;br /&gt;
 ; Pause nach jeder Übertragung&lt;br /&gt;
delay50us:                              ; 50µs Pause&lt;br /&gt;
           ldi  temp1, $42&lt;br /&gt;
delay50us_:dec  temp1&lt;br /&gt;
           brne delay50us_&lt;br /&gt;
           ret                          ; wieder zurück&lt;br /&gt;
 &lt;br /&gt;
 ; Längere Pause für manche Befehle&lt;br /&gt;
delay5ms:                               ; 5ms Pause&lt;br /&gt;
           ldi  temp1, $21&lt;br /&gt;
WGLOOP0:   ldi  temp2, $C9&lt;br /&gt;
WGLOOP1:   dec  temp2&lt;br /&gt;
           brne WGLOOP1&lt;br /&gt;
           dec  temp1&lt;br /&gt;
           brne WGLOOP0&lt;br /&gt;
           ret                          ; wieder zurück&lt;br /&gt;
 &lt;br /&gt;
 ; Initialisierung: muss ganz am Anfang des Programms aufgerufen werden&lt;br /&gt;
lcd_init:&lt;br /&gt;
           ldi   temp1, 0xFF            ; alle Pins am Ausgabeport auf Ausgang&lt;br /&gt;
           out   LCD_DDR, temp1&lt;br /&gt;
&lt;br /&gt;
           ldi   temp3,6&lt;br /&gt;
powerupwait:&lt;br /&gt;
           rcall delay5ms&lt;br /&gt;
           dec   temp3&lt;br /&gt;
           brne  powerupwait&lt;br /&gt;
           ldi   temp1,    0b00000011   ; muss 3mal hintereinander gesendet&lt;br /&gt;
           out   LCD_PORT, temp1        ; werden zur Initialisierung&lt;br /&gt;
           rcall lcd_enable             ; 1&lt;br /&gt;
           rcall delay5ms&lt;br /&gt;
           rcall lcd_enable             ; 2&lt;br /&gt;
           rcall delay5ms&lt;br /&gt;
           rcall lcd_enable             ; und 3!&lt;br /&gt;
           rcall delay5ms&lt;br /&gt;
           ldi   temp1, 0b00000010      ; 4bit-Modus einstellen&lt;br /&gt;
           out   LCD_PORT, temp1&lt;br /&gt;
           rcall lcd_enable&lt;br /&gt;
           rcall delay5ms&lt;br /&gt;
           ldi   temp1, 0b00101000      ; 4 Bit, 2 Zeilen&lt;br /&gt;
           rcall lcd_command&lt;br /&gt;
           ldi   temp1, 0b00001100      ; Display on, Cursor off&lt;br /&gt;
           rcall lcd_command&lt;br /&gt;
           ldi   temp1, 0b00000100      ; endlich fertig&lt;br /&gt;
           rcall lcd_command&lt;br /&gt;
           ret&lt;br /&gt;
 &lt;br /&gt;
 ; Sendet den Befehl zur Löschung des Displays&lt;br /&gt;
lcd_clear:&lt;br /&gt;
           ldi   temp1, 0b00000001      ; Display löschen&lt;br /&gt;
           rcall lcd_command&lt;br /&gt;
           rcall delay5ms&lt;br /&gt;
           ret&lt;br /&gt;
&lt;br /&gt;
 ; Sendet den Befehl: Cursor Home&lt;br /&gt;
lcd_home:&lt;br /&gt;
           ldi   temp1, 0b00000010      ; Cursor Home&lt;br /&gt;
           rcall lcd_command&lt;br /&gt;
           rcall delay5ms&lt;br /&gt;
           ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittels &#039;&#039;&#039;.equ&#039;&#039;&#039; werden mit dem Assembler Textersetzungen vereinbart. Der Assembler ersetzt alle Vorkomnisse des Quelltextes durch den zu ersetzenden Text. Dadurch ist es z.&amp;amp;nbsp;B. möglich, alle Vorkommnisse von &#039;&#039;&#039;PORTD&#039;&#039;&#039; durch &#039;&#039;&#039;LCD_PORT&#039;&#039;&#039; auszutauschen. Wird das LCD an einen anderen Port, z.&amp;amp;nbsp;B. &#039;&#039;&#039;PORTB&#039;&#039;&#039; gelegt, dann genügt es, die Zeilen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.equ LCD_PORT = PORTD&lt;br /&gt;
.equ LCD_DDR  = DDRD&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
durch&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.equ LCD_PORT = PORTB&lt;br /&gt;
.equ LCD_DDR  = DDRB&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
zu ersetzen. Der Assembler sorgt dann dafür, dass diese Portänderung an den relevanten Stellen im Code über die Textersetzungen einfließt. Selbiges natürlich mit der Pin-Zuordnung.&lt;br /&gt;
&lt;br /&gt;
===Registerbenutzung===&lt;br /&gt;
&lt;br /&gt;
Bei diesen Funktionen mussten einige Register des Prozessors benutzt werden, um darin Zwischenergebnisse zu speichern bzw. zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
Beachtet werden muss dabei natürlich, dass es zu keinen Überschneidungen kommt. Solange nur jede Funktion jeweils für sich betrachtet wird, ist das kein Problem. In 20 oder 30 Code-Zeilen kann man gut verfolgen, welches Register wofür benutzt wird. Schwieriger wird es, wenn Funktionen wiederum andere Funktionen aufrufen, die ihrerseits wieder Funktionen aufrufen usw. Jede dieser Funktionen benutzt einige Register und mit zunehmender Programmgröße wird es immer schwieriger, zu verfolgen, welches Register zu welchem Zeitpunkt wofür benutzt wird.&lt;br /&gt;
&lt;br /&gt;
Speziell bei Basisfunktionen wie diesen LCD-Funktionen, ist es daher oft ratsam, dafür zu sorgen, dass jede Funktion die Register wieder in dem Zustand hinterlässt, indem sie sie auch vorgefunden hat. Wir benötigen dazu wieder den Stack, auf dem die Registerinhalte bei Betreten einer Funktion zwischengespeichert werden und von dem die Register bei Verlassen einer Funktion wiederhergestellt werden.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir die Funktion&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
 ; Sendet den Befehl zur Löschung des Displays&lt;br /&gt;
lcd_clear:&lt;br /&gt;
           ldi   temp1, 0b00000001      ; Display löschen&lt;br /&gt;
           rcall lcd_command&lt;br /&gt;
           rcall delay5ms&lt;br /&gt;
           ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Funktion verändert das Register temp1. Um das Register abzusichern, schreiben wir die Funktion um:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
 ; Sendet den Befehl zur Löschung des Displays&lt;br /&gt;
lcd_clear:&lt;br /&gt;
           push  temp1                  ; temp1 auf dem Stack sichern&lt;br /&gt;
           ldi   temp1, 0b00000001      ; Display löschen&lt;br /&gt;
           rcall lcd_command&lt;br /&gt;
           rcall delay5ms&lt;br /&gt;
           pop   temp1                  ; temp1 vom Stack wiederherstellen&lt;br /&gt;
           ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Am besten hält man sich an die Regel: Jede Funktion ist dafür zuständig, die Register zu sichern und wieder herzustellen, die sie auch selbst verändert. &#039;&#039;&#039;lcd_clear&#039;&#039;&#039; ruft die Funktionen &#039;&#039;&#039;lcd_command&#039;&#039;&#039; und &#039;&#039;&#039;delay5ms&#039;&#039;&#039; auf. Wenn diese Funktionen selbst wieder Register verändern (und das tun sie), so ist es die Aufgabe dieser Funktionen, sich um die Sicherung und das Wiederherstellen der entsprechenden Register zu kümmern. &#039;&#039;&#039;lcd_clear&#039;&#039;&#039; sollte sich nicht darum kümmern müssen. Auf diese Weise ist das Schlimmste, das einem passieren kann, dass ein paar Register unnütz gesichert und wiederhergestellt werden. Das kostet zwar etwas Rechenzeit und etwas Speicherplatz auf dem Stack, ist aber immer noch besser als das andere Extrem: Nach einem Funktionsaufruf haben einige Register nicht mehr den Wert, den sie haben sollten, und das Programm rechnet mit falschen Zahlen weiter.&lt;br /&gt;
&lt;br /&gt;
===Lass den Assembler rechnen===&lt;br /&gt;
Betrachtet man den Code genauer, so fallen einige konstante Zahlenwerte auf (Das vorangestellte $ kennzeichnet die Zahl als Hexadezimalzahl):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
delay50us:                              ; 50µs Pause&lt;br /&gt;
           ldi  temp1, $42&lt;br /&gt;
delay50us_:&lt;br /&gt;
           dec  temp1&lt;br /&gt;
           brne delay50us_&lt;br /&gt;
           ret                          ; wieder zurück&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Code benötigt eine Warteschleife, die mindestens 50µs dauert. Die beiden Befehle innerhalb der Schleife benötigen 3 Takte: 1 Takt für den &#039;&#039;&#039;dec&#039;&#039;&#039; und der &#039;&#039;&#039;brne&#039;&#039;&#039; benötigt 2 Takte, wenn die Bedingung zutrifft, der Branch also genommen wird. Bei 4 Mhz werden also 4000000 / 3 * 50 / 1000000 = 66.6 Durchläufe durch die Schleife benötigt, um eine Verzögerungszeit von 50µs (0.000050 Sekunden) zu erreichen, hexadezimal ausgedrückt: $42.&lt;br /&gt;
&lt;br /&gt;
Der springende Punkt ist: Bei anderen Taktfrequenzen müsste man nun jedesmal diese Berechnung machen und den entsprechenden Zahlenwert einsetzen. Das kann aber der Assembler genausogut erledigen. Am Anfang des Codes wird ein Eintrag definiert, der die Taktfrequenz festlegt. Traditionell heißt dieser Eintrag &amp;lt;i&amp;gt;XTAL&amp;lt;/i&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.equ XTAL  = 4000000&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
delay50us:                              ; 50µs Pause&lt;br /&gt;
           ldi  temp1, ( XTAL * 50 / 3 ) / 1000000&lt;br /&gt;
delay50us_:&lt;br /&gt;
           dec  temp1&lt;br /&gt;
           brne delay50us_&lt;br /&gt;
           ret                          ; wieder zurück&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An einer anderen Codestelle gibt es weitere derartige magische Zahlen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
 ; Längere Pause für manche Befehle&lt;br /&gt;
delay5ms:                               ; 5ms Pause&lt;br /&gt;
           ldi  temp1, $21&lt;br /&gt;
WGLOOP0:   ldi  temp2, $C9&lt;br /&gt;
WGLOOP1:   dec  temp2&lt;br /&gt;
           brne WGLOOP1&lt;br /&gt;
           dec  temp1&lt;br /&gt;
           brne WGLOOP0&lt;br /&gt;
           ret                          ; wieder zurück&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was geht hier vor?&lt;br /&gt;
Die innere Schleife benötigt wieder 3 Takte pro Durchlauf. Bei $C9 = 201 Durchläufen werden also 201 * 3 = 603 Takte verbraucht. In der äußeren Schleife werden pro Durchlauf also 603 + 1 + 2 = 606 Takte verbraucht und einmal 605 Takte (weil der brne nicht genommen wird). Da die äußere Schleife $21 = 33 mal wiederholt wird, werden 32 * 606 + 605 = 19997 Takte verbraucht. Noch 1 Takt mehr für den allerersten ldi und 4 Takte für den ret, macht 20002 Takte. Bei 4Mhz benötigt der Prozessor 20002 / 4000000 = 0.0050005 Sekunden, also rund 5 ms. Die 7. nachkommastelle kann man an dieser Stelle getrost ignorieren. Vor allen Dingen auch deshalb, weil auch der Quarz nicht exakt 4000000 Schwingungen in der Sekunde durchführen wird.&lt;br /&gt;
Wird der Wiederholwert für die innere Schleife bei $C9 belassen, so werden 4000000 / 607 * 5 / 1000 Wiederholungen der äusseren Schleife benötigt. (Die Berechnung wurde hier etwas vereinfacht, die nicht berücksichtigten Takte fallen zeitmässig nicht weiter ins Gewicht bzw. wurden dadurch berücksichtigt, dass mit 607 anstelle von 606 gerechnet wird). Auch diese Berechnung kann wieder der Assembler übernehmen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
 ; Längere Pause für manche Befehle&lt;br /&gt;
delay5ms:                               ; 5ms Pause&lt;br /&gt;
           ldi  temp1, ( XTAL * 5 / 607 ) / 1000&lt;br /&gt;
WGLOOP0:   ldi  temp2, $C9&lt;br /&gt;
WGLOOP1:   dec  temp2&lt;br /&gt;
           brne WGLOOP1&lt;br /&gt;
           dec  temp1&lt;br /&gt;
           brne WGLOOP0&lt;br /&gt;
           ret                          ; wieder zurück&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein kleines Problem kann bei der Verwendung dieses Verfahrens entstehen: Bei hohen Taktfrequenzen und großen Wartezeiten kann der berechnete Wert größer als 255 werden und man bekommt die Fehlermeldung &amp;quot;Operand(s) out of range&amp;quot; beim Assemblieren. Dieser Fall tritt zum Beispiel für obige Konstruktion bei einer Taktfrequenz von 16 MHz ein (genauer gesagt ab 15,3 MHz), während darunter XTAL beliebig geändert werden kann. Als einfachste Lösung bietet es sich an, die Zahl der Takte pro Schleifendurchlauf durch das Einfügen von &#039;&#039;&#039;nop&#039;&#039;&#039; zu erhöhen und die Berechnungsvorschrift anzupassen.&lt;br /&gt;
&lt;br /&gt;
== Ausgabe eines konstanten Textes ==&lt;br /&gt;
&lt;br /&gt;
Weiter oben wurde schon einmal ein Text ausgegeben. Dies geschah durch Ausgabe von einzelnen Zeichen. Das können wir auch anders machen. Wir können den Text im Speicher ablegen und eine Funktion schreiben, die die einzelnen Zeichen aus dem Speicher liest und aus gibt. Dabei stellt sich Frage: Woher &#039;weiß&#039; die Funktion eigentlich, wie lang der Text ist? Die Antwort darauf lautet: Sie kann es nicht wissen. Wir müssen irgendwelche Vereinbarungen treffen, woran die Funktion erkennen kann, dass der Text zu Ende ist. Im Wesentlichen werden dazu 2 Methoden benutzt:&lt;br /&gt;
* Der Text enthält ein spezielles Zeichen, welches das Ende des Textes markiert&lt;br /&gt;
* Wir speichern nicht nur den Text selbst, sondern auch die Länge des Textes&lt;br /&gt;
Mit einer der beiden Methoden ist es der Textausgabefunktion dann ein Leichtes, den Text vollständig auszugeben.&lt;br /&gt;
&lt;br /&gt;
Wir werden uns im Weiteren dafür entscheiden, ein spezielles Zeichen, eine 0 (den Wert 0, nicht das Zeichen &#039;0&#039;), dafür zu benutzen. Die Ausgabefunktionen werden dann etwas einfacher, als wenn bei der Ausgabe die Anzahl der bereits ausgegebenen Zeichen mitgezählt werden muss.&lt;br /&gt;
&lt;br /&gt;
Den Text selbst speichern wir im Flash-Speicher, also dort, wo auch das Programm gespeichert ist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
 ; Einen konstanten Text aus dem Flash Speicher&lt;br /&gt;
 ; ausgeben. Der Text wird mit einer 0 beendet&lt;br /&gt;
lcd_flash_string:&lt;br /&gt;
           push  temp1&lt;br /&gt;
           push  ZH&lt;br /&gt;
           push  ZL&lt;br /&gt;
&lt;br /&gt;
lcd_flash_string_1:&lt;br /&gt;
           lpm   temp1, Z+&lt;br /&gt;
           cpi   temp1, 0&lt;br /&gt;
           breq  lcd_flash_string_2&lt;br /&gt;
           rcall  lcd_data&lt;br /&gt;
           rjmp  lcd_flash_string_1&lt;br /&gt;
&lt;br /&gt;
lcd_flash_string_2:&lt;br /&gt;
           pop   ZL&lt;br /&gt;
           pop   ZH&lt;br /&gt;
           pop   temp1&lt;br /&gt;
           ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Funktion benutzt den Befehl &#039;&#039;&#039;lpm&#039;&#039;&#039;, um das jeweils nächste Zeichen aus dem Flash Speicher in ein Register zur Weiterverarbeitung zu laden. Dazu wird der sog. &#039;&#039;&#039;Z-Pointer&#039;&#039;&#039; benutzt. So nennt man das Registerpaar &#039;&#039;&#039;R30&#039;&#039;&#039; und &#039;&#039;&#039;R31&#039;&#039;&#039;. Nach jedem Ladevorgang wird dabei durch den Befehl&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
           lpm   temp1, Z+&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
dieser Z-Pointer um 1 erhöht. Mittels &#039;&#039;&#039;cpi&#039;&#039;&#039; wird das in das Register &#039;&#039;&#039;temp1&#039;&#039;&#039; geladene Zeichen mit 0 verglichen. &#039;&#039;&#039;cpi&#039;&#039;&#039; vergleicht die beiden Zahlen und merkt sich das Ergebnis in einem speziellen Register in Form von Status Bits. &#039;&#039;&#039;cpi&#039;&#039;&#039; zieht dabei ganz einfach die beiden Zahlen voneinander ab. Sind sie gleich, so kommt da als Ergebnis 0 heraus und &#039;&#039;&#039;cpi&#039;&#039;&#039; setzt daher konsequenter Weise das Zero-Flag, das anzeigt, dass die vorhergegangene Operation eine 0 als Ergebnis hatte.&#039;&#039;&#039;breq&#039;&#039;&#039; wertet diese Status-Bits aus. Wenn die vorhergegangene Operation ein 0-Ergebnis hatte, das Zero-Flag also gesetzt ist, dann wird ein Sprung zum angegebenen Label durchgeführt. In Summe bewirkt also die Sequenz&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
           cpi   temp1, 0&lt;br /&gt;
           breq  lcd_flash_string_2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
dass das gelesene Zeichen mit 0 verglichen wird und falls das gelesene&lt;br /&gt;
Zeichen tatsächlich 0 war, an der Stelle lcd_flash_string_2 weiter gemacht wird. Im anderen Fall wird die bereits geschriebene Funktion &#039;&#039;&#039;lcd_data&#039;&#039;&#039; aufgerufen, welche das Zeichen ausgibt. &#039;&#039;&#039;lcd_data&#039;&#039;&#039; erwartet dabei das Zeichen im Register &#039;&#039;&#039;temp1&#039;&#039;&#039;, genau in dem Register, in welches wir vorher mittels &#039;&#039;&#039;lpm&#039;&#039;&#039; das Zeichen geladen hatten.&lt;br /&gt;
&lt;br /&gt;
Das verwendende Programm sieht dann so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
.def temp1 = r16&lt;br /&gt;
.def temp2 = r17&lt;br /&gt;
.def temp3 = r18&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
           ldi temp1, LOW(RAMEND)      ; LOW-Byte der obersten RAM-Adresse&lt;br /&gt;
           out SPL, temp1&lt;br /&gt;
           ldi temp1, HIGH(RAMEND)     ; HIGH-Byte der obersten RAM-Adresse&lt;br /&gt;
           out SPH, temp1&lt;br /&gt;
 &lt;br /&gt;
           rcall lcd_init              ; Display initialisieren&lt;br /&gt;
           rcall lcd_clear             ; Display löschen&lt;br /&gt;
 &lt;br /&gt;
           ldi ZL, LOW(text*2)         ; Adresse des Strings in den&lt;br /&gt;
           ldi ZH, HIGH(text*2)        ; Z-Pointer laden&lt;br /&gt;
&lt;br /&gt;
           rcall lcd_flash_string      ; Unterprogramm gibt String aus der&lt;br /&gt;
                                       ; durch den Z-Pointer adressiert wird&lt;br /&gt;
loop:&lt;br /&gt;
           rjmp loop&lt;br /&gt;
&lt;br /&gt;
text:&lt;br /&gt;
           .db &amp;quot;Test&amp;quot;,0                ; Stringkonstante, durch eine 0&lt;br /&gt;
                                       ; abgeschlossen  &lt;br /&gt;
&lt;br /&gt;
.include &amp;quot;lcd-routines.asm&amp;quot;            ; LCD Funktionen&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Genaueres über die Verwendung unterschiedlicher Speicher findet sich im Kapitel [[AVR-Tutorial:_Speicher|Speicher]]&lt;br /&gt;
&lt;br /&gt;
==Zahlen ausgeben==&lt;br /&gt;
Um Zahlen, die beispielsweise in einem Register gespeichert sind, ausgeben zu können, ist es notwendig sich eine Textrepräsentierung der Zahl zu generieren. Die Zahl 123 wird also in den Text &amp;quot;123&amp;quot; umgewandelt welcher dann ausgegeben wird. Aus praktischen Gründen wird allerdings der Text nicht vollständig generiert (man müsste ihn ja irgendwo zwischenspeichern) sondern die einzelnen Buchstaben werden sofort ausgegeben, sobald sie bekannt sind.&lt;br /&gt;
&lt;br /&gt;
===Dezimal ausgeben===&lt;br /&gt;
Das Prinzip der Umwandlung ist einfach. Um herauszufinden wieviele Hunderter in der Zahl 123 enthalten sind, genügt es in einer Schleife immer wieder 100 von der Zahl abzuziehen und mitzuzählen wie oft dies gelang, bevor das Ergebnis negativ wurde. In diesem Fall lautet die Antwort: 1 mal, denn 123 - 100 macht 23. Versucht man erneut 100 anzuziehen, so ergibt sich eine negative Zahl.&lt;br /&gt;
Also muss eine &#039;1&#039; ausgeben werden. Die verbleibenden 23 werden weiter behandelt, indem festgestellt wird wieviele Zehner darin enthalten sind. Auch hier wiederum: In einer Schleife solange 10 abziehen, bis das Ergebnis negativ wurde. Konkret geht das 2 mal gut, also muss das nächste auszugebende Zeichen ein &#039;2&#039; sein. Damit verbleiben noch die Einer, welche direkt in das entsprechende Zeichen umgewandelt werden können. In Summe hat man also an das Display die Zeichen &#039;1&#039; &#039;2&#039; &#039;3&#039; ausgegeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;**********************************************************************&lt;br /&gt;
;&lt;br /&gt;
; Eine 8 Bit Zahl ohne Vorzeichen ausgeben&lt;br /&gt;
;&lt;br /&gt;
; Übergabe:            Zahl im Register temp1&lt;br /&gt;
; veränderte Register: keine&lt;br /&gt;
;&lt;br /&gt;
lcd_number:&lt;br /&gt;
           push  temp1            ; die Funktion verändert temp1 und temp2,&lt;br /&gt;
           push  temp2            ; also sichern wir den Inhalt, um ihn am Ende&lt;br /&gt;
                                  ; wieder herstellen zu können&lt;br /&gt;
&lt;br /&gt;
           mov   temp2, temp1     ; das Register temp1 frei machen&lt;br /&gt;
                                  ; abzählen wieviele Hunderter&lt;br /&gt;
                                  ; in der Zahl enthalten sind&lt;br /&gt;
;** Hunderter ** &lt;br /&gt;
           ldi   temp1, &#039;0&#039;-1     ; temp1 mit ASCII &#039;0&#039;-1 vorladen&lt;br /&gt;
lcd_number_1:&lt;br /&gt;
           inc   temp1            ; ASCII erhöhen (somit ist nach dem ersten&lt;br /&gt;
                                  ; Durchlauf eine &#039;0&#039; in temp1)&lt;br /&gt;
           subi  temp2, 100       ; 100 abziehen&lt;br /&gt;
           brcc  lcd_number_1     ; ist dadurch kein Unterlauf entstanden?&lt;br /&gt;
                                  ; nein, dann zurück zu lcd_number_1&lt;br /&gt;
           subi  temp2, -100      ; 100 wieder dazuzählen, da die&lt;br /&gt;
                                  ; vorherhgehende Schleife 100 zuviel&lt;br /&gt;
                                  ; abgezogen hat&lt;br /&gt;
           rcall lcd_data         ; die Hunderterstelle ausgeben&lt;br /&gt;
&lt;br /&gt;
;** Zehner  **&lt;br /&gt;
           ldi   temp1, &#039;0&#039;-1     ; temp1 mit ASCII &#039;0&#039;-1 vorladen&lt;br /&gt;
lcd_number_2:&lt;br /&gt;
           inc   temp1            ; ASCII erhöhen (somit ist nach dem ersten&lt;br /&gt;
                                  ; Durchlauf eine &#039;0&#039; in temp1)&lt;br /&gt;
           subi  temp2, 10        ; 10 abziehen&lt;br /&gt;
           brcc  lcd_number_2     ; ist dadurch kein Unterlauf enstanden?&lt;br /&gt;
                                  ; nein, dann zurück zu lcd_number_2&lt;br /&gt;
           subi  temp2, -10       ; 10 wieder dazuzählen, da die&lt;br /&gt;
                                  ; vorherhgehende Schleife 10 zuviel&lt;br /&gt;
                                  ; abgezogen hat&lt;br /&gt;
           rcall lcd_data         ; die Zehnerstelle ausgeben&lt;br /&gt;
 &lt;br /&gt;
;** Einer **        &lt;br /&gt;
           ldi   temp1, &#039;0&#039;       ; die Zahl in temp2 ist jetzt im Bereich&lt;br /&gt;
           add   temp1, temp2     ; 0 bis 9. Einfach nur den ASCII Code für&lt;br /&gt;
           rcall lcd_data         ; &#039;0&#039; dazu addieren und wir erhalten dierekt&lt;br /&gt;
                                  ; den ASCII Code für die Ziffer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
           pop   temp2            ; den gesicherten Inhalt von temp2 und temp1&lt;br /&gt;
           pop   temp1            ; wieder herstellen&lt;br /&gt;
           ret                    ; und zurück&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beachte: Diese Funktion benutzt wiederrum die Funktion &#039;&#039;&#039;lcd_data&#039;&#039;&#039;. Anders als bei den bisherigen Aufrufen ist &#039;&#039;&#039;lcd_number&#039;&#039;&#039; aber darauf angewiesen, dass &#039;&#039;&#039;lcd_data&#039;&#039;&#039; das Register &#039;&#039;&#039;temp2&#039;&#039;&#039; unangetastet lässt. Falls sie es noch nicht getan haben, dann ist das jetzt die perfekte Gelegenheit, &#039;&#039;&#039;lcd_data&#039;&#039;&#039; mit den entsprechenden &#039;&#039;&#039;push&#039;&#039;&#039; und &#039;&#039;&#039;pop&#039;&#039;&#039; Befehlen zu versehen. Sie sollten dies unbedingt zur Übung selbst machen. Am Ende muß die Funktion dann wie diese hier aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
 ;sendet ein Datenbyte an das LCD&lt;br /&gt;
lcd_data:&lt;br /&gt;
           push  temp2&lt;br /&gt;
           mov   temp2, temp1           ; &amp;quot;Sicherungskopie&amp;quot; für&lt;br /&gt;
                                        ; die Übertragung des 2.Nibbles&lt;br /&gt;
           swap  temp1                  ; Vertauschen&lt;br /&gt;
           andi  temp1, 0b00001111      ; oberes Nibble auf Null setzen&lt;br /&gt;
           sbr   temp1, 1&amp;lt;&amp;lt;PIN_RS       ; entspricht 0b00010000&lt;br /&gt;
           out   LCD_PORT, temp1        ; ausgeben&lt;br /&gt;
           rcall lcd_enable             ; Enable-Routine aufrufen&lt;br /&gt;
                                        ; 2. Nibble, kein swap da es schon&lt;br /&gt;
                                        ; an der richtigen stelle ist&lt;br /&gt;
           andi  temp2, 0b00001111      ; obere Hälfte auf Null setzen &lt;br /&gt;
           sbr   temp2, 1&amp;lt;&amp;lt;PIN_RS       ; entspricht 0b00010000&lt;br /&gt;
           out   LCD_PORT, temp2        ; ausgeben&lt;br /&gt;
           rcall lcd_enable             ; Enable-Routine aufrufen&lt;br /&gt;
           rcall delay50us              ; Delay-Routine aufrufen&lt;br /&gt;
           pop   temp2&lt;br /&gt;
           ret                          ; zurück zum Hauptprogramm&lt;br /&gt;
 &lt;br /&gt;
 ; sendet einen Befehl an das LCD&lt;br /&gt;
lcd_command:                            ; wie lcd_data, nur ohne RS zu setzen&lt;br /&gt;
           push  temp2&lt;br /&gt;
           mov   temp2, temp1&lt;br /&gt;
           swap  temp1&lt;br /&gt;
           andi  temp1, 0b00001111&lt;br /&gt;
           out   LCD_PORT, temp1&lt;br /&gt;
           rcall lcd_enable&lt;br /&gt;
           andi  temp2, 0b00001111&lt;br /&gt;
           out   LCD_PORT, temp2&lt;br /&gt;
           rcall lcd_enable&lt;br /&gt;
           rcall delay50us&lt;br /&gt;
           pop   temp2&lt;br /&gt;
           ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kurz zur Funktionsweise der Funktion &#039;&#039;&#039;lcd_number&#039;&#039;&#039;: Die Zahl in einem Register bewegt sich im Wertebereich 0 bis 255. Um herauszufinden, wie die Hunderterstelle lautet, zieht die Funktion einfach in einer Schleife immer wieder 100 von der Schleife ab, bis bei der Subtraktion ein Unterlauf, angezeigt durch das Setzen des Carry-Bits bei der Subtraktion, entsteht. Die Anzahl wird im Register &#039;&#039;&#039;temp1&#039;&#039;&#039; mitgezählt. Da dieses Register mit dem ASCII Code von &#039;0&#039; initialisiert wurde, und dieser ASCII Code bei jedem Schleifendurchlauf um 1 erhöht wird, können wir das Register &#039;&#039;&#039;temp1&#039;&#039;&#039; direkt zur Ausgabe des Zeichens für die Hunderterstelle durch die Funktion &#039;&#039;&#039;lcd_data&#039;&#039;&#039; benutzen. Völlig analog funktioniert auch die Ausgabe der Zehnerstelle.&lt;br /&gt;
&lt;br /&gt;
===Unterdrückung von führenden Nullen===&lt;br /&gt;
&lt;br /&gt;
Diese Funktion gibt jede Zahl im Register &#039;&#039;&#039;temp1&#039;&#039;&#039; immer mit 3 Stellen aus. Führende Nullen werden nicht unterdrückt. Möchte man dies ändern, so ist das ganz leicht möglich: Vor Ausgabe der Hunderterstelle muss lediglich überprüft werden, ob die Entsprechende Ausgabe eine &#039;0&#039; wäre. Ist sie das, so wird die Ausgabe übersprungen. Ist es allerdings eine Zahl 1..9, so muss sie der Zehner Stelle signalisieren, daß eine Prüfung auf eine &#039;0&#039; nicht stattfinden darf. Und dazu wird das T-Flag im SREG genutzt. Lediglich in der Einerstelle wird jede Ziffer wie errechnet ausgegeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
           ...&lt;br /&gt;
                                  ; die Hunderterstelle ausgeben, wenn&lt;br /&gt;
                                  ; sie nicht &#039;0&#039; ist&lt;br /&gt;
           clt                    ; T-Flag löschen&lt;br /&gt;
           cpi   temp1, &#039;0&#039;&lt;br /&gt;
           breq  lcd_number_1a&lt;br /&gt;
           rcall lcd_data         ; die Hunderterstelle ausgeben&lt;br /&gt;
           set                    ; T-Flag im SREG setzen da 100er Stelle eine&lt;br /&gt;
                                  ; 1..9 war&lt;br /&gt;
&lt;br /&gt;
lcd_number_1a:&lt;br /&gt;
           ...&lt;br /&gt;
&lt;br /&gt;
           ...&lt;br /&gt;
           brts  lcd_number_2a    ; Test auf &#039;0&#039; überspringen, da 100er eine&lt;br /&gt;
                                  ; 1..9 war (unbedingt anzeigen&lt;br /&gt;
                                  ; auch wenn der Zehner eine &#039;0&#039; ist)&lt;br /&gt;
           cpi   temp1, &#039;0&#039;       ; ansonsten Test auf &#039;0&#039;&lt;br /&gt;
           breq  lcd_number_2b&lt;br /&gt;
lcd_number_2a:        &lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
lcd_number_2b:&lt;br /&gt;
           ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Verfahren, die einzelnen Stellen durch Subtraktion zu bestimmen, ist bei kleinen Zahlen eine durchaus gängige Alternative. Vor allem dann, wenn keine hardwaremäßige Unterstützung für Multiplikation und Division zur Verfügung steht. Ansonsten könnte man die die einzelnen Ziffern auch durch Division bestimmen. Das Prinzip ist folgendes (beispielhaft an der Zahl 52783 gezeigt)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   52783 / 10          -&amp;gt; 5278&lt;br /&gt;
   52783 - 5278 * 10   -&amp;gt;          3&lt;br /&gt;
&lt;br /&gt;
   5278 / 10           -&amp;gt; 527&lt;br /&gt;
   5278 - 527 * 10     -&amp;gt;          8&lt;br /&gt;
&lt;br /&gt;
   527 / 10            -&amp;gt; 52&lt;br /&gt;
   527 - 52 * 10       -&amp;gt;          7&lt;br /&gt;
&lt;br /&gt;
   52 / 10             -&amp;gt; 5&lt;br /&gt;
   52 - 5 * 10         -&amp;gt;          2&lt;br /&gt;
&lt;br /&gt;
   5 / 10              -&amp;gt; 0&lt;br /&gt;
   5 - 0 * 10          -&amp;gt;          5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Prinzip ist also die Restbildung bei einer fortgesetzten Division durch 10, wobei die einzelnen Ziffern in umgekehrter Reihenfolge ihrer Wertigkeit entstehen. Dadurch hat man aber ein Problem: Damit die Zeichen in der richtigen Reihenfolge ausgegeben werden können, muß man sie meistens zwischenspeichern um sie in der richtigen Reihenfole ausgeben zu können. Wird die Zahl in einem Feld von immer gleicher Größe ausgegeben, dann kann man auch die Zahl von rechts nach links ausgeben (bei einem LCD ist das möglich).&lt;br /&gt;
&lt;br /&gt;
===Hexadezimal ausgeben===&lt;br /&gt;
&lt;br /&gt;
Zu guter letzt hier noch eine Funktion, die eine Zahl aus dem Register &#039;&#039;&#039;temp1&#039;&#039;&#039; in hexadezimaler Form ausgibt. Die Funktion weist keine Besonderheiten auf und sollte unmittelbar verständlich sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;**********************************************************************&lt;br /&gt;
;&lt;br /&gt;
; Eine 8 Bit Zahl ohne Vorzeichen hexadezimal ausgeben&lt;br /&gt;
;&lt;br /&gt;
; Übergabe:            Zahl im Register temp1&lt;br /&gt;
; veränderte Register: keine&lt;br /&gt;
;&lt;br /&gt;
lcd_number_hex:&lt;br /&gt;
           swap  temp1&lt;br /&gt;
           rcall lcd_number_hex_digit&lt;br /&gt;
           swap  temp1&lt;br /&gt;
&lt;br /&gt;
lcd_number_hex_digit:&lt;br /&gt;
           push  temp1&lt;br /&gt;
&lt;br /&gt;
           andi  temp1, $0F&lt;br /&gt;
           cpi   temp1, 10&lt;br /&gt;
           brlt  lcd_number_hex_digit_1&lt;br /&gt;
           subi  temp1, -( &#039;A&#039; - &#039;9&#039; - 1 ) ; es wird subi mit negativer&lt;br /&gt;
                                           ; Konstante verwendet,&lt;br /&gt;
                                           ; weil es kein addi gibt&lt;br /&gt;
lcd_number_hex_digit_1:&lt;br /&gt;
           subi  temp1, -&#039;0&#039;               ; ditto&lt;br /&gt;
           rcall  lcd_data&lt;br /&gt;
           &lt;br /&gt;
           pop   temp1&lt;br /&gt;
           ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Binär ausgeben===&lt;br /&gt;
Um die Sache komplett zu machen; Hier eine Routine mit der man eine 8 Bit-Zahl binär auf das LC-Display ausgeben kann:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;**********************************************************************&lt;br /&gt;
;&lt;br /&gt;
; Eine 8 Bit Zahl ohne Vorzeichen binär ausgeben&lt;br /&gt;
;&lt;br /&gt;
; Übergabe:            Zahl im Register temp1&lt;br /&gt;
; veränderte Register: keine&lt;br /&gt;
&lt;br /&gt;
; eine Zahl aus dem Register temp1 binär ausgeben&lt;br /&gt;
lcd_number_bit:&lt;br /&gt;
	   push temp1		  ; temp1 gesichert&lt;br /&gt;
           push temp2&lt;br /&gt;
	   push temp3&lt;br /&gt;
&lt;br /&gt;
	   mov temp2, temp1;&lt;br /&gt;
&lt;br /&gt;
	   ldi temp3, 8;      ; 8 Bits werden ausgelesen&lt;br /&gt;
lcd_number_loop:           &lt;br /&gt;
	   dec temp3;&lt;br /&gt;
	   rol temp2;         ; Datenbits ins Carry geschoben ...&lt;br /&gt;
	   brcc lcd_number_bit_carryset_0; &lt;br /&gt;
	   brcs lcd_number_bit_carryset_1;&lt;br /&gt;
           rjmp lcd_number_loop;&lt;br /&gt;
&lt;br /&gt;
lcd_number_bit_carryset_0:	 &lt;br /&gt;
	   ldi temp1, &#039;0&#039;     ; Bit low ausgeben&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
	   tst temp3;&lt;br /&gt;
	   breq lcd_number_ende;&lt;br /&gt;
	   rjmp lcd_number_loop;&lt;br /&gt;
&lt;br /&gt;
lcd_number_bit_carryset_1:&lt;br /&gt;
           ldi temp1, &#039;1&#039;     ; Bit high ausgeben&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
           tst temp3;&lt;br /&gt;
	   breq lcd_number_ende;&lt;br /&gt;
	   rjmp lcd_number_loop;&lt;br /&gt;
&lt;br /&gt;
lcd_number_ende:&lt;br /&gt;
	   pop temp3&lt;br /&gt;
	   pop temp2&lt;br /&gt;
	   pop temp1&lt;br /&gt;
	   ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Eine 16-Bit Zahl aus einem Registerpärchen ausgeben===&lt;br /&gt;
&lt;br /&gt;
Um eine 16 Bit Zahl auszugeben wird wieder das bewährte Schema benutzt die einzelnen Stellen durch Subtraktion abzuzählen. Da es sich hierbei allerdings um eine 16 Bit Zahl handelt, müssen die Subtraktionen als 16-Bit Arithmetik ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;**********************************************************************&lt;br /&gt;
;&lt;br /&gt;
; Eine 16 Bit Zahl ohne Vorzeichen ausgeben&lt;br /&gt;
;&lt;br /&gt;
; Übergabe:            Zahl im Register temp2 (low Byte) / temp3 (high Byte)&lt;br /&gt;
; veränderte Register: keine&lt;br /&gt;
;&lt;br /&gt;
lcd_number16:&lt;br /&gt;
           push  temp1&lt;br /&gt;
           push  temp2&lt;br /&gt;
           push  temp3&lt;br /&gt;
&lt;br /&gt;
; ** Zehntausender **&lt;br /&gt;
           ldi   temp1, &#039;0&#039;-1&lt;br /&gt;
lcd_number1:&lt;br /&gt;
           inc   temp1&lt;br /&gt;
           subi  temp2, low(10000)&lt;br /&gt;
           sbci  temp3, high(10000)&lt;br /&gt;
           brcc  lcd_number1&lt;br /&gt;
           subi  temp2, low(-10000)&lt;br /&gt;
           sbci  temp3, high(-10000)&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
&lt;br /&gt;
; ** Tausender **&lt;br /&gt;
           ldi   temp1, &#039;0&#039;-1&lt;br /&gt;
lcd_number2:&lt;br /&gt;
           inc   temp1&lt;br /&gt;
           subi  temp2, low(1000)&lt;br /&gt;
           sbci  temp3, high(1000)&lt;br /&gt;
           brcc  lcd_number2&lt;br /&gt;
           subi  temp2, low(-1000)&lt;br /&gt;
           sbci  temp3, high(-1000)&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
&lt;br /&gt;
; ** Hunderter **&lt;br /&gt;
           ldi   temp1, &#039;0&#039;-1&lt;br /&gt;
lcd_number3:&lt;br /&gt;
           inc   temp1&lt;br /&gt;
           subi  temp2, low(100)&lt;br /&gt;
           sbci  temp3, high(100)&lt;br /&gt;
           brcc  lcd_number3&lt;br /&gt;
           subi  temp2, -100             ; + 100 High-Byte nicht mehr erforderlich&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
&lt;br /&gt;
; ** Zehner **&lt;br /&gt;
           ldi   temp1, &#039;0&#039;-1&lt;br /&gt;
lcd_number4:&lt;br /&gt;
           inc   temp1&lt;br /&gt;
           subi  temp2, 10&lt;br /&gt;
           brcc  lcd_number4&lt;br /&gt;
           subi  temp2, -10&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
&lt;br /&gt;
; ** Einer **&lt;br /&gt;
           ldi   temp1, &#039;0&#039;&lt;br /&gt;
           add   temp1, temp2&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
&lt;br /&gt;
; ** Stack aufräumen **&lt;br /&gt;
           pop   temp3&lt;br /&gt;
           pop   temp2&lt;br /&gt;
           pop   temp1&lt;br /&gt;
&lt;br /&gt;
           ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Eine BCD Zahl ausgeben===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;**********************************************************************&lt;br /&gt;
;&lt;br /&gt;
; Übergabe:            BCD Zahl in temp1&lt;br /&gt;
; veränderte Register: keine&lt;br /&gt;
;&lt;br /&gt;
lcd_bcd:&lt;br /&gt;
           push  temp2&lt;br /&gt;
          &lt;br /&gt;
           mov   temp2, temp1           ; temp1 sichern&lt;br /&gt;
           swap  temp1                  ; oberes mit unterem Nibble tauschen&lt;br /&gt;
           andi  temp1, 0b00001111      ; und &amp;quot;oberes&amp;quot; ausmaskieren&lt;br /&gt;
           subi  temp1, -0x30           ; in ASCII umrechnen&lt;br /&gt;
           rcall lcd_data               ; und ausgeben&lt;br /&gt;
           mov   temp1, temp2           ; ... danach unteres&lt;br /&gt;
           andi  temp1, 0b00001111&lt;br /&gt;
           subi  temp1, -0x30&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
           mov   temp1, temp2           ; temp1 rekonstruieren&lt;br /&gt;
&lt;br /&gt;
           pop   temp2&lt;br /&gt;
           ret &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Benutzerdefinierte Zeichen ==&lt;br /&gt;
[[Bild:LCD_Character_Grid.png | framed | right| Zeichenraster für 1 Zeichen]]&lt;br /&gt;
&lt;br /&gt;
Das LCD erlaubt für spezielle Zeichen, welche sich nicht im Zeichensatz finden, eigene Zeichen zu definieren. Dazu werden die ersten 8 ASCII Codes reserviert, auf denen sich laut ASCII Tabelle spezielle Steuerzeichen befinden, die normalerweise keine sichtbare Anzeige hervorrufen sondern zur Steuerung von angeschlossenen Geräten dienen. Da diese Zeichen auf einem LCD keine Rolle spielen, können diese Zeichen benutzt werden um sich selbst Sonderzeichen zu erzeugen, die für die jeweilige Anwendung massgeschneidert sind.&lt;br /&gt;
&lt;br /&gt;
Das LCD stellt für jedes Zeichen eine 8*5 Matrix zur Verfügung. Um sich selbst massgeschneiderte Zeichen zu erstellen, ist es am einfachsten sich zunächst auf einem Stück karriertem Papier zu erstellen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:BellCharacter.png | framed | right| Zeichenraster für ein Glockensymbol]]&lt;br /&gt;
&lt;br /&gt;
In diesem Raster markiert man sich dann diejenigen Pixel, die im fertigen Zeichen dunkel erscheinen sollen. Als Beispiel sei hier ein Glockensymbol gezeichnet, welches in einer Telefonapplikation zb als Kennzeichnung für einen Anruf dienen könnte.&lt;br /&gt;
&lt;br /&gt;
Eine Zeile in diesem Zeichen repräsentiert ein an das LCD zu übergebendes Byte, wobei nur die Bits 0 bis 4 relevant sind. Gesetzte Pixel stellen ein 1 Bit dar, nicht gesetzte Pixel sind ein 0-Bit. Das niederwertigste Bit einer Zeile befindet sich rechts. Auf diese Art wird jede Zeile in eine Binärzahl übersetzt, und 8 Bytes repräsentieren ein komplettes Zeichen. Am Beispiel des Glockensymboles: Die 8 Bytes, welches das Symbol repräsentiern, lauten: 0x00, 0x04, 0x0A, 0x0A, 0x0A, 0x1F, 0x04, 0x00,&lt;br /&gt;
&lt;br /&gt;
Dem LCD wird die neue Definition übertragen, indem man dem LCD die &#039;Schreibposition&#039; mittels des Kommandos &#039;&#039;Character RAM Address Set&#039;&#039; in den Zeichensatzgenerator verschiebt. Danach werden die 8 Bytes ganz normal als Daten ausgegeben, die das LCD damit in seine Zeichensatztabelle schreibt.&lt;br /&gt;
&lt;br /&gt;
Durch die Wahl der Speicheradresse definiert man, welches Zeichen (0 bis 7) man eigentlich durch eine eigene Definition ersetzen will.&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
! ASCII Code || Zeichensatzadresse&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0x00&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x08&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 0x10&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 0x18&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 0x20&lt;br /&gt;
|-&lt;br /&gt;
| 5 || 0x28&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0x30&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 0x38&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Nach erfolgter Definition des Zeichens, muss die Schreibposition wieder explizit in den DDRAM-Bereich gesetzt werden.&lt;br /&gt;
Danach kann ein entsprechendes Zeichen mit dem definierten ASCII Code ausgegeben werden, wobei das LCD die von uns definierte Pixelform zur Anzeige benutzt.&lt;br /&gt;
&lt;br /&gt;
Zuerst müssen natürlich erstmal die Zeichen definiert werden.&lt;br /&gt;
Dieses geschieht einmalig durch den Aufruf der Routine &amp;quot;lcd_load_user_chars&amp;quot;&lt;br /&gt;
unmittelbar nach der Initialisierung des LCD-Displays.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
           .&lt;br /&gt;
           .&lt;br /&gt;
           rcall lcd_init              ; Display initialisieren&lt;br /&gt;
           rcall lcd_load_user_chars   ; User Zeichen in das Display laden&lt;br /&gt;
           rcall lcd_clear             ; Display löschen&lt;br /&gt;
           .&lt;br /&gt;
           .&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Durch diesen Aufruf werden die im Flash definierten Zeichen in den&lt;br /&gt;
GC-Ram übertragen. Diese Zeichen werden ab Adresse 0 im GC-Ram&lt;br /&gt;
gespeichert und sind danach wie jedes andere Zeichen nutzbar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
           .&lt;br /&gt;
           .&lt;br /&gt;
           ldi   temp1, 0              ; Ausgabe des User-Char &amp;quot;A&amp;quot;&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
           ldi   temp1, 6              ; Ausgabe des User-Char &amp;quot;G&amp;quot;&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
           ldi   temp1, 5              ; Ausgabe des User-Char &amp;quot;E&amp;quot;&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
           ldi   temp1, 4              ; Ausgabe des User-Char &amp;quot;M&amp;quot;&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
           ldi   temp1, 3              ; Ausgabe des User-Char &amp;quot;-&amp;quot;&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
           ldi   temp1, 2              ; Ausgabe des User-Char &amp;quot;R&amp;quot;&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
           ldi   temp1, 1              ; Ausgabe des User-Char &amp;quot;V&amp;quot;&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
           ldi   temp1, 0              ; Ausgabe des User-Char &amp;quot;A&amp;quot;&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
           .&lt;br /&gt;
           .&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt sollte der Schriftzug &amp;quot;AVR-MEGA&amp;quot;&lt;br /&gt;
verkehrt herum (180 Grad gedreht) erscheinen.&lt;br /&gt;
&lt;br /&gt;
Es fehlt natürlich noch die Laderoutine:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;**********************************************************************&lt;br /&gt;
;&lt;br /&gt;
; Lädt User Zeichen in den GC-Ram des LCD bis Tabellenende (0xFF)&lt;br /&gt;
; gelesen wird. (max. 8 Zeichen können geladen werden)&lt;br /&gt;
;&lt;br /&gt;
; Übergabe:            -   &lt;br /&gt;
; veränderte Register: temp1, temp2, temp3, zh, zl&lt;br /&gt;
; Bemerkung:           ist einmalig nach lcd_init aufzurufen&lt;br /&gt;
;       &lt;br /&gt;
&lt;br /&gt;
lcd_load_user_chars:&lt;br /&gt;
        ldi    zl, LOW (ldc_user_char * 2) ; Adresse der Zeichentabelle&lt;br /&gt;
        ldi    zh, HIGH(ldc_user_char * 2) ; in den Z-Pointer laden&lt;br /&gt;
        clr    temp3                       ; aktuelles Zeichen = 0 &lt;br /&gt;
&lt;br /&gt;
lcd_load_user_chars_2:&lt;br /&gt;
        clr    temp2                       ; Linienzähler = 0&lt;br /&gt;
&lt;br /&gt;
lcd_load_user_chars_1:&lt;br /&gt;
        ldi    temp1, 0b01000000           ; Kommando:    0b01aaalll&lt;br /&gt;
        add    temp1, temp3                ; + akt. Zeichen  (aaa)&lt;br /&gt;
        add    temp1, temp2                ; + akt. Linie       (lll)&lt;br /&gt;
        rcall  lcd_command                 ; Kommando schreiben&lt;br /&gt;
&lt;br /&gt;
        lpm    temp1, Z+                   ; Zeichenline laden &lt;br /&gt;
        rcall  lcd_data                    ; ... und ausgeben&lt;br /&gt;
&lt;br /&gt;
        ldi    temp1, 0b01001000           ; Kommando:    0b01aa1lll         &lt;br /&gt;
        add    temp1, temp3                ; + akt. Zeichen  (aaa)       &lt;br /&gt;
        add    temp1, temp2                ; + akt. Linie       (lll)&lt;br /&gt;
        rcall  lcd_command&lt;br /&gt;
&lt;br /&gt;
        lpm    temp1, Z+                   ; Zeichenline laden&lt;br /&gt;
        rcall  lcd_data                    ; ... und ausgeben &lt;br /&gt;
        &lt;br /&gt;
        inc    temp2                       ; Linienzähler + 1&lt;br /&gt;
        cpi    temp2, 8                    ; 8 Linien fertig?&lt;br /&gt;
        brne   lcd_load_user_chars_1       ; nein, dann nächste Linie &lt;br /&gt;
		&lt;br /&gt;
        subi   temp3, -0x10                ; zwei Zeichen weiter (addi 0x10)&lt;br /&gt;
        lpm    temp1, Z                    ; nächste Linie laden&lt;br /&gt;
        cpi    temp1, 0xFF                 ; Tabellenende erreicht? &lt;br /&gt;
        brne   lcd_load_user_chars_2       ; nein, dann die nächsten&lt;br /&gt;
                                           ; zwei Zeichen&lt;br /&gt;
        ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
... und die Zeichendefinition:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
ldc_user_char:&lt;br /&gt;
                              ;    Zeichen &lt;br /&gt;
                              ;   0       1&lt;br /&gt;
       .db 0b10001, 0b00100   ; @   @ ,   @&lt;br /&gt;
       .db 0b10001, 0b01010   ; @   @ ,  @ @&lt;br /&gt;
       .db 0b11111, 0b10001   ; @@@@@ , @   @&lt;br /&gt;
       .db 0b10001, 0b10001   ; @   @ , @   @&lt;br /&gt;
       .db 0b10001, 0b10001   ; @   @ , @   @&lt;br /&gt;
       .db 0b10001, 0b10001   ; @   @ , @   @&lt;br /&gt;
       .db 0b01110, 0b10001   ;  @@@  , @   @&lt;br /&gt;
       .db 0b00000, 0b00000   ;       , &lt;br /&gt;
&lt;br /&gt;
                              ;    Zeichen&lt;br /&gt;
                              ;   2       3&lt;br /&gt;
       .db 0b10001, 0b00000   ; @   @ , &lt;br /&gt;
       .db 0b01001, 0b00000   ;  @  @ , &lt;br /&gt;
       .db 0b00101, 0b00000   ;   @ @ , &lt;br /&gt;
       .db 0b11111, 0b11111   ; @@@@@ , @@@@@ &lt;br /&gt;
       .db 0b10001, 0b00000   ; @   @ , &lt;br /&gt;
       .db 0b10001, 0b00000   ; @   @ , &lt;br /&gt;
       .db 0b01111, 0b00000   ;  @@@@ , &lt;br /&gt;
       .db 0b00000, 0b00000   ;       ,  &lt;br /&gt;
&lt;br /&gt;
                              ;    Zeichen&lt;br /&gt;
                              ;   4       5&lt;br /&gt;
       .db 0b10001, 0b11111   ; @   @ , @@@@@  &lt;br /&gt;
       .db 0b10001, 0b00001   ; @   @ ,     @&lt;br /&gt;
       .db 0b10001, 0b00001   ; @   @ ,     @&lt;br /&gt;
       .db 0b10001, 0b01111   ; @   @ ,  @@@@ &lt;br /&gt;
       .db 0b10101, 0b00001   ; @ @ @ ,     @&lt;br /&gt;
       .db 0b11011, 0b00001   ; @@ @@ ,     @&lt;br /&gt;
       .db 0b10001, 0b11111   ; @   @ , @@@@@&lt;br /&gt;
       .db 0b00000, 0b00000   ;       ,  &lt;br /&gt;
&lt;br /&gt;
                              ;    Zeichen&lt;br /&gt;
                              ;   6       7&lt;br /&gt;
       .db 0b11110, 0b11111   ; @@@@  , @@@@@  &lt;br /&gt;
       .db 0b10001, 0b01010   ; @   @ ,  @ @ &lt;br /&gt;
       .db 0b10001, 0b00100   ; @   @ ,   @&lt;br /&gt;
       .db 0b11101, 0b01110   ; @@@ @ ,  @@@&lt;br /&gt;
       .db 0b00001, 0b00100   ;     @ ,   @&lt;br /&gt;
       .db 0b10001, 0b01010   ; @   @ ,  @ @&lt;br /&gt;
       .db 0b01110, 0b11111   ;  @@@  , @@@@@&lt;br /&gt;
       .db 0b00000, 0b00000   ;       ,  &lt;br /&gt;
&lt;br /&gt;
       ; End of Tab&lt;br /&gt;
       .db 0xFF, 0xFF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Der überarbeitete, komplette Code==&lt;br /&gt;
&lt;br /&gt;
Hier also die komplett überarbeitete Version der LCD Funktionen.&lt;br /&gt;
&lt;br /&gt;
Die für die Benutzung relevanten Funktionen&lt;br /&gt;
* &#039;&#039;&#039;lcd_init&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;lcd_clear&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;lcd_home&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;lcd_data&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;lcd_command&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;lcd_flash_string&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;lcd_number&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;lcd_number_hex&#039;&#039;&#039;&lt;br /&gt;
sind so ausgeführt, dass sie kein Register (ausser dem Statusregister &#039;&#039;&#039;SREG&#039;&#039;&#039;) verändern. Die bei manchen Funktionen notwendige Argumente werden immer im Register &#039;&#039;&#039;temp1&#039;&#039;&#039; übergeben, wobei &#039;&#039;&#039;temp1&#039;&#039;&#039; vom Usercode definiert werden muss.&lt;br /&gt;
&lt;br /&gt;
[[Media:lcd-routines.asm|Download lcd-routines.asm]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{{Navigation_zurückhochvor|&lt;br /&gt;
zurücktext=Stack|&lt;br /&gt;
zurücklink=AVR-Tutorial: Stack|&lt;br /&gt;
hochtext=Inhaltsverzeichnis|&lt;br /&gt;
hochlink=AVR-Tutorial|&lt;br /&gt;
vortext=Interrupts|&lt;br /&gt;
vorlink=AVR-Tutorial: Interrupts}}&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR-Tutorial|LCD]]&lt;br /&gt;
[[Category:LCD]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Gerber-Tools&amp;diff=82334</id>
		<title>Gerber-Tools</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Gerber-Tools&amp;diff=82334"/>
		<updated>2014-03-27T22:01:45Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Änderung 82321 von 193.170.162.118 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Gerber-Tools sind Programme, die es erlauben die von fast allen [[Schaltplaneditoren|Platinenlayoutprogrammen]] erzeugbaren Gerberfiles zu betrachten, zu überprüfen und eventuell sogar zu manipulieren. Das beginnt mit Tools, die es erlauben die Platinen zu drehen und miteinander zu verbinden bzw. mehrere identische zu größeren Panelen (sog. Nutzen) zusammenzufügen, um sie rationeller fertigen zu können. Es hört auf mit Programmen die in der Lage sind, Leiterbahnen und Bohrlöcher zu verschieben und zu ändern. Es ist guter Stil, seine eigene Arbeit mit einem Gerber-Viewer zu überprüfen, der &#039;&#039;&#039;nicht&#039;&#039;&#039; zum System des Platinenlayoutprogrammes gehört, mit der man die Platinendaten erzeugt hat, allein um systematische Fehler zu minimieren.&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
&lt;br /&gt;
Gerber Daten stellen alle Daten dar, die zur Fertigung einer Leiterplatte benötigt werden. Und eben auch nicht mehr. Also keine Informationen über Netze, Schaltpläne oder Details über Bauteile. Daher erlauben sie es, auch solche Informationen gegenüber dem Fertiger einer Leiterplatte geheim zu halten, im Gegensatz zur Herausgabe von Platinendaten (CAD Boarddateien) direkt aus dem Programm. Ferner ist das Format robust und kompakt. Es enthält alle Angaben, die zur Steuerung eines Photoplotters zur Erstellung von Filmen für die Leiterplattenbelichtung benötigt werden. Es ist eng mit dem &amp;quot;G-Code&amp;quot; für CNC-Drehbänke und Fräßmaschienen verwandt, beschränkt sich aber auf eine zweidimensionale (xy) Darstellung. Gerber hat sich als weit verbreitetes Austauschformat für Leiterplattendaten etabliert; mittlerweile enthält so gut wie jedes Programm zur Platinenentwicklung eine Exportmöglichkeit für Gerber, und so gut wie alle Firmen, die Leiterplatten herstellen, können diese Daten einlesen und verwerten.&lt;br /&gt;
&lt;br /&gt;
== Historisches ==&lt;br /&gt;
&lt;br /&gt;
Das heute gebräuchliche Format RS-274X (X für &amp;quot;extended&amp;quot;) hat einen Vorgänger RS-274D. Wobei RS274D tatsächlich ein Standard zur Steuerung von CNC-Maschinen war, von dem dann für die optischen Verfahren in der Platinenherstellung nur eine Teilmenge verwendet wurde. Der Hauptunterschied zwischen dem RS-274D und RS-274X ist, dass das alte RS-274D keine Informationen über die verwendeten Blenden enthält. Zu einem Gerber File gehörte also immer noch eine Blendendatei. Beim RS-274X ist diese Information (und andere, z.B. die über das Zahlenformat) im Gerberfile selber integriert. Für neue Entwicklung sollte KEIN altes RS-274D mehr verwendet werden, nur neueres RS-274X.&lt;br /&gt;
&lt;br /&gt;
Da früher Photoplotter für den Blendenwechsel drehbare Blendenrevolver hatten, die enteder 6 oder 12 verschiedene Blenden aufnehmen konnte, war die Anzahl der verwendeten Blenden in einem Design beschränkt, wollte man nicht zuviele zeitraubende und teure manuelle Blendenwechsel vornehmen. Das Problem bestand bei späteren Vektorplottern nicht mehr in dieser Form, da diese die Blenden in gewissen Bereichen frei emulieren konnten. Heutige Plotter arbeiten komplett anders, so das die Daten auch anders aufbereitet werden müssen. Das Format der Gerberdateien hat sich als praktisches Austauschformat allerdings erhalten, auch wenn es jetzt nur noch so darstellt, als ob die Daten einen Photoplotter steuern würde. &lt;br /&gt;
&lt;br /&gt;
Entwickelt wurde das Gerber Fileformat von Gerber-Scientific. Später pflegte Barco und jetzt Ucamco die Spezifikationen dieses Formates. &lt;br /&gt;
&lt;br /&gt;
Auch heute ist das Gerber Format noch nicht komplett, weil durch den technischen Fortschritt immer neue Möglichkeiten entstehen, über die das jeweilige aktuelle Gerberformat keine Angaben enthalten kann. Es enthält z.B. keine Angaben über den Lagenaufbau. Solche Informationen müssen dem Fertiger daher in begleitenden Texten oder Zeichnungen übergeben werden.  Um diese Problem anzugehen, veröffentlicht Ucamco einen [http://www.ucamco.com/downloads Vorschlag (und weiter: Extending the Gerber Format with Attributes)] der das Gerber-Dateiformat um Attribute erweitert. Ucamco lädt dazu ein, zu diesem Vorschlag Kommentare und Verbesserungsvorschläge einzureichen, bevor er formell in die Gerberformat Spezifikationen Eingang erhält.&lt;br /&gt;
&lt;br /&gt;
== Details der Formate ==&lt;br /&gt;
=== Allgemein ===&lt;br /&gt;
Wikipedia hat eine Beschreibung des [http://de.wikipedia.org/wiki/Gerber-Format Gerber-Formates]. Die Spezifikation und weitere Informationen findet sich [http://www.ucamco.com/downloads hier als &amp;quot;The Gerber File Format Specification&amp;quot;]. Eine [http://www.artwork.com/gerber/274x/rs274x.htm weitere Erläuterung] hat Steve DiBartolomeo geschrieben. Zu den Gerberdaten im weiteren Sinne zählen auch sog. &amp;quot;Drillfiles&amp;quot;, welche die Ansteuerdaten für die CNC-Platinenbohrmaschinen enthalten. Sie sind den Gerberfiles meist sehr ähnlich, auch wenn sie anderslautende Befehle haben. Weit verbreitet für diesen Zweck sind unter anderem Bohrautomaten der Firma Excellon, und so hat das Excellon-Fileformat eine recht weite Verbreitung gefunden. Eine Beschreibung des Excellon-Fileformates findet sich auf der Homepage von [http://www.excellon.com/manuals/program.htm Exellon]. Bohrdaten können aber auch im Gerberformat dargestellt werden. Sie bilden dann ein eigenes Gerberfile. Im allgemeinen sollten aus praktischen Gründen immer mehrere Bohrdateien pro Platine verwendet werden: Für durchkontaktierte (mit Innenverkupferung, &amp;quot;Via&amp;quot; genannt), und eins für nicht durchkontaktierte Bohrungen. Der Hintergrund ist, das die Bohrungen für durchkontaktierte und nicht durchkontaktierte Bohrungen in zwei unterschiedlichen Arbeitsschritten erfolgen müssen. Bei Multilayerplatinen kann es für manche Lagen weitere Drillfiles geben, je nachdem es sich um &amp;quot;blind&amp;quot; oder &amp;quot;buried&amp;quot; Vias handelt, für die naturgemäß Bohrungen nicht in allen Lagen vorhanden sind. Fräsungen (Für Platinenumrisse und Aussparungen) haben ein eigenes Gerberlayer, in denen die zu fräsenden Konturen eingezeichnet sind. Da Bohrungen ab 2mm Durchmesser gefräst werden können und ab 4mm Durchmesser gefräst werden sollten, besteht eventuell ein Freiraum, um bestimmte Fräsungen besser als Bohrung in ein Drillfile aufzunehemen oder bestimmte Bohrungen als Fräsung in die Fräslage aufzunehmen.&lt;br /&gt;
&lt;br /&gt;
=== Struktur des Formates ===&lt;br /&gt;
&lt;br /&gt;
Jede Kupferlage, aber auch Lötpasten- und Kleberschablone, Lötstopplack, Beschriftung ec. hat seine eigene Gerberdatei. Wenn vorhanden, getrennt nach Vorder- und Rückseite. Die Datei beginnt mit einem Header, im dem Allgemeines, wie das Einheitensystem (Inch oder mm), die Zahlendarstellung (Nullen unterdrückt, Stellen vor und nach dem Dezimaltrenner), und ob eine Lage gespiegelt oder positiv/negativ dargestellt wird. Eine Lötstoppmaske zum Beispiel enthält meist die gleichen Pads wie die korrespondierende Kupferlage, allerdings etwas größer. Die Darstellung erfolgt aber im Gegensatz zur Kupferlage, wo die Pads &amp;quot;Inseln&amp;quot; sind, negativ, was &amp;quot;Löcher&amp;quot; in der die ganze Platine bedeckenden Lötstoppschicht bedeutet. Es folgt eine Blendentabelle. Hierbei wird eine Anzahl von Blenden in Form und Größe definiert. Daran anschliessend Zeilen mit X- und Y-Koordinaten, die entweder mit geschlossener (nur Positionswechsel) oder offener Blende (&amp;quot;Draw&amp;quot;, es wird ein &amp;quot;Strich&amp;quot; gezogen, die Blendenanweisung definiert seine Breite), angefahren werden. Es gibt auch Positionen, die mit geschlossener Blende angefahren werden, und wo am Zielort die Blende kurz geöffnet wird (&amp;quot;Blinks&amp;quot; oder &amp;quot;Flashes&amp;quot;). Diese werden verwendet, um speziell Pads darzustellen. Die Form und Größe der Blende bestimmt hierbei die Form und Größe des erzeugten Pads. Leiterbahnstücke gleicher Form werden nicht als Blink, sondern als Draw mit gleichem Anfangs und Endpunkt (&amp;quot;Null-Länge&amp;quot;) dargestellt. Diese konsequente Trennung von Pads als Blink und Leiterbahnen als Draw ermöglicht es, leichter Änderungen an den Pads vornehmen zu können, in dem man dem Pad eine andere Blendendefinition zuweist. Das gilt auch für mit dem Pad im Zusamenhang zusehenden Blinks für Lötstoppmasken und besonders Pasten- und Klebstoffmasken, die oft vom Bestücker für seinen individuellen Herstellungsprozess angepasst werden müssen. Das Gerberformat enthält auch Anweisungsmöglichkeiten für Skalierung, Makros, Polygone, Drehungen, Kreise u. Kreissegmente, Kommentare ec. Große Flächen werden entweder durch einen Flächenbefehl als Polygon definiert, oder aber durch viele Striche emuliert (&amp;quot;stroke fill&amp;quot;). Die Dateiendung ist nicht einheitlich. Üblich ist es, alle Gerber Dateien mit .gbr, .ger oder .gerber enden zu lassen, und den speziellen Zweck im Dateinahmen unterzubringen (Beispiel: &amp;quot;PlatineProjektname-CopperTop.gbr&amp;quot;), oder aber spezielle Endungen für die jeweilige Gerberlage entsprechend ihrer Verwendung zu benutzen. Ein spezielles System existiert hierbei nicht, jedes Programm handhabt diese auf seine Weise. Eine sehr alte Tradition aus DOS-Zeiten (vermutlich Orcad) ist aber:&lt;br /&gt;
*.BOT  Kupferflaechen Loetseite&lt;br /&gt;
*.drl  Bohrfile (&amp;quot;Drill Rack&amp;quot;, Bohrerliste)&lt;br /&gt;
*.drd  Excellon-Bohrdaten (es müssen aber zwei Bohrdatenlisten existieren. Einmal für durchkontaktierte und einmal für nicht durckontaktierte Bohrungen, weil die Löcher dafür in unterschiedlichen Bearbeitungsstufen gebohrt werden müssen)&lt;br /&gt;
*.dri  Bohrinfo (Statistik über Bohrungen, Bohrerliste)&lt;br /&gt;
*.mnt  Pick and Place Bauteilseite (nur SMD)&lt;br /&gt;
*.mnb  Pick and Place Loetseite (nur SMD, bei Bauteilen auf beiden Seiten)&lt;br /&gt;
*.SMB  Loetstoppmaske Loetseite (Solder Mask Bottom)&lt;br /&gt;
*.SMT  Loetstoppmaske Bestueckungsseite (Solder Mask Top)&lt;br /&gt;
*.SST  Bestueckungsplan Bauteilseite (Silk Screen Top)&lt;br /&gt;
*.SSB  Bestückungsplan Loetseite (Silk Screen Bottom)&lt;br /&gt;
*.TOP  Kupferflaechen Bestueckungsseite&lt;br /&gt;
*.CRT  Lötpastenmaske Bestueckungsseite (Cream Top)&lt;br /&gt;
*.CRB  Lötpastenmaske Lötseite (Cream Bottom)&lt;br /&gt;
*.GLT  Klebermaske Bestueckungsseite (Glue Top)&lt;br /&gt;
*.GLB  Klebermaske Loetseite (Glue Bottom)&lt;br /&gt;
*.KOT  Keepout Bestueckungsseite &lt;br /&gt;
*.KOB  Keepout Loetseite&lt;br /&gt;
*.OUT  Outline&lt;br /&gt;
&lt;br /&gt;
andere Endungen:&lt;br /&gt;
*.NCD  Drillfile&lt;br /&gt;
*.TOL  Toolfile&lt;br /&gt;
*.TC   Drillcounter&lt;br /&gt;
&lt;br /&gt;
Vorschläge für alternative Dateiendungssysteme finden sich im einschlägigen [http://de.wikipedia.org/wiki/Gerber-Format Wikipedia Artikel].&lt;br /&gt;
&lt;br /&gt;
== Tipps ==&lt;br /&gt;
&lt;br /&gt;
*Wenn man Gerber- und Drillfiles erstellt, verwenden man am besten für beide ein einheitliches Zahlenformat, sofern das Layoutprogramm dazu eine Wahl lässt. Richten Sie sich dabei in erster Linie an den Bohrdaten aus, da diese der Dreh und Angelpunkt der Toleranzen sind.&lt;br /&gt;
*Den Nullpunkt der Koordinaten legt man dabei idealerweise nach unten links, falls das Layoutprogram dazu eine Wahl lässt.&lt;br /&gt;
*Man sollte nach Möglichkeit nur noch Gerber RS-274X (&amp;quot;Extended Gerber&amp;quot;) verwenden.   &lt;br /&gt;
*Als standardmäßige Formateinstellung für Gerberdaten empfielt sich dabei 3.3 metrisch. Hintergrund: Die IPC Spezifikation empfiehlt, die höchste Auflösung zu verwenden.&lt;br /&gt;
*Man verwendet nach Möglichkeit kein &amp;quot;Stroke fill&amp;quot; für Kupferflächen, sondern einen Polygon-Befehl. Leider lässt das nicht jedes Programm zu. Eine Begründung für die Vermeidung findet sich hier unter [http://www.ucamco.com/downloads &amp;quot;Painting considered harmful&amp;quot;].&lt;br /&gt;
* Für Pads gilt ähnliches in noch verschärfterer Form: Pads sollten nach möglichkeit immer &amp;quot;Blinks&amp;quot; sein. Allerdings ist das bei exotischren Padformen nicht so ohne weiteres möglich.&lt;br /&gt;
* Alle Lagen &amp;quot;in normaler&amp;quot; Ansicht ausgeben. D.h. so, wie man sie sehen würde, wenn man mit einem Röntgenblick von der Bauteilseite durch die Platine schauen würde. Schriften auf der Unterseite die im fertigen Objekt normal lesbar sein sollen, erscheinen dabei gespiegelt.&lt;br /&gt;
* Ein Platinenbeschreibung in einem allgemein lesbaren Format (z.B. PDF oder TXT, &#039;&#039;&#039;nicht&#039;&#039;&#039; die obskuren Formate irgendwelcher Textverarbeitungssysteme) dabeilegen. Ausser Informationen über Lagenaufbau und die Abmessungen solte diese Beschreibung eine Liste aller Gerber- und Bohrfiles enthalten, mit einer &#039;&#039;&#039;expliziten Nennung&#039;&#039;&#039; der Lage, für die sie gedacht sind. Das gilt besonders für Innenlagen, die nicht nur einfach durchnummeriert sein sollten, sondern es sollte &#039;&#039;&#039;explizit&#039;&#039;&#039; angegeben werden, in welcher Position sich die &amp;quot;Nummer&amp;quot; zur Ober- oder Unterseite befindet. Bei einem vierlagigen Aufbau ist es sonst nicht eindeutig klar, das &amp;quot;Layer 1&amp;quot; die Lage direkt unter der Oberseitenlage ist.&lt;br /&gt;
* Die Lagen sollten nicht gespiegelt sein.&lt;br /&gt;
* Kupferlagen sollten nicht komplett negativ sein, auch wenn sie negative Teile enthalten. Aber Lötstoppmaske, Lotpastenmaske und Klebstoffmaske schon.&lt;br /&gt;
* Die Lagen sollten keinen Versatz gegeneinander haben.&lt;br /&gt;
* Es sollte eine Konturlage existieren, die alle (Aussen-) Konturen der Platine enthält.&lt;br /&gt;
* Für durchkontaktierte und nicht durchkontaktierte Bohrungen sollten separate Bohrfiles existieren. Diese sind dann aber im [http://en.wikipedia.org/wiki/Excellon_format Excelon-Format] und nicht Gerber. Bei Multilayer Aufbauten sind für jeden separaten Bohrvorgang separate Borfiles nötig (Achtung bei blind und buried Vias). Ist, wegen irgendeiner Besonderheit der speziellen Platine, ein sonst üblicher Bohrvorgang nicht vorhanden, so sollte das auch &#039;&#039;&#039;expliziet&#039;&#039;&#039; im begleitenden Text vermerkt werden.&lt;br /&gt;
* Ein konkreter Fall mit Fragen zur Erstellung von Gerberdaten (aus Target, gilt aber allgemein) findet sich [http://www.mikrocontroller.net/topic/319625#new hier].&lt;br /&gt;
&lt;br /&gt;
== Alternativen zu Gerber ==&lt;br /&gt;
&lt;br /&gt;
Viele Leiterplattenhersteller aktzeptieren auch die direkten Entwicklungsdaten für die meisten weitverbreiteten Leiterplattenlayout Programme. Insbesondere gilt das für Eagle, Kicad, Target, Altium und Orcad. Es empfielt sich darum, den gewünschten Leiterplattenhersteller nach den Formaten, die er verarbeiten kann, zu fragen. Allerdings gibt man in diesem Falle wesentlich mehr Daten heraus, als für eine Produktion nötig ist. Insofern kann das als Sicherheitsrisiko gesehen werden, was aber für Amateure eher nebensächlich sein dürfte.&lt;br /&gt;
&lt;br /&gt;
Ein weiteres, wesentlich schwerwiegenderes, Risiko liegt aber darin, das die CAD-Systemdaten wesentlich interpretierfähiger als die Gerberdaten sind, was zu fatalen Missverständnissen führen kann.&lt;br /&gt;
&lt;br /&gt;
Für die Produktion müssen die Daten aber auf jeden Fall vom Leiterplattenhersteller speziell für seine Anlagen aufbereitet werden. Darum, und um eine Kompatibilität mit den Daten anderer CAD-Systeme zu erhalten, werden die Daten dann im allgemeinen doch in das Gerberformat umgewandelt, da Gerber als Austauschformat den kleinsten gemeinsamen Nenner darstellt. Weil Gerber für den Austausch am weitesten verbreitet ist, haben die Leiterplattenhersteller darin auch oft die meiste Erfahrung und meiste Übung und oft feststehende Vorgehensweisen im Sinne der Qalitätssicherung.&lt;br /&gt;
&lt;br /&gt;
Daher ist es angeraten, seine Daten im Gerberformat bei den Leiterplattenherstellern einzureichen.&lt;br /&gt;
&lt;br /&gt;
Eine Diskussion zum Thema &amp;quot;CAD-Dateien statt Gerber&amp;quot; findet sich [http://www.mikrocontroller.net/topic/319065#new hier im Forum].&lt;br /&gt;
&lt;br /&gt;
Als direktes alternatives Dateiformat zu Gerber wäre ODB++ zu nennen, welches aber proprietär von Valor ist. Eine Diskussion zum Thema &amp;quot;ODB++ statt Gerber&amp;quot; findet sich [http://www.mikrocontroller.net/topic/320716#new hier im Forum]. Desweiteren entwickelte [http://www.ipc.org/de/default.aspx der IPC] mit [http://ipc-2581.com/ IPC-2581] ein XML basiertes Format, das sich bisher aber kaum verbreiten konnte. Es gibt wohl neuere Ansätze, IPC-2581 und Gerber aneinander anzugleichen. Auch dazu veröffentlichte Ucamco einen [http://www.ucamco.com/downloads Vorschlag (Und weiter: IPC-2581 meets the Gerber File Format)] der das Gerber-Dateiformat um Angaben z.b. zum Lagenaufbau erweitert.&lt;br /&gt;
&lt;br /&gt;
Ein [http://www.ilfa.de/Publikationen Plädoyer für Gerber (unter &amp;quot;Datenformate: Gerber&amp;quot;)] hält auch A.Wiemers.&lt;br /&gt;
&lt;br /&gt;
Grundsätzlich zählt das Gerberformat zu den Vektorgrafikformaten. Daher ist hypothetisch auch z.B. [http://de.wikipedia.org/wiki/SVG das SVG-Format] geeignet, um Platinendaten zu transportieren und zu manipulieren. Allerdings ist das bisher nicht üblich, und u.U. riskant, weil eine identische Darstellung in verschiedenen Programmen aufgrund der Komplexität von SVG nicht immer gewährleistet ist.&lt;br /&gt;
&lt;br /&gt;
== Gerber Tools == &lt;br /&gt;
&lt;br /&gt;
* [http://www.GerberLogix.com GerberLogix]: Einfach zu bedienender Extended Gerber Viewer. Weitere Formate sind Excellon 1/2. Highlight ist die Automatische Bemaßung von Leiterbahnen. Für Hobbyisten Kostenlos.&lt;br /&gt;
&lt;br /&gt;
* [http://www.PCB-Investigator.com PCB-Investigator]: Umfangreiche Funktionalität zum vergleichen verschiedenster Leiterplatten Daten. Wandelt alle Daten auch in 3D um. ODB++, IPC 2581, GenCAD und Gerber Daten. &lt;br /&gt;
&lt;br /&gt;
* [http://ruggedcircuits.com/gerbmerge/ Gerbmerge]: Ein unter Python geschriebenes Tool, mit denen einzelne Platinen zu größeren Nutzen zusammengefügt werden können. Freeware. &lt;br /&gt;
&lt;br /&gt;
* [http://www.graphicode.com/GC-Prevue_Gerber_Viewer gc-preview]: Ein Programm, um Gerberdaten ansehen und drucken zu können. Freeware.&lt;br /&gt;
&lt;br /&gt;
* Die Firma Graphicode bietet auch noch andere, im allgemeinen kostenpflichtige Software an, mit der diverse Plotter- und Platinenformate, u.a. auch Gerberdaten, ineinander überführt werden können, wie z.B. [http://www.graphicode.com/products/cam GC-CAM-Edit].&lt;br /&gt;
&lt;br /&gt;
* [http://www.softwarecompanions.com/gerbview.html GerbView (1)]: Ein Programm, das in der Lage ist, verschiedene Platinen- und Plotterformate, darunter eben auch Gerberdaten, zu sichten, ineinander zu convertieren, zu markieren und zu drucken. 30 Tage Testversion. &lt;br /&gt;
&lt;br /&gt;
* [http://iut-tice.ujf-grenoble.fr/kicad/ GerbView (2)]: Ebenfalls unter dem Namen GerbView existiert ein anderer Gerberviewer als Bestandteil von [[KiCAD]]. Dieser erlaubt das Betrachten der Gerberfiles und den Export als Platine in PCBnew, welches ebenfals Bestandteil von KiCAD ist. Unter KiCAD/PCBnew kann diese Platine dann manipuliert, verändert und wieder als Gerberfile exportiert werden. Allerdings können so nur Gerber-RS274X Daten eingelesen und exportiert werden. Blinks werden aber beim Reimport als Durchkontaktierung dargestellt. Insgesammt ist dieses Feature ziemlich &amp;quot;buggy&amp;quot; und unperfekt. Letzteres ist aber aus grundsätzlichen Erwägungen heraus auch schwer zu ändern. Siehe: http://www.mikrocontroller.net/topic/263576#2739329&lt;br /&gt;
&lt;br /&gt;
* [http://gerbv.gpleda.org/index.html Gerbv]: Ebenfalls ein Open Source Gerberviewer. Er gehört zum gEDA Projekt. Funktioniert hervorragend und hat viele Features. Verarbeitet RS-274-X und Excellon-Bohrdaten, jedoch kein RS-274 (Standard-Gerber). Dieser Gerberviewer ermöglicht auch das Löschen einzelner Strukturen und das Umskalieren, Verschieben, Spiegeln und Drehen der gesamten Gerberdatei. Gespeichert wird nur Extendet Gerber. &lt;br /&gt;
&lt;br /&gt;
* [http://www.pentalogix.com ViewMate]: ist eine professionelle CAM-Software, die als Viewer kostenlos abgegeben wird. Die Funktionen zum Ändern und Speichern sind gesperrt, aber zum Überprüfen der Ausgabedaten hervorragend geeignet (auch Bohrdaten). Dies kostenlose Version läuft auch recht gut unter wine (Debian squeeze). &lt;br /&gt;
&lt;br /&gt;
* [http://www.mentor.com/products/pcb-system-design/downloads/odb-viewer VUV]: ODB++ Viewer, der von der Firma Valor, jetzt von Mentor übernommen, kostenlos abgegeben wird.&lt;br /&gt;
&lt;br /&gt;
* [http://www.cenon.info/ Cenon]: Cenon ist eine Open Source Software um speziell Vektorgrafiken zu betrachten, zu manipulieren und zu konvertieren. Das Gerberformat ist grundsätzlich als Vektorgrafikformat anzusehen. Cenon kann auch Standard und extendet Gerber einlesen, und als extendet Gerber wieder abspeichern. Es können einzelne Strukturen in Gerber selektiert, kopiert, gelöscht, verschoben, gedreht und eingefügt werden. Ebenso können Mehrfachnutzen erstellt werden. Es kann auch in oder aus anderen Vektorformaten wie PDF, PS, HPGL, DXF konvertiert werden. Die Bedienung des Programmes ist manchmal sehr pfiffig, aber leider meistens sehr gewöhnungsbedürftig. Es ist z.B. unbedingt darauf zu achten, das die Dateien adäquate Endungen haben, als Gerber lässt Cenon nur .ger und .gerber zu. Bei der Zusammenarbeit mit anderen Programmen ist es daher leider oft nötig, die Dateien ständig umzubenennen. Unter Debian Squeeze existiert ein Cenon Package. Leider müssen z.Z. (17. Nov. 2011) nach der Installation noch die GNUstep Librarys manuell von /usr/lib/GNUstep/Library nach /usr/lib/GNUstep/Cenon oder /usr/local/lib/GNUstep/Cenon kopiert werden. Es ist dringend anzuraten, die  [http://www.cenon.info/frameLoad_de.html?support_faq_de.html Cenon FAQ] und das [http://www.vhf-group.com/vhf-interservice/download/doc/Cenon_de.pdf Cenon Handbuch] zu lesen.&lt;br /&gt;
&lt;br /&gt;
* [[Media:PyGerberAnalyse_B5_13Jun2013.zip]] Absolut primitives Programm zur Gerber-Daten Analyse. Test-Status. Geschrieben in Python3. Kann Gerber247d und Gerber247x einlesen und teilweise analysieren und die Analyse als Datei abspeichern, aber keine Makros darin. Kann auch Drill Files einlesen. Kann Gerber- oder Drill-Files in rudimentärer Form anzeigen (z.B. OHNE Aperturen, kein Maßstab, ist somit für fast nichts zu gebrauchen). Das Programm besteht aus den drei Teilen PyGerbAnalyse_B5_13Jun2013.py, ClassDefBasicAnalysisResults_13Jun2013.py und ClassDefGerberLayer_13Jun2013.py. Gestartet wird nur PyGerbAnalyse_B5_13Jun2013.py, die anderen beiden Python Files enthalten Klassendefinitionen. Steht unter GNU-GPL. Autor Bernd Wiebus. KEINE GARANTIE! Testberichte, Hinweise, Informationen und Anregungen sowie dringend benötigte Testdateien mit normalen und exotischen, auch älteren, Gerberformaten von unterschiedlichen Layoutprogrammen bitte an bernd.wiebus@gmx.de senden. DANKE im Voraus dazu! Es ist eine Python3 Version des unter dem BASIC-Dialekt Gambas2 geschriebenen ebenso primitiven Viewers, der unter [[Media:GerbAnalyse_RevA6.zip]] zu bekommen ist. Python3 ist unter Linux bei den meisten Distributionen als Packet installierbar. Windows User könnten vieleicht Möglichkeiten in dieser Diskussion finden: http://www.mikrocontroller.net/topic/280970#new&lt;br /&gt;
&lt;br /&gt;
* [http://www.gerber-viewer.com/ gerber-viewer.com]: Für die schnelle Kontrolle von Gerberdaten eignet sich auch ein online Viewer. Einfach Zip-Archiv oder Gerberdaten auswählen, uploaden und online begutachten. Datensicherheit beachten! Gerberdaten werden dabei herausgegeben!&lt;br /&gt;
&lt;br /&gt;
* [http://www.numericalinnovations.com/collections/fab-3000-gerber-cam?gclid=CLj1-_GW6LsCFclQ3godr3sASQ FAB 3000 V7]: Ein Gerberviewer und Editor von Numerical Innovations. Es existiert auch eine Trial Version.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/aitjcize/QCamber QCamber] Relativ neue Software, über die noch wenig bekannt ist.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch == &lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/293100#new Forumsbeitrag]: Gerber Daten: wie erkenne ich, ob Bohrung metallisiert ist?&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/311780#new Forumsbeitrag]: Gerberdatei für Lötstoppmaske&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/311426#new Forumsbeitrag]: Ein Klassiker - Gerberdaten und Blendendatei - RS274D vs. RS274X&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/310333#new Forumsbeitrag]: Kicad: Bohrdatei&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/309923#new Forumsbeitrag]: Gerbv Layoutkontrolle fehlerhafte Anzeige/ Ergebnisse?&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/309765#new Forumsbeitrag]: Bohrdatei für fertige Leiterplatte&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/303326#new Forumsbeitrag]: gerber Preview gcprevue welche Version empfehlenswert?&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/298632#new Forumsbeitrag]: Gerber Daten für Board Cutout (Altium)&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/307967#new Forumsbeitrag]: Kann mir wer Eagle zu Gerber exportieren&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/291090#new Forumsbeitrag]: Altium exportiert nicht korrekt in Gerber&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/262726#new Forumsbeitrag]: Gerber Daten (formate und Dateiendungen)&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/255449#new Forumsbeitrag]: Eagle CAM-Job / Itead Studio - Fehler in Gerber Dateien?&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/255129#new Forumsbeitrag]: Layout (Gerber) in Nutzen umwandeln - suche Tool&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/241858#new Forumsbeitrag]: EAGLE: Genauigkeit für Gerber-Dateien einstellen - wo? wie?&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/319065#new Forumsbeitrag]: CAD-Daten oder Gerberdaten herausgeben?&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/320716#new Forumsbeitrag]: Diskussion über ODB++ als Alternative zu Gerber.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Schaltplaneditoren]]&lt;br /&gt;
[[Category:Platinen]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_Transistortester&amp;diff=82193</id>
		<title>AVR Transistortester</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_Transistortester&amp;diff=82193"/>
		<updated>2014-03-24T09:00:23Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Änderung 82192 von 14.214.190.16 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Original Entwurf: http://www.mikrocontroller.net/articles/AVR-Transistortester&lt;br /&gt;
&lt;br /&gt;
Weiterentwickelt von Karl-Heinz Kübbeler&lt;br /&gt;
&lt;br /&gt;
Ich habe das Transistortester Projekt von Markus Frejek weitergeführt und speziell die Software weiterentwickelt.&lt;br /&gt;
Aufgrund der verbesserten Eigenschaften wurde schon der Name Komponententester vorgeschlagen. Ich selbst sehe aber immer noch die herausragende Eigenschaft in der automatischen Bestimmung von Transistortyp und Eigenschaft, wie sie von&lt;br /&gt;
Markus Frejek entwickelt wurde.&lt;br /&gt;
&lt;br /&gt;
Hier möchte ich die wichtigsten &#039;&#039;&#039;Eigenschaften&#039;&#039;&#039; aufführen&lt;br /&gt;
&lt;br /&gt;
* Arbeitet mit ATmega8, ATmega168 und ATmega328 Prozessoren.&lt;br /&gt;
* Anzeige der Meßergebnisse auf ein 2x16 Zeichen LCD.&lt;br /&gt;
* Ein-Tastenbedienung mit automatischer Abschaltung.&lt;br /&gt;
* Das Gerät besitzt drei universelle Meßports (Test Pin).&lt;br /&gt;
* Automatische Erkennung von NPN, PNP, N- und P-Kanal MOSFET, JFET, Dioden und Kleinsignal Thyristor und TRIAC.&lt;br /&gt;
* Automatische Erkennung der Pin-Belegung der Bauteile, die Bauelemente können beliebig angeschlossen werden.&lt;br /&gt;
* Messung des Stromverstärkungsfaktors und der Basis-Emitter Spannung für bipolare Transistoren, auch für Darlingtontransistoren.&lt;br /&gt;
* Automatische Erkennung eine Schutzdiode für bipolare Transistoren und MOSFETs.&lt;br /&gt;
* Bei bipolaren Transistoren mit Schutzdiode wird ein parasitärer Transistor erkannt (NPNp = NPN + parasitär PNP).&lt;br /&gt;
* Bis zu zwei Widerstände werden in einer Messung mit einer Auflösung von bis zu 0,1 Ohm gemessen, wobei der Meßbereich bis über 50 MOhm reicht. Widerstandswerte unter 10 Ohm werden für den ATmega168/328 mit der ESR-Meßmethode mit einer Auflösung von 0.01 Ohm angezeigt.&lt;br /&gt;
* Ein angeschlossener Kondensator kann gemessen werden im Bereich 35pF bis 100mF mit einer Auflösung von bis zu 1 pF.&lt;br /&gt;
* Widerstände und Kondensatoren werden mit ihren Symbolen dargestellt, umgeben von den gefundenen Anschlußpin Nummern.&lt;br /&gt;
* Die Widerstands und Kondensator-Werte werden mit bis zu vier Dezimalstellen in der richtigen Dimension angezeigt.&lt;br /&gt;
* Bis zu zwei Dioden werden ebenfalls mit ihrer Symboldarstellung flußrichtungsrichtig angezeigt, umgeben von den Anschlußpin Nummern und der zusätzlichen Angabe der Flußspannung.&lt;br /&gt;
* Bei einzelnen Dioden wird zusätzlich der Kapazitätswert und ab Version 1.08k auch der Strom in Sperr-Richtung gemessen.&lt;br /&gt;
* Für ATmega168/328 ist eine Kalibration der Nullkapazität, des Nullwiderstandes und weiterer Parameter im Selbsttest-Zweig möglich.&lt;br /&gt;
* Für ATmega168/328 können auch Induktivitäten von etwa 0.01mH bis über 20H erkannt und gemessen werden.&lt;br /&gt;
* Für ATmega168/328 ist eine ESR-Messung (Equivalent Series Resistance) für Kondensatoren über 0.18 µF mit einer Auflösung von 0.01 Ohm integriert.&lt;br /&gt;
* für ATmega168/328 wird für Kondensatoren über 5 nF der Spannungsverlust Vloss nach einem Ladepuls untersucht. Damit läßt sich die Güte der Kondensatoren abschätzen.&lt;br /&gt;
Ausführlichere Informationen mit Meßbeispielen kann man in den pdf-Dokumentationen in deutscher und englischer Sprache nachlesen.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Software wurde basierend auf der Arbeit von Markus F. weiterentwickelt.&lt;br /&gt;
Der Teil für die Kondensatormessung wurde komplett neu geschrieben und auch die Widerstandsmessung wurde erheblich überarbeitet. Bei Schwierigkeiten und Problemen sollte man mich über E-mail oder über den Diskussionsteil (thread) benachrichtigen.  Nur wenn ich von Problemen weiß, kann ich hoffentlich Abhilfe schaffen.&lt;br /&gt;
&lt;br /&gt;
Weitere Einzelheiten sowie Beschreibung der einzelnen Meßverfahren und Beispiel-Ergebnisse habe ich in der pdf-Dokumentation (deutsche und englische Version) beschrieben. Hier finden man auch Hinweise zum Konfigurieren der Software mit Makefile Parametern und Optionen. &lt;br /&gt;
Die Kommentare im Quellcode sind in englischer Sprache.&lt;br /&gt;
Neu eingebaut in der Software ist eine Selbsttest-Funktion, in der die Funktion des Testers gemessen wird. In diesen Selbsttest ist auch ein Kalibrationsteil integriert.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Im Prinzip ist die neue Software so zu konfigurieren, daß sie auf der bereits von Markus F. vorgestellten Hardware ohne Änderungen läuft.&lt;br /&gt;
&lt;br /&gt;
Sinnvoll sind dennoch einige Änderungen:&lt;br /&gt;
&lt;br /&gt;
* Der Prozessor sollte auf einen 8 MHz Taktfrequenz umgestellt werden, am besten mit einem externen Quarz. Dazu müssen die fuses des ATmega geändert werden.&lt;br /&gt;
* Ein &amp;quot;pull up&amp;quot; Widerstand von etwa 27 kOhm sollte von Pin 13 (PD7) des ATmega nach VCC nachgerüstet werden.&lt;br /&gt;
* Der 100 nF Kondensator am Pin 21 (AREF) kann entweder ganz entfernt werden oder besser durch einen 1 nF Kondensator ersetzt werden.&lt;br /&gt;
* Wenn die elektronische Einschaltung des Testers Probleme macht, sollte wenigstens der C2 Kondensator an der Basis von Transistor T1 auf 10 nF reduziert werden und ggf. auch der Widerstand R7 auf 3,3 kOhm reduziert werden. Das komplette Schaltbild und Einzelheiten dazu findet man in der PDF Dokumentation.&lt;br /&gt;
&lt;br /&gt;
Die Gründe und die Einzelheiten für diese Änderungen sowie weitere Hinweise für einen Neuaufbau sind im Hardware-Kapitel meiner pdf-Dokumentation beschrieben. Empfohlen wird ein ATmega168 Prozessor oder auch ein ATmega328 Prozessor, weil der ADC mit der Autoscale Funktion im Bedarfsfall von der 5V Referenz (VCC) auf die interne Referenz-Spannung umgeschaltet wird. Die interne Referenz hat für der ATmega8 eine Spannung von 2,56V, für die anderen Prozessoren aber 1,1 Volt. Mit 1,1 V kann eine bessere Auflösung des ADC für gemessene Spannungen unter 1 Volt erreicht werden.&lt;br /&gt;
Man kann den ATmega8 ohne Hardwareänderung gegen einen ATmega168 oder ATmega328 austauschen!&lt;br /&gt;
Hier ist der Teil der Schaltung, der für die Messung erforderlich ist.&lt;br /&gt;
Die Elektronik für die Batterieversorgung und die automatische Abschaltung fehlt in diesem Schaltbild.[[Datei:TransistorTesterVC1.png|miniatur|Schaltbild ohne Stromversorgung]]&lt;br /&gt;
&lt;br /&gt;
Die rot markierten Bauteile sind nicht unbedingt erforderlich, können aber zu einer Verbesserung der Messgenauigkeit beitragen. Die grün markierten Bauteile sind gegenüber dem ersten Entwurf von Markus F. geändert.&lt;br /&gt;
Die Eagle Dateien von Asko B. für drei Varianten sind im Thread zu finden bei der Adresse: http://www.mikrocontroller.net/topic/248078?page=4#2891344&lt;br /&gt;
&lt;br /&gt;
Hier ist der Artikel der 1. Transistortester Version von Markus F. zu finden: [http://www.mikrocontroller.net/articles/AVR-Transistortester http://www.mikrocontroller.net/articles/AVR-Transistortester]&lt;br /&gt;
&lt;br /&gt;
== Diskussionen zur neuen Version ==&lt;br /&gt;
Der Thread mit meinen älteren Software-Versionen und einigen Problemfällen sowie Hardware-Vorschlägen ist unter [http://www.mikrocontroller.net/topic/248078#new http://www.mikrocontroller.net/topic/248078#new] zu finden.&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
Alle Versionen von der Software und der Doku sind im SVN gespeichert.&lt;br /&gt;
Die Benutzer können über den svnbrowser  [http://www.mikrocontroller.net/svnbrowser/transistortester/ http://www.mikrocontroller.net/svnbrowser/transistortester/] das gewählte Verzeichnis als &amp;quot;GNU tarball&amp;quot; runterladen. Beim Aufruf des svnbrowsers steht dazu unter der Datei/Verzeichnis Liste der Eintrag &amp;quot;Download GNU tarball&amp;quot;.&lt;br /&gt;
Zum Auspacken der heruntergeladenen transistortester*.tar.gz Datei benötigen Windows Benutzer eine geeignete Software wie das Freeware Paket 7-Zip. Nach dem Auspacken hat man den vorher mit dem svnbrowser ausgewählten Verzeichnisbaum auf seinem eigenen Rechner. Ein direkter Zugriff auf die Dateien mit dem svnbrowser ist nicht möglich!&lt;br /&gt;
&lt;br /&gt;
Eine andere Methode auf den Inhalt des svn Archivs zuzugreifen besteht mit der&lt;br /&gt;
Installation des TortoiseSVN Plugins für den Windows Explorer. Damit ist dann der Zugriff über [svn://mikrocontroller.net/transistortester svn://mikrocontroller.net/transistortester] direkt auf das Archiv mit dem Browser möglich.&lt;br /&gt;
&lt;br /&gt;
Linux Benutzer können auch direkt über svn auf das Archiv zugreifen.&lt;br /&gt;
&lt;br /&gt;
== Downloads (english) ==&lt;br /&gt;
All versions of the software and documentation are saved in the SVN archive.&lt;br /&gt;
Users can download a &amp;quot;GNU tarball&amp;quot; of the previous selected directory with the svnbrowser [http://www.mikrocontroller.net/svnbrowser/transistortester/ http://www.mikrocontroller.net/svnbrowser/transistortester/].&lt;br /&gt;
Windows users need a additional tool like the freeware 7-Zip to unpack the downloaded transistortester*.tar.gz file.&lt;br /&gt;
After unpacking you have a copy of the selected directory at your own computer.&lt;br /&gt;
The direct access is not possible with the svnbrowser!&lt;br /&gt;
&lt;br /&gt;
Another way to get access to the SVN data is to install the TortoiseSVN plugin for the windows explorer. After installing you&lt;br /&gt;
can access the data with [svn://mikrocontroller.net/transistortester svn://mikrocontroller.net/transistortester] .&lt;br /&gt;
&lt;br /&gt;
Linux users can also access the data with svn directly.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Ordnerstruktur und Beschreibung der  &#039;&#039;Pfade&#039;&#039; im SVN&#039;&#039;&#039;&lt;br /&gt;
|- style=&amp;quot;background-color:#B3B7FF&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center&amp;quot; colspan=&amp;quot;2&amp;quot; | &#039;&#039;&#039;Ordner/directory&#039;&#039;&#039; || &#039;&#039;&#039;Dateien/files&#039;&#039;&#039; || &#039;&#039;&#039;Beschreibung/description&#039;&#039;&#039;&lt;br /&gt;
|-   style=&amp;quot;background-color:#B9FFC5&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Doku&#039;&#039;&#039; || || || Enthält die Dokumentation als PDF und als pdflatex-Quelltext&lt;br /&gt;
|-&lt;br /&gt;
| || &#039;&#039;&#039;trunk&#039;&#039;&#039; || || Letzter Entwicklungsstand der Dokumentation inclusive Bilder und Diagrammen&lt;br /&gt;
|-&lt;br /&gt;
| || &#039;&#039;&#039;trunk/pdftex/german&#039;&#039;&#039; || || enthält die deutschen Texte, Makefile und pdf-Dokumentation der Entwicklerversion&lt;br /&gt;
|-&lt;br /&gt;
| || &#039;&#039;&#039;trunk/pdftex/english&#039;&#039;&#039; || || contains the english text, Makefile and pdf documentation of the developer version&lt;br /&gt;
|-&lt;br /&gt;
| || &#039;&#039;&#039;trunk/pdftex/russian&#039;&#039;&#039; || || contains the russian text, Makefile and pdf documentation of the developer version&lt;br /&gt;
|-&lt;br /&gt;
| || &#039;&#039;&#039;tags&#039;&#039;&#039; ||&#039;&#039;changelog.txt&#039;&#039; || &#039;&#039;Hier sollte jede Änderung mit Versionsnummer eingetragen werden&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| || &#039;&#039;&#039;tags/german&#039;&#039;&#039; || || &#039;&#039;Aktuelle PDF Dokumentation in deutsch&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| || &#039;&#039;&#039;tags/english&#039;&#039;&#039; || || &#039;&#039;Actual PDF Documentation in English&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| || &#039;&#039;&#039;tags/old/german&#039;&#039;&#039; || || &#039;&#039;PDF Dokumentationen zu früheren Softwareversionen&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| || &#039;&#039;&#039;tags/old/english&#039;&#039;&#039; || || &#039;&#039;PDF Documentation for earlier software versions&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;quot;background-color:#B9FFC5&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Hardware&#039;&#039;&#039; || || || Hardware Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| || &#039;&#039;&#039;strip_grid&#039;&#039;&#039; || || Verzeichnis für eine Streifenleiterplatine&lt;br /&gt;
|-&lt;br /&gt;
| || &#039;&#039;&#039;strip_grid/ttester_strip_grid.diy&#039;&#039;&#039; || || Beispiel einer Streifenleiterplatine, DIYLC-Datei&lt;br /&gt;
|-&lt;br /&gt;
| || &#039;&#039;&#039;strip_grid/TTester_strip.pdf&#039;&#039;&#039; || || Ergebnis der Streifenleiterplatine im PDF Format&lt;br /&gt;
|-&lt;br /&gt;
| || &#039;&#039;&#039;strip_grid/LiesMich.txt&#039;&#039;&#039; || || Kurzdokumentation für Streifenleiter-Platine&lt;br /&gt;
|-&lt;br /&gt;
| || &#039;&#039;&#039;strip_grid/ReadMe.txt&#039;&#039;&#039; || || Short documentation for the strip grid board&lt;br /&gt;
|-&lt;br /&gt;
| || &#039;&#039;&#039;Markus&#039;&#039;&#039; || || Entwurf von Markus R. mit LED-Dimmer im Eagle 6.4.0 Format&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;quot;background-color:#B9FFC5&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Software&#039;&#039;&#039; || || || Software für AVR-GCC 4.5.3&lt;br /&gt;
|-&lt;br /&gt;
| || &#039;&#039;&#039;trunk&#039;&#039;&#039; || || Aktueller Software-Entwicklungszweig&lt;br /&gt;
|-&lt;br /&gt;
| || &#039;&#039;&#039;trunk/default&#039;&#039;&#039; || || Makefile und Programmierdaten für ATmega168 mit Standard-Layout&lt;br /&gt;
|-&lt;br /&gt;
| || &#039;&#039;&#039;trunk/mega168_1.9V&#039;&#039;&#039; || || Makefile und Daten für ATmega168 mit Knopfzellenbetrieb (FiFi)&lt;br /&gt;
|-&lt;br /&gt;
| || &#039;&#039;&#039;trunk/mega168_3.3V&#039;&#039;&#039; || || Makefile und Daten für ATmega168 mit LiPo-Akkubetrieb (FiFi)&lt;br /&gt;
|-&lt;br /&gt;
| || &#039;&#039;&#039;trunk/mega328&#039;&#039;&#039; || || Makefile und Daten für ATmega328 mit Standard-Layout (ab Version 1.08k)&lt;br /&gt;
|-&lt;br /&gt;
| || &#039;&#039;&#039;trunk/mega328_1.9V&#039;&#039;&#039; || || Makefile und Daten für ATmega328 mit Knopfzellenbetrieb (Funkamateur)&lt;br /&gt;
|-&lt;br /&gt;
| || &#039;&#039;&#039;trunk/mega328_3.3V&#039;&#039;&#039; || || Makefile und Daten für ATmega328 mit LiPo-Akkubetrieb (Funkamateur)&lt;br /&gt;
|-&lt;br /&gt;
| || &#039;&#039;&#039;trunk/mega168_strip_grid&#039;&#039;&#039; || || Makefile und Daten für ATmega168 für Streifenleiter-Platine&lt;br /&gt;
|-&lt;br /&gt;
| || &#039;&#039;&#039;trunk/mega328_strip_grid&#039;&#039;&#039; || || Makefile und Daten für ATmega328 für Streifenleiter-Platine (ab Version 1.08k)&lt;br /&gt;
|-&lt;br /&gt;
| || &#039;&#039;&#039;trunk/mega328_strip_grid_dogm&#039;&#039;&#039; || || Makefile und Daten für ATmega328 für Streifenleiter-Platine mit DOG-M Display&lt;br /&gt;
|-&lt;br /&gt;
| || &#039;&#039;&#039;trunk/mega8&#039;&#039;&#039; || || Makefile und Daten für ATmega8. Ab Version 1.00k ist der Selbsttest für den ATmega8 nicht mehr konfigurierbar.&lt;br /&gt;
|-&lt;br /&gt;
| || &#039;&#039;&#039;tags&#039;&#039;&#039; || || Fertige Software Versionen als ZIP gepackt&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| || || &#039;&#039;changelog.txt&#039;&#039; || &#039;&#039;Hier sollte jede Änderung mit Versionsnummer eingetragen werden&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| || &#039;&#039;&#039;Markus&#039;&#039;&#039; || || Alternative Software von Markus R., bitte README beachten! Die Software wurde aufgeräumt und ist viel besser strukturiert, läuft aber nur auf einem ATmega168 oder ATmega328. Die Software läuft nur auf dem Standard-Layout.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Port-Expander_PCF8574&amp;diff=81285</id>
		<title>Port-Expander PCF8574</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Port-Expander_PCF8574&amp;diff=81285"/>
		<updated>2014-02-04T00:04:53Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Änderung 81276 von 88.152.216.119 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der &#039;&#039;&#039;PCF8574&#039;&#039;&#039; ist ein via [[I2C]]-Bus angeschlossener 8-Bit I/O Port-Expander. Wer schon einmal unter &amp;quot;chronischem Pinmangel&amp;quot; in einer seiner Applikationen gelitten hat, weiss was gemeint ist.&lt;br /&gt;
&lt;br /&gt;
Falls ihr noch nie etwas mit dem I2C gemacht habt, dann lest euch bitte zuerst die entsprechende Rubrik durch. Danach wird das Verstehen wesentlich einfacher fallen.&lt;br /&gt;
&lt;br /&gt;
Das Datenblatt findet ihr [http://www.nxp.com/documents/data_sheet/PCF8574.pdf hier].&lt;br /&gt;
&lt;br /&gt;
=Funktion=&lt;br /&gt;
&lt;br /&gt;
Ein seriell an den Baustein gesendeter Wert wird auf dessen Pins parallel ausgegeben. Es gibt drei Adresspins (A0:2), an welchen man die Adresse in Hardware einstellen kann (Pins jeweils auf Masse bzw. Vcc legen). Es können also maximal 2^3 = 8 Bausteine vom Typ PCF8574 und maximal 2^3 = 8 Bausteine vom Typ PCF8574&#039;&#039;&#039;A&#039;&#039;&#039; (unterschiedliche Addresspräfixe) direkt am Bus betrieben werden. Will man mehr ICs anschliessen ist ein I2C-Multiplexer notwendig (z.&amp;amp;nbsp;B. PCA9544A).&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/mc-project/Pages/Projekte/ICs/Port%20Expander/expander-pins.gif&lt;br /&gt;
&lt;br /&gt;
An den Pins P0:7 kann ein 8 Bit Wert ausgegeben bzw. eingelesen werden. SDA und SCL dienen der Kommunikation über den I²C-Bus. /INT dient dazu, eingehende Daten an den Pins des Bausteins zu signalisieren. Man kann diesen Pin direkt an einen der Pins (externe Interrupts: INT0, INT1) des Mikrocontrollers legen. Da der Expander mit einem Open-Drain Ausgang daher kommt, muss ein Pull-Up gegen Betriebsspannung geschaltet werden. So kann der PCF8574 dem Mikrocontroller ohne den Umweg über den I2C übermitteln, dass sich die Eingangssignale geändert haben. Man kann ihn natürlich auch einfach offen lassen. Die Pins P0:7 können bis zu 25mA aufnehmen, aber nur gegen GND! Denn es handelt sich um [[Ausgangsstufen Logik-ICs|Open Collektor Ausgänge]]. Ausgeben können die IOs nur ca. 100µA über den interen Pull-Up Widerstand (welcher genaugenommen eine [[Konstantstromquelle]] ist). Kurzzeitig kann dieser Pull-Up 1mA liefern, wenn ein Ausgang von LOW auf HIGH schaltet, das verkürzt die Umschaltzeit wesentlich. Der gesamt aufgenommene Strom sollte 200mA nicht überschreiten.&lt;br /&gt;
&lt;br /&gt;
=I²C Kommunikation=&lt;br /&gt;
&lt;br /&gt;
Gestartet wird die Kommunikation durch das Senden der Start-Bedingung gefolgt vom Adressbyte.&lt;br /&gt;
&lt;br /&gt;
Das Adressbyte für den PCF8574:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit 7 || Bit 6 || Bit 5 || Bit 4 || Bit 3 || Bit 2 || Bit 1 || Bit 0 || Hexadezimal&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |  0 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | A2 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | A1 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | A0 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | R/W &lt;br /&gt;
|| 0x40 + A[2:0]*2 + R/W&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Das Adressbyte für den PCF8574&#039;&#039;&#039;A&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit 7 || Bit 6 || Bit 5 || Bit 4 || Bit 3 || Bit 2 || Bit 1 || Bit 0 || Hexadezimal&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | A2 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | A1 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | A0 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | R/W &lt;br /&gt;
|| 0x70 + A[2:0]*2 + R/W&lt;br /&gt;
|}&lt;br /&gt;
Der Adresse (4Bit für die eindeutige Kennung + 3 frei wählbare Bits) folgt das obligatorische R/W-Bit, welches festlegt, ob ein Lese- oder Schreibzugriff ausgeführt werden soll (R/W=0 Schreiben, R/W=1 Lesen).&lt;br /&gt;
&lt;br /&gt;
Wurde ein ACK empfangen, d.h. hat sich ein Slave angesprochen gefühlt, so kann man nun ein Datenbyte senden (R/W=0) oder den Status der Eingänge einlesen (R/W=1), also ein Datenbyte empfangen. Wurde ein Byte gesendet, so bestätigt der Baustein dieses mit ACK. Der Anwender kann nun festlegen, ob er das nächste Byte senden möchte oder ein STOP senden. Wurde ein Byte gelesen, so hat der Master dieses per ACK zu bestätigen, so er denn gleich das nächste empfangen möchte. Ansonsten kann hier das ACK entfallen und ein STOP gesendet werden.&lt;br /&gt;
&lt;br /&gt;
Stellt sich nur noch die Frage: Wie regelt man nun, ob ein Pin als Ein- oder Ausgang arbeiten soll? Soviel gleich vorweg: So etwas wie die Datenrichtungsregister des [[AVR]]s gibt es hier nicht, man muss ohne sie auskommen. Den Ausgangspegel der Pins definiert man über einen Schreibzugriff. Sendet man beispielsweise nach der Adresse gefolgt vom ACK des Bausteins 0xF0, so bedeutet das, dass P0:3 nun L-Pegel haben und P4:7 H-Pegel. Will man einige IOs als Eingänge verwenden, muss man die entsprechenden Ausgänge zunächst auf H-Pegel setzen, da es sich um [[Ausgangsstufen Logik-ICs|Open Collektor Ausgänge]] handelt sind die Ausgänge somit inaktiv. Führt man nun einen Lesezugriff durch, so stehen im gelesenen Byte die Pegel der Pins.&lt;br /&gt;
&lt;br /&gt;
=Anwendung=&lt;br /&gt;
&lt;br /&gt;
Im nachfolgenden Bild sind verschiedene Anwendungen der IOs dargestellt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:PCF8574.png|640px]]&lt;br /&gt;
&lt;br /&gt;
* P0..P3 - Ausgänge für LEDs: Die LEDS sind mit ihrer Anode über einen Vorwiderstand gegen VCC verdrahtet. Eine LED wird eingeschaltet, indem der jeweilige Ausgang auf LOW gesetzt wird (LOW aktive). Es ist &amp;lt;B&amp;gt;NICHT&amp;lt;/B&amp;gt; möglich, die LEDs mit ihrer Kathode gegen GND zu verdrahten, da die Ausgänge vom Typ [[Ausgangsstufen_Logik-ICs#Open_Collector| Open Collector]] sind und nur bei LOW große Ströme schalten können.&lt;br /&gt;
* P4 - Ausgänge für ULN2003 &amp;amp; Co: Hier wird bei HIGH doch schon richtig Strom gebraucht (ca. 1mA). Das kann der IC nicht selber liefern (typisch ca. 100µA). Deshalb wird hier ein relativ niederohmiger Pull-Up Widerstand benötigt.&lt;br /&gt;
* P5 - Ausgänge für Logikbausteine: Nichts besonderes.&lt;br /&gt;
* P6 - Eingänge für Logikbausteine: Der Logikbaustein muss bei LOW bis zu 300µA Strom liefern können, da die internen Pull-Up Widerstände darauf dimensioniert sind und man sie nicht abschalten kann.&lt;br /&gt;
* P7 - Eingänge für Taster: Die internen Pull-up Widerstände sind hier nützlich.&lt;br /&gt;
&lt;br /&gt;
=Software=&lt;br /&gt;
&lt;br /&gt;
Routinen zum Ansteuern des Baustein können hier herunter geladen werden:&lt;br /&gt;
* [http://www.mikrocontroller.net/mc-project/Pages/Projekte/ICs/Port%20Expander/Portexpander%20Beispiel.zip Portexpander Beispiel.zip]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Anwendung soll ein solcher Expander bei mir natürlich auch finden. Am meisten hat mich beim Anschluss von LCDs immer deren Pin-Hunger im 4-Bit-Modus gestört. Samt der Steuereingänge kostet einen das 7 Pins. Da ein LCD selten viel zu tun hat, sollte die Verwendung eines solchen Bausteines kein Problem darstellen. Um nicht wieder bei Null anzufangen, werde ich einfach die oben erwähnten Low-Level-Routinen in die vielfach bewährte LCD-Bibliothek von Peter Pfleury einbinden. Allerdings hat dieses kleine Projekt momentan noch den Status ToDo.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
[[Category:Mc-project.de]]&lt;br /&gt;
[[Kategorie:Portexpander]]&lt;br /&gt;
[[Kategorie:I2C]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Oszilloskop&amp;diff=81104</id>
		<title>Oszilloskop</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Oszilloskop&amp;diff=81104"/>
		<updated>2014-01-23T10:36:02Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Änderung 81103 von 129.143.71.39 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein &#039;&#039;&#039;Oszilloskop&#039;&#039;&#039; dient zur grafischen Darstellung des Spannungsverlaufs eines oder mehrerer elektischen Signale in einem einstellbaren Zeitfenster. Es ist das wichtigste Werkzeug der Elektotechniker.&lt;br /&gt;
&lt;br /&gt;
== Anfragen bezüglich Kaufberatung im Forum ==&lt;br /&gt;
&lt;br /&gt;
=== Kritik an den Anfragen ===&lt;br /&gt;
Im Forum finden sich regelmäßig Anfragen nach individueller Beratung zum Oszilloskopkauf. Die Anzahl solcher Oszilloskop-Threads hat schon lange die 1000 überschritten. Sie sind langweilig, eine Qual und oft unnütz - besonders dann, wenn sich der Fragesteller offenbar nicht mit den Grundlagen eines Oszilloskops und den wichtigsten Kennzahlen bekanntgemacht hat oder nicht einmal weiß, was er überhaupt messen will. Auch, wenn ein Fragesteller ein paar Grundlagen besitzt, hat er anscheinend meistens keine Lust, verständlich darzustellen, was er genau will und lässt sich stattdessen umständlich befragen.&lt;br /&gt;
&lt;br /&gt;
Den meisten regelmäßigen Forumbenutzern ist daher gründlich die Lust an Oszilloskop-Threads vergangen. Dort &amp;quot;diskutieren&amp;quot; eigentlich nur noch Trolle und anonyme Gäste, die oft genug nur Werbung über Billigangebote über die x-te Ausgabe einer billigen, als Oszilloskop bezeichneten Plastikkiste, einem super tollen eBay-Schnäppchen oder angeblicher asiatischer Wundertüten.&lt;br /&gt;
&lt;br /&gt;
==== Links für Anfänger ====&lt;br /&gt;
Wer sich ernsthafte Beratung wünscht und eine &amp;quot;sanfte&amp;quot; Einführung in das Thema sucht, kann sich die englischsprachige YouTube-Videos von AfroTechMods anschauen:&lt;br /&gt;
&lt;br /&gt;
[http://afrotechmods.com/tutorials/2011/11/27/oscilloscope-tutorials/ http://afrotechmods.com/tutorials/2011/11/27/oscilloscope-tutorials]&lt;br /&gt;
&lt;br /&gt;
Dazu passt auch sein Tutorial über Funktionsgeneratoren:&lt;br /&gt;
[http://afrotechmods.com/tutorials/2011/11/27/function-generator-tutorial/ http://afrotechmods.com/tutorials/2011/11/27/function-generator-tutorial].&lt;br /&gt;
&lt;br /&gt;
===Maßgeschneidert?===&lt;br /&gt;
Besonders die immer wiederkehrende Forderung, dass es unbedingt das maßgeschneiderte Oszilloskop zum Superpreis genau für den Fragesteller geben muss, ist sinnlos. Wer mit diesem Anspruch kommt, der wird enttäuscht werden. Das gibt es nicht, und gute Oszilloskope kosten Geld, da qualitativ hochwertige Geräte keine Massenware sind. Lediglich billige Geräte werden in grosser Zahl hergestellt und sind entsprechend preiswert, diese sind jedoch für anspruchsvolle Anwender meist untauglich, da genau an den wichtigen Dingen gespart und nur auf Optik gesetzt wird.&lt;br /&gt;
&lt;br /&gt;
===Gebraucht ist auch keine Lösung===&lt;br /&gt;
Es gibt eine Reihe von gebrauchte Oszilloskopen- vorwiegend im Internet, von denen die meisten billig sind. Da niemand per Ferndiagnose oder Blick in eine Glaskugel in ein gebrauchtes Gerät hineinsehen und etwas über den Zustand berichten kann, besteht immer das typische Risiko eines Kaufs aus zweiter Hand, das jeder selber tragen muss. Niemand im Forum kann und wird das jemandem abnehmen. &lt;br /&gt;
&lt;br /&gt;
Was man allgemein sagen kann, ist, dass man besser die Finger von Angeboten lassen sollte, wenn der Verkäufer mit den übliche Phrasen wie, &amp;quot;Dachbodenfund&amp;quot;, &amp;quot;Keine Ahnung davon&amp;quot;, &amp;quot;Keine Möglichkeit zu testen&amp;quot; kommt. Vorsicht ist auch bei dem beliebten Trick &amp;quot;Funktioniert, aber aus rechtlichen Gründen (Garantie) verkaufe ich es als defekt, für Bastler&amp;quot; gegeben. Man muss sich immer vor Augen führen, dass niemand ein gutes und wertvolles Gerät dieser Art zum Billigpreis abgegeben wird und dies schon gar nicht über Internetplattformen, wo es kaum einen Markt für Topgeräte gibt. Gute gebrauchte Geräte gibt es von privat daher nur auf Elektronikbörsen zu entsprechenden Preisen.&lt;br /&gt;
&lt;br /&gt;
Es gibt demgemäss natürlich auch Geräte von seriösen Gebrauchthändlern mit Garantie - allerdings ebenso zu derartigen Preisen, dass dagegen der Kauf eines aktuellen Neugeräts ebenfalls attraktiv erscheint.&lt;br /&gt;
&lt;br /&gt;
=== Erfahrungen? ===&lt;br /&gt;
Eine Vorgehensweise, von der man auch abraten muss, ist die Frage nach Erfahrungen anderer Mitglieder! Die meisten Antworten kommen von Trollen und Posern, die eigentlich keine Ahnung haben. Die einen wollen als anonymer Gast mal wieder trollen, die anderen wollen nur mitteilen, dass Amateurfunker sowieso die besseren Menschen sind. Andere wiederum haben &amp;quot;zufällig&amp;quot; gerade *das* richtige Oszilloskop zu verkaufen. Dann gibt es noch die, die sich ihr eigenes Oszilloskop schönreden wollen, ihren Vorurteilen oder ihrem Fetisch frönen. Zum Beispiel&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Kauf ja kein Gerät aus Asien!&#039;&#039;&lt;br /&gt;
* &#039;&#039;Unter LeCroy|Agilent|Yokogawa|Tektronix geht gar nichts!&#039;&#039;&lt;br /&gt;
* &#039;&#039;Nur Gebrauchtgeräte lohnen sich!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hinweise wie &#039;&#039;mein vor 30 Jahren gekauftes Markengerät funktioniert noch heute tadellos&#039;&#039; sind ebenfalls ziemlich sinnlos. Der Hersteller wird dieses Gerät gar nicht mehr anbieten und er wird schon gar nicht mehr mit der gleichen Qualität fertigen, wie vor 30 Jahren. Dazu ist der Kostendruck zu hoch und Technologien haben sich geändert. Selten sind die neuen Technologien heute so robust, wie die vor 30 Jahren.&lt;br /&gt;
&lt;br /&gt;
Als Unerfahrener kann man daher aus den Antworten nicht herauslesen, ob sie wirklich auf Erfahrung beruhen. Man braucht also gewissermassen selbst Erfahrung, um die Erfahrungsberichte anderer richtig einzuordnen.&lt;br /&gt;
&lt;br /&gt;
Ein anderer Aspekt aus alten Threads ist, dass viele Fragesteller die Erfahrungen gar nicht zur Kenntnis nehmen wollen, wenn sie der eigenen Wunschvorstellung widersprechen. So etwas nennt man beratungsresistent. Da stellt sich schon mal heraus, dass der Fragesteller schon längst ein Gerät bestellt hat und jetzt gebauchpinselt werden will. Eine Zeitverschwendung für alle.&lt;br /&gt;
&lt;br /&gt;
Erfahrungen mit eigenen Geräten lassen bedingt den Schluss zu, welche&lt;br /&gt;
Marken grundsätzlich empfehlenswert sind, weil dort gegebenenfalls mehr auf Qualität geachtet wird.&lt;br /&gt;
&lt;br /&gt;
=== Zusatzkosten beim Kauf im Ausland ===&lt;br /&gt;
Beim Kauf eines scheinbar preisgünstigen Gerätes im Ausland ist Folgendes zu beachten:&lt;br /&gt;
&lt;br /&gt;
Versandkosten, Einfuhrumsatzsteuer, Zoll, e.v. Gebühr für den Paketdienst und die Gebühren für die  Währungsumrechnung sind Kosten, die bei vielen vermeintlichen Internet-Schnäppchen aus dem Ausland (besonders Nicht-EU) noch hinzukommen und bei plakativen Überschriften gerne &amp;quot;vergessen&amp;quot; oder ignoriert werden. Oft wird sich das Angebot selbst schöngeredet. Zudem sind das nicht einmmal alle Kosten, die man zu tragen hat. Zum Beispiel können für manche Zahlungsweisen weitere Gebühren hinzukommen oder Lagergebühren im Zolllager.&lt;br /&gt;
&lt;br /&gt;
Wer nicht vorher rechnet, hat nachher schnell mehr bezahlt als bei einem lokalen Händler. Siehe auch [http://www.zoll.de Zoll].&lt;br /&gt;
&lt;br /&gt;
Grundsätzlich ist der deutsche Zoll nicht doof. Besonders wenn ein asiatischer Versender auf ein Paket bei der Zollerklärung &amp;quot;Geschenk, Wert $40&amp;quot; schreibt, dann kann man fast sicher sein, dass der deutsche Zoll sich das genauer ansieht. Die Ware landet im Zolllager und man darf den Kaufpreis nachweisen.&lt;br /&gt;
&lt;br /&gt;
Ebenso glaubt der Zoll nicht an kostenlosen Versand und nimmt regelmäßig ziemlich saftige Versandgebühren an, die dann versteuert werden&amp;lt;ref&amp;gt;Passiert das, kann man gegen den Steuerbescheid Widerspruch einlegen. Wie das geht sollte in einer Rechtsbehelfsbelehrung auf dem Steuerbescheid stehen.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Nochmal zum Mitschreiben, besonders bei Käufen von außerhalb des Zollgebiets der EU sollte man sich vorher mindestens über die folgenden Kosten informieren:&lt;br /&gt;
&lt;br /&gt;
* Versandkosten oder was der Zoll sich bei kostenlosem Versand ausdenkt&lt;br /&gt;
* Versandart (was durch die Post importiert wird, wird vom Zoll anders abgefertigt, als das, was von einem Paketdienst importiert wird)&lt;br /&gt;
* Einfuhrumsatzsteuer&lt;br /&gt;
* Zoll (bei der Warengruppe, in die Oszilloskope gehören, ist der zur Zeit wohl 0%. Das kann sich natürlich ändern)&lt;br /&gt;
* Gebühr Paketdienst. Paketdienste lassen sich die Zollanmeldung und den Papierkrieg zum Teil mit saftigen Gebühren bezahlen. Die sind nicht in den Versandkosten enthalten.&lt;br /&gt;
* Gebühr für Währungsumrechnung&lt;br /&gt;
* Bankgebühr für Zahlung ins Ausland&lt;br /&gt;
&lt;br /&gt;
==== Beispiel ====&lt;br /&gt;
Ein Kauf eines PC-basierten Messinstruments mit Oszilloskopfunktion, das in Deutschland nicht erhältlich ist und einen Kaufwert von 719,- US Dollar in Taiwan hatte, wurde aufgrund der Umrechung mit einem Wert von 589,- Euro veranschlagt. An UST kamen 112,- und an Zollgebühren 46,- Euro hinzu. Zusammen mit dem Versand und Bankgebühren kostete das Gerät insgesamt 790,- Euro. Andere Geräte des Herstellers, die in Deutschland zu beschaffen sind, kosten als deutsches Exemplar kaum mehr, dafür hat man die volle Verbrauchergarantie. Diese sind also in der Regel vorzuziehen, wenn das Gerät in Deutschland beschaffbar ist.&lt;br /&gt;
&lt;br /&gt;
===Spielzeuge aller Art===&lt;br /&gt;
[[Datei:Karikatur oscilloscope sale.jpg|thumb|left|240px|Preisgünstiges Spitzenoszilloskop 5Gs]]&lt;br /&gt;
&lt;br /&gt;
Offensichtlich scheint es gerade Mode zu werden, einen schwachbrüstigen Analog-Digital-Konverter hinter eine eher zufällig gewählte, krumme analoge Eingangsschaltung zu klemmen und an einen Mikrocontroller mit Grafik-LCD anzuschließen.  Das ganze wird als digitales Speicheroszilloskop (DSO) zum Sonderpreis verkauft.&lt;br /&gt;
&lt;br /&gt;
Je nach Hersteller wird so ein Gerät komplett ohne Gehäuse geliefert, was mit Hinblick auf die Sicherheit sehr fragwürdig ist, oder es kommt in einem lustig aufgemachten Plastikgehäuse in MP3-Player-Format daher, das auch keine großartige Isolation bietet. Hinzu kommen Eindruck schindende Namen und Logos, die Modernität und Qualität suggerieren sollen, oft noch unterstrichen durch die Assoziierung mit Open-Source und pseudo-Hacker / Maker Bewegungen.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
Im Vergleich zu richtigen Oszilloskopen sind dies leider nur Spielzeuge. Unsichere Spielzeuge. Es nervt diese Dinger immer wieder im Forum als das &amp;quot;Beste seit Erfindung von geschnitten Brot&amp;quot; vorgestellt zu bekommen. Ein Blick auf die technischen Daten dieser &amp;quot;Oszilloskope&amp;quot; (sofern die Daten überhaupt angegeben werden) reicht, um festzustellen, dass man ein Spielzeug vor sich hat. Schön für den, der spielen will, schlecht für den, der sicher messen will.&lt;br /&gt;
&lt;br /&gt;
Ebenso verrät ein Blick auf die Schaltung des Analogeingangs, ob man Qualität vor sich hat. Fehlende Spannungsfestigkeit und fehlende Frequenzkompensation des Eingangsverstärkers sind sichere Zeichen für Schund. Wenn es eine Verbindung zum PC gibt, aber diese nicht isoliert ist, ist das ein weiteres Zeichen für Scheinqualität.&lt;br /&gt;
&lt;br /&gt;
In [http://welecw2000a.sourceforge.net/docs/Hardware/GW_Instek_GDS-1152A.pdf] kann man das Innenleben eines richtigen DSO bewundern. Man vergleiche dies mit den Innenleben der Spielzeug-&amp;quot;DSO&amp;quot;s.&lt;br /&gt;
&lt;br /&gt;
Ein anderes, sicheres Zeichen eines Spielzeug-&amp;quot;DSOs&amp;quot; ist es, wenn irgendein Ding aus Abgreifklemmen und Klinkenstecker als &amp;quot;Tastkopf&amp;quot; mitgeliefert wird oder die Buchse für den Tastkopf aus einer Klinkenbuchse oder ähnlicher Niederfrequenz-Anschlusstechnik besteht.&lt;br /&gt;
&lt;br /&gt;
Auffällig ist bei diesen Spielzeugen auch, dass sie vehement von typischen Fanboys verteidigt werden. Nicht mit technischem Argumenten, sondern mit Aussagen wie &amp;quot;aber ist billig&amp;quot;, &amp;quot;aber ist cool&amp;quot;, &amp;quot;aber enthält doch einen Arduino&amp;quot;. Trotzdem, wer ein Oszilloskop haben möchte, sollte sich das Geld für ein Spielzeug-&amp;quot;DSO&amp;quot; sparen.&lt;br /&gt;
&lt;br /&gt;
== Funktion von Oszilloskopen ==&lt;br /&gt;
=== Was wird gemessen? ===&lt;br /&gt;
Oszilloskope zeigen einen Spannungsverlauf über einen kurzen, für das menschliche Auge in Realzeit meist nicht erfassbaren Zeitraum an. Je hochwertiger das Oszilloskop, desto kürzer ist dieser Zeitraum, beziehungsweise desto schneller darf sich das Signal ändern. Spitzengeräte können Perioden von wenigen ns auf den gesamten sichtbaren Bildbereich aufzoomen. Innerhalb dieser Perioden sind bei guten Oszilloskopen auch Teilabschnitte aufweitbar. Massgeblich ist dafür ein manuell oder automatisch erzeugter Startzeitpunkt, der sogenannten Trigger. &lt;br /&gt;
&lt;br /&gt;
Darüber hinaus lassen sich andere Größen, zum Beispiel Ströme, Drücke und Magnetfelder anzeigen, wenn man zusätzlich entsprechende Wandler einsetzt, um aus den Grössen zuvor eine Spannung zu erzeugen.&lt;br /&gt;
&lt;br /&gt;
=== Was wird dargestellt? ===&lt;br /&gt;
&lt;br /&gt;
Den Eingang für eine Spannung bezeichnet man bei einem Oszilloskop als Kanal. Die an den Kanälen anliegenden Spannungen können einzeln oder gemeinsam angezeigt werden. Bei Mehrkanal-Oszilloskopen kann man üblicherweise auch eine Spannung über eine Spannung darstellen (XY-Modus), womit Übertragungskennlinien von Bauteilen dargestellt werden können.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich bieten moderne Oszilloskope die Möglichkeit, sich gewisse Kenngrößen der Spannungsverläufe anzeigen zu lassen. Gängige Werte sind zum Beispiel die Anzeige von Spitzenspannung und Effektivwert einer Spannung, Frequenz/Periodendauer, Anstiegs- und Abfallzeiten, Tastverhältnis und so weiter. Darüber hinaus bieten gute Oszilloskope Positionsmarken (Cursor), mit denen man, durch eine Linie dargestellt, auf dem Bildschirm Positionen im Spannungsverlauf markieren kann. Zur Position zugehörige Werte (Zeit oder Spannung), sowie die Differenz dieser Werte zwischen zwei Positionsmarken können abgelesen werden.&lt;br /&gt;
&lt;br /&gt;
Besonders [[#Digitale_Tischoszilloskope|digitale Oszilloskope]] können relativ viele unterschiedliche Kenngrößen anzeigen, da sich viele dieser Größen mit einfachen Algorithmen aus den vom Oszilloskop im Speicher erfassten Daten berechnen lassen. Ebenso sind einfache mathematische Operationen möglich, etwa eine diskrete Fourier-Transformation oder die Summe oder Differenz der Spannungsverläufe von zwei Kanälen. Oszilloskope der Oberklasse bieten darüber hinaus ausgeklügelte Möglichkeiten der Signalanalyse. &lt;br /&gt;
&lt;br /&gt;
Für spezielle Anwendungen finden sich in manchen Oszilloskopen besondere Messfunktionen. Zum Beispiel go/no-go (heißt meistens pass/fail) Messungen, mit denen eine Spannungsverlauf mit einem vorgegebenen Verlauf verglichen wird. Entspricht der Spannungsverlauf hinreichend dem vorgegebenen Verlauf wird ein &amp;quot;go&amp;quot; (oder pass = alles ist OK) Signal über einen externen Ausgang ausgegeben. Weicht der Verlauf zu stark ab ein &amp;quot;no go&amp;quot; (fail = Spannung stimmt nicht) Signal.&lt;br /&gt;
&lt;br /&gt;
Bereits in der Unterklasse digitaler Oszilloskope ist heutzutage eine PC-Schnittstelle üblich. Beim Kauf sollte man darauf achten, dass das Protokoll der Schnittstelle dokumentiert ist. Sonst ist man auf proprietäre PC-Software des Herstellers angewiesen. Bei Oszilloskopen der Unterklasse wird zwar häufig kostenlos PC-Software mitgeliefert, doch leider sind diese Programme durchgehend von erschreckend schlechter Qualität. Bei Oszilloskopen der Oberklasse lassen sich die Hersteller ihre PC-Software gerne zusätzlich sehr teuer bezahlen.&lt;br /&gt;
&lt;br /&gt;
== Analoge Oszilloskope ==&lt;br /&gt;
=== Allgemeines ===&lt;br /&gt;
[[Bild:Oszilloskop.png|thumb|right|300px|Hybrides Analog/Digital Oszilloskop]]&lt;br /&gt;
Bei analogen Oszilloskopen wird das darzustellende Signal nach der Verstärkung direkt zur Ablenkung eines Elektronenstrahls verwendet.&lt;br /&gt;
&lt;br /&gt;
Brauchbare analoge Oszilloskope findet man oft schon für ca. 50 Euro bei Online-Auktionen und Kleinanzeigenmärkten. Für 200-400 Euro bekommt man dort recht gute Profigeräte&amp;lt;ref&amp;gt;Ein Gerät, welches mit dem Attribut &#039;&#039;Profigerät&#039;&#039; beworben wird, ist normalerweise keins.&amp;lt;/ref&amp;gt;  mit 60-200 MHz Bandbreite. Brauchbare Neugeräte fangen bei 600 Euro an. Der Oszilloskopmarkt wird von einigen wenigen Marken dominiert. Im höherpreisigen Segment sind es vor allem HP (Agilent) und Tektronix, sowie Yokogawa und Lecroy. Hameg ist vor allem im mittleren Segment (500-1500 Euro) weit verbreitet. Man findet sie oft in Schule und Ausbildung. Preislich darunter finden sich diverse asiatische oder gelegentlich noch osteuropäische Hersteller von Analogoszilloskopen. Häufig treten diese Hersteller nicht unter eigenem Namen auf, sondern bieten ihre einfachen Geräte als OEM-Produkte an. &lt;br /&gt;
&lt;br /&gt;
Ganz einfache Geräte verfügen nur über einen Kanal&amp;lt;ref&amp;gt;Es gibt, beziehungsweise gab, nochmals einfachere Geräte, nämlich solche ohne Trigger. Die Zeiten solcher Gerät sind allerdings seit rund 50 Jahren vorbei. Daher sollte man den fehlenden Trigger nur bei historischen Gebrauchtgeräten finden.&amp;lt;/ref&amp;gt;. Damit ist es nicht möglich, zwei Signale in zeitliche Beziehung zu setzen. Dies ist jedoch oft wichtig. Deshalb verfügen heutzutage auch einfache Geräte meist über zwei Kanäle.&lt;br /&gt;
&lt;br /&gt;
=== Bandbreite ===&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;Bandbreite&#039;&#039;&#039; gibt Auskunft, welche Signal-Frequenzen das Oszilloskop noch verarbeiten kann. Bei angegebener Bandbreite fällt die Verstärkung des Oszilloskops um 3dB ab, ein Sinussignal wird dann nur noch mit ca. 70% der wahren Amplitude angezeigt. Um Signalverläufe noch vernünftig interpretieren zu können, kann man grob sagen, dass man Signale bis 1/10 der Bandbreite dargestellt bekommt. Ein Rechtecksignal nahe der Bandbreite würde z.&amp;amp;nbsp;B. nur noch als Sinus dargestellt werden &amp;lt;ref&amp;gt;Häufig wird von Anfängern bei der Bandbreitenbetrachtung vergessen, dass ein Rechtecksignal nicht aus einer einzigen Sinusschwingung der Frequenz f, sondern aus einer theoretisch unendlichen Summe von Signalen der Frequenzen f, 3 * f, 5 * f ... besteht. Für eine vernünftige Darstellung eines Rechtecksignals sollte die Oszilloskopbandbreite so groß sein, dass zumindest die ersten paar Oberwellen nicht zu stark gedämpft werden. Aus dieser Betrachtung ergeben sich Faustformeln, wie die, dass die Bandbreite eines Oszilloskops zehnmal (oder dreimal, oder fünfmal, je nachdem wie genau man messen möchte) größer sein sollte als die Grundfrequenz des Rechtecks.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beim Messen von Digitalsignalen ist man meist an der &#039;&#039;&#039;Anstiegszeit&#039;&#039;&#039; interessiert. Die Anstiegszeit gibt an, wie lange ein Rechtecksignal von 10-90% benötigt. Die Anstiegszeit des Oszilloskops gibt an, welche Anstiegszeit dargestellt wird, wenn man ein nahezu ideales Rechtecksignal mit annähernd Null Anstiegszeit anlegen würde. Man kann die Anstiegszeit direkt aus der Bandbreite berechnen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;t_{Osc} = \frac{0.35}{B}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;\!\, t_A&amp;lt;/math&amp;gt; : Anstiegszeit des Oszilloskops in Sekunden (s)&lt;br /&gt;
* &amp;lt;math&amp;gt;\!\, B&amp;lt;/math&amp;gt; : Bandbreite in Hertz (Hz)&lt;br /&gt;
&lt;br /&gt;
Legt man ein reales Rechtecksignal an das Oszilloskop an, dann wird die Anzeige umso mehr verfälscht, je näher die Anstiegszeit des Eingangssignals der Anstiegszeit des Oszilloskops kommt. Dabei gilt folgender Zusammenhang.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;t_S = \sqrt{t_{ges}^2-t_{Osc}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;\!\, t_S&amp;lt;/math&amp;gt;: Anstiegszeit des Eingangssignals&lt;br /&gt;
* &amp;lt;math&amp;gt;\!\, t_{ges}&amp;lt;/math&amp;gt;: Angezeigte Anstiegszeit auf dem Oszilloskop&lt;br /&gt;
* &amp;lt;math&amp;gt;\!\, t_{Osc}&amp;lt;/math&amp;gt;: Anstiegszeit des Oszilloskops&lt;br /&gt;
&lt;br /&gt;
Bei analogen Oszilloskopen ist die Bandbreite gegeben durch die Begrenzung des analogen Eingangsverstärkers sowie die Signaldarstellung, also die Qualität des Ablenkverstärkers.&lt;br /&gt;
&lt;br /&gt;
=== Tastköpfe richtig benutzen ===&lt;br /&gt;
&lt;br /&gt;
Wenn man wirklich schnelle Signale messen will, spielt auch die Bandbreite des verwendeten Tastkopfes eine wichtige Rolle. Näheres dazu findet man [http://www.sigcon.com/Pubs/straight/probes.htm hier]. Aber der beste Tastkopf nützt nichts, wenn man ihn falsch anschließt. Für schnelle Messung jenseits von ein paar MHz nutzt man praktisch immmer 10:1 Tastköpfe mit 10 MOhm Eingangswiderstand und ca. 8-15pF Eingangskapazität. Je nach Typ erreicht man damit Bandbreiten von 100-500MHz. Danach muss man aber auch den Tastkopf richtig anschließen. Der mitgelieferte Masseanschluß mit Krokodilklemme ist zwar praktisch, für viele hochfrequente Messungen aber unbrauchbar. Ein Rechtecksignal damit zu messen ergibt dann starke Überschwinger, welche real aber gar nicht vorhanden sind, sondern durch die zu lange, induktive Masseleitung im Zusammenspiel mit der Eingangskapazität verursacht werden. Das sieht man z.B. [http://www.mikrocontroller.net/topic/281669?goto=2975948#2975754 hier], den Messaufbau sieht man [http://www.mikrocontroller.net/topic/281669?goto=2975948#2975896 hier].&lt;br /&gt;
&lt;br /&gt;
Für saubere, hochfrequente Messungen muss man die Masseanbindung so kurz wie möglich machen. Dafür haben die Tastköpfe oft ein kleines Zusatzteil, eine Massefeder, beigelegt (engl. [http://www.mikrocontroller.net/attachment/27280/groundspring.png ground spring]). Damit kann man die Masse auf kürzestem Wege anschließen und erhält ein sauberes Messergebnis wie man [http://www.mikrocontroller.net/topic/281669?goto=2975948#2975931 hier] sieht.&lt;br /&gt;
&lt;br /&gt;
=== Triggerung ===&lt;br /&gt;
&lt;br /&gt;
Oszilloskope unterscheiden sich oft stark in den Triggerungsmöglichkeiten. Bei guten Geräten kann man z.&amp;amp;nbsp;B. die Triggerung variabel verzögern. Erst dadurch wird es möglich, dass man sich Signale genauer anschauen kann, die zeitlich weit hinter einem Triggerereignis kommen. Eine weitere Funktion bei höherklassigen Oszilloskopen ist eine zweite Zeitbasis. Mit dieser kann man in einen Ausschnitt des Messsignals hereinzoomen&amp;lt;ref&amp;gt;Die zweite Zeitbasis steuert einen zweiten Strahl (ähnlich wie einen separaten Kanal), der das gleiche Eingangssignal erhält. Die zweite Zeitbasis wird auf eine höhere Horizontalfrequenz eingestellt als die erste. Zusammen mit einer horizontalen Verschiebung der Darstellung kann man nun Ausschnitte des Signals durchfahren und vergrößert betrachten.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mit Analog-Oszilloskopen kann man sich hauptsächlich periodische Signalverläufe anschauen, also solche, die zeitlich immer wiederkehrend sind. Denn nur so kann ein Signal immer wieder auf den Schirm &amp;quot;geschrieben&amp;quot; werden und erscheint als stehendes Bild. Aperiodische Signale, wie z.&amp;amp;nbsp;B. auf Datenübertragungsleitungen, sind damit nicht darstellbar. Sie laufen mit einem Strahldurchgang über den Schirm. In dieser kurzen Zeit ist es jedoch nur selten möglich, sie visuell aufzunehmen. Mit einer Digitalkamera kann man solche Signalverläufe mitunter trotzdem einfangen. Früher sehr hochpreisige, heute nicht mehr übliche Analog-Oszilloskope hatten eine eingebaute Speichermöglichkeit (Speicherröhre) für einmalige Signale. Diese Klasse von Analog-Oszilloskopen wurde durch digitale Speicheroszilloskope (DSOs) abgelöst.&lt;br /&gt;
&lt;br /&gt;
Manche Analog-Oszilloskope bieten eine Möglichkeit, die Triggerung nur zu einem definiertem Zeitpunkt anzustoßen, somit kann auch der Anlaufstrom eines Motors mit einem Analog-Oszilloskop dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
=== Analoge Speicheroszilloskope ===&lt;br /&gt;
Inzwischen eher selten sind analoge Speicheroszilloskope anzutreffen. Diese speichern im Gegensatz zu digitalen Speicheroszilloskopen nicht das Signal selbst, sondern das Bild auf der Röhre. Dies wird mit speziellen speichernden Bildröhren erreicht. Je nach Typ kann es mehrere getrennt betreibbare Bereiche geben, um beispielsweise 2 Bilder eines Signales zu unterschiedlichen Zeitpunkten darstellen zu können (z.B. Tektronix 549).&lt;br /&gt;
&lt;br /&gt;
Einige wenige dieser Oszilloskope waren sogar in der Lage, das aufgezeichnete Bild auf Papier auszugeben (z.B. &amp;quot;HP Model 175A&amp;quot; mit Modul 1784A).&lt;br /&gt;
&lt;br /&gt;
=== Vergleichstabelle Analogoszilloskope ===&lt;br /&gt;
&lt;br /&gt;
Diese Tabelle soll einen Überblick über interessante oder bekannte Neugeräte besonders im unteren Preisbereich geben. Eine vollständige Auflistung aller existierenden Geräte ergibt wegen der Vielzahl an Baureihen und Modellen wenig Sinn.&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;analogoszis&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Hersteller&lt;br /&gt;
! Preis [&amp;amp;euro;]&lt;br /&gt;
! Kanäle&lt;br /&gt;
! Bandbreite &amp;lt;BR/&amp;gt;[MHz]&lt;br /&gt;
! Röhre [cm]&lt;br /&gt;
! Bemerkungen&lt;br /&gt;
|-&lt;br /&gt;
| generisches 10 MHz Oszilloskop unter Bezeichnungen wie C1-94, S1-94, OS10, AO-610, [http://www.ett-online.de/html/de/werkstatt/oszilloskope/digitale-oszilloskope/oszilloskop-mccheck-st16b-1-kanal-10-mhz/article-4-55152-459045509045501590.html ST16B], CS10, GOS-310, 72-6602, HUC70, CS1010 [http://www.conrad.de/ce/de/product/122413/VOLTCRAFT-6102-Analoges-1-Kanal-Oszilloskop-Bandbreite-0-DC-10-MHz VC 610/2]&lt;br /&gt;
| SYSTRONICS (INDIA) LIMITED&lt;br /&gt;
| ab 115&lt;br /&gt;
| 1&lt;br /&gt;
| 10&lt;br /&gt;
| 4 − 4,8 × 6&lt;br /&gt;
| Seit Jahrzehnten von vielen No-Name Herstellern in unterschiedlichen Ausführungen und Bauformen im Angebot. Wenig empfehlenswert für µC-Arbeiten. &lt;br /&gt;
|-&lt;br /&gt;
| [http://www.attenelectronics.com/Products/Oscilloscopes/Analog_oscilloscope/2012/0728/129.html Atten AT7328], CS4128 und andere Bezeichnungen wie 100867.&lt;br /&gt;
| Atten&lt;br /&gt;
| ab 240&lt;br /&gt;
| 2&lt;br /&gt;
| 20(?)&lt;br /&gt;
| 8 × 10&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://systronicsindia.tradeindia.com/oscilloscopes--287360.html Systronics 6020], Mc Check CS-4128, MES 2K2 und andere&lt;br /&gt;
| SYSTRONICS (INDIA) LIMITED&lt;br /&gt;
| ab 200&lt;br /&gt;
| 2&lt;br /&gt;
| 20&lt;br /&gt;
| 8 × 10&lt;br /&gt;
| Hersteller hat keine eigene Präsenz in Europa&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.attenelectronics.com/Products/Oscilloscopes/Analog_oscilloscope/2012/0728/128.html Atten AT7340], [http://www.conrad.de/ce/de/product/122421/VOLTCRAFT-VC-630-2-Analoges-2-Kanal-Oszilloskop-Bandbreite-0-DC-bis-30-MHz/?ref=category&amp;amp;rt=category&amp;amp;rb=1 VC 630-2] und andere.&lt;br /&gt;
| Atten&lt;br /&gt;
| ab 370&lt;br /&gt;
| 2&lt;br /&gt;
| 40(?) 30 Voltcraft&lt;br /&gt;
| 8 × 10&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://www.ett-online.de/html/de/werkstatt/oszilloskope/digitale-oszilloskope/oszilloskop-mccheck-st-52-2-kanal-50-mhz/article-4-55156-459045509045501590.html Mc Check ST-52] und andere&lt;br /&gt;
| SYSTRONICS (INDIA) LIMITED&lt;br /&gt;
| ab 550&lt;br /&gt;
| 2&lt;br /&gt;
| 50&lt;br /&gt;
| 8 × 10&lt;br /&gt;
| Hersteller hat keine eigene Präsenz in Europa&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.hameg.com/446.0.html?L=1 HM 400]&lt;br /&gt;
| Hameg&lt;br /&gt;
| ab 650&lt;br /&gt;
| 2&lt;br /&gt;
| 40&lt;br /&gt;
| 8 × 10&lt;br /&gt;
| Abgekündigt, nur noch Restbestände erhältlich!&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Digitale Speicheroszilloskope ==&lt;br /&gt;
=== Allgemein ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:tektronix.jpg|thumb|right|300px|Digitales Speicheroszilloskop vom Anfang des Jahrtausends]]&lt;br /&gt;
Ein digitales Speicheroszilloskop (englisch DSO, &#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;S&#039;&#039;&#039;torage &#039;&#039;&#039;O&#039;&#039;&#039;scilloscope) digitalisiert das Eingangssignal mit einem Analog-Digital-Wandler und legt die Werte in einem Speicher ab. Damit ist Bandbreite nur durch die Begrenzung des analogen Eingangsverstärkers gegeben. Der Vorteil der Speicherung ist, dass man auf diese Weise Momentaufnahmen eines Signals machen und damit einmalige (transiente) Ereignisse (Spikes, Datenübertragungen) erkennen und darstellen kann, was besonders bei digitalen Schaltungen, z.&amp;amp;nbsp;B. mit Mikrocontrollern, sehr nützlich ist. Weiterhin lässt sich das Signal &amp;quot;vermessen&amp;quot; (z.&amp;amp;nbsp;B. um die Baudrate einer Datenübertragung zu bestimmen), man kann die Frequenz und den Effektivwert anzeigen lassen, das Frequenzspektrum, und je nach Modell noch vieles mehr. Das Signal wird in S/W oder Farbe auf einem LCD dargestellt, lässt sich aber oft auch über einen angeschlossenen Drucker ausdrucken oder an den PC übermitteln.&lt;br /&gt;
&lt;br /&gt;
Der wichtigste Parameter bei digitalen Oszilloskopen ist die &#039;&#039;&#039;Abtastrate&#039;&#039;&#039;, die angibt, mit welcher Geschwindigkeit das Eingangssignal digitalisiert wird. Um ein Signal mit einer bestimmten Frequenz vernünftig darstellen zu können, muss es mindestens mit der 10-fachen Frequenz abgetastet werden, für die genaue Analyse analoger Signale ist sogar ein Faktor von 25 bis 40 anzuraten&amp;lt;ref&amp;gt;Dieser Anhaltswert liegt über der Nyquist-Frequenz (zweifache Frequenz), da man Abweichungen von der idealen Signalform sehen und beurteilen möchte.&lt;br /&gt;
&lt;br /&gt;
Die zehnfache Abtastfrequenz bedeutet, dass man 10 Messpunkte pro Signalperiode hat, was in einer 1:1 Darstellung auf dem Bildschirm gerade mal 10 nebeneinander liegenden Pixeln entspricht. Das ist immer noch sehr wenig, um ein Signal zu beurteilen.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem sind die &#039;&#039;&#039;Speichertiefe&#039;&#039;&#039; und die &#039;&#039;&#039;Wandler-Auflösung&#039;&#039;&#039; interessant. Ein Oszilloskop, das mit acht Bit Auflösung abtastet und 2000*8 Bit Speicher hat, kann 2000 Samples abspeichern, was einer Darstellung von 2000*256 Pixeln entspricht. Acht Bit Auflösung ist heutzutage ein gängiger Wert, auch wenn er niedrig erscheint. Ein normales Oszilloskop ist kein Präzisionsmessgerät und acht Bit sind für die Darstellung auf den Displays normaler Oszilloskope ausreichend.   &lt;br /&gt;
&lt;br /&gt;
Bei der Wandlung und Speicherung gibt es unterschiedliche Verfahren: Ehemals günstige Oszilloskope wie die TDS1000-Serie von Tektronix verwenden &#039;&#039;&#039;CCD-Speicher&#039;&#039;&#039; (Eimerkettenspeicher, ein analoges Schieberegister); die Messwerte werden erst gespeichert, und dann digitalisiert. Nachteile dieser Vorgehensweise sind ein stärkeres Rauschen, die begrenzte Speichertiefe und Totzeiten, während der keine Eingangswerte aufgenommen werden. Diese entstehen, da das Wandeln aller Werte aus dem analogen Zwischenspeicher länger dauert als die Zeit zum Füllen dieses Speichers. Deshalb muss das Gerät bis zum Abschluss der Wandlung warten, bevor es den Speicher erneut füllt.&lt;br /&gt;
&lt;br /&gt;
Früher wandelten nur teurere Modelle in Echtzeit mit schnellen Flash-[[AD-Wandler]]n und speicherten die Messwerte direkt in einem schnellen RAM. Die Speichertiefe ist dabei praktisch unbegrenzt, allerdings sind Wandler sehr teuer, die mehrere GS/s schaffen. Durch einen Trick (mehrere verschachtelte langsame AD-Wandler) setzen sich AD-Wandler bei günstigen Modellen durch. Oszilloskope, die diesen Trick verwenden, erkennt man daran, dass die Abtastfrequenz mit der Anzahl der aktivierten Kanäle sinkt. Zum Beispiel, findet man Vierkanaloszilloskop mit vier Wandlern à 250 MS/s, die bei Benutzung nur eines Kanals 1 GS/s für diesen Kanal erreichen, bei Benutzung von zwei Kanäle 500 MS/s pro Kanal und bei Benutzung von drei oder vier Kanälen 250 MS/s pro Kanal.&lt;br /&gt;
&lt;br /&gt;
In den richtig schnellen Geräten (mehrere GHz Samplerate) ist ein ähnlicher Trick üblich. Dort sind in den verwendeten Wandlerschaltkreisen eine größere Anzahl Sample-and-Hold-Stufen und AD-Wandler integriert. Die Eingangsspannung wird dann zeitversetzt in den Sample-and-Hold-Stufen gespeichert und von den im Vergleich zur Samplerate langsameren AD-Wandlern umgesetzt. Die Ausgangslogik sorgt dann dafür, dass die Daten in der richtigen Reihenfolge ausgegeben werden. Ein Problem bei dieser Vorgehensweise sind unterschiedliche elektrische Eigenschaften der parallelen Wandlerstufen. &lt;br /&gt;
&lt;br /&gt;
Natürlich spielt der Verwendungszweck eine entscheidende Rolle bei der Auswahl. Auf dem Labortisch, wo meist nur kleine Spannungen mit einem gemeinsamen Massebezug vorkommen, werden andere Anforderungen an ein Oszilloskop gestellt, als z.&amp;amp;nbsp;B. im Servicebereich für Industriesteuerungsanlagen, Automatisierungstechnik, usw. Dort sind weniger hohe Abtastraten wichtig, sondern eher eine größere Anzahl Eingangskanäle, die galvanisch voneinander getrennt sind, Spannungsfestigkeit bis min. 500 Volt, sowie speziell bei Störungsanalysen, die Möglichkeit, komplexe Triggermuster einzustellen, und eine integrierte große Festplatte, um einzelne Ereignisse automatisiert über lange Zeiträume hinweg festhalten zu können. Ein Beispiel für so ein hochwertiges Gerät ist ein Yokogawa Scopecorder (DL708). Allerdings sind bei solchen Geräten die Preise nach oben hin offen.&lt;br /&gt;
&lt;br /&gt;
===  Digitale Tischoszilloskope ===&lt;br /&gt;
==== Allgemeines ====&lt;br /&gt;
&lt;br /&gt;
DSO Tischoszilloskope sind die klassischen, in sich abgeschlossenen Geräte, die in der Gestaltung analogen Oszilloskopen ähneln. Daneben gibt es zum Beispiel auch PC DSOs. Viele Tischgeräte sind bereits so klein (geringe Tiefe) und leicht, dass sie zu Recht als tragbare Geräte bezeichnet werden. Beim Neukauf eines Oszilloskops sind diese Geräte die interessantesten.&lt;br /&gt;
&lt;br /&gt;
Mittlerweile ist es üblich, dass man bereits bei Einsteigermodellen eingebaute USB oder RS-232 Schnittstellen findet und eine (häufig sehr simple) Windows-Software zur Bedienung vom PC aus oder zumindest zum Auslesen von Daten auf den PC. Ebenfalls häufig sind USB oder ähnliche Schnittstellen für USB-Memorysticks oder Speicherkarten zum Speichern von Messwerten, Screenshots und Konfigurationen. Ironischerweise sind Schnittstellen und Windows-Software bei Markengeräten häufig gesondert zu erwerben, während sie bei eher unbekannten Marken kostenlos mitgeliefert werden, wenn auch die Qualität der kostenlosen Software häufig zu wünschen übrig lässt. &lt;br /&gt;
&lt;br /&gt;
Beispiele für günstige Einstiegsmodelle unter 600 Euro sind einige, aber nicht alle, Geräte von Rigol, Hantek, Owon oder Atten. Für relativ wenig Geld erhält man für einfache Anwendungen ein brauchbares Oszilloskop mit ein paar Highlights aber auch auffälligen Einschränkungen und Fehlern in der Hard- und Software. Viel oder überhaupt Service kann man von diesen Firmen für sein Geld meist nicht erwarten.&lt;br /&gt;
&lt;br /&gt;
Geräte bspw. von [http://www.instek.com/ Instek] sind etwas teurer. Geräte aus der GDS-1000A oder GDS-1000U Serie dürften zum Einstieg interessant sein, oder mittlerweile die modernere Serie DS2000 von Rigol.&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel für ein Einstiegsmodell war das [http://www.tek.com/site/ps/0,,40-15314-INTRO_EN,00.html TDS1002] von Tektronix (ca. 1200 Euro). Dazu muss man allerdings sagen, dass Tektronix die aktuelle Entwicklung etwas verschlafen hat. Der nur 2 kByte große Speicher ist nicht mehr zeitgemäß. Geräte der [http://www.home.agilent.com/agilent/product.jspx?nid=-33575.0&amp;amp;cc=DE&amp;amp;lc=ger&amp;amp;pageMode=OV Agilent InfiniiVision 2000X Serie] beginnen in einem ähnlichen Preisbereich aber mit wesentlich mehr Features.&lt;br /&gt;
&lt;br /&gt;
==== Vergleichstabelle digitale Tischoszilloskope ====&lt;br /&gt;
&lt;br /&gt;
Diese Tabelle soll einen Überblick über interessante oder bekannte Geräte besonders im unteren Preisbereich geben. Eine vollständige Auflistung aller existierenden Geräte ergibt wegen der Vielzahl an Baureihen und Modellen wenig Sinn.&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;digitaloszis&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Hersteller&lt;br /&gt;
! Preis [&amp;amp;euro;]&lt;br /&gt;
! Kanäle&lt;br /&gt;
! Samplerate &amp;lt;BR/&amp;gt;[MS/s]&lt;br /&gt;
! Bandbreite &amp;lt;BR/&amp;gt;[MHz]&lt;br /&gt;
! Auflösung [Bit]&lt;br /&gt;
! Speichertiefe [Samples]&lt;br /&gt;
! Display&lt;br /&gt;
! PC-Interface&lt;br /&gt;
! Bemerkungen&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.conrad.de/ce/de/product/122485/VOLTCRAFT-Vorteilsset-DSO-1062D-2-Kanal-Oszilloskop-Digitales-Speicheroszilloskop-Bandbreite-60-MHz-inkl-2-Tastkoepf DSO5062D]&lt;br /&gt;
| [http://www.conrad.de/ Conrad]&lt;br /&gt;
| 329.-&lt;br /&gt;
| 2&lt;br /&gt;
| 500/1000&lt;br /&gt;
| 60&lt;br /&gt;
| 8&lt;br /&gt;
| 1M&lt;br /&gt;
| 800 x 480, 7&amp;quot; (die auch genutzt werden)&lt;br /&gt;
| 1 x USB Geräte- und 1 x USB Host-Schnittstelle&lt;br /&gt;
| Gleiche Hardware wie das Hantek DSO5102B und nur leicht modifizierte Software (Startbild, Gerätename, etc.).&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.hantek.com.cn/english/produce_list.asp?unid=78 DSO5102B]&lt;br /&gt;
| [http://www.hantek.com.cn/english/ Hantek]&lt;br /&gt;
| mit sehr viel Glück auf eBay 390 + Zoll + Umsatzsteuer ... 520&lt;br /&gt;
| 2&lt;br /&gt;
| 500/1000&lt;br /&gt;
| 100&lt;br /&gt;
| 8&lt;br /&gt;
| 1M&lt;br /&gt;
| 800 x 480, 7&amp;quot; (die auch genutzt werden)&lt;br /&gt;
| 1 x USB Geräte- und 1 x USB Host-Schnittstelle&lt;br /&gt;
| Beliebt, da es einen Hack auf 200 MHz gibt. Ebenso diverse Hacks an der Hardware. Für ein Niedrigpreis-Produkt übliche und verzeihbare Hardware- und Firmware-Macken. Auch als Tekway DST1102B oder Protek 3110 im Handel.&lt;br /&gt;
|-&lt;br /&gt;
| DSO3062A||Agilent||800||2||500 ||60||8||4k||320x240||USB||weitgehend baugleich mit Rigol DS5000&lt;br /&gt;
|-&lt;br /&gt;
| InfiniiVision 2000 X Serie||Agilent|| 950 - 2600 (MSO) ||2 - 4||1 G/Kanal. Bei Benutzung der Hälfte aller Kanäle 2G/Kanal|| 70 - 200 || 8 || 100k || 800 x 480, 8,5&amp;quot;|| ||Markengeräte mit exzellentem Preis-Leistungs-Verhältnis. Software-Aufrüstbar (Funktionsgenerator, Protokoll-Dekoder, usw.)&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.rigolna.com/products_ds1000d.aspx DS1000 Serie]&lt;br /&gt;
| [http://www.rigolna.com/ Rigol]&lt;br /&gt;
| 285 - 1650&lt;br /&gt;
| 2&lt;br /&gt;
| 400/200&amp;lt;BR/&amp;gt;(1/2 Kanäle)&lt;br /&gt;
| 25 - 100&lt;br /&gt;
| 8&lt;br /&gt;
| 1M&lt;br /&gt;
| 320x240&lt;br /&gt;
| USB, seriell&lt;br /&gt;
| optional 16-Kanal Logikanalysator&lt;br /&gt;
|-&lt;br /&gt;
| [[Rigol DS1052E]]&lt;br /&gt;
| [http://www.rigolna.com/ Rigol]&lt;br /&gt;
| ab 285&lt;br /&gt;
| 2&lt;br /&gt;
| 1000/500&amp;lt;BR/&amp;gt;(1/2 Kanäle)&lt;br /&gt;
| 50 (100=DS1102E)&lt;br /&gt;
| 8&lt;br /&gt;
| 1M&lt;br /&gt;
| 320x234&lt;br /&gt;
| USB, seriell&lt;br /&gt;
| optional 16-Kanal Logikanalysator = DS1052D (DS1102D). Im Netz kursieren diverse, mehr oder weniger ernst zu nehmende Anleitungen, wie man ein DS1052E per Software auf ein DS1102E umrüsten kann.&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.rigolna.com/products/digital-oscilloscopes/ds2000/ DS2000 Serie]&lt;br /&gt;
| [http://www.rigolna.com/ Rigol]&lt;br /&gt;
| 845 - 1640&lt;br /&gt;
| 2&lt;br /&gt;
| 2 GS/s&lt;br /&gt;
| 70 - 200&amp;lt;BR/&amp;gt;(70=DS2072)&lt;br /&gt;
| 8&lt;br /&gt;
| 14M&amp;lt;BR/&amp;gt;(per Lizenz 56M)&lt;br /&gt;
| 800 x 480, 8&amp;quot;&lt;br /&gt;
| USB Host (front) und USB Device (mit Pict Bridge), Ethernet (LXI)&lt;br /&gt;
| Per Kauflizenz jeweils freischaltbar sind 56M, serielle Dekoder, weitere Trigger. Lassen sich alle über generierte Serial freischalten und sogar auf Topmodel DS2202 (200MHz) upgraden, da identische (gute) Hardware u. Lieferumfang - keine Hardwaremodifikation nötig. Dank LXI (offene Spezifikation) gute Softwareanbindung. Vertikalauflösung ab 0,5mV/Div! &lt;br /&gt;
|-&lt;br /&gt;
| Owon PDS Serie&lt;br /&gt;
| Owon, alias Xiamen Lilliput Technology Co., Ltd&lt;br /&gt;
| 299,- (PDS5022S); 495,- (PDS6062T); 570,- (PDS7102T)&lt;br /&gt;
| 2&lt;br /&gt;
| 100 - 500&lt;br /&gt;
| 25 - 100&lt;br /&gt;
| 8&lt;br /&gt;
| 5k pro Kanal&lt;br /&gt;
| 640x480&lt;br /&gt;
| USB, seriell incl.&lt;br /&gt;
| Qualität entspricht Preis. Relativ unausgewogenes Verhältnis von Bandbreite zu Samplingrate. Geräte mit einem &#039;S&#039; am Ende der Typenbezeichnung haben ein STN LCD mit niedriger Qualität.&amp;lt;br&amp;gt;nur Real-Time Sampling&lt;br /&gt;
|-&lt;br /&gt;
| [http://owon.com.cn/eng/smartDS.asp Owon SDS Serie]&lt;br /&gt;
| Owon, alias Xiamen Lilliput Technology Co., Ltd&lt;br /&gt;
| 400 (SDS7102)&lt;br /&gt;
| 2&lt;br /&gt;
| 500 M - 3.2 G&lt;br /&gt;
| 60 - 300&lt;br /&gt;
| 8&lt;br /&gt;
| 10M/Kanal&lt;br /&gt;
| 800 x 600, 8&amp;quot;&lt;br /&gt;
| USB Host und Slave, seriell incl., Ethernet, VGA&lt;br /&gt;
| Deutliche Verbesserung gegenüber der alten PDS-Serie. Beeindruckende Speichertiefe (10M) und Bildschirm (8&amp;quot;). Für ein Niedrigpreis-Produkt übliche Hardware- und Firmware-Macken. Neuere Geräte mit verbessertem Hardwaredesign, Firmware wird regelmäßig aktualisiert, menülastige, gewöhnugsbedürftige Bedienung. Akkubetrieb optional&lt;br /&gt;
|-&lt;br /&gt;
| GW Instek GDS-1000 Serie&lt;br /&gt;
| [http://www.instek.com/html/en/index-e.asp GW Instek], alias Good Will Instrument Co., Ltd.&lt;br /&gt;
| 350 - 550&amp;lt;br&amp;gt;(Conrad: 475 - 950)&lt;br /&gt;
| 2&lt;br /&gt;
| 250&lt;br /&gt;
| 25 - 100&lt;br /&gt;
| 8&lt;br /&gt;
| 4k&lt;br /&gt;
| 320x234&lt;br /&gt;
| USB (Geräte-Modus, kein Host-Modus), SD Kartenslot&lt;br /&gt;
| Von Conrad teurer als DSO-4000 Serie erhältlich.&amp;lt;br&amp;gt;[http://code.google.com/p/gds2000tools/ Einfache Software für Linux erhältlich]&lt;br /&gt;
|-&lt;br /&gt;
| GW Instek GDS-1000&#039;&#039;&#039;A&#039;&#039;&#039; Serie&lt;br /&gt;
| [http://www.instek.com/html/en/index-e.asp GW Instek], alias Good Will Instrument Co., Ltd.&lt;br /&gt;
| 500 - ?&lt;br /&gt;
| 2&lt;br /&gt;
| bis 1GS/s&lt;br /&gt;
| 60 - 150&lt;br /&gt;
| 8&lt;br /&gt;
| bis 2M&lt;br /&gt;
| 320x234&lt;br /&gt;
| USB (Geräte-Modus, kein Host-Modus), SD Kartenslot&lt;br /&gt;
| [http://code.google.com/p/gds2000tools/ Einfache Software für Linux erhältlich]&lt;br /&gt;
|-&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Hersteller&lt;br /&gt;
! Preis [&amp;amp;euro;]&lt;br /&gt;
! Kanäle&lt;br /&gt;
! Samplerate &amp;lt;BR/&amp;gt;[MS/s]&lt;br /&gt;
! Bandbreite &amp;lt;BR/&amp;gt;[MHz]&lt;br /&gt;
! Auflösung [Bit]&lt;br /&gt;
! Speichertiefe [Samples]&lt;br /&gt;
! Display&lt;br /&gt;
! PC-Interface&lt;br /&gt;
! Bemerkungen&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.instek.com/html/en/products-l.asp?p1sn=17&amp;amp;p2sn=41 GW Instek GDS-2000 Serie]&lt;br /&gt;
| [http://www.instek.com/html/en/index-e.asp GW Instek], alias Good Will Instrument Co., Ltd.&lt;br /&gt;
| 850 - 1800&lt;br /&gt;
| 2 - 4&lt;br /&gt;
| 1000&lt;br /&gt;
| 60 - 200&lt;br /&gt;
| 8&lt;br /&gt;
| max. 5000 (alle Kanäle benutzt) / 25000 (ein Kanal in Benutzung)&lt;br /&gt;
| 320x234&lt;br /&gt;
| Inkl. USB (Geräte-Modus zum PC, zwei weitere USB-Buchsen Host-Modus für eine Speicherkarte oder Drucker), RS-232&lt;br /&gt;
| Weitgehend baugleich mit Conrad Voltcraft DSO-8000 Serie. Vier-Kanal Versionen haben keinen externen Trigger und weniger Trigger-Funktionen.&amp;lt;br&amp;gt;[http://code.google.com/p/gds2000tools/ Einfache Software für Linux erhältlich]&lt;br /&gt;
|-&lt;br /&gt;
| TDS-1002B&lt;br /&gt;
| Tektronix&lt;br /&gt;
| 1100&lt;br /&gt;
| 2&lt;br /&gt;
| 1000&lt;br /&gt;
| 60&lt;br /&gt;
| 8&lt;br /&gt;
| 2.5k&lt;br /&gt;
| 320x240&lt;br /&gt;
| USB inkl.&lt;br /&gt;
| verhältnismäßig starkes Rauschen, siehe Text oben&lt;br /&gt;
|-&lt;br /&gt;
| WaveJet 3xx&lt;br /&gt;
| LeCroy &lt;br /&gt;
| 2800..8000 (brutto)&lt;br /&gt;
| 2 oder 4&lt;br /&gt;
| 1000/2000&lt;br /&gt;
| 100/200/350/500&lt;br /&gt;
| 8&lt;br /&gt;
| 500k&lt;br /&gt;
| 640x480&lt;br /&gt;
| USB inkl.&lt;br /&gt;
| verfügbar z.&amp;amp;nbsp;B. bei Farnell&lt;br /&gt;
|-&lt;br /&gt;
| WaveAce Serie&lt;br /&gt;
| LeCroy &lt;br /&gt;
| 1000 - 3500&lt;br /&gt;
| 2&lt;br /&gt;
| 250 - 2000&lt;br /&gt;
| 60 - 300&lt;br /&gt;
| 8&lt;br /&gt;
| 4k - 8k&lt;br /&gt;
| 320x240&lt;br /&gt;
| USB (Geräte- und Host-Modus), RS-232(?)&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://www.dlm2000.de DLM20XX]&lt;br /&gt;
| YOKOGAWA &lt;br /&gt;
| 3300..8000 (brutto)&lt;br /&gt;
| 2 oder 4 (3+1) wobei 1 wahlweise 8Kanal Digital ist&lt;br /&gt;
| 2500 (1250)&lt;br /&gt;
| 200/350/500&lt;br /&gt;
| 8&lt;br /&gt;
| 12,5MPts&lt;br /&gt;
| 1024x768&lt;br /&gt;
| USB, Ethernet, Browsersteuerung inkl.&lt;br /&gt;
| Vertrieb vom Hersteller direkt!&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.uni-trend.com/UT2025B.html UNI-T UT2025B] / Voltcraft DSO-1022 M&lt;br /&gt;
| [http://www.uni-trend.com/ Uni-Trend Group Limited]&lt;br /&gt;
| 290 - 356&lt;br /&gt;
| 2&lt;br /&gt;
| 250&lt;br /&gt;
| 25&lt;br /&gt;
| 8&lt;br /&gt;
| 512k/Kanal&amp;lt;ref name=&amp;quot;unit&amp;quot;&amp;gt;Uni-Ts Angaben zur Speichertiefe sind mit Vorsicht zu genießen. Seit Jahren wirbelt die Firma mit Begriffen wie &#039;&#039;memory length&#039;&#039;, &#039;&#039; memory depth&#039;&#039;, &#039;&#039;recording length&#039;&#039; und &#039;&#039;saving depth&#039;&#039; herum - jeweils mit unterschiedlichen Werten für das gleiche Oszilloskop. Dabei vermeidet Uni-T Begriffsdefinitionen zu geben. Im Zweifelsfall sollte man mit dem kleinsten Wert aller Angaben rechnen.&amp;lt;/ref&amp;gt;&lt;br /&gt;
| 320x240 (Monochrom)&lt;br /&gt;
| USB, RS-232.&lt;br /&gt;
| Als UT2025&#039;&#039;&#039;C&#039;&#039;&#039; mit Farbdisplay. UT2000 Serie 25-200MHz, 2CH 250MSa/s bis 1GSa/s&amp;lt;br&amp;gt;wenig Rauschen&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.uni-trend.com/UTD2052CEL.html UTD2052CEL]&lt;br /&gt;
| [http://www.uni-trend.com/ Uni-Trend Group Limited]&lt;br /&gt;
| 369,-&lt;br /&gt;
| 2&lt;br /&gt;
| 1000&lt;br /&gt;
| 50&lt;br /&gt;
| 8&lt;br /&gt;
| 2x600k &#039;&#039;recording length&#039;&#039;;&amp;lt;br&amp;gt;25k &#039;&#039;saving depth&#039;&#039; ein Kanal;&amp;lt;br&amp;gt;12,5k &#039;&#039;memory depth&#039;&#039; zwei Kanäle&amp;lt;ref name=&amp;quot;unit&amp;quot; /&amp;gt;&lt;br /&gt;
| 800 x 480&amp;lt;br&amp;gt;Der Displaycontroller faßt immer 2x2 Pixel zusammen, dadurch reduziert sich die Auflösung real auf 400 x 240&amp;lt;br&amp;gt;(Menü nimmt relativ viel Platz auf dem Bildschirm ein)&lt;br /&gt;
| USB&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| HM2008&lt;br /&gt;
| [http://www.hameg.com Hameg]&lt;br /&gt;
| 2000&lt;br /&gt;
| 2&lt;br /&gt;
| 2GSa/s(1CH)1GSa/s(2CH)&lt;br /&gt;
| 200&lt;br /&gt;
| 8&lt;br /&gt;
| 4048k&lt;br /&gt;
| Röhre 8x10cm&lt;br /&gt;
| USB für Speicherstick (vorne), USB/RS232 für PC (hinten), &lt;br /&gt;
| 4 Logikkanäle nachrüstbar, Ethernet/USB nachrüstbar&lt;br /&gt;
|-&lt;br /&gt;
| PT 1200&lt;br /&gt;
| [http://www.PEAKTECH.de Peaktech]&lt;br /&gt;
| ca. 360&lt;br /&gt;
| 2&lt;br /&gt;
| 100MSa/s(1CH)100MSa/s(2CH)&lt;br /&gt;
| 25&lt;br /&gt;
| 8&lt;br /&gt;
| 6k pro Kanal&lt;br /&gt;
| Farb LCD 7,8&amp;quot; 640x480&lt;br /&gt;
| USB für PC (hinten) &lt;br /&gt;
| Im Original vermutlich ein Owon PDS5022S. Optional: Akkupack 7,4 V ~ 8000 mA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Weitere Marken, die gelegentlich auf dem deutschen Markt auftauchen, häufig über eBay, sind &lt;br /&gt;
&lt;br /&gt;
* GAOtek&lt;br /&gt;
* Hangzhou Jingce (JC)&lt;br /&gt;
* Tonghui&lt;br /&gt;
* Ypioneer&lt;br /&gt;
* Jiangsu Lvyang&lt;br /&gt;
* Siglent (Zweitmarke von Atten)&lt;br /&gt;
&lt;br /&gt;
Über deren Qualität hört man wenig oder gar nichts.&lt;br /&gt;
&lt;br /&gt;
=== PC-Oszilloskope ===&lt;br /&gt;
==== PC-Zusätze ====&lt;br /&gt;
===== Allgemeines &amp;amp; Beachtenswertes =====&lt;br /&gt;
&lt;br /&gt;
PC-Oszilloskope / PC-Zusätze sind im Prinzip digitale Speicheroszilloskope, mit der Besonderheit, dass sie die Daten nicht selbst anzeigen, sondern an einen PC übermitteln. Beim Kauf eines PC-Oszilloskops sollte man besonders vorsichtig sein, da viele Angebote irreführende Informationen enthalten. Sehr beliebt ist z.&amp;amp;nbsp;B. die Werbung mit der Analogbandbreite, also die Bandbreite die der Analogteil der Schaltung (Eingangsverstärker) verarbeiten kann. Wenn hier 100 MHz angegeben sind bedeutet das aber nicht, dass sich auch wirklich Signale bis 100 MHz darstellen lassen; wenn der Wandler nur mit 40 MS/s abtastet ist das Oszilloskop gerade noch bis 4 MHz verwendbar. Ebenso sollte man nur die Echtzeit- oder Realtime-Abtastrate beachten, eine manchmal ebenfalls angegebene &amp;quot;Äquivalent-Abtastrate&amp;quot; ist nur bei periodischen Signalen zu gebrauchen und damit im Umfeld von Mikrocontrollern meist wertlos.&lt;br /&gt;
&lt;br /&gt;
Die Wahl zwischen einem Tischoszilloskop und einem PC-Zusatz ist nicht nur eine Geld-, Leistungs- oder Qualitätsfrage. Ein Tischgerät lässt sich anders bedienen (echte Knöpfe, sicherer Stand) und belegt nicht den PC oder Laptop. Erfahrene Entwickler ziehen ein separates Gerät einem PC-Zusatz vor. Zum Teil ist dies eine Generationsfrage.&lt;br /&gt;
&lt;br /&gt;
Hinzu kommt, dass billige PC-Oszilloskope meist keine galvanische Trennung an ihrer USB-Schnittstelle besitzen. Ein Fehler bei einer Messung kann daher nicht nur das Oszilloskop, sondern gleich den PC mit beschädigen. Das gleiche Problem kann man übrigens auch bei einfachen Tischoszilloskopen mit PC-Schnittstelle haben. Allerdings kann man Tischgeräte auch ohne die PC-Verbindung betreiben, PC-Oszilloskope nicht.&lt;br /&gt;
&lt;br /&gt;
Gelegentlich wird geraten, das Oszilloskop, egal ob Tischgerät oder PC-Zusatz, immer über einen &amp;quot;self powered&amp;quot; USB-Hub (einer mit eigenem Netzteil) mit dem PC zu verbinden. Ob ein solcher Hub als Schutzmaßnahme geeignet ist, besonders zum Personenschutz, sei dahingestellt. Schaden sollte er nicht.&lt;br /&gt;
&lt;br /&gt;
Besonders zu beachten ist die PC-Software. Nicht nur, ob sie zum Zeitpunkt des Kaufs wenigstens grundsätzlichen Ansprüchen genügt, sondern auch, ob der Hersteller vermutlich willens und in der Lage ist, die Software über viele Jahre zu warten. Stichwort Investitionssicherheit. Ohne Wartung kann eine Inkompatibilität in der Software zum nächste Windows Service-Pack oder zur nächste Windows-Version das Gerät völlig entwerten.&lt;br /&gt;
&lt;br /&gt;
Leider ist es so, dass es fast keine freie [[Oszilloskop#Software|Oszilloskopsoftware]] gibt. Die Protokolle zwischen Oszilloskop-Vorsätzen und Computer sind meist proprietär, und selten hat sich ein Entwickler freier Software die Mühe gemacht, ein Protokoll zu entschlüsseln. Noch seltener ist es, dass auf dieser Basis eine brauchbare oder gar gute Software geschrieben wurde. So ist ein Ausweichen auf freie Software kaum möglich, sollte der Hersteller die Wartung aufgeben. Man ist im Normalfall auf Gedeih und Verderb dem Hersteller ausgeliefert.&lt;br /&gt;
&lt;br /&gt;
===== Vergleichstabelle PC-Zusätze =====&lt;br /&gt;
&lt;br /&gt;
Diese Tabelle soll einen Überblick über interessante oder bekannte Geräte besonders im unteren Preisbereich geben. Eine vollständige Auflistung aller existierenden Geräte ergibt wegen der Vielzahl an Baureihen und Modellen wenig Sinn.&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;pczusatzoszis&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Hersteller&lt;br /&gt;
! Preis [&amp;amp;euro;]&lt;br /&gt;
! Kanäle&lt;br /&gt;
! Sample&amp;amp;shy;rate &amp;lt;BR/&amp;gt;[MS/s]&lt;br /&gt;
! Band&amp;amp;shy;breite &amp;lt;BR/&amp;gt;[MHz]&lt;br /&gt;
! Auf&amp;amp;shy;lösung [Bit]&lt;br /&gt;
! Speicher&amp;amp;shy;tiefe [Samples]&lt;br /&gt;
! Display&lt;br /&gt;
! PC-Inter&amp;amp;shy;face&lt;br /&gt;
! Bemerkungen&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.elandigitalsystems.com/support/usbtmfaq/software.php USBscope50]&lt;br /&gt;
| Elan Digital Systems / dt. Vertrieb Hacker&lt;br /&gt;
| 249&lt;br /&gt;
| 1 (-4)&lt;br /&gt;
| 50 / 1000&lt;br /&gt;
| 10 / 75&lt;br /&gt;
| 8&lt;br /&gt;
| 3k pro Kanal&lt;br /&gt;
| auf dem PC&lt;br /&gt;
| USB&lt;br /&gt;
| CAT II, 300V galv. Trennung zu USB, OpenSource SDK, Java, Linux, LabView&lt;br /&gt;
|-&lt;br /&gt;
| PicoScope PS 2104&lt;br /&gt;
| Pico Technology&lt;br /&gt;
| 185&lt;br /&gt;
| 1&lt;br /&gt;
| 50&lt;br /&gt;
| 10&lt;br /&gt;
| 8&lt;br /&gt;
| 8K&lt;br /&gt;
| auf dem PC&lt;br /&gt;
| USB&lt;br /&gt;
| Spektralanalyse und Voltmeter in Software.&lt;br /&gt;
|-&lt;br /&gt;
| PicoScope PS 2105&lt;br /&gt;
| Pico Technology&lt;br /&gt;
| 290&lt;br /&gt;
| 1&lt;br /&gt;
| 100&lt;br /&gt;
| 25&lt;br /&gt;
| 8&lt;br /&gt;
| 24K&lt;br /&gt;
| auf dem PC&lt;br /&gt;
| USB&lt;br /&gt;
| Spektralanalyse und Voltmeter in Software.&lt;br /&gt;
|-&lt;br /&gt;
| PicoScope 2205&lt;br /&gt;
| Pico Technology&lt;br /&gt;
| 350&lt;br /&gt;
| 2&lt;br /&gt;
| 200&lt;br /&gt;
| 25&lt;br /&gt;
| 8 - 12&lt;br /&gt;
| 16K&lt;br /&gt;
| auf dem PC&lt;br /&gt;
| USB &lt;br /&gt;
| Kleiner Arbitrary Waveform Generator eingebaut.&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.hantek.com.cn/english/produce_list.asp?unid=62 DSO-2090 USB]&lt;br /&gt;
| Hantek - Qingdao Hatek Electronic Co., Ltd.&lt;br /&gt;
| 200&lt;br /&gt;
| 2&lt;br /&gt;
| 1 Kanal: 100 / 2 Kanäle: 50&lt;br /&gt;
| 40&lt;br /&gt;
| 8&lt;br /&gt;
| 1 Kanal: 64K / 2 Kanäle: 32K&lt;br /&gt;
| auf dem PC&lt;br /&gt;
| USB &lt;br /&gt;
| Wenige Vorteile gegenüber einem Tischgerät. Analogbandbreite bei der Samplingrate nicht ausnutzbar. Kleiner Eingangsspannungsbereich. Unter diversen anderen Namen erhältlich.&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.hantek.com.cn/english/produce_list.asp?unid=63 DSO-2150 USB]&lt;br /&gt;
| Hantek - Qingdao Hatek Electronic Co., Ltd.&lt;br /&gt;
| 200&lt;br /&gt;
| 2&lt;br /&gt;
| max. 150&lt;br /&gt;
| 60&lt;br /&gt;
| 8&lt;br /&gt;
| 10K-32K/Kanal&lt;br /&gt;
| auf dem PC&lt;br /&gt;
| USB&lt;br /&gt;
| .&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.hantek.com.cn/english/produce_list.asp?unid=64 DSO-2250 USB]&lt;br /&gt;
| Hantek - Qingdao Hatek Electronic Co., Ltd.  &lt;br /&gt;
| 220&lt;br /&gt;
| 2&lt;br /&gt;
| max. 250&lt;br /&gt;
| 100&lt;br /&gt;
| 8&lt;br /&gt;
| 10K-512K/Kanal&lt;br /&gt;
| auf dem PC&lt;br /&gt;
| USB&lt;br /&gt;
| .&lt;br /&gt;
|-&lt;br /&gt;
| Mephisto Scope 1 (UM202)&lt;br /&gt;
| Meilhaus&lt;br /&gt;
| 333&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| 16&lt;br /&gt;
| 256K&lt;br /&gt;
| ..&lt;br /&gt;
| USB&lt;br /&gt;
| 5 in 1,&lt;br /&gt;
Oszilloskop,&lt;br /&gt;
Logik-Analysator,&lt;br /&gt;
Voltmeter,&lt;br /&gt;
Datenlogger analog und digital,&lt;br /&gt;
Digital-I/O&lt;br /&gt;
|-&lt;br /&gt;
| MSO-19&lt;br /&gt;
| Link Instruments Inc.&lt;br /&gt;
| 172&lt;br /&gt;
| 1&lt;br /&gt;
| 200&lt;br /&gt;
| 60&lt;br /&gt;
| ??&lt;br /&gt;
| 1K&lt;br /&gt;
| ..&lt;br /&gt;
| USB&lt;br /&gt;
|&lt;br /&gt;
Oszilloskop,&lt;br /&gt;
Logik-Analysator,&lt;br /&gt;
Pattern Generator,&lt;br /&gt;
TDR&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Soundkarten-Oszilloskope ====&lt;br /&gt;
[[Bild:Soundoszi.JPG|thumb|right|300px|Soundkarten Oszilloskop]]&lt;br /&gt;
Wem ein wirklich einfaches Oszilloskop für kleine Frequenzen (bis etwa 20 kHz) ausreicht, bspw. um die Kommunikation am I2C-Bus zu analysieren, kann dazu die Soundkarte des PC benutzen.&lt;br /&gt;
Allerdings eignet sich eine Soundkarte nicht dazu, Gleichspannungen zu messen, zu niederfrequente Signale können daher nicht damit erfasst werden: Im Screenshot nebenan erkennt man das z.&amp;amp;nbsp;B. an der fallenden Gerade am Schluss (obwohl der tatsächliche Signalpegel konstant oben bleibt). Auch ist hier besondere Vorsicht geboten, da Soundkarten nur für geringe Spannungen ausgelegt sind und bei einer zu hohen Eingangsspannung möglicherweise der ganze PC beschädigt wird. Daher ist eine Vorschaltung mit Spannungsbegrenzung (ca 0,7V) nötig. &lt;br /&gt;
&lt;br /&gt;
Der Vorteil der Soundkartennutzung ist, dass es sich dank des PCs um eine Art  Speicheroszilloskop handelt und die Daten zum Beispiel in Excel analysiert werden können.&lt;br /&gt;
&lt;br /&gt;
* [http://www.scheidig.de/Deutsch/Download/SpekOszi/info.htm Hardy u. Karola Scheidig] verschiedene Programme zum Messen mit der Soundkarte.&lt;br /&gt;
* [http://www.sillanumsoft.org/ Visual Analyser] von Alfredo Accattatis und der University of Rome Tor Vergata, &amp;quot;Donateware&amp;quot; &lt;br /&gt;
* [http://www.zeitnitz.de/Christian/scope_en Soundcard Oscilloscope für Windows] von Christian Zeitnitz, kostenlos für Privatanwendung&lt;br /&gt;
* [http://www.qsl.net/dl4yhf/spectra1.html Spectrum Lab von DL4YHF]&lt;br /&gt;
* [http://w5big.com/spectrogram.htm Spectrogram] von R.S. Horne, ältere Version kostenlos&lt;br /&gt;
* [http://www.audiotester.de/ Audiotester 30-Tage-Version kostenlos]&lt;br /&gt;
* [http://www.dasylab.com/ DasyLab] Eingeschränkte Version (Soundkarte und serielle Schnittstelle) als Beilage zum Buch &amp;quot;Signale-Prozesse-Systeme&amp;quot; ISBN 9783642018633&lt;br /&gt;
* [http://www.zelscope.com/ Zelscope] von Constantin Zeldovich 14-Tage Evaluationsversion&lt;br /&gt;
* [http://www.dxzone.com/catalog/Software/Spectrum_analyzers/ Linksammlung]&lt;br /&gt;
==== Grafikkarten-Oszilloskope ====&lt;br /&gt;
Videokarten, die über einen analogen Input verfügen, stellen ebenfalls eine Alternative zu käuflichen Oszilloskopen dar, da sie 3kanalig Frequenzen bis rund 180 MHz verarbeiten können. Die digitale Auflösung liegt meist bei 8 Bit maximal, was für einfache Anzeigen jedoch reicht, wenn die Aussteuerung entsprechend ist. Durch Übersampeln lässt sich die Auflösung wie gehabt steigern, indem man z.B. je 4 Werte softwareseitig zusammenfasst und damit bis zu 2 Bit an Auflösung gewinnt. Bei 16 werten kann man in der Regel statistische 2-3 Bit erwarten und erhält eine Güte von ca 10 Bit bei 10MHz.&lt;br /&gt;
&lt;br /&gt;
=== Selbstbau ===&lt;br /&gt;
Der Selbstbau eines solchen Gerätes erspart (wie fast immer in solchen Fällen) kein Geld, sofern man nicht eine Spezialfunktion benötigt, die im Markt nicht beschaffbar ist. Der Spaß liegt also wieder im Bauen selbst.&lt;br /&gt;
&lt;br /&gt;
Es gibt diverse preiswerte Bausätze für Spielzeug-Oszilloskope. Die Ergebnisse nach dem Zusammenbau sind aber als Oszilloskop wenig brauchbar.&lt;br /&gt;
&lt;br /&gt;
Eine positive Ausnahme stellt hier das [http://www.elv.de/usb-mini-scope-modul-usb-msm-komplettbausatz.html USB-MSM] von ELV dar, das bei sorgfältiger Kalibrierung und &amp;quot;analog powert&amp;quot; bis zu 200kHz trotz seiner Einfachheit durchaus für das Hobbylabor oder schulische Zwecke brauchbar ist.&lt;br /&gt;
&lt;br /&gt;
Daneben findet man nur sehr wenige Selbstbau-Projekte deren Ergebnisse überzeugen. Einige interessante Projekte sind [http://www.mikrocontroller.net/topic/228997?goto=new#2308320]n und [http://www.ssalewski.de/DAD.html.de]. Dazu sei allerdings gesagt, dass der Aufwand an Material und Messmitteln schnell die Kosten für ein fertiges Oszilloskop überschreitet.&lt;br /&gt;
&lt;br /&gt;
=== Umbau ===&lt;br /&gt;
Sofern man tatsächlich etwas benötigt, was nicht käuflich zu erwerben ist, kann der Kauf und Umbau eines verhandenen Gerätes sinnvoll sein. &lt;br /&gt;
&lt;br /&gt;
Auf eBay werden immer noch die Oszilloskope der früheren Firma Wittig (heute Welec), wie zum Beispiel das W2012A, angeboten. Als Alternative zu der fehlerträchtigen Orginalfirmware ist mittlerweile eine Open-Source Variante verfügbar die kontinuierlich weiterentwickelt wird. Ebenfalls wird an Hardware Erweiterungen gearbeitet die die Qualität des Oszilloskops deutlich steigern. Wer sich nicht sicher ist ob das Gerät seinen Ansprüchen genügt sollte bei den Entwicklern nachfragen. [http://sourceforge.net/apps/trac/welecw2000a/wiki] Auch hier ist der Weg das Ziel.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[AVR_Softwarepool#Oszilloskop|AVR Softwarepool: Oszilloskop]]&lt;br /&gt;
* [[Einfaches Oszilloskop mit Bascom-AVR]]&lt;br /&gt;
* [[USB_Oszilloskop]]&lt;br /&gt;
* [[Logic_Analyzer]]&lt;br /&gt;
* [[LCS-1M - Ein einfaches, preiswertes, mikrokontrollergesteuertes Zweikanal-Oszilloskop zum Selberbauen]] ([[Picaxe]])&lt;br /&gt;
&lt;br /&gt;
== Links &amp;amp; Literatur ==&lt;br /&gt;
* [http://www.elektronikpraxis.vogel.de/index.cfm?pid=9681 Online-Dossier Grundlagen digitaler Oszilloskope. ] Veröffentlicht auf Elektronikpraxis online&lt;br /&gt;
* [http://www.tek.com/Measurement/App_Notes/XYZs/03W_8605_3.pdf XYZs of Oscilloscopes Primer]. Tektronix 03W-8605-3. 20091. Grundlagen digitaler Oszilloskope und das messen mit ihnen, wobei die Tektronix-Produktpalette im Vordergrund steht.  &lt;br /&gt;
* [http://www.tek.com/Measurement/App_Notes/ABCsProbes/60W_6053_9.pdf ABCs of Probes Primer]. Tektronix 60W-6053-9. 2009. Die Grundlagen von Tastköpfen, natürlich am Beispiel von Tektronixs Tastköpfen.&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/1?filter=oszi*+-oszillator Forum-Beiträge zum Thema Oszilloskop] (Kaufberatung, Anwendung)&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/3?filter=oszi*+-oszillator Beiträge im Markt-Forum]&lt;br /&gt;
* [http://www.virtuelles-oszilloskop.de/ Ein virtuelles interaktives Oszilloskop] ala HAMEG HM203-6 20 MHz zum Üben (Seite auf [http://www.virtuelles-oszilloskop.com Englisch])&lt;br /&gt;
* [http://www.eosystems.ro/eoscope/eoscope_en.htm Selbstbau-DSO 40MSPS]&lt;br /&gt;
* [http://www.sigcon.com/Pubs/straight/probes.htm Probing High-Speed Digital Designs], Originally published in [http://www.elecdesign.com/ Electronic Design Magazine], March, 1997&lt;br /&gt;
* [http://hackedgadgets.com/2007/12/10/oscilloscope-tutorials/ Oscilloscope Tutorials] Linkliste bei hackedgadgets.com&lt;br /&gt;
* [http://www.eevblog.com/2011/03/30/eevblog-159-oscilloscope-trigger-holdoff-tutorial/ EEVBlog #159] Videotutorial von Dave Jones zu &#039;&#039;&#039;Trigger Holdoff&#039;&#039;&#039;, (engl.)&lt;br /&gt;
* [http://www.all-about-test.info/spezial-oszilloskope.html/ Marktübersicht Spezial-Oszilloskope mit Hintergrundinfos]&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/167705#1602827 WinXP Software für OsziFox/ProbeScope] von  Micha B. (chameo)&lt;br /&gt;
&lt;br /&gt;
* [http://users.physik.fu-berlin.de/~jtt/fsc2.phtml fsc2] is a program running under GNU/Linux for controlling spectrometers. Supported devices include digitizing oscilloscopes too:&lt;br /&gt;
** Tektronix Digitizing Oscilloscope TDS520, TDS520A, TDS520C, TDS540, TDS744A and TDS754A&lt;br /&gt;
** LeCroy Digitizing Oscilloscope 9400, 9410, 9420, 9424, 9424e and 9450(A)&lt;br /&gt;
** LeCroy Digitizing Oscilloscope Waverunner and Waverunner-2 (LT224, LT 262, LT264, LT342, LT344, LT354, LT362, LT364, LT372, LT374, LT584, 44(M)Xi, 62X1, 64(M)Xi, 104(M)Xi, 204(M)Xi)&lt;br /&gt;
** LeCroy Digitizing Oscilloscope WaveSurfer (422, 424, 432, 434, 452 and 454)&lt;br /&gt;
&lt;br /&gt;
* [http://xoscope.sourceforge.net/ xoscope, oscope] is a digital oscilloscope using input from a sound card or EsounD and/or a ProbeScope/osziFOX and Bitscope hardware. Includes 8 signal displays, variable time scale, math,memory, measurements, and file save/load. (Linux, GPL)&lt;br /&gt;
&lt;br /&gt;
* [http://www.mtoussaint.de/qtdso.html QtDSO] is a frontend for the Velleman PCS64i digital oscilloscope (Anm.: Velleman nicht mehr unterstützt) It provides a fully featured oscillocope mode (including XY  plot and math) and a highly configurable spectrum analyzer mode. Für &#039;&#039;&#039;Digitalmultimeter&#039;&#039;&#039; gibt es vom gleichen Autor [http://www.mtoussaint.de/qtdmm.html QtDMM] und [http://www.mtoussaint.de/qtdmm2.html QtDMM2].&lt;br /&gt;
&lt;br /&gt;
* [http://www.eig.ch/fr/laboratoires/systemes-numeriques/projets/osqoop-l-oscilloscope-libre/index.html Osqoop] est un oscilloscope logiciel sous licence libre. Il permet de travailler sur un nombre arbitraire de canaux et des acquisitions de longue durée. Wiki description: [http://gitorious.org/osqoop Osqoop] is a multi-platform open source software oscilloscope based on Qt 4. It connects to various hardware data sources such as the sound input or a dedicated USB board.&lt;br /&gt;
&lt;br /&gt;
*[http://code.google.com/p/gds2000tools/ gds2000tools] ist eine Linux-Software für GW-Instek GDS-2000 und andere GW-Instek Oszilloskope.&lt;br /&gt;
&lt;br /&gt;
* [https://code.google.com/p/xoscillo/ Xoscillo] - A software oscilloscope that acquires data using an Arduino or a Parallax (more platforms to come). (Lizenz: CC-BY-NC-SA 3.0; Windows and Linux (needs mono))&lt;br /&gt;
&lt;br /&gt;
* [http://sourceforge.net/projects/oscope2100/ Oscope 2100] Linux software für Hantek DSO-2100.&lt;br /&gt;
&lt;br /&gt;
* [http://sourceforge.net/projects/openhantek/ OpenHantek] Linux Software für Hantek (Voltcraft/Darkwire/Protek/Acetech) DSO-2090.&lt;br /&gt;
&lt;br /&gt;
* [http://sourceforge.net/projects/dsoda/ Digital Soda] DSO-2250 Software.&lt;br /&gt;
&lt;br /&gt;
* [http://owondriver.sourceforge.net/ Owon Driver, Ownon Dump] Linux-Treiber für Owon-Oszilloskope.&lt;br /&gt;
&lt;br /&gt;
* [http://foss.doredevelopment.dk/wiki/Lxi-control Lxi-Control] Kommandozeilen-Applikation zur Fernsteuerung von Geräten mit LXI-Schnittstelle.&lt;br /&gt;
&lt;br /&gt;
* [http://gpib-utils.sourceforge.net/ gpib-util] Linux Kommandozeilen-Applikation, unterstützt diverse Oszilloskope (und andere Geräte) mit GPIB-Schnittstelle.&lt;br /&gt;
&lt;br /&gt;
* [http://optics.eee.nottingham.ac.uk/vxi11/ VXI11] Bibliothek und Programme für Geräte mit VXI-11 Schnittstelle.&lt;br /&gt;
&lt;br /&gt;
* [http://sourceforge.net/projects/wfmreader/ Linux WFM Datenformat-Leser].&lt;br /&gt;
&lt;br /&gt;
* [http://sigrok.org/ &#039;&#039;sigrok&#039;&#039; Open Source Signal Analysis Software Suite]&lt;br /&gt;
&lt;br /&gt;
=== Datenauswertung ===&lt;br /&gt;
&lt;br /&gt;
Bei Oszilloskopen (DSOs), die es erlauben, die gemessenen Daten zu einem PC zu übertragen, kann man die Messwerte auf dem PC weiter auswerten. Zum Beispiel ein Signal demodulieren, filtern oder dekodieren. Grundsätzlich ist die Auswertung in jeder Programmiersprache möglich. Programmiersprachen für numerische Berechnungen eignen sich jedoch besonders.&lt;br /&gt;
&lt;br /&gt;
* [http://www.mathworks.com Matlab] und Freie Alternativen wie [http://www.scilab.org/ SciLab] oder [http://www.gnu.org/software/octave/ GNU Octave]&lt;br /&gt;
&lt;br /&gt;
* [http://www.mathworks.com/matlabcentral/fileexchange/?term=Oscilloscope Matlabcentral Fileexchange, Suche nach &#039;&#039;Oscilloscope&#039;&#039;] Auf Matlabcentral Fileexchange finden sich auch MatLab Lese- und Auswertungsfunktionen für diverse Oszilloskope. Hinweis: Die von MatLab für die Kommunikation mit einem Oszilloskop verwendeten Toolboxen und Funktionen dürfen aufgrund der Matlabcentral Lizenz nicht mit freien Alternativen verwendet werden. [http://wiki.octave.org/FAQ#Why_can.27t_I_use_code_from_File_Exchange_in_Octave.3F_It.27s_released_under_a_BSD_license.21 siehe GNU OCtave FAQ]&lt;br /&gt;
&lt;br /&gt;
* [http://octave.sourceforge.net/instrument-control/ Octave-Forge instrument-control] für die Kommunikation mit diversen Geräten wie z.B. LXI-compatible Agilent, LeCroy or Tektronix Oszilloskope über VXI11. Außerdem UART, I2C, GPIB usw.&lt;br /&gt;
&lt;br /&gt;
* Eines Ingenieurs angeblich unwürdig&amp;lt;ref&amp;gt;Es ist sehr einfach Fehler in Tabellenkalkulationen zu machen, die typischerweise lange unentdeckt bleiben. [http://www.eusprig.org/ Untersuchungen] haben gezeigt, dass bereits dann bis zu 90% aller Tabellenkalkulationsblätter fehlerhaft sind, wenn es nur um einfache mathematische Grundoperationen (Addieren, Subtrahieren, Multiplizieren, Dividieren) geht.&amp;lt;/ref&amp;gt; sind Microsoft Excel oder andere Tabellenkalkulationen. Trotzdem sind sie zur Datenauswertung populär und auch geeignet, wenn sie richtig gehandhabt werden.&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Grundlagen]]&lt;br /&gt;
[[Category:Oszilloskope und Analyzer| ]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-GCC-Tutorial/Der_UART&amp;diff=80169</id>
		<title>AVR-GCC-Tutorial/Der UART</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-GCC-Tutorial/Der_UART&amp;diff=80169"/>
		<updated>2013-12-25T22:30:57Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Änderung 80168 von 84.173.204.95 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Über den [[UART]] kann ein [[AVR]] leicht mit einer [[RS-232]]-Schnittstelle eines PC oder sonstiger Geräte mit &amp;quot;[[seriell]]er Schnittstelle&amp;quot; verbunden werden. &lt;br /&gt;
&lt;br /&gt;
== Allgemeines zum UART ==&lt;br /&gt;
&lt;br /&gt;
Mögliche Anwendungen des UART:&lt;br /&gt;
&lt;br /&gt;
;Debug-Schnittstelle: z.&amp;amp;nbsp;B. zur Anzeige von Zwischenergebnissen (&amp;quot;printf-debugging&amp;quot; - hier besser &amp;quot;Logging&amp;quot; oder &amp;quot;UART-debugging&amp;quot;) über [[RS-232]] auf einem PC. Auf dem Rechner reicht dazu ein [[RS-232#Terminalprogramme|Terminalprogramm]] (MS-Windows: Hyperterm oder besser [https://sites.google.com/site/terminalbpp/], [http://www.der-hammer.info/terminal/ HTerm]; Unix/Linux z.&amp;amp;nbsp;B. minicom). Ein direkter Anschluss ist aufgrund unterschiedlicher Pegel nicht möglich, jedoch sind entsprechende Schnittstellen-ICs wie z.&amp;amp;nbsp;B. ein MAX232 günstig und leicht zu integrieren. Rechner ohne serielle Schnittstelle können über fertige USB-seriell-Adapter angeschlossen werden. &lt;br /&gt;
;Mensch-Maschine Schnittstelle: z.&amp;amp;nbsp;B. Konfiguration und Statusabfrage über eine &amp;quot;Kommandozeile&amp;quot; oder Menüs (siehe z.&amp;amp;nbsp;B. Forumsbeitrag [http://www.mikrocontroller.net/topic/52985 Auswertung RS232-Befehle] und Artikel [[Tinykon]]) &lt;br /&gt;
;Übertragen von gespeicherten Werten: z.&amp;amp;nbsp;B. bei einem Datenlogger&lt;br /&gt;
;Anschluss von Geräten: mit serieller Schnittstelle (z.&amp;amp;nbsp;B. (Funk-)Modems, Mobiltelefone, Drucker, Sensoren, &amp;quot;intelligente&amp;quot; LC-Displays, GPS-Empfänger). &lt;br /&gt;
;&amp;quot;Feldbusse&amp;quot;: auf RS485/RS422-Basis mittels entsprechenden Bustreiberbausteinen (z.&amp;amp;nbsp;B. MAX485)&lt;br /&gt;
;DMX, Midi: etc.&lt;br /&gt;
;LIN-Bus: &#039;&#039;&#039;L&#039;&#039;&#039;ocal &#039;&#039;&#039;I&#039;&#039;&#039;nterconnect &#039;&#039;&#039;N&#039;&#039;&#039;etwork: Preiswerte Sensoren/Aktoren in der Automobiltechnik und darüber hinaus&lt;br /&gt;
&lt;br /&gt;
Einige AVR-Controller haben ein bis zwei vollduplexfähige UART (&#039;&#039;&#039;U&#039;&#039;&#039;niversal &#039;&#039;&#039;A&#039;&#039;&#039;synchronous &#039;&#039;&#039;R&#039;&#039;&#039;eceiver and &#039;&#039;&#039;T&#039;&#039;&#039;ransmitter) schon eingebaut (&amp;quot;Hardware-UART&amp;quot;). &lt;br /&gt;
Übrigens: Vollduplex heißt nichts anderes, als dass der Baustein gleichzeitig senden und empfangen kann.&lt;br /&gt;
&lt;br /&gt;
Neuere AVRs (ATmega, ATtiny) verfügen über einen bis vier U&#039;&#039;&#039;S&#039;&#039;&#039;ART(s), dieser unterscheidet sich vom UART hauptsächlich durch interne FIFO-Puffer für Ein- und Ausgabe und erweiterte Konfigurationsmöglichkeiten. Die Puffergröße ist allerdings nur 1 Byte.&lt;br /&gt;
&lt;br /&gt;
== Die Hardware ==&lt;br /&gt;
&lt;br /&gt;
Der UART basiert auf normalem TTL-Pegel mit 0V (logisch 0) und 5V (logisch 1). Die Schnittstellenspezifikation für RS-232 definiert jedoch -3V ... -12V (logisch 1) und&lt;br /&gt;
+3 ... +12V (logisch 0). Daher muss der Signalaustausch zwischen AVR und Partnergerät invertiert werden. Für die Anpassung der Pegel und das Invertieren der Signale gibt es fertige Schnittstellenbausteine. Der bekannteste davon ist wohl der MAX232. &lt;br /&gt;
&amp;lt;!-- &amp;quot;Hackerloesung&amp;quot; auskommentiert - nicht so gut in einem &amp;quot;Einsteiger-Tutorial&amp;quot; - mthomas&lt;br /&gt;
Allerdings kostet der auch wieder Geld und benötigt&lt;br /&gt;
zusätzlich immerhin 4 externe Elkos.&lt;br /&gt;
&lt;br /&gt;
Die in den PC eingebauten Schnittstellen vertragen ohne Klagen auch den TTL-Pegel vom AVR. Allerdings müssen wir immer noch die Signale invertieren. Im einfachtesn Fall verwenden wir dazu jeweils einen einfachen NPN-Transistor und 2 Widerstände. Näheres dazu erfahrt ihr in den folgenden Übungen.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Streikt die Kommunikation per UART, so ist oft eine fehlerhafte Einstellung der Baudrate die Ursache. Die Konfiguration auf eine bestimmte Baudrate ist abhängig von der Taktfrequenz des Controllers. Gerade bei neu aufgebauten Schaltungen (bzw. neu gekauften Controllern) sollte man sich daher noch einmal vergewissern, dass der Controller auch tatsächlich mit der vermuteten Taktrate arbeitet und nicht z.&amp;amp;nbsp;B. den bei einigen Modellen werksseitig eingestellten internen [[Oszillator]] statt eines externen Quarzes nutzt. Die Werte der verschiedenen fuse-bits im Fehlerfall also beispielsweise mit &#039;&#039;[[AVRDUDE]]&#039;&#039; kontrollieren und falls nötig anpassen. Grundsätzlich empfiehlt sich auch immer ein Blick in die [[AVR_Checkliste]].&lt;br /&gt;
&lt;br /&gt;
Controller mit nur einem Quarzanschluss (z.B Atmega328), die den Timer2 im Asynchron Modus benutzen, müssen intern mit dem RC-Oszillator getaktet werden. Dieser sollte dann kalibriert werden:&lt;br /&gt;
[[AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR#Kalibrieren_des_internen_Oszillators_mit_Timer2_als_Zeitbasis|Kalibrieren des internen Oszillators mit Timer2 als Zeitbasis]]&lt;br /&gt;
&lt;br /&gt;
== Die UART-Register ==&lt;br /&gt;
&lt;br /&gt;
Der UART wird über vier separate Register angesprochen. Die USARTs der ATMEGAs verfügen über mehrere zusätzliche Konfigurationsregister. Das Datenblatt gibt darüber Auskunft. Die folgende Tabelle gibt nur die Register für die UARTs der ATmega8/16/32 u.ä. wieder.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;UCSRA&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;U&#039;&#039;&#039;ART &#039;&#039;&#039;C&#039;&#039;&#039;ontrol and &#039;&#039;&#039;S&#039;&#039;&#039;tatus &#039;&#039;&#039;R&#039;&#039;&#039;egister &#039;&#039;&#039;A&#039;&#039;&#039;.&amp;lt;br /&amp;gt;&lt;br /&gt;
Hier teilt uns der UART mit, was er gerade so macht.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
! Bit&lt;br /&gt;
| 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0&lt;br /&gt;
|- &lt;br /&gt;
! Name&lt;br /&gt;
| &#039;&#039;&#039;RXC&#039;&#039;&#039;|| &#039;&#039;&#039;TXC&#039;&#039;&#039;|| &#039;&#039;&#039;UDRE&#039;&#039;&#039;|| &#039;&#039;&#039;FE&#039;&#039;&#039;|| &#039;&#039;&#039;DOR&#039;&#039;&#039;|| &#039;&#039;&#039;PE&#039;&#039;&#039;|| &#039;&#039;&#039;U2X&#039;&#039;&#039;|| &#039;&#039;&#039;MPCM&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
! R/W&lt;br /&gt;
| R|| R/W|| R|| R|| R|| R|| R/W|| R/W&lt;br /&gt;
|- &lt;br /&gt;
! Initialwert&lt;br /&gt;
| 0|| 0|| 1|| 0|| 0|| 0|| 0|| 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RXC&#039;&#039;&#039; (UART Receive Complete)&lt;br /&gt;
:Dieses Bit wird vom AVR gesetzt, wenn ein empfangenes Zeichen vom Empfangs-Schieberegister in das Empfangs-Datenregister transferiert wurde.&lt;br /&gt;
:Das Zeichen muss nun schnellstmöglich aus dem Datenregister ausgelesen werden. Falls dies nicht erfolgt, bevor ein weiteres Zeichen komplett empfangen wurde, wird eine Überlauf-Fehlersituation eintreten. Mit dem Auslesen des Datenregisters wird das Bit automatisch gelöscht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TXC&#039;&#039;&#039; (UART Transmit Complete)&lt;br /&gt;
:Dieses Bit wird vom AVR gesetzt, wenn das im Sende-Schieberegister befindliche Zeichen vollständig ausgegeben wurde und kein weiteres Zeichen im Sendedatenregister ansteht. Dies bedeutet also, dass die Kommunikation vollumfänglich abgeschlossen ist.&lt;br /&gt;
:Dieses Bit ist wichtig bei Halbduplex-Verbindungen, wenn das Programm nach dem Senden von Daten auf Empfang schalten muss. Im Vollduplexbetrieb brauchen wir dieses Bit nicht zu beachten.&lt;br /&gt;
:Das Bit wird nur dann automatisch gelöscht, wenn der entsprechende Interrupthandler aufgerufen wird, ansonsten müssen wir das Bit selber löschen.&lt;br /&gt;
:Um das Bit zu löschen muss eine 1 an die entsprechende Position geschrieben werden!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UDRE&#039;&#039;&#039; (&#039;&#039;&#039;U&#039;&#039;&#039;ART &#039;&#039;&#039;D&#039;&#039;&#039;ata &#039;&#039;&#039;R&#039;&#039;&#039;egister &#039;&#039;&#039;E&#039;&#039;&#039;mpty)&lt;br /&gt;
:Dieses Bit zeigt an, ob der Sendepuffer bereit ist, um ein zu sendendes Zeichen aufzunehmen. Das Bit wird vom AVR gesetzt (1), wenn der Sendepuffer leer ist. Es wird gelöscht (0), wenn ein Zeichen im Sendedatenregister vorhanden ist und noch nicht in das Sende-Schieberegister übernommen wurde. Atmel empfiehlt aus Kompatibilitätsgründen mit kommenden µC, UDRE auf 0 zu setzen, wenn das UCSRA Register beschrieben wird.&lt;br /&gt;
:Das Bit wird automatisch gelöscht, wenn ein Zeichen in das Sendedatenregister geschrieben wird.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FE&#039;&#039;&#039; (&#039;&#039;&#039;F&#039;&#039;&#039;raming &#039;&#039;&#039;E&#039;&#039;&#039;rror)&lt;br /&gt;
:Dieses Bit wird vom AVR gesetzt, wenn der UART einen Zeichenrahmenfehler detektiert, d.h. wenn das Stopbit eines empfangenen Zeichens 0 ist.&lt;br /&gt;
:Das Bit wird automatisch gelöscht, wenn das Stopbit des empfangenen Zeichens 1 ist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DOR&#039;&#039;&#039; (&#039;&#039;&#039;D&#039;&#039;&#039;ata &#039;&#039;&#039;O&#039;&#039;&#039;ver &#039;&#039;&#039;R&#039;&#039;&#039;un)&lt;br /&gt;
:Dieses Bit wird vom AVR gesetzt, wenn unser Programm das im Empfangsdatenregister bereit liegende Zeichen nicht abholt bevor das nachfolgende Zeichen komplett empfangen wurde.&lt;br /&gt;
:Das nachfolgende Zeichen wird verworfen.&lt;br /&gt;
:Das Bit wird automatisch gelöscht, wenn das empfangene Zeichen in das Empfangsdatenregister transferiert werden konnte.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PE&#039;&#039;&#039; (&#039;&#039;&#039;P&#039;&#039;&#039;arity &#039;&#039;&#039;E&#039;&#039;&#039;rror&#039;&#039;&#039;)&lt;br /&gt;
:Dieses Bit wird vom AVR gesetzt, wenn das im Empfangsdatenregister bereit liegende Zeichen einen Paritätsfehler aufweist.&lt;br /&gt;
:Das Bit wird automatisch gelöscht, wenn das empfangene Zeichen in das Empfangsdatenregister transferiert werden konnte.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;U2X&#039;&#039;&#039; (Double the transmission speed)&lt;br /&gt;
:Dieses Bit wird lediglich im asynchronen Modus genutzt. Im synchronen Modus ist es 0 zu setzen. Wird das Bit gesetzt, so wird der Baudraten Divisor von 16 auf 8 reduziert, was einer Verdopplung der Transferrate gleich kommt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MPCM&#039;&#039;&#039; (&#039;&#039;&#039;M&#039;&#039;&#039;ulti &#039;&#039;&#039;P&#039;&#039;&#039;rozessor &#039;&#039;&#039;C&#039;&#039;&#039;ommunication &#039;&#039;&#039;M&#039;&#039;&#039;ode)&lt;br /&gt;
:Dieses Bit aktiviert die Multi-Prozessor-Kommunikation. Jeder eintreffende Frame der keine Adressinformation enthält wird dadurch ignoriert.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;UCSRB &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;U&#039;&#039;&#039;ART &#039;&#039;&#039;C&#039;&#039;&#039;ontrol and &#039;&#039;&#039;S&#039;&#039;&#039;tatus &#039;&#039;&#039;R&#039;&#039;&#039;egister &#039;&#039;&#039;B&#039;&#039;&#039;.&amp;lt;br /&amp;gt;&lt;br /&gt;
In diesem Register stellen wir ein, wie wir den UART verwenden möchten.&amp;lt;br /&amp;gt;&lt;br /&gt;
Das Register ist wie folgt aufgebaut:&lt;br /&gt;
&lt;br /&gt;
{|  class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
! Bit&lt;br /&gt;
| 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0&lt;br /&gt;
|- &lt;br /&gt;
! Name&lt;br /&gt;
| &#039;&#039;&#039;RXCIE&#039;&#039;&#039;|| &#039;&#039;&#039;TXCIE&#039;&#039;&#039;|| &#039;&#039;&#039;UDRIE&#039;&#039;&#039;|| &#039;&#039;&#039;RXEN&#039;&#039;&#039;|| &#039;&#039;&#039;TXEN&#039;&#039;&#039;|| &#039;&#039;&#039;UCSZ2&#039;&#039;&#039;|| &#039;&#039;&#039;RXB8&#039;&#039;&#039;|| &#039;&#039;&#039;TXB8&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
! R/W&lt;br /&gt;
| R/W|| R/W|| R/W|| R/W|| R/W|| R/W|| R|| R/W&lt;br /&gt;
|- &lt;br /&gt;
! Initialwert&lt;br /&gt;
| 0|| 0|| 0|| 0|| 0|| 0|| 0|| 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RXCIE&#039;&#039;&#039; (&#039;&#039;&#039;RX&#039;&#039;&#039; &#039;&#039;&#039;C&#039;&#039;&#039;omplete &#039;&#039;&#039;I&#039;&#039;&#039;nterrupt &#039;&#039;&#039;E&#039;&#039;&#039;nable)&lt;br /&gt;
:Wenn dieses Bit gesetzt ist, wird ein UART RX Complete Interrupt ausgelöst, wenn ein Zeichen vom UART empfangen wurde. Das Global Enable Interrupt Flag muss selbstverständlich auch gesetzt sein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TXCIE&#039;&#039;&#039; (&#039;&#039;&#039;TX&#039;&#039;&#039; &#039;&#039;&#039;C&#039;&#039;&#039;omplete &#039;&#039;&#039;I&#039;&#039;&#039;nterrupt &#039;&#039;&#039;E&#039;&#039;&#039;nable)&lt;br /&gt;
:Wenn dieses Bit gesetzt ist, wird ein UART TX Complete Interrupt ausgelöst, wenn ein Zeichen vom UART gesendet wurde. Das Global Enable Interrupt Flag muss selbstverständlich auch gesetzt sein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UDRIE&#039;&#039;&#039; (&#039;&#039;&#039;U&#039;&#039;&#039;ART &#039;&#039;&#039;D&#039;&#039;&#039;ata &#039;&#039;&#039;R&#039;&#039;&#039;egister &#039;&#039;&#039;E&#039;&#039;&#039;mpty &#039;&#039;&#039;I&#039;&#039;&#039;nterrupt &#039;&#039;&#039;E&#039;&#039;&#039;nable)&lt;br /&gt;
:Wenn dieses Bit gesetzt ist, wird ein UART Datenregister Leer Interrupt ausgelöst, wenn der UART wieder bereit ist um ein neues zu sendendes Zeichen zu übernehmen. Das Global Enable Interrupt Flag muss selbstverständlich auch gesetzt sein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RXEN&#039;&#039;&#039; (&#039;&#039;&#039;R&#039;&#039;&#039;eceiver &#039;&#039;&#039;E&#039;&#039;&#039;nable)&lt;br /&gt;
:Nur wenn dieses Bit gesetzt ist, arbeitet der Empfänger des UART überhaupt. Wenn das Bit nicht gesetzt ist, kann der entsprechende Pin des AVR als normaler I/O-Pin verwendet werden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TXEN&#039;&#039;&#039; (&#039;&#039;&#039;T&#039;&#039;&#039;ransmitter &#039;&#039;&#039;E&#039;&#039;&#039;nable)&lt;br /&gt;
:Nur wenn dieses Bit gesetzt ist, arbeitet der Sender des UART überhaupt. Wenn das Bit nicht gesetzt ist, kann der entsprechende Pin des AVR als normaler I/O-Pin verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UCSZ2&#039;&#039;&#039; (Characters Size)&lt;br /&gt;
:Dieses Bit setzt in Verbindung mit dem UCSZ1:0 Bits im UCSRC Register die Anzahl von Datenbits eines Frames beim Empfang oder Senden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RXB8&#039;&#039;&#039; (Receive Data Bit 8)&lt;br /&gt;
:Wenn das vorher erwähnte CHR9-Bit gesetzt ist, dann enthält dieses Bit das 9. Datenbit eines empfangenen Zeichens.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TXB8&#039;&#039;&#039; (Transmit Data Bit 8)&lt;br /&gt;
:Wenn das vorher erwähnte CHR9-Bit gesetzt ist, dann muss in dieses Bit das 9. Bit des zu sendenden Zeichens eingeschrieben werden bevor das eigentliche Datenbyte in das Datenregister geschrieben wird.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;UCSRC &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;U&#039;&#039;&#039;ART &#039;&#039;&#039;C&#039;&#039;&#039;ontrol and &#039;&#039;&#039;S&#039;&#039;&#039;tatus &#039;&#039;&#039;R&#039;&#039;&#039;egister &#039;&#039;&#039;C&#039;&#039;&#039;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|  class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
! Bit&lt;br /&gt;
| 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0&lt;br /&gt;
|- &lt;br /&gt;
! Name&lt;br /&gt;
| &#039;&#039;&#039;URSEL&#039;&#039;&#039;|| &#039;&#039;&#039;UMSEL&#039;&#039;&#039;|| &#039;&#039;&#039;UPM1&#039;&#039;&#039;|| &#039;&#039;&#039;UPM0&#039;&#039;&#039;|| &#039;&#039;&#039;USBS&#039;&#039;&#039;|| &#039;&#039;&#039;UCSZ1&#039;&#039;&#039;|| &#039;&#039;&#039;UCSZ0&#039;&#039;&#039;|| &#039;&#039;&#039;UCPOL&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
! R/W&lt;br /&gt;
| R/W|| R/W|| R/W|| R/W|| R/W|| R/W|| R/W|| R/W&lt;br /&gt;
|- &lt;br /&gt;
! Initialwert&lt;br /&gt;
| 1|| 0|| 0|| 0|| 0|| 1|| 1|| 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;URSEL&#039;&#039;&#039; (Register Select)&lt;br /&gt;
:Dieses Bit selektiert die Auswahl des UCSRC- bzw. des UBRRH Registers. Beim Lesen von UCSRC wird es als 1 gelesen. Beim Schreiben auf UCSRC muss es auf 1 gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
:Achtung: Manche Prozessoren verfügen über dieses Bit, andere wiederrum nicht. Was hat es damit auf sich?&amp;lt;br&amp;gt;Um Zugriffsadressen einzusparen, wurde von Atmel ein etwas seltsamer Weg gewählt. Das UCSRC Register und das High-Byte des Baudratenregisters teilen sich dieselbe Registeradresse! Um der Hardware mitzuteilen, welche Bedeutung ein zugewiesener Wert haben soll, entweder neue Belegung des Baudratenregisters oder eben Konfiguration des UCSRC Registers, dient dieses Bit. Ist es nicht gesetzt, dann wird eine Zuweisung immer als Zuweisung an das High-Byte des Baudratenregisters angesehen, selbst wenn das so nicht beabsichtigt war. Nur dann wenn dieses Bit gesetzt ist, dann wird eine Zuweisung auch tatsächlich als eine Zuweisung an das UCSRC Register gewertet und die Konfiguration verändert. Lässt man das Bit irrtümlich weg, dann verursacht eine Zuweisung an UCSRC eine Veränderung der Baudrateneinstellung!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UMSEL&#039;&#039;&#039; (USART Mode Select)&lt;br /&gt;
:Durch dieses Bit kann eine asynchrone oder synchrone Übertragung eingestellt werden. Durch Setzen des Bits wird eine synchrone Übertragung eingestellt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UPM1:0&#039;&#039;&#039; (Parity Mode)&lt;br /&gt;
{|  class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;UPM1&#039;&#039;&#039;|| &#039;&#039;&#039;UPM0&#039;&#039;&#039;|| &#039;&#039;&#039;Parity Mode&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
| 0|| 0|| Disabled&lt;br /&gt;
|- &lt;br /&gt;
| 0|| 1|| Reserved&lt;br /&gt;
|- &lt;br /&gt;
| 1|| 0|| Enabled, Even Priority&lt;br /&gt;
|- &lt;br /&gt;
| 1|| 1|| Enabled, OddPriority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;USBS&#039;&#039;&#039; (&#039;&#039;&#039;U&#039;&#039;&#039;SART &#039;&#039;&#039;S&#039;&#039;&#039;top &#039;&#039;&#039;B&#039;&#039;&#039;it &#039;&#039;&#039;S&#039;&#039;&#039;elect)&lt;br /&gt;
:Diese Bits setzen die Anzahl der zu sendenden Stopbits eines Frames. Beim Setzen werden 2 Stopbits übertragen, andernfalls nur 1 Stopbit.&lt;br /&gt;
{|  class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;USBS&#039;&#039;&#039;|| &#039;&#039;&#039;Anzahl der Stop Bits&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
|  0|| 1&lt;br /&gt;
|- &lt;br /&gt;
|  1|| 2&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UCSZ1:0&#039;&#039;&#039; (Character Size)&lt;br /&gt;
:Diese Bits setzen in Verbindung mit UCSZ2 aus dem UCSRB Register die Anzahl der Datenbits eines Frames.&lt;br /&gt;
:Diese Bits setzen den entsprechenden Paritätsmodus.&lt;br /&gt;
{|  class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;UCSZ2&#039;&#039;&#039;|| &#039;&#039;&#039;UCSZ1&#039;&#039;&#039;|| &#039;&#039;&#039;UCSZ0&#039;&#039;&#039;|| &#039;&#039;&#039;Character Size&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
| 0|| 0|| 0|| 5-Bit&lt;br /&gt;
|- &lt;br /&gt;
| 0|| 0|| 1|| 6-Bit&lt;br /&gt;
|- &lt;br /&gt;
| 0|| 1|| 0|| 7-Bit&lt;br /&gt;
|- &lt;br /&gt;
| 0|| 1|| 1|| 8-Bit&lt;br /&gt;
|- &lt;br /&gt;
| 1|| 0|| 0|| Reserved&lt;br /&gt;
|- &lt;br /&gt;
| 1|| 0|| 1|| Reserved&lt;br /&gt;
|- &lt;br /&gt;
| 1|| 1|| 0|| Reserved&lt;br /&gt;
|- &lt;br /&gt;
| 1|| 1|| 1|| 9-Bit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UCPOL&#039;&#039;&#039; (Clock Polarity)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;UDR&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;U&#039;&#039;&#039;ART &#039;&#039;&#039;D&#039;&#039;&#039;ata &#039;&#039;&#039;R&#039;&#039;&#039;egister.&amp;lt;br /&amp;gt;&lt;br /&gt;
Hier werden Daten zwischen UART und CPU übertragen. Da der UART im&lt;br /&gt;
Vollduplexbetrieb gleichzeitig empfangen und senden kann, handelt es sich&lt;br /&gt;
hier physikalisch um 2 Register, die aber über die gleiche I/O-Adresse&lt;br /&gt;
angesprochen werden. Je nachdem, ob ein Lese- oder ein Schreibzugriff auf&lt;br /&gt;
den UART erfolgt wird automatisch das richtige UDR angesprochen.&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;UBRR&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;U&#039;&#039;&#039;ART &#039;&#039;&#039;B&#039;&#039;&#039;aud &#039;&#039;&#039;R&#039;&#039;&#039;ate &#039;&#039;&#039;R&#039;&#039;&#039;egister.&amp;lt;br /&amp;gt;&lt;br /&gt;
In diesem Register müssen wir dem UART mitteilen, wie schnell wir gerne kommunizieren möchten. Der Wert, der in dieses Register geschrieben werden muss, errechnet sich nach folgender Formel (wenn U2X Bit 0 gesetzt ist):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\mathrm{UBRR} = \frac{\mathrm{Taktfrequenz}}{\mathrm{Baudrate} \cdot 16} - 1&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es sind Baudraten bis über 115200 Baud möglich, je nach Controller und CPU-Frequenz. Siehe Datenblatt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== UART initialisieren ==&lt;br /&gt;
&lt;br /&gt;
Wir wollen nun Daten mit dem UART auf die serielle Schnittstelle ausgeben. Dazu müssen wir den UART zuerst mal initialisieren. Dazu setzen wir je nach gewünschter Funktionsweise die benötigten Bits im &#039;&#039;&#039;U&#039;&#039;&#039;ART &#039;&#039;&#039;C&#039;&#039;&#039;ontrol &#039;&#039;&#039;R&#039;&#039;&#039;egister.&lt;br /&gt;
&lt;br /&gt;
Da wir vorerst nur senden möchten und noch keine Interrupts auswerten wollen, gestaltet sich die Initialisierung wirklich sehr einfach, da wir lediglich das &#039;&#039;&#039;Transmitter Enable&#039;&#039;&#039; Bit setzen müssen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  UCSRB |= (1&amp;lt;&amp;lt;TXEN);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neuere AVRs mit USART haben mehrere Konfigurationsregister und erfordern eine etwas andere Konfiguration. Für einen ATmega16 z.&amp;amp;nbsp;B.:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  UCSRB |= (1&amp;lt;&amp;lt;TXEN);                           // UART TX einschalten&lt;br /&gt;
  UCSRC = (1&amp;lt;&amp;lt;URSEL)|(1 &amp;lt;&amp;lt; UCSZ1)|(1 &amp;lt;&amp;lt; UCSZ0); // Asynchron 8N1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun ist noch das Baudratenregister &#039;&#039;&#039;UBRR&#039;&#039;&#039; der verwendeten UARTs einzustellen, bzw. bei neueren AVRs die beiden Register &#039;&#039;&#039;UBRRL&#039;&#039;&#039; und &#039;&#039;&#039;UBRRH&#039;&#039;&#039;. &amp;lt;!--Der Wert dafür ergibt sich aus der unten angegebenen Formel durch Einsetzen der Taktfrequenz und der gewünschten Übertragungsrate. Das Berechnen der Formel wird dem [[C-Präprozessor|Präprozessor]] überlassen. Dabei ist zu beachten, dass der Präprozessor keine Floating Point Ergebnisse liefert, sondern Integer Ergebnisse. Das bedeutet, dass wenn durch Division auf einen Integer Wert 1.99 zugewiesen wird, 0.99 abgeschnitten werden und das Ergebnis 1.0 ist - obwohl 2.0 viel näher wäre.--&amp;gt;. Die Berechnung wird während des Compilerlaufs ausgeführt, beansprucht also in der gezeigten Form weder Speicher noch Rechenzeit des Controllers. Das Ergebniss wird jedoch als ganzzahliger Wert eingesetzt, d.h. Nachkommastellen werden einfach abgeschnitten und es erfolgt keine Rundung. Aus diesem Grund kann man sich eines kleinen Tricks bedienen, indem vor der eigentlichen Division bei der Zuweisung die Hälfte des Wertes dazu addiert wird. Allgemein formuliert bedeutet das: &amp;lt;code&amp;gt;int i = ( a + b/2 ) / b;&amp;lt;/code&amp;gt;. Dies wird in der unten angegebenen Berechnung von UBRR_VAL ausgenutzt um den Fehler zu minimieren. (Eine ausführliche Erklärung zum &#039;&#039;cleveren Runden&#039;&#039; findet sich in einer [http://www.mikrocontroller.net/topic/170617#1631916 Forumsdiskussion].) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/* &lt;br /&gt;
  UART-Init: &lt;br /&gt;
Berechnung des Wertes für das Baudratenregister &lt;br /&gt;
aus Taktrate und gewünschter Baudrate&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
/* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann&lt;br /&gt;
   F_CPU im Makefile definiert werden, eine nochmalige Definition&lt;br /&gt;
   hier wuerde zu einer Compilerwarnung fuehren. Daher &amp;quot;Schutz&amp;quot; durch&lt;br /&gt;
   #ifndef/#endif &lt;br /&gt;
&lt;br /&gt;
   Dieser &amp;quot;Schutz&amp;quot; kann zu Debugsessions führen, wenn AVRStudio &lt;br /&gt;
   verwendet wird und dort eine andere, nicht zur Hardware passende &lt;br /&gt;
   Taktrate eingestellt ist: Dann wird die folgende Definition &lt;br /&gt;
   nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?) &lt;br /&gt;
   von AVRStudio - daher Ausgabe einer Warnung falls F_CPU&lt;br /&gt;
   noch nicht definiert: */&lt;br /&gt;
#warning &amp;quot;F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000&amp;quot;&lt;br /&gt;
#define F_CPU 4000000UL  // Systemtakt in Hz - Definition als unsigned long beachten &lt;br /&gt;
                         // Ohne ergeben sich unten Fehler in der Berechnung&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#define BAUD 9600UL      // Baudrate&lt;br /&gt;
&lt;br /&gt;
// Berechnungen&lt;br /&gt;
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden&lt;br /&gt;
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate&lt;br /&gt;
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.&lt;br /&gt;
&lt;br /&gt;
#if ((BAUD_ERROR&amp;lt;990) || (BAUD_ERROR&amp;gt;1010))&lt;br /&gt;
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! &lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Makros sind sehr praktisch, da damit sowohl automatisch der Wert für UBRR, als auch die Abweichung in der generierten (möglichen) von der gewünschten Baudrate berechnet wird. Im Falle einer zu hohen Abweichung (+/-1%) wird eine Fehlermeldung ausgegeben und der Compilerablauf abgebrochen. Damit können viele Probleme mit &amp;quot;UART sendet komische Zeichen&amp;quot; vermieden werden. Ausserdem kann man mühelos die Einstellung an eine neue Taktfrequenz bzw. Baudrate anpassen, ohne selber rechnen oder in Tabellen nachschlagen zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Initialisierung der UART Register kann im Hauptprogramm main() vorgenommen werden. Öfters wird jedoch eine Funktion z.&amp;amp;nbsp;B. uart_init() dafür geschrieben, die in der eigenen Codesammlung in mehreren Projekten verwendet werden kann.&lt;br /&gt;
&lt;br /&gt;
Für einige AVR (z.&amp;amp;nbsp;B. ATmega169, ATmega48/88/168, AT90CAN jedoch nicht für z.&amp;amp;nbsp;B. ATmega16/32, ATmega128, ATtiny2313) wird durch die Registerdefinitionen der avr-libc (io*.h) auch für Controller mit zwei UBRR-Registern (UBRRL/UBRRH) ein UBRR bzw. UBRR0 als &amp;quot;16-bit-Register&amp;quot; definiert und man kann den Wert direkt per UBRR = UBRR_VAL zuweisen. Intern werden dann zwei Zuweisungen für UBRRH und UBRRL generiert. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/* UART-Init Bsp. ATmega48 */&lt;br /&gt;
&lt;br /&gt;
void uart_init(void)&lt;br /&gt;
{&lt;br /&gt;
  UBRR0 = UBRR_VAL;&lt;br /&gt;
  UCSR0B |= (1&amp;lt;&amp;lt;TXEN0);&lt;br /&gt;
  // Frame Format: Asynchron 8N1&lt;br /&gt;
  UCSR0C = (1&amp;lt;&amp;lt;UCSZ01)|(1&amp;lt;&amp;lt;UCSZ00);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die einzelne Anweisung ist nicht bei allen Controllern möglich, da die beiden Register nicht bei allen aufeinanderfolgende Addressen aufweisen. Die getrennte Zuweisung an UBRRH und UBRRL wie im nächsten Beispiel gezeigt, ist universeller und portabler und daher vorzuziehen. Wichtig ist, dass UBRRH &#039;&#039;&#039;vor&#039;&#039;&#039; UBRRL geschrieben wird:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/* UART-Init Bsp. ATmega16 */&lt;br /&gt;
&lt;br /&gt;
void uart_init(void)&lt;br /&gt;
{&lt;br /&gt;
  UBRRH = UBRR_VAL &amp;gt;&amp;gt; 8;&lt;br /&gt;
  UBRRL = UBRR_VAL &amp;amp; 0xFF;&lt;br /&gt;
&lt;br /&gt;
  UCSRB |= (1&amp;lt;&amp;lt;TXEN);  // UART TX einschalten&lt;br /&gt;
  UCSRC = (1&amp;lt;&amp;lt;URSEL)|(1&amp;lt;&amp;lt;UCSZ1)|(1&amp;lt;&amp;lt;UCSZ0);  // Asynchron 8N1 &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inzwischen gibt es in der avr-libc Makros für obige Berechnung der UBRR Registerwerte aus Taktrate F_CPU und Baudrate BAUD. Dazu wird die Includedatei  [http://www.nongnu.org/avr-libc/user-manual/group__util__setbaud.html &amp;lt;util/setbaud.h&amp;gt;] eingebunden, nachdem F_CPU und die gewünschte Baudrate definiert wurden. Einige Beispiele zur Anwendung finden sich in der Dokumentation der avr-libc. Im Quellcode kann dann analog zur oben gezeigten Vorgehensweise einfach das Makro UBRR_VALUE (bzw. UBRRH_VALUE und UBRRL_VALUE) an der entsprechenden Stelle eingesetzt werden. Es wird auch automatisch ermittelt, ob der U2X-Modus (vgl. Datenblatt) zu geringeren Abweichungen führt und dann dem Makro USE_U2X ein Wert ungleich null zugewiesen. Ein Beispiel (angelehnt an die avr-libc-Dokumentation):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt; &lt;br /&gt;
#define F_CPU 1000000 /* evtl. bereits via Compilerparameter definiert */&lt;br /&gt;
#define BAUD 9600&lt;br /&gt;
#include &amp;lt;util/setbaud.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void uart_init(void)   &lt;br /&gt;
{&lt;br /&gt;
   UBRRH = UBRRH_VALUE;&lt;br /&gt;
   UBRRL = UBRRL_VALUE;&lt;br /&gt;
   /* evtl. verkuerzt falls Register aufeinanderfolgen (vgl. Datenblatt)&lt;br /&gt;
      UBRR = UBRR_VALUE;&lt;br /&gt;
   */&lt;br /&gt;
#if USE_2X&lt;br /&gt;
   /* U2X-Modus erforderlich */&lt;br /&gt;
   UCSRA |= (1 &amp;lt;&amp;lt; U2X);&lt;br /&gt;
#else&lt;br /&gt;
   /* U2X-Modus nicht erforderlich */&lt;br /&gt;
   UCSRA &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
   // hier weitere Initialisierungen (TX und/oder RX aktivieren, Modus setzen &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* [http://www.nongnu.org/avr-libc/user-manual/group__util__setbaud.html Dokumentation der avr-libc zu &amp;lt;util/setbaud.h&amp;gt;]&lt;br /&gt;
* [http://www.wormfood.net/avrbaudcalc.php WormFood&#039;s AVR Baud Rate Calculator] online.&lt;br /&gt;
* [http://www.gjlay.de/helferlein/avr-uart-rechner.html AVR Baudraten-Rechner] in JavaScript&lt;br /&gt;
&lt;br /&gt;
== Senden mit dem UART ==&lt;br /&gt;
&lt;br /&gt;
=== Senden einzelner Zeichen ===&lt;br /&gt;
&lt;br /&gt;
Um nun ein Zeichen auf die Schnittstelle auszugeben, müssen wir dasselbe&lt;br /&gt;
lediglich in das &#039;&#039;&#039;U&#039;&#039;&#039;ART &#039;&#039;&#039;D&#039;&#039;&#039;ata &#039;&#039;&#039;R&#039;&#039;&#039;egister schreiben. Vorher ist zu prüfen, ob das UART-Modul bereit ist, das zu sendende Zeichen entgegenzunehmen. Die Bezeichnungen des/der Statusregisters mit dem Bit UDRE ist abhängig vom Controllertypen (vgl. Datenblatt).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// bei neueren AVRs steht der Status in UCSRA/UCSR0A/UCSR1A, hier z.B. fuer ATmega16:&lt;br /&gt;
    while (!(UCSRA &amp;amp; (1&amp;lt;&amp;lt;UDRE)))  /* warten bis Senden moeglich                   */&lt;br /&gt;
    {&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    UDR = &#039;x&#039;;                    /* schreibt das Zeichen x auf die Schnittstelle */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Schreiben einer Zeichenkette (String) ===&lt;br /&gt;
&lt;br /&gt;
Die Aufgabe &amp;quot;String senden&amp;quot; wird durch zwei Funktionen abgearbeitet. Die universelle/controllerunabhängige Funktion uart_puts übergibt jeweils ein Zeichen der Zeichenkette an eine Funktion uart_putc, die abhängig von der vorhandenen Hardware implementiert werden muss. In der Funktion zum Senden eines Zeichens ist darauf zu achten, dass vor dem Senden geprüft wird, ob der UART bereit ist den &amp;quot;Sendeauftrag&amp;quot; entgegenzunehmen. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/* ATmega16 */&lt;br /&gt;
int uart_putc(unsigned char c)&lt;br /&gt;
{&lt;br /&gt;
    while (!(UCSRA &amp;amp; (1&amp;lt;&amp;lt;UDRE)))  /* warten bis Senden moeglich */&lt;br /&gt;
    {&lt;br /&gt;
    }                             &lt;br /&gt;
&lt;br /&gt;
    UDR = c;                      /* sende Zeichen */&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* puts ist unabhaengig vom Controllertyp */&lt;br /&gt;
void uart_puts (char *s)&lt;br /&gt;
{&lt;br /&gt;
    while (*s)&lt;br /&gt;
    {   /* so lange *s != &#039;\0&#039; also ungleich dem &amp;quot;String-Endezeichen(Terminator)&amp;quot; */&lt;br /&gt;
        uart_putc(*s);&lt;br /&gt;
        s++;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die in uart_putc verwendeten Schleifen, in denen gewartet wird bis die UART-Hardware zum senden bereit ist, sind insofern etwas kritisch, da während des Sendens eines Strings nicht mehr auf andere Ereignisse reagiert werden kann. Universeller ist die Nutzung von FIFO(first-in first-out)-Puffern, in denen die zu sendenden bzw. empfangenen Zeichen/Bytes zwischengespeichert und in Interruptroutinen an die U(S)ART-Hardware weitergegeben bzw. von ihr ausgelesen werden. Dazu existieren fertige Komponenten (Bibliotheken, Libraries), die man recht einfach in eigene Entwicklungen integrieren kann. Es empfiehlt sich, diese Komponenten zu nutzen und das Rad nicht neu zu erfinden.&lt;br /&gt;
&lt;br /&gt;
=== Schreiben von Variableninhalten ===&lt;br /&gt;
&lt;br /&gt;
Sollen Inhalte von Variablen (Ganzzahlen, Gleitkomma) in &amp;quot;menschenlesbarer&amp;quot; Form gesendet werden, ist vor dem Transfer eine Umwandlung in Zeichen (&amp;quot;ASCII&amp;quot;) erforderlich. Bei nur einer Ziffer ist diese Umwandlung relativ einfach: man addiert den ASCII-Wert von Null zur Ziffer und kann diesen Wert direkt senden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
// hier uart_putc (s.o.)&lt;br /&gt;
&lt;br /&gt;
int main (void) &lt;br /&gt;
{&lt;br /&gt;
   // Ausgabe von 0123456789&lt;br /&gt;
   char c;&lt;br /&gt;
&lt;br /&gt;
   uart_init();&lt;br /&gt;
&lt;br /&gt;
   for (uint8_t i=0; i&amp;lt;=9; ++i) {&lt;br /&gt;
      c = i + &#039;0&#039;;&lt;br /&gt;
      uart_putc( c );&lt;br /&gt;
      // verkuerzt: uart_putc( i + &#039;0&#039; );&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   while (1) {&lt;br /&gt;
      ;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   return 0; // never reached &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Soll mehr als eine Ziffer ausgegeben werden, bedient man sich zweckmäßigerweise vorhandener Funktionen zur Umwandlung von Zahlen in Zeichenketten/Strings. Die Funktion der avr-libc zur Umwandlung von vorzeichenbehafteten 16bit-Ganzzahlen (int16_t) in Zeichenketten heißt &#039;&#039;itoa&#039;&#039; (Integer to ASCII). Man muss der Funktion einen Speicherbereich zur Verarbeitung (buffer) mit Platz für alle Ziffern, das String-Endezeichen (&#039;\0&#039;) und evtl. das Vorzeichen bereitstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
// hier uart_init, uart_putc, uart_puts (s.o.)&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
   char s[7];&lt;br /&gt;
   int16_t i = -12345;&lt;br /&gt;
   &lt;br /&gt;
   uart_init();&lt;br /&gt;
&lt;br /&gt;
   itoa( i, s, 10 ); // 10 fuer radix -&amp;gt; Dezimalsystem&lt;br /&gt;
   uart_puts( s );&lt;br /&gt;
&lt;br /&gt;
   // da itoa einen Zeiger auf den Beginn von s zurueckgibt verkuerzt auch:&lt;br /&gt;
   uart_puts( itoa( i, s, 10 ) );&lt;br /&gt;
&lt;br /&gt;
   while (1) {&lt;br /&gt;
      ;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   return 0; // never reached &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für vorzeichenlose 16bit-Ganzzahlen (uint16_t) exisitert &#039;&#039;utoa&#039;&#039;. Die Funktionen für 32bit-Ganzzahlen (int32_t und uint32_t) heißen &#039;&#039;ltoa&#039;&#039; bzw. &#039;&#039;ultoa&#039;&#039;. Da 32bit-Ganzzahlen mehr Stellen aufweisen können, ist ein entsprechend größerer Pufferspeicher vorzusehen.&lt;br /&gt;
&lt;br /&gt;
Auch Gleitkommazahlen (float/double) können mit bereits vorhandenen Funktionen in Zeichenfolgen umgewandelt werden, dazu existieren die Funktionen &#039;&#039;dtostre&#039;&#039; und &#039;&#039;dtostrf&#039;&#039;. dtostre nutzt Exponentialschreibweise (&amp;quot;engineering&amp;quot;-Format). (Hinweis: z.Zt. existiert im avr-gcc kein &amp;quot;echtes&amp;quot; double, intern wird immer mit &amp;quot;einfacher Genauigkeit&amp;quot;, entsprechend float, gerechnet.) &lt;br /&gt;
&lt;br /&gt;
dtostrf und dtostre benötigen die libm.a der avr-libc. Bei Nutzung von Makefiles ist der Parameter -lm in in LDFLAGS anzugeben (Standard in den WinAVR/mfile-Makefilevorlagen). Nutzt man AVRStudio als IDE für den GNU-Compiler (gcc-Plugin) ist die libm.a unter Libaries auszuwählen: Project -&amp;gt; Configurations Options -&amp;gt; Libaries -&amp;gt; libm.a mit dem Pfeil nach rechts einbinden. Siehe auch die [[FAQ#Aktivieren_der_Floating_Point_Version_von_sprintf_beim_WinAVR_mit_AVR-Studio|FAQ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
// hier uart_init, uart_putc, uart_puts (s.o.)&lt;br /&gt;
&lt;br /&gt;
/* lt. avr-libc Dokumentation:&lt;br /&gt;
char* dtostrf(&lt;br /&gt;
  double __val,&lt;br /&gt;
  char   __width,&lt;br /&gt;
  char   __prec,&lt;br /&gt;
  char * __s&lt;br /&gt;
)  &lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
   // Pufferspeicher ausreichend groß&lt;br /&gt;
   // evtl. Vorzeichen + width + Endezeichen:&lt;br /&gt;
   char s[8]; &lt;br /&gt;
   float f = -12.345;&lt;br /&gt;
   &lt;br /&gt;
   uart_init();&lt;br /&gt;
&lt;br /&gt;
   dtostrf( f, 6, 3, s ); &lt;br /&gt;
   uart_puts( s );&lt;br /&gt;
   // verkürzt: uart_puts( dtostrf( f, 7, 3, s ) );&lt;br /&gt;
&lt;br /&gt;
   while (1) {&lt;br /&gt;
      ;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   return 0; // never reached &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Empfangen ==&lt;br /&gt;
=== Einzelne Zeichen empfangen ===&lt;br /&gt;
&lt;br /&gt;
Zum Empfang von Zeichen muss der Empfangsteil des UART bei der Initialisierung aktiviert werden, indem das RXEN-Bit im jeweiligen Konfigurationsregister (UCSRB bzw UCSR0B/UCSR1B) gesetzt wird. Im einfachsten Fall wird solange gewartet, bis ein Zeichen empfangen wurde, dieses steht dann im UART-Datenregister (UDR bzw. UDR0 und UDR1 bei AVRs mit 2 UARTS) zur Verfügung (sogen. &amp;quot;Polling-Betrieb&amp;quot;). Ein Beispiel für den ATmega16:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;inttypes.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* Siehe auch obere Baudrateneinstellung */&lt;br /&gt;
/* USART-Init beim ATmega16 */&lt;br /&gt;
&lt;br /&gt;
void uart_init(void)&lt;br /&gt;
{&lt;br /&gt;
    UBRRH = UBRR_VAL &amp;gt;&amp;gt; 8;&lt;br /&gt;
    UBRRL = UBRR_VAL &amp;amp; 0xFF;&lt;br /&gt;
&lt;br /&gt;
    UCSRC = (1&amp;lt;&amp;lt;URSEL)|(1&amp;lt;&amp;lt;UCSZ1)|(1&amp;lt;&amp;lt;UCSZ0);  // Asynchron 8N1 &lt;br /&gt;
    UCSRB |= (1&amp;lt;&amp;lt;RXEN);                        // UART RX einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Zeichen empfangen */&lt;br /&gt;
uint8_t uart_getc(void)&lt;br /&gt;
{&lt;br /&gt;
    while (!(UCSRA &amp;amp; (1&amp;lt;&amp;lt;RXC)))   // warten bis Zeichen verfuegbar&lt;br /&gt;
        ;&lt;br /&gt;
    return UDR;                   // Zeichen aus UDR an Aufrufer zurueckgeben&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und die Anwendung in einem Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// hier Makro für die Baudratenberechnung &lt;br /&gt;
&lt;br /&gt;
// hier uart_init, uart_getc (s.o.)&lt;br /&gt;
 &lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  uart_init();&lt;br /&gt;
  while (1) &lt;br /&gt;
  {&lt;br /&gt;
    uint8_t c;&lt;br /&gt;
    c = uart_getc();&lt;br /&gt;
&lt;br /&gt;
    // hier etwas mit c machen z.B. auf PORT ausgeben&lt;br /&gt;
    DDRC = 0xFF; // PORTC Ausgang&lt;br /&gt;
    PORTC = c;&lt;br /&gt;
  }&lt;br /&gt;
  return 0; // never reached &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion uart_getc() blockiert allerdings den Programmablauf, denn es wird gewartet, bis ein Zeichen empfangen wird! Möchte man das Warten vermeiden, kann das RXC-Bit in einer Programmschleife abgefragt werden und dann nur bei gesetztem RXC-Bit UDR ausgelesen werden. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// hier Makro für die Baudratenberechnung &lt;br /&gt;
&lt;br /&gt;
// hier uart_init, uart_getc (s.o.)&lt;br /&gt;
 &lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  uart_init();&lt;br /&gt;
  while (1) &lt;br /&gt;
  {&lt;br /&gt;
    if ( (UCSRA &amp;amp; (1&amp;lt;&amp;lt;RXC)) )&lt;br /&gt;
    {&lt;br /&gt;
      // Zeichen wurde empfangen, jetzt abholen&lt;br /&gt;
      uint8_t c;&lt;br /&gt;
      c = uart_getc();&lt;br /&gt;
      // hier etwas mit c machen z.B. auf PORT ausgeben&lt;br /&gt;
      DDRC = 0xFF; // PORTC Ausgang&lt;br /&gt;
      PORTC = c;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      // Kein Zeichen empfangen, Restprogramm ausführen...&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return 0; // never reached &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eleganter und in den meisten Anwendungsfällen &amp;quot;stabiler&amp;quot; ist die Vorgehensweise, die empfangenen Zeichen in einer Interrupt-Routine einzulesen und zur späteren Verarbeitung in einem Eingangsbuffer (FIFO-Buffer) zwischenzuspeichern. Dazu existieren fertige und gut getestete [[Libraries|Bibliotheken]] &amp;lt;!-- &amp;quot;echte Libraries&amp;quot; (.a) wie im Verweis beschrieben sind hier eigentlich nicht gemeint, verwirrt hier etwas, da AVR-&amp;quot;Libraries&amp;quot; meist per #defines anpassbare Source-Codes sind, vielleicht so: --&amp;gt; und Quellcodekomponenten (z.&amp;amp;nbsp;B. UART-Library von P. Fleury, procyon-avrlib und einige in der &amp;quot;Academy&amp;quot; von avrfreaks.net).&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* [http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html Dokumenation der avr-libc/stdlib.h]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Die_Nutzung_von_sprintf_und_printf Die Nutzung von sprintf und printf]&lt;br /&gt;
* [http://homepage.hispeed.ch/peterfleury/ Peter Fleurys] UART-Bibiliothek fuer avr-gcc/avr-libc&lt;br /&gt;
&amp;lt;!-- nimmermehr: * siehe auch: Weiterführende Informationen inkl. Beispielen für die Nutzung von stdio-Funktionen (printf etc.) im [[AVR-Tutorial:_UART]]. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TODO: 9bit&lt;br /&gt;
&lt;br /&gt;
=== Empfang von Zeichenketten (Strings) ===&lt;br /&gt;
&lt;br /&gt;
Beim Empfang von Zeichenketten, muß man sich zunächst darüber im klaren sein, daß es ein Kriterium geben muß, an dem der µC erkennen kann, wann ein Text zu Ende ist. Sehr oft wird dazu das Zeichen &#039;Return&#039; benutzt, um das Ende eines Textes zu markieren. Dies ist vom Benutzer einfach eingebbar und er ist auch daran gewöhnt, daß er eine Eingabezeile mit einem Druck auf die Return Taste abgeschlossen wird.&lt;br /&gt;
&lt;br /&gt;
Prinzipiell gibt es jedoch keine Einschränkung bezüglich dieses speziellen Zeichens. Es muß nur sichergestellt werden, daß dieses spezielle &#039;Ende eines Strings&#039; - Zeichen nicht mit einem im Text vorkommenden Zeichen verwechselt werden kann. Wenn also im zu übertragenden Text beispielsweise kein &#039;;&#039; vorkommt, dann spricht nichts dagegen, den Benutzer die Eingabe eines Textes mit einem &#039;;&#039; abschließen zu lassen.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird die durchaus übliche Annahme getroffen, daß eine Stringübertragung identisch ist mit der Übertragung einer Textzeile und daher mit einem Return (&#039;\n&#039;) abgeschlossen wird.&lt;br /&gt;
&lt;br /&gt;
Das Problem der Übertragung eines Strings reduziert sich damit auf die Aufgabenstellung: Empfange und sammle Zeichen in einem char Array, bis entweder das Array voll ist oder das Text Ende Zeichen&#039; empfangen wurde. Danach wird der empfangene Text noch mit einem &#039;\0&#039; Zeichen abgeschlossen um einen Standard C-String daraus zu machen, mit dem dann weiter gearbeitet werden kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/* Zeichen empfangen */&lt;br /&gt;
uint8_t uart_getc(void)&lt;br /&gt;
{&lt;br /&gt;
    while (!(UCSRA &amp;amp; (1&amp;lt;&amp;lt;RXC)))   // warten bis Zeichen verfuegbar&lt;br /&gt;
        ;&lt;br /&gt;
    return UDR;                   // Zeichen aus UDR an Aufrufer zurueckgeben&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_gets( char* Buffer, uint8_t MaxLen )&lt;br /&gt;
{&lt;br /&gt;
  uint8_t NextChar;&lt;br /&gt;
  uint8_t StringLen = 0;&lt;br /&gt;
&lt;br /&gt;
  NextChar = uart_getc();         // Warte auf und empfange das nächste Zeichen&lt;br /&gt;
&lt;br /&gt;
                                  // Sammle solange Zeichen, bis:&lt;br /&gt;
                                  // * entweder das String Ende Zeichen kam&lt;br /&gt;
                                  // * oder das aufnehmende Array voll ist&lt;br /&gt;
  while( NextChar != &#039;\n&#039; &amp;amp;&amp;amp; StringLen &amp;lt; MaxLen - 1 ) {&lt;br /&gt;
    *Buffer++ = NextChar;&lt;br /&gt;
    StringLen++;&lt;br /&gt;
    NextChar = uart_getc();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
                                  // Noch ein &#039;\0&#039; anhängen um einen Standard&lt;br /&gt;
                                  // C-String daraus zu machen&lt;br /&gt;
  *Buffer = &#039;\0&#039;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim Aufruf ist darauf zu achten, dass das empfangende Array auch mit einer&lt;br /&gt;
vernünftigen Größe definiert wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  char Line[40];      // String mit maximal 39 zeichen&lt;br /&gt;
&lt;br /&gt;
  uart_gets( Line, sizeof( Line ) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei der Benutzung von sizeof() ist allerdings zu beachten, dass sizeof() nicht die Anzahl der Elemente des Arrays liefert, sondern die Länge in Byte. Da ein char nur ein Byte lang ist, passt der Aufruf &#039;uart_gets(Line, sizeof( Line ) );&#039; in diesem Fall. Falls man - aus welchen Gründen auch immer - andere Datentypen benutzen möchte, sollte man zur korrekten Angabe der Array-Länge folgende Vorgehensweise bevorzugen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  int Line[40];      // Array vom Typ int&lt;br /&gt;
&lt;br /&gt;
  uart_gets( Line, sizeof( Line ) / sizeof( Line[0] ) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Interruptbetrieb==&lt;br /&gt;
&lt;br /&gt;
Hier wird das Grundwissen des Artikels [[Interrupt]] und des Abschnitts [[AVR-GCC-Tutorial#Programmieren_mit_Interrupts|AVR-GCC-Tutorial: Programmieren_mit_Interrupts]] vorausgesetzt.&lt;br /&gt;
&lt;br /&gt;
=== Empfangen (RX) ===&lt;br /&gt;
&lt;br /&gt;
Beim ATmega8 muss das &#039;&#039;&#039;RXCIE&#039;&#039;&#039; Bit im Register UCSRB gesetzt werden, damit ein Interrupt beim Empfang eines Zeichens ausgelöst werden kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/* siehe auch obere Baudrateneinstellung */&lt;br /&gt;
/* USART-Init beim ATmega16 */&lt;br /&gt;
void uart_init(void)&lt;br /&gt;
{&lt;br /&gt;
  UBRRH = UBRR_VAL &amp;gt;&amp;gt; 8;&lt;br /&gt;
  UBRRL = UBRR_VAL &amp;amp; 0xFF;&lt;br /&gt;
  UCSRC = (1&amp;lt;&amp;lt;URSEL)|(1&amp;lt;&amp;lt;UCSZ1)|(1&amp;lt;&amp;lt;UCSZ0); // Asynchron 8N1 &lt;br /&gt;
  UCSRB |= (1&amp;lt;&amp;lt;RXEN)|(1&amp;lt;&amp;lt;TXEN)|(1&amp;lt;&amp;lt;RXCIE);  // UART RX, TX und RX Interrupt einschalten&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Natürlich muss &amp;quot;Global Interrupt Enable&amp;quot; mittels des Befehls sei() aktiviert sein. Interrupt-spezifische Definitionen werden über die Includedatei eingebunden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Interrupt wird immer ausgelöst, wenn ein Zeichen erfolgreich empfangen wurde. Zusätzlich braucht man die Interruptserviceroutine (ISR). &lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel enthält die ISR einen FIFO-Puffer (First in, First out). Dafür werden ein paar globale Variablen und Makros benötigt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define UART_MAXSTRLEN 10&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t uart_str_complete = 0;     // 1 .. String komplett empfangen&lt;br /&gt;
volatile uint8_t uart_str_count = 0;&lt;br /&gt;
volatile char uart_string[UART_MAXSTRLEN + 1] = &amp;quot;&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(USART_RXC_vect)&lt;br /&gt;
{&lt;br /&gt;
  unsigned char nextChar;&lt;br /&gt;
&lt;br /&gt;
  // Daten aus dem Puffer lesen&lt;br /&gt;
  nextChar = UDR;&lt;br /&gt;
  if( uart_str_complete == 0 ) {	// wenn uart_string gerade in Verwendung, neues Zeichen verwerfen&lt;br /&gt;
&lt;br /&gt;
    // Daten werden erst in uart_string geschrieben, wenn nicht String-Ende/max Zeichenlänge erreicht ist/string gerade verarbeitet wird&lt;br /&gt;
    if( nextChar != &#039;\n&#039; &amp;amp;&amp;amp;&lt;br /&gt;
        nextChar != &#039;\r&#039; &amp;amp;&amp;amp;&lt;br /&gt;
        uart_str_count &amp;lt; UART_MAXSTRLEN ) {&lt;br /&gt;
      uart_string[uart_str_count] = nextChar;&lt;br /&gt;
      uart_str_count++;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      uart_string[uart_str_count] = &#039;\0&#039;;&lt;br /&gt;
      uart_str_count = 0;&lt;br /&gt;
      uart_str_complete = 1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur Funktion: Wurde eine komplette Zeichenkette empfangen, also das Ende (\n oder \r) erkannt oder die maximale Länge &#039;&#039;UART_MAXSTRLEN&#039;&#039; erreicht, wird die globale Variable &#039;&#039;uart_str_complete&#039;&#039; auf &#039;1&#039; gesetzt. Damit wird dem Hauptprogramm, welches auf diese Variable pollt, mitgeteilt, dass die Zeichenkette &#039;&#039;uart_string&#039;&#039; zur Verarbeitung bereit steht. Nach der Verarbeitung der Zeichenkette in der entsprechenden main-Routine, muss die Variable &#039;&#039;uart_str_complete&#039;&#039; wieder auf &#039;0&#039; zurück gesetzt werden. Dadurch werden alle neu empfangenen Zeichen wieder in den globalen Puffer geschrieben.&lt;br /&gt;
&lt;br /&gt;
=== (Baustelle) ===&lt;br /&gt;
&lt;br /&gt;
* Empfangen (Receive) (Anm.: z.T. erledigt)&lt;br /&gt;
** ggf. Fallstricke ([http://www.mikrocontroller.net/topic/84256#707214 UDR in der ISR lesen!])&lt;br /&gt;
** Komplettes, einfaches Beispiel ([http://www.mikrocontroller.net/topic/84228#707052 Echo] (noch buggy beim Datenzugriff, siehe Lit. 2+3!)), ggf. LED zur ISR-Empfangsanzeige oder Overflow-Anzeige&lt;br /&gt;
&lt;br /&gt;
* Senden (Transmit)&lt;br /&gt;
** Variante &amp;quot;UART Data Register Empty&amp;quot; (UDRE) [http://www.mikrocontroller.net/topic/101472#882716]&lt;br /&gt;
** Variante &amp;quot;UART Transmit Complete&amp;quot; (TXC) &lt;br /&gt;
&lt;br /&gt;
* FIFO-Puffer [http://www.mikrocontroller.net/topic/101472#882716], Ringpuffer (Byte Buffering (circular))&lt;br /&gt;
&lt;br /&gt;
* UART-Bibliotheken &lt;br /&gt;
** [http://homepage.hispeed.ch/peterfleury/avr-software.html UART-Library] von Peter Fleury (UART (interrupt driven), Byte Buffering (circular))&lt;br /&gt;
** [http://beaststwo.org/avr-uart/index.shtml Updated AVR UART Library]  (modernisierte und erweiterte Version der Bibliothek von Peter Fleury)&lt;br /&gt;
** [http://www.procyonengineering.com/embedded/avr/avrlib/ Procyon AVRlib] von Pascal Stang (UART (interrupt driven), Byte Buffering (circular), VT100 Terminal Output)&lt;br /&gt;
** [http://die-seite.ch/public/uart_driver.c uart_driver.c] Beispieltreiber in C mit minimalstem Code fuer ATMega8. Sendet und empfaengt Strings ueber Interrupts (von Markus Zimmermann)&lt;br /&gt;
&lt;br /&gt;
* Literatur &lt;br /&gt;
** [http://www.avrfreaks.net/index.php?name=PNphpBB2&amp;amp;file=viewtopic&amp;amp;t=48188 avrfreaks.net Tutorial] inkl. Diskussion (engl.)&lt;br /&gt;
** avr-libc FAQ: [http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_16bitio Why do some 16-bit timer registers sometimes get trashed?]&lt;br /&gt;
&lt;br /&gt;
==Software-UART==&lt;br /&gt;
&lt;br /&gt;
Falls die Zahl der vorhandenen Hardware-UARTs nicht ausreicht, können weitere Schnittstellen über sogennante Software-UARTs ergänzt werden. Es gibt dazu (mindestens) zwei Ansätze: &lt;br /&gt;
* Der bei AVRs üblichste Ansatz basiert auf dem Prinzip, dass ein externer Interrupt-Pin für den Empfang (&amp;quot;RX&amp;quot;) genutzt wird. Das Startbit löst den Interrupt aus, in der Interrupt-Routine (ISR) wird der externe Interrupt deaktiviert und ein Timer aktiviert. In der Interrupt-Routine des Timers wird der Zustand des Empfangs-Pins entsprechend der Baudrate abgetastet. Nach Empfang des Stop-Bits wird der externe Interrupt wieder aktiviert. Senden kann über einen beliebigen Pin (&amp;quot;TX&amp;quot;) erfolgen, der entsprechend der Baudrate und dem zu sendenden Zeichen auf 0 oder 1 gesetzt wird. Die Implementierung ist nicht ganz einfach, es existieren dazu aber fertige Bibliotheken (z.&amp;amp;nbsp;B. bei [http://www.avrfreaks.net/ avrfreaks] oder in der [http://www.procyonengineering.com/embedded/avr/avrlib/ Procyon avrlib]).&lt;br /&gt;
* Ein weiterer Ansatz erfordert keinen Pin mit &amp;quot;Interrupt-Funktion&amp;quot; aber benötigt mehr Rechenzeit. Jeder Input-Pin kann als Empfangspin (RX) dienen. Über einen Timer wird der Zustand des RX-Pins mit einem vielfachen der Baudrate abgetastet (dreifach scheint üblich) und High- bzw. Lowbits anhand einer Mindestanzahl identifiziert. (Beispiel: &amp;quot;Generic Software Uart&amp;quot; Application-Note von IAR)&lt;br /&gt;
&lt;br /&gt;
Neuere AVRs (z.&amp;amp;nbsp;B. ATtiny26 oder ATmega48,88,168,169) verfügen über ein Universal Serial Interface (USI), das teilweise UART-Funktion übernehmen kann. Atmel stellt eine Application-Note bereit, in der die Nutzung des USI als UART erläutert wird (im Prinzip &amp;quot;Hardware-unterstützter Software-UART&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Handshaking==&lt;br /&gt;
Wenn der Sender ständig sendet, wird irgendwann der Fall eintreten, daß der Empfänger nicht bereit ist, neue Zeichen zu empfangen. In diesem Fall muß durch ein &#039;&#039;&#039;Handshake-Verfahren&#039;&#039;&#039; die Situation bereinigt werden. Handshake bedeutet nichts anderes, als daß der Empfänger dem Sender mitteilt, daß er zur Zeit keine Daten annehmen kann und der Sender die Übertragung der nächsten Zeichen solange einstellen soll, bis der Empfänger signalisiert, daß er wieder Zeichen aufnehmen kann.&lt;br /&gt;
===Hardwarehandshake (RTS/CTS)===&lt;br /&gt;
Beim Hardwarehandshake werden zusätzlich zu den beiden Daten-Übertragungsleitungen noch 2 weitere Leitungen benötigt: &#039;&#039;&#039;RTS&#039;&#039;&#039; (&#039;&#039;&#039;R&#039;&#039;&#039;equest &#039;&#039;&#039;T&#039;&#039;&#039;o &#039;&#039;&#039;S&#039;&#039;&#039;end) und &#039;&#039;&#039;CTS&#039;&#039;&#039; (&#039;&#039;&#039;C&#039;&#039;&#039;lear &#039;&#039;&#039;T&#039;&#039;&#039;o &#039;&#039;&#039;S&#039;&#039;&#039;end). Jeder der beiden Kommunikationspartner ist verpflichtet, bevor ein Zeichen gesendet wird, den Zustand der &#039;&#039;&#039;RTS&#039;&#039;&#039; Leitung zu überprüfen. Nur wenn die Gegenstelle darauf Empfangsbereitschaft signalisiert, darf das Zeichen gesendet werden. Um der Gegenstelle zu signalisieren, daß sie zur Zeit keine Zeichen schicken soll, wird die Leitung &#039;&#039;&#039;CTS&#039;&#039;&#039; benutzt.&lt;br /&gt;
&lt;br /&gt;
===Softwarehandshake (XON/XOFF)===&lt;br /&gt;
Beim Softwarehandshake sind keine speziellen Leitungen notwendig. Stattdessen werden besondere ASCII-Zeichen benutzt, die der Gegenstelle signalisieren, das Senden einzustellen bzw. wieder aufzunehmen.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;XOFF&#039;&#039;&#039; Aufforderung das Senden einzustellen&lt;br /&gt;
* &#039;&#039;&#039;XON&#039;&#039;&#039;  Gegenstelle darf wieder senden&lt;br /&gt;
&lt;br /&gt;
Nachteilig bei einem Softwarehandshake ist, dass dadurch keine direkte binäre Datenübertragung mehr möglich ist, denn von den möglichen 256 Bytewerten werden ja nun zwei (nämlich für &#039;&#039;&#039;XON&#039;&#039;&#039; und für &#039;&#039;&#039;XOFF&#039;&#039;&#039;) für besondere Zwecke benutzt und fallen daher aus. In einem quasi-zufälligen Bytestrom, den eine Binärdatei darstellt, kämen diese beiden reservierten früher oder später vor und würden dann den Strom ungewollt stoppen und starten.&lt;br /&gt;
&lt;br /&gt;
==Galvanische Trennung==&lt;br /&gt;
Für eine geringe Überspannungsfestigkeit empfielt es sich, die Datenkanäle über Optokoppler zu führen. Es bietet sich z.b. der 6N138 an, ein &amp;quot;normaler&amp;quot; CNY-17 ist für hohe Baudraten nicht brauchbar.&lt;br /&gt;
&lt;br /&gt;
==Fehlersuche==&lt;br /&gt;
Erstaunlich oft wird im Forum der Hilferuf laut: &amp;quot;Meine UART funktioniert nicht, was mache ich falsch&amp;quot;. In der überwiegenden Mehrzahl der Fälle stellt sich dann heraus, daß es sich um ein Hardwareproblem handelt, wobei da wiederrum der Löwenanteil auf das Konto einer nicht korrekt eingestellten Taktrate geht: Der µC benutzt nicht einen angeschlossenen Quarz, so wie er auch im Programm eingetragen ist, sondern läuft immer noch mit dem internen RC-Takt. Daraus resultiert aber auch, daß der Baudraten Konfigurationswert falsch berechnet wird.&lt;br /&gt;
&lt;br /&gt;
Hilfreich zum Aufspüren solcher Fehler ist auch die [[AVR_Checkliste#UART/USART|AVR-Checkliste]].&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
Tipps zur Verarbeitung von Strings sind in den [[FAQ]].&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:avr-gcc Tutorial]]&lt;br /&gt;
[[Kategorie:UART und RS232]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Augendiagramm&amp;diff=80032</id>
		<title>Augendiagramm</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Augendiagramm&amp;diff=80032"/>
		<updated>2013-12-14T19:41:49Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Änderung 80031 von 89.204.135.157 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Erklärung der Entstehung eines sogenannten Augendiagramms&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;von [[Benutzer:engineer|J.S.]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Bedeutung =&lt;br /&gt;
&lt;br /&gt;
Ein Augendiagramm ist eine bildliche Darstellung eines elektrischen Signalverlaufs, mit dessen Hilfe die Signalqualität einer digitalen Datenübertragung beurteilt werden kann. Es entsteht durch die grafische Überlagerung von mehreren Messungen eines Signals zu unterschiedlichen Zeitpunkten und Phasen. Es entsteht eine Art von Summation der statistisch verteilten Signalverläufe.&lt;br /&gt;
&lt;br /&gt;
Durch die zufälligen Einflüsse, denen das Signal unterworfen ist, verlaufen die theoretisch unendlich steilen Übergänge von 0 auf 1 und umgekehrt dabei nicht mathematisch rechteckig oder konstant an derselben Stelle, sondern als mehr oder weniger breit verschmierte Rampen, wodurch im Zentrum die typische Form eines Auges entsteht.&lt;br /&gt;
&lt;br /&gt;
= Datengewinnung =&lt;br /&gt;
Das Signal wird mehrfach vermessen und die Ergebnisse phasenrichtig überlagert. Im folgenden Beispiel werden aus technischen Gründen alle Kombinationen von Bitfolgen durchgespielt und jeweils 4er-Gruppen überlagert. 3er-GRuppen bei einer ausgewählten Bitfolge würden ebenfalls genügen. Aus Darstellungsgründen sind Punkte statt Linien verwendet, da sich in Excel sonst ein unschöner Rücklauf ergebn würde. Zudem sind dies die realen Messpunkte des Signals.&lt;br /&gt;
&lt;br /&gt;
== Teildatensatz Beginn==&lt;br /&gt;
&lt;br /&gt;
[[Datei:Eye-pattern-explain1.gif]]&lt;br /&gt;
Signalverlauf der ersten drei Kombinationen 0000.0001.0010&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
Beim Signalverlauf der ersten drei Kombinationen rangiert die Spannung bei 0,2V-3,2V und zeigt einen overshoot von 0,3V. Die Pegel sind erst in der Mitte des Bits voll eingeschwungen, was auch den Zacken links (abklingende &amp;quot;1&amp;quot; zu Beginn der 3. Gruppe) erklärt.&lt;br /&gt;
&lt;br /&gt;
== Teildatensatz Mitte==&lt;br /&gt;
&lt;br /&gt;
[[Datei:Eye-pattern-explain2.gif]]&lt;br /&gt;
Signalverlauf des Übergangs von 0111.1000&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
Bei den Kombinationen 0111 und 1000 erkennt man den Übergang von overshoot in den statischen Bereich der eigentlich richtigen Spannung, wenn die Bits lange genug stabil bleiben und sich nicht schon im nächsten Takt wieder ändern.&lt;br /&gt;
&lt;br /&gt;
== Gesamter Datensatz wenige Durchläufe==&lt;br /&gt;
[[Datei:Eye-pattern-explain3.gif]]&lt;br /&gt;
Signalverläufe aller Kombinationen überlagert.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
Bei sich schnell ändernden Bits kommt immer mehr die Bandbreite des Kabels und der Treiber/Empfänger zur Geltung sodass sich das Auge langsam schließt.&lt;br /&gt;
&lt;br /&gt;
Durch Aufsummieren aller statistisch auftretenden Signalverläufe und Histogrambildung entsteht das eigentliche Augendiagramm.&lt;br /&gt;
&lt;br /&gt;
== Gesamter Datensatz viele Durchläufe==&lt;br /&gt;
&lt;br /&gt;
[[Datei:Eye-pattern-explain4.gif]]&lt;br /&gt;
Eingefärbtes Augendiagramm&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
Das 2D-Histogrammbild, das zunächst für jeden Bildpunkt in der T,U-Ebene (Zeitpunkt/Phase sowie Spannung) die Wahrscheinlichkeit für das Auftreten eines Durchlaufs darstellt, wird mit einem Farbprofil ähnlich der Wärmekameras eingefärbt, um die Häufungen zu zeigen. Massgeblich ist letzlich die Breite und Höhe des Auges. Das Zentrum definiert den Punkt, an dem die Abtastung optimal ist.&lt;br /&gt;
&lt;br /&gt;
Zu berücksichtigen sind dabei auch die absoluten Pegel, die jeweils den Empfänger sicher durchsteuern müssen.&lt;br /&gt;
&lt;br /&gt;
= Interpretationsproblem =&lt;br /&gt;
Bei differentiellen Leitungen entsteht bei der längeren Betrachtung der beiden Signale in den Fällen starker Störungen oftmals der Eindruck, dass das Auge geschlossen sei und keine Übertragung möglich ist. Dies muss jedoch nicht der Fall sein! Differenzielle Leitungen sind oftmals von Störungen in gleicher Weise betroffen und zeigen einen ähnlichen Spannungshub, der vom differenziellen Verstärker tolerant verarbeitet werden kann. Daher kommt mitunter dennoch wieder ein stabiles und jederzeit eindeutiges Signal heraus. Daher müssen differentielle Leitungen vor und nach dem Receiver betrachtet werden. Ist das nicht möglich, weil der Receiver in einem FPGA sitzt, muss der Logikpegel anhand von realen Messungen validiert werden.&lt;br /&gt;
&lt;br /&gt;
=Anwendungsbeispiele=&lt;br /&gt;
* Lokalisierung von Problemen&lt;br /&gt;
* Optimierung der Impedanzanpassung&lt;br /&gt;
* Formelle Validierung&lt;br /&gt;
* Bestimmung der Störreserve&lt;br /&gt;
&lt;br /&gt;
= Fußnoten =&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/topic/233342&lt;br /&gt;
&lt;br /&gt;
Suche im Forum nach&lt;br /&gt;
* [http://www.mikrocontroller.net/search?query=Augendiagramm eye pattern]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Signalverarbeitung]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
&lt;br /&gt;
=Weblinks=&lt;br /&gt;
&lt;br /&gt;
* http://it.e-technik.uni-ulm.de/archiv/World/Teaching/Experiment/eye/eye.html&lt;br /&gt;
* https://home.zhaw.ch/~rur/ntm/unterlagen/ntmkap54opt.pdf&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Motoransteuerung_mit_PWM&amp;diff=80009</id>
		<title>Motoransteuerung mit PWM</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Motoransteuerung_mit_PWM&amp;diff=80009"/>
		<updated>2013-12-14T00:52:10Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Vandalismus rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Allgemeines==&lt;br /&gt;
&lt;br /&gt;
Bei der Dimensionierung der Strombelastbarkeit der Bauteile muss man vor allem 2 Werte betrachten:&lt;br /&gt;
* Stromaufnahme des Motors im normalen Betrieb (also mit der Last)&lt;br /&gt;
* Stromaufnahme bei blockiertem Motor, bzw. Anlaufstrom. Hier wird der Strom nur durch den ohmschen Widerstand im Stromkreis begrenzt, er kann also je nach Motor schnell den 2-3 stelligen Amperebereich erreichen.&lt;br /&gt;
&lt;br /&gt;
Die übliche Dimensionierung richtet sich vor allem nach dem ersten Wert und plant entsprechende Reserven ein (für ein paar Sekunden Faktor 2-5 des Stromes), da der zweite Wert in der Praxis aus Kostengründen meist nur schwer realisierbar und unnötig ist. Daher umgeht man das Problem entweder über eine Strombegrenzung oder über einen Sanftanlauf indem man die PWM langsam hoch fährt.&lt;br /&gt;
Dadurch wird der maximale Strom auf einen deutlich niedrigeren Wert begrenzt, so dass die Bauteile schwächer und kostengünstiger ausfallen können. &lt;br /&gt;
&lt;br /&gt;
Die Spannung die der Motor sieht, und somit näherungsweise die Leerlaufdrehzahl ist proportional zu dem Tastverhältnis:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\text{Motorspannung} = \text{Betriebsspannung} \cdot \mathrm{Tastverh\ddot{a}ltnis}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schaltungsvarianten==&lt;br /&gt;
&lt;br /&gt;
===Mosfet mit Freilaufdiode, 1-Quadrantensteller===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Motor_PWM_1.gif|thumb|300px|1-Quadrantensteller]]&lt;br /&gt;
Die einfachste Schaltung besteht nur aus Transistor T1, dem Motor, der Freilaufdiode D1, dem Kondensator C1, sowie der eigentlichen [[PWM]]-Erzeugung und dem [[MOSFET-Übersicht#Mosfet-Treiber | Mosfettreiber]].&lt;br /&gt;
&lt;br /&gt;
In der Einschaltphase von T1 liegt am Motor die gesamte Betriebsspannung an. Die Differenz zwischen der vom sich drehenden Motor erzeugten Generatorspannung und der Betriebsspannung fällt am Wicklungswiderstand sowie der Wicklungsinduktivität ab. Man hat es also mit einer RL Reihenschaltung zu tun. Da der Wicklungswiderstand recht klein ist, steigt der Strom näherungsweise linear an, bis T1 abschaltet. Dann übernimmt D1 den Stromfluss und schließt den Stromkreis solange, bis T1 den Strom wieder übernimmt (oder der Strom abgeklungen ist = lückender Betrieb). Obwohl keine Energie mehr von außen zugeführt wird, wird der Motor weiterhin durch die in der Wicklung gespeicherten Energie versorgt. Der Strom fällt nun wieder linear ab, bis T1 wieder durchsteuert und wieder Energie zuführt.&lt;br /&gt;
&lt;br /&gt;
Der Strom durch die Diode D1 ist von der Spitzenamplitude her genauso groß wie der Strom durch T1, je nach Tastverhältnis ist der Effektivwert aber kleiner als der durch T1 (bei über 50% Tastverhältnis), gleich (bei 50% Tastverhältnis) oder sogar größer (bei einem Tastverhältnis kleiner 50%). Daher muss die Diode genauso stark dimensioniert werden wie der Transistor (möglichst eine schnelle Schaltdiode (z.B. Schottky) verwenden, keine 1N400x). Der Kondensator C1 ist notwendig, um den durch die PWM gepulsten Strom zu glätten, da aufgrund der steilen Flanken ansonsten in den Zuleitungen ein Spannungsabfall bzw. Spannungsspitzen auftreten würden (am besten 2 oder mehrere Cs unterschiedlicher Kapazität und Bauart verwenden).&lt;br /&gt;
&lt;br /&gt;
T, D und C sollen möglichst nahe zusammen plaziert werden (kürzeste Verbindungen). Wenn die D am Motor angebracht wird, strahlt die Zuleitung massiv EMV ab. Leitungen am besten verdrillen.&lt;br /&gt;
&lt;br /&gt;
===Synchrongleichrichtung, 2-Quadrantensteller===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Motor_PWM_2.gif|thumb|300px|2-Quadrantensteller]]&lt;br /&gt;
Um die Verluste in der Freilaufdiode zu verringern kann man diese durch einen zweiten Mosfet ersetzen, der immer dann eingeschaltet wird, wenn der andere abgeschaltet ist.&lt;br /&gt;
&lt;br /&gt;
Da dieser Mosfet, im Gegensatz zu einer Diode, in beide Richtungen leitet, ist es damit möglich den Motor kurzzuschließen und so den Motor zu bremsen.&lt;br /&gt;
Allgemein kann man sagen: Ist die durch die PWM erzeugte Spannung größer als die Generatorspannung des Motors, wird dieser beschleunigt. Ist die Spannung kleiner, wird der Motor abgebremst. Durch T2 wird der Motor dabei kurzgeschlossen, so dass sich durch die Generatorspannung zunächst der Strom in der Motorwicklung ab- und dann in umgekehrter Richtung wieder aufbaut. Beim Abschalten von T2 und Einschalten von T1 fließt dieser Strom über T1 in C1 und somit die Spannungsquelle zurück. Die Energie wird beim Bremsen also nicht vernichtet, sondern wieder in elektrische Energie zurückverwandelt. Dies sollte man bedenken wenn man eine große Masse abbremst, denn die Spannungsquelle muss die Energie aufnehmen können. Sollte die Spannungsquelle z.&amp;amp;nbsp;B. aus einem Transformator mit Gleichrichter bestehen, kann dieser die Energie nicht aufnehmen sondern nur C1, was dazu führt, dass die Betriebsspannung ansteigt bis eventuell einer der Transistoren zerstört wird. Um dies zu verhindern ist eine Überspannungsbegrenzung in Form eines Bremswiderstands vorzusehen (Bremschopper). Besteht die Spannungsquelle z.&amp;amp;nbsp;B. aus einem Akku dann nimmt dieser die Energie auf und wird beim Bremsen wieder etwas geladen.&lt;br /&gt;
Dies funktioniert allerdings nur, wenn das Tastverhältnis nicht 0% beträgt, also T2 und T1 abwechselnd schalten, so dass nicht die gesamte Energie in der Motorwicklung sowie T2 verheizt wird. Man sollte es daher vermeiden das Tastverhältnis schnell in eine der beiden Richtungen zu ändern, da dies zu einem hohen Strom führt.&lt;br /&gt;
&lt;br /&gt;
Die Ansteuerschaltung muss weiterhin verhindern, dass T1 und T2 gleichzeitig leitend werden können, denn dies würde zu einem Kurzschluss führen. Ein fertig aufgebauter Mosfet-Treiber verhindert dies.&lt;br /&gt;
&lt;br /&gt;
===H-Brücke, 4-Quadrantensteller===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Motor_PWM_3.gif|thumb|300px|4-Quadrantensteller]]&lt;br /&gt;
Die H-Brücke, bzw. der 4-Quadrantensteller ist eine Erweiterung des 2-Quadrantenstellers durch eine zweite Halbbrücke. Diese ermöglicht neben dem Beschleunigen und Bremsen des Motors auch eine Umkehr der Drehrichtung.&lt;br /&gt;
Dafür gibt es mehrere Ansteuerverfahren&lt;br /&gt;
#Das effizienteste ist, eine Hälfte wie beim 2-Quadrantensteller zu betreiben und mit der anderen den zweiten Motoranschluss an die Betriebsspannung zu legen. Für die andere Drehrichtung wechselt man einfach die Hälften, legt also den anderen Anschluss an die Betriebsspannung und verwendet die andere Hälfte als 2-Quadrantensteller.&lt;br /&gt;
&lt;br /&gt;
#Das andere Verfahren steuert abwechselnd T1 und T4 oder T2 und T3 durch, legt also immer eine Spannung an den Motor. Ist das Tastverhältnis 50% fließt im Mittel ein Strom von 0A, da der Motor für jeweils die Hälfte der Zeit eine positive und eine negative Spannung erhält, der Motor steht also. Je nachdem ob man das Tastverhältnis darüber oder darunter wählt, legt man die Drehrichtung fest. Dieses Verfahren ist Ansteuertechnisch einfacher, erzeugt aber auch im Stillstand Schaltverluste in den Transistoren und Verluste im Motor.&lt;br /&gt;
&lt;br /&gt;
==Beispielschaltungen==&lt;br /&gt;
&lt;br /&gt;
===1-Quadrantensteller mit diskretem Mosfettreiber===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Motor_PWM1_real.gif|thumb|300px|Einfacher 1-Quadrantensteller]]&lt;br /&gt;
Diese Schaltung eignet sich für Motoren bis etwa 35V und 10A Dauerstrom.&lt;br /&gt;
Q1 und Q2 zusammen mit deren Beschaltung dienen als [[Pegelwandler]] von 3,3 oder 5V Digitalsignalen auf 12V für das Mosfet Gate. Die Schaltung arbeitet dabei invertierend, der Mosfet schaltet also bei einem Low am Eingang ein.&lt;br /&gt;
Sperrt Q1, wird Q2 über R1 durchgesteuert und liefert etwa 11-11,5V ans Gate des Mosfets. R2 begrenzt dabei den Strom.&lt;br /&gt;
Das Abschalten des Mosfets geschieht über den Pfad Q1 und D1. Gleichzeitig wird Q2 die Basisspannung weggenommen, so dass dieser sperrt.&lt;br /&gt;
D2 zwischen Basis und Kollektor von Q1 verhindert, dass dieser in die Sättigung kommt, so dass dieser nahezu verzögerungsfrei sperrt, sobald der Eingang auf Low wechselt. Ab ein paar Ampere benötigt die Freilaufdiode D3 einen kleinen [[Kühlkörper]], ebenso Q3. Sollte die Betriebsspannung V+ des Motors bei etwa 10-16V liegen, dann kann diese Spannung auch für die Mosfetansteuerung verwendet werden. Ansonsten sollte dafür eine getrennte Spannung mit etwa 12-15V verwendet werden.&lt;br /&gt;
&lt;br /&gt;
===1-Quadrantensteller mit diskretem Highside-Mosfettreiber===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Motor_PWM1b_real.gif|thumb|300px|Einfacher 1-Quadrantensteller mit P-Kanal Mosfet]]&lt;br /&gt;
&lt;br /&gt;
Diese Schaltung eignet sich für Motoren mit etwa 15-40V Betriebsspannung und mit bis zu 10A Dauerstrom. Schaltungen mit P-Kanal Mosfets sollte man wenn möglich vermeiden, da N-Kanal Mosfets prinzipbedingt um Faktor 3 bessere Werte aufweisen als P-Kanal Mosfets. Allerdings wird manchmal ein auf Masse bezogener Ausgang gefordert, dann ist diese Schaltung hier die richtige. Das Problem bei der Highsideansteuerung ist, dass man die Gate-Sourcespannung irgendwie auf max. 20V begrenzen muss, was hier durch eine zusätzliche Hilfsspannung von 12V wie bei der vorigen Schaltung, nicht so einfach geht. Daher wird hier ein anderer Weg eingeschlagen. Q1 und R2 bilden eine [[Konstantstromquelle]]. Dadurch, dass an der Basis eine feste Logikspannung ansteht, steuert Q1 so stark durch, bis er sich durch den Spannungsabfall an R2 selbst die Basisspannung reduziert. Der fließende Strom beträgt dabei (Logikpegel am Eingang - 0,6V Basis-Emitterspannung)/R2. Ein guter Wert für den Strom sind etwa 10-15mA. Bei der Dimensionierung sollte man auch die Verlustleistung beachten: 40V * 15mA = 0,6W. Dies ist für einen Transistor im TO92 Gehäuse deutlich zu viel. Dadurch, dass Q1 im Linearbetrieb arbeitet, kommt er nicht in die Sättigung, und es kann auf die Diode wie in der vorherigen Schaltung verzichtet werden. Ebenso ist ein Basiswiderstand unnötig bzw. sogar hier fehl am Platz. Da nun bekannt ist, dass im durchgesteuerten Zustand von Q1 bei 5V Logikspannung (5V-0,6V)/330Ω= 13,3mA fließen, kann man damit den Spannungsabfall an R1 berechnen, bzw. aus der gewünschten Spannung R1:&lt;br /&gt;
U(R1)=13,3mA*1kOhm=13,3V. Im eingeschalteten Zustand ist die Spannung am Kollektor von Q1 also um 13,3V negativer als V+ und das unabhängig von der Betriebsspannung! Da diese Spannung durch die als Emitterfolger geschalteten Transistor Q2 und Q3 gepuffert auch an das Gate des Mosfets gelegt werden, bekommt dieser also rund 13V Gatespannung im eingeschalteten Zustand. Dies passt gut, denn für die meisten Mosfets sollte man einen Wert zwischen 10 und 15V verwenden. Durch den Spannungsteiler aus R1 und R2 ergibt sich allerdings auch eine untere Grenze der Betriebsspannung, damit die Schaltung sauber funktioniert: Um die 13,3V über R2 zu erhalten, bzw. die 4,4V über R1 sind mindestens 17,7V für V+ notwendig.&lt;br /&gt;
&lt;br /&gt;
===2-Quadrantensteller mit Halbbrücken Mosfettreiber===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Motor_PWM2_real.gif|thumb|300px|Einfacher 2-Quadrantensteller]]&lt;br /&gt;
&lt;br /&gt;
Diese Schaltung eignet sich für Motoren bis etwa 35V und 20A Dauerstrom.&lt;br /&gt;
Um den Aufwand zu minimieren wird für die Halbbrücke ein fertiger Halbbrückentreiber IR2184 verwendet. Dieser besitzt eine integrierte Totzeit (engl. dead time) von 500ns zwischen dem Umschalten der Mosfets, so dass ein gleichzeitiges Einschalten beider Mosfets ausgeschlossen ist. Da der Mosfet gegen V+ angeschlossen ist, arbeitet auch diese Schaltung invertierend. Der Grund, warum der Motor nicht gegenüber GND angeschlossen ist, ist folgender:&lt;br /&gt;
Für die Ansteuerung des Highside Mosfets Q2 ist eine Spannung von etwa 10V mehr als die Betriebsspannung V+ notwendig. Diese wird über die Bootstrapschaltung aus C2 und D1 erzeugt. Ist Q1 durchgesteuert, läd sich C2 über D1 auf. Schaltet anschließend Q1 ab und Q2 ein, wird dessen Ansteuerspannung aus C2 entnommen. Da Q2 nun VS mit V+ verbindet, steigt auch das Potential an C2 an. An dem VB Pin stehen nun etwa V+ + 12V-0,7V (12V Betriebsspannung-Flusspannung von D1) an. Aufgrund von Leckströmen, entläd sich C2 allerdings innerhalb einiger Millisekunden. Daher ist die maximale Einschaltdauer von Q2 begrenzt. 100% Einschaltdauer wären daher nicht möglich. Um dieses Problem zu umgehen ist der Motor gegen V+ geschaltet, so dass für 100% Einschaltdauer Q1 eingeschaltet werden muss, was kein Problem ist, denn dessen Treiber wird direkt auf den 12V versorgt. Ist Q1 dagegen dauerhaft aus, Q2 also an, bremst der Motor, bzw. er steht, so dass kein Strom durch die Mosfets fließt. Daher ist es auch nicht weiter schlimm, wenn Q2 nach einer kurzen Zeit wieder abschaltet. Das einzige was nicht möglich ist, ist ein dauerhaftes Bremsen des Motors mittels Q2, aber dies wird in der Praxis auch nur in den seltensten Fällen benötigt. Über den IN Pin, wird das invertierte PWM Signal mit Logikpegeln eingespeist. Über den SD\ Pin, lassen sich beide Mosfets gemeinsam abschalten. Damit ist ein ungebremstes Auslaufen lassen des Motors möglich (Freilauf). Ab etwa 5Ampere benötigen die Mosfets einen kleinen [[Kühlkörper]].&lt;br /&gt;
&lt;br /&gt;
==Wahl der PWM-Frequenz==&lt;br /&gt;
&lt;br /&gt;
Bei der Wahl der PWM Frequenz muss man mehrere Faktoren berücksichtigen und einen Kompromiss eingehen:&lt;br /&gt;
* Die Motorinduktivität L glättet den Strom, der Wicklungswiderstand R führt zu einem Abfallen des Stromes, daraus ergibt sich die elektrische Zeitkonstante des Motors &amp;lt;math&amp;gt;t=\frac{L}{R}&amp;lt;/math&amp;gt;. Bei vielen Motoren liegt diese um 1ms. Bei hochwertigen Motoren sollte diese Angabe im Datenblatt zu finden sein. Um den Stromripple gering, also das Drehmoment konstant zu halten, sollte die Periodendauer der PWM diese Zeit nicht überschreiten. Vor allem im 2 bzw. 4-Quadratentebetrieb ist dies wichtig, denn dort kann der Strom auch seine Richtung ändern, was zu einem Abbremsen, somit zu einem deutlichen Ruckeln und zu Vibrationen des Motors und zu unnötigen Verlusten führt. &lt;br /&gt;
* Frequenzen zwischen  100Hz und 10kHz erzeugen hörbare Pfeifgeräusche im Motor&lt;br /&gt;
* Mit zunehmender Frequenz steigen die Schaltverluste in den Transistoren sowie die Verluste in der Ankerwicklung sowie in deren Kern.&lt;br /&gt;
&lt;br /&gt;
Die aus elektrischer Sicht ideale PWM Frequenz liegt daher meist bei 1-2kHz. Allerdings ist dies genau der Bereich, in dem das Gehör am empfindlichsten ist. Wenn das Pfeifen des Motors nicht stört, ist dies also der ideale Bereich.&lt;br /&gt;
Da die untere Frequenz durch die elektrische Zeitkonstante des Motors begrenzt ist, kann man nur nach oben ausweichen. Ein Kompromiss ist daher der Bereich 5-15kHz in dem das Gehör deutlich unempfindlicher ist, sich die Verluste noch in Grenzen halten. Verwendet man die einfache Schaltung mit der Freilaufdiode und legt keinen Wert auf einen runden Lauf, bzw. hat eine hohe Masse am Motor, so dass dieser träge ist, dann kann man als Alternative zu den &amp;gt;5kHz die PWM Frequenz auch bis auf 200Hz reduzieren um das Geräusch erträglicher zu machen. Allerdings reduziert sich dann der Wirkungsgrad aufgrund des hohen Stromripples.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
*[[PWM]]&lt;br /&gt;
*[[Treiber]]&lt;br /&gt;
*[[MOSFET-Übersicht#MOSFET-Treiber | Mosfet-Treiber]]&lt;br /&gt;
*[[H-Brücken Übersicht]]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/103116#900247 Forumsbeitrag]: Highside Mosfetansteuerung mit diskretem Treiber&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/191616#1870643 Forumsbeitrag]: Zur Erklärung der PWM Steuerung, Bremsen und Unterschied zum Relais&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/280480#2960070 Forumsbeitrag]: Clevere MOSFET-Treiber mit kleinsten Trafos&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
&lt;br /&gt;
*[http://de.wikipedia.org/wiki/Zweiquadrantensteller Zweiquadrantensteller bei Wikipedia]&lt;br /&gt;
*[http://de.wikipedia.org/wiki/Vierquadrantensteller Vierquadrantensteller bei Wikipedia]&lt;br /&gt;
*[http://homepages.which.net/~paul.hills/SpeedControl/SpeedControllersBody.html Grundlagen zum Thema Motoransteuerung (englisch)]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Leistungselektronik]]&lt;br /&gt;
[[Kategorie:Motoren]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Augendiagramm&amp;diff=80004</id>
		<title>Augendiagramm</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Augendiagramm&amp;diff=80004"/>
		<updated>2013-12-13T22:06:55Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Änderung 80003 von 82.113.121.110 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Erklärung der Entstehung eines sogenannten Augendiagramms&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;von [[Benutzer:engineer|J.S.]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Bedeutung =&lt;br /&gt;
&lt;br /&gt;
Ein Augendiagramm ist eine bildliche Darstellung eines elektrischen Signalverlaufs, mit dessen Hilfe die Signalqualität einer digitalen Datenübertragung beurteilt werden kann. Es entsteht durch die grafische Überlagerung von mehreren Messungen eines Signals zu unterschiedlichen Zeitpunkten und Phasen. Es entsteht eine Art von Summation der statistisch verteilten Signalverläufe.&lt;br /&gt;
&lt;br /&gt;
Durch die zufälligen Einflüsse, denen das Signal unterworfen ist, verlaufen die theoretisch unendlich steilen Übergänge von 0 auf 1 und umgekehrt dabei nicht mathematisch rechteckig oder konstant an derselben Stelle, sondern als mehr oder weniger breit verschmierte Rampen, wodurch im Zentrum die typische Form eines Auges entsteht.&lt;br /&gt;
&lt;br /&gt;
= Datengewinnung =&lt;br /&gt;
Das Signal wird mehrfach vermessen und die Ergebnisse phasenrichtig überlagert. Im folgenden Beispiel werden aus technischen Gründen alle Kombinationen von Bitfolgen durchgespielt und jeweils 4er-Gruppen überlagert. 3er-GRuppen bei einer ausgewählten Bitfolge würden ebenfalls genügen. Aus Darstellungsgründen sind Punkte statt Linien verwendet, da sich in Excel sonst ein unschöner Rücklauf ergebn würde. Zudem sind dies die realen Messpunkte des Signals.&lt;br /&gt;
&lt;br /&gt;
== Teildatensatz Beginn==&lt;br /&gt;
&lt;br /&gt;
[[Datei:Eye-pattern-explain1.gif]]&lt;br /&gt;
Signalverlauf der ersten drei Kombinationen 0000.0001.0010&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
Beim Signalverlauf der ersten drei Kombinationen rangiert die Spannung bei 0,2V-3,2V und zeigt einen overshoot von 0,3V. Die Pegel sind erst in der Mitte des Bits voll eingeschwungen, was auch den Zacken links (abklingende &amp;quot;1&amp;quot; zu Beginn der 3. Gruppe) erklärt.&lt;br /&gt;
&lt;br /&gt;
== Teildatensatz Mitte==&lt;br /&gt;
&lt;br /&gt;
[[Datei:Eye-pattern-explain2.gif]]&lt;br /&gt;
Signalverlauf des Übergangs von 0111.1000&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
Bei den Kombinationen 0111 und 1000 erkennt man den Übergang von overshoot in den statischen Bereich der eigentlich richtigen Spannung, wenn die Bits lange genug stabil bleiben und sich nicht schon im nächsten Takt wieder ändern.&lt;br /&gt;
&lt;br /&gt;
== Gesamter Datensatz wenige Durchläufe==&lt;br /&gt;
[[Datei:Eye-pattern-explain3.gif]]&lt;br /&gt;
Signalverläufe aller Kombinationen überlagert.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
Bei sich schnell ändernden Bits kommt immer mehr die Bandbreite des Kabels und der Treiber/Empfänger zur Geltung sodass sich das Auge langsam schließt.&lt;br /&gt;
&lt;br /&gt;
Durch Aufsummieren aller statistisch auftretenden Signalverläufe und Histogrambildung entsteht das eigentliche Augendiagramm.&lt;br /&gt;
&lt;br /&gt;
== Gesamter Datensatz viele Durchläufe==&lt;br /&gt;
&lt;br /&gt;
[[Datei:Eye-pattern-explain4.gif]]&lt;br /&gt;
Eingefärbtes Augendiagramm&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
Das 2D-Histogrammbild, das zunächst für jeden Bildpunkt in der T,U-Ebene (Zeitpunkt/Phase sowie Spannung) die Wahrscheinlichkeit für das Auftreten eines Durchlaufs darstellt, wird mit einem Farbprofil ähnlich der Wärmekameras eingefärbt, um die Häufungen zu zeigen. Massgeblich ist letzlich die Breite und Höhe des Auges. Das Zentrum definiert den Punkt, an dem die Abtastung optimal ist.&lt;br /&gt;
&lt;br /&gt;
Zu berücksichtigen sind dabei auch die absoluten Pegel, die jeweils den Empfänger sicher durchsteuern müssen.&lt;br /&gt;
&lt;br /&gt;
= Interpretationsproblem =&lt;br /&gt;
Bei differentiellen Leitungen entsteht bei der längeren Betrachtung der beiden Signale in den Fällen starker Störungen oftmals der Eindruck, dass das Auge geschlossen sei und keine Übertragung möglich ist. Dies muss jedoch nicht der Fall sein! Differenzielle Leitungen sind oftmals von Störungen in gleicher Weise betroffen und zeigen einen ähnlichen Spannungshub, der vom differenziellen Verstärker tolerant verarbeitet werden kann. Daher kommt mitunter dennoch wieder ein stabiles und jederzeit eindeutiges Signal heraus. Daher müssen differentielle Leitungen vor und nach dem Receiver betrachtet werden. Ist das nicht möglich, weil der Receiver in einem FPGA sitzt, muss der Logikpegel anhand von realen Messungen validiert werden.&lt;br /&gt;
&lt;br /&gt;
=Anwendungsbeispiele=&lt;br /&gt;
* Lokalisierung von Problemen&lt;br /&gt;
* Optimierung der Impedanzanpassung&lt;br /&gt;
* Formelle Validierung&lt;br /&gt;
* Bestimmung der Störreserve&lt;br /&gt;
&lt;br /&gt;
= Fußnoten =&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/topic/233342&lt;br /&gt;
&lt;br /&gt;
Suche im Forum nach&lt;br /&gt;
* [http://www.mikrocontroller.net/search?query=Augendiagramm eye pattern]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Signalverarbeitung]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
&lt;br /&gt;
=Weblinks=&lt;br /&gt;
&lt;br /&gt;
* http://it.e-technik.uni-ulm.de/archiv/World/Teaching/Experiment/eye/eye.html&lt;br /&gt;
* https://home.zhaw.ch/~rur/ntm/unterlagen/ntmkap54opt.pdf&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_Typen&amp;diff=79927</id>
		<title>AVR Typen</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_Typen&amp;diff=79927"/>
		<updated>2013-12-09T12:04:38Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Nochmal: das ist kein Fehler.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== AT90S ==&lt;br /&gt;
Die &amp;quot;Basic Line&amp;quot; der Atmel [[AVR]]-Reihe. Sie beinhaltet die ersten [[AVR|AVRs]] die produziert wurden und deren Bezeichnung mit &amp;quot;AT90S&amp;quot; beginnt. Alle Typen wurden mit der Zeit von den beiden Nachfolgereihen ersetzt: ATmega bzw. ATtiny.&lt;br /&gt;
&lt;br /&gt;
Einige neue AVR-Controller tragen eine mit AT90-&#039;&#039;ohne S&#039;&#039; beginnende Bezeichnung, haben aber einen &amp;quot;moderneren&amp;quot; Kern. Z.B. sind die Typen AT90PWM2/3 und AT90CAN128 vom Funktionsumfang (interner RC, USART etc.) den ATmegas zuzuordnen.&lt;br /&gt;
&lt;br /&gt;
== ATmega ==&lt;br /&gt;
Die ATmega-[[Mikrocontroller]] sind ein Teil der AVR-Controllerfamilie. Zusammen mit den ATtiny lösen die ATmega die AT90S-Serie schrittweise ab, wobei es in den meisten Fällen weitgehend pin- und funktionskompatiblen Ersatz für abgekündigte Controller gibt (ATmega8 bzw. ATmega8A statt AT90S4433, ATmega8515 statt AT90S8515 usw.).&lt;br /&gt;
&lt;br /&gt;
Atmel ATmega AVRs werden mit aktiviertem internem Taktgeber ausgeliefert. Schließt man eine andere externe Taktquelle an (Quarz, Quarzoszillator o.ä), wird diese nicht automatisch genutzt. Zum Aktivieren müssen die Fuse-Bits des Controllers entsprechend eingestellt werden (siehe Datenblatt).&lt;br /&gt;
&lt;br /&gt;
ATmegas mit integriertem [[JTAG]]-Interface (z.Zt. solche ab 16kB Flash-Speicher und mehr als 28 Pins&amp;lt;!-- wg. ATmega168--&amp;gt;) werden ab Werk mit aktiviertem JTAG-Interface ausgeliefert. Dieses Interface belegt vier Port-Pins (z.&amp;amp;nbsp;B. am PORTC bei ATmega16/32), die nicht für eigene Anwendungen genutzt werden können, solange das JTAG-Interface aktiviert ist. Das Interface lässt sich über ein Fuse-Bit (JTAGEN) dauerhaft und über ein Bit (JTD) in dem (oder einem der) MC-Kontroll-Register (Datenblatt nach JTD durchsuchen) per Software zur Laufzeit an- und abschalten. Weiteres im Datenblatt des jeweiligen Controllers in den Abschnitten Memory-Programming (Fuse) und JTAG/ICE (JTD).&lt;br /&gt;
&lt;br /&gt;
Beim ATmega128 ist ab Werk die Mega103-Kompatibilitäts-fuse gesetzt. Um alle Erweiterungen des Mega128 gegenüber dem Mega103 zu nutzen muss diese deaktivert werden. Diese Fuse sorgt außerdem dafür, dass das SRAM in einem anderen Adressbereich liegt. Dadurch funktionieren C-Programme nur bis zum ersten Funktionsaufruf. Siehe auch [[AVR_Checkliste#Besonderheiten_bei_ATmega128_und_seinen_Derivaten_im_64-Pin-Gehäuse | AVR Checkliste: Besonderheiten bei ATmega64 / ATmega128]]&lt;br /&gt;
&lt;br /&gt;
== ATtiny ==&lt;br /&gt;
&lt;br /&gt;
Die ATtiny stellen das untere Ende der neuen AVR Linie von Atmel dar und waren zunächst durch das Fehlen von internem [[RAM#SRAM|SRAM]] gekennzeichnet. Mittlerweile gibt es aber so bemerkenswerte Controller wie den ATtiny4313, deren Möglichkeiten und Funktionen den ATmegas in nichts nachstehen.&lt;br /&gt;
&lt;br /&gt;
Ein weiterer Unterschied zu den ATmegas ist der fehlende Hardwaremultiplizierer. Jede Multiplikation muss also in Software ausgeführt werden. Eine Übersicht über die Verfügbarkeit verschiedener Befehle bietet die [[AVR_Assembler_-_Vergleichstabelle|AVR-Assembler Befehlsvergleichstabelle]].&lt;br /&gt;
&lt;br /&gt;
== ATxmega ==&lt;br /&gt;
Neueste Generation von AVR-Controllern mit neuem internen Aufbau, hoher Taktrate (32 MHz), niedriger Spannung (1,6 - 3,6V), vielen Schnittstellen, in 44 - 100 poligen SMD-Gehäusen. Besonderheiten: ADC mit 2 Megasample/12 Bit, vierpoliges Programm- und Debug- Interface PDI (VTref, CLK, DATA, GND)  erfordert z.B. einen AVR_JTAGICE-mkII Programmer. PDI (Flash und Debug) funktioniert mit C-Code z.B. mit AVR Studio 4.19. &lt;br /&gt;
&lt;br /&gt;
Leider ist die Xmega-Reihe zu den AVR-Prozessoren der Mega- oder Tiny-Serien nicht  kompatibel (viel komplizierter, anderer Aufbau der IO-Baugruppen, der Interrupts, der C-Funktionen etc.). Prozessor-Manuals zeigen weder Assembler noch C-Beispiele für Ansteuerung der IO-Baugruppen. C-Programmbeispiele (geeignet für AVR-Studio) findet man erst in Xmega Application Notes. Einen Überblick gibt es von [http://www.stromflo.de/dokuwiki/doku.php?id=xmega-c-tutorial Florian Grotz] oder in dem [http://www.jtronics.de/avr-projekte/xmega-tutorial.html jtronics Xmega Tutorial]  .&lt;br /&gt;
&lt;br /&gt;
== Sonstiges ==&lt;br /&gt;
&lt;br /&gt;
Die AT89-Familie gehört nicht zu den AVR-Typen mit dem AVR-RISC-Befehlssatz, sondern ist eine [[8051|Intel-8051]]-kompatible 8-Bit µC-Serie.&lt;br /&gt;
&lt;br /&gt;
=== Tiny vs Mega ===&lt;br /&gt;
Die modernen Typen sind die Tiny (=winzig) und die Mega (=riesig). Die ATTiny haben kleinere Gehäuse als die ATMega, mit weniger Pins. Dies führt bei ähnlicher Funktionalität wie die Megas zu extremen Mehrfachbelegungen der Pins und auch eher zu Überschneidungen der Pinfunktionalität. Die Tiny sind daher eher für sehr hohe Stückzahlen geeignet, wo die Einsparung über die Stückzahl kommt. Anfänger und Bastler sind mit den ATMega besser bedient, da die weniger Limitationen besitzen.&lt;br /&gt;
&lt;br /&gt;
Tinys haben keinen Hardware-Multiplizierer.&lt;br /&gt;
&lt;br /&gt;
==Nomenklatur==&lt;br /&gt;
===ATmega===&lt;br /&gt;
Auch wenn die Namensgebung auf den ersten Blick bedingt durch die vielen verfügbaren Modelle kompliziert aussieht, so folgt sie doch immer (von wenigen Ausnahmen abgesehen) einem einfachen Schema. &lt;br /&gt;
&lt;br /&gt;
Nehmen wir einen aktuellen Baustein als Beispiel: *ATmega48PA-AU*. Der Name besteht aus 5 Teilen:&lt;br /&gt;
# Der Baureihe (hier: &amp;quot;ATmega&amp;quot;)&lt;br /&gt;
# Einer Nummer, immer eine Zweierpotenz (hier: 4). Diese Zahl gibt die Größe des Flashspeichers in Kibibyte an. &lt;br /&gt;
# Bis zu zwei weiteren Ziffern (hier: 8). Sie definieren die Zusatzfunktionen sowie Zahl der I/O-Ports.&lt;br /&gt;
# Bis zu zwei Buchstaben (hier: PA), die für die Revision sowie spezielle stromsparende Architekturen stehen.&lt;br /&gt;
# Einem Bindestrich und zwei weiteren Buchstaben, die die Bauform angeben (hier: AU).&lt;br /&gt;
&lt;br /&gt;
====Baureihe====&lt;br /&gt;
&lt;br /&gt;
Hier gibt es nur zwei Reihen: Den kleinen ATtiny mit reduziertem Funktionsumfang und den großen ATmega.&lt;br /&gt;
&lt;br /&gt;
====Speichergröße====&lt;br /&gt;
&lt;br /&gt;
Während die Größe des Flashspeichers (Programmspeicher) direkt im Namen angegeben ist, ergibt sich die Größe von RAM und EEPROM nur indirekt aus dieser Nummer, wobei natürlich die Bausteine mit großem Flash auch mehr RAM und EEPROM haben als kleinere. Grob gilt diese Zuordnung:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Flash (kB)  !! EEPROM (B) !! RAM (B)&lt;br /&gt;
|-&lt;br /&gt;
| 2           ||   tiny: 128      ||  tiny: 128&lt;br /&gt;
|-&lt;br /&gt;
| 4           ||   tiny: var., mega: 256      ||  tiny: 256, mega: 512&lt;br /&gt;
|-&lt;br /&gt;
| 8           ||   tiny: var., mega: 512      ||  tiny: 512, mega: 1024&lt;br /&gt;
|-&lt;br /&gt;
| 16          ||   512      ||  1024&lt;br /&gt;
|-&lt;br /&gt;
| 32          ||   1024     ||  2048&lt;br /&gt;
|-&lt;br /&gt;
| 64          ||   2048*)   ||  4096*)&lt;br /&gt;
|-&lt;br /&gt;
| 128 - 256   ||   4096     ||  4K - 16K&lt;br /&gt;
|}&lt;br /&gt;
 *)Atmega640 verfügt über den doppelten Speicher&lt;br /&gt;
&lt;br /&gt;
====Zusatzfunktionen / Größe====&lt;br /&gt;
Die Ziffer(n) nach der Flashgröße geben die Ausstattungsmerkmale des Bausteins an. Die folgende Tabelle gilt für die Atmega-Reihe:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Ziffer  !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| - ||  Keine Ziffer markiert die Bausteine der ersten Generation. Sie verfügen in der Regel über eine niedrigere maximale Taktrate (8/16 MHz anstatt 10/20 MHz), eine höhere Minimal-Spannung (2,7 anstatt 1,8 Volt), weniger Interrupt-Quellen und PWM-Kanäle&lt;br /&gt;
|-&lt;br /&gt;
| 0 ||  Reihe von 32 - 256 kB in einem größeren Gehäuse mit höherer Anzahl an I/O-Pins. Etwas älter als die aktuellen Reihen 4 und 8.&lt;br /&gt;
|-&lt;br /&gt;
| 1 ||  Kennzeichnet eine verbesserte Version des Atmega128 / 256, aber älter als aktuelle 4er Reihe&lt;br /&gt;
|-&lt;br /&gt;
| 4 ||  Reihe von 16 bis 128 kB Flash, alle pinkompatibel in 40-44 poligem Gehäuse. Neueste Baureihe, alle in pico-power-Technologie mit vielen verbesserten Funktionen wie externen Interrupts, Timern, USART...&lt;br /&gt;
|-&lt;br /&gt;
| 5 ||  Reihe von 16 bis 64 kB&lt;br /&gt;
|-&lt;br /&gt;
| 8 ||  Reihe von 4 bis 32 kB, alle pinkompatibel in 28-32 poligem Gehäuse. Neueste Baureihe, alle in pico-power-Technologie mit vielen verbesserten Funktionen wie externen Interrupts, Timern, USART.... (auch in der Attiny-Reihe vorhanden)&lt;br /&gt;
|-&lt;br /&gt;
| 9 ||  Reihe von 16 bis 64 kB mit integriertem Controller für LC-Displays, folglich in großen Gehäusen (64-/100-polig)&lt;br /&gt;
|}&lt;br /&gt;
Aus dieser Liste stechen einige Bausteine als Außenseiter hervor:&lt;br /&gt;
* Atmega8515 / Atmega8535&lt;br /&gt;
* Atmega640: Im Prinzip ein Atmega64 mit deutlich mehr Hardware-Ressourcen (4 UARTs, 16 ADC-Kanäle...) und doppelt soviel EEPROM / SRAM.&lt;br /&gt;
&lt;br /&gt;
====Revision / Architektur====&lt;br /&gt;
Die (optionalen) Buchstaben vor dem Bindestrich geben Auskunft über den Stromverbrauch und Spannungsbereich&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Buchstabe  !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| A ||  Zweite Revision - meist nur eine Umstellung der internen Strukturen ohne Auswirkung für den Benutzer&lt;br /&gt;
|-&lt;br /&gt;
| L / V ||  &amp;quot;Low-Voltage&amp;quot;: Speziell für niedrigere Taktraten (8 bzw. 10 MHz) sowie niedrigere Eingangsspannungen (1,8 bzw. 2,7V) selektierte Bausteine&lt;br /&gt;
|-&lt;br /&gt;
| P/PA ||  &amp;quot;Pico-Power&amp;quot;: Reduzierter Stromaufnahme, besonders in tiefen Sleep-Modes (&amp;lt; 1uA); Manche Bausteine (z.B. Mega48) gibt es als P und PA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Bauform====&lt;br /&gt;
Die beiden Buchstaben nach dem Bindestrich geben Auskunft über die Bauform. Die Zahl der Pins des jeweiligen Gehäusetyps hängt vom Baustein ab.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Buchstaben  !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| A ||  TQFP-Gehäuse&lt;br /&gt;
|-&lt;br /&gt;
| C ||  BGA-Gehäuse&lt;br /&gt;
|-&lt;br /&gt;
| I ||  Bleihaltig - nicht mehr erhältlich&lt;br /&gt;
|-&lt;br /&gt;
| J ||  PLCC-Gehäuse&lt;br /&gt;
|-&lt;br /&gt;
| M ||  (V)QFN- / MLF- Gehäuse&lt;br /&gt;
|-&lt;br /&gt;
| P ||  DIP-Gehäuse  (bastlerfreundlich!)&lt;br /&gt;
|-&lt;br /&gt;
| S ||  SOIC-Gehäuse&lt;br /&gt;
|-&lt;br /&gt;
| U ||  Bleifrei, RoHS-kompatibel&lt;br /&gt;
|-&lt;br /&gt;
| X ||  TSSOP-Gehäuse&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
===ATtiny===&lt;br /&gt;
Bei den ATtiny-Bausteinen ist die Nummerierung deutlich unübersichtlicher als in der ATmega-Reihe. Die erste Ziffer gibt wie auch bei ATmega die Größe des Flash-Speichers an. Die obenstehenden Tabellen für Baureihe, Bauform, Revision und Speichergröße gelten ebenfalls (Ausnahmen: ATtiny5 mit 0,5 Kilobytes Flash sowie ATtiny4 und ATtiny9 mit 0,5 bzw. 1 kB Flash). Die Zusatzfunktionen und Baugröße sind aber nicht deutlich&lt;br /&gt;
&lt;br /&gt;
== Vergleichstabelle(n) / Ausstattung ==&lt;br /&gt;
=== AT90S - Reihe ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;font-size:10px;&amp;quot; id=&amp;quot;AVR_Features_AT90S&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Typ||Flash (Kbytes)||EEPROM (Bytes)||SRAM (Bytes)||Max I/O Pins||F.max (MHz)||Vcc (V)||Analog &amp;lt;br/&amp;gt;Compa&amp;amp;shy;rator||16-bit Timer||8-bit Timer||Brown Out Detector||On Chip Oscillator||PWM Chan&amp;amp;shy;nels||RTC||Self Prog&amp;amp;shy;ram Memory||Boot Code||SPI||TWI (I2C)||UART||Watch&amp;amp;shy;dog||Bau&amp;amp;shy;form&lt;br /&gt;
|- &amp;lt;!-- START - AT90S2313 -------------------------------------&amp;gt;&lt;br /&gt;
|[http://www.atmel.com/dyn/resources/prod_documents/doc0839.pdf AT90S2313]&amp;lt;ref&amp;gt;veraltet → ATtiny2313&amp;lt;/ref&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|128&lt;br /&gt;
|128&lt;br /&gt;
|15&lt;br /&gt;
|10&lt;br /&gt;
|2.7-6.0&lt;br /&gt;
|Ja&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|1&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP20 SOIC20&lt;br /&gt;
|- &amp;lt;!-- START - AT90S2323 ---------------------------------------&amp;gt;&lt;br /&gt;
|[http://www.atmel.com/atmel/acrobat/doc1004.pdf AT90S2323]&amp;lt;ref&amp;gt;veraltet → ATtiny25/45/85&amp;lt;/ref&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|128&lt;br /&gt;
|128&lt;br /&gt;
|3&lt;br /&gt;
|10&lt;br /&gt;
|2.7-6.0&lt;br /&gt;
|Nein&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|0&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP8 SOIC8&lt;br /&gt;
|- &amp;lt;!-- START - AT90S2343 ------------------------------&amp;gt;&lt;br /&gt;
|[http://www.atmel.com/atmel/acrobat/doc1004.pdf AT90S2343]&amp;lt;ref&amp;gt;veraltet → ATtiny25/45/85&amp;lt;/ref&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|128&lt;br /&gt;
|128&lt;br /&gt;
|5&lt;br /&gt;
|10&lt;br /&gt;
|2.7-6.0&lt;br /&gt;
|Nein&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|0&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP8 SOIC8 &lt;br /&gt;
|- &amp;lt;!-- START - AT90S8515 ----------------------------------&amp;gt;&lt;br /&gt;
|[http://www.atmel.com/atmel/acrobat/doc0841.pdf AT90S8515]&amp;lt;ref&amp;gt;veraltet → ATmega16/162/32/644&amp;lt;/ref&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|512&lt;br /&gt;
|512&lt;br /&gt;
|32&lt;br /&gt;
|8&lt;br /&gt;
|2.7-6.0&lt;br /&gt;
|Ja&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|1 (16-Bit)&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP40 PLCC44 TQFP44&lt;br /&gt;
&amp;lt;!-- diesen Kommentar entfernen nach dem Kopieren dieser Eingabehilfe&lt;br /&gt;
|-&lt;br /&gt;
|Typ&lt;br /&gt;
|Flash (Kbytes)&lt;br /&gt;
|EEPROM (Bytes)&lt;br /&gt;
|SRAM (Bytes)&lt;br /&gt;
|Max I/O Pins&lt;br /&gt;
|F.max (MHz)&lt;br /&gt;
|Vcc (V)&lt;br /&gt;
|A/D Chan&amp;amp;shy;nels&lt;br /&gt;
|Ana&amp;amp;shy;log&amp;lt;br/&amp;gt;Compa&amp;amp;shy;rator&lt;br /&gt;
|16-bit Timer&lt;br /&gt;
|8-bit Timer&lt;br /&gt;
|Brown Out Detec&amp;amp;shy;tor&lt;br /&gt;
|On Chip Osci&amp;amp;shy;llator&lt;br /&gt;
|PWM Chan&amp;amp;shy;nels&lt;br /&gt;
|RTC&lt;br /&gt;
|Self Pro&amp;amp;shy;gram Memory&lt;br /&gt;
|Boot Code&lt;br /&gt;
|SPI&lt;br /&gt;
|TWI&lt;br /&gt;
|UART&lt;br /&gt;
|Watch&amp;amp;shy;dog&lt;br /&gt;
|Bau&amp;amp;shy;formen&lt;br /&gt;
|Preis&lt;br /&gt;
&amp;lt;!-- diesen Kommentar entfernen nach dem Kopieren dieser Eingabehilfe--&amp;gt;&lt;br /&gt;
&amp;lt;!-- ENDE - AT90Sxxxx ---------------------------------------------------------&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== ATtiny - Reihe ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;font-size:10px;&amp;quot; id=&amp;quot;AVR_Features_ATtiny&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
!Typ||Flash (Kbytes)||EEPROM (Bytes)||SRAM (Bytes)||Max I/O Pins||F.max (MHz)||Vcc (V)||A/D Channels||Analog Comparator||16-bit Timer||8-bit Timer||Brown Out Detector||On Chip Oscillator||PWM Channels||RTC||Self Program Memory||Boot Code||SPI||TWI (I2C)||UART||Watchdog||Bauform(en)||Preis&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/Images/doc8127.pdf ATtiny10]&lt;br /&gt;
|1&lt;br /&gt;
| --&lt;br /&gt;
|32&lt;br /&gt;
|4&lt;br /&gt;
|12&lt;br /&gt;
|1.8-5.5&lt;br /&gt;
|4 8-bit&lt;br /&gt;
|Ja&lt;br /&gt;
|1&lt;br /&gt;
| --&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|2&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|SOT23&lt;br /&gt;
| 0.83-0.99&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/dyn/resources/prod_documents/doc1006.pdf ATtiny11]&lt;br /&gt;
|1&lt;br /&gt;
| --&lt;br /&gt;
| --&lt;br /&gt;
|6&lt;br /&gt;
|6&lt;br /&gt;
|2.7-5.5&lt;br /&gt;
| --&lt;br /&gt;
|Ja&lt;br /&gt;
| --&lt;br /&gt;
|1&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
| --&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP8 SOIC8&lt;br /&gt;
| 0.58-0.87&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/dyn/resources/prod_documents/doc1006.pdf ATtiny12]&lt;br /&gt;
|1&lt;br /&gt;
|64&lt;br /&gt;
| --&lt;br /&gt;
|6&lt;br /&gt;
|8&lt;br /&gt;
|1.8-5.5&lt;br /&gt;
| --&lt;br /&gt;
|Ja&lt;br /&gt;
| --&lt;br /&gt;
|1&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
| --&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP8 SOIC8&lt;br /&gt;
| 1.00-1.20&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/Images/doc8126.pdf ATtiny13A]&lt;br /&gt;
|1&lt;br /&gt;
|64&lt;br /&gt;
|64&lt;br /&gt;
|6&lt;br /&gt;
|20&lt;br /&gt;
|1.8-5.5&lt;br /&gt;
|4 10bit&lt;br /&gt;
|Ja&lt;br /&gt;
| --&lt;br /&gt;
|1&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|1&amp;lt;ref&amp;gt;Timer-PWM&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP8 SOIC8&lt;br /&gt;
| 0.60-1.20&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/dyn/resources/prod_documents/doc1187.pdf ATtiny15]&lt;br /&gt;
|1&lt;br /&gt;
|64&lt;br /&gt;
| --&lt;br /&gt;
|6&lt;br /&gt;
|1.6&lt;br /&gt;
|2.7-5.5&lt;br /&gt;
|4 10bit&lt;br /&gt;
|Ja&lt;br /&gt;
| --&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|ONLY&lt;br /&gt;
|1&amp;lt;ref&amp;gt;150kHz 8bit&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP8 SOIC8&lt;br /&gt;
| 1.15&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/Images/Atmel-2586-AVR-8-bit-Microcontroller-ATtiny25-ATtiny45-ATtiny85_Datasheet.pdf ATtiny45]&lt;br /&gt;
|4&lt;br /&gt;
|256&lt;br /&gt;
|256&lt;br /&gt;
|6&lt;br /&gt;
|20&lt;br /&gt;
|2.7-5.5&lt;br /&gt;
|4&lt;br /&gt;
|Ja&lt;br /&gt;
| --&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|2&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP8 SOIC8&lt;br /&gt;
| 0.90-2.00&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/dyn/resources/prod_documents/doc2586.pdf ATtiny85]&lt;br /&gt;
|8&lt;br /&gt;
|512&lt;br /&gt;
|512&lt;br /&gt;
|6&lt;br /&gt;
|20&lt;br /&gt;
|1.8-5.5&lt;br /&gt;
|4&lt;br /&gt;
|Ja&lt;br /&gt;
| --&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|4&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP8 SOIC8&lt;br /&gt;
| 0.90-2.00&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/dyn/resources/prod_documents/doc2543.pdf ATtiny2313]&lt;br /&gt;
|2&lt;br /&gt;
|128&lt;br /&gt;
|128&lt;br /&gt;
|18&lt;br /&gt;
|20&lt;br /&gt;
|2.7-5.5&lt;br /&gt;
| --&lt;br /&gt;
|Ja&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|4&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;usip&amp;quot;&amp;gt;+USI&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;usi&amp;quot;&amp;gt;USI&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;usart&amp;quot;&amp;gt;USART&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP20 SOIC20 QFN20 MLF20&lt;br /&gt;
| 1.30&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/Images/doc8246.pdf ATtiny4313]&lt;br /&gt;
|4&lt;br /&gt;
|256&lt;br /&gt;
|256&lt;br /&gt;
|18&lt;br /&gt;
|20&lt;br /&gt;
|1.8-5.5&lt;br /&gt;
| --&lt;br /&gt;
|Ja&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|4&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;usip&amp;quot;&amp;gt;+USI&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;usi&amp;quot;&amp;gt;USI&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;usart&amp;quot;&amp;gt;USART&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP20 SOIC20 QFN20 MLF20&lt;br /&gt;
| 1.00-2.00&lt;br /&gt;
|-&lt;br /&gt;
|[http://atmel.com/dyn/resources/prod_documents/doc8006.pdf ATtiny24]&lt;br /&gt;
|2&lt;br /&gt;
|128&lt;br /&gt;
|128&lt;br /&gt;
|12&lt;br /&gt;
|20&lt;br /&gt;
|2.7-5.5&lt;br /&gt;
|8 10bit&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|4&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;usip&amp;quot;&amp;gt;+USI&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;usi&amp;quot;&amp;gt;USI&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP14 SOIC14 QFN20/MLF20&lt;br /&gt;
|0.85&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/Images/doc8183.pdf ATtiny84A]&lt;br /&gt;
|8&lt;br /&gt;
|512&lt;br /&gt;
|512&lt;br /&gt;
|12&lt;br /&gt;
|20&lt;br /&gt;
|1.8-5.5&lt;br /&gt;
|8 10bit&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|4&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;usip&amp;quot;&amp;gt;+USI&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;usi&amp;quot;&amp;gt;USI&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP14 SOIC14 QFN20/MLF20&lt;br /&gt;
|1,00-4,00&lt;br /&gt;
|-&lt;br /&gt;
|[http://atmel.com/dyn/resources/prod_documents/doc2588.pdf  ATtiny261]&lt;br /&gt;
|2&lt;br /&gt;
|128&lt;br /&gt;
|128&lt;br /&gt;
|16&lt;br /&gt;
|20&lt;br /&gt;
|1,8-5,5&lt;br /&gt;
|11&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|2&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;usip&amp;quot;&amp;gt;+USI&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;usi&amp;quot;&amp;gt;USI&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP20 SOIC20 MLF20 (TSSOP20 bei Tiny261A)&lt;br /&gt;
|1,15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== ATmega - Reihe ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;font-size: 10px;&amp;quot; id=&amp;quot;AVR_Features_ATMega&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
!Typ||Flash &amp;lt;br/&amp;gt;(Kbytes)||EEPROM &amp;lt;br/&amp;gt;(Bytes)||SRAM &amp;lt;br/&amp;gt;(Bytes)||Max I/O &amp;lt;br/&amp;gt;Pins||F.max &amp;lt;br/&amp;gt;(MHz)||Vcc (V)||A/D &amp;lt;br/&amp;gt;Chan&amp;amp;shy;nels||Ana&amp;amp;shy;log &amp;lt;br/&amp;gt;Compa&amp;amp;shy;rator||16-bit &amp;lt;br/&amp;gt;Timer||8-bit &amp;lt;br/&amp;gt;Timer||Brown Out Detec&amp;amp;shy;tor||On Chip Oscillator||PWM Chan&amp;amp;shy;nels||RTC||Self Pro&amp;amp;shy;gram Memory||Boot Code||SPI||TWI (I2C)||UART||Watch&amp;amp;shy;dog||Bau&amp;amp;shy;form||Preis&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/dyn/resources/prod_documents/2486S.pdf ATmega8]&amp;lt;br&amp;gt;[http://www.atmel.com/Images/Atmel-8159-8-bit-AVR-microcontroller-ATmega8A_datasheet.pdf ATmega8A]&lt;br /&gt;
|8&lt;br /&gt;
|512&lt;br /&gt;
|1K&lt;br /&gt;
|23&lt;br /&gt;
|16&lt;br /&gt;
|2.7-5.5&lt;br /&gt;
|6 10bit PDIP&amp;lt;br/&amp;gt;8 10bit TQFP QFN/MLF&lt;br /&gt;
|Ja&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|3&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;br/&amp;gt;USART&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP28 TQFP32 QFN/MLF32&lt;br /&gt;
| 1.50-4.00&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/dyn/resources/prod_documents/doc2466.pdf ATmega16]&lt;br /&gt;
|16&lt;br /&gt;
|512&lt;br /&gt;
|1K&lt;br /&gt;
|32&lt;br /&gt;
|16&lt;br /&gt;
|2.7-5.5&lt;br /&gt;
|8 10bit&lt;br /&gt;
|Ja&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|4&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;ms&amp;quot;&amp;gt;Master/Slave&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|1&amp;lt;ref name=&amp;quot;usart&amp;quot;&amp;gt;USART&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP40 TQFP44 QFN/MLF44&lt;br /&gt;
| 2.60-2.85&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/dyn/resources/prod_documents/doc2513.pdf ATmega162]&lt;br /&gt;
|16&lt;br /&gt;
|512&lt;br /&gt;
|1K&lt;br /&gt;
|35&lt;br /&gt;
|16&lt;br /&gt;
|2.7-5.5&lt;br /&gt;
|Keine&lt;br /&gt;
|Ja&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|6&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;ms&amp;quot;&amp;gt;Master/Slave&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Nein&lt;br /&gt;
|2&amp;lt;ref name=&amp;quot;usart&amp;quot;&amp;gt;USART&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP40 TQFP44 QFN/MLF44&lt;br /&gt;
| 2.70-3.80&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/dyn/resources/prod_documents/doc2503.pdf ATmega32]&lt;br /&gt;
|32&lt;br /&gt;
|1K&lt;br /&gt;
|2K&lt;br /&gt;
|32&lt;br /&gt;
|16&lt;br /&gt;
|2.7-5.5&lt;br /&gt;
|8 10bit&lt;br /&gt;
|Ja&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|4&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;ms&amp;quot;&amp;gt;Master/Slave&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|1&amp;lt;ref name=&amp;quot;usart&amp;quot;&amp;gt;USART&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP40 TQFP44 QFN/MLF44&lt;br /&gt;
| 3.20-4.60&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/Images/doc8271.pdf ATmega48A]&lt;br /&gt;
|4&lt;br /&gt;
|256&lt;br /&gt;
|512&lt;br /&gt;
|23&lt;br /&gt;
|20&lt;br /&gt;
|1.8-5.5&lt;br /&gt;
|6 10bit PDIP&amp;lt;br/&amp;gt;8 10bit TQFP QFN/MLF&lt;br /&gt;
|Ja&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|6&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;ms&amp;quot;&amp;gt;Master/Slave&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|1&amp;lt;ref name=&amp;quot;usart&amp;quot;&amp;gt;USART&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP28 TQFP32 QFN/MLF32&lt;br /&gt;
| 2.00-4.50&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/Images/doc8271.pdf ATmega88A]&lt;br /&gt;
|8&lt;br /&gt;
|512&lt;br /&gt;
|1K&lt;br /&gt;
|23&lt;br /&gt;
|20&lt;br /&gt;
|1.8-5.5&lt;br /&gt;
|6 10bit PDIP&amp;lt;br/&amp;gt;8 10bit TQFP QFN/MLF&lt;br /&gt;
|Ja&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|6&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;ms&amp;quot;&amp;gt;Master/Slave&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|1&amp;lt;ref name=&amp;quot;usart&amp;quot;&amp;gt;USART&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP28 TQFP32 QFN/MLF32&lt;br /&gt;
| 2.00-4.50&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.atmel.com/Images/doc8011.pdf ATmega164]&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|PDIP40 TQFP44 QFN/MLF44&lt;br /&gt;
| 2.00-4.50&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.atmel.com/Images/doc8271.pdf ATmega168A]&lt;br /&gt;
|16&lt;br /&gt;
|512&lt;br /&gt;
|1K&lt;br /&gt;
|23&lt;br /&gt;
|20&lt;br /&gt;
|1.8-5.5&lt;br /&gt;
|6 10bit PDIP&amp;lt;br/&amp;gt;8 10bit TQFP QFN/MLF&lt;br /&gt;
|Ja&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|6&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;ms&amp;quot;&amp;gt;Master/Slave&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|1&amp;lt;ref name=&amp;quot;usart&amp;quot;&amp;gt;USART&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP28 TQFP32 QFN/MLF32&lt;br /&gt;
| 2.00-4.50&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|[http://www.atmel.com/Images/doc8271.pdf ATmega328]&lt;br /&gt;
|32&lt;br /&gt;
|1K&lt;br /&gt;
|2K&lt;br /&gt;
|23&lt;br /&gt;
|20&lt;br /&gt;
|1.8-5.5&lt;br /&gt;
|6 10bit PDIP&amp;lt;br/&amp;gt;8 10bit TQFP QFN/MLF&lt;br /&gt;
|Ja&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|6&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;ms&amp;quot;&amp;gt;Master/Slave&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|1&amp;lt;ref name=&amp;quot;usart&amp;quot;&amp;gt;USART&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP28 TQFP32 QFN/MLF32&lt;br /&gt;
| 2.00-4.50&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/Images/doc8272.pdf ATmega324A]&lt;br /&gt;
|32&lt;br /&gt;
|1K&lt;br /&gt;
|2K&lt;br /&gt;
|32&lt;br /&gt;
|20&lt;br /&gt;
|1.8-5.5&lt;br /&gt;
|8 10bit&lt;br /&gt;
|Ja&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|6&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;ms&amp;quot;&amp;gt;Master/Slave&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP40 TQFP44 VQFN44 QFN/MLF44 DRQFN44 VFBGA49&lt;br /&gt;
| 3.50-4.50&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/atmel/acrobat/doc2490.pdf ATmega64]&amp;lt;ref&amp;gt;Geliefert im ATmega103-Modus. Fuse ändern!&amp;lt;/ref&amp;gt;&lt;br /&gt;
|64&lt;br /&gt;
|2K&lt;br /&gt;
|4K&lt;br /&gt;
|53&lt;br /&gt;
|16&lt;br /&gt;
|2.7-5.5&lt;br /&gt;
|8 10bit&lt;br /&gt;
|Ja&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|2 8bit, 6 2-16bit&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;ms&amp;quot;&amp;gt;Master/Slave&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|1&amp;lt;ref name=&amp;quot;usart&amp;quot;&amp;gt;USART&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
| TQFP64 QFN/MLF64&lt;br /&gt;
| 7.50-9.50&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/dyn/resources/prod_documents/doc2593.pdf  ATmega644]&lt;br /&gt;
|64&lt;br /&gt;
|2K&lt;br /&gt;
|4K&lt;br /&gt;
|32&lt;br /&gt;
|20&lt;br /&gt;
|1.8-5.5&lt;br /&gt;
|8 10bit&lt;br /&gt;
|Ja&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|6&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;ms&amp;quot;&amp;gt;Master/Slave&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|1&amp;lt;ref name=&amp;quot;usart&amp;quot;&amp;gt;USART&amp;lt;/ref&amp;gt; 2&amp;lt;ref&amp;gt;beim 644P&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP40 TQFP44 QFN/MLF44&lt;br /&gt;
| 6.80-7.50&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/dyn/resources/prod_documents/doc2467.pdf ATmega128]&lt;br /&gt;
|128&lt;br /&gt;
|4K&lt;br /&gt;
|4K&lt;br /&gt;
|53&lt;br /&gt;
|16&lt;br /&gt;
|2.7-5.5&lt;br /&gt;
|8 10bit&lt;br /&gt;
|Ja&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|2 8bit&amp;lt;br/&amp;gt;6 2-16bit&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;ms&amp;quot;&amp;gt;Master/Slave&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|2&amp;lt;ref name=&amp;quot;usart&amp;quot;&amp;gt;USART&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|TQFP64 QFN/MLF64&lt;br /&gt;
|8.05-8.40  &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/dyn/products/product_card.asp?part_id=4331 ATmega1284P]&lt;br /&gt;
|128&lt;br /&gt;
|4K&lt;br /&gt;
|16K&lt;br /&gt;
|32&lt;br /&gt;
|20&lt;br /&gt;
|1.8-5.5&lt;br /&gt;
|8 10bit&lt;br /&gt;
|Ja&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|6 &lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;ms&amp;quot;&amp;gt;Master/Slave&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|2&amp;lt;ref name=&amp;quot;usart&amp;quot;&amp;gt;USART&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP40 TQFP44 QFN/MLF44&lt;br /&gt;
|5.00-7.00&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/dyn/resources/prod_documents/doc2549.pdf ATmega2560]&lt;br /&gt;
|256&lt;br /&gt;
|4K&lt;br /&gt;
|8K&lt;br /&gt;
|86&lt;br /&gt;
|16&lt;br /&gt;
|2.7-5.5&lt;br /&gt;
|16 10bit&lt;br /&gt;
|Ja&lt;br /&gt;
|4&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|16&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;ms&amp;quot;&amp;gt;Master/Slave&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|4&amp;lt;ref name=&amp;quot;usart&amp;quot;&amp;gt;USART&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|TQFP100&lt;br /&gt;
|8.00-15.00&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/atmel/acrobat/doc2512.pdf ATmega8515]&lt;br /&gt;
|8&lt;br /&gt;
|512&lt;br /&gt;
|512&lt;br /&gt;
|35&lt;br /&gt;
|16&lt;br /&gt;
|2.7-5.5&lt;br /&gt;
|Keine&lt;br /&gt;
|Ja&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|1 8-bit, 1 16-bit&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;ms&amp;quot;&amp;gt;Master/Slave&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Nein&lt;br /&gt;
|1&amp;lt;ref name=&amp;quot;usart&amp;quot;&amp;gt;USART&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP40 TQFP44 PLCC44 QFN/MLF44&lt;br /&gt;
|3.20-3.90&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/atmel/acrobat/doc2502.pdf ATmega8535]&lt;br /&gt;
|8&lt;br /&gt;
|512&lt;br /&gt;
|512&lt;br /&gt;
|32&lt;br /&gt;
|16&lt;br /&gt;
|2.7-5.5&lt;br /&gt;
|8 10bit&lt;br /&gt;
|Ja&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|2 8-bit, 2 16-bit&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;ms&amp;quot;&amp;gt;Master/Slave&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|1&amp;lt;ref name=&amp;quot;usart&amp;quot;&amp;gt;USART&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP44 PLCC44 QFN/MLF44&lt;br /&gt;
|3.15-3.75&lt;br /&gt;
&amp;lt;!-- START - ATMegaxxxx -------------------------------------------------------&amp;gt;&lt;br /&gt;
&amp;lt;!-- diesen Kommentar entfernen nach dem Kopieren dieser Eingabehilfe -- &amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Typ&lt;br /&gt;
|Flash (Kbytes)&lt;br /&gt;
|EEPROM (Bytes)&lt;br /&gt;
|SRAM (Bytes)&lt;br /&gt;
|Max I/O Pins&lt;br /&gt;
|F.max (MHz)&lt;br /&gt;
|Vcc (V)&lt;br /&gt;
|A/D Channels&lt;br /&gt;
|Analog Comparator&lt;br /&gt;
|16-bit Timer&lt;br /&gt;
|8-bit Timer&lt;br /&gt;
|Brown Out Detector&lt;br /&gt;
|On Chip Oscillator&lt;br /&gt;
|PWM Channels&lt;br /&gt;
|RTC&lt;br /&gt;
|Self Program Memory&lt;br /&gt;
|Boot Code&lt;br /&gt;
|SPI&lt;br /&gt;
|TWI&lt;br /&gt;
|UART&lt;br /&gt;
|Watchdog&lt;br /&gt;
|Bauform(en)&lt;br /&gt;
|Preis&lt;br /&gt;
&amp;lt;!-- diesen Kommentar entfernen nach dem Kopieren dieser Eingabehilfe--&amp;gt;&lt;br /&gt;
&amp;lt;!-- ENDE - ATMegaxxxx --------------------------------------------------------&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die angegebenen Preise sind Richtwerte. Es empfiehlt sich die Verwendung einer Preissuchmaschine, z.B. [http://www.google.de/shopping google.de/shopping].&lt;br /&gt;
&lt;br /&gt;
=== ATXMega - Reihe ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;font-size: 10px;&amp;quot; id=&amp;quot;AVR_Features_ATXMega&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
!Typ||Flash &amp;lt;br/&amp;gt;(Kbytes)||EEPROM &amp;lt;br/&amp;gt;(KBytes)||SRAM &amp;lt;br/&amp;gt;(KBytes)||Boot &amp;lt;br/&amp;gt;(Kbytes)||Max I/O &amp;lt;br/&amp;gt;Pins||F.max &amp;lt;br/&amp;gt;(MHz)||Vcc (V)||ADC||DAC||PWM &amp;lt;br/&amp;gt;Channels||16-Bit &amp;lt;br/&amp;gt;Timer||SPI||TWI&amp;lt;br/&amp;gt;(I2C)||UART||Bau&amp;amp;shy;formen&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega16a4&lt;br /&gt;
|16&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|4&lt;br /&gt;
|34&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|12-CH @ 12-Bit&lt;br /&gt;
|2-CH @ 12-Bit&lt;br /&gt;
|16&lt;br /&gt;
|5&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|5&lt;br /&gt;
|TQFP44&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega32a4&lt;br /&gt;
|32&lt;br /&gt;
|1&lt;br /&gt;
|4&lt;br /&gt;
|4&lt;br /&gt;
|34&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|12-CH @ 12-Bit&lt;br /&gt;
|2-CH @ 12-Bit&lt;br /&gt;
|16&lt;br /&gt;
|5&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|5&lt;br /&gt;
|TQFP44&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega64a4&lt;br /&gt;
|64&lt;br /&gt;
|2&lt;br /&gt;
|4&lt;br /&gt;
|4&lt;br /&gt;
|34&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|12-CH @ 12-Bit&lt;br /&gt;
|2-CH @ 12-Bit&lt;br /&gt;
|16&lt;br /&gt;
|5&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|5&lt;br /&gt;
|TQFP44&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega128a4&lt;br /&gt;
|128&lt;br /&gt;
|2&lt;br /&gt;
|8&lt;br /&gt;
|8&lt;br /&gt;
|34&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|12-CH @ 12-Bit&lt;br /&gt;
|2-CH @ 12-Bit&lt;br /&gt;
|16&lt;br /&gt;
|5&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|5&lt;br /&gt;
|TQFP44&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega64a3&lt;br /&gt;
|64&lt;br /&gt;
|2&lt;br /&gt;
|4&lt;br /&gt;
|4&lt;br /&gt;
|50&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|2x 8-CH @ 12-Bit&lt;br /&gt;
|2-CH @ 12-Bit&lt;br /&gt;
|22&lt;br /&gt;
|7&lt;br /&gt;
|3&lt;br /&gt;
|2&lt;br /&gt;
|7&lt;br /&gt;
|TQFP64&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega128a3&lt;br /&gt;
|128&lt;br /&gt;
|2&lt;br /&gt;
|8&lt;br /&gt;
|8&lt;br /&gt;
|50&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|2x 8-CH @ 12-Bit&lt;br /&gt;
|2-CH @ 12-Bit&lt;br /&gt;
|22&lt;br /&gt;
|7&lt;br /&gt;
|3&lt;br /&gt;
|2&lt;br /&gt;
|7&lt;br /&gt;
|TQFP64&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega192a3&lt;br /&gt;
|192&lt;br /&gt;
|2&lt;br /&gt;
|16&lt;br /&gt;
|8&lt;br /&gt;
|50&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|2x 8-CH @ 12-Bit&lt;br /&gt;
|2-CH @ 12-Bit&lt;br /&gt;
|22&lt;br /&gt;
|7&lt;br /&gt;
|3&lt;br /&gt;
|2&lt;br /&gt;
|7&lt;br /&gt;
|TQFP64&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega256a3&lt;br /&gt;
|256&lt;br /&gt;
|4&lt;br /&gt;
|16&lt;br /&gt;
|8&lt;br /&gt;
|50&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|2x 8-CH @ 12-Bit&lt;br /&gt;
|2-CH @ 12-Bit&lt;br /&gt;
|22&lt;br /&gt;
|7&lt;br /&gt;
|3&lt;br /&gt;
|2&lt;br /&gt;
|7&lt;br /&gt;
|TQFP64&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega64a1&lt;br /&gt;
|64&lt;br /&gt;
|2&lt;br /&gt;
|4&lt;br /&gt;
|4&lt;br /&gt;
|78&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|2x 8-CH @ 12-Bit&lt;br /&gt;
|2x 2-CH @ 12-Bit&lt;br /&gt;
|24&lt;br /&gt;
|8&lt;br /&gt;
|4&lt;br /&gt;
|4&lt;br /&gt;
|8&lt;br /&gt;
|TQFP100&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega128a1&lt;br /&gt;
|128&lt;br /&gt;
|2&lt;br /&gt;
|8&lt;br /&gt;
|8&lt;br /&gt;
|78&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|2x 8-CH @ 12-Bit&lt;br /&gt;
|2x 2-CH @ 12-Bit&lt;br /&gt;
|24&lt;br /&gt;
|8&lt;br /&gt;
|4&lt;br /&gt;
|4&lt;br /&gt;
|8&lt;br /&gt;
|TQFP100&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega192a1&lt;br /&gt;
|192&lt;br /&gt;
|2&lt;br /&gt;
|16&lt;br /&gt;
|8&lt;br /&gt;
|78&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|2x 8-CH @ 12-Bit&lt;br /&gt;
|2x 2-CH @ 12-Bit&lt;br /&gt;
|24&lt;br /&gt;
|8&lt;br /&gt;
|4&lt;br /&gt;
|4&lt;br /&gt;
|8&lt;br /&gt;
|TQFP100&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega256a1&lt;br /&gt;
|256&lt;br /&gt;
|4&lt;br /&gt;
|16&lt;br /&gt;
|8&lt;br /&gt;
|78&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|2x 8-CH @ 12-Bit&lt;br /&gt;
|2x 2-CH @ 12-Bit&lt;br /&gt;
|24&lt;br /&gt;
|8&lt;br /&gt;
|4&lt;br /&gt;
|4&lt;br /&gt;
|8&lt;br /&gt;
|TQFP100&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega384a1&lt;br /&gt;
|384&lt;br /&gt;
|4&lt;br /&gt;
|32&lt;br /&gt;
|8&lt;br /&gt;
|78&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|2x 8-CH @ 12-Bit&lt;br /&gt;
|2x 2-CH @ 12-Bit&lt;br /&gt;
|24&lt;br /&gt;
|8&lt;br /&gt;
|4&lt;br /&gt;
|4&lt;br /&gt;
|8&lt;br /&gt;
|TQFP100&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega16d4&lt;br /&gt;
|16&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|4&lt;br /&gt;
|34&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|12-CH @ 12-Bit&lt;br /&gt;
|0&lt;br /&gt;
|16&lt;br /&gt;
|4&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|TQFP44&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega32d4&lt;br /&gt;
|32&lt;br /&gt;
|1&lt;br /&gt;
|4&lt;br /&gt;
|4&lt;br /&gt;
|34&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|12-CH @ 12-Bit&lt;br /&gt;
|0&lt;br /&gt;
|16&lt;br /&gt;
|4&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|TQFP44&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega64d4&lt;br /&gt;
|64&lt;br /&gt;
|2&lt;br /&gt;
|4&lt;br /&gt;
|4&lt;br /&gt;
|34&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|12-CH @ 12-Bit&lt;br /&gt;
|0&lt;br /&gt;
|16&lt;br /&gt;
|4&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|TQFP44&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega128d4&lt;br /&gt;
|128&lt;br /&gt;
|2&lt;br /&gt;
|8&lt;br /&gt;
|8&lt;br /&gt;
|34&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|12-CH @ 12-Bit&lt;br /&gt;
|0&lt;br /&gt;
|16&lt;br /&gt;
|4&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|TQFP44&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega64d3&lt;br /&gt;
|64&lt;br /&gt;
|2&lt;br /&gt;
|4&lt;br /&gt;
|4&lt;br /&gt;
|50&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|16-CH @ 12-Bit&lt;br /&gt;
|0&lt;br /&gt;
|18&lt;br /&gt;
|5&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|3&lt;br /&gt;
|TQFP64&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega128d3&lt;br /&gt;
|128&lt;br /&gt;
|2&lt;br /&gt;
|8&lt;br /&gt;
|8&lt;br /&gt;
|50&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|16-CH @ 12-Bit&lt;br /&gt;
|0&lt;br /&gt;
|18&lt;br /&gt;
|5&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|3&lt;br /&gt;
|TQFP64&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega192d3&lt;br /&gt;
|192&lt;br /&gt;
|2&lt;br /&gt;
|16&lt;br /&gt;
|8&lt;br /&gt;
|50&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|16-CH @ 12-Bit&lt;br /&gt;
|0&lt;br /&gt;
|18&lt;br /&gt;
|5&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|3&lt;br /&gt;
|TQFP64&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega256d3&lt;br /&gt;
|256&lt;br /&gt;
|4&lt;br /&gt;
|16&lt;br /&gt;
|8&lt;br /&gt;
|50&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|16-CH @ 12-Bit&lt;br /&gt;
|0&lt;br /&gt;
|18&lt;br /&gt;
|5&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|3&lt;br /&gt;
|TQFP64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Weitere Vergleichstabellen ==&lt;br /&gt;
Vergleichstabellen zum Downloaden gibt es unter Anderem&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/242328 von Andreas], Stand 19.12.2011; vollständig,&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/232939 von Sven], Stand 22.09.2011; weiter eingedampft.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ATtiny ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Device-specific Features&#039;&#039;&#039;&amp;lt;br/&amp;gt;&amp;amp;nbsp;&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
! Device&lt;br /&gt;
! Flash [KiB]&lt;br /&gt;
! Pin Anz&amp;amp;shy;ahl&lt;br /&gt;
! Max. &amp;amp;fnof;&amp;lt;sub&amp;gt;CPU&amp;lt;/sub&amp;gt; [MHz]&lt;br /&gt;
! of Touch Kan&amp;amp;shy;äle&lt;br /&gt;
! Hard&amp;amp;shy;ware Qtouch&lt;br /&gt;
! Max I/O Pins&lt;br /&gt;
! Ext Inter&amp;amp;shy;rupts&lt;br /&gt;
! SPI&lt;br /&gt;
! TWI&lt;br /&gt;
! UART&lt;br /&gt;
! LIN&lt;br /&gt;
! ADC Kan&amp;amp;shy;äle&lt;br /&gt;
! ADC Auf&amp;amp;shy;lö&amp;amp;shy;sung [bits]&lt;br /&gt;
! ADC Speed [ksps]&lt;br /&gt;
! Temp. Sensor&lt;br /&gt;
! SRAM [KiB]&lt;br /&gt;
! EEPROM [Bytes]&lt;br /&gt;
! Self Pro&amp;amp;shy;gram Memory&lt;br /&gt;
! pico&amp;amp;shy;Power&lt;br /&gt;
! Temp. Bereich [°C]&lt;br /&gt;
! I/O Supply Class [V]&lt;br /&gt;
! Opera&amp;amp;shy;ting Volt&amp;amp;shy;age [V&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt;]&lt;br /&gt;
! Timers&lt;br /&gt;
! Output Com&amp;amp;shy;pare Kan&amp;amp;shy;äle&lt;br /&gt;
! Input Capt&amp;amp;shy;ure Kan&amp;amp;shy;äle&lt;br /&gt;
! PWM Kan&amp;amp;shy;äle&lt;br /&gt;
! 32kHz RTC&lt;br /&gt;
! Device&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny28L&#039;&#039;&#039; || 2 || 28 || 4 || &amp;amp;mdash; || &amp;amp;mdash; || 11 || 10 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || &amp;amp;mdash; || 0.03 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1 || 0 || 0 || 0 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny28L&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny26&#039;&#039;&#039; || 2 || 20 || 16 || &amp;amp;mdash; || &amp;amp;mdash; || 16 || 11 || 1 || 1 || 0 || 0 || 11 || 10 || 15 || &amp;amp;mdash; || 0.12 || 128 || &amp;amp;mdash; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 3 || 0 || 4 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny26&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny13&#039;&#039;&#039; || 1 || 8 || 20 || &amp;amp;mdash; || &amp;amp;mdash; || 6 || 6 || 0 || 0 || 0 || 0 || 4 || 10 || 15 || &amp;amp;mdash; || 0.06 || 64 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1 || 2 || 0 || 2 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny13&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny2313&#039;&#039;&#039; || 2 || 20 || 20 || 4 || &amp;amp;mdash; || 18 || 18 || 2 || 1 || 1 || 0 || 0 || 0 || 15 || &amp;amp;mdash; || 0.12 || 128 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 4 || 1 || 4 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny2313&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny25&#039;&#039;&#039; || 2 || 8 || 20 || 4 || &amp;amp;mdash; || 6 || 6 || 1 || 1 || 0 || 0 || 4 || 10 || 15 || &amp;amp;radic; || 0.12 || 128 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;105 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 5 || 0 || 6 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny25&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny85&#039;&#039;&#039; || 8 || 8 || 20 || 3 || &amp;amp;mdash; || 6 || 6 || 1 || 1 || 0 || 0 || 4 || 10 || 15 || &amp;amp;radic; || 0.5 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 5 || 0 || 6 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny85&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny45&#039;&#039;&#039; || 4 || 8 || 20 || 3 || &amp;amp;mdash; || 6 || 6 || 1 || 1 || 0 || 0 || 4 || 10 || 15 || &amp;amp;radic; || 0.25 || 256 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 5 || 0 || 6 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny45&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny24&#039;&#039;&#039; || 2 || 14 || 20 || 4 || &amp;amp;mdash; || 12 || 12 || 1 || 1 || 0 || 0 || 8 || 10 || 15 || &amp;amp;radic; || 0.12 || 128 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 4 || 1 || 4 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny24&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny44&#039;&#039;&#039; || 4 || 14 || 20 || 6 || &amp;amp;mdash; || 12 || 12 || 1 || 1 || 0 || 0 || 8 || 10 || 15 || &amp;amp;radic; || 0.25 || 256 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 4 || 1 || 4 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny44&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny84&#039;&#039;&#039; || 8 || 14 || 20 || 6 || &amp;amp;mdash; || 12 || 12 || 1 || 1 || 0 || 0 || 8 || 10 || 15 || &amp;amp;radic; || 0.5 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 4 || 1 || 4 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny84&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny261&#039;&#039;&#039; || 2 || 20 || 20 || 4 || &amp;amp;mdash; || 16 || 16 || 1 || 1 || 0 || 0 || 11 || 10 || 15 || &amp;amp;radic; || 0.12 || 128 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 6 || 1 || 6 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny261&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny461&#039;&#039;&#039; || 4 || 20 || 20 || 8 || &amp;amp;mdash; || 16 || 16 || 1 || 1 || 0 || 0 || 11 || 10 || 15 || &amp;amp;radic; || 0.25 || 256 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 6 || 1 || 6 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny461&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny861&#039;&#039;&#039; || 8 || 20 || 20 || 8 || &amp;amp;mdash; || 16 || 16 || 1 || 1 || 0 || 0 || 11 || 10 || 15 || &amp;amp;radic; || 0.5 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 6 || 1 || 6 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny861&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny13A&#039;&#039;&#039; || 1 || 8 || 20 || &amp;amp;mdash; || &amp;amp;mdash; || 6 || 6 || 0 || 0 || 0 || 0 || 4 || 10 || 15 || &amp;amp;mdash; || 0.06 || 64 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;125 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1 || 2 || 0 || 2 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny13A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny48&#039;&#039;&#039; || 4 || 32 || 12 || 12 || &amp;amp;mdash; || 28 || 28 || 1 || 1 || 0 || 0 || 8 || 10 || 15 || &amp;amp;radic; || 0.25 || 64 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 4 || 1 || 2 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny48&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny88&#039;&#039;&#039; || 8 || 32 || 12 || 12 || &amp;amp;mdash; || 28 || 28 || 1 || 1 || 0 || 0 || 8 || 10 || 15 || &amp;amp;radic; || 0.5 || 64 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 4 || 1 || 2 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny88&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny24A&#039;&#039;&#039; || 2 || 14 || 20 || 4 || &amp;amp;mdash; || 12 || 12 || 1 || 1 || 0 || 0 || 8 || 10 || 15 || &amp;amp;radic; || 0.12 || 128 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 4 || 1 || 4 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny24A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny44A&#039;&#039;&#039; || 4 || 14 || 20 || 6 || &amp;amp;mdash; || 12 || 12 || 1 || 1 || 0 || 0 || 8 || 10 || 15 || &amp;amp;radic; || 0.25 || 256 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 4 || 1 || 4 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny44A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny43U&#039;&#039;&#039; || 4 || 20 || 8 || 8 || &amp;amp;mdash; || 16 || 16 || 1 || 1 || 0 || 0 || 4 || 10 || 15 || &amp;amp;radic; || 0.25 || 64 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 0.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 0.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 4 || 0 || 4 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny43U&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny10&#039;&#039;&#039; || 1 || 6 || 12 || 1 || &amp;amp;mdash; || 4 || 4 || 0 || 0 || 0 || 0 || 4 || 8 || 15 || &amp;amp;mdash; || 0.03 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;125 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1 || 2 || 1 || 2 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny10&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny4&#039;&#039;&#039; || 0.5 || 6 || 12 || 1 || &amp;amp;mdash; || 4 || 4 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || &amp;amp;mdash; || 0.03 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;125 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1 || 2 || 1 || 2 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny4&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny5&#039;&#039;&#039; || 0.5 || 6 || 12 || 1 || &amp;amp;mdash; || 4 || 4 || 0 || 0 || 0 || 0 || 4 || 8 || 15 || &amp;amp;mdash; || 0.03 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;125 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1 || 2 || 1 || 2 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny5&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny9&#039;&#039;&#039; || 1 || 6 || 12 || 1 || &amp;amp;mdash; || 4 || 4 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || &amp;amp;mdash; || 0.03 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;125 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1 || 2 || 1 || 2 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny9&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny261A&#039;&#039;&#039; || 2 || 20 || 20 || 4 || &amp;amp;mdash; || 16 || 16 || 1 || 1 || 0 || 0 || 11 || 10 || 15 || &amp;amp;radic; || 0.12 || 128 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;105 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 6 || 1 || 6 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny261A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny461A&#039;&#039;&#039; || 4 || 20 || 20 || 8 || &amp;amp;mdash; || 16 || 16 || 1 || 1 || 0 || 0 || 11 || 10 || 15 || &amp;amp;radic; || 0.25 || 256 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 6 || 1 || 6 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny461A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny861A&#039;&#039;&#039; || 8 || 20 || 20 || 8 || &amp;amp;mdash; || 16 || 16 || 1 || 1 || 0 || 0 || 11 || 10 || 15 || &amp;amp;radic; || 0.5 || 512 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 6 || 1 || 6 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny861A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny2313A&#039;&#039;&#039; || 2 || 20 || 20 || &amp;amp;mdash; || &amp;amp;mdash; || 18 || 18 || 2 || 1 || 1 || 0 || 0 || 0 || 15 || &amp;amp;mdash; || 0.12 || 128 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 4 || 1 || 4 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny2313A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny4313&#039;&#039;&#039; || 4 || 20 || 20 || &amp;amp;mdash; || &amp;amp;mdash; || 18 || 18 || 2 || 1 || 1 || 0 || 0 || 0 || 15 || &amp;amp;mdash; || 0.25 || 256 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 4 || 1 || 4 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny4313&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny167&#039;&#039;&#039; || 16 || 20 || 16 || 8 || &amp;amp;mdash; || 16 || 16 || 2 || 1 || 1 || 1 || 11 || 10 || 15 || &amp;amp;radic; || 0.5 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 3 || 1 || 9 || &amp;amp;radic; || &#039;&#039;&#039;ATtiny167&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny87&#039;&#039;&#039; || 8 || 20 || 16 || &amp;amp;mdash; || &amp;amp;mdash; || 16 || 16 || 2 || 1 || 1 || 1 || 11 || 10 || 15 || &amp;amp;radic; || 0.5 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 3 || 1 || 9 || &amp;amp;radic; || &#039;&#039;&#039;ATtiny87&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny20&#039;&#039;&#039; || 2 || 14 || 12 || 5 || &amp;amp;radic; || 12 || 12 || 1 || 1 || 0 || 0 || 8 || 10 || 15 || &amp;amp;radic; || 0.12 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 4 || 1 || 3 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny20&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny40&#039;&#039;&#039; || 4 || 20 || 12 || 12 || &amp;amp;radic; || 18 || 18 || 1 || 1 || 0 || 0 || 12 || 10 || 15 || &amp;amp;radic; || 0.25 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 4 || 1 || 2 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny40&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny84A&#039;&#039;&#039; || 8 || 14 || 20 || 6 || &amp;amp;mdash; || 12 || 12 || 1 || 1 || 0 || 0 || 8 || 10 || 15 || &amp;amp;radic; || 0.5 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 4 || 1 || 4 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny84A&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;General Features&#039;&#039;&#039;&amp;lt;br/&amp;gt;&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;CPU&#039;&#039;&#039; || 8-bit AVR&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Quadrature Decoder Kanäle&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;USB Transceiver&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;USB Speed&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;USB Interface&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;CAN&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;SSC&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Ethernet&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;SD / eMMC&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Segment LCD&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Grafik LCD&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Video Decoder&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Kamera Interface&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Analog Comparators&#039;&#039;&#039; || 1&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Resistive Touch Screen&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;DAC Kanäle&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;DAC Auflösung [bits]&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;External Bus Interface&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;DRAM Memory&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;NAND Interface&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;FPU&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;MPU / MMU&#039;&#039;&#039; || nein / nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Crypto Engine&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Calibrated RC Oscillator&#039;&#039;&#039; || ja&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== ATmega ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Device-specific Features&#039;&#039;&#039;&amp;lt;br/&amp;gt;&amp;amp;nbsp;&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
! Device&lt;br /&gt;
! Flash [KiB]&lt;br /&gt;
! Pin Anz&amp;amp;shy;ahl&lt;br /&gt;
! Max. &amp;amp;fnof;&amp;lt;sub&amp;gt;CPU&amp;lt;/sub&amp;gt; [MHz]&lt;br /&gt;
! of Touch Kan&amp;amp;shy;äle&lt;br /&gt;
! Max I/O Pins&lt;br /&gt;
! Ext Inter&amp;amp;shy;rupts&lt;br /&gt;
! USB Trans&amp;amp;shy;cei&amp;amp;shy;ver&lt;br /&gt;
! USB Speed&lt;br /&gt;
! USB Inter&amp;amp;shy;face&lt;br /&gt;
! SPI&lt;br /&gt;
! TWI&lt;br /&gt;
! UART&lt;br /&gt;
! CAN&lt;br /&gt;
! LIN&lt;br /&gt;
! Seg&amp;amp;shy;ment LCD&lt;br /&gt;
! ADC Kan&amp;amp;shy;äle&lt;br /&gt;
! ADC Auf&amp;amp;shy;lö&amp;amp;shy;sung [bits]&lt;br /&gt;
! ADC Speed [ksps]&lt;br /&gt;
! Ana&amp;amp;shy;log Com&amp;amp;shy;para&amp;amp;shy;tors&lt;br /&gt;
! DAC Kan&amp;amp;shy;äle&lt;br /&gt;
! DAC Auf&amp;amp;shy;lö&amp;amp;shy;sung [bits]&lt;br /&gt;
! Temp. Sensor&lt;br /&gt;
! SRAM [KiB]&lt;br /&gt;
! EEPROM [Bytes]&lt;br /&gt;
! Self Pro&amp;amp;shy;gram Memory&lt;br /&gt;
! pico&amp;amp;shy;Power&lt;br /&gt;
! Temp. Bereich [°C]&lt;br /&gt;
! I/O Supply Class [V]&lt;br /&gt;
! Opera&amp;amp;shy;ting Volt&amp;amp;shy;age [V&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt;]&lt;br /&gt;
! Timers&lt;br /&gt;
! Output Com&amp;amp;shy;pare Kan&amp;amp;shy;äle&lt;br /&gt;
! Input Capt&amp;amp;shy;ure Kan&amp;amp;shy;äle&lt;br /&gt;
! PWM Kan&amp;amp;shy;äle&lt;br /&gt;
! 32kHz RTC&lt;br /&gt;
! Device&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega8&#039;&#039;&#039; || 8 || 32 || 16 || 12 || 23 || 2 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 1 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 3 || 1 || 3 || &amp;amp;radic; || &#039;&#039;&#039;ATmega8&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega8515&#039;&#039;&#039; || 8 || 44 || 16 || 16 || 35 || 3 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 0 || 1 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || &amp;amp;mdash; || 0.5 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 3 || 1 || 3 || &amp;amp;mdash; || &#039;&#039;&#039;ATmega8515&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega8535&#039;&#039;&#039; || 8 || 44 || 16 || 16 || 32 || 3 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 0.5 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega8535&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega16&#039;&#039;&#039; || 16 || 44 || 16 || 16 || 32 || 3 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 1 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega16&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega32&#039;&#039;&#039; || 32 || 44 || 16 || 16 || 32 || 3 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega32&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega64&#039;&#039;&#039; || 64 || 64 || 16 || 16 || 53 || 8 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 1 || 2 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 4 || 8 || 2 || 7 || &amp;amp;radic; || &#039;&#039;&#039;ATmega64&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega128&#039;&#039;&#039; || 128 || 64 || 16 || 16 || 53 || 8 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 1 || 2 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 4096 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 4 || 8 || 2 || 7 || &amp;amp;radic; || &#039;&#039;&#039;ATmega128&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega162&#039;&#039;&#039; || 16 || 44 || 16 || 16 || 35 || 3 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 0 || 2 || 0 || 0 || 0 || 0 || 0 || 0 || 1 || 0 || 0 || &amp;amp;mdash; || 1 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 4 || 6 || 2 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega162&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega48&#039;&#039;&#039; || 4 || 32 || 20 || 12 || 23 || 24 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 0.5 || 256 || &amp;amp;mdash; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega48&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega88&#039;&#039;&#039; || 8 || 32 || 20 || 12 || 23 || 24 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 1 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega88&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega168&#039;&#039;&#039; || 16 || 32 || 20 || 16 || 23 || 24 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 1 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega168&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;AT90CAN128&#039;&#039;&#039; || 128 || 64 || 16 || 16 || 53 || 8 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 1 || 2 || 1 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 4096 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 4 || 8 || 2 || 7 || &amp;amp;radic; || &#039;&#039;&#039;AT90CAN128&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega325&#039;&#039;&#039; || 32 || 64 || 16 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega325&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega3250&#039;&#039;&#039; || 32 || 100 || 16 || 16 || 69 || 25 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega3250&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega6450&#039;&#039;&#039; || 64 || 100 || 16 || &amp;amp;mdash; || 69 || 25 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega6450&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega645&#039;&#039;&#039; || 64 || 64 || 16 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega645&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega329&#039;&#039;&#039; || 32 || 64 || 16 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 100 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega329&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega3290&#039;&#039;&#039; || 32 || 100 || 16 || 16 || 69 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 160 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega3290&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega649&#039;&#039;&#039; || 64 || 64 || 16 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 100 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega649&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega6490&#039;&#039;&#039; || 64 || 100 || 16 || 16 || 69 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 160 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega6490&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega640&#039;&#039;&#039; || 64 || 100 || 16 || 16 || 86 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 5 || 1 || 4 || 0 || 0 || 0 || 16 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 8 || 4096 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 6 || 16 || 4 || 15 || &amp;amp;radic; || &#039;&#039;&#039;ATmega640&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega1281&#039;&#039;&#039; || 128 || 64 || 16 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 3 || 1 || 2 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 8 || 4096 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 6 || 16 || 2 || 8 || &amp;amp;radic; || &#039;&#039;&#039;ATmega1281&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega2561&#039;&#039;&#039; || 256 || 64 || 16 || &amp;amp;mdash; || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 3 || 1 || 2 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 8 || 4096 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 6 || 16 || 2 || 8 || &amp;amp;radic; || &#039;&#039;&#039;ATmega2561&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega2560&#039;&#039;&#039; || 256 || 100 || 16 || &amp;amp;mdash; || 86 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 5 || 1 || 4 || 0 || 0 || 0 || 16 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 8 || 4096 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 6 || 16 || 4 || 15 || &amp;amp;radic; || &#039;&#039;&#039;ATmega2560&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega1280&#039;&#039;&#039; || 128 || 100 || 16 || 16 || 86 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 5 || 1 || 4 || 0 || 0 || 0 || 16 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 8 || 4096 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 6 || 16 || 4 || 15 || &amp;amp;radic; || &#039;&#039;&#039;ATmega1280&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega644&#039;&#039;&#039; || 64 || 44 || 20 || 16 || 32 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 3 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega644&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;AT90CAN32&#039;&#039;&#039; || 32 || 64 || 16 || 16 || 53 || 8 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 1 || 2 || 1 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 4 || 8 || 2 || 7 || &amp;amp;radic; || &#039;&#039;&#039;AT90CAN32&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;AT90CAN64&#039;&#039;&#039; || 64 || 64 || 16 || 16 || 53 || 8 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 1 || 2 || 1 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 4 || 8 || 2 || 7 || &amp;amp;radic; || &#039;&#039;&#039;AT90CAN64&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;AT90USB1286&#039;&#039;&#039; || 128 || 64 || 16 || 16 || 48 || 16 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 8 || 4096 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 4 || 10 || 1 || 9 || &amp;amp;radic; || &#039;&#039;&#039;AT90USB1286&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;AT90USB1287&#039;&#039;&#039; || 128 || 64 || 16 || 16 || 48 || 16 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbo&amp;quot;&amp;gt;Device + OTG&amp;lt;/ref&amp;gt; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 8 || 4096 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 4 || 10 || 1 || 9 || &amp;amp;radic; || &#039;&#039;&#039;AT90USB1287&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;AT90USB647&#039;&#039;&#039; || 64 || 64 || 16 || 16 || 48 || 16 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbo&amp;quot;&amp;gt;Device + OTG&amp;lt;/ref&amp;gt; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 4 || 10 || 1 || 9 || &amp;amp;radic; || &#039;&#039;&#039;AT90USB647&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;AT90USB646&#039;&#039;&#039; || 64 || 64 || 16 || 16 || 48 || 16 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 4 || 10 || 1 || 9 || &amp;amp;radic; || &#039;&#039;&#039;AT90USB646&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega164P&#039;&#039;&#039; || 16 || 44 || 20 || 16 || 32 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 3 || 1 || 2 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 1 || 512 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega164P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega324P&#039;&#039;&#039; || 32 || 44 || 20 || 16 || 32 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 3 || 1 || 2 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega324P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega165P&#039;&#039;&#039; || 16 || 64 || 16 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 1 || 512 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega165P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega169P&#039;&#039;&#039; || 16 || 64 || 16 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 100 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 1 || 512 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega169P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega644P&#039;&#039;&#039; || 64 || 44 || 20 || 16 || 32 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 3 || 1 || 2 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega644P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;AT90PWM1&#039;&#039;&#039; || 8 || 24 || 16 || 8 || 19 || 4 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 0 || 0 || 0 || 0 || 0 || 8 || 10 || 125 || 2 || 0 || 0 || &amp;amp;mdash; || 0.5 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;105 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 4 || 12 || 1 || 7 || &amp;amp;mdash; || &#039;&#039;&#039;AT90PWM1&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega329P&#039;&#039;&#039; || 32 || 64 || 20 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 100 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega329P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega3290P&#039;&#039;&#039; || 32 || 100 || 20 || 16 || 69 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 160 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega3290P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega325P&#039;&#039;&#039; || 32 || 64 || 20 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega325P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega3250P&#039;&#039;&#039; || 32 || 100 || 20 || 16 || 69 || 25 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega3250P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;AT90USB82&#039;&#039;&#039; || 8 || 32 || 16 || 12 || 22 || 21 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 2 || 0 || 1 || 0 || 0 || 0 || 0 || 0 || 0 || 1 || 0 || 0 || &amp;amp;mdash; || 0.5 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 5 || 1 || 4 || &amp;amp;mdash; || &#039;&#039;&#039;AT90USB82&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;AT90USB162&#039;&#039;&#039; || 16 || 32 || 16 || &amp;amp;mdash; || 22 || 21 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 2 || 0 || 1 || 0 || 0 || 0 || 0 || 0 || 0 || 1 || 0 || 0 || &amp;amp;mdash; || 0.5 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 5 || 1 || 4 || &amp;amp;mdash; || &#039;&#039;&#039;AT90USB162&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;AT90PWM216&#039;&#039;&#039; || 16 || 24 || 16 || 12 || 19 || 4 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 0 || 1 || 0 || 0 || 0 || 8 || 10 || 125 || 2 || 1 || 10 || &amp;amp;mdash; || 1 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;105 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 4 || 12 || 1 || 7 || &amp;amp;mdash; || &#039;&#039;&#039;AT90PWM216&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;AT90PWM316&#039;&#039;&#039; || 16 || 32 || 16 || 12 || 27 || 4 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 0 || 1 || 0 || 0 || 0 || 11 || 10 || 125 || 3 || 1 || 10 || &amp;amp;mdash; || 1 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;105 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 5 || 16 || 1 || 12 || &amp;amp;mdash; || &#039;&#039;&#039;AT90PWM316&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega48P&#039;&#039;&#039; || 4 || 32 || 20 || 12 || 23 || 24 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;radic; || 0.5 || 256 || &amp;amp;mdash; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega48P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega88P&#039;&#039;&#039; || 8 || 32 || 20 || 12 || 23 || 24 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;radic; || 1 || 512 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega88P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega168P&#039;&#039;&#039; || 16 || 32 || 20 || 16 || 23 || 24 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;radic; || 1 || 512 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega168P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega328P&#039;&#039;&#039; || 32 || 32 || 20 || 16 || 23 || 24 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;radic; || 2 || 1024 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega328P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;AT90PWM3B&#039;&#039;&#039; || 8 || 32 || 16 || 8 || 27 || 4 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 0 || 1 || 0 || 0 || 0 || 11 || 10 || 125 || 3 || 1 || 10 || &amp;amp;mdash; || 0.5 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;105 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 5 || 16 || 1 || 12 || &amp;amp;mdash; || &#039;&#039;&#039;AT90PWM3B&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;AT90PWM2B&#039;&#039;&#039; || 8 || 24 || 16 || 8 || 19 || 4 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 0 || 1 || 0 || 0 || 0 || 8 || 10 || 125 || 2 || 1 || 10 || &amp;amp;mdash; || 0.5 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;105 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 4 || 12 || 1 || 7 || &amp;amp;mdash; || &#039;&#039;&#039;AT90PWM2B&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega32U4&#039;&#039;&#039; || 32 || 44 || 16 || 14 || 26 || 13 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 2 || 1 || 1 || 0 || 0 || 0 || 12 || 10 || 15 || 1 || 0 || 0 || &amp;amp;radic; || 2.5 || 1024 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 4 || 12 || 2 || 8 || &amp;amp;mdash; || &#039;&#039;&#039;ATmega32U4&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega1284P&#039;&#039;&#039; || 128 || 44 || 20 || 16 || 32 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 3 || 1 || 2 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 16 || 4096 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega1284P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega16U4&#039;&#039;&#039; || 16 || 44 || 16 || 14 || 26 || 13 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 2 || 1 || 1 || 0 || 0 || 0 || 12 || 10 || 15 || 1 || 0 || 0 || &amp;amp;radic; || 1.25 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 4 || 12 || 2 || 8 || &amp;amp;mdash; || &#039;&#039;&#039;ATmega16U4&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega16A&#039;&#039;&#039; || 16 || 44 || 16 || 16 || 32 || 3 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 1 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega16A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega32A&#039;&#039;&#039; || 32 || 44 || 16 || 16 || 32 || 3 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega32A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega88PA&#039;&#039;&#039; || 8 || 32 || 20 || 12 || 23 || 24 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;radic; || 1 || 512 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega88PA&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega324PA&#039;&#039;&#039; || 32 || 44 || 20 || 16 || 32 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 3 || 1 || 2 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega324PA&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega48PA&#039;&#039;&#039; || 4 || 32 || 20 || 12 || 23 || 24 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;radic; || 0.5 || 256 || &amp;amp;mdash; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega48PA&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega164PA&#039;&#039;&#039; || 16 || 44 || 20 || 16 || 32 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 3 || 1 || 2 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 1 || 512 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega164PA&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega64A&#039;&#039;&#039; || 64 || 64 || 16 || 16 || 53 || 8 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 1 || 2 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 4 || 8 || 2 || 7 || &amp;amp;radic; || &#039;&#039;&#039;ATmega64A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega128A&#039;&#039;&#039; || 128 || 64 || 16 || 16 || 53 || 8 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 1 || 2 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 4096 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 4 || 8 || 2 || 7 || &amp;amp;radic; || &#039;&#039;&#039;ATmega128A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega8A&#039;&#039;&#039; || 8 || 32 || 16 || 12 || 23 || 2 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 1 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || &amp;amp;mdash; || &amp;amp;mdash; || 3 || &amp;amp;radic; || &#039;&#039;&#039;ATmega8A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega168PA&#039;&#039;&#039; || 16 || 32 || 20 || 16 || 23 || 24 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;radic; || 1 || 512 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega168PA&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega8U2&#039;&#039;&#039; || 8 || 32 || 16 || &amp;amp;mdash; || 22 || 20 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 2 || 0 || 1 || 0 || 0 || 0 || 0 || 0 || 0 || 1 || 0 || 0 || &amp;amp;mdash; || 0.5 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 5 || 1 || 4 || &amp;amp;mdash; || &#039;&#039;&#039;ATmega8U2&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega16U2&#039;&#039;&#039; || 16 || 32 || 16 || 12 || 22 || 21 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 2 || 0 || 1 || 0 || 0 || 0 || 0 || 0 || 0 || 1 || 0 || 0 || &amp;amp;mdash; || 0.5 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 5 || 1 || 4 || &amp;amp;mdash; || &#039;&#039;&#039;ATmega16U2&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega32U2&#039;&#039;&#039; || 32 || 32 || 16 || 12 || 22 || 20 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 2 || 0 || 1 || 0 || 0 || 0 || 0 || 0 || 0 || 1 || 0 || 0 || &amp;amp;mdash; || 1 || 1024 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 5 || 1 || 4 || &amp;amp;mdash; || &#039;&#039;&#039;ATmega32U2&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega644PA&#039;&#039;&#039; || 64 || 44 || 20 || 16 || 32 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 3 || 1 || 2 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega644PA&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega16M1&#039;&#039;&#039; || 16 || 32 || 16 || 12 || 27 || 27 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 0 || 1 || 1 || 1 || 0 || 11 || 10 || 125 || 4 || 1 || 10 || &amp;amp;radic; || 1 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 14 || 1 || 10 || &amp;amp;mdash; || &#039;&#039;&#039;ATmega16M1&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega32M1&#039;&#039;&#039; || 32 || 32 || 16 || 12 || 27 || 27 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 0 || 1 || 1 || 1 || 0 || 11 || 10 || 125 || 4 || 1 || 10 || &amp;amp;radic; || 2 || 1024 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 14 || 1 || 10 || &amp;amp;mdash; || &#039;&#039;&#039;ATmega32M1&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega64M1&#039;&#039;&#039; || 64 || 32 || 16 || 12 || 27 || 27 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 0 || 1 || 1 || 1 || 0 || 11 || 10 || 125 || 4 || 1 || 10 || &amp;amp;radic; || 4 || 2048 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 14 || 1 || 10 || &amp;amp;mdash; || &#039;&#039;&#039;ATmega64M1&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega169PA&#039;&#039;&#039; || 16 || 64 || 16 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 100 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 1 || 512 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega169PA&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega48A&#039;&#039;&#039; || 4 || 32 || 20 || 12 || 23 || 24 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;radic; || 0.5 || 256 || &amp;amp;mdash; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega48A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega88A&#039;&#039;&#039; || 8 || 32 || 20 || 12 || 23 || 24 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;radic; || 1 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega88A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega168A&#039;&#039;&#039; || 16 || 32 || 20 || 16 || 23 || 24 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;radic; || 1 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega168A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega328&#039;&#039;&#039; || 32 || 32 || 20 || 16 || 23 || 24 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;radic; || 2 || 1024 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega328&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega164A&#039;&#039;&#039; || 16 || 44 || 20 || 16 || 32 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 3 || 1 || 2 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 1 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega164A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega324A&#039;&#039;&#039; || 32 || 44 || 20 || 16 || 32 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 3 || 1 || 2 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega324A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega644A&#039;&#039;&#039; || 64 || 44 || 20 || 16 || 32 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 3 || 1 || 2 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega644A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega1284&#039;&#039;&#039; || 128 || 44 || 20 || 16 || 32 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 3 || 1 || 2 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 16 || 4096 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega1284&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;AT90PWM81&#039;&#039;&#039; || 8 || 20 || 16 || &amp;amp;mdash; || 20 || 3 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 0 || 0 || 0 || 0 || 0 || 11 || 10 || 125 || 3 || 1 || 10 || &amp;amp;radic; || 0.25 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;125 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1 || 8 || 1 || 6 || &amp;amp;mdash; || &#039;&#039;&#039;AT90PWM81&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega165PA&#039;&#039;&#039; || 16 || 64 || 16 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 1 || 512 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega165PA&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega325A&#039;&#039;&#039; || 32 || 64 || 20 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega325A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega3250A&#039;&#039;&#039; || 32 || 100 || 20 || 16 || 69 || 25 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega3250A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega645A&#039;&#039;&#039; || 64 || 64 || 16 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega645A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega645P&#039;&#039;&#039; || 64 || 64 || 16 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega645P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega6450P&#039;&#039;&#039; || 64 || 100 || 20 || &amp;amp;mdash; || 69 || 25 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega6450P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega6450A&#039;&#039;&#039; || 64 || 100 || 20 || &amp;amp;mdash; || 69 || 25 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega6450A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega169A&#039;&#039;&#039; || 16 || 64 || 16 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 100 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 1 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega169A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega329A&#039;&#039;&#039; || 32 || 64 || 20 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 100 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega329A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega649A&#039;&#039;&#039; || 64 || 64 || 16 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 100 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega649A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega3290A&#039;&#039;&#039; || 32 || 100 || 20 || 16 || 69 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 160 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega3290A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega649P&#039;&#039;&#039; || 64 || 64 || 16 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 100 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega649P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega6490A&#039;&#039;&#039; || 64 || 100 || 20 || 16 || 69 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 160 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega6490A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega6490P&#039;&#039;&#039; || 64 || 100 || 20 || 16 || 69 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 160 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega6490P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega329PA&#039;&#039;&#039; || 32 || 64 || 20 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 100 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega329PA&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;General Features&#039;&#039;&#039;&amp;lt;br/&amp;gt;&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;CPU&#039;&#039;&#039; || 8-bit AVR&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Hardware Qtouch&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Quadrature Decoder Kanäle&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;SSC&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Ethernet&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;SD / eMMC&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Grafik LCD&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Video Decoder&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Kamera Interface&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Resistive Touch Screen&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;External Bus Interface&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;DRAM Memory&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;NAND Interface&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;FPU&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;MPU / MMU&#039;&#039;&#039; || nein / nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Crypto Engine&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Calibrated RC Oscillator&#039;&#039;&#039; || ja&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== ATxmega ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Device-specific Features&#039;&#039;&#039;&amp;lt;br/&amp;gt;&amp;amp;nbsp;&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
! Device&lt;br /&gt;
! Flash [KiB]&lt;br /&gt;
! Pin Anz&amp;amp;shy;ahl&lt;br /&gt;
! Anzahl Touch Kan&amp;amp;shy;äle&lt;br /&gt;
! Max I/O Pins&lt;br /&gt;
! Ext Inter&amp;amp;shy;rupts&lt;br /&gt;
! USB Trans&amp;amp;shy;cei&amp;amp;shy;ver&lt;br /&gt;
! USB Speed&lt;br /&gt;
! USB Inter&amp;amp;shy;face&lt;br /&gt;
! SPI&lt;br /&gt;
! TWI&lt;br /&gt;
! UART&lt;br /&gt;
! Seg&amp;amp;shy;ment LCD&lt;br /&gt;
! ADC Kan&amp;amp;shy;äle&lt;br /&gt;
! ADC Speed [ksps]&lt;br /&gt;
! Ana&amp;amp;shy;log Com&amp;amp;shy;para&amp;amp;shy;tors&lt;br /&gt;
! DAC Kan&amp;amp;shy;äle&lt;br /&gt;
! DAC Auf&amp;amp;shy;lö&amp;amp;shy;sung [bits]&lt;br /&gt;
! SRAM [KiB]&lt;br /&gt;
! EEPROM [Bytes]&lt;br /&gt;
! Ext&amp;amp;shy;ern&amp;amp;shy;al Bus Inter&amp;amp;shy;face&lt;br /&gt;
! DRAM Memory&lt;br /&gt;
! Crypto Engine&lt;br /&gt;
! Timers&lt;br /&gt;
! Output Com&amp;amp;shy;pare Kan&amp;amp;shy;äle&lt;br /&gt;
! Input Capt&amp;amp;shy;ure Kan&amp;amp;shy;äle&lt;br /&gt;
! PWM Kan&amp;amp;shy;äle&lt;br /&gt;
! Device&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega64A1&#039;&#039;&#039; || 64 || 100 || 16 || 78 || 78 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 12 || 4 || 8 || 0 || 16 || 2000 || 4 || 4 || 12 || 4 || 2048 || 1 || ja&amp;lt;ref name=&amp;quot;sdram&amp;quot;&amp;gt;SDRAM&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 8 || 24 || 24 || 24 || &#039;&#039;&#039;ATxmega64A1&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega128A1&#039;&#039;&#039; || 128 || 100 || 16 || 78 || 78 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 12 || 4 || 8 || 0 || 16 || 2000 || 4 || 4 || 12 || 8 || 2048 || 1 || ja&amp;lt;ref name=&amp;quot;sdram&amp;quot;&amp;gt;SDRAM&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 8 || 24 || 24 || 24 || &#039;&#039;&#039;ATxmega128A1&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega64A3&#039;&#039;&#039; || 64 || 64 || 16 || 50 || 50 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 10 || 2 || 7 || 0 || 16 || 2000 || 4 || 2 || 12 || 4 || 2048 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 7 || 22 || 22 || 22 || &#039;&#039;&#039;ATxmega64A3&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega128A3&#039;&#039;&#039; || 128 || 64 || 16 || 50 || 50 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 10 || 2 || 7 || 0 || 16 || 2000 || 4 || 2 || 12 || 8 || 2048 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 7 || 22 || 22 || 22 || &#039;&#039;&#039;ATxmega128A3&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega192A3&#039;&#039;&#039; || 192 || 64 || 16 || 50 || 50 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 10 || 2 || 7 || 0 || 16 || 2000 || 4 || 2 || 12 || 16 || 2048 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 7 || 22 || 22 || 22 || &#039;&#039;&#039;ATxmega192A3&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega256A3&#039;&#039;&#039; || 256 || 64 || 16 || 50 || 50 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 10 || 2 || 7 || 0 || 16 || 2000 || 4 || 2 || 12 || 16 || 4096 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 7 || 22 || 22 || 22 || &#039;&#039;&#039;ATxmega256A3&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega16A4&#039;&#039;&#039; || 16 || 44 || 16 || 34 || 34 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 7 || 2 || 5 || 0 || 12 || 2000 || 2 || 2 || 12 || 3.3 || 1024 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 5 || 16 || 16 || 16 || &#039;&#039;&#039;ATxmega16A4&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega32A4&#039;&#039;&#039; || 32 || 44 || 16 || 34 || 34 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 7 || 2 || 5 || 0 || 12 || 2000 || 2 || 2 || 12 || 4 || 1024 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 5 || 16 || 16 || 16 || &#039;&#039;&#039;ATxmega32A4&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega64A4&#039;&#039;&#039; || 64 || 44 || &amp;amp;mdash; || 34 || 34 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 7 || 2 || 5 || 0 || 12 || 2000 || 2 || 2 || 12 || 4 || 2048 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 5 || 16 || 16 || 16 || &#039;&#039;&#039;ATxmega64A4&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega128A4&#039;&#039;&#039; || 128 || 44 || &amp;amp;mdash; || 34 || 34 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 7 || 2 || 5 || 0 || 12 || 2000 || 2 || 2 || 12 || 8 || 2048 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 5 || 16 || 16 || 16 || &#039;&#039;&#039;ATxmega128A4&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega256A3B&#039;&#039;&#039; || 256 || 64 || 16 || 47 || 49 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 8 || 2 || 6 || 0 || 16 || 2000 || 4 || 2 || 12 || 16 || 4096 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 7 || 22 || 22 || 22 || &#039;&#039;&#039;ATxmega256A3B&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega256D3&#039;&#039;&#039; || 256 || 64 || 16 || 50 || 50 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 5 || 2 || 3 || 0 || 16 || 200 || 2 || 0 || 0 || 16 || 4096 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 5 || 18 || 18 || 18 || &#039;&#039;&#039;ATxmega256D3&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega192D3&#039;&#039;&#039; || 192 || 64 || 16 || 50 || 50 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 5 || 2 || 3 || 0 || 16 || 200 || 2 || 0 || 0 || 16 || 2048 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 5 || 18 || 18 || 18 || &#039;&#039;&#039;ATxmega192D3&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega128D3&#039;&#039;&#039; || 128 || 64 || 16 || 50 || 50 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 5 || 2 || 3 || 0 || 16 || 200 || 2 || 0 || 0 || 8 || 2048 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 5 || 18 || 18 || 18 || &#039;&#039;&#039;ATxmega128D3&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega64D3&#039;&#039;&#039; || 64 || 64 || 16 || 50 || 50 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 5 || 2 || 3 || 0 || 16 || 200 || 2 || 0 || 0 || 4 || 2048 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 5 || 18 || 18 || 18 || &#039;&#039;&#039;ATxmega64D3&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega128D4&#039;&#039;&#039; || 128 || 44 || &amp;amp;mdash; || 34 || 34 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 4 || 2 || 2 || 0 || 12 || 200 || 2 || 0 || 0 || 8 || 2048 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 4 || 14 || 14 || 14 || &#039;&#039;&#039;ATxmega128D4&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega64D4&#039;&#039;&#039; || 64 || 44 || &amp;amp;mdash; || 34 || 34 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 4 || 2 || 2 || 0 || 12 || 200 || 2 || 0 || 0 || 4 || 2048 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 4 || 14 || 14 || 14 || &#039;&#039;&#039;ATxmega64D4&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega32D4&#039;&#039;&#039; || 32 || 44 || 16 || 34 || 34 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 4 || 2 || 2 || 0 || 12 || 200 || 2 || 0 || 0 || 4 || 1024 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 4 || 14 || 14 || 14 || &#039;&#039;&#039;ATxmega32D4&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega16D4&#039;&#039;&#039; || 16 || 44 || 16 || 34 || 34 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 4 || 2 || 2 || 0 || 12 || 200 || 2 || 0 || 0 || 2 || 1024 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 4 || 14 || 14 || 14 || &#039;&#039;&#039;ATxmega16D4&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega16A4U&#039;&#039;&#039; || 16 || 44 || 16 || 34 || 34 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 7 || 2 || 5 || 0 || 12 || 2000 || 2 || 2 || 12 || 3.3 || 1024 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 5 || 16 || 16 || 16 || &#039;&#039;&#039;ATxmega16A4U&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega32A4U&#039;&#039;&#039; || 32 || 44 || 16 || 34 || 34 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 7 || 2 || 5 || 0 || 12 || 2000 || 2 || 2 || 12 || 4 || 1024 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 5 || 16 || 16 || 16 || &#039;&#039;&#039;ATxmega32A4U&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega64A3U&#039;&#039;&#039; || 64 || 64 || 16 || 50 || 50 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 10 || 2 || 7 || 0 || 16 || 2000 || 4 || 2 || 12 || 4 || 2048 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 7 || 22 || 22 || 22 || &#039;&#039;&#039;ATxmega64A3U&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega128A3U&#039;&#039;&#039; || 128 || 64 || 16 || 50 || 50 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 10 || 2 || 7 || 0 || 16 || 2000 || 4 || 2 || 12 || 8 || 2048 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 7 || 22 || 22 || 22 || &#039;&#039;&#039;ATxmega128A3U&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega192A3U&#039;&#039;&#039; || 192 || 64 || 16 || 50 || 50 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 10 || 2 || 7 || 0 || 16 || 2000 || 4 || 2 || 12 || 16 || 2048 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 7 || 22 || 22 || 22 || &#039;&#039;&#039;ATxmega192A3U&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega256A3U&#039;&#039;&#039; || 256 || 64 || 16 || 50 || 50 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 10 || 2 || 7 || 0 || 16 || 2000 || 4 || 2 || 12 || 16 || 4096 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 7 || 22 || 22 || 22 || &#039;&#039;&#039;ATxmega256A3U&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega256A3BU&#039;&#039;&#039; || 256 || 64 || 16 || 47 || 49 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 8 || 2 || 6 || 0 || 16 || 2000 || 4 || 2 || 12 || 16 || 4096 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 7 || 22 || 22 || 22 || &#039;&#039;&#039;ATxmega256A3BU&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega64B3&#039;&#039;&#039; || 64 || 64 || 16 || 36 || 36 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 2 || 1 || 1 || 100 || 8 || 2000 || 2 || 0 || 0 || 4 || 2048 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 2 || 6 || 6 || 6 || &#039;&#039;&#039;ATxmega64B3&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega128B3&#039;&#039;&#039; || 128 || 64 || 16 || 36 || 36 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 2 || 1 || 1 || 100 || 8 || 2000 || 2 || 0 || 0 || 4 || 2048 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 2 || 6 || 6 || 6 || &#039;&#039;&#039;ATxmega128B3&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega128B1&#039;&#039;&#039; || 128 || 100 || 16 || 53 || 53 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 3 || 1 || 2 || 160 || 16 || 2000 || 4 || 0 || 0 || 8 || 2048 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 3 || 10 || 10 || 10 || &#039;&#039;&#039;ATxmega128B1&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega64B1&#039;&#039;&#039; || 64 || 100 || 16 || 53 || 53 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 3 || 1 || 2 || 160 || 16 || 2000 || 4 || 0 || 0 || 8 || 2048 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 3 || 10 || 10 || 10 || &#039;&#039;&#039;ATxmega64B1&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;General Features&#039;&#039;&#039;&amp;lt;br/&amp;gt;&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Max. &amp;amp;fnof;&amp;lt;sub&amp;gt;CPU&amp;lt;/sub&amp;gt; [MHz]&#039;&#039;&#039; || 32&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;CPU&#039;&#039;&#039; || 8-bit AVR&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Hardware Qtouch&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Quadrature Decoder Kanäle&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;CAN&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;LIN&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;SSC&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Ethernet&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;SD / eMMC&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Grafik LCD&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Video Decoder&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Kamera Interface&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ADC Auflösung [bits]&#039;&#039;&#039; || 12&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Resistive Touch Screen&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Temp. Sensor&#039;&#039;&#039; || ja&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Self Program Memory&#039;&#039;&#039; || ja&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;NAND Interface&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;picoPower&#039;&#039;&#039; || ja&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Temp. Bereich [°C]&#039;&#039;&#039; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;I/O Supply Class [V]&#039;&#039;&#039; || 1.6&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;3.6&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Operating Voltage [V&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt;]&#039;&#039;&#039; || 1.6&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;3.6&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;FPU&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;MPU / MMU&#039;&#039;&#039; || nein / nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;32kHz RTC&#039;&#039;&#039; || ja&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Calibrated RC Oscillator&#039;&#039;&#039; || ja&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.avrfreaks.net/index.php?module=Freaks%20Devices&amp;amp;func=devCompare Vergleichstabelle] von AVRFreaks&lt;br /&gt;
* [http://www.atmel.com/dyn/products/param_table.asp?family_id=607&amp;amp;OrderBy=part_no&amp;amp;Direction=ASC#760 Vergleichstabelle aller aktuellen AVR Controller bei Atmel]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR]]&lt;br /&gt;
[[Kategorie:Liste mit Bauteilen]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_Typen&amp;diff=79921</id>
		<title>AVR Typen</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_Typen&amp;diff=79921"/>
		<updated>2013-12-09T02:44:48Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Änderung 79918 von 84.73.217.139 (Diskussion) rückgängig gemacht.  Das ist kein Typo.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== AT90S ==&lt;br /&gt;
Die &amp;quot;Basic Line&amp;quot; der Atmel [[AVR]]-Reihe. Sie beinhaltet die ersten [[AVR|AVRs]] die produziert wurden und deren Bezeichnung mit &amp;quot;AT90S&amp;quot; beginnt. Alle Typen wurden mit der Zeit von den beiden Nachfolgereihen ersetzt: ATmega bzw. ATtiny.&lt;br /&gt;
&lt;br /&gt;
Einige neue AVR-Controller tragen eine mit AT90-&#039;&#039;ohne S&#039;&#039; beginnende Bezeichnung, haben aber einen &amp;quot;moderneren&amp;quot; Kern. Z.B. sind die Typen AT90PWM2/3 und AT90CAN128 vom Funktionsumfang (interner RC, USART etc.) den ATmegas zuzuordnen.&lt;br /&gt;
&lt;br /&gt;
== ATmega ==&lt;br /&gt;
Die ATmega-[[Mikrocontroller]] sind ein Teil der AVR-Controllerfamilie. Zusammen mit den ATtiny lösen die ATmega die AT90S-Serie schrittweise ab, wobei es in den meisten Fällen weitgehend pin- und funktionskompatiblen Ersatz für abgekündigte Controller gibt (ATmega8 bzw. ATmega8A statt AT90S4433, ATmega8515 statt AT90S8515 usw.).&lt;br /&gt;
&lt;br /&gt;
Atmel ATmega AVRs werden mit aktiviertem internem Taktgeber ausgeliefert. Schließt man eine andere externe Taktquelle an (Quarz, Quarzoszillator o.ä), wird diese nicht automatisch genutzt. Zum Aktivieren müssen die Fuse-Bits des Controllers entsprechend eingestellt werden (siehe Datenblatt).&lt;br /&gt;
&lt;br /&gt;
ATmegas mit integriertem [[JTAG]]-Interface (z.Zt. solche ab 16kB Flash-Speicher und mehr als 28 Pins&amp;lt;!-- wg. ATmega168--&amp;gt;) werden ab Werk mit aktiviertem JTAG-Interface ausgeliefert. Dieses Interface belegt vier Port-Pins (z.&amp;amp;nbsp;B. am PORTC bei ATmega16/32), die nicht für eigene Anwendungen genutzt werden können, solange das JTAG-Interface aktiviert ist. Das Interface lässt sich über ein Fuse-Bit (JTAGEN) dauerhaft und über ein Bit (JTD) in dem (oder einem der) MC-Kontroll-Register (Datenblatt nach JTD durchsuchen) per Software zur Laufzeit an- und abschalten. Weiteres im Datenblatt des jeweiligen Controllers in den Abschnitten Memory-Programming (Fuse) und JTAG/ICE (JTD).&lt;br /&gt;
&lt;br /&gt;
Beim ATmega128 ist ab Werk die Mega103-Kompatibilitäts-fuse gesetzt. Um alle Erweiterungen des Mega128 gegenüber dem Mega103 zu nutzen muss diese deaktivert werden. Diese Fuse sorgt außerdem dafür, dass das SRAM in einem anderen Adressbereich liegt. Dadurch funktionieren C-Programme nur bis zum ersten Funktionsaufruf. Siehe auch [[AVR_Checkliste#Besonderheiten_bei_ATmega128_und_seinen_Derivaten_im_64-Pin-Gehäuse | AVR Checkliste: Besonderheiten bei ATmega64 / ATmega128]]&lt;br /&gt;
&lt;br /&gt;
== ATtiny ==&lt;br /&gt;
&lt;br /&gt;
Die ATtiny stellen das untere Ende der neuen AVR Linie von Atmel dar und waren zunächst durch das Fehlen von internem [[RAM#SRAM|SRAM]] gekennzeichnet. Mittlerweile gibt es aber so bemerkenswerte Controller wie den ATtiny4313, deren Möglichkeiten und Funktionen den ATmegas in nichts nachstehen.&lt;br /&gt;
&lt;br /&gt;
Ein weiterer Unterschied zu den ATmegas ist der fehlende Hardwaremultiplizierer. Jede Multiplikation muss also in Software ausgeführt werden. Eine Übersicht über die Verfügbarkeit verschiedener Befehle bietet die [[AVR_Assembler_-_Vergleichstabelle|AVR-Assembler Befehlsvergleichstabelle]].&lt;br /&gt;
&lt;br /&gt;
== ATxmega ==&lt;br /&gt;
Neueste Generation von AVR-Controllern mit neuem internen Aufbau, hoher Taktrate (32 MHz), niedriger Spannung (1,6 - 3,6V), vielen Schnittstellen, in 44 - 100 poligen SMD-Gehäusen. Besonderheiten: ADC mit 2 Megasample/12 Bit, vierpoliges Programm- und Debug- Interface PDI (VTref, CLK, DATA, GND)  erfordert z.B. einen AVR_JTAGICE-mkII Programmer. PDI (Flash und Debug) funktioniert mit C-Code z.B. mit AVR Studio 4.19. &lt;br /&gt;
&lt;br /&gt;
Leider ist die Xmega-Reihe zu den AVR-Prozessoren der Mega- oder Tiny-Serien nicht  kompatibel (viel komplizierter, anderer Aufbau der IO-Baugruppen, der Interrupts, der C-Funktionen etc.). Prozessor-Manuals zeigen weder Assembler noch C-Beispiele für Ansteuerung der IO-Baugruppen. C-Programmbeispiele (geeignet für AVR-Studio) findet man erst in Xmega Application Notes. Einen Überblick gibt es von [http://www.stromflo.de/dokuwiki/doku.php?id=xmega-c-tutorial Florian Grotz] oder in dem [http://www.jtronics.de/avr-projekte/xmega-tutorial.html jtronics Xmega Tutorial]  .&lt;br /&gt;
&lt;br /&gt;
== Sonstiges ==&lt;br /&gt;
&lt;br /&gt;
Die AT89-Familie gehört nicht zu den AVR-Typen mit dem AVR-RISC-Befehlssatz, sondern ist eine [[8051|Intel-8051]]-kompatible 8-Bit µC-Serie.&lt;br /&gt;
&lt;br /&gt;
=== Tiny vs Mega ===&lt;br /&gt;
Die modernen Typen sind die Tiny (=winzig) und die Mega (=riesig). Die ATTiny haben kleinere Gehäuse als die ATMega, mit weniger Pins. Dies führt bei ähnlicher Funktionalität wie die Megas zu extremen Mehrfachbelegungen der Pins und auch eher zu Überschneidungen der Pinfunktionalität. Die Tiny sind daher eher für sehr hohe Stückzahlen geeignet, wo die Einsparung über die Stückzahl kommt. Anfänger und Bastler sind mit den ATMega besser bedient, da die weniger Limitationen besitzen.&lt;br /&gt;
&lt;br /&gt;
Tinys haben keinen Hardware-Multiplizierer.&lt;br /&gt;
&lt;br /&gt;
==Nomenklatur==&lt;br /&gt;
===ATmega===&lt;br /&gt;
Auch wenn die Namensgebung auf den ersten Blick bedingt durch die vielen verfügbaren Modelle kompliziert aussieht, so folgt sie doch immer (von wenigen Ausnahmen abgesehen) einem einfachen Schema. &lt;br /&gt;
&lt;br /&gt;
Nehmen wir einen aktuellen Baustein als Beispiel: *ATmega48PA-AU*. Der Name besteht aus 5 Teilen:&lt;br /&gt;
# Der Baureihe (hier: &amp;quot;ATmega&amp;quot;)&lt;br /&gt;
# Einer Nummer, immer eine Zweierpotenz (hier: 4). Diese Zahl gibt die Größe des Flashspeichers in Kibibyte an. &lt;br /&gt;
# Bis zu zwei weiteren Ziffern (hier: 8). Sie definieren die Zusatzfunktionen sowie Zahl der I/O-Ports.&lt;br /&gt;
# Bis zu zwei Buchstaben (hier: PA), die für die Revision sowie spezielle stromsparende Architekturen stehen.&lt;br /&gt;
# Einem Bindestrich und zwei weiteren Buchstaben, die die Bauform angeben (hier: AU).&lt;br /&gt;
&lt;br /&gt;
====Baureihe====&lt;br /&gt;
&lt;br /&gt;
Hier gibt es nur zwei Reihen: Den kleinen ATtiny mit reduziertem Funktionsumfang und den großen ATmega.&lt;br /&gt;
&lt;br /&gt;
====Speichergröße====&lt;br /&gt;
&lt;br /&gt;
Während die Größe des Flashspeichers (Programmspeicher) direkt im Namen angegeben ist, ergibt sich die Größe von RAM und EEPROM nur indirekt aus dieser Nummer, wobei natürlich die Bausteine mit großem Flash auch mehr RAM und EEPROM haben als kleinere. Grob gilt diese Zuordnung:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Flash (kB)  !! EEPROM (B) !! RAM (B)&lt;br /&gt;
|-&lt;br /&gt;
| 2           ||   tiny: 128      ||  tiny: 128&lt;br /&gt;
|-&lt;br /&gt;
| 4           ||   tiny: var., mega: 256      ||  tiny: 256, mega: 512&lt;br /&gt;
|-&lt;br /&gt;
| 8           ||   tiny: var., mega: 512      ||  tiny: 512, mega: 1024&lt;br /&gt;
|-&lt;br /&gt;
| 16          ||   512      ||  1024&lt;br /&gt;
|-&lt;br /&gt;
| 32          ||   1024     ||  2048&lt;br /&gt;
|-&lt;br /&gt;
| 64          ||   2048*)   ||  4096*)&lt;br /&gt;
|-&lt;br /&gt;
| 128 - 256   ||   4096     ||  4K - 16K&lt;br /&gt;
|}&lt;br /&gt;
 *)Atmega640 verfügt über den doppelten Speicher&lt;br /&gt;
&lt;br /&gt;
====Zusatzfunktionen / Größe====&lt;br /&gt;
Die Ziffer(n) nach der Flashgröße geben die Ausstattungsmerkmale des Bausteins an. Die folgende Tabelle gilt für die Atmega-Reihe:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Ziffer  !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| - ||  Keine Ziffer markiert die Bausteine der ersten Generation. Sie verfügen in der Regel über eine niedrigere maximale Taktrate (8/16 MHz anstatt 10/20 MHz), eine höhere Minimal-Spannung (2,7 anstatt 1,8 Volt), weniger Interrupt-Quellen und PWM-Kanäle&lt;br /&gt;
|-&lt;br /&gt;
| 0 ||  Reihe von 32 - 256 kB in einem größeren Gehäuse mit höherer Anzahl an I/O-Pins. Etwas älter als die aktuellen Reihen 4 und 8.&lt;br /&gt;
|-&lt;br /&gt;
| 1 ||  Kennzeichnet eine verbesserte Version des Atmega128 / 256, aber älter als aktuelle 4er Reihe&lt;br /&gt;
|-&lt;br /&gt;
| 4 ||  Reihe von 16 bis 128 kB Flash, alle pinkompatibel in 40-44 poligem Gehäuse. Neueste Baureihe, alle in pico-power-Technologie mit vielen verbesserten Funktionen wie externen Interrupts, Timern, USART...&lt;br /&gt;
|-&lt;br /&gt;
| 5 ||  Reihe von 16 bis 64 kB&lt;br /&gt;
|-&lt;br /&gt;
| 8 ||  Reihe von 4 bis 32 kB, alle pinkompatibel in 28-32 poligem Gehäuse. Neueste Baureihe, alle in pico-power-Technologie mit vielen verbesserten Funktionen wie externen Interrupts, Timern, USART.... (auch in der Attiny-Reihe vorhanden)&lt;br /&gt;
|-&lt;br /&gt;
| 9 ||  Reihe von 16 bis 64 kB mit integriertem Controller für LC-Displays, folglich in großen Gehäusen (64-/100-polig)&lt;br /&gt;
|}&lt;br /&gt;
Aus dieser Liste stechen einige Bausteine als Außenseiter hervor:&lt;br /&gt;
* Atmega8515 / Atmega8535&lt;br /&gt;
* Atmega640: Im Prinzip ein Atmega64 mit deutlich mehr Hardware-Ressourcen (4 UARTs, 16 ADC-Kanäle...) und doppelt soviel EEPROM / SRAM.&lt;br /&gt;
&lt;br /&gt;
====Revision / Architektur====&lt;br /&gt;
Die (optionalen) Buchstaben vor dem Bindestrich geben Auskunft über den Stromverbrauch und Spannungsbereich&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Buchstabe  !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| A ||  Zweite Revision - meist nur eine Umstellung der internen Strukturen ohne Auswirkung für den Benutzer&lt;br /&gt;
|-&lt;br /&gt;
| L / V ||  &amp;quot;Low-Voltage&amp;quot;: Speziell für niedrigere Taktraten (8 bzw. 10 MHz) sowie niedrigere Eingangsspannungen (1,8 bzw. 2,7V) selektierte Bausteine&lt;br /&gt;
|-&lt;br /&gt;
| P/PA ||  &amp;quot;Pico-Power&amp;quot;: Reduzierter Stromaufnahme, besonders in tiefen Sleep-Modes (&amp;lt; 1uA); Manche Bausteine (z.B. Mega48) gibt es als P und PA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Bauform====&lt;br /&gt;
Die beiden Buchstaben nach dem Bindestrich geben Auskunft über die Bauform. Die Zahl der Pins des jeweiligen Gehäusetyps hängt vom Baustein ab.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Buchstaben  !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| A ||  TQFP-Gehäuse&lt;br /&gt;
|-&lt;br /&gt;
| C ||  BGA-Gehäuse&lt;br /&gt;
|-&lt;br /&gt;
| I ||  Bleihaltig - nicht mehr erhältlich&lt;br /&gt;
|-&lt;br /&gt;
| J ||  PLCC-Gehäuse&lt;br /&gt;
|-&lt;br /&gt;
| M ||  (V)QFN- / MLF- Gehäuse&lt;br /&gt;
|-&lt;br /&gt;
| P ||  DIP-Gehäuse  (bastlerfreundlich!)&lt;br /&gt;
|-&lt;br /&gt;
| S ||  SOIC-Gehäuse&lt;br /&gt;
|-&lt;br /&gt;
| U ||  Bleifrei, RoHS-kompatibel&lt;br /&gt;
|-&lt;br /&gt;
| X ||  TSSOP-Gehäuse&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
===ATtiny===&lt;br /&gt;
Bei den ATtiny-Bausteinen ist die Nummerierung deutlich unübersichtlicher als in der ATmega-Reihe. Die erste Ziffer gibt wie auch bei ATmega die Größe des Flash-Speichers an. Die obenstehenden Tabellen für Baureihe, Bauform, Revision und Speichergröße gelten ebenfalls (Ausnahmen: ATtiny5 mit 0,5 Kilobytes Flash sowie ATtiny4 und ATtiny9 mit 0,5 bzw. 1 kB Flash). Die Zusatzfunktionen und Baugröße sind aber nicht deutlich&lt;br /&gt;
&lt;br /&gt;
== Vergleichstabelle(n) / Ausstattung ==&lt;br /&gt;
=== AT90S - Reihe ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;font-size:10px;&amp;quot; id=&amp;quot;AVR_Features_AT90S&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Typ||Flash (Kbytes)||EEPROM (Bytes)||SRAM (Bytes)||Max I/O Pins||F.max (MHz)||Vcc (V)||Analog &amp;lt;br/&amp;gt;Compa&amp;amp;shy;rator||16-bit Timer||8-bit Timer||Brown Out Detector||On Chip Oscillator||PWM Chan&amp;amp;shy;nels||RTC||Self Prog&amp;amp;shy;ram Memory||Boot Code||SPI||TWI (I2C)||UART||Watch&amp;amp;shy;dog||Bau&amp;amp;shy;form&lt;br /&gt;
|- &amp;lt;!-- START - AT90S2313 -------------------------------------&amp;gt;&lt;br /&gt;
|[http://www.atmel.com/dyn/resources/prod_documents/doc0839.pdf AT90S2313]&amp;lt;ref&amp;gt;veraltet → ATtiny2313&amp;lt;/ref&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|128&lt;br /&gt;
|128&lt;br /&gt;
|15&lt;br /&gt;
|10&lt;br /&gt;
|2.7-6.0&lt;br /&gt;
|Ja&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|1&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP20 SOIC20&lt;br /&gt;
|- &amp;lt;!-- START - AT90S2323 ---------------------------------------&amp;gt;&lt;br /&gt;
|[http://www.atmel.com/atmel/acrobat/doc1004.pdf AT90S2323]&amp;lt;ref&amp;gt;veraltet → ATtiny25/45/85&amp;lt;/ref&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|128&lt;br /&gt;
|128&lt;br /&gt;
|3&lt;br /&gt;
|10&lt;br /&gt;
|2.7-6.0&lt;br /&gt;
|Nein&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|0&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP8 SOIC8&lt;br /&gt;
|- &amp;lt;!-- START - AT90S2343 ------------------------------&amp;gt;&lt;br /&gt;
|[http://www.atmel.com/atmel/acrobat/doc1004.pdf AT90S2343]&amp;lt;ref&amp;gt;veraltet → ATtiny25/45/85&amp;lt;/ref&amp;gt;&lt;br /&gt;
|2&lt;br /&gt;
|128&lt;br /&gt;
|128&lt;br /&gt;
|5&lt;br /&gt;
|10&lt;br /&gt;
|2.7-6.0&lt;br /&gt;
|Nein&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|0&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP8 SOIC8 &lt;br /&gt;
|- &amp;lt;!-- START - AT90S8515 ----------------------------------&amp;gt;&lt;br /&gt;
|[http://www.atmel.com/atmel/acrobat/doc0841.pdf AT90S8515]&amp;lt;ref&amp;gt;veraltet → ATmega16/162/32/644&amp;lt;/ref&amp;gt;&lt;br /&gt;
|8&lt;br /&gt;
|512&lt;br /&gt;
|512&lt;br /&gt;
|32&lt;br /&gt;
|8&lt;br /&gt;
|2.7-6.0&lt;br /&gt;
|Ja&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|1 (16-Bit)&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP40 PLCC44 TQFP44&lt;br /&gt;
&amp;lt;!-- diesen Kommentar entfernen nach dem Kopieren dieser Eingabehilfe&lt;br /&gt;
|-&lt;br /&gt;
|Typ&lt;br /&gt;
|Flash (Kbytes)&lt;br /&gt;
|EEPROM (Bytes)&lt;br /&gt;
|SRAM (Bytes)&lt;br /&gt;
|Max I/O Pins&lt;br /&gt;
|F.max (MHz)&lt;br /&gt;
|Vcc (V)&lt;br /&gt;
|A/D Chan&amp;amp;shy;nels&lt;br /&gt;
|Ana&amp;amp;shy;log&amp;lt;br/&amp;gt;Compa&amp;amp;shy;rator&lt;br /&gt;
|16-bit Timer&lt;br /&gt;
|8-bit Timer&lt;br /&gt;
|Brown Out Detec&amp;amp;shy;tor&lt;br /&gt;
|On Chip Osci&amp;amp;shy;llator&lt;br /&gt;
|PWM Chan&amp;amp;shy;nels&lt;br /&gt;
|RTC&lt;br /&gt;
|Self Pro&amp;amp;shy;gram Memory&lt;br /&gt;
|Boot Code&lt;br /&gt;
|SPI&lt;br /&gt;
|TWI&lt;br /&gt;
|UART&lt;br /&gt;
|Watch&amp;amp;shy;dog&lt;br /&gt;
|Bau&amp;amp;shy;formen&lt;br /&gt;
|Preis&lt;br /&gt;
&amp;lt;!-- diesen Kommentar entfernen nach dem Kopieren dieser Eingabehilfe--&amp;gt;&lt;br /&gt;
&amp;lt;!-- ENDE - AT90Sxxxx ---------------------------------------------------------&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== ATtiny - Reihe ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;font-size:10px;&amp;quot; id=&amp;quot;AVR_Features_ATtiny&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
!Typ||Flash (Kbytes)||EEPROM (Bytes)||SRAM (Bytes)||Max I/O Pins||F.max (MHz)||Vcc (V)||A/D Channels||Analog Comparator||16-bit Timer||8-bit Timer||Brown Out Detector||On Chip Oscillator||PWM Channels||RTC||Self Program Memory||Boot Code||SPI||TWI (I2C)||UART||Watchdog||Bauform(en)||Preis&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/Images/doc8127.pdf ATtiny10]&lt;br /&gt;
|1&lt;br /&gt;
| --&lt;br /&gt;
|32&lt;br /&gt;
|4&lt;br /&gt;
|12&lt;br /&gt;
|1.8-5.5&lt;br /&gt;
|4 8-bit&lt;br /&gt;
|Ja&lt;br /&gt;
|1&lt;br /&gt;
| --&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|2&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|SOT23&lt;br /&gt;
| 0.83-0.99&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/dyn/resources/prod_documents/doc1006.pdf ATtiny11]&lt;br /&gt;
|1&lt;br /&gt;
| --&lt;br /&gt;
| --&lt;br /&gt;
|6&lt;br /&gt;
|6&lt;br /&gt;
|2.7-5.5&lt;br /&gt;
| --&lt;br /&gt;
|Ja&lt;br /&gt;
| --&lt;br /&gt;
|1&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
| --&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP8 SOIC8&lt;br /&gt;
| 0.58-0.87&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/dyn/resources/prod_documents/doc1006.pdf ATtiny12]&lt;br /&gt;
|1&lt;br /&gt;
|64&lt;br /&gt;
| --&lt;br /&gt;
|6&lt;br /&gt;
|8&lt;br /&gt;
|1.8-5.5&lt;br /&gt;
| --&lt;br /&gt;
|Ja&lt;br /&gt;
| --&lt;br /&gt;
|1&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
| --&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP8 SOIC8&lt;br /&gt;
| 1.00-1.20&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/Images/doc8126.pdf ATtiny13A]&lt;br /&gt;
|1&lt;br /&gt;
|64&lt;br /&gt;
|64&lt;br /&gt;
|6&lt;br /&gt;
|20&lt;br /&gt;
|1.8-5.5&lt;br /&gt;
|4 10bit&lt;br /&gt;
|Ja&lt;br /&gt;
| --&lt;br /&gt;
|1&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|1&amp;lt;ref&amp;gt;Timer-PWM&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP8 SOIC8&lt;br /&gt;
| 0.60-1.20&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/dyn/resources/prod_documents/doc1187.pdf ATtiny15]&lt;br /&gt;
|1&lt;br /&gt;
|64&lt;br /&gt;
| --&lt;br /&gt;
|6&lt;br /&gt;
|1.6&lt;br /&gt;
|2.7-5.5&lt;br /&gt;
|4 10bit&lt;br /&gt;
|Ja&lt;br /&gt;
| --&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|ONLY&lt;br /&gt;
|1&amp;lt;ref&amp;gt;150kHz 8bit&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP8 SOIC8&lt;br /&gt;
| 1.15&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/Images/Atmel-2586-AVR-8-bit-Microcontroller-ATtiny25-ATtiny45-ATtiny85_Datasheet.pdf ATtiny45]&lt;br /&gt;
|4&lt;br /&gt;
|256&lt;br /&gt;
|256&lt;br /&gt;
|6&lt;br /&gt;
|20&lt;br /&gt;
|2.7-5.5&lt;br /&gt;
|4&lt;br /&gt;
|Ja&lt;br /&gt;
| --&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|2&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP8 SOIC8&lt;br /&gt;
| 0.90-2.00&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/dyn/resources/prod_documents/doc2586.pdf ATtiny85]&lt;br /&gt;
|8&lt;br /&gt;
|512&lt;br /&gt;
|512&lt;br /&gt;
|6&lt;br /&gt;
|20&lt;br /&gt;
|1.8-5.5&lt;br /&gt;
|4&lt;br /&gt;
|Ja&lt;br /&gt;
| --&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|4&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Nein&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP8 SOIC8&lt;br /&gt;
| 0.90-2.00&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/dyn/resources/prod_documents/doc2543.pdf ATtiny2313]&lt;br /&gt;
|2&lt;br /&gt;
|128&lt;br /&gt;
|128&lt;br /&gt;
|18&lt;br /&gt;
|20&lt;br /&gt;
|2.7-5.5&lt;br /&gt;
| --&lt;br /&gt;
|Ja&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|4&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;usip&amp;quot;&amp;gt;+USI&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;usi&amp;quot;&amp;gt;USI&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;usart&amp;quot;&amp;gt;USART&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP20 SOIC20 QFN20 MLF20&lt;br /&gt;
| 1.30&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/Images/doc8246.pdf ATtiny4313]&lt;br /&gt;
|4&lt;br /&gt;
|256&lt;br /&gt;
|256&lt;br /&gt;
|18&lt;br /&gt;
|20&lt;br /&gt;
|1.8-5.5&lt;br /&gt;
| --&lt;br /&gt;
|Ja&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|4&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;usip&amp;quot;&amp;gt;+USI&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;usi&amp;quot;&amp;gt;USI&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;usart&amp;quot;&amp;gt;USART&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP20 SOIC20 QFN20 MLF20&lt;br /&gt;
| 1.00-2.00&lt;br /&gt;
|-&lt;br /&gt;
|[http://atmel.com/dyn/resources/prod_documents/doc8006.pdf ATtiny24]&lt;br /&gt;
|2&lt;br /&gt;
|128&lt;br /&gt;
|128&lt;br /&gt;
|12&lt;br /&gt;
|20&lt;br /&gt;
|2.7-5.5&lt;br /&gt;
|8 10bit&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|4&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;usip&amp;quot;&amp;gt;+USI&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;usi&amp;quot;&amp;gt;USI&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP14 SOIC14 QFN20/MLF20&lt;br /&gt;
|0.85&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/Images/doc8183.pdf ATtiny84A]&lt;br /&gt;
|8&lt;br /&gt;
|512&lt;br /&gt;
|512&lt;br /&gt;
|12&lt;br /&gt;
|20&lt;br /&gt;
|1.8-5.5&lt;br /&gt;
|8 10bit&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|4&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;usip&amp;quot;&amp;gt;+USI&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;usi&amp;quot;&amp;gt;USI&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP14 SOIC14 QFN20/MLF20&lt;br /&gt;
|1,00-4,00&lt;br /&gt;
|-&lt;br /&gt;
|[http://atmel.com/dyn/resources/prod_documents/doc2588.pdf  ATtiny261]&lt;br /&gt;
|2&lt;br /&gt;
|128&lt;br /&gt;
|128&lt;br /&gt;
|16&lt;br /&gt;
|20&lt;br /&gt;
|1,8-5,5&lt;br /&gt;
|11&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|2&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;usip&amp;quot;&amp;gt;+USI&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;usi&amp;quot;&amp;gt;USI&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP20 SOIC20 MLF20 (TSSOP20 bei Tiny261A)&lt;br /&gt;
|1,15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== ATmega - Reihe ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;font-size: 10px;&amp;quot; id=&amp;quot;AVR_Features_ATMega&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
!Typ||Flash &amp;lt;br/&amp;gt;(Kbytes)||EEPROM &amp;lt;br/&amp;gt;(Bytes)||SRAM &amp;lt;br/&amp;gt;(Bytes)||Max I/O &amp;lt;br/&amp;gt;Pins||F.max &amp;lt;br/&amp;gt;(MHz)||Vcc (V)||A/D &amp;lt;br/&amp;gt;Chan&amp;amp;shy;nels||Ana&amp;amp;shy;log &amp;lt;br/&amp;gt;Compa&amp;amp;shy;rator||16-bit &amp;lt;br/&amp;gt;Timer||8-bit &amp;lt;br/&amp;gt;Timer||Brown Out Detec&amp;amp;shy;tor||On Chip Oscillator||PWM Chan&amp;amp;shy;nels||RTC||Self Pro&amp;amp;shy;gram Memory||Boot Code||SPI||TWI (I2C)||UART||Watch&amp;amp;shy;dog||Bau&amp;amp;shy;form||Preis&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/dyn/resources/prod_documents/2486S.pdf ATmega8]&amp;lt;br&amp;gt;[http://www.atmel.com/Images/Atmel-8159-8-bit-AVR-microcontroller-ATmega8A_datasheet.pdf ATmega8A]&lt;br /&gt;
|8&lt;br /&gt;
|512&lt;br /&gt;
|1K&lt;br /&gt;
|23&lt;br /&gt;
|16&lt;br /&gt;
|2.7-5.5&lt;br /&gt;
|6 10bit PDIP&amp;lt;br/&amp;gt;8 10bit TQFP QFN/MLF&lt;br /&gt;
|Ja&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|3&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;br/&amp;gt;USART&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP28 TQFP32 QFN/MLF32&lt;br /&gt;
| 1.50-4.00&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/dyn/resources/prod_documents/doc2466.pdf ATmega16]&lt;br /&gt;
|16&lt;br /&gt;
|512&lt;br /&gt;
|1K&lt;br /&gt;
|32&lt;br /&gt;
|16&lt;br /&gt;
|2.7-5.5&lt;br /&gt;
|8 10bit&lt;br /&gt;
|Ja&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|4&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;ms&amp;quot;&amp;gt;Master/Slave&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|1&amp;lt;ref name=&amp;quot;usart&amp;quot;&amp;gt;USART&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP40 TQFP44 QFN/MLF44&lt;br /&gt;
| 2.60-2.85&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/dyn/resources/prod_documents/doc2513.pdf ATmega162]&lt;br /&gt;
|16&lt;br /&gt;
|512&lt;br /&gt;
|1K&lt;br /&gt;
|35&lt;br /&gt;
|16&lt;br /&gt;
|2.7-5.5&lt;br /&gt;
|Keine&lt;br /&gt;
|Ja&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|6&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;ms&amp;quot;&amp;gt;Master/Slave&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Nein&lt;br /&gt;
|2&amp;lt;ref name=&amp;quot;usart&amp;quot;&amp;gt;USART&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP40 TQFP44 QFN/MLF44&lt;br /&gt;
| 2.70-3.80&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/dyn/resources/prod_documents/doc2503.pdf ATmega32]&lt;br /&gt;
|32&lt;br /&gt;
|1K&lt;br /&gt;
|2K&lt;br /&gt;
|32&lt;br /&gt;
|16&lt;br /&gt;
|2.7-5.5&lt;br /&gt;
|8 10bit&lt;br /&gt;
|Ja&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|4&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;ms&amp;quot;&amp;gt;Master/Slave&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|1&amp;lt;ref name=&amp;quot;usart&amp;quot;&amp;gt;USART&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP40 TQFP44 QFN/MLF44&lt;br /&gt;
| 3.20-4.60&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/Images/doc8271.pdf ATmega48A]&lt;br /&gt;
|4&lt;br /&gt;
|256&lt;br /&gt;
|512&lt;br /&gt;
|23&lt;br /&gt;
|20&lt;br /&gt;
|1.8-5.5&lt;br /&gt;
|6 10bit PDIP&amp;lt;br/&amp;gt;8 10bit TQFP QFN/MLF&lt;br /&gt;
|Ja&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|6&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;ms&amp;quot;&amp;gt;Master/Slave&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|1&amp;lt;ref name=&amp;quot;usart&amp;quot;&amp;gt;USART&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP28 TQFP32 QFN/MLF32&lt;br /&gt;
| 2.00-4.50&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/Images/doc8271.pdf ATmega88A]&lt;br /&gt;
|8&lt;br /&gt;
|512&lt;br /&gt;
|1K&lt;br /&gt;
|23&lt;br /&gt;
|20&lt;br /&gt;
|1.8-5.5&lt;br /&gt;
|6 10bit PDIP&amp;lt;br/&amp;gt;8 10bit TQFP QFN/MLF&lt;br /&gt;
|Ja&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|6&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;ms&amp;quot;&amp;gt;Master/Slave&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|1&amp;lt;ref name=&amp;quot;usart&amp;quot;&amp;gt;USART&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP28 TQFP32 QFN/MLF32&lt;br /&gt;
| 2.00-4.50&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.atmel.com/Images/doc8011.pdf ATmega164]&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|PDIP40 TQFP44 QFN/MLF44&lt;br /&gt;
| 2.00-4.50&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[http://www.atmel.com/Images/doc8271.pdf ATmega168A]&lt;br /&gt;
|16&lt;br /&gt;
|512&lt;br /&gt;
|1K&lt;br /&gt;
|23&lt;br /&gt;
|20&lt;br /&gt;
|1.8-5.5&lt;br /&gt;
|6 10bit PDIP&amp;lt;br/&amp;gt;8 10bit TQFP QFN/MLF&lt;br /&gt;
|Ja&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|6&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;ms&amp;quot;&amp;gt;Master/Slave&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|1&amp;lt;ref name=&amp;quot;usart&amp;quot;&amp;gt;USART&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP28 TQFP32 QFN/MLF32&lt;br /&gt;
| 2.00-4.50&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|[http://www.atmel.com/Images/doc8271.pdf ATmega328]&lt;br /&gt;
|32&lt;br /&gt;
|1K&lt;br /&gt;
|2K&lt;br /&gt;
|23&lt;br /&gt;
|20&lt;br /&gt;
|1.8-5.5&lt;br /&gt;
|6 10bit PDIP&amp;lt;br/&amp;gt;8 10bit TQFP QFN/MLF&lt;br /&gt;
|Ja&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|6&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;ms&amp;quot;&amp;gt;Master/Slave&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|1&amp;lt;ref name=&amp;quot;usart&amp;quot;&amp;gt;USART&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP28 TQFP32 QFN/MLF32&lt;br /&gt;
| 2.00-4.50&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/Images/doc8272.pdf ATmega324A]&lt;br /&gt;
|32&lt;br /&gt;
|1K&lt;br /&gt;
|2K&lt;br /&gt;
|32&lt;br /&gt;
|20&lt;br /&gt;
|1.8-5.5&lt;br /&gt;
|8 10bit&lt;br /&gt;
|Ja&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|6&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;ms&amp;quot;&amp;gt;Master/Slave&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP40 TQFP44 VQFN44 QFN/MLF44 DRQFN44 VFBGA49&lt;br /&gt;
| 3.50-4.50&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/atmel/acrobat/doc2490.pdf ATmega64]&amp;lt;ref&amp;gt;Geliefert im ATmega103-Modus. Fuse ändern!&amp;lt;/ref&amp;gt;&lt;br /&gt;
|64&lt;br /&gt;
|2K&lt;br /&gt;
|4K&lt;br /&gt;
|53&lt;br /&gt;
|16&lt;br /&gt;
|2.7-5.5&lt;br /&gt;
|8 10bit&lt;br /&gt;
|Ja&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|2 8bit, 6 2-16bit&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;ms&amp;quot;&amp;gt;Master/Slave&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|1&amp;lt;ref name=&amp;quot;usart&amp;quot;&amp;gt;USART&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
| TQFP64 QFN/MLF64&lt;br /&gt;
| 7.50-9.50&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/dyn/resources/prod_documents/doc2593.pdf  ATmega644]&lt;br /&gt;
|64&lt;br /&gt;
|2K&lt;br /&gt;
|4K&lt;br /&gt;
|32&lt;br /&gt;
|20&lt;br /&gt;
|1.8-5.5&lt;br /&gt;
|8 10bit&lt;br /&gt;
|Ja&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|6&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;ms&amp;quot;&amp;gt;Master/Slave&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|1&amp;lt;ref name=&amp;quot;usart&amp;quot;&amp;gt;USART&amp;lt;/ref&amp;gt; 2&amp;lt;ref&amp;gt;beim 644P&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP40 TQFP44 QFN/MLF44&lt;br /&gt;
| 6.80-7.50&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/dyn/resources/prod_documents/doc2467.pdf ATmega128]&lt;br /&gt;
|128&lt;br /&gt;
|4K&lt;br /&gt;
|4K&lt;br /&gt;
|53&lt;br /&gt;
|16&lt;br /&gt;
|2.7-5.5&lt;br /&gt;
|8 10bit&lt;br /&gt;
|Ja&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|2 8bit&amp;lt;br/&amp;gt;6 2-16bit&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;ms&amp;quot;&amp;gt;Master/Slave&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|2&amp;lt;ref name=&amp;quot;usart&amp;quot;&amp;gt;USART&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|TQFP64 QFN/MLF64&lt;br /&gt;
|8.05-8.40  &lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/dyn/products/product_card.asp?part_id=4331 ATmega1284P]&lt;br /&gt;
|128&lt;br /&gt;
|4K&lt;br /&gt;
|16K&lt;br /&gt;
|32&lt;br /&gt;
|20&lt;br /&gt;
|1.8-5.5&lt;br /&gt;
|8 10bit&lt;br /&gt;
|Ja&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|6 &lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;ms&amp;quot;&amp;gt;Master/Slave&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|2&amp;lt;ref name=&amp;quot;usart&amp;quot;&amp;gt;USART&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP40 TQFP44 QFN/MLF44&lt;br /&gt;
|5.00-7.00&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/dyn/resources/prod_documents/doc2549.pdf ATmega2560]&lt;br /&gt;
|256&lt;br /&gt;
|4K&lt;br /&gt;
|8K&lt;br /&gt;
|86&lt;br /&gt;
|16&lt;br /&gt;
|2.7-5.5&lt;br /&gt;
|16 10bit&lt;br /&gt;
|Ja&lt;br /&gt;
|4&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|16&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;ms&amp;quot;&amp;gt;Master/Slave&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|4&amp;lt;ref name=&amp;quot;usart&amp;quot;&amp;gt;USART&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|TQFP100&lt;br /&gt;
|8.00-15.00&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/atmel/acrobat/doc2512.pdf ATmega8515]&lt;br /&gt;
|8&lt;br /&gt;
|512&lt;br /&gt;
|512&lt;br /&gt;
|35&lt;br /&gt;
|16&lt;br /&gt;
|2.7-5.5&lt;br /&gt;
|Keine&lt;br /&gt;
|Ja&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|1 8-bit, 1 16-bit&lt;br /&gt;
|Nein&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;ms&amp;quot;&amp;gt;Master/Slave&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Nein&lt;br /&gt;
|1&amp;lt;ref name=&amp;quot;usart&amp;quot;&amp;gt;USART&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP40 TQFP44 PLCC44 QFN/MLF44&lt;br /&gt;
|3.20-3.90&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.atmel.com/atmel/acrobat/doc2502.pdf ATmega8535]&lt;br /&gt;
|8&lt;br /&gt;
|512&lt;br /&gt;
|512&lt;br /&gt;
|32&lt;br /&gt;
|16&lt;br /&gt;
|2.7-5.5&lt;br /&gt;
|8 10bit&lt;br /&gt;
|Ja&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|2 8-bit, 2 16-bit&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&lt;br /&gt;
|Ja&amp;lt;ref name=&amp;quot;ms&amp;quot;&amp;gt;Master/Slave&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|1&amp;lt;ref name=&amp;quot;usart&amp;quot;&amp;gt;USART&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Ja&lt;br /&gt;
|PDIP44 PLCC44 QFN/MLF44&lt;br /&gt;
|3.15-3.75&lt;br /&gt;
&amp;lt;!-- START - ATMegaxxxx -------------------------------------------------------&amp;gt;&lt;br /&gt;
&amp;lt;!-- diesen Kommentar entfernen nach dem Kopieren dieser Eingabehilfe -- &amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Typ&lt;br /&gt;
|Flash (Kbytes)&lt;br /&gt;
|EEPROM (Bytes)&lt;br /&gt;
|SRAM (Bytes)&lt;br /&gt;
|Max I/O Pins&lt;br /&gt;
|F.max (MHz)&lt;br /&gt;
|Vcc (V)&lt;br /&gt;
|A/D Channels&lt;br /&gt;
|Analog Comparator&lt;br /&gt;
|16-bit Timer&lt;br /&gt;
|8-bit Timer&lt;br /&gt;
|Brown Out Detector&lt;br /&gt;
|On Chip Oscillator&lt;br /&gt;
|PWM Channels&lt;br /&gt;
|RTC&lt;br /&gt;
|Self Program Memory&lt;br /&gt;
|Boot Code&lt;br /&gt;
|SPI&lt;br /&gt;
|TWI&lt;br /&gt;
|UART&lt;br /&gt;
|Watchdog&lt;br /&gt;
|Bauform(en)&lt;br /&gt;
|Preis&lt;br /&gt;
&amp;lt;!-- diesen Kommentar entfernen nach dem Kopieren dieser Eingabehilfe--&amp;gt;&lt;br /&gt;
&amp;lt;!-- ENDE - ATMegaxxxx --------------------------------------------------------&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die angegebenen Preise sind Richtwerte. Es empfiehlt sich die Verwendung einer Preissuchmaschine, z.B. [http://www.google.de/shopping google.de/shopping].&lt;br /&gt;
&lt;br /&gt;
=== ATXMega - Reihe ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;font-size: 10px;&amp;quot; id=&amp;quot;AVR_Features_ATXMega&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
!Typ||Flash &amp;lt;br/&amp;gt;(Kbytes)||EEPROM &amp;lt;br/&amp;gt;(KBytes)||SRAM &amp;lt;br/&amp;gt;(KBytes)||Boot &amp;lt;br/&amp;gt;(Kbytes)||Max I/O &amp;lt;br/&amp;gt;Pins||F.max &amp;lt;br/&amp;gt;(MHz)||Vcc (V)||ADC||DAC||PWM &amp;lt;br/&amp;gt;Channels||16-Bit &amp;lt;br/&amp;gt;Timer||SPI||TWI&amp;lt;br/&amp;gt;(I2C)||UART||Bau&amp;amp;shy;formen&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega16a4&lt;br /&gt;
|16&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|4&lt;br /&gt;
|34&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|12-CH @ 12-Bit&lt;br /&gt;
|2-CH @ 12-Bit&lt;br /&gt;
|16&lt;br /&gt;
|5&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|5&lt;br /&gt;
|TQFP44&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega32a4&lt;br /&gt;
|32&lt;br /&gt;
|1&lt;br /&gt;
|4&lt;br /&gt;
|4&lt;br /&gt;
|34&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|12-CH @ 12-Bit&lt;br /&gt;
|2-CH @ 12-Bit&lt;br /&gt;
|16&lt;br /&gt;
|5&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|5&lt;br /&gt;
|TQFP44&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega64a4&lt;br /&gt;
|64&lt;br /&gt;
|2&lt;br /&gt;
|4&lt;br /&gt;
|4&lt;br /&gt;
|34&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|12-CH @ 12-Bit&lt;br /&gt;
|2-CH @ 12-Bit&lt;br /&gt;
|16&lt;br /&gt;
|5&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|5&lt;br /&gt;
|TQFP44&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega128a4&lt;br /&gt;
|128&lt;br /&gt;
|2&lt;br /&gt;
|8&lt;br /&gt;
|8&lt;br /&gt;
|34&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|12-CH @ 12-Bit&lt;br /&gt;
|2-CH @ 12-Bit&lt;br /&gt;
|16&lt;br /&gt;
|5&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|5&lt;br /&gt;
|TQFP44&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega64a3&lt;br /&gt;
|64&lt;br /&gt;
|2&lt;br /&gt;
|4&lt;br /&gt;
|4&lt;br /&gt;
|50&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|2x 8-CH @ 12-Bit&lt;br /&gt;
|2-CH @ 12-Bit&lt;br /&gt;
|22&lt;br /&gt;
|7&lt;br /&gt;
|3&lt;br /&gt;
|2&lt;br /&gt;
|7&lt;br /&gt;
|TQFP64&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega128a3&lt;br /&gt;
|128&lt;br /&gt;
|2&lt;br /&gt;
|8&lt;br /&gt;
|8&lt;br /&gt;
|50&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|2x 8-CH @ 12-Bit&lt;br /&gt;
|2-CH @ 12-Bit&lt;br /&gt;
|22&lt;br /&gt;
|7&lt;br /&gt;
|3&lt;br /&gt;
|2&lt;br /&gt;
|7&lt;br /&gt;
|TQFP64&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega192a3&lt;br /&gt;
|192&lt;br /&gt;
|2&lt;br /&gt;
|16&lt;br /&gt;
|8&lt;br /&gt;
|50&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|2x 8-CH @ 12-Bit&lt;br /&gt;
|2-CH @ 12-Bit&lt;br /&gt;
|22&lt;br /&gt;
|7&lt;br /&gt;
|3&lt;br /&gt;
|2&lt;br /&gt;
|7&lt;br /&gt;
|TQFP64&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega256a3&lt;br /&gt;
|256&lt;br /&gt;
|4&lt;br /&gt;
|16&lt;br /&gt;
|8&lt;br /&gt;
|50&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|2x 8-CH @ 12-Bit&lt;br /&gt;
|2-CH @ 12-Bit&lt;br /&gt;
|22&lt;br /&gt;
|7&lt;br /&gt;
|3&lt;br /&gt;
|2&lt;br /&gt;
|7&lt;br /&gt;
|TQFP64&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega64a1&lt;br /&gt;
|64&lt;br /&gt;
|2&lt;br /&gt;
|4&lt;br /&gt;
|4&lt;br /&gt;
|78&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|2x 8-CH @ 12-Bit&lt;br /&gt;
|2x 2-CH @ 12-Bit&lt;br /&gt;
|24&lt;br /&gt;
|8&lt;br /&gt;
|4&lt;br /&gt;
|4&lt;br /&gt;
|8&lt;br /&gt;
|TQFP100&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega128a1&lt;br /&gt;
|128&lt;br /&gt;
|2&lt;br /&gt;
|8&lt;br /&gt;
|8&lt;br /&gt;
|78&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|2x 8-CH @ 12-Bit&lt;br /&gt;
|2x 2-CH @ 12-Bit&lt;br /&gt;
|24&lt;br /&gt;
|8&lt;br /&gt;
|4&lt;br /&gt;
|4&lt;br /&gt;
|8&lt;br /&gt;
|TQFP100&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega192a1&lt;br /&gt;
|192&lt;br /&gt;
|2&lt;br /&gt;
|16&lt;br /&gt;
|8&lt;br /&gt;
|78&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|2x 8-CH @ 12-Bit&lt;br /&gt;
|2x 2-CH @ 12-Bit&lt;br /&gt;
|24&lt;br /&gt;
|8&lt;br /&gt;
|4&lt;br /&gt;
|4&lt;br /&gt;
|8&lt;br /&gt;
|TQFP100&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega256a1&lt;br /&gt;
|256&lt;br /&gt;
|4&lt;br /&gt;
|16&lt;br /&gt;
|8&lt;br /&gt;
|78&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|2x 8-CH @ 12-Bit&lt;br /&gt;
|2x 2-CH @ 12-Bit&lt;br /&gt;
|24&lt;br /&gt;
|8&lt;br /&gt;
|4&lt;br /&gt;
|4&lt;br /&gt;
|8&lt;br /&gt;
|TQFP100&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega384a1&lt;br /&gt;
|384&lt;br /&gt;
|4&lt;br /&gt;
|32&lt;br /&gt;
|8&lt;br /&gt;
|78&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|2x 8-CH @ 12-Bit&lt;br /&gt;
|2x 2-CH @ 12-Bit&lt;br /&gt;
|24&lt;br /&gt;
|8&lt;br /&gt;
|4&lt;br /&gt;
|4&lt;br /&gt;
|8&lt;br /&gt;
|TQFP100&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega16d4&lt;br /&gt;
|16&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|4&lt;br /&gt;
|34&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|12-CH @ 12-Bit&lt;br /&gt;
|0&lt;br /&gt;
|16&lt;br /&gt;
|4&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|TQFP44&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega32d4&lt;br /&gt;
|32&lt;br /&gt;
|1&lt;br /&gt;
|4&lt;br /&gt;
|4&lt;br /&gt;
|34&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|12-CH @ 12-Bit&lt;br /&gt;
|0&lt;br /&gt;
|16&lt;br /&gt;
|4&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|TQFP44&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega64d4&lt;br /&gt;
|64&lt;br /&gt;
|2&lt;br /&gt;
|4&lt;br /&gt;
|4&lt;br /&gt;
|34&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|12-CH @ 12-Bit&lt;br /&gt;
|0&lt;br /&gt;
|16&lt;br /&gt;
|4&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|TQFP44&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega128d4&lt;br /&gt;
|128&lt;br /&gt;
|2&lt;br /&gt;
|8&lt;br /&gt;
|8&lt;br /&gt;
|34&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|12-CH @ 12-Bit&lt;br /&gt;
|0&lt;br /&gt;
|16&lt;br /&gt;
|4&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|TQFP44&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega64d3&lt;br /&gt;
|64&lt;br /&gt;
|2&lt;br /&gt;
|4&lt;br /&gt;
|4&lt;br /&gt;
|50&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|16-CH @ 12-Bit&lt;br /&gt;
|0&lt;br /&gt;
|18&lt;br /&gt;
|5&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|3&lt;br /&gt;
|TQFP64&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega128d3&lt;br /&gt;
|128&lt;br /&gt;
|2&lt;br /&gt;
|8&lt;br /&gt;
|8&lt;br /&gt;
|50&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|16-CH @ 12-Bit&lt;br /&gt;
|0&lt;br /&gt;
|18&lt;br /&gt;
|5&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|3&lt;br /&gt;
|TQFP64&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega192d3&lt;br /&gt;
|192&lt;br /&gt;
|2&lt;br /&gt;
|16&lt;br /&gt;
|8&lt;br /&gt;
|50&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|16-CH @ 12-Bit&lt;br /&gt;
|0&lt;br /&gt;
|18&lt;br /&gt;
|5&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|3&lt;br /&gt;
|TQFP64&lt;br /&gt;
|-&lt;br /&gt;
|ATxmega256d3&lt;br /&gt;
|256&lt;br /&gt;
|4&lt;br /&gt;
|16&lt;br /&gt;
|8&lt;br /&gt;
|50&lt;br /&gt;
|32&lt;br /&gt;
|1,6 - 3,6&lt;br /&gt;
|16-CH @ 12-Bit&lt;br /&gt;
|0&lt;br /&gt;
|18&lt;br /&gt;
|5&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|3&lt;br /&gt;
|TQFP64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Weitere Vergleichstabellen ==&lt;br /&gt;
Vergleichstabellen zum Downloaden gibt es unter Anderem&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/242328 von Andreas], Stand 19.12.2011; vollständig,&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/232939 von Sven], Stand 22.09.2011; weiter eingedampft.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ATtiny ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Device-specific Features&#039;&#039;&#039;&amp;lt;br/&amp;gt;&amp;amp;nbsp;&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
! Device&lt;br /&gt;
! Flash [KiB]&lt;br /&gt;
! Pin Anz&amp;amp;shy;ahl&lt;br /&gt;
! Max. &amp;amp;fnof;&amp;lt;sub&amp;gt;CPU&amp;lt;/sub&amp;gt; [MHz]&lt;br /&gt;
! of Touch Kan&amp;amp;shy;äle&lt;br /&gt;
! Hard&amp;amp;shy;ware Qtouch&lt;br /&gt;
! Max I/O Pins&lt;br /&gt;
! Ext Inter&amp;amp;shy;rupts&lt;br /&gt;
! SPI&lt;br /&gt;
! TWI&lt;br /&gt;
! UART&lt;br /&gt;
! LIN&lt;br /&gt;
! ADC Kan&amp;amp;shy;äle&lt;br /&gt;
! ADC Auf&amp;amp;shy;lö&amp;amp;shy;sung [bits]&lt;br /&gt;
! ADC Speed [ksps]&lt;br /&gt;
! Temp. Sensor&lt;br /&gt;
! SRAM [KiB]&lt;br /&gt;
! EEPROM [Bytes]&lt;br /&gt;
! Self Pro&amp;amp;shy;gram Memory&lt;br /&gt;
! pico&amp;amp;shy;Power&lt;br /&gt;
! Temp. Bereich [°C]&lt;br /&gt;
! I/O Supply Class [V]&lt;br /&gt;
! Opera&amp;amp;shy;ting Volt&amp;amp;shy;age [V&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt;]&lt;br /&gt;
! Timers&lt;br /&gt;
! Output Com&amp;amp;shy;pare Kan&amp;amp;shy;äle&lt;br /&gt;
! Input Capt&amp;amp;shy;ure Kan&amp;amp;shy;äle&lt;br /&gt;
! PWM Kan&amp;amp;shy;äle&lt;br /&gt;
! 32kHz RTC&lt;br /&gt;
! Device&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny28L&#039;&#039;&#039; || 2 || 28 || 4 || &amp;amp;mdash; || &amp;amp;mdash; || 11 || 10 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || &amp;amp;mdash; || 0.03 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1 || 0 || 0 || 0 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny28L&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny26&#039;&#039;&#039; || 2 || 20 || 16 || &amp;amp;mdash; || &amp;amp;mdash; || 16 || 11 || 1 || 1 || 0 || 0 || 11 || 10 || 15 || &amp;amp;mdash; || 0.12 || 128 || &amp;amp;mdash; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 3 || 0 || 4 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny26&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny13&#039;&#039;&#039; || 1 || 8 || 20 || &amp;amp;mdash; || &amp;amp;mdash; || 6 || 6 || 0 || 0 || 0 || 0 || 4 || 10 || 15 || &amp;amp;mdash; || 0.06 || 64 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1 || 2 || 0 || 2 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny13&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny2313&#039;&#039;&#039; || 2 || 20 || 20 || 4 || &amp;amp;mdash; || 18 || 18 || 2 || 1 || 1 || 0 || 0 || 0 || 15 || &amp;amp;mdash; || 0.12 || 128 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 4 || 1 || 4 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny2313&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny25&#039;&#039;&#039; || 2 || 8 || 20 || 4 || &amp;amp;mdash; || 6 || 6 || 1 || 1 || 0 || 0 || 4 || 10 || 15 || &amp;amp;radic; || 0.12 || 128 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;105 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 5 || 0 || 6 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny25&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny85&#039;&#039;&#039; || 8 || 8 || 20 || 3 || &amp;amp;mdash; || 6 || 6 || 1 || 1 || 0 || 0 || 4 || 10 || 15 || &amp;amp;radic; || 0.5 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 5 || 0 || 6 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny85&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny45&#039;&#039;&#039; || 4 || 8 || 20 || 3 || &amp;amp;mdash; || 6 || 6 || 1 || 1 || 0 || 0 || 4 || 10 || 15 || &amp;amp;radic; || 0.25 || 256 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 5 || 0 || 6 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny45&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny24&#039;&#039;&#039; || 2 || 14 || 20 || 4 || &amp;amp;mdash; || 12 || 12 || 1 || 1 || 0 || 0 || 8 || 10 || 15 || &amp;amp;radic; || 0.12 || 128 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 4 || 1 || 4 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny24&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny44&#039;&#039;&#039; || 4 || 14 || 20 || 6 || &amp;amp;mdash; || 12 || 12 || 1 || 1 || 0 || 0 || 8 || 10 || 15 || &amp;amp;radic; || 0.25 || 256 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 4 || 1 || 4 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny44&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny84&#039;&#039;&#039; || 8 || 14 || 20 || 6 || &amp;amp;mdash; || 12 || 12 || 1 || 1 || 0 || 0 || 8 || 10 || 15 || &amp;amp;radic; || 0.5 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 4 || 1 || 4 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny84&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny261&#039;&#039;&#039; || 2 || 20 || 20 || 4 || &amp;amp;mdash; || 16 || 16 || 1 || 1 || 0 || 0 || 11 || 10 || 15 || &amp;amp;radic; || 0.12 || 128 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 6 || 1 || 6 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny261&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny461&#039;&#039;&#039; || 4 || 20 || 20 || 8 || &amp;amp;mdash; || 16 || 16 || 1 || 1 || 0 || 0 || 11 || 10 || 15 || &amp;amp;radic; || 0.25 || 256 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 6 || 1 || 6 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny461&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny861&#039;&#039;&#039; || 8 || 20 || 20 || 8 || &amp;amp;mdash; || 16 || 16 || 1 || 1 || 0 || 0 || 11 || 10 || 15 || &amp;amp;radic; || 0.5 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 6 || 1 || 6 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny861&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny13A&#039;&#039;&#039; || 1 || 8 || 20 || &amp;amp;mdash; || &amp;amp;mdash; || 6 || 6 || 0 || 0 || 0 || 0 || 4 || 10 || 15 || &amp;amp;mdash; || 0.06 || 64 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;125 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1 || 2 || 0 || 2 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny13A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny48&#039;&#039;&#039; || 4 || 32 || 12 || 12 || &amp;amp;mdash; || 28 || 28 || 1 || 1 || 0 || 0 || 8 || 10 || 15 || &amp;amp;radic; || 0.25 || 64 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 4 || 1 || 2 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny48&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny88&#039;&#039;&#039; || 8 || 32 || 12 || 12 || &amp;amp;mdash; || 28 || 28 || 1 || 1 || 0 || 0 || 8 || 10 || 15 || &amp;amp;radic; || 0.5 || 64 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 4 || 1 || 2 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny88&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny24A&#039;&#039;&#039; || 2 || 14 || 20 || 4 || &amp;amp;mdash; || 12 || 12 || 1 || 1 || 0 || 0 || 8 || 10 || 15 || &amp;amp;radic; || 0.12 || 128 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 4 || 1 || 4 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny24A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny44A&#039;&#039;&#039; || 4 || 14 || 20 || 6 || &amp;amp;mdash; || 12 || 12 || 1 || 1 || 0 || 0 || 8 || 10 || 15 || &amp;amp;radic; || 0.25 || 256 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 4 || 1 || 4 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny44A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny43U&#039;&#039;&#039; || 4 || 20 || 8 || 8 || &amp;amp;mdash; || 16 || 16 || 1 || 1 || 0 || 0 || 4 || 10 || 15 || &amp;amp;radic; || 0.25 || 64 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 0.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 0.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 4 || 0 || 4 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny43U&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny10&#039;&#039;&#039; || 1 || 6 || 12 || 1 || &amp;amp;mdash; || 4 || 4 || 0 || 0 || 0 || 0 || 4 || 8 || 15 || &amp;amp;mdash; || 0.03 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;125 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1 || 2 || 1 || 2 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny10&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny4&#039;&#039;&#039; || 0.5 || 6 || 12 || 1 || &amp;amp;mdash; || 4 || 4 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || &amp;amp;mdash; || 0.03 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;125 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1 || 2 || 1 || 2 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny4&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny5&#039;&#039;&#039; || 0.5 || 6 || 12 || 1 || &amp;amp;mdash; || 4 || 4 || 0 || 0 || 0 || 0 || 4 || 8 || 15 || &amp;amp;mdash; || 0.03 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;125 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1 || 2 || 1 || 2 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny5&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny9&#039;&#039;&#039; || 1 || 6 || 12 || 1 || &amp;amp;mdash; || 4 || 4 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || &amp;amp;mdash; || 0.03 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;125 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1 || 2 || 1 || 2 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny9&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny261A&#039;&#039;&#039; || 2 || 20 || 20 || 4 || &amp;amp;mdash; || 16 || 16 || 1 || 1 || 0 || 0 || 11 || 10 || 15 || &amp;amp;radic; || 0.12 || 128 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;105 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 6 || 1 || 6 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny261A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny461A&#039;&#039;&#039; || 4 || 20 || 20 || 8 || &amp;amp;mdash; || 16 || 16 || 1 || 1 || 0 || 0 || 11 || 10 || 15 || &amp;amp;radic; || 0.25 || 256 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 6 || 1 || 6 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny461A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny861A&#039;&#039;&#039; || 8 || 20 || 20 || 8 || &amp;amp;mdash; || 16 || 16 || 1 || 1 || 0 || 0 || 11 || 10 || 15 || &amp;amp;radic; || 0.5 || 512 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 6 || 1 || 6 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny861A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny2313A&#039;&#039;&#039; || 2 || 20 || 20 || &amp;amp;mdash; || &amp;amp;mdash; || 18 || 18 || 2 || 1 || 1 || 0 || 0 || 0 || 15 || &amp;amp;mdash; || 0.12 || 128 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 4 || 1 || 4 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny2313A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny4313&#039;&#039;&#039; || 4 || 20 || 20 || &amp;amp;mdash; || &amp;amp;mdash; || 18 || 18 || 2 || 1 || 1 || 0 || 0 || 0 || 15 || &amp;amp;mdash; || 0.25 || 256 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 4 || 1 || 4 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny4313&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny167&#039;&#039;&#039; || 16 || 20 || 16 || 8 || &amp;amp;mdash; || 16 || 16 || 2 || 1 || 1 || 1 || 11 || 10 || 15 || &amp;amp;radic; || 0.5 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 3 || 1 || 9 || &amp;amp;radic; || &#039;&#039;&#039;ATtiny167&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny87&#039;&#039;&#039; || 8 || 20 || 16 || &amp;amp;mdash; || &amp;amp;mdash; || 16 || 16 || 2 || 1 || 1 || 1 || 11 || 10 || 15 || &amp;amp;radic; || 0.5 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 3 || 1 || 9 || &amp;amp;radic; || &#039;&#039;&#039;ATtiny87&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny20&#039;&#039;&#039; || 2 || 14 || 12 || 5 || &amp;amp;radic; || 12 || 12 || 1 || 1 || 0 || 0 || 8 || 10 || 15 || &amp;amp;radic; || 0.12 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 4 || 1 || 3 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny20&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny40&#039;&#039;&#039; || 4 || 20 || 12 || 12 || &amp;amp;radic; || 18 || 18 || 1 || 1 || 0 || 0 || 12 || 10 || 15 || &amp;amp;radic; || 0.25 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 4 || 1 || 2 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny40&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATtiny84A&#039;&#039;&#039; || 8 || 14 || 20 || 6 || &amp;amp;mdash; || 12 || 12 || 1 || 1 || 0 || 0 || 8 || 10 || 15 || &amp;amp;radic; || 0.5 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 4 || 1 || 4 || &amp;amp;mdash; || &#039;&#039;&#039;ATtiny84A&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;General Features&#039;&#039;&#039;&amp;lt;br/&amp;gt;&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;CPU&#039;&#039;&#039; || 8-bit AVR&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Quadrature Decoder Kanäle&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;USB Transceiver&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;USB Speed&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;USB Interface&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;CAN&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;SSC&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Ethernet&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;SD / eMMC&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Segment LCD&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Grafik LCD&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Video Decoder&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Kamera Interface&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Analog Comparators&#039;&#039;&#039; || 1&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Resistive Touch Screen&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;DAC Kanäle&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;DAC Auflösung [bits]&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;External Bus Interface&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;DRAM Memory&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;NAND Interface&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;FPU&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;MPU / MMU&#039;&#039;&#039; || nein / nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Crypto Engine&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Calibrated RC Oscillator&#039;&#039;&#039; || ja&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== ATmega ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Device-specific Features&#039;&#039;&#039;&amp;lt;br/&amp;gt;&amp;amp;nbsp;&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
! Device&lt;br /&gt;
! Flash [KiB]&lt;br /&gt;
! Pin Anz&amp;amp;shy;ahl&lt;br /&gt;
! Max. &amp;amp;fnof;&amp;lt;sub&amp;gt;CPU&amp;lt;/sub&amp;gt; [MHz]&lt;br /&gt;
! of Touch Kan&amp;amp;shy;äle&lt;br /&gt;
! Max I/O Pins&lt;br /&gt;
! Ext Inter&amp;amp;shy;rupts&lt;br /&gt;
! USB Trans&amp;amp;shy;cei&amp;amp;shy;ver&lt;br /&gt;
! USB Speed&lt;br /&gt;
! USB Inter&amp;amp;shy;face&lt;br /&gt;
! SPI&lt;br /&gt;
! TWI&lt;br /&gt;
! UART&lt;br /&gt;
! CAN&lt;br /&gt;
! LIN&lt;br /&gt;
! Seg&amp;amp;shy;ment LCD&lt;br /&gt;
! ADC Kan&amp;amp;shy;äle&lt;br /&gt;
! ADC Auf&amp;amp;shy;lö&amp;amp;shy;sung [bits]&lt;br /&gt;
! ADC Speed [ksps]&lt;br /&gt;
! Ana&amp;amp;shy;log Com&amp;amp;shy;para&amp;amp;shy;tors&lt;br /&gt;
! DAC Kan&amp;amp;shy;äle&lt;br /&gt;
! DAC Auf&amp;amp;shy;lö&amp;amp;shy;sung [bits]&lt;br /&gt;
! Temp. Sensor&lt;br /&gt;
! SRAM [KiB]&lt;br /&gt;
! EEPROM [Bytes]&lt;br /&gt;
! Self Pro&amp;amp;shy;gram Memory&lt;br /&gt;
! pico&amp;amp;shy;Power&lt;br /&gt;
! Temp. Bereich [°C]&lt;br /&gt;
! I/O Supply Class [V]&lt;br /&gt;
! Opera&amp;amp;shy;ting Volt&amp;amp;shy;age [V&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt;]&lt;br /&gt;
! Timers&lt;br /&gt;
! Output Com&amp;amp;shy;pare Kan&amp;amp;shy;äle&lt;br /&gt;
! Input Capt&amp;amp;shy;ure Kan&amp;amp;shy;äle&lt;br /&gt;
! PWM Kan&amp;amp;shy;äle&lt;br /&gt;
! 32kHz RTC&lt;br /&gt;
! Device&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega8&#039;&#039;&#039; || 8 || 32 || 16 || 12 || 23 || 2 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 1 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 3 || 1 || 3 || &amp;amp;radic; || &#039;&#039;&#039;ATmega8&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega8515&#039;&#039;&#039; || 8 || 44 || 16 || 16 || 35 || 3 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 0 || 1 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || &amp;amp;mdash; || 0.5 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 3 || 1 || 3 || &amp;amp;mdash; || &#039;&#039;&#039;ATmega8515&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega8535&#039;&#039;&#039; || 8 || 44 || 16 || 16 || 32 || 3 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 0.5 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega8535&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega16&#039;&#039;&#039; || 16 || 44 || 16 || 16 || 32 || 3 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 1 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega16&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega32&#039;&#039;&#039; || 32 || 44 || 16 || 16 || 32 || 3 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega32&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega64&#039;&#039;&#039; || 64 || 64 || 16 || 16 || 53 || 8 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 1 || 2 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 4 || 8 || 2 || 7 || &amp;amp;radic; || &#039;&#039;&#039;ATmega64&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega128&#039;&#039;&#039; || 128 || 64 || 16 || 16 || 53 || 8 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 1 || 2 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 4096 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 4 || 8 || 2 || 7 || &amp;amp;radic; || &#039;&#039;&#039;ATmega128&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega162&#039;&#039;&#039; || 16 || 44 || 16 || 16 || 35 || 3 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 0 || 2 || 0 || 0 || 0 || 0 || 0 || 0 || 1 || 0 || 0 || &amp;amp;mdash; || 1 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 4 || 6 || 2 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega162&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega48&#039;&#039;&#039; || 4 || 32 || 20 || 12 || 23 || 24 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 0.5 || 256 || &amp;amp;mdash; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega48&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega88&#039;&#039;&#039; || 8 || 32 || 20 || 12 || 23 || 24 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 1 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega88&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega168&#039;&#039;&#039; || 16 || 32 || 20 || 16 || 23 || 24 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 1 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega168&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;AT90CAN128&#039;&#039;&#039; || 128 || 64 || 16 || 16 || 53 || 8 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 1 || 2 || 1 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 4096 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 4 || 8 || 2 || 7 || &amp;amp;radic; || &#039;&#039;&#039;AT90CAN128&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega325&#039;&#039;&#039; || 32 || 64 || 16 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega325&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega3250&#039;&#039;&#039; || 32 || 100 || 16 || 16 || 69 || 25 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega3250&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega6450&#039;&#039;&#039; || 64 || 100 || 16 || &amp;amp;mdash; || 69 || 25 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega6450&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega645&#039;&#039;&#039; || 64 || 64 || 16 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega645&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega329&#039;&#039;&#039; || 32 || 64 || 16 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 100 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega329&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega3290&#039;&#039;&#039; || 32 || 100 || 16 || 16 || 69 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 160 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega3290&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega649&#039;&#039;&#039; || 64 || 64 || 16 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 100 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega649&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega6490&#039;&#039;&#039; || 64 || 100 || 16 || 16 || 69 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 160 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega6490&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega640&#039;&#039;&#039; || 64 || 100 || 16 || 16 || 86 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 5 || 1 || 4 || 0 || 0 || 0 || 16 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 8 || 4096 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 6 || 16 || 4 || 15 || &amp;amp;radic; || &#039;&#039;&#039;ATmega640&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega1281&#039;&#039;&#039; || 128 || 64 || 16 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 3 || 1 || 2 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 8 || 4096 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 6 || 16 || 2 || 8 || &amp;amp;radic; || &#039;&#039;&#039;ATmega1281&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega2561&#039;&#039;&#039; || 256 || 64 || 16 || &amp;amp;mdash; || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 3 || 1 || 2 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 8 || 4096 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 6 || 16 || 2 || 8 || &amp;amp;radic; || &#039;&#039;&#039;ATmega2561&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega2560&#039;&#039;&#039; || 256 || 100 || 16 || &amp;amp;mdash; || 86 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 5 || 1 || 4 || 0 || 0 || 0 || 16 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 8 || 4096 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 6 || 16 || 4 || 15 || &amp;amp;radic; || &#039;&#039;&#039;ATmega2560&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega1280&#039;&#039;&#039; || 128 || 100 || 16 || 16 || 86 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 5 || 1 || 4 || 0 || 0 || 0 || 16 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 8 || 4096 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 6 || 16 || 4 || 15 || &amp;amp;radic; || &#039;&#039;&#039;ATmega1280&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega644&#039;&#039;&#039; || 64 || 44 || 20 || 16 || 32 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 3 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega644&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;AT90CAN32&#039;&#039;&#039; || 32 || 64 || 16 || 16 || 53 || 8 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 1 || 2 || 1 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 4 || 8 || 2 || 7 || &amp;amp;radic; || &#039;&#039;&#039;AT90CAN32&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;AT90CAN64&#039;&#039;&#039; || 64 || 64 || 16 || 16 || 53 || 8 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 1 || 2 || 1 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 4 || 8 || 2 || 7 || &amp;amp;radic; || &#039;&#039;&#039;AT90CAN64&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;AT90USB1286&#039;&#039;&#039; || 128 || 64 || 16 || 16 || 48 || 16 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 8 || 4096 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 4 || 10 || 1 || 9 || &amp;amp;radic; || &#039;&#039;&#039;AT90USB1286&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;AT90USB1287&#039;&#039;&#039; || 128 || 64 || 16 || 16 || 48 || 16 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbo&amp;quot;&amp;gt;Device + OTG&amp;lt;/ref&amp;gt; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 8 || 4096 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 4 || 10 || 1 || 9 || &amp;amp;radic; || &#039;&#039;&#039;AT90USB1287&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;AT90USB647&#039;&#039;&#039; || 64 || 64 || 16 || 16 || 48 || 16 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbo&amp;quot;&amp;gt;Device + OTG&amp;lt;/ref&amp;gt; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 4 || 10 || 1 || 9 || &amp;amp;radic; || &#039;&#039;&#039;AT90USB647&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;AT90USB646&#039;&#039;&#039; || 64 || 64 || 16 || 16 || 48 || 16 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 4 || 10 || 1 || 9 || &amp;amp;radic; || &#039;&#039;&#039;AT90USB646&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega164P&#039;&#039;&#039; || 16 || 44 || 20 || 16 || 32 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 3 || 1 || 2 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 1 || 512 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega164P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega324P&#039;&#039;&#039; || 32 || 44 || 20 || 16 || 32 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 3 || 1 || 2 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega324P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega165P&#039;&#039;&#039; || 16 || 64 || 16 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 1 || 512 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega165P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega169P&#039;&#039;&#039; || 16 || 64 || 16 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 100 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 1 || 512 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega169P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega644P&#039;&#039;&#039; || 64 || 44 || 20 || 16 || 32 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 3 || 1 || 2 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega644P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;AT90PWM1&#039;&#039;&#039; || 8 || 24 || 16 || 8 || 19 || 4 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 0 || 0 || 0 || 0 || 0 || 8 || 10 || 125 || 2 || 0 || 0 || &amp;amp;mdash; || 0.5 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;105 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 4 || 12 || 1 || 7 || &amp;amp;mdash; || &#039;&#039;&#039;AT90PWM1&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega329P&#039;&#039;&#039; || 32 || 64 || 20 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 100 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega329P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega3290P&#039;&#039;&#039; || 32 || 100 || 20 || 16 || 69 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 160 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega3290P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega325P&#039;&#039;&#039; || 32 || 64 || 20 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega325P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega3250P&#039;&#039;&#039; || 32 || 100 || 20 || 16 || 69 || 25 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega3250P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;AT90USB82&#039;&#039;&#039; || 8 || 32 || 16 || 12 || 22 || 21 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 2 || 0 || 1 || 0 || 0 || 0 || 0 || 0 || 0 || 1 || 0 || 0 || &amp;amp;mdash; || 0.5 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 5 || 1 || 4 || &amp;amp;mdash; || &#039;&#039;&#039;AT90USB82&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;AT90USB162&#039;&#039;&#039; || 16 || 32 || 16 || &amp;amp;mdash; || 22 || 21 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 2 || 0 || 1 || 0 || 0 || 0 || 0 || 0 || 0 || 1 || 0 || 0 || &amp;amp;mdash; || 0.5 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 5 || 1 || 4 || &amp;amp;mdash; || &#039;&#039;&#039;AT90USB162&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;AT90PWM216&#039;&#039;&#039; || 16 || 24 || 16 || 12 || 19 || 4 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 0 || 1 || 0 || 0 || 0 || 8 || 10 || 125 || 2 || 1 || 10 || &amp;amp;mdash; || 1 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;105 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 4 || 12 || 1 || 7 || &amp;amp;mdash; || &#039;&#039;&#039;AT90PWM216&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;AT90PWM316&#039;&#039;&#039; || 16 || 32 || 16 || 12 || 27 || 4 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 0 || 1 || 0 || 0 || 0 || 11 || 10 || 125 || 3 || 1 || 10 || &amp;amp;mdash; || 1 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;105 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 5 || 16 || 1 || 12 || &amp;amp;mdash; || &#039;&#039;&#039;AT90PWM316&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega48P&#039;&#039;&#039; || 4 || 32 || 20 || 12 || 23 || 24 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;radic; || 0.5 || 256 || &amp;amp;mdash; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega48P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega88P&#039;&#039;&#039; || 8 || 32 || 20 || 12 || 23 || 24 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;radic; || 1 || 512 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega88P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega168P&#039;&#039;&#039; || 16 || 32 || 20 || 16 || 23 || 24 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;radic; || 1 || 512 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega168P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega328P&#039;&#039;&#039; || 32 || 32 || 20 || 16 || 23 || 24 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;radic; || 2 || 1024 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega328P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;AT90PWM3B&#039;&#039;&#039; || 8 || 32 || 16 || 8 || 27 || 4 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 0 || 1 || 0 || 0 || 0 || 11 || 10 || 125 || 3 || 1 || 10 || &amp;amp;mdash; || 0.5 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;105 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 5 || 16 || 1 || 12 || &amp;amp;mdash; || &#039;&#039;&#039;AT90PWM3B&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;AT90PWM2B&#039;&#039;&#039; || 8 || 24 || 16 || 8 || 19 || 4 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 0 || 1 || 0 || 0 || 0 || 8 || 10 || 125 || 2 || 1 || 10 || &amp;amp;mdash; || 0.5 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;105 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 4 || 12 || 1 || 7 || &amp;amp;mdash; || &#039;&#039;&#039;AT90PWM2B&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega32U4&#039;&#039;&#039; || 32 || 44 || 16 || 14 || 26 || 13 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 2 || 1 || 1 || 0 || 0 || 0 || 12 || 10 || 15 || 1 || 0 || 0 || &amp;amp;radic; || 2.5 || 1024 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 4 || 12 || 2 || 8 || &amp;amp;mdash; || &#039;&#039;&#039;ATmega32U4&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega1284P&#039;&#039;&#039; || 128 || 44 || 20 || 16 || 32 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 3 || 1 || 2 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 16 || 4096 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega1284P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega16U4&#039;&#039;&#039; || 16 || 44 || 16 || 14 || 26 || 13 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 2 || 1 || 1 || 0 || 0 || 0 || 12 || 10 || 15 || 1 || 0 || 0 || &amp;amp;radic; || 1.25 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 4 || 12 || 2 || 8 || &amp;amp;mdash; || &#039;&#039;&#039;ATmega16U4&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega16A&#039;&#039;&#039; || 16 || 44 || 16 || 16 || 32 || 3 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 1 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega16A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega32A&#039;&#039;&#039; || 32 || 44 || 16 || 16 || 32 || 3 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega32A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega88PA&#039;&#039;&#039; || 8 || 32 || 20 || 12 || 23 || 24 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;radic; || 1 || 512 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega88PA&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega324PA&#039;&#039;&#039; || 32 || 44 || 20 || 16 || 32 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 3 || 1 || 2 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega324PA&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega48PA&#039;&#039;&#039; || 4 || 32 || 20 || 12 || 23 || 24 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;radic; || 0.5 || 256 || &amp;amp;mdash; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega48PA&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega164PA&#039;&#039;&#039; || 16 || 44 || 20 || 16 || 32 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 3 || 1 || 2 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 1 || 512 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega164PA&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega64A&#039;&#039;&#039; || 64 || 64 || 16 || 16 || 53 || 8 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 1 || 2 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 4 || 8 || 2 || 7 || &amp;amp;radic; || &#039;&#039;&#039;ATmega64A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega128A&#039;&#039;&#039; || 128 || 64 || 16 || 16 || 53 || 8 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 1 || 2 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 4096 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 4 || 8 || 2 || 7 || &amp;amp;radic; || &#039;&#039;&#039;ATmega128A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega8A&#039;&#039;&#039; || 8 || 32 || 16 || 12 || 23 || 2 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 1 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || &amp;amp;mdash; || &amp;amp;mdash; || 3 || &amp;amp;radic; || &#039;&#039;&#039;ATmega8A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega168PA&#039;&#039;&#039; || 16 || 32 || 20 || 16 || 23 || 24 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;radic; || 1 || 512 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega168PA&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega8U2&#039;&#039;&#039; || 8 || 32 || 16 || &amp;amp;mdash; || 22 || 20 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 2 || 0 || 1 || 0 || 0 || 0 || 0 || 0 || 0 || 1 || 0 || 0 || &amp;amp;mdash; || 0.5 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 5 || 1 || 4 || &amp;amp;mdash; || &#039;&#039;&#039;ATmega8U2&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega16U2&#039;&#039;&#039; || 16 || 32 || 16 || 12 || 22 || 21 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 2 || 0 || 1 || 0 || 0 || 0 || 0 || 0 || 0 || 1 || 0 || 0 || &amp;amp;mdash; || 0.5 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 5 || 1 || 4 || &amp;amp;mdash; || &#039;&#039;&#039;ATmega16U2&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega32U2&#039;&#039;&#039; || 32 || 32 || 16 || 12 || 22 || 20 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 2 || 0 || 1 || 0 || 0 || 0 || 0 || 0 || 0 || 1 || 0 || 0 || &amp;amp;mdash; || 1 || 1024 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 5 || 1 || 4 || &amp;amp;mdash; || &#039;&#039;&#039;ATmega32U2&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega644PA&#039;&#039;&#039; || 64 || 44 || 20 || 16 || 32 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 3 || 1 || 2 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega644PA&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega16M1&#039;&#039;&#039; || 16 || 32 || 16 || 12 || 27 || 27 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 0 || 1 || 1 || 1 || 0 || 11 || 10 || 125 || 4 || 1 || 10 || &amp;amp;radic; || 1 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 14 || 1 || 10 || &amp;amp;mdash; || &#039;&#039;&#039;ATmega16M1&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega32M1&#039;&#039;&#039; || 32 || 32 || 16 || 12 || 27 || 27 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 0 || 1 || 1 || 1 || 0 || 11 || 10 || 125 || 4 || 1 || 10 || &amp;amp;radic; || 2 || 1024 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 14 || 1 || 10 || &amp;amp;mdash; || &#039;&#039;&#039;ATmega32M1&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega64M1&#039;&#039;&#039; || 64 || 32 || 16 || 12 || 27 || 27 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 0 || 1 || 1 || 1 || 0 || 11 || 10 || 125 || 4 || 1 || 10 || &amp;amp;radic; || 4 || 2048 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2 || 14 || 1 || 10 || &amp;amp;mdash; || &#039;&#039;&#039;ATmega64M1&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega169PA&#039;&#039;&#039; || 16 || 64 || 16 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 100 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 1 || 512 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega169PA&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega48A&#039;&#039;&#039; || 4 || 32 || 20 || 12 || 23 || 24 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;radic; || 0.5 || 256 || &amp;amp;mdash; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega48A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega88A&#039;&#039;&#039; || 8 || 32 || 20 || 12 || 23 || 24 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;radic; || 1 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega88A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega168A&#039;&#039;&#039; || 16 || 32 || 20 || 16 || 23 || 24 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;radic; || 1 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega168A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega328&#039;&#039;&#039; || 32 || 32 || 20 || 16 || 23 || 24 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;radic; || 2 || 1024 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega328&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega164A&#039;&#039;&#039; || 16 || 44 || 20 || 16 || 32 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 3 || 1 || 2 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 1 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega164A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega324A&#039;&#039;&#039; || 32 || 44 || 20 || 16 || 32 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 3 || 1 || 2 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega324A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega644A&#039;&#039;&#039; || 64 || 44 || 20 || 16 || 32 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 3 || 1 || 2 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega644A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega1284&#039;&#039;&#039; || 128 || 44 || 20 || 16 || 32 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 3 || 1 || 2 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 16 || 4096 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 6 || 1 || 6 || &amp;amp;radic; || &#039;&#039;&#039;ATmega1284&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;AT90PWM81&#039;&#039;&#039; || 8 || 20 || 16 || &amp;amp;mdash; || 20 || 3 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 1 || 0 || 0 || 0 || 0 || 0 || 11 || 10 || 125 || 3 || 1 || 10 || &amp;amp;radic; || 0.25 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;125 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 2.7&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1 || 8 || 1 || 6 || &amp;amp;mdash; || &#039;&#039;&#039;AT90PWM81&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega165PA&#039;&#039;&#039; || 16 || 64 || 16 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 1 || 512 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega165PA&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega325A&#039;&#039;&#039; || 32 || 64 || 20 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega325A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega3250A&#039;&#039;&#039; || 32 || 100 || 20 || 16 || 69 || 25 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega3250A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega645A&#039;&#039;&#039; || 64 || 64 || 16 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega645A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega645P&#039;&#039;&#039; || 64 || 64 || 16 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega645P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega6450P&#039;&#039;&#039; || 64 || 100 || 20 || &amp;amp;mdash; || 69 || 25 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega6450P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega6450A&#039;&#039;&#039; || 64 || 100 || 20 || &amp;amp;mdash; || 69 || 25 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 0 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega6450A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega169A&#039;&#039;&#039; || 16 || 64 || 16 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 100 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 1 || 512 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega169A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega329A&#039;&#039;&#039; || 32 || 64 || 20 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 100 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega329A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega649A&#039;&#039;&#039; || 64 || 64 || 16 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 100 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega649A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega3290A&#039;&#039;&#039; || 32 || 100 || 20 || 16 || 69 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 160 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega3290A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega649P&#039;&#039;&#039; || 64 || 64 || 16 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 100 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega649P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega6490A&#039;&#039;&#039; || 64 || 100 || 20 || 16 || 69 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 160 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;mdash; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega6490A&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega6490P&#039;&#039;&#039; || 64 || 100 || 20 || 16 || 69 || 32 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 160 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 4 || 2048 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega6490P&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATmega329PA&#039;&#039;&#039; || 32 || 64 || 20 || 16 || 54 || 17 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 2 || 1 || 1 || 0 || 0 || 100 || 8 || 10 || 15 || 1 || 0 || 0 || &amp;amp;mdash; || 2 || 1024 || &amp;amp;radic; || &amp;amp;radic; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 1.8&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;5.5 || 3 || 4 || 1 || 4 || &amp;amp;radic; || &#039;&#039;&#039;ATmega329PA&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;General Features&#039;&#039;&#039;&amp;lt;br/&amp;gt;&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;CPU&#039;&#039;&#039; || 8-bit AVR&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Hardware Qtouch&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Quadrature Decoder Kanäle&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;SSC&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Ethernet&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;SD / eMMC&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Grafik LCD&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Video Decoder&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Kamera Interface&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Resistive Touch Screen&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;External Bus Interface&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;DRAM Memory&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;NAND Interface&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;FPU&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;MPU / MMU&#039;&#039;&#039; || nein / nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Crypto Engine&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Calibrated RC Oscillator&#039;&#039;&#039; || ja&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== ATxmega ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Device-specific Features&#039;&#039;&#039;&amp;lt;br/&amp;gt;&amp;amp;nbsp;&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
! Device&lt;br /&gt;
! Flash [KiB]&lt;br /&gt;
! Pin Anz&amp;amp;shy;ahl&lt;br /&gt;
! Anzahl Touch Kan&amp;amp;shy;äle&lt;br /&gt;
! Max I/O Pins&lt;br /&gt;
! Ext Inter&amp;amp;shy;rupts&lt;br /&gt;
! USB Trans&amp;amp;shy;cei&amp;amp;shy;ver&lt;br /&gt;
! USB Speed&lt;br /&gt;
! USB Inter&amp;amp;shy;face&lt;br /&gt;
! SPI&lt;br /&gt;
! TWI&lt;br /&gt;
! UART&lt;br /&gt;
! Seg&amp;amp;shy;ment LCD&lt;br /&gt;
! ADC Kan&amp;amp;shy;äle&lt;br /&gt;
! ADC Speed [ksps]&lt;br /&gt;
! Ana&amp;amp;shy;log Com&amp;amp;shy;para&amp;amp;shy;tors&lt;br /&gt;
! DAC Kan&amp;amp;shy;äle&lt;br /&gt;
! DAC Auf&amp;amp;shy;lö&amp;amp;shy;sung [bits]&lt;br /&gt;
! SRAM [KiB]&lt;br /&gt;
! EEPROM [Bytes]&lt;br /&gt;
! Ext&amp;amp;shy;ern&amp;amp;shy;al Bus Inter&amp;amp;shy;face&lt;br /&gt;
! DRAM Memory&lt;br /&gt;
! Crypto Engine&lt;br /&gt;
! Timers&lt;br /&gt;
! Output Com&amp;amp;shy;pare Kan&amp;amp;shy;äle&lt;br /&gt;
! Input Capt&amp;amp;shy;ure Kan&amp;amp;shy;äle&lt;br /&gt;
! PWM Kan&amp;amp;shy;äle&lt;br /&gt;
! Device&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega64A1&#039;&#039;&#039; || 64 || 100 || 16 || 78 || 78 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 12 || 4 || 8 || 0 || 16 || 2000 || 4 || 4 || 12 || 4 || 2048 || 1 || ja&amp;lt;ref name=&amp;quot;sdram&amp;quot;&amp;gt;SDRAM&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 8 || 24 || 24 || 24 || &#039;&#039;&#039;ATxmega64A1&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega128A1&#039;&#039;&#039; || 128 || 100 || 16 || 78 || 78 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 12 || 4 || 8 || 0 || 16 || 2000 || 4 || 4 || 12 || 8 || 2048 || 1 || ja&amp;lt;ref name=&amp;quot;sdram&amp;quot;&amp;gt;SDRAM&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 8 || 24 || 24 || 24 || &#039;&#039;&#039;ATxmega128A1&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega64A3&#039;&#039;&#039; || 64 || 64 || 16 || 50 || 50 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 10 || 2 || 7 || 0 || 16 || 2000 || 4 || 2 || 12 || 4 || 2048 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 7 || 22 || 22 || 22 || &#039;&#039;&#039;ATxmega64A3&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega128A3&#039;&#039;&#039; || 128 || 64 || 16 || 50 || 50 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 10 || 2 || 7 || 0 || 16 || 2000 || 4 || 2 || 12 || 8 || 2048 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 7 || 22 || 22 || 22 || &#039;&#039;&#039;ATxmega128A3&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega192A3&#039;&#039;&#039; || 192 || 64 || 16 || 50 || 50 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 10 || 2 || 7 || 0 || 16 || 2000 || 4 || 2 || 12 || 16 || 2048 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 7 || 22 || 22 || 22 || &#039;&#039;&#039;ATxmega192A3&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega256A3&#039;&#039;&#039; || 256 || 64 || 16 || 50 || 50 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 10 || 2 || 7 || 0 || 16 || 2000 || 4 || 2 || 12 || 16 || 4096 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 7 || 22 || 22 || 22 || &#039;&#039;&#039;ATxmega256A3&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega16A4&#039;&#039;&#039; || 16 || 44 || 16 || 34 || 34 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 7 || 2 || 5 || 0 || 12 || 2000 || 2 || 2 || 12 || 3.3 || 1024 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 5 || 16 || 16 || 16 || &#039;&#039;&#039;ATxmega16A4&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega32A4&#039;&#039;&#039; || 32 || 44 || 16 || 34 || 34 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 7 || 2 || 5 || 0 || 12 || 2000 || 2 || 2 || 12 || 4 || 1024 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 5 || 16 || 16 || 16 || &#039;&#039;&#039;ATxmega32A4&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega64A4&#039;&#039;&#039; || 64 || 44 || &amp;amp;mdash; || 34 || 34 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 7 || 2 || 5 || 0 || 12 || 2000 || 2 || 2 || 12 || 4 || 2048 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 5 || 16 || 16 || 16 || &#039;&#039;&#039;ATxmega64A4&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega128A4&#039;&#039;&#039; || 128 || 44 || &amp;amp;mdash; || 34 || 34 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 7 || 2 || 5 || 0 || 12 || 2000 || 2 || 2 || 12 || 8 || 2048 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 5 || 16 || 16 || 16 || &#039;&#039;&#039;ATxmega128A4&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega256A3B&#039;&#039;&#039; || 256 || 64 || 16 || 47 || 49 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 8 || 2 || 6 || 0 || 16 || 2000 || 4 || 2 || 12 || 16 || 4096 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 7 || 22 || 22 || 22 || &#039;&#039;&#039;ATxmega256A3B&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega256D3&#039;&#039;&#039; || 256 || 64 || 16 || 50 || 50 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 5 || 2 || 3 || 0 || 16 || 200 || 2 || 0 || 0 || 16 || 4096 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 5 || 18 || 18 || 18 || &#039;&#039;&#039;ATxmega256D3&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega192D3&#039;&#039;&#039; || 192 || 64 || 16 || 50 || 50 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 5 || 2 || 3 || 0 || 16 || 200 || 2 || 0 || 0 || 16 || 2048 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 5 || 18 || 18 || 18 || &#039;&#039;&#039;ATxmega192D3&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega128D3&#039;&#039;&#039; || 128 || 64 || 16 || 50 || 50 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 5 || 2 || 3 || 0 || 16 || 200 || 2 || 0 || 0 || 8 || 2048 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 5 || 18 || 18 || 18 || &#039;&#039;&#039;ATxmega128D3&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega64D3&#039;&#039;&#039; || 64 || 64 || 16 || 50 || 50 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 5 || 2 || 3 || 0 || 16 || 200 || 2 || 0 || 0 || 4 || 2048 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 5 || 18 || 18 || 18 || &#039;&#039;&#039;ATxmega64D3&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega128D4&#039;&#039;&#039; || 128 || 44 || &amp;amp;mdash; || 34 || 34 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 4 || 2 || 2 || 0 || 12 || 200 || 2 || 0 || 0 || 8 || 2048 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 4 || 14 || 14 || 14 || &#039;&#039;&#039;ATxmega128D4&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega64D4&#039;&#039;&#039; || 64 || 44 || &amp;amp;mdash; || 34 || 34 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 4 || 2 || 2 || 0 || 12 || 200 || 2 || 0 || 0 || 4 || 2048 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 4 || 14 || 14 || 14 || &#039;&#039;&#039;ATxmega64D4&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega32D4&#039;&#039;&#039; || 32 || 44 || 16 || 34 || 34 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 4 || 2 || 2 || 0 || 12 || 200 || 2 || 0 || 0 || 4 || 1024 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 4 || 14 || 14 || 14 || &#039;&#039;&#039;ATxmega32D4&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega16D4&#039;&#039;&#039; || 16 || 44 || 16 || 34 || 34 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 4 || 2 || 2 || 0 || 12 || 200 || 2 || 0 || 0 || 2 || 1024 || 0 || &amp;amp;mdash; || &amp;amp;mdash; || 4 || 14 || 14 || 14 || &#039;&#039;&#039;ATxmega16D4&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega16A4U&#039;&#039;&#039; || 16 || 44 || 16 || 34 || 34 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 7 || 2 || 5 || 0 || 12 || 2000 || 2 || 2 || 12 || 3.3 || 1024 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 5 || 16 || 16 || 16 || &#039;&#039;&#039;ATxmega16A4U&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega32A4U&#039;&#039;&#039; || 32 || 44 || 16 || 34 || 34 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 7 || 2 || 5 || 0 || 12 || 2000 || 2 || 2 || 12 || 4 || 1024 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 5 || 16 || 16 || 16 || &#039;&#039;&#039;ATxmega32A4U&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega64A3U&#039;&#039;&#039; || 64 || 64 || 16 || 50 || 50 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 10 || 2 || 7 || 0 || 16 || 2000 || 4 || 2 || 12 || 4 || 2048 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 7 || 22 || 22 || 22 || &#039;&#039;&#039;ATxmega64A3U&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega128A3U&#039;&#039;&#039; || 128 || 64 || 16 || 50 || 50 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 10 || 2 || 7 || 0 || 16 || 2000 || 4 || 2 || 12 || 8 || 2048 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 7 || 22 || 22 || 22 || &#039;&#039;&#039;ATxmega128A3U&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega192A3U&#039;&#039;&#039; || 192 || 64 || 16 || 50 || 50 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 10 || 2 || 7 || 0 || 16 || 2000 || 4 || 2 || 12 || 16 || 2048 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 7 || 22 || 22 || 22 || &#039;&#039;&#039;ATxmega192A3U&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega256A3U&#039;&#039;&#039; || 256 || 64 || 16 || 50 || 50 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 10 || 2 || 7 || 0 || 16 || 2000 || 4 || 2 || 12 || 16 || 4096 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 7 || 22 || 22 || 22 || &#039;&#039;&#039;ATxmega256A3U&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega256A3BU&#039;&#039;&#039; || 256 || 64 || 16 || 47 || 49 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 8 || 2 || 6 || 0 || 16 || 2000 || 4 || 2 || 12 || 16 || 4096 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 7 || 22 || 22 || 22 || &#039;&#039;&#039;ATxmega256A3BU&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega64B3&#039;&#039;&#039; || 64 || 64 || 16 || 36 || 36 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 2 || 1 || 1 || 100 || 8 || 2000 || 2 || 0 || 0 || 4 || 2048 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 2 || 6 || 6 || 6 || &#039;&#039;&#039;ATxmega64B3&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega128B3&#039;&#039;&#039; || 128 || 64 || 16 || 36 || 36 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 2 || 1 || 1 || 100 || 8 || 2000 || 2 || 0 || 0 || 4 || 2048 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 2 || 6 || 6 || 6 || &#039;&#039;&#039;ATxmega128B3&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega128B1&#039;&#039;&#039; || 128 || 100 || 16 || 53 || 53 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 3 || 1 || 2 || 160 || 16 || 2000 || 4 || 0 || 0 || 8 || 2048 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 3 || 10 || 10 || 10 || &#039;&#039;&#039;ATxmega128B1&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ATxmega64B1&#039;&#039;&#039; || 64 || 100 || 16 || 53 || 53 || 1 || ja&amp;lt;ref name=&amp;quot;usbs&amp;quot;&amp;gt;Full Speed&amp;lt;/ref&amp;gt; || ja&amp;lt;ref name=&amp;quot;usbd&amp;quot;&amp;gt;Device&amp;lt;/ref&amp;gt; || 3 || 1 || 2 || 160 || 16 || 2000 || 4 || 0 || 0 || 8 || 2048 || 0 || &amp;amp;mdash; || ja&amp;lt;ref name=&amp;quot;cry&amp;quot;&amp;gt;AES/DES&amp;lt;/ref&amp;gt; || 3 || 10 || 10 || 10 || &#039;&#039;&#039;ATxmega64B1&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;General Features&#039;&#039;&#039;&amp;lt;br/&amp;gt;&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Max. &amp;amp;fnof;&amp;lt;sub&amp;gt;CPU&amp;lt;/sub&amp;gt; [MHz]&#039;&#039;&#039; || 32&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;CPU&#039;&#039;&#039; || 8-bit AVR&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Hardware Qtouch&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Quadrature Decoder Kanäle&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;CAN&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;LIN&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;SSC&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Ethernet&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;SD / eMMC&#039;&#039;&#039; || 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Grafik LCD&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Video Decoder&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Kamera Interface&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ADC Auflösung [bits]&#039;&#039;&#039; || 12&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Resistive Touch Screen&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Temp. Sensor&#039;&#039;&#039; || ja&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Self Program Memory&#039;&#039;&#039; || ja&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;NAND Interface&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;picoPower&#039;&#039;&#039; || ja&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Temp. Bereich [°C]&#039;&#039;&#039; || &amp;amp;minus;40&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;85&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;I/O Supply Class [V]&#039;&#039;&#039; || 1.6&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;3.6&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Operating Voltage [V&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt;]&#039;&#039;&#039; || 1.6&amp;amp;nbsp;&amp;amp;ndash;&amp;amp;nbsp;3.6&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;FPU&#039;&#039;&#039; || nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;MPU / MMU&#039;&#039;&#039; || nein / nein&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;32kHz RTC&#039;&#039;&#039; || ja&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Calibrated RC Oscillator&#039;&#039;&#039; || ja&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.avrfreaks.net/index.php?module=Freaks%20Devices&amp;amp;func=devCompare Vergleichstabelle] von AVRFreaks&lt;br /&gt;
* [http://www.atmel.com/dyn/products/param_table.asp?family_id=607&amp;amp;OrderBy=part_no&amp;amp;Direction=ASC#760 Vergleichstabelle aller aktuellen AVR Controller bei Atmel]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR]]&lt;br /&gt;
[[Kategorie:Liste mit Bauteilen]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Kondensator&amp;diff=79678</id>
		<title>Kondensator</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Kondensator&amp;diff=79678"/>
		<updated>2013-11-22T11:51:00Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Wiederhergestellt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Unter Kondensatoren versteht man passive Bauteile, in denen elektrische Energie gespeichert wird. Sie werden daher häufig zum Stabilisieren von Spannungen benutzt (Funktion Stützkondensator). Desweiteren stellen technische Kondensatoren für Wechselspannungen einen frequenzabhängigen Widerstand dar. Sie werden daher häufig zum Ableiten von Hochfrequenz benutzt (Funktion Bypasskondensator).&lt;br /&gt;
&lt;br /&gt;
Dabei ist es üblich am Spannungsregler Elektrolytkondensatoren (&#039;&#039;Elkos&#039;&#039;) mit ein paar hundert &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;F (Microfarad) als Stützkondensator und bei jedem IC 100 nF als Bypasskondensator zu verwenden.&lt;br /&gt;
&lt;br /&gt;
Die Größe eines Kondensators ist seine Kapazität (Formelzeichen &#039;&#039;C&#039;&#039;), die als Ladung (Formelzeichen &#039;&#039;Q&#039;&#039;) durch Spannung (Formelzeichen &#039;&#039;U&#039;&#039;) definiert ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C=\frac{Q}{U}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Einheit für die Kapazität ist Farad:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; [C]=F=\frac{As}{V}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reihenschaltung ==&lt;br /&gt;
&lt;br /&gt;
Für eine Reihenschaltung von &#039;&#039;n&#039;&#039; Kondensatoren gilt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{C_{ges}}=\frac{1}{C_1}+\frac{1}{C_2}+\dots+\frac{1}{C_n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U_{ges}=U_1+U_2+\dots+U_n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I_{ges}=I_1=I_2=\dots=I_n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parallelschaltung ==&lt;br /&gt;
&lt;br /&gt;
Für eine Parallelschaltung von &#039;&#039;n&#039;&#039; Kondensatoren gilt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C_{ges}=C_1+C_2+\dots+C_n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U_{ges}=U_1=U_2=\dots=U_n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I_{ges}=I_1+I_2+\dots+I_n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gespeicherte Energie ==&lt;br /&gt;
&lt;br /&gt;
Die in einem Kondensator gespeicherte Energie lässt sich durch die Formel&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; W=\frac{C}{2} \cdot U^2 = \frac{1}{2 \cdot C} \cdot Q^2 = \frac{U}{2} \cdot Q &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
berechnen.&lt;br /&gt;
&lt;br /&gt;
== Praxis ==&lt;br /&gt;
&lt;br /&gt;
=== Polaritätszeichen ===&lt;br /&gt;
&lt;br /&gt;
Elektrolytkondensatoren (Elkos) sind (in der Regel) gepolt, d. h. Gleichspannungspegel müssen in einer vorgeschriebenen Polarität angelegt werden, damit das Dielektrikum nicht zerstört wird.  Bei Aluminium-Elkos wird dabei generell der Minuspol gekennzeichnet, bei kleinen Bauformen mit einem Strich, bei größeren Bauformen befinden sich u. U. auch noch Minuszeichen in diesem Strich eingebettet.  Bei Tantal-Kondensatoren hingegen wird immer der Pluspol gekennzeichnet (nicht nur bei den SMD-Bauformen, aber auch bei diesen).&lt;br /&gt;
&lt;br /&gt;
[[Bild:SMD-Elkos.jpeg]]&lt;br /&gt;
&lt;br /&gt;
Die gezeigten Elkos haben folgende Werte:&lt;br /&gt;
&lt;br /&gt;
* 220 µF, Spannungsfestigkeit 6 V&lt;br /&gt;
* 100 µF (&amp;lt;math&amp;gt;10 \cdot 10^7&amp;lt;/math&amp;gt; pF), 16 V&lt;br /&gt;
* 22 µF, 10 V&lt;br /&gt;
* 1 µF, 35 V&lt;br /&gt;
* 2,2 µF (&amp;lt;math&amp;gt;22 \cdot 10^5&amp;lt;/math&amp;gt; pF), 10 V&lt;br /&gt;
&lt;br /&gt;
Die beim 100-µF-Kondensator zu findende Buchstabenschreibweise für die Spannungsfestigkeit ist wenig gebräuchlich, aber gelegentlich anzutreffen.  Die Zuordnung ist:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Buchstabe&#039;&#039;&#039;           ||  e  ||   G   ||   J   ||   A   ||   C   ||   D   ||   E   ||   V   ||   H   &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Spannungsfestigkeit&#039;&#039;&#039; || 2.5V || 4 V   || 6,3 V ||  10 V ||  16 V ||  20 V ||  25 V || 35 V || 50 V &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Case Code&#039;&#039;&#039; (Bauform)      ||  A  ||  B  ||  C  ||  D   &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Länge&#039;&#039;&#039; (mm)               || 3,2 || 3,5 || 6,0 || 7,3 &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Breite&#039;&#039;&#039; (mm)              || 1,6 || 2,8 || 3,2 || 4,3 &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Höhe&#039;&#039;&#039; (mm)                || 1,6 || 1,9 || 2,5 || 2,8 &lt;br /&gt;
|-&lt;br /&gt;
|    Maßtoleranz (mm)            || 0,2 || 0,2 || 0,3 || 0,3  &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Siebkondensator ===&lt;br /&gt;
&lt;br /&gt;
Der Siebkondensator sitzt hinter einem Gleichrichter und hat die Aufgabe, aus einer gleichgerichteten, pulsierenden Spannung, eine annähernd konstante Gleichspannung mit nur wenig Welligkeit (engl. Ripple) zu machen. Er wird periodisch geladen und muss während der Ladepausen, wenn die Eingangssspannung vor dem Gleichrichter kleiner als die Ausgangsspannung ist, den Ausgang mit Strom versorgen. Man findet ihn in allen klassischen Netzteilen mit 50Hz Trafo. Als Daumenregel kann man sich merken, dass man pro 1A Ausgangsstrom ca. 4700µF braucht, um eine Welligkeit von ca. 2Vpp zu erreichen.&lt;br /&gt;
&lt;br /&gt;
Einen Siebkondensator findet man auch am Ausgang von Schaltnetzteilen, seine Aufgabe ist dort die gleiche. Allerdings sind die Schaltfrequenzen deutlich höher, typisch 50-500kHz. Darum muss dieser Kondensator einen besonders kleinen, effektiven Innenwiderstand besitzen (engl. ESR, Equivalent Series Resistance).&lt;br /&gt;
&lt;br /&gt;
=== Entkoppelkondensator ===&lt;br /&gt;
&lt;br /&gt;
Der Entkoppelkondensator hat die Aufgabe, die Versorgungsspannung nahe an einem IC für hochfrequente Ströme zu puffern (entkoppeln, engl. decoupling). Schnelle Digital- und Analogschaltungen benötigen vor allem beim Umschalten sehr schnell viel Strom, in der Größenordnung von Nanosekunden bis Mikrosekunden, je nach IC Milliampere bis Ampere. Diese müssen mit möglichst geringem Widerstand und Induktivität geliefert werden. Ein Stromversorgungsnetz auf einer Platine kann das meist nur unzureichend, dazu sind die Leitungen meist zu lang und damit die Induktivität zu hoch. Ein nah am IC platzierter Kondensator liefert diesen Strom für kurze Zeit, ohne dass die Spannung nennenswert einbricht. Die Entkopplung der Stromversorgung geschieht meist mehrstufig, d.h. es werden Kondensatoren verschiedener Arten und Kapazitäten eingesetzt, siehe [[Stromversorgung für FPGAs]].&lt;br /&gt;
&lt;br /&gt;
Praktische Anwendung&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Jeder&#039;&#039;&#039; Digitalschaltkreis benötigt einen 100nF Keramikkondensator nah (kleiner 20mm) an den Anschlüssen von VCC und GND. Je schneller der IC schalten kann, umso wichtiger ist er.&lt;br /&gt;
* Für &#039;&#039;&#039;jedes&#039;&#039;&#039; Anschlusspaar von VCC und GND eines ICs muss ein Kondensator verwendet werden. Sparen geht hier oft schief!&lt;br /&gt;
* Für die Verbindung der Enkoppelkondensatoren zur Masse- bzw. Versorgungsfläche sollte man möglichst je Kondesator ein VIA benutzen und nicht über ein VIA mehrere Kondensatoren verbinden. Dadurch wird die parasitäre Induktivität vermindert.&lt;br /&gt;
* Schnelle Analogschaltkreise wie Operationsverstärker, [[Treiber]] etc. brauchen auch individuelle Entkoppelkondensatoren.&lt;br /&gt;
* Pi mal Daumen gilt: Je größer der Kondensator, umso weiter kann er von dem Verbraucher weg sein, da er auf Grund seines Innenwiderstands weniger HF-tauglich ist. Es ist somit nicht sinnvoll, einen 1000µF Elektrolytkondensator 10mm neben einen Digital-IC setzen zu wollen. Dort gehört der 100nF Keramikkondensator hin. Aber für die Stromversorgung von Motoren, Treibern und [[H-Brücken Übersicht|H-Brücken]] sind derartige großen Kondensatoren wichtig und sollten nicht zu weit entfernt sein.&lt;br /&gt;
&lt;br /&gt;
=== Koppelkondensator ===&lt;br /&gt;
&lt;br /&gt;
Koppelkondensatoren verbinden Verstärkerstufen. Dabei wird jedoch nur der Wechselanteil übertragen, kein Gleichanteil. Diese Kondensatoren müssen möglichst verzerrungsarm sein, vor allem im Audiobereich. Das wird durch die richtige Wahl des Dielektrikums erreicht.&lt;br /&gt;
&lt;br /&gt;
=== Forumsbeiträge ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/43762 Abblockkondensator: Kerko (Keramik) oder Folie?]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/62576 Brennende Tantalkondensatoren]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/108865#963281 Kodierung (Umwandlung)]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/169958#1624840 Unterschied: Elektrolytkondensator vs. Tantalkondensator]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/195563#1915294 Unterschied: C0G vs. Glimmer]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/264347#2748845 Kurze Beschreibung verschiedener Folienkondensatoren]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://my.execpc.com/~endlr/index.html CapSite 2009] - Introduction To Capacitors&lt;br /&gt;
* [http://www.cde.com/catalogs/AEappGUIDE.pdf Aluminum Electrolytic Capacitor Application Guide] von CDE Cornell Dubilier&lt;br /&gt;
* Anwendungen&lt;br /&gt;
** [http://www.radio-electronics.com/info/data/capacitor/capacitor_types.php Capacitor types and their uses] (engl.)&lt;br /&gt;
** [http://www.planetanalog.com/features/showArticle.jhtml;jsessionid=23?articleID=199905522 Choosing and Using Bypass Capacitors] (dreiteilige Artikelserie) bei [http://www.planetanalog.com www.planetanalog.com]&lt;br /&gt;
** [http://www.vagrearg.org/?p=decoupling Decoupling by Example]&lt;br /&gt;
* Video-Tutorials&lt;br /&gt;
** EEVblog #33 – Capacitor Tutorial [http://www.eevblog.com/2009/09/26/eevblog-33-1of2-capacitor-tutorial-electrolytic-tantalum-and-plastic-film/ Teil 1: Electrolytic, Tantalum, and Plastic Film] und [http://www.eevblog.com/2009/09/26/eevblog-33-2of2-capacitor-tutorial-ceramics-and-impedance/ Teil 2: Ceramics and impedance]&lt;br /&gt;
* [http://www.maximintegrated.com/app-notes/index.mvp/id/5527 Tutorial] von Maxim, &amp;quot;Temperature and Voltage Variation of Ceramic Capacitors, or Why Your 4.7µF Capacitor Becomes a 0.33µF Capacitor&amp;quot;, engl.&lt;br /&gt;
* [http://www.wima.de/DE/characteristics.htm Vergleichstabelle] der Eigenschaften von Folien- und Keramikkondensatoren, WIMA&lt;br /&gt;
* [http://portal.national.com/rap/Application/0,1570,28,00.html] Bob Pease: &amp;quot;Understand Capacitor Soakage to Optimize Analog Systems&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Category:Bauteile]]&lt;br /&gt;
[[Category:Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Augendiagramm&amp;diff=79632</id>
		<title>Augendiagramm</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Augendiagramm&amp;diff=79632"/>
		<updated>2013-11-18T23:45:55Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Unsinn von 89.204.130.148 entsorgt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Erklärung der Entstehung eines sogenannten Augendiagramms&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;von [[Benutzer:engineer|J.S.]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Bedeutung =&lt;br /&gt;
&lt;br /&gt;
Ein Augendiagramm ist eine bildliche Darstellung eines elektrischen Signalverlaufs, mit dessen Hilfe die Signalqualität einer digitalen Datenübertragung beurteilt werden kann. Es entsteht durch die grafische Überlagerung von mehreren Messungen eines Signals zu unterschiedlichen Zeitpunkten und Phasen. Es entsteht eine Art von Summation der statistisch verteilten Signalverläufe.&lt;br /&gt;
&lt;br /&gt;
Durch die zufälligen Einflüsse, denen das Signal unterworfen ist, verlaufen die theoretisch unendlich steilen Übergänge von 0 auf 1 und umgekehrt dabei nicht mathematisch rechteckig oder konstant an derselben Stelle, sondern als mehr oder weniger breit verschmierte Rampen, wodurch im Zentrum die typische Form eines Auges entsteht.&lt;br /&gt;
&lt;br /&gt;
= Datengewinnung =&lt;br /&gt;
Das Signal wird mehrfach vermessen und die Ergebnisse phasenrichtig überlagert. Im folgenden Beispiel werden aus technischen Gründen alle Kombinationen von Bitfolgen durchgespielt und jeweils 4er-Gruppen überlagert. 3er-GRuppen bei einer ausgewählten Bitfolge würden ebenfalls genügen. Aus Darstellungsgründen sind Punkte statt Linien verwendet, da sich in Excel sonst ein unschöner Rücklauf ergebn würde. Zudem sind dies die realen Messpunkte des Signals.&lt;br /&gt;
&lt;br /&gt;
== Teildatensatz Beginn==&lt;br /&gt;
&lt;br /&gt;
[[Datei:Eye-pattern-explain1.gif]]&lt;br /&gt;
Signalverlauf der ersten drei Kombinationen 0000.0001.0010&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
Beim Signalverlauf der ersten drei Kombinationen rangiert die Spannung bei 0,2V-3,2V und zeigt einen overshoot von 0,3V. Die Pegel sind erst in der Mitte des Bits voll eingeschwungen, was auch den Zacken links (abklingende &amp;quot;1&amp;quot; zu Beginn der 3. Gruppe) erklärt.&lt;br /&gt;
&lt;br /&gt;
== Teildatensatz Mitte==&lt;br /&gt;
&lt;br /&gt;
[[Datei:Eye-pattern-explain2.gif]]&lt;br /&gt;
Signalverlauf des Übergangs von 0111.1000&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
Bei den Kombinationen 0111 und 1000 erkennt man den Übergang von overshoot in den statischen Bereich der eigentlich richtigen Spannung, wenn die Bits lange genug stabil bleiben und sich nicht schon im nächsten Takt wieder ändern.&lt;br /&gt;
&lt;br /&gt;
== Gesamter Datensatz wenige Durchläufe==&lt;br /&gt;
[[Datei:Eye-pattern-explain3.gif]]&lt;br /&gt;
Signalverläufe aller Kombinationen überlagert.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
Bei sich schnell ändernden Bits kommt immer mehr die Bandbreite des Kabels und der Treiber/Empfänger zur Geltung sodass sich das Auge langsam schließt.&lt;br /&gt;
&lt;br /&gt;
Durch Aufsummieren aller statistisch auftretenden Signalverläufe und Histogrambildung entsteht das eigentliche Augendiagramm.&lt;br /&gt;
&lt;br /&gt;
== Gesamter Datensatz viele Durchläufe==&lt;br /&gt;
&lt;br /&gt;
[[Datei:Eye-pattern-explain4.gif]]&lt;br /&gt;
Eingefärbtes Augendiagramm&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
Das 2D-Histogrammbild, das zunächst für jeden Bildpunkt in der T,U-Ebene (Zeitpunkt/Phase sowie Spannung) die Wahrscheinlichkeit für das Auftreten eines Durchlaufs darstellt, wird mit einem Farbprofil ähnlich der Wärmekameras eingefärbt, um die Häufungen zu zeigen. Massgeblich ist letzlich die Breite und Höhe des Auges. Das Zentrum definiert den Punkt, an dem die Abtastung optimal ist.&lt;br /&gt;
&lt;br /&gt;
Zu berücksichtigen sind dabei auch die absoluten Pegel, die jeweils den Empfänger sicher durchsteuern müssen.&lt;br /&gt;
&lt;br /&gt;
= Interpretationsproblem =&lt;br /&gt;
Bei differentiellen Leitungen entsteht bei der längeren Betrachtung der beiden Signale in den Fällen starker Störungen oftmals der Eindruck, dass das Auge geschlossen sei und keine Übertragung möglich ist. Dies muss jedoch nicht der Fall sein! Differenzielle Leitungen sind oftmals von Störungen in gleicher Weise betroffen und zeigen einen ähnlichen Spannungshub, der vom differenziellen Verstärker tolerant verarbeitet werden kann. Daher kommt mitunter dennoch wieder ein stabiles und jederzeit eindeutiges Signal heraus. Daher müssen differentielle Leitungen vor und nach dem Receiver betrachtet werden. Ist das nicht möglich, weil der Receiver in einem FPGA sitzt, muss der Logikpegel anhand von realen Messungen validiert werden.&lt;br /&gt;
&lt;br /&gt;
=Anwendungsbeispiele=&lt;br /&gt;
* Lokalisierung von Problemen&lt;br /&gt;
* Optimierung der Impedanzanpassung&lt;br /&gt;
* Formelle Validierung&lt;br /&gt;
* Bestimmung der Störreserve&lt;br /&gt;
&lt;br /&gt;
= Fußnoten =&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/topic/233342&lt;br /&gt;
&lt;br /&gt;
Suche im Forum nach&lt;br /&gt;
* [http://www.mikrocontroller.net/search?query=Augendiagramm eye pattern]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Signalverarbeitung]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
&lt;br /&gt;
=Weblinks=&lt;br /&gt;
&lt;br /&gt;
* http://it.e-technik.uni-ulm.de/archiv/World/Teaching/Experiment/eye/eye.html&lt;br /&gt;
* https://home.zhaw.ch/~rur/ntm/unterlagen/ntmkap54opt.pdf&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Diode&amp;diff=79203</id>
		<title>Diode</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Diode&amp;diff=79203"/>
		<updated>2013-10-29T09:15:22Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Vandalismus rückgängig gemacht&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Allgemeine Diode ==&lt;br /&gt;
&lt;br /&gt;
Die Bezeichnung Diode wurde ursprünglich für Elektronenröhren mit zwei Elektroden verwendet, später für das Halbleiter-Bauteil mit dem selben elektrischen Verhalten. &amp;quot;Di&amp;quot; wegen &#039;&#039;&#039;zwei&#039;&#039;&#039; und &amp;quot;ode&amp;quot; vermutlich wegen Elektr&#039;&#039;&#039;ode&#039;&#039;&#039;, auch wenn bei Wikipedia was anderes steht (Es gibt bei den Elektronenröhren z.&amp;amp;nbsp;B. auch &#039;&#039;Tri&#039;&#039;oden mit drei oder &#039;&#039;Pent&#039;&#039;oden mit fünf Elektroden).&lt;br /&gt;
&lt;br /&gt;
Eine Diode sperrt den Stromfluss in einer Richtung und erlaubt ihn in der anderen. Als diskretes Bauteil besitzen Halbleiterdioden i.d.R. einen aufgedruckten Ring, der die Kathode kennzeichnet. Liegt an diesem Anschluss  eine negativere Spannung als an der Anode, ist die Diode in Durchlassrichtung geschaltet, d.h. sobald die [[Durchlass-Spannung]] überschritten wird, setzt der Stromfluss ein. Bei der umgekehrten Polarität sperrt die Diode den Stromfluss. &lt;br /&gt;
&lt;br /&gt;
Beim Betrieb von Dioden sind insbesondere drei wichtige Kenngrößen zu beachten:&lt;br /&gt;
* max. Durchlassstrom in Durchlassrichtung,&lt;br /&gt;
* max. Sperrspannung in Sperrrichtung und &lt;br /&gt;
* größte zulässige Verlustleistung aufgrund des Spannungsabfalls in Durchlassrichtung.&lt;br /&gt;
&lt;br /&gt;
Das Überschreiten der zulässigen Grenzwerte führt zur Überlastung der Diode.&lt;br /&gt;
&lt;br /&gt;
Dioden werden in elektronischen Schaltungen sehr häufig und zu ganz unterschiedlichen Zwecken eingesetzt, z.&amp;amp;nbsp;B.&lt;br /&gt;
* zur Gleichrichtung,&lt;br /&gt;
* als [[Spannungsreferenz]] (siehe auch Z-Diode),&lt;br /&gt;
* als elektrisch veränderliche Kapazität (Varaktor), oder&lt;br /&gt;
* zum Schutz gegen falsche Polung und Überspannung (Beispiel: [[Relais_mit_Logik_ansteuern#Freilaufdiode|Freilaufdiode]]).&lt;br /&gt;
&lt;br /&gt;
Dioden mit der letzteren Funktion sind heute auch oft in ICs wie [[Mikrocontroller]]n integriert und helfen, die Ein- und Ausgangs-Pins dieser teilweise sehr teuren Bauelemente vor moderater Fehlbehandlung und elektrischen Entladungen (ESD) zu schützen.&lt;br /&gt;
&lt;br /&gt;
Eine Sonderform der Dioden sind [[LED|LEDs]], die elektrisch zwar auch Diodenverhalten besitzen, deren eigentlicher Zweck aber die Erzeugung von sichtbarem oder infrarotem Licht ist.&lt;br /&gt;
&lt;br /&gt;
== Z-Diode ==&lt;br /&gt;
&lt;br /&gt;
Dieses auch &#039;&#039;Zener-Diode&#039;&#039; genannte Bauteil ist eine spezielle Variante der Halbleiter-[[Diode]], die produktionstechnisch so ausgelegt ist, dass sie nach Überschreiten der Durchbruchspannung unbeschadet einen bestimmten Strom in Sperrrichtung aushalten kann.&lt;br /&gt;
&lt;br /&gt;
Halbleiter haben grundsätzlich die Eigenschaft, ab einer bestimmten Schwellspannung einen Stromfluss zu ermöglichen, was auch bei Z-Dioden der Fall ist. Sie sind damit wie normale Siliziumdioden verwendbar. In Sperrichtung können sie aber nicht so hohe negative Spannungen sperren (→ Durchbruch- oder Sperrspannung), besitzen dafür aber eine besonders scharf definierte Durchbruchspannung, die einen abrupten Stromfluss ermöglicht. Dieser Effekt wird nach dem Entdecker Zener-Effekt genannt und ist bis ca. 5 V dominierend. Danach überwiegt der Lawineneffekt. Beide sind ähnlich. [http://de.wikipedia.org/wiki/Z-Diode Z-Dioden] unterhalb ca. 6,5V haben eine eher weiche Kennlinie, der Knick ist schwächer ausgebildet. Diese Effekte treten auch bei Leuchtdioden und Diodenstrecken in Transistoren auf, sind dort aber nicht der angestrebte Arbeitspunkt, da dies zur Zerstörung der Bauteile führt.&lt;br /&gt;
&lt;br /&gt;
Die Durchbruchspannung – auch Z-Spannung genannt – kann zur Spannungsstabilisierung verwendet werden und ist bei diesem Diodentyp der normale Arbeitspunkt. Als [[Spannungsreferenz]] sind Band-Gap-Referenzen einer Z-Diode wegen ihrer Temperatur-Drift von 20mV/K vorzuziehen. Z-Dioden werden neben der Anwendung zur Spannungsstabilisierung auch gerne als Spannungsbegrenzer in einem [[Pegelwandler]] eingesetzt. Beispiel: RS232-Pegel =&amp;gt; TTL-Pegel (+-15V =&amp;gt; 5.6V/-0.6V), das sind zwar die Maximalwerte von typischen Logik-Eingängen, funktioniert aber meist tadellos. Z-Dioden müssen immer mit einer Strombegrenzung betrieben werden, praktisch ist das meist ein Vorwiderstand.&lt;br /&gt;
&lt;br /&gt;
== Suppressordiode ==&lt;br /&gt;
&lt;br /&gt;
Dabei handelt es sich um spezielle Z-Dioden, welche durch ihre Konstruktion in der Lage sind, sehr hohe Pulsströme für kurze Zeit auszuhalten, je nach Typ zwischen 600-5000W. Sie werden als Schutzbauelemente gegen Überspannungen an Stromversorgungsleitungen oder Signalleitungen verwendet. Nachteilig ist die teilweise hohe Kapazität dieser Dioden, welche bei niedrigen Spannungen mehrere Nanofarad betragen kann. Allerdings gibt es mehr und mehr Typen, welche trotz hoher Pulsbelastbarkeit eine sehr geringe Kapazität haben und damit direkt zum Schutz von hochfrequenten Signalleitungen genutzt werden können.&lt;br /&gt;
&lt;br /&gt;
== Avalanchediode ==&lt;br /&gt;
&lt;br /&gt;
Avalancedioden sind praktisch wie Z-Dioden. Durch diese Eigenschaft kann man Avalancedioden ohne zusätzliche Symetrierungsmaßnahmen in Reihe schalten. Dioden mit weniger Sperrstrom weden dabei mit etwas mehr Sperrspannung  belastet und zwar so weit, dass der einsetzende Avalanchestrom genau dem Sperrstrom der anderen Dioden entspricht.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[Dioden-Übersicht]]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/265145#2758976 Forumsbeitrag]: Präzisions-Z-Diode zur Symetrierung von Akkus in Reihenschaltung&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/265367#2771241 Forumsbeitrag]: Aktive Nachbildung einer HV-Z-Diode, Linearregler für 2kV/2µA&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Diode Diode] bei Wikipedia&lt;br /&gt;
&lt;br /&gt;
[[Category:Bauteile]]&lt;br /&gt;
[[Category:Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Pollin_ATMEL_Evaluations-Board&amp;diff=79016</id>
		<title>Pollin ATMEL Evaluations-Board</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Pollin_ATMEL_Evaluations-Board&amp;diff=79016"/>
		<updated>2013-10-17T18:39:09Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Änderung 79015 von 27.159.215.116 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das &#039;&#039;&#039;ATMEL Evaluations-Board&#039;&#039;&#039; von Pollin ist ein preiswerter und simpler Programmer und ein Evaluations-Board für ATMEL AVR Mikrokontroller in DIL-Gehäusen. &lt;br /&gt;
&lt;br /&gt;
Die [http://www.pollin.de Pollin] Bestellnummer lautet [http://www.pollin.de/shop/shop.php?cf=detail.php&amp;amp;pg=OA==&amp;amp;a=MTY5OTgxOTk=&amp;amp;w=OTk4OTU4&amp;amp;ts=0  810 38], die aktuelle Version ist 2.0.1 (im September 2008, [http://www.mikrocontroller.net/attachment/126417/Atmel_Evaluations-Board_Version_2.0.1_D810038B.gif Schaltplan]). Das Board ähnelt dem [[Pollin Funk-AVR-Evaluationsboard]].&lt;br /&gt;
&lt;br /&gt;
Der Programmer auf der Platine ist ein einfacher serieller &#039;&#039;bit-banging&#039;&#039; Programmer, mit allen Nachteilen, die diese Programmer mit sich bringen (Probleme an USB-seriell Umsetzern (Ausnahme siehe [http://www.mikrocontroller.net/topic/118793#1070311]), unzuverlässig, usw.). Der Programmer kann zum Beispiel von [[avrdude]] gesteuert werden, wenn dabei der  Programmer-Typ &#039;&#039;ponyser&#039;&#039; benutzt wird.&lt;br /&gt;
&lt;br /&gt;
Neben dem Programmer befindet folgendes auf dem 160 mm x 100 mm grossen Board:&lt;br /&gt;
&lt;br /&gt;
* 5V Spannungsregler&lt;br /&gt;
&lt;br /&gt;
* ISP-Anschluss, 10-polig. Kann verwendet werden, um einen anderen Programmer anzuschliessen. Kann auch verwendet werden, um einen AVR ausserhalb des Boards in einer anderen Schaltung zu programmieren. Achtung! Es sollten nur 5V Targetsysteme so programmiert werden!&lt;br /&gt;
&lt;br /&gt;
* [[JTAG]]-Anschluss zum Anschluss eines externen JTAG [[ICD]].&lt;br /&gt;
&lt;br /&gt;
* Zusätzliche serielle Schnittstelle. Der Programmer auf dem Board besitzt eine serielle Schnittstelle ausschliesslich zum Programmieren der AVRs. Zusätzlich ist eine weitere serielle Schnittstelle für die Kommunikation zwischen AVR und PC vorhanden, die mit den AVR USART verbunden werden kann.&lt;br /&gt;
&lt;br /&gt;
* Drei Taster. Mit etwas Geschick (Patchkabel von den Jumpern zum 40-poligen Pfostenstecker) lassen sich diese auch mit anderen als den vorgesehenen AVR I/O-Pins verbinden. (&#039;&#039;&#039;Achtung!! Die Beschaltung ist nicht gut, lieber einfach ohne C und R nach Masse schalten sonst gibt es Spannungseinbrüche&#039;&#039;&#039; - siehe hierzu auch [[Diskussion:Pollin_ATMEL_Evaluations-Board]] und das [http://www.mikrocontroller.net/search?query=Pollin+Evolution+board+taster&amp;amp;forums%5B%5D=1&amp;amp;forums%5B%5D=19&amp;amp;forums%5B%5D=9&amp;amp;forums%5B%5D=10&amp;amp;forums%5B%5D=2&amp;amp;forums%5B%5D=4&amp;amp;forums%5B%5D=3&amp;amp;forums%5B%5D=6&amp;amp;forums%5B%5D=17&amp;amp;forums%5B%5D=11&amp;amp;forums%5B%5D=8&amp;amp;forums%5B%5D=14&amp;amp;forums%5B%5D=12&amp;amp;forums%5B%5D=7&amp;amp;forums%5B%5D=5&amp;amp;forums%5B%5D=18&amp;amp;forums%5B%5D=15&amp;amp;forums%5B%5D=13&amp;amp;forums%5B%5D=16&amp;amp;max_age=-&amp;amp;sort_by_date=0 Forum].))&lt;br /&gt;
&lt;br /&gt;
* Zwei LEDs. Mit etwas Geschick (Patchkabel) lassen sich diese auch mit anderen als den vorgesehenen AVR I/O-Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
* Summer. Es scheint verschiedene Bestückungen zu geben. Selbstständig schwingend oder simpel. Achtung! Zumindest eine Sorte &amp;quot;Summer&amp;quot; ist ein Lautsprecher mit 50Ω. Anstatt des Jumpers eine LED aufstecken vermindert die Belastung des Prozessors erheblich, und man hat zugleich eine optische Kontrolle.&lt;br /&gt;
&lt;br /&gt;
* 40-poliger Pfostenstecker auf dem die meisten I/O Pins nochmal rausgeführt sind. Tipp: Einfache IDE-Kabel, die man sonst für den Anschluss von Festplatten benutzt, passen exakt auf diesen Anschluss. Die beiden anderen Buchsen des IDE-Kabels kann man wie ein Mini-Steckbrett verwenden. Solche IDE-Kabel findet man beim Elektronik-Discounter für wenige Cent.&lt;br /&gt;
&lt;br /&gt;
* DIL-Fassungen (40-polig, 28-polig, 20-polig, 8-polig) einfacher Qualität für AVRs in unterschiedlichen DIL Gehäusen. Achtung! Es darf immer nur eine Fassung mit einem AVR belegt sein.&lt;br /&gt;
&lt;br /&gt;
* Eine einfache 8-polig DIL-Fassung für ein [[TWI]] [[EEPROM]] der 24Cxx-Serie über den I2C-Bus. (&#039;&#039;&#039;Achtung!! Bei Verwendung der großen Fassung für den z.&amp;amp;nbsp;B. ATMega16 die Jumper 9 und 10 entfernen!&#039;&#039;&#039; Sonst werden die Pins 22/23 an die Pins 35/36 angeschlossen)&lt;br /&gt;
&lt;br /&gt;
* Quarze, für jede AVR-Fassung einen. Hier Fassungen einzubauen ist keine schlechte Idee.&lt;br /&gt;
&lt;br /&gt;
* Der mitgelieferte Bestückungsplan (Ver.2.0.1) in der Dokumentation ist etwas fehlerhaft, die Bauelemente IC1 und die NETZ LED sind etwas anders angeordnet als angegeben. &lt;br /&gt;
&lt;br /&gt;
Anleitung &amp;amp; Beispiele gehen von 8 Mhz Takt aus und zeigen entsprechende [[AVR_Fuses]].  Wo 16 Mhz Quarze verbaut sind, muß CLKOPT genau umgekehrt wie im PDF gesetzt werden. &lt;br /&gt;
Andernfalls fehlerhaftes Verhalten, etwa unmotivierte Sprünge des Programmzählers (beobachtet mit Originalbeschaltung R + C der Taster). &lt;br /&gt;
&lt;br /&gt;
Es wird kein Zubehör mitgeliefert, weder serielle Kabel, Steckernetzteil noch Plantinenabstandshalter. Auch werden kein AVR oder ein EEPROM mitgeliefert.&lt;br /&gt;
&lt;br /&gt;
Pollin bietet diverse Zusatzmodule an.&lt;br /&gt;
&lt;br /&gt;
== Meinungen ==&lt;br /&gt;
&lt;br /&gt;
Im Vergleich zum STK500 ist das Board recht unflexibel und hat weniger Features. Die Beschreibung zum Zusammenlöten des Boards ist ausreichend, zur Benutzung des Boards erfährt man außer dem Schaltplan praktisch nichts. Der Schaltplan und das AVR-Tutorial zusammen sind allerdings ausreichend. Bei dem günstigen Preis garantiert kein Fehlkauf.&lt;br /&gt;
&lt;br /&gt;
Achtung !&lt;br /&gt;
&lt;br /&gt;
Vor dem Aufbau unbedingt dieses Dokument lesen:&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/articles/Diskussion:Pollin_ATMEL_Evaluations-Board&lt;br /&gt;
&lt;br /&gt;
Wer vor soviel Umbauarbeiten zurück scheut, es reicht auch C17 bis C19 nicht zu bestücken. Siehe auch diesen Thread:&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/topic/200829&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR-Boards]]&lt;br /&gt;
&lt;br /&gt;
== Nachfolger ==&lt;br /&gt;
&lt;br /&gt;
eHaJo hat einen Nachfolger des Pollin-Boards im Angebot:&lt;br /&gt;
http://www.ehajo.de/Bausaetze/aTeVaL&lt;br /&gt;
&lt;br /&gt;
[[Bild:Ateval_1.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
Hier die Pluspunkte:&lt;br /&gt;
* Atmel AVR-ISP MkII Clon als Programmer, damit auch mit allen Atmel- und AVR-Studios kompatibel (LUFA-basierend)&lt;br /&gt;
* Atmega32U2 als Programmer-IC mit USB-Bootloader und allen Pins auf Lötpins geführt&lt;br /&gt;
* Per Jumper zwischen Programmer und Seriell-Adapter wählbar&lt;br /&gt;
* komplette Versorgung über USB (5V), geschützt mit 500mA automatisch rückstellbarer Sicherung&lt;br /&gt;
* Pinkompatibel mit dem Pollin-Eval-Board&lt;br /&gt;
* Programmer von der Platine abbrechbar, falls man nur noch den Programmer oder den USB/Seriell-Wandler benötigt&lt;br /&gt;
* ISP-Steckkontakte in 6-polig und 10-polig, Standard-Atmel-Belegung&lt;br /&gt;
* 2 externe LEDs, 3 Taster, 2 Potis und ein AC-Summer für die ersten Mikrocontrollerprojekte&lt;br /&gt;
* grüne LED für Versorgungsspannung, rote LED für &amp;quot;programmiert gerade&amp;quot; und RS232-Traffic&lt;br /&gt;
* Quarz für jeden Controller, gesockelt&lt;br /&gt;
* Sockel für EEPROM&lt;br /&gt;
* Alle SMD-Bauteile vorbestückt, es müssen nur noch die bedrahteten Bauteile verlötet werden, daher auch ideal für Einsteiger!&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Operationsverst%C3%A4rker-Grundschaltungen&amp;diff=78855</id>
		<title>Operationsverstärker-Grundschaltungen</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Operationsverst%C3%A4rker-Grundschaltungen&amp;diff=78855"/>
		<updated>2013-10-08T13:53:49Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Änderung 78854 von 193.171.131.249 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Idealisiertes Modell eines OPV ==&lt;br /&gt;
&lt;br /&gt;
=== Anschlüsse ===&lt;br /&gt;
Ein Operationsverstärker hat zwei Eingänge (+) und (-) und einen Ausgang&lt;br /&gt;
(UA). Außerdem verfügt er über eine positive und eine negative&lt;br /&gt;
Spannungsversorgung (V+) und (V-).&lt;br /&gt;
&lt;br /&gt;
=== Spannungsversorgungen ===&lt;br /&gt;
Die Spannungsversorgungen sollen zunächst nicht interessieren. Sie&lt;br /&gt;
werden in Schaltungen oft nicht eingezeichnet. &lt;br /&gt;
In der Praxis ist es jedoch wichtig zu wissen, dass die Ausgangsspannung immer zwischen (V+) und (V-) liegt. Die Ausgangsspannung des OPV kommt schließlich  dadurch zustande, dass der Ausgang über einen Transistor mehr oder weniger hochohmig mit den beiden Versorgungsspannungen verbunden wird.&lt;br /&gt;
&lt;br /&gt;
Wenn man einen OPV also mit +5V versorgt, so kann der OPV im besten Fall am Ausgang +5V erzeugen. Man würde in diesem Fall von einem &amp;quot;Rail-to-Rail&amp;quot; Operationsverstärker sprechen.&lt;br /&gt;
Bei vielen Operationsverstärkern ist die maximal mögliche Ausgangsspannung geringer als die Versorgungsspannung. Ein mit +5V Spannungsversorgung beschalteter OPV kann dann beispielsweise nur +4V Ausgangsspannung erzeugen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    | \&lt;br /&gt;
    |  \&lt;br /&gt;
 -- | - \&lt;br /&gt;
    |    \_______&lt;br /&gt;
    |    /&lt;br /&gt;
 -- | + /&lt;br /&gt;
    |  /&lt;br /&gt;
    | /&lt;br /&gt;
&lt;br /&gt;
=== Ausgang ===&lt;br /&gt;
Der Ausgang des OPV ist eine ideale Spannungsquelle. Das bedeutet, dass die&lt;br /&gt;
Ausgangsspannung unabhängig davon ist, was ausgangsseitig an den OPV&lt;br /&gt;
angeschlossen wird.&lt;br /&gt;
In der Praxis gilt dieses Modell häufig nur bei &amp;quot;sinnvollen Anwendungen&amp;quot;. So ist beispielsweise der Ausgangsstrom des OPV nach oben begrenzt (typischerweise im mA-Bereich), und manche OPV schwingen sehr leicht, wenn man sie kapazitiv belastet.&lt;br /&gt;
&lt;br /&gt;
=== Eingänge ===&lt;br /&gt;
Die Eingänge eines OPV sind hochohmig, d. h., es handelt sich nur um &amp;quot;Messfühler&amp;quot;, die keinen Strom führen.&lt;br /&gt;
Achtung: Die Eingangsschutzbeschaltung (Dioden von GND und gegen VCC) bei manchen OPVs kann jedoch dazu führen, dass Strom in den Eingang fliesst, wenn dessen Betriebsspannung z.B. abgeschaltet ist.&lt;br /&gt;
&lt;br /&gt;
=== Funktionsweise ===&lt;br /&gt;
Der OPV mißt zu jeder Zeit die Differenz &amp;lt;math&amp;gt;U_D = U(+) - U(-)&amp;lt;/math&amp;gt; der&lt;br /&gt;
Eingangsspannungen.&lt;br /&gt;
&lt;br /&gt;
Ist die Spannung an (+) größer als an (-), so erhöht der OPV die&lt;br /&gt;
Ausgangsspannung.&lt;br /&gt;
Ist die Spannung an (+) niedriger als an (-), so vermindert der OPV die&lt;br /&gt;
Ausgangsspannung.&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis dieses Vorgangs wird häufig über die Gleichung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U_a = v \cdot U_D&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
beschrieben, wobei &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; eine sehr große Zahl (10^4...10^6) ist. &lt;br /&gt;
&lt;br /&gt;
Mit Hilfe der beschriebenen Funktionsweise lassen sich alle grundlegenden Schaltungen herleiten.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel ===&lt;br /&gt;
&lt;br /&gt;
Betrachtet wird die invertierende Grundschaltung nach Abbildung a) im Abschnitt &amp;quot;Verstärkergrundschaltungen&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Für die Pfeilrichtungen der Spannungen und Ströme gilt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U_e&amp;lt;/math&amp;gt;: von oben nach unten&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I_{R3}&amp;lt;/math&amp;gt;: von links nach rechts&lt;br /&gt;
&lt;br /&gt;
Die Spannung am (+)Eingang ist gleich Null. Die Spannung am (-)Eingang wird durch die Spannungsquelle &amp;lt;math&amp;gt;U_e&amp;lt;/math&amp;gt; und durch die im OPV befindliche und mit dem Ausgang verbundene Spannungsquelle des OPV manipuliert.&lt;br /&gt;
&lt;br /&gt;
* Ist die Spannung am (-)Eingang negativ, so erhöht der Operationsverstärker die Ausgangsspannung. Dadurch wird auch die Spannung am (-)Eingang positiver. Und zwar so lange, bis die Spannung am (-)Eingang gleich groß ist, wie die Spannung am (+)Eingang, also U(-)=0V.&lt;br /&gt;
* Ist die Spannung am (-)Eingang positiv, so vermindert der Operationsverstärker die Ausgangsspannung. Dadurch wird auch die Spannung am (-)Eingang negativer. Und zwar so lange, bis die Spannung am (-)Eingang gleich groß ist, wie die Spannung am (+)Eingang, also U(-)=0V.&lt;br /&gt;
&lt;br /&gt;
Der Operationsverstärker wird also die Spannungen an (+) und (-)&lt;br /&gt;
angleichen. Das passiert immer dann, wenn der Ausgang mit dem (-)Eingang&lt;br /&gt;
verbunden ist. Man nennt das Prinzip &amp;quot;Gegenkopplung&amp;quot;. Auf diese Art und&lt;br /&gt;
Weise funktionieren alle analogen OPV-Schaltungen.&lt;br /&gt;
&lt;br /&gt;
Da an (+) Massepotential anliegt, wird somit auch (-) daran angeglichen, und so liegt an &amp;lt;math&amp;gt;R_3&amp;lt;/math&amp;gt; die Spannung &amp;lt;math&amp;gt;U_e&amp;lt;/math&amp;gt; an. Daher gilt: &lt;br /&gt;
&amp;lt;math&amp;gt;I_{R3}=\frac{U_e}{R_3}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da der (-)Eingang hochohmig ist, fließt &amp;lt;math&amp;gt;I_{R3}&amp;lt;/math&amp;gt; über &amp;lt;math&amp;gt;R_4&amp;lt;/math&amp;gt; weiter zum OPV-Ausgang.&lt;br /&gt;
&lt;br /&gt;
Ua ist die Spannung vom Ausgang zur (virtuellen) Masse am (-)Eingang.&lt;br /&gt;
(--&amp;gt; Pfeil einzeichnen und klarmachen, daß es egal ist, ob der Pfeil vom&lt;br /&gt;
Ausgang zur Masse geht oder vom Ausgang &amp;quot;entgegen der Stromrichtung&amp;quot; zur&lt;br /&gt;
virtuellen Masse an (-)!)&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von &amp;lt;math&amp;gt;I_{R3}=\frac{U_e}{R_3}&amp;lt;/math&amp;gt; ergibt sich:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U_a = -R_4 \cdot I_{R3} = -{{R_4} \over {R_3}} \cdot U_e.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Energie für den Stromtransport über &amp;lt;math&amp;gt;R_4&amp;lt;/math&amp;gt; stammt vom OPV! Sobald die Ladungen ausgehend von der Spannungsquelle &amp;lt;math&amp;gt;U_e&amp;lt;/math&amp;gt; die virtuelle Masse an (-) erreicht haben, hat &amp;lt;math&amp;gt;U_e&amp;lt;/math&amp;gt; seine gesamte Energie abgegeben.&lt;br /&gt;
&lt;br /&gt;
== Reale OPs / Kennwerte ==&lt;br /&gt;
Abweichend vom idealen OP besitzen reale OPs diverse Einschränkungen und Kennwerte, die sie für verschiedene Einsätze mehr oder weniger prädestinieren.&lt;br /&gt;
&lt;br /&gt;
=== Leerlaufverstärkung ===&lt;br /&gt;
Die Leerlaufverstärkung gibt an, wie stark sich das Ausgangssignal i.A. der Änderung eines Eingangsignals statisch ändert, bzw nach dem Einschwingen erreichen könnte, wenn es nicht durch die Betriebsgrenzen limitiert wäre.&lt;br /&gt;
&lt;br /&gt;
=== Anstiegszeit ===&lt;br /&gt;
Bestimmend für die dynamische Änderung des Signal ist wiederum die slew rate, die wesentlich das AC-Verhalten bestimmt.&lt;br /&gt;
&lt;br /&gt;
=== Frequenz-Bandbreiteprodukt ===&lt;br /&gt;
&lt;br /&gt;
=== Gleichtaktverstärkung ===&lt;br /&gt;
Infolge des inhomogenen Aufbaus der internen Verstärkerstufen werden die beiden Eingangssignale nicht exakt gleich verstärkt, was in einen Gleichanteil und einen Differenzanteil aufgeteilt werden kann. Der nicht erwünschte Gleichtakt (engl. &#039;&#039;common mode&#039;&#039;) ist dabei ein Maß für die Qualität des OP.&lt;br /&gt;
&lt;br /&gt;
== Verstärkergrundschaltungen ==&lt;br /&gt;
=== Grundbeschaltung mit Berechnung ===&lt;br /&gt;
[[Bild:Op-verstaerker-a.png]] [[Bild:Op-verstaerker-b.png]]&lt;br /&gt;
&lt;br /&gt;
In a) und b) verwenden wir den OP als Verstärker und nutzen hier die Möglichkeit der Gegenkopplung, um definierte Verstärkungen zu erhalten. Wir gehen wieder davon aus, dass der OP ein ideales Bauteil ist und daher seine Leerlaufverstärkung unendlich ist. Ebenso betrachten wir den Eingangswiderstand als unendlich.&lt;br /&gt;
&lt;br /&gt;
In a) ist ein invertierender Verstärker mit einem OP dargestellt. Durch die Widerstände R3 und R4 wird die Verstärkung bestimmt:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;V = \frac{U_a}{U_e} = -\frac{R_4}{R_3}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Verhältnis der beiden Widerstände bestimmt also die Verstärkung und somit die Ausgangsspannung:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;U_a = -\frac{R_4}{R_3} \cdot U_e &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder auch&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;U_a = V \cdot U_e&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das negative Vorzeichen drückt aus, dass es sich um einen invertierenden Verstärker handelt.&lt;br /&gt;
&lt;br /&gt;
Beim nichtinvertierenden Verstärker b) finden wir auch eine Rückkopplung über R6 zum invertierenden Eingang des OP. Die Verstärkung wird durch das Gegenkopplungsnetzwerk R6 und R7 bestimmt. Hier ist:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;V = 1 + \frac{R6}{R7}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Verstärkung von 1 ist sinnvoll, wenn eingangsseitig eine Spannungsquelle mit hohem Innenwiderstand verwendet wird. Für &amp;lt;math&amp;gt;\frac{R6}{R7} \to 0&amp;lt;/math&amp;gt; heißt die Schaltung &amp;quot;Spannungsfolger&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Kleinere Werte als 1 lassen sich nicht realisieren. Die Ausgangsspannung errechnet sich also so:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;U_a = U_e \cdot \left (1 + \frac{R_6}{R_7}\right )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel: Eine Eingangsspannung von 0,5 V soll auf den Wert 5 V verstärkt werden, es ist also eine Verstärkung V von 10 benötigt. R7 ist mit 10 k&amp;amp;Omega; vorgegeben. Also ist das Verhältnis&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\frac{R_6}{R_7} = V - 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei einem Wert von 10 k&amp;amp;Omega; für R7 errechnet sich R6 zu&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
R6 = (V - 1) \cdot R7&lt;br /&gt;
   = (10 - 1) \cdot 10\,\mathrm{k\Omega}&lt;br /&gt;
   = 90\,\mathrm{k\Omega}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Ausgangsspannung Ua wird also:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
U_a =   U_e \cdot \left (1 + \frac{R_6}{R_7}\right )&lt;br /&gt;
   = 0,5\,\mathrm{V} \cdot \left (1 + \frac{90\,\mathrm{k\Omega}}{10\,\mathrm{k\Omega}}\right)&lt;br /&gt;
   = 5\,\mathrm{V}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Nichtinvertierender Verstärker mit Offset ===&lt;br /&gt;
Eine Abwandlung des nichtinvertierenden Verstärkers erlaubt es, einen konstanten Offset vorzugeben. D.h. von der zu verstärkenden Eingangsspannung U(e) wird eine konstante Spannung U(o) abgezogen und die Differenz verstärkt. Auf der Ausgangsspannung U(a) findet sich die Offsetspannung U(o) allerdings wieder.&lt;br /&gt;
[[Bild:Op-verstaerker-offset.png]]&lt;br /&gt;
&lt;br /&gt;
Es gilt:&lt;br /&gt;
&lt;br /&gt;
Offsetspannung: &lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
U_o =  U_V \cdot \frac{R2}{R1 + R2}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
mit U(V) = Versorgungsspannung an R1&lt;br /&gt;
&lt;br /&gt;
Verstärkung:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V = 1 + \frac{R3}{\frac{R1 \cdot R2}{R1 + R2}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ausgangsspannung:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
U_a = (U_e - U_o) \cdot V + U_o&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Vorteil dieser Schaltung ist, daß nur die Differenz verstärkt wird. Damit kann eine größere Verstärkung gewählt werden. Zu berücksichtigen ist dabei, daß die Ausgangsspannung U(a) um die Offsetspannung U(o) überlagert ist.&lt;br /&gt;
&lt;br /&gt;
=== Spannungsfolger (Impedanzwandler) ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Op-spannungsfolger1.png]]&lt;br /&gt;
&lt;br /&gt;
Eine Abart des nichtinvertierenden Verstärkers stellt der Spannungsfolger dar. Beim nichtinvertierenden Verstärker errechnet sich die Ausgangsspannung aus:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;U_a = U_e \cdot \left (1 + \frac{R_2}{R_1}\right )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn wir R2 auf 0Ω (mit R1 &amp;gt; 0) oder R1 auf unendlich (mit R2 &amp;lt; ∞) ändern, erhalten wir daher:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;V = 1 + \frac{R_2}{R_1} = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Spannungsfolger hat also eine Verstärkung V von 1.&lt;br /&gt;
&lt;br /&gt;
Umgezeichnet sieht die Schaltung so aus: &lt;br /&gt;
&lt;br /&gt;
[[Bild:Op-spannungsfolger2.png]]&lt;br /&gt;
&lt;br /&gt;
Was soll das nun? Wir nutzen die Eigenschaft, dass ein idealer OP einen unendlichen Eingangswiderstand und einen Ausgangswiderstand von 0Ω hat. Real sieht das natürlich anders aus: so liegt der Eingangswiderstand Re bei normalen OPs in der Größenordnung von 1MOhm bis &amp;lt;math&amp;gt;10^{15} \Omega&amp;lt;/math&amp;gt;, der Ausgangswiderstand Ra im Bereich 20Ω bis 1kOhm. Deshalb spricht man bei dieser Schaltung von einem Impedanzwandler. Eine solche Schaltung kann also aus einer relativ hochohmigen Spannungsquelle eine niederohmige, durch Folgeschaltungen belastbare Spannungsquelle machen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Op-spannungsfolger3.png|left]]&lt;br /&gt;
&lt;br /&gt;
In dem nebenstehenden Beispiel ist eine einfache Möglichkeit zur Erzeugung einer Referenzspannung gezeigt. Es kommt eine normale Stabilisierungsschaltung mit einer Zenerdiode zur Anwendung, die aber nicht mehr die schlechten Eigenschaften der Standardbeschaltung mit lediglich Widerstand und Zenerdiode  hat. Bei einer Zenerdiode hängt die genaue Spannung davon ab, welcher Strom durch sie fliesst. Dieser Strom (und damit auch die Höhe der Zenerspannung) würde sich aber ändern, wenn ein Verbraucher die Zenerdiode direkt mit seinem Stromfluss belasten würde. Als Folge davon würde die Spannungslage der Zenerdiode je nach Verbraucher leicht schwanken. Durch den Spannungsfolger wird das verhindert, weil der jetzt den vom Verbraucher gezogenen Strom bereitstellt.&lt;br /&gt;
&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
[[Bild:Op-spannungsfolger4.png|left]]&lt;br /&gt;
&lt;br /&gt;
Eine weitere Anwendungsmöglichkeit wäre das hochohmige Auskoppeln einer Brückenspannung. Die Brückenschaltung selbst wird durch Folgeschaltungen nicht mehr belastet, alle anderen Eigenschaften bleiben erhalten.&lt;br /&gt;
&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
=== Der Komparator ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Op-komp-a.png]] [[Bild:Op-komp-b.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In der einfachsten Beschaltung des Operationsverstärkers erhält man einen Komparator. Es fällt auf, dass kein Gegenkopplungsnetzwerk vorhanden ist. Der OP arbeitet daher mit seiner vollen Leerlaufverstärkung Vo. Dies bedeutet, dass bereits eine kleine Eingangsspannung genügt, um den OP in die Begrenzung zu treiben. Das heißt, die Ausgangsspannung Ua wird annähernd die Betriebsspannung erreichen.&lt;br /&gt;
&lt;br /&gt;
Beim Komparator gibt es zwei Möglichkeiten der Beschaltung: die invertierende nach a) und die nichtinvertierende Beschaltung nach b). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Berechnungsbeispiel für Schaltung b)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Angenommen die Leerlaufverstärkung Vo von 40000 und eine Eingangsspannung von 0,1 Volt. Die Betriebsspannungen Vcc und Vee legen wir auf +/- 24 V fest. Damit ergibt sich theoretisch für Ua:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;U_a =  V_0 \cdot U_e = 40000 \cdot 0,1\,\mathrm{V} = 4000\,\mathrm{V}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das ist natürlich ein unrealistischer Wert, da Ua nicht höher sein kann als die Betriebsspannung. Also anders ausgedrückt: Bei welcher Spannung Ue erreicht der OP seine Aussteuerungsgrenze?&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;U_e = V_{cc} / V_0 = 24\,\mathrm{V} / 40000 = 0,6\,\mathrm{mV}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das bedeutet, dass eine Spannung von 0,6 mV ausreicht um den Komparator in die Begrenzung zu treiben.&lt;br /&gt;
&lt;br /&gt;
Das gleiche gilt auch für den invertierenden Komparator, allerdings wird hier der OP in die negative Begrenzung gebracht.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;-U_a = V_0 \cdot U_e&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So hat der Komparator nun einen einstellbaren Schaltpunkt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Op-komp-c.PNG]]&lt;br /&gt;
&lt;br /&gt;
=== Der Addierer (Summierverstärker) ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Op-addierer.png]]&lt;br /&gt;
&lt;br /&gt;
Ein als invertierender Verstärker beschalteter OP lässt sich so beschalten, dass ein Summensignal aus den Eingangsspannungen gebildet wird. Um die Funktion deutlich zu machen, ist eine Betrachtung der einzelnen Ströme nötig.&lt;br /&gt;
&lt;br /&gt;
In einem invertierenden Verstärker wird sich die Ausgangsspannung immer so einstellen, dass der invertierende Eingang Massepotential hat. Die virtuelle Masse (VM) unterscheidet sich von einer &amp;quot;normalen&amp;quot; Masse dadurch, dass das Potential durch einen Regelungsvorgang zustande kommt. &lt;br /&gt;
An der virtuellen Masse (VM) gilt die Knotenpunktregel, wonach die Summe der zufließenden Ströme gleich der Summe der abfließenden Ströme ist.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;I_1 + I_2 = -I_3&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sofern &amp;lt;math&amp;gt;U_{e1}&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;U_{e2}&amp;lt;/math&amp;gt; bekannt sind, lässt sich die Gleichung umformen in:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\frac{U_{e1}}{R_1} + \frac{U_{e2}}{R_2} = -\frac{U_a}{R_3}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach Ua aufgelöst ergibt sich:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;-U_a = \left (U_{e1} \cdot \frac{R_3}{R_1}\right ) + \left (U_{e2} \cdot \frac{R_3}{R_2}\right ) + ... + \left (U_{en} \cdot \frac{R_3}{R_n}\right )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Einen Sonderfall gibt es, wenn die Widerstände R1 und R2 gleich sind. Dann gilt&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R_1 = R_2 = R_x&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
und damit&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;-U_a = \frac{R_3}{R_x} \cdot (U_{e1} + U_{e2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Der Subtrahierer (Differenzverstärker) ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Op-subtrahierer.png]]&lt;br /&gt;
&lt;br /&gt;
Ein Subtrahierer ist die Zusammenschaltung eines invertierenden und eines nichtinvertierenden Verstärkers. Schliessen wir Punkt Ue1 nach Masse kurz und steuern Ue2 an, arbeitet die Schaltung als nichtinvertierender Verstärker. Wird Ue2 nach Masse verbunden und Ue1 angesteuert, verhält sich die Schaltung als invertierender Verstärker (R7 vorerst nicht beachten).&lt;br /&gt;
&lt;br /&gt;
Für den 1. Fall gilt:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;U_a = U_{e2} \cdot \left (1 + \frac{R_6}{R_4}\right )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für den 2. Fall:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;U_a = -U_{e1} \cdot \frac{R_6}{R_4}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der dritte Fall ist die Ansteuerung beider Eingänge:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;U_a = -U_{e1} \cdot \frac{R_6}{R_4} + U_{e_2} \cdot \left (1 + \frac{R_6}{R_4}\right )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Schaltung ist gut für eine Erklärung, praktisch aber taugt sie nichts. Denn liegen an den Eingängen gleiche Spannungen an, ist die Ausgangsspannung nicht 0, wie eigentlich zu vermuten wäre. Deshalb ändern wir die Schaltung und fügen R7 ein. Jetzt stellt sich am Punkt + des OPs die Spannung&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;U_{e2+} = U_{e2} \cdot \frac{R_7}{R_5 + R_7}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ein. Wenn wir das berücksichtigen, erhalten wir endlich einen richtigen Subtrahierer:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;U_a = U_{e2} \cdot \left (1 + \frac{R_6}{R_4}\right ) \cdot \frac{R_7}{R_5 + R_7} - \frac{R_6}{R_4} \cdot U_{e1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies gilt für alle Subtrahierer, obwohl es natürlich auch hier wieder zwei Sonderfälle gibt; nämlich a) wenn alle Gegenkopplungswiderstände gleich sind:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R_6 = R_7 = R_4 = R_5&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
dann ist &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;U_a = U_{e2} - U_{e1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder b) wenn die Widerstandsverhältnisse gleich sind  :&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\frac{R_6}{R_4} = \frac{R_7}{R_5}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann ergibt sich für Ua:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;U_a = \left (U_{e2} \cdot \frac{R_6}{R_4}\right ) - \left (U_{e1} \cdot \frac{R_6}{R_4}\right )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder noch einfacher:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;U_a = (U_{e2} - U_{e1}) \cdot \frac{R_6}{R_4}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Addierer/Subtrahierer mit unterschiedlichen Faktoren ===&lt;br /&gt;
Legt man nicht den + sondern den - Eingang des Operationsverstärkers als Bezugspunkt zur Masse mit einem Widerstand fest, übernimmt der Vorwiderstand vom - Eingang, R4 die Aufgabe von R5.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Op-addsub.png]]&lt;br /&gt;
&lt;br /&gt;
Hier die Schaltung die addieren und subtrahieren kann, mit unterschiedlichen Faktoren.&lt;br /&gt;
Sie kann verwendet werden für Aufgaben wie: Gesucht ist eine Schaltung, die aus 0...2.56 V eine Spannung von -10V...10V macht. Für dieses Beispiel wird hier die Dimensionierung durchgeführt:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: left&amp;quot; &lt;br /&gt;
|&#039;&#039;&#039;Ue1 = 5V&#039;&#039;&#039;&lt;br /&gt;
|Einfach festgelegt, muss nur ein positiver Wert sein&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;R6 = 200k&#039;&#039;&#039;&lt;br /&gt;
|Einfach festgelegt, könnte auch 100k oder 500k sein&lt;br /&gt;
|-&lt;br /&gt;
|Ue2i = 0V, &#039;&#039;&#039;Uai = -10V&#039;&#039;&#039;&lt;br /&gt;
|gewählter momentaner &#039;&#039;Zustand 1&#039;&#039;, Ue2 = 0V ist günstig für Berechnung, Ua ist die dazupassende Ausgangsspannung&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Ue2ii = 2.56V&#039;&#039;&#039;, &#039;&#039;&#039;Uaii = 10V&#039;&#039;&#039;&lt;br /&gt;
|gewählter beliebiger &#039;&#039;Zustand 2&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Um = Ue2&lt;br /&gt;
|Gleichgewicht am Eingang&lt;br /&gt;
|-&lt;br /&gt;
|Ia + Ib = Ic&lt;br /&gt;
|In den Eingang fließt &amp;quot;kein&amp;quot; Strom&lt;br /&gt;
|-&lt;br /&gt;
|(Ua-Ue2)/R6 + (Ue1-Ue2)/R4 = Ue2/Rc&lt;br /&gt;
|Gleichung mit den Unbekannten R4 und Rc&lt;br /&gt;
|-&lt;br /&gt;
|(Uai-Ue2i)/R6 + (Ue1-Ue2i)/R4 = Ue2i/Rc&lt;br /&gt;
|Variablen für &#039;&#039;Zustand 1&#039;&#039; eingesetzt, bildet 1. Gleichung&lt;br /&gt;
|-&lt;br /&gt;
|(Uaii-Ue2ii)/R6 + (Ue1-Ue2ii)/R4 = Ue2ii/Rc&lt;br /&gt;
|Variablen für &#039;&#039;Zustand 2&#039;&#039; eingesetzt, bildet 2. Gleichung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;R4=-\frac{R6*U_{e1}}{U_{ai}}&amp;lt;/math&amp;gt;&lt;br /&gt;
|2 Gleichungen mit 2 Unbekannten, Lösung durch Umformen der 1. Gleichung nach R4 und einsetzen von Ue2i=0 (freundlicherweise fällt die 2. Unbekannte dabei raus)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;R4 = 100k&#039;&#039;&#039;&lt;br /&gt;
|restliche Werte eingesetzt&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;Rc=\frac{R6*U_{e1}*U_{e2ii}}{U_{aii}*U_{e1}-U_{ai}*(U_{e1}-U_{e2ii})-U_{e1}*U_{e2ii}}&amp;lt;/math&amp;gt;&lt;br /&gt;
|Ergebnis für R4 in die 2. Gleichung einsetzen und Umformen nach Rc&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Rc = 41.6k&#039;&#039;&#039;&lt;br /&gt;
|Werte eingesetzt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Der Instrumenten-Verstärker ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Instrument.png]]&lt;br /&gt;
&lt;br /&gt;
Ein Nachteil des Subtrahierer ist sein geringer Eingangswiderstand. Um den nahezu unendlichen Eingangswiderstand des verwendeten Operationsverstärkers zu erreichen, kann man einfach vor beide Eingänge je einen Impedanzwandler vorschalten.&lt;br /&gt;
Die hier beschriebene Schaltung ist um drei Widerstände erweitert und ermöglicht die Einstellung der Differenz-Verstärkung über nur einen Widerstand, nämlich R2.&lt;br /&gt;
&lt;br /&gt;
Am invertierenden Eingang von IC1A gilt (Knotenregel):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\frac{U_{a1}-U_{e1}}{R_1}-\frac{U_{e1}-U_{e2}}{R_2}=0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Am invertierenden Eingang von IC1C gilt (Knotenregel):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\frac{U_{a2}-U_{e2}}{R_1}+\frac{U_{e1}-U_{e2}}{R_2}=0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Subtrahiert man die beiden Gleichungen voneinander, erhält man:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;U_{a2}-U_{a1}=(U_{e2}-U_{e1})\cdot\left (1+\frac{2\cdot R_1}{R_2}\right )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Letztere Differenz ist die Eingangsspannung eines normalen Subtrahierers mit der Verstärkung 1.&lt;br /&gt;
&lt;br /&gt;
Also ergibt sich als Ausgangsspannung:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;U_a=(U_{e2}-U_{e1}) \cdot \left (1+\frac{2\cdot R_1}{R_2}\right )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Differenzverstärkung beträgt demnach:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;V=\left (1+\frac{2\cdot R_1}{R_2} \right )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anwendung: Auswertung von Brückenschaltungen, wie Drucksensoren oder Dehnungsmessstreifen, die durch den Eingangswiderstand der Messschaltung nicht belastet werden dürfen.&amp;lt;br&amp;gt;&lt;br /&gt;
Instrumenten-Verstärker kann man auch fertig kaufen. Im INA102 ist die komplette Schaltung integriert. Für R2 sind 3 verschiedene Werte eingebaut, die bei passender Verschaltung eine Verstärkung von 1, 10, 100 oder 1000 ermöglichen.&lt;br /&gt;
&lt;br /&gt;
=== Der Multiplizierer (Mischer) ===&lt;br /&gt;
&lt;br /&gt;
=== Der Logarithmierer ===&lt;br /&gt;
Logarithmierer werden mit der Kennlinie einer Diode konstruiert, die einen eingeprägten Strom in eine Spannung übersetzt.&lt;br /&gt;
&lt;br /&gt;
= Spannungsversorgung und Beschaltung =&lt;br /&gt;
&lt;br /&gt;
== Betrieb mit einfacher Versorgungsspannung ==&lt;br /&gt;
&lt;br /&gt;
Häufig möchte man Wechselspannung (z. B. Audiosignale) die auch negative Spannungen enthält mit einem Opamp verstärken, hat aber nur eine einfache Versorgungsspannung, eine positive in Bezug zu Masse, zur Verfügung. Dafür bieten sich folgende Schaltungen an, die in der Literatur leider häufig vernachlässigt werden.&lt;br /&gt;
&lt;br /&gt;
=== Nichtinvertierender Verstärker ===&lt;br /&gt;
&lt;br /&gt;
[[Bild: Ss_opamp1.png]]&lt;br /&gt;
&lt;br /&gt;
Der positive Eingang wird mit einem Spannungsteiler (R3 und R5) auf die halbe Betriebsspannung gelegt. Dieser Spannung wird dann die zu verstärkende Eingangswechselspannung überlagert. Mit den Kondensatoren am Eingang (C1) und am Ausgang (C2) wird der Gleichspannungsanteil abgekoppelt.&lt;br /&gt;
&lt;br /&gt;
Die Verstärkung ist in diesem Beispiel für Wechselspannung 11 (Formel wie oben), für Gleichspannung aber 1, da C4 für Gleichspannung einen unendlichen Widerstand darstellt. C3 sollte dorthin gehen, wo das Eingangssignal seinen Bezugspunkt hat, also die Abschirmung der Cinch-Buchse, während R5 dorthin geht, wo der Operationsverstärker seine negative Versorgungsspannung her bekommt, falls das nicht die gleichen Potentiale, hier GND, sein sollten.&lt;br /&gt;
&lt;br /&gt;
=== Invertierender Verstärker ===&lt;br /&gt;
&lt;br /&gt;
Das Prinzip funktioniert analog auch für die invertierende Beschaltung:&lt;br /&gt;
&lt;br /&gt;
[[Bild: Ss_opamp2.png]]&lt;br /&gt;
&lt;br /&gt;
= Kaufempfehlung =&lt;br /&gt;
LM 158/258/358 2 OPs in einem Gehäuse Preis ca. 0,30€.&lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Standardbauelemente#Operationsverst.C3.A4rker|Standardbauelemente - Operationsverstärker]].&lt;br /&gt;
&lt;br /&gt;
Wer Audio OpAmps sucht - tangentsoft.net hat mal welche unter die Lupe genommen: [http://www.tangentsoft.net/audio/opamps.html Notes on Audio OpAmps]&lt;br /&gt;
&lt;br /&gt;
= Weblinks =&lt;br /&gt;
*[http://www.eetkorea.com/ARTICLES/2003SEP/A/2003SEP19_AMD_AN07.PDF Op Amp Circuit Collection] - National Semiconductor Application Note 31 mit vielen weiteren OP-Schaltungen&lt;br /&gt;
*[http://www-s.ti.com/sc/psheets/slod006b/slod006b.pdf Op Amps for Everyone] - englischsprachiges, sehr umfangreiches Dokument zu OPV und deren Anwendung&lt;br /&gt;
* [http://www.elektronik-kompendium.de/sites/bau/0209092.htm Operationsverstärker im ElKo]&lt;br /&gt;
*[http://www.inf.fu-berlin.de/lehre/WS00/peg/folien/Peg_v7a.pdf OP Teil 1], [http://www.inf.fu-berlin.de/lehre/WS00/peg/folien/Peg_v7b.pdf OP Teil 2] - OP-Schaltungen (deutsch)&lt;br /&gt;
*[http://www.blecken.de/download/opverst.zip Schaltungstechnik mit Operationsverstärkern] - Prof. K. Blecken, Skript zur Vorlesung (deutsch, *.doc-Format)&lt;br /&gt;
* [http://www.roboternetz.de/wissen/index.php/Operationsverst%C3%A4rker RN-Wissen Operationsverstärker]&lt;br /&gt;
* [http://www.national.com/AU/design/0,4706,268_0_,00.html Online Seminar] von National Semiconductor&lt;br /&gt;
* [http://www.franzis.de/elo-das-magazin/grundlagen-und-ausbildung/operationsverstaerker/der-operationsverstaerker ELO-Online-Magazin, Franzis-Verlag], [http://www.franzis.de/online-shop/elektronik/lernpakete-elektronik/lernpaket-elektronik-mit-ics Lernpaket Elektronik mit ICs] &amp;quot;Elektronische Experimente mit integriertem Schaltkreis&amp;quot;, Kasten mit Steckbrett/Bauelementen (ca. 40EUR), &lt;br /&gt;
* [[Schmitt-Trigger]]&lt;br /&gt;
* [[Aktiver RC-Bandpass|Aktiver RC-Bandpass auf Operationsverstärker-Basis]]&lt;br /&gt;
* [http://sound.westhost.com/appnotes/an001.htm Präzisionsgleichrichter], engl.&lt;br /&gt;
* [http://www.elektronikwissen.net/opamp/9-opamp-wissen.html OpAmp Praxis], Praktikertipps + schwingende Operationsverstärker in den Griff bekommen&lt;br /&gt;
&lt;br /&gt;
[[Category:Grundlagen]]&lt;br /&gt;
[[Category:Bauteile]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Mikrocontroller&amp;diff=78853</id>
		<title>Mikrocontroller</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Mikrocontroller&amp;diff=78853"/>
		<updated>2013-10-08T13:07:25Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Änderung 78852 von 79.251.90.193 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein Mikrocontroller ist ein [[Prozessor]] plus Zusatzmodule. Der Unterschied zu Mikroprozessoren besteht darin, dass bei einem Mikrocontroller Speicher, [[Digital]]- und [[Analog]]- Ein- und Ausgänge, Timer, UART etc. meist auf einem einzigen Chip integriert sind, so dass eine Mikrocontroller-Anwendung oft mit ein paar wenigen Bauteilen auskommt.&lt;br /&gt;
&lt;br /&gt;
Mikrocontroller werden häufig zuerst an der [[Bit]]-Zahl des internen Datenbusses unterschieden: 4/8/16 oder 32 Bit. Diese Bit-Zahl kann man als die Länge der Daten interpretieren, die der Controller in einem Befehl verarbeiten kann. Die größte in 8 [[Digitaltechnik|Bit]] (= 1 [[Digitaltechnik|Byte]]) darstellbare Zahl ist die 255, somit kann ein 8 Bit-Mikrocontroller z.&amp;amp;nbsp;B. in einem Additionsbefehl immer nur Zahlen bis 255 verarbeiten. Zur Bearbeitung von größeren Zahlen werden dann mehrere Befehle hintereinander benötigt, was natürlich länger dauert.&lt;br /&gt;
&lt;br /&gt;
== Taktung ==&lt;br /&gt;
&lt;br /&gt;
Ein Mikrocontroller braucht, wie jeder andere Prozessor auch, zum Betrieb einen [[Taktfrequenz | Takt]]. Dieser kann extern zugeführt werden (Taktgenerator, Quarzoszillator), mittels externem Quarz erzeugt, oder von einem internen Taktgeber (RC-Oszillator) abgeleitet werden. Die maximale Frequenz mit der ein Controller betrieben werden kann reicht von 1 MHz bei alten Controllern bis über 100 MHz bei großen 32-&amp;quot;Bittern&amp;quot;. Diese Taktfrequenz sagt jedoch noch nicht viel über die tatsächliche Geschwindigkeit eines Prozessors aus. So wird z.&amp;amp;nbsp;B. bei den meisten alten [[8051]]-Controllern die Frequenz intern durch 12 geteilt (Maschinentakt), ein mit 24 MHz getakteter 8051 arbeitet also eigentlich nur mit 2 MHz. Benötigt dieser dann für einen Befehl durchschnittlich 2 Taktzyklen, so bleiben &amp;quot;nur&amp;quot; noch 1 Millionen Befehle pro Sekunde übrig. Ein [[AVR]], der ungeteilt mit 8MHz arbeitet und für viele der Befehle nur einen Zyklus braucht, schafft dagegen fast 8 Millionen Befehle pro Sekunde. Neue 8051 Typen verarbeiten ebenfalls einen Befehl in einem Taktzyklus und sind erhältlich bis 100 MHz.&lt;br /&gt;
&lt;br /&gt;
== Wozu ist ein Mikrocontroller gut? ==&lt;br /&gt;
&lt;br /&gt;
Hier ein paar Beispiele, für welche Aufgaben Mikrocontroller verwendet werden können:&lt;br /&gt;
&lt;br /&gt;
* Ladegeräte&lt;br /&gt;
* [[Motoransteuerung mit PWM|Motorsteuerungen]] (z.&amp;amp;nbsp;B. [[Schrittmotoren|Schrittmotor]]-Controller ([[Schrittmotor-Controller (Stepper)|Stepper)]])&lt;br /&gt;
* Roboter&lt;br /&gt;
* [[USB IO Expander|Meßwerterfassung]] (z.&amp;amp;nbsp;B. [[Drehzahlmesser]] im Auto)&lt;br /&gt;
* [[Steuerung und Regelung eines Raums mit dem AVR-Webserver|Temperaturregelung]]&lt;br /&gt;
* [[MP3]]- und DVD-Player&lt;br /&gt;
* Schaltuhren&lt;br /&gt;
* [[ISP|Programmieradapter]]&lt;br /&gt;
&lt;br /&gt;
== Welchen Mikrocontroller soll ich verwenden? ==&lt;br /&gt;
&lt;br /&gt;
Ein Mikrocontroller für Hobbyanwender sollte idealerweise folgende Voraussetzungen erfüllen:&lt;br /&gt;
&lt;br /&gt;
* gute Beschaffbarkeit&lt;br /&gt;
* niedriger Preis spielt bei den kleinen Stückzahlen keine so große Rolle&lt;br /&gt;
* handliche Bauform: ein Controller mit 20 Pins ist leichter handzuhaben als einer mit 128&lt;br /&gt;
* [[Speicher#Flash-ROM | Flash-ROM]]: der Controller sollte mindestens 1000 mal neu programmiert werden können&lt;br /&gt;
* In-System-Programmierbarkeit ([[ISP]]): man benötigt kein teures Programmiergerät und muss den Controller zur Programmierung nicht aus der Schaltung entfernen&lt;br /&gt;
* kostenlose Software verfügbar: [[Assembler]] bekommt man praktisch immer kostenlos vom Hersteller des Controllers, [[C]]-[[Compiler]] seltener&lt;br /&gt;
&lt;br /&gt;
Eine ausführliche Beschreibung der Entscheidungskriterien gibt es auf der Seite [[Entscheidung Mikrocontroller]].&lt;br /&gt;
&lt;br /&gt;
== Verbreitete Mikrocontrollerfamilien ==&lt;br /&gt;
* 1 Bit&lt;br /&gt;
** [[MC14500B]] (Motorola, historisch!)&lt;br /&gt;
&lt;br /&gt;
* 4 Bit&lt;br /&gt;
** [[MARC4]] (Atmel)&lt;br /&gt;
** [[SM62]] (Epson)&lt;br /&gt;
&lt;br /&gt;
* 8 Bit&lt;br /&gt;
** [http://www.analog.com/MicroConverter MicroConverter®] (Analog Devices)&lt;br /&gt;
** [[AVR]] (Atmel)&lt;br /&gt;
** [[PIC]] (Microchip)&lt;br /&gt;
** [[8048]] (Intel)&lt;br /&gt;
** [[8051]] (Intel, versch. Hersteller)&lt;br /&gt;
** [[H8]] (Renesas, früher Hitachi)&lt;br /&gt;
** [[68HC05]] (Freescale, früher Motorola)&lt;br /&gt;
** [[68HC08]] (Freescale, früher Motorola)&lt;br /&gt;
** [[68HC11]] (Freescale, früher Motorola)&lt;br /&gt;
** [[ST62]] (SGS-Thomson)&lt;br /&gt;
** [[78K0S]] (NEC)&lt;br /&gt;
** [[Z8]] (Zilog)&lt;br /&gt;
** [[PSoC]] (Cypress)&lt;br /&gt;
&lt;br /&gt;
* 16 Bit&lt;br /&gt;
** [[C16x]] (Infineon)&lt;br /&gt;
** [[M16C]] (Renesas, früher Mitsubishi)&lt;br /&gt;
** [[R8C]] (Renesas)&lt;br /&gt;
** [[H8]] (Renesas, früher Hitachi)&lt;br /&gt;
** [[68HC12]] (Freescale, früher Motorola)&lt;br /&gt;
** [[68HC16]] (Freescale, früher Motorola)&lt;br /&gt;
** [[dsPIC]] (Microchip)&lt;br /&gt;
** [[PIC24]] (Microchip)&lt;br /&gt;
** [[MSP430]] (Texas Instruments)&lt;br /&gt;
** [[ZNEO]] (Zilog)&lt;br /&gt;
&lt;br /&gt;
* 32 Bit&lt;br /&gt;
** [[ADuC7xxx]] (Analog Devices) [[ARM]]-Core&lt;br /&gt;
** [[AT91SAM]] (Atmel) [[ARM]]-Core&lt;br /&gt;
** [[AVR32]] (Atmel)&lt;br /&gt;
** [[LPC2000|LPC2xxx]] (NXP ehemals Philips) [[ARM]]-Core&lt;br /&gt;
** [[PIC32]] (Microchip)&lt;br /&gt;
** [[TriCore]] (Infineon)&lt;br /&gt;
** [[SuperH]] (Renesas, früher Hitachi)&lt;br /&gt;
** [[STM32]] (STMicroelectronics) [[ARM]] Cortex M-Core&lt;br /&gt;
** [[FR50]] (Fujitsu)&lt;br /&gt;
** [[EFM32]] (Energy Micro) [[ARM]] Cortex M-Core&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://chaosradio.ccc.de/cre067.html Podcast CRE67 Mikrocontroller] bei Chaosradio Express&lt;br /&gt;
* [http://www.edn.com/article/CA6615617.html 36th annual EDN microprocessor/microcontroller directory] bei edn.com (2009)&lt;br /&gt;
&lt;br /&gt;
[[Category:Grundlagen]]&lt;br /&gt;
[[Category:Mikrocontroller| ]]&lt;br /&gt;
[[Category:Bauteile]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Spannungsteiler&amp;diff=78635</id>
		<title>Spannungsteiler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Spannungsteiler&amp;diff=78635"/>
		<updated>2013-09-25T16:13:11Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Änderung 78631 von 46.140.69.210 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Oft ist es notwendig die Ausgangsspannung eines Sensors an den Eingangsspannungsbereich eines [[AD-Wandler]]s anzupassen. Ist die Ausgangsspannung größer als die Eingangsspannung ist dies sehr einfach und kostengünstig mit einem Spannungsteiler machbar.&lt;br /&gt;
&lt;br /&gt;
== Einfacher Spannungsteiler ==&lt;br /&gt;
&lt;br /&gt;
Die wohl einfachste Anwendung des ohmschen Gesetzes ist der einfache Spannungsteiler. Dabei wird eine große Eingangsspannung linear in eine kleine Ausgangsspannung umgesetzt. Der mathematische Zusammenhang ist dabei&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U_{AUS}=U_{EIN}\cdot \frac{R_2}{R_1+R_2}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[bild:st_einfach.png]]&lt;br /&gt;
&lt;br /&gt;
Die Berechnung von R1 und R2 ist einfach. Es wird ein Wert für R1 oder R2 gewählt und die Formel nach R1 bzw. R2 umgestellt. Das soll hier beispielhaft geschehen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_2=R_1\cdot \frac{U_{AUS}}{U_{EIN}-U_{AUS}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Programm, das den Spannungsteiler mit der niedrigsten Toleranz automatisch berechnet, findet sich unter: http://www.elexs.de/kap2_4.htm Online geht dies hier: http://www.gjlay.de/helferlein/spannungsteiler.html&lt;br /&gt;
&lt;br /&gt;
== Spannungsteiler mit Biaskorrektur ==&lt;br /&gt;
Manche Spannungsteiler ziehen Strom, bzw liefern einen &#039;&#039;konstanten&#039;&#039; Strom. Eine Möglichkeit besteht darin, die Widerstände niederohmig zu Dimensionieren. Nachteil dieser Lösung ist die überproportional zunehmende Verlustleistung.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man den Spannungsteiler mit Offset folgendermaßen berechnen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U_{AUS}=\frac{R_2 \cdot U_{EIN}}{R_1+R_2}-\frac{I_B}{\frac{1}{R_1}+\frac{1}{R_2}}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Löst man die Gleichung nach R2 auf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_{2}=\frac{U_{AUS} \cdot R_1}{U_{EIN}-I_B \cdot R_1-U_{AUS}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Spannungsteiler mit Offset, passiv ==&lt;br /&gt;
&lt;br /&gt;
Um einiges komplizierter wird die Situation, wenn die Eingangsspannung mit einem Offset behaftet ist, oder wenn die Ausgangsspannung einen Offset haben soll. Hier kommt ein Spannungsteiler mit 3 Widerständen zum Einsatz. Die Berechnung der Widerstände R1, R2 und R3 ist um einiges komplexer. Hier muss bereits mit dem Überlagerungsprinzip (Superpositionsprinzip) gerechnet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U_{AUS} = U_{EIN} \cdot \frac{\frac{R1 \cdot R2}{R1+R2}}{\frac{R1 \cdot R2}{R1+R2} + R3}&lt;br /&gt;
 + Vcc \cdot \frac{\frac{R3 \cdot R2}{R3+R2}}{\frac{R3 \cdot R2}{R3+R2} + R1} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U_{EIN} = \left(U_{AUS} - Vcc \cdot \frac{\frac{R3 \cdot R2}{R3+R2}}{\frac{R3 \cdot R2}{R3+R2} + R1}\right) \cdot \frac{\frac{R1 \cdot R2}{R1+R2} + R3}{\frac{R1 \cdot R2}{R1+R2}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die praktische Anwendung zu vereinfachen finden sich alle Formeln in einer schönen [[media:Spannungsteiler_mit_Offset.zip | Exceltabelle]] wieder. Die Nutzung ist praktisch selbsterklärend. Im oberen Teil trägt man alle gegebenen bzw. gewünschten Parameter ein, im Mittelteil erscheinen Zwischenergebnisse, die jedoch für die direkte Anwendung nicht von Bedeutung sind. Wichtig sind nur die Ergebnisse ganz unten mit den Werten für R1 und R3 sowie dem Eingangs- und Ausgangswiderstand des Spannungsteilers sowie die obere Grenzfrequenz.&lt;br /&gt;
&lt;br /&gt;
[[bild:st_offet.png]]&lt;br /&gt;
&lt;br /&gt;
Für die Anwendung ist es wichtig zu wissen, daß die Quelle, welche den Spannungsteiler speist, einen geringen Innenwiderstand haben muß, damit es nicht zu unakzeptablen Meßfehlern kommt. Pi mal Daumen gilt, daß der Innenwiderstand nur 1% vom Eingangswiderstand des Spannungsteilers betragen darf, damit der Meßfehler nicht größer als 1% wird (R2 möglichst groß wählen). Ist das nicht möglich dann muß ein Operationsverstärker als Impedanzwandler eingesetzt werden (Spannungsfolger). Als weiterer systematischer Messfehler kommt noch die Ungenauigkeit der Widerstände R1..R3 hinzu. Bei 1% Metallschichtwiderständen beträgt dieser etwa 2%. Wenn es genauer sein soll muß man 0,1% Widerstände verwenden oder eine Kalibrierung durchführen. Eine dritte systematische Fehlerquelle ist die Spannung Vcc, welche normalerweise die Versorgungsspannung bzw. Referenzspannung des ADC ist. Der Einfluss von Vcc wird durch den Spannungsteiler etwas abgeschwächt und liegt bei ca. 0,1 bis 1. D.H. 10mV Fehler von Vcc erscheinen als 1..10mV Fehler auf dem Messsignal. Selbstverständlich muss Vcc auch ausreichend stabil und belastbar sein. Der einfache Aufbau wird jedoch mit einigen Nachteilen erkauft.&lt;br /&gt;
&lt;br /&gt;
* relativ geringer Eingangswiderstand&lt;br /&gt;
* hoher Ausgangswiderstand&lt;br /&gt;
* bei hochohmigen Widerständen sinkt die obere Grenzfrequenz, nur langsame Signale sind dann noch meßbar&lt;br /&gt;
Als grobe Abschätzung gilt&amp;lt;BR&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;R_{aus}=\frac{1}{\frac{1}{R_1} + \frac{1}{R_2} + \frac{1}{R_3}}&amp;lt;/math&amp;gt;&amp;lt;BR&amp;gt;&amp;lt;BR&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;f_{3dB}=\frac{1}{2 \pi \cdot R_{aus} \cdot C_{ein}}&amp;lt;/math&amp;gt;&lt;br /&gt;
* Einschränkungen bezüglich der Werte für Uein_min, Uein_max, Uaus_min, Uaus_max&lt;br /&gt;
** Uaus_min &amp;gt;= Uein_min&lt;br /&gt;
** Uaus_max &amp;gt;= Uein_max&lt;br /&gt;
** Vcc &amp;gt;= Uein_max&lt;br /&gt;
&lt;br /&gt;
(&amp;lt;math&amp;gt;f_{3dB}&amp;lt;/math&amp;gt; ist die Frequenz, bei der das Ausgangssignal um 3dB (~30%) abgefallen ist.)&lt;br /&gt;
&lt;br /&gt;
Nachfolgend ist eine praktische Schaltung des Spannungsteilers mit dem [[AVR]] Mikrocontroller gezeigt. Prinzipiell gilt sie natürlich für jeden Mikrocontroller bzw. ADC. Wichtig ist hier der Kondensator C1. Dieser ist notwendig, um kurzzeitig Strom zu liefern, wenn der ADC das Eingangssignal abtastet. Leider sinkt damit auch die obere Grenzfrequenz (siehe Formel für f_3dB). Hier muß ein Kompromiss aus Grenzfrequenz, Ausgangswiderstand und Meßfehler gefunden werden. Der Kondensator C2 ist kein diskret platziertes Bauteil, er symbolisiert vielmehr die unvermeidliche Eingangskapazität des ADC. &lt;br /&gt;
&lt;br /&gt;
[[bild:st_avr.png]]&lt;br /&gt;
&lt;br /&gt;
== Spannungsteiler mit Offset, aktiv ==&lt;br /&gt;
&lt;br /&gt;
Mit etwas mehr Aufwand kann man die genannten Probleme beseitigen. Ein Operationsverstärker bietet hier viele Vorteile.&lt;br /&gt;
&lt;br /&gt;
* sehr hoher Eingangswiderstand&lt;br /&gt;
* niedriger Ausgangswiderstand, wichtig zum speisen von ADC Eingängen&lt;br /&gt;
* keine Einschränkungen bezüglich der Werte für Uein_min, Uein_max, Uaus_min, Uaus_max&lt;br /&gt;
&lt;br /&gt;
[[bild:st_opv.png]]&lt;br /&gt;
&lt;br /&gt;
Der mathematische Zusammenhang ist dabei gegeben durch&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;U_\text{AUS}=U_\text{Offset}+ \left(U_\text{EIN}-U_\text{Offset}\right) \cdot \left(1+ \frac{R_1}{R_2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Bauteile]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Spannungsteiler, der Geheimtip ==&lt;br /&gt;
&lt;br /&gt;
Oft verwendet man Spannungsteiler, um ein Signal für eine anschließende ADC-Wandlung anzupassen.&lt;br /&gt;
Verwendet man 15K und 1K bzw. 150K und 10K stellt sich ein Teilungsverhältnis von 1:16 ein...welches sehr einfach durch 4fach-shift im Controller kompensiert werden kann. Das geht wesentlich schneller, als die entsprechende Multiplikation.&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR&amp;diff=78634</id>
		<title>AVR</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR&amp;diff=78634"/>
		<updated>2013-09-25T16:12:04Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Änderung 78632 von 213.23.68.98 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die AVR-[[Mikrocontroller]] von [http://www.atmel.com Atmel] sind wegen ihrer übersichtlichen internen Struktur, der [[ISP | In-System-Programmierbarkeit]], und der Vielzahl von kostenlosen Programmen zur Softwareentwicklung (Assembler, Compiler) beliebt. Diese Eigenschaften und der Umstand, dass viele Typen in einfach handhabbaren DIL-Gehäusen (DIP) verfügbar sind, machen den AVR zum idealen Mikrocontroller für Anfänger. &lt;br /&gt;
&lt;br /&gt;
Über die Bedeutung des Namens &amp;quot;AVR&amp;quot; gibt es verschiedene Ansichten; manche meinen er sei eine Abkürzung für &#039;&#039;&#039;A&#039;&#039;&#039;dvanced &#039;&#039;&#039;V&#039;&#039;&#039;irtual [[RISC|&#039;&#039;&#039;R&#039;&#039;&#039;ISC]], andere vermuten dass der Name aus den Anfangsbuchstaben der Namen der Entwickler (&#039;&#039;&#039;A&#039;&#039;&#039;lf Egin Bogen und &#039;&#039;&#039;V&#039;&#039;&#039;egard Wollan &#039;&#039;&#039;R&#039;&#039;&#039;ISC) zusammengesetzt wurde. Laut Atmel ist der Name bedeutungslos.&lt;br /&gt;
&lt;br /&gt;
==Architektur==&lt;br /&gt;
&lt;br /&gt;
Die Architektur ist eine 8-Bit-[[Harvard-Architektur]], das heißt, es gibt getrennte Busse zum Programmspeicher ([[Speicher#Flash-ROM |Flash-ROM]], dieser ist 16 bit breit) und Schreib-Lese-Speicher ([[Speicher#RAM |RAM]]). Programmcode kann ausschließlich aus dem Programmspeicher ausgeführt werden. Weiterhin sind die Adressräume getrennt (d.h. die erste Speicherstelle im Flash-Speicher hat die gleiche Adresse (0) wie die erste Speicherstelle im RAM). Bei der Programmierung in Assembler und einigen C-Compilern bedeutet dies, dass sich Konstanten aus dem ROM nicht mit dem gleichen Code laden lassen wie Daten aus dem RAM. Abgesehen davon ist der Aufbau des Controllers recht übersichtlich und birgt wenige Fallstricke.&lt;br /&gt;
&lt;br /&gt;
* 32 größtenteils gleichwertige Register&lt;br /&gt;
* davon 1-3 16-bit-Zeigerregister (paarweise)&lt;br /&gt;
* ca. 110 Befehle, die meist 1-2 Taktzyklen dauern&lt;br /&gt;
* Taktfrequenz bis 32MHz&lt;br /&gt;
* Betriebsspannung von 1,8 - 5,5 V&lt;br /&gt;
* Speicher&lt;br /&gt;
**1-256 kB [[Speicher#Flash-ROM | Flash-ROM]]&lt;br /&gt;
**0-4 kB [[Speicher#EEPROM | EEPROM]]&lt;br /&gt;
**0-16 kB [[speicher#RAM | RAM]]&lt;br /&gt;
* Peripherie: [[AD-Wandler]] 10 bit, 8- und 16-Bit-[[Timer]] mit [[PWM]], [[SPI]], [[I²C]] (TWI), [[UART]], Analog-[[Komparator]], [[Watchdog]]&lt;br /&gt;
* [[Speicher#Mit_XMEM-Interface | 64kB Externer SRAM]] (ATmega128, ATmega64,  ATmega8515/162); (Bei den XMEGAs bis zu 16 MB (128 Mbit) externer SDRAM)&lt;br /&gt;
* [[JTAG]] bei den größeren ATmegas&lt;br /&gt;
* [[debugWire]] bei den neueren AVRs&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
* [http://www.mikroe.com/mikropascal/avr]: Mikropascal, mit einer eingeschränkten kostenlosen Testversion&lt;br /&gt;
* [[AVR-Studio]]: Kostenlose Enwicklungsumgebung mit Simulator&lt;br /&gt;
* [http://sourceforge.net/projects/kontrollerlab/ KontrollerLab]: Kostenlose Entwicklungsumgebung für KDE&lt;br /&gt;
* [http://corpsman.de/index.php?doc=projekte/klab Klab]: Kostenlose Entwicklungsumgebung für KDE/GTK2/Win32 (als FPC/Lazarus Quellcode verfügbar, Nachbau von KontrollerLab)&lt;br /&gt;
* [http://www.microsoft.com/germany/Express/product/visualcplusplusexpress.aspx Microsoft Visual C++ Express]: Kostenlose Enwicklungsumgebung (Win),über makefile&lt;br /&gt;
* [http://netbeans.org Netbeans]: Plugin-basierte, kostenlose Entwicklungsumgebung (Windows, Mac, Linux, und Solaris). [http://mattzz.dyndns.org/wiki/bin/view/Projects/ArduinoAndNetbeans  Hier] findet sich ein Howto für das Setup von AVR (z.B. für Arduino)&lt;br /&gt;
* [[AVR Eclipse]]: Plugin-basierte kostenlose Entwicklungsumgebung (Win, Linux, Mac)&lt;br /&gt;
* [[Code::Blocks]]: Freie Entwicklungsumgebung (Win, Linux, Mac), die auch für AVR-Projekte Unterstützung anbietet&lt;br /&gt;
* [[AVR-GCC]]: Kostenloser C-Compiler&lt;br /&gt;
* [[LunaAVR]]: Kostenlose, objektbasierte Basic/Pascal-ähnliche Programmiersprache und Entwicklungsumgebung mit Compiler/Assembler und Disassembler (Win, Linux, Mac). http://avr.myluna.de&lt;br /&gt;
* [http://sourceforge.net/projects/avra/ AVRA]: freier AVR-Assembler&lt;br /&gt;
* [http://www.mcselec.com/bascom-avr.htm Bascom AVR] beliebter Basic-Compiler&lt;br /&gt;
* [http://www.e-lab.de AVRCo Pascal Compiler]&lt;br /&gt;
* [http://amforth.sourceforge.net/ amforth]:  interaktiver und erweiterbarer Kommandointerpreter für AVR unter GNU Lizenz (Open Source)&lt;br /&gt;
* [[SJC]]: Experimenteller Java-Compiler unter GPL mit AVR-Unterstützung&lt;br /&gt;
* [http://www.atnel.pl/mkAVRCalculator_build_57en.rar mkAvrCalculator]: User friendly fuse bits calculator and GUI for avrdude&lt;br /&gt;
&lt;br /&gt;
== Boards &amp;amp; Starterkits ==&lt;br /&gt;
&lt;br /&gt;
Siehe dazu auch die Artikel in der [[:Kategorie:AVR-Boards|Kategorie AVR-Boards]] und den Artikel zur [[AVR_In_System_Programmer|AVR Programmierung]].&lt;br /&gt;
&lt;br /&gt;
* [[STK200]]&lt;br /&gt;
* [[STK500]]&lt;br /&gt;
* [[STK600]]&lt;br /&gt;
* [[AVR Dragon]] &lt;br /&gt;
* [[AVR Butterfly]]&lt;br /&gt;
* [[AVR Raven]]&lt;br /&gt;
* AVR-ISP / AVR-ISP mkII&lt;br /&gt;
* [http://www.ehajo.de/Bausaetze/AVR-ISP-Stick AVR-ISP-Stick]&lt;br /&gt;
* [http://www.ehajo.de/Bausaetze/µISP-Stick µISP-Stick]&lt;br /&gt;
* [http://www.ehajo.de/Bausaetze/USP-Stick USP-Stick]&lt;br /&gt;
* AVR JTAG-ICE&lt;br /&gt;
* [http://www.robotikhardware.de RN-Control]&lt;br /&gt;
* [http://www.conrad.de C-Control PRO]&lt;br /&gt;
* [http://www.myavr.de myAVR Board]&lt;br /&gt;
* [http://www.rowalt.de AVR Lehrbuch und -bausatz]&lt;br /&gt;
* [http://www.pollin.de Pollin] - preiswerte Starterkits sowie Lösungen für RFID-125kHz und EtherNet&lt;br /&gt;
* [http://www.lochraster.org/rumpus Rumpus von lochraster.org] ist ein günstiges und gut dokumentiertes Starterkit mit Atmega 168&lt;br /&gt;
* [http://www.das-labor.org/wiki/Laborboard  Laborboard von das-labor.org] - Bauplan Lochrasterplatine mit Atmega32&lt;br /&gt;
* [http://nibo.nicai-systems.de Roboterbausatz NIBO 2] - autonomer Roboter mit einem ATmega128 und einem ATmega88 / [http://nibobee.nicai-systems.de Roboterbausatz NIBObee] - Roboter für Einsteiger mit ATmega16 und integriertem USB-Programmer&lt;br /&gt;
* [http://www.nerdkits.com Nerdkit - Starterkit inkl. Doku] - ideal für Anfänger&lt;br /&gt;
* [http://arduino.cc/ Arduino] - Ein modulares System mit verschiedenen Entwicklungsboards (insbesondere auch eins mit ATmega1280, dem mit den vielen dünnen Beinchen), das aufgrund der Nutzung einer JAVA-IDE und &amp;quot;Wiring&amp;quot; besonders einfach zu nutzen ist. Es gibt verschiedene Clones unter Namen wie Freeduino, Seeeduino etc., auch den Lilypad zum Einnähen in Kleidung und Verschaltung mittels leitender Fäden. Die neueren Versionen können über einen standardmäßig mit ausgelieferten Bootloader ohne sonstige Hardware direkt über USB bespielt werden.&lt;br /&gt;
* [http://www.aevum-mechatronik.de Modularis] - AVR Mikrocontroller-Boards (z.T. mit Zusatz-Speicher und USB) die über Flachbandkabel erweitert werden können. Es gibt bis jetzt Zubehör-Module mit Taster, Motor H-Brücke, XBee und Winkelsensor.&lt;br /&gt;
* [http://www.b-redemann.de AVR Mikrocontroller Lehrbuch (R. Walter, 3. Auflage 2009) und Bauteilesatz incl. Leiterplatte; www.b-redemann.de]&lt;br /&gt;
* [http://weigu.lu/b/mices2 mices2] - Entwicklungsboard zum [http://www.weigu.lu/a Gratis Assembler Kurs]. Integriertes Programmiergerät (USB, avrisp mk2 kompatibel). Spannungsvrsorgung über USB. Platine einseitig, leicht zu bestücken. Viele Schnittstellen (1-Wire, I2C, EIA232 ...), D/A-Wandler, Mikrofonschaltung., Audioverstärker ...&lt;br /&gt;
* [https://guloshop.de/shop/Mikrocontroller-Programmierung/::45.html gulostart] – [[Steckbrett|Steckplatinen]]-basiertes Lernpaket / Einsteiger-Set mit ausführlicher Anleitung. Verwendet ausschließlich [http://de.wikipedia.org/wiki/Open_source Open-Source-Software], kann fast alle DIP-ATtiny/ATmega programmieren. Für USB-Schnittstelle.&lt;br /&gt;
* [http://corpsman.de/index.php?doc=avrnetio/atmegaboard Atmegaboard] Eagle Daten für ein Testboard zur Nutzung 2er Atmegas gleichzeitig. Weitere Adapterplatinen sowie Source Code sind ebenfalls verfügbar.&lt;br /&gt;
* [http://matrixstorm.com/avr/tinyusbboard/ tinyUSBboard] - Ein sehr sehr preiswertes, Arduino und BASCOM kompatibles Board mit onboard USB Interface und [http://matrixstorm.com/avr/tinyusbboard/#firmwaresotherbootloader auswechelbarem Bootloader].&lt;br /&gt;
* [http://www.ehajo.de/Bausaetze/aTeVaL aTeVaL-Board] - Nachfolger des bekannten Pollin Evalboards. ISP-mkii-Klon &amp;amp; Seriell/USB-Wandler via USB. Testhardware auf der Platine: Taster, LED, Summer, Potis, ...&lt;br /&gt;
* [https://www.olimex.com/Products/AVR/ verschiedene Boards von Olimex]&lt;br /&gt;
&lt;br /&gt;
== Projekte ==&lt;br /&gt;
Siehe dazu auch die Artikel in der [[:Kategorie:AVR-Projekte|Kategorie AVR-Projekte]].&lt;br /&gt;
&lt;br /&gt;
* [[PWM_foxlight]] - LED Lampe mit PWM&lt;br /&gt;
* [[Digitaler Funktionsgenerator]]&lt;br /&gt;
* [[Midi Rekorder mit MMC/SD-Karte]]&lt;br /&gt;
* [[Schrittmotor-Controller (Stepper)]]&lt;br /&gt;
* [[Pulsuhrempfänger mit AVR Butterfly]]&lt;br /&gt;
* [[DCF77-Funkwecker mit AVR]]&lt;br /&gt;
* [[Fahrradcomputer]]&lt;br /&gt;
* [[Einfacher und billiger Webserver mit AtMega32]]&lt;br /&gt;
* [[AVR RFM12]]&lt;br /&gt;
* [[RF SOAP]] USB / AtMega88 / RFM12, optional LiPo Akku mit Lader&lt;br /&gt;
* [http://www.andreadrian.de/schach/#Selbstbau_Schachcomputer_SHAH Selbstbau Schachcomputer SHAH mit ATMega88V]&lt;br /&gt;
* [[Giess-o-mat]] - vollautomatische Blumengießanlage&lt;br /&gt;
* [http://www.zipfelmaus.com/led-flitzer/ POV-LED mit ATmega8, USB und Beschleunigungssensor]&lt;br /&gt;
* [http://g-heinrichs.de/attiny/ ATtiny-Mikrokontroller für Schulbedarf]&lt;br /&gt;
* [http://www.weigu.lu/b Kleine USB-Bibliothek (C, BASCOM und Assembler) für ATMEL-USB-AVRs]&lt;br /&gt;
* [http://volkszaehler.org/ Ein tolles Smartmeter mit kompletter Middleware!]&lt;br /&gt;
&lt;br /&gt;
== Tutorials ==&lt;br /&gt;
&lt;br /&gt;
* [[AVR-Tutorial]]&lt;br /&gt;
* [[AVR-GCC-Tutorial]]&lt;br /&gt;
* http://www.avr-asm-tutorial.net&lt;br /&gt;
* [http://www.weigu.lu/a weigu.lu/a]: Gratis Assembler Kurs (pdf). Mehrere hundert Seiten mit vielen neuen Grafiken. Besonders zum Selbststudium geeignet. Es existiert auch ein [http://www.weigu.lu/b/mices2 Entwicklungsboard] zum Kurs.&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
 	&lt;br /&gt;
* C.Kühnel Programmieren der AVR RISC Mikrocontroller mit BASCOM-AVR ISBN 3898119378 (2000) ISBN 3907857046 (2.Aufl.2004) ISBN 978-3-907857-14-4 (3. überarbeitete und erweiterte Auflage 2010)&lt;br /&gt;
* R.Mittermayr AVR-RISC: Embedded Software selbst entwickeln Franzis 2008 ISBN 3772341071&lt;br /&gt;
* F.Schäffer AVR: Hardware und C-Programmierung in der Praxis Elektor 2008 ISBN 3895762008 [http://www.blafusel.de/books/avr.html Webseite des Autors, Codebeispiele und Leseprobe]&lt;br /&gt;
* G.Schmitt Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie...Oldenbourg 4.Aufl.2008  ISBN 3486587900 ISBN 3486580167 (2006) ISBN 3486577174 (2005) [http://www.oldenbourg-wissenschaftsverlag.de/olb/de/1.c.1495224.de Verlags-Webseite mit Buchauszügen]&lt;br /&gt;
* M.Schwabl-Schmidt Programmiertechniken für AVR-Mikrocontroller Elektor 2008 ISBN 3895761761 [http://www.schwabl-schmidt.de/index.php/buecher Webseite des Autors]&lt;br /&gt;
* M.Schwabl-Schmidt Systemprogrammierung für AVR-Mikrocontroller Elektor 2009 ISBN 3895762180&lt;br /&gt;
* W.Trampert Messen,Steuern und Regeln mit AVR Mikrocontrollern Franzis 2004 ISBN 3772342981&lt;br /&gt;
* W.Trampert AVR-RISC Mikrocontroller Franzis ISBN 3772354769 (2003) ISBN 3772354742 (2002) ISBN 3772354750 (2000)&lt;br /&gt;
* P.Urbanek Embedded Systems: Ein umfassendes Grundlagenwerk ... (2007) ISBN 3981123018 [http://www.ulb.tu-darmstadt.de/tocs/188146911.pdf Inhaltsverzeichnis]&lt;br /&gt;
* S./F.Volpe AVR-Mikrocontroller-Praxis Elektor 2001 ISBN 3895760633&lt;br /&gt;
* R.Walter AVR-Mikrocontroller-Lehrbuch 3. Auflage Denkholz 2009 ISBN 9783981189445 [http://www.rowalt.de/mc/avr/avrbuch/index.htm Webseite des Autors, Buch-Download in geringer Auflösung]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tipps &amp;amp; Hinweise ==&lt;br /&gt;
&lt;br /&gt;
* [[AVR Typen]] - Die verschiedenen Typen (AT90S, ATmega, ATtiny)&lt;br /&gt;
* [[AVR Checkliste]] - Liste mit Hinweisen zur Lösung üblicher Probleme&lt;br /&gt;
* [http://blog.coldtobi.de/1_coldtobis_blog/archive/87_little_endianess_guide_for_atmel_avr.html (Little) Endianess Guide for Atmel AVR] Übersicht über die Endianess der AVR und AVR32&lt;br /&gt;
* [[AVR Fuses|Fuse-Bits]] - Das Setzen der Fuse-Bits ist ein berüchtigter Fallstrick bei den AVRs; vor dem Rumspielen damit unbedingt diese Hinweise lesen!&lt;br /&gt;
* [[AVR In System Programmer]] - Programmierhardware&lt;br /&gt;
* [[Pony-Prog Tutorial]] - Hinweise zur Programmiersoftware PonyProg&lt;br /&gt;
* [[AVRDUDE]] - Programmiersoftware für die Kommandozeile&lt;br /&gt;
* [[AVR-GCC-Codeoptimierung]] - Wie man mehr aus dem Controller herausholen kann, ohne ein Assembler-Guru sein zu muessen.&lt;br /&gt;
* [[AVR Softwarepool]] - Verschiedene Softwaremodule und Codeschnippsel aus der Codesammlung&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://revision3.com/systm/avr101 AVR101] - systm Videocast von Revision3 Internet Television (engl.).&lt;br /&gt;
&lt;br /&gt;
Weitere Verweise (Links) auf externe Informationen und Projekte finden sich in der &#039;&#039;&#039;[[Linksammlung#AVR|Linksammlung]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Anmerkungen ===&lt;br /&gt;
&lt;br /&gt;
Es gibt nur wenige Typen mit D/A-Wandler (z.B. AT90PWM2); hierfür benutze man PWM oder externe Bausteine.&lt;br /&gt;
&lt;br /&gt;
Die Takterzeugung ist bei AVRs recht einfach gehalten. So gibt es bei den meisten Modellen keine internen PLLs um „krumme“ Prozessor- oder Peripherietaktfrequenzen zu erzeugen, noch ist der Peripherie-Takt vom Prozessortakt abkoppelbar. Einige AVR verfügen über eine PLL, um damit z.B. einen Timer mit Frequenzen über der Systemfrequenz zu takten oder höhere Systemfrequenz aus niederfrequenteren Taktquellen zu erzeugen (vgl. u.a. Datenblatt ATtiny861). Die Baudrate serieller Schnittstellen lässt sich nicht gebrochen einstellen, so dass gegebenenfalls ein zur Baudrate passender Quarz oder Resonator zu verwenden ist.&lt;br /&gt;
&lt;br /&gt;
Für die serielle Programmierung des Flash-Speichers sind 4 Datenleitungen erforderlich und die Taktversorgung muss sicher gestellt sein. Es ist darauf zu achten, dass bei Einstellung der Taktquelle (Fuses) auch die vorhandene Taktquelle ausgewählt wird. Für die Hochvolt-Programmierung (so genannt wegen 12 V am RESET-Anschluss) werden je nach Chip sehr viele Leitungen benötigt. Einige Modelle verfügen über eine Debugwire-Schnittstelle, für die im Betrieb zwei Leitungen ausreichen.&lt;br /&gt;
&lt;br /&gt;
Nicht zu verwechseln ist die 8-bit-AVR-Serie mit AVR32. Letztere ist eine 32-bit-Architektur mit recht viel Ähnlichkeit zu Controllern auf Basis eines ARM-Cores. Controller der ATxmega-Serie verfügen über mehr Funktionen als die &amp;quot;traditionellen&amp;quot; AVR (z.B. DMA- und Eventsystem, 12Bit A-D-Wandler). ATxmega sind jedoch für 3,3V-Betrieb ausgelegt und ausschließlich in SMD-Bauform erhältlich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Mikrocontroller]]&lt;br /&gt;
[[Category:AVR| ]]&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=PHILIPS_VP5500_VoIP_Telefon&amp;diff=77737</id>
		<title>PHILIPS VP5500 VoIP Telefon</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=PHILIPS_VP5500_VoIP_Telefon&amp;diff=77737"/>
		<updated>2013-07-27T06:32:08Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Wiederhergestellt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Verwandte Artikel =&lt;br /&gt;
* Konfiguration: http://www.mikrocontroller.net/topic/170483#new&lt;br /&gt;
* Kernel/GUI Entwicklung: http://www.mikrocontroller.net/topic/172616#new&lt;br /&gt;
* http://das-labor.org/wiki/VP5500&lt;br /&gt;
* (Hack) http://spritesmods.com/?art=vpx500&lt;br /&gt;
* http://vp6500.bd8.nl/&lt;br /&gt;
&lt;br /&gt;
= Allgemeines =&lt;br /&gt;
&lt;br /&gt;
Bei den diesem Text zugrundeliegenden Geräten handelt es sich um videofähige VoIP-Phones des Herstellers Philips, die vom früheren holländischen Anbieter KPN vertrieben wurden und nach dessen Ausscheiden aus dem Markt nun günstig erhältlich sind.&lt;br /&gt;
Ihr geringer Preis, die SoC-Architektur und das darauf laufende OS macht sie dabei für all jene interessant, die ihre eigenen Ideen und Projekte auf der Basis eines solchen Gerätes verwirklichen wollen, und gibt den oft fabrikneuen Exemplaren eine Art zweite Chance.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
=== VP5500 ===&lt;br /&gt;
* Kamera-Auflösung 640x480 Pixel&lt;br /&gt;
* 30 Bilder pro Sekunde&lt;br /&gt;
* Kamera um 240° drehbar&lt;br /&gt;
* 5,6 cm (2,2&amp;quot;) TFT-Display, 176x220 Pixel, 65000 Farben&lt;br /&gt;
* Audio-/Video-Ausgang - 4fach 2,5mm Klinke-Cinch&lt;br /&gt;
* integrierter Li-Ion Akku, 3,7 V-/1100 mAh&lt;br /&gt;
* englische und niederländische Menüsprache&lt;br /&gt;
* Software Qtopia Version 2.1.0&lt;br /&gt;
* Maße (LxBxH): 134x49x24 mm.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Philips_VP5500.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== VP6500 ===&lt;br /&gt;
&lt;br /&gt;
* Kamera-Auflösung 640x480 Pixel&lt;br /&gt;
* 30 Bilder pro Sekunde&lt;br /&gt;
* Kamera um 240° drehbar&lt;br /&gt;
* 5,6 cm (2,2&amp;quot;) TFT-Display, 176x220 Pixel, 65000 Farben&lt;br /&gt;
* Audio-/Video-Ausgang - 4fach 3,5mm Klinke-Cinch&lt;br /&gt;
* 2x Philips Multilife AA/R6NM 1800mAh NiMH-Akkus, je 1,2V, Ladeempfehlung: 15h mit 180mAh&lt;br /&gt;
* englische, deutsche und niederländische Menüsprache&lt;br /&gt;
* Software Qtopia Version 2.1.0&lt;br /&gt;
* Maße (LxBxH): 134x49x24 mm.&lt;br /&gt;
* Gewicht Mobilteil: 170 g (inkl. 2 NiMH-Akkus AA)&lt;br /&gt;
[[Bild:VP6500_kl.jpg]]&lt;br /&gt;
&lt;br /&gt;
= Das VPx500 &#039;rooten&#039; =&lt;br /&gt;
&lt;br /&gt;
Um vollen Zugang zum System auf dem Gerät zu erhalten gibt es mehrere Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
== per telnet ==&lt;br /&gt;
Sobald das Telefon im Netzwerk angemeldet ist (egal ob DHCP oder statisch) kann über irgendein Terminal vom Netzwerk aus via telnet und der Telefon-IP auf das Gerät zugegriffen werden.&lt;br /&gt;
User: root / PW: toor&lt;br /&gt;
&lt;br /&gt;
== per serieller Schnittstelle ==&lt;br /&gt;
Dazu muß der [[#UART]] angeschlossen werden. Während des Bootvorgangs drückt man immer wieder ziellos irgendwelche Tasten bis man am Prompt des [http://www.lartmaker.nl/lartware/blob/ blob-Bootloaders] ist.&lt;br /&gt;
Dann kann man &lt;br /&gt;
 boot root=/dev/mtdblock2 init=/bin/sh&lt;br /&gt;
eingeben, um an eine minimale Shell zu kommen.&lt;br /&gt;
&lt;br /&gt;
In dieser setzt man dann mit &lt;br /&gt;
 passwd&lt;br /&gt;
das Passwort für &#039;&#039;root&#039;&#039;. Danach kann man sich als &#039;&#039;root&#039;&#039; mit dem gesetzten Passwort einloggen.&lt;br /&gt;
&lt;br /&gt;
== per DNS-Hack ==&lt;br /&gt;
Um den Rootzugriff zu aktivieren, wird dem Telefon ein Softwareupdate vorgegaukelt. Es versucht, auf den Updateserver von KPN zuzugreifen (den es nicht mehr gibt). Glücklicherweise geschieht dies nicht über eine feste IP, sondern über einen Hostnamen, so dass man an dieser Stelle sich durch einen eigenen DNS den Domainname auf einen eigenen Server umleiten kann. Daher ist im eigenen Netzwerk eine Umleitung des DNS erforderlich (oder ein DHCP-Server, der die Adresse des DNS bekanntgibt. Stichworte &#039;Static DNS&#039;, ..).&lt;br /&gt;
Das Gerät holt sich dann ein Updatepaket, das den Telnet-Zugang aktiviert.&lt;br /&gt;
&lt;br /&gt;
Dann lässt sich per Terminal (Linux. Windows: ....) die Kommandozeile des Geräts aufrufen:&lt;br /&gt;
&lt;br /&gt;
 telnet 123.456.789.012&lt;br /&gt;
&lt;br /&gt;
Passwort ist &amp;quot;toor&amp;quot;.&lt;br /&gt;
Das Ändern des root-Passwortes erfolgt mit dem Befehl passwd.&lt;br /&gt;
&lt;br /&gt;
Unter Applications&amp;gt;Registration sind Netzwerk- und VoIP-Einstellungen zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Anleitung für Fritz-Box-Benutzer ===&lt;br /&gt;
Die Fritzboxen bieten bisher leider keine Möglichkeit, den verwendeten DNS&lt;br /&gt;
direkt im Webinterface zu ändern, über Umwege geht es aber doch:&lt;br /&gt;
* Über das Webinterface der Fritzbox die Einstellungen sichern&lt;br /&gt;
* Exportdatei im Texteditor öffnen (am besten nicht Notepad, da der die Unix-Zeilenumbrüche nicht versteht - zur Not geht auch Wordpad)&lt;br /&gt;
* nach overwrite_dns1 suchen (gibt es zwei mal) und da den DNS 84.38.68.30 (von blooza http://www.mikrocontroller.net/topic/170483#1651124 bereitgestellt) oder 188.40.123.50 (von sprites http://spritesmods.com/?art=vpx500 bereitgestellt) eintragen&lt;br /&gt;
* am Anfang der Exportdatei VOR &amp;quot;**** CFGFILE:ar7.cfg&amp;quot; eine Zeile &#039;NoChecks = yes&#039; einfügen, damit die Fritzbox die nun nicht mehr passende Checksumme ignoriert.&lt;br /&gt;
* Einstellungen zurück in die Fritzbox übertragen.&lt;br /&gt;
&lt;br /&gt;
Wenn die Telefone entsperrt sind, den DNS wieder entfernen (Es ist&lt;br /&gt;
vielleicht eine ganz gute Idee, wenn man da zwei unabhängige DNS-Server&lt;br /&gt;
einträgt, so umgeht man auch gleich providerseitige DNS-Sperren)&lt;br /&gt;
&lt;br /&gt;
==== Alternative ====&lt;br /&gt;
Wer sich den nicht ganz ungefährlichen Weg mit den anpassungen an der Fritzbox erspahren will, wechselt seine Fritzbox in den Expertenmodus. Danach kann man unter System - Netzwerk bei dem Punkt &amp;quot;IP adresse der Fritzbox ändern&amp;quot; bei vielen modellen den internen DHCP abschalten. Dann unter windows z.B. tftpd32 (http://tftpd32.jounin.net/) starten, in dessen DHCP-Server die Fritzbox als Gateway und den entsprechenden &amp;quot;modding-dns&amp;quot; eintragen und das Telefon neustarten.&lt;br /&gt;
&lt;br /&gt;
War das Telefon schonmal angemeldet, versucht es die selbe IP vom neuen DHCP zu erzwingen, was tftpd32 nicht wirklich mag. Daher im tftpd32 die lease-ip bei 2 beginnen lassen und eine range von 250 eintragen, damit die vom Telefon verlangte IP auch im Adresspool des dhcp servers vorhanden ist.&lt;br /&gt;
&lt;br /&gt;
=== Anleitung fli4l ===&lt;br /&gt;
Mit dem [http://www.fli4l.de fli4l] ist das ganze ganz einfach.&lt;br /&gt;
&lt;br /&gt;
In der Datei config/dns_dhcp.txt den DNS  Redirect für die zwei DNS-Name Konfigurieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;file&amp;gt;&lt;br /&gt;
    DNS_REDIRECT_N=&#039;2&#039;                # number of redirected domains&lt;br /&gt;
    DNS_REDIRECT_1=&#039;ntp.xs4all.nl&#039;    # 1st redirected domain&lt;br /&gt;
    DNS_REDIRECT_1_IP=&#039;188.40.123.50&#039; # IP of redirected domain&lt;br /&gt;
&lt;br /&gt;
    DNS_REDIRECT_2=&#039;vpcm-001.cust.kpn.net&#039; &lt;br /&gt;
    DNS_REDIRECT_2_IP=&#039;188.40.123.50&#039; &lt;br /&gt;
&amp;lt;/file&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Hardware =&lt;br /&gt;
&lt;br /&gt;
== verwendete Komponenten ==&lt;br /&gt;
&lt;br /&gt;
* MCU: [http://www.mikrocontroller.net/attachment/72258/datasheet.pdf Freescale MC9328MX21] (ARM9) @ 266MHz ([http://en.wikipedia.org/wiki/I.MX21 Wikipedia_englisch]) &lt;br /&gt;
** gehört zur ARM9E-Familie: ARMv5TEJ -&amp;quot;IntructionSet&amp;quot; (ARM926EJ-S)&lt;br /&gt;
** [http://www.freescale.com/files/32bit/doc/ref_manual/MC9328MX21RM.pdf MC9328MX21 Applications Processor Reference Manual]&lt;br /&gt;
* PC-to-TV-Konverter-Chip: [http://www.mikrocontroller.net/attachment/73579/Data_Sheets.zip FS455LF]&lt;br /&gt;
* WLAN: Marvell 88w8385, als Modul von [http://www.mikrocontroller.net/attachment/72802/WM-G-MR-01-v27__01192006.pdf WM-G-MR-01] (VP5500) / Philips [http://www.mikrocontroller.net/attachment/73812/BGW211_Preliminary_Datasheet_v1.1.pdf BGW211], on-board (VP6500)&lt;br /&gt;
* SDRAM: 2 x [http://www.mikrocontroller.net/attachment/72461/K4S56163LF.pdf K4S56163LF] - 4M x 16Bit x 4 Banks im VP5500&lt;br /&gt;
* SDRAM: 1 x [http://www.mikrocontroller.net/attachment/73520/Samsung_64MB_K4M51323PC_1_8V.pdf K4M51323PC_1_8V] - 4M x 32Bit x 4 Banks im VP6500&lt;br /&gt;
* Flash: 2 x ws128j0pbfw00 [http://www.mikrocontroller.net/attachment/72462/S29WS064J.pdf S29WS128J/064J] 128/64 Megabit (8/4 M x 16-Bit) CMOS 1.8 Volt-only Simultaneous Read/Write, Burst Mode Flash Memory im VP5500&lt;br /&gt;
* Flash: 1 x [http://www.mikrocontroller.net/attachment/73521/S29GL512N.pdf S29GL512N] - 512 Megabit, 3.0 Volt-only Page Mode Flash Memory im VP6500&lt;br /&gt;
* Kamera: dc-4626.a5 by chicony&lt;br /&gt;
* Display: Samsung LTS220QC (HD66772 Controller)&lt;br /&gt;
&lt;br /&gt;
== Messungen ==&lt;br /&gt;
&lt;br /&gt;
=== Stromaufnahme ===&lt;br /&gt;
&lt;br /&gt;
==== VP5500 ====&lt;br /&gt;
FIXME &lt;br /&gt;
&lt;br /&gt;
==== VP6500 ====&lt;br /&gt;
 &lt;br /&gt;
Konfiguration: VP6500 mit aktivierter serieller Konsole an Labornetzteil, Spannung 3.67V (Bei weniger bootet es anscheinend aufgrund von Stromspitzen nicht richtig und vermeldet auf der seriellen Konsole ein &#039;battery low&#039; und schaltet sich danach selbst ab. Diese Spannung sollte noch so gerade &#039;safe&#039; sein, geht man davon aus, daß da ein Step-Up im Innern am werkeln ist und noch ein geringer Abfall über die Schottky-Diode einzurechnen ist). &lt;br /&gt;
&lt;br /&gt;
===== Telefon =====&lt;br /&gt;
* Booten: bis zu 420mA&lt;br /&gt;
* Einbuchen: ca. 400mA&lt;br /&gt;
* mit abgeschaltetem Display, aber eingebucht und laufend (idle): ca. 80mA&lt;br /&gt;
* mit angeschaltetem Display, eingebucht und idle: ca. 190mA&lt;br /&gt;
* mit 100% Prozessor-Last (von serieller Konsole ausgeführt: &amp;quot;while true; do true; done&amp;quot;): ca. 60mA mehr als idle (Scheint aber auch größere Sprünge für andere CPU-Last zu geben)&lt;br /&gt;
* im &#039;Deep Sleep&#039; (wird ein paar Minuten nach Einschalten erreicht): &amp;lt;10mA (!), mit kurzen Wachphasen mit erheblichem Stromverbrauch (&amp;gt;100mA). Beachte: Die serielle Konsole ist in diesem Modus auch nicht mehr aktiv, das Telefon ist aber nicht abgestürzt (Tastendruck aktiviert die Konsole wieder).&lt;br /&gt;
* Telefonieren ca 500mA&lt;br /&gt;
* Telefonieren mit Webcam ca 550mA&lt;br /&gt;
&lt;br /&gt;
===== Ladegerät =====&lt;br /&gt;
* Phone nicht in der Ladeschale: &amp;lt; 0.2W&lt;br /&gt;
* Phone wird geladen: ca 4W&lt;br /&gt;
&lt;br /&gt;
== System-Takte ==&lt;br /&gt;
 # cat /proc/systclk&lt;br /&gt;
 System clocks state:&lt;br /&gt;
     Ref clock :      32768Hz  (int, premult by 512)&lt;br /&gt;
     MPLL clock:  263999905Hz  (computed: 264000000Hz)&lt;br /&gt;
     SPLL clock:  163840000Hz  (computed: 163840000Hz)&lt;br /&gt;
     CPU clock :  263999905Hz  (PERSC   = 0)&lt;br /&gt;
     Bus clock :  132000000Hz  (BCLKDIV = 1, computed: 131999952Hz)&lt;br /&gt;
     CSI clock :  unknown      (cannot read register CSICR1)&lt;br /&gt;
     USB clock :   20480000Hz  (USB_DIV = 7)&lt;br /&gt;
     Wait State:  CS0U[WSC] = 10, CS0U[WSC] = 48&lt;br /&gt;
     loops_per_jiffy = 665058&lt;br /&gt;
&lt;br /&gt;
== Innenleben ==&lt;br /&gt;
&lt;br /&gt;
=== Zerlegen des VP5500 ===&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:01_offen_von_Hinten.JPG|1. Geöffnetes Akkufach&lt;br /&gt;
Datei:02_Blende_entfernt.JPG|2. hintere Schwarze Blende entfernt&lt;br /&gt;
Datei:03_Rückseite_entfernt.JPG|3. Schalenrückteil entfernt&lt;br /&gt;
Datei:04_aufhebeln_Vorderteil.JPG|4. Druck nach außen&lt;br /&gt;
Datei:05_vorderteil_entfernt.JPG|5. entferntes Vorderteil&lt;br /&gt;
Datei:06_Elektronik_entfernt.JPG|6. entfernte Elektronik&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# das Akkufach muss geöffnet und die Schrauben entfernt werden&lt;br /&gt;
# hinter der rückseitigen schwarzen Blende befinden sich zwei Schrauben, die entfernt werden müssen&lt;br /&gt;
#* Hierzu am besten mit einem schmalen kleinen Schraubendreher von der Stirnseite aus zwischen die Plastikteile fahren und vorsichtig aufhebeln und den Schraubendreher dabei weiter unter die Blende bewegen.&lt;br /&gt;
# Nun kann einfach das rückseitige Schalenteil abgeschaubt werden&lt;br /&gt;
# das Entfernen des Frontschalenteils ist etwas tricky:&lt;br /&gt;
#* von oben und unten lässt sich ganz gut ein Spalt zur Seite aufweiten&lt;br /&gt;
#* etwas unter der Mitte hängt es aber auf beiden Seiten. Dort befinden sich kleine Plastikbügel, die recht leicht zerbrechen.&lt;br /&gt;
#* Mit einem sehr schmalen Schraubendreher in eine der Lücken fahren (anfangen auf der Seite ohne Tasten) und den Schraubendreher nach innen drücken, so das der Druck in der Seite nach außen wirkt.&lt;br /&gt;
#* Mit etwas Geschick bekommt man das so ohne Bruch ab, es ist aber auch nicht kritisch, wenn der Bügel ein wenig anbricht)&lt;br /&gt;
# Die Platine zu entfernen ist nicht ganz so schwierig.&lt;br /&gt;
#* Zuerst die Seite auf der keine Knöpfe sind:&lt;br /&gt;
#* vorsichtig diese Seite leicht anheben. Am unteren Ende ist auf die Kontakte zu achten &lt;br /&gt;
#* dann versuchen die Platine seitlich nach oben aus dem Gehäuse zu ziehen&lt;br /&gt;
#* dabei auf das Lautsprecherkabel und den Kamerakonnektor achten&lt;br /&gt;
# Zusammenbau genauso, nur umgedreht ;)&lt;br /&gt;
#* nicht die Lautsprecher- und Kamera-Stecker vergessen&lt;br /&gt;
&lt;br /&gt;
=== Bilder vom VP5500 Innenleben ===&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;240&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei:Oberseite.jpg | Ansicht der Oberseite&lt;br /&gt;
Datei:Oberseite_beschriftet.jpg | Oberseite mit Beschriftung der Bauteile&lt;br /&gt;
Datei:Drumherum.jpg | Übersicht über die Komponenten&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;240&amp;quot; &amp;gt;&lt;br /&gt;
Datei:Kontakte_Oberseite.jpg | UART-Schnittstelle Oberseite&lt;br /&gt;
Datei:Kontakte_Unterseite.jpg | JTAG-Schnittstelle Unterseite&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testpins am VP5500 ===&lt;br /&gt;
Original Liste von [http://www.mikrocontroller.net/topic/170483#1646514 Tino] [[Media:Philips vp5500 Liste Testpins.pdf|herrunterladen]].&lt;br /&gt;
&lt;br /&gt;
[[Bild:Philips vp5500 testpins 1.jpg|thumb| Testpins auf der Rückseite]]&lt;br /&gt;
[[Bild:Philips vp5500 testpins 2.jpg|thumb| Frontseite: Die ICs wurden zum Messen ausgelötet.]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Testpin Nr.  !!    verbunden zu !! Funktion&lt;br /&gt;
|-&lt;br /&gt;
|   1       ||                  LED || unbekannt&lt;br /&gt;
|-&lt;br /&gt;
|    2     ||            Kamera Pin 8 an CN1 || unbekannt&lt;br /&gt;
|-&lt;br /&gt;
|    3     ||                  Pin 4 an IC1 || unbekannt&lt;br /&gt;
|-&lt;br /&gt;
|    4    ||                z.B. IC5 Pin V 18 || VDDA&lt;br /&gt;
|-&lt;br /&gt;
|    5    ||                       GND || GND&lt;br /&gt;
|-&lt;br /&gt;
|    6     ||                       NC || NC&lt;br /&gt;
|-&lt;br /&gt;
|    7     ||                Pin E 16 an IC5 || SAP_CLK&lt;br /&gt;
|-&lt;br /&gt;
|    8     ||                 Pin 1 an CN 3 || Lautsprecher&lt;br /&gt;
|-&lt;br /&gt;
|    9     ||                 Pin 2 an CN 3 || Lautsprecher&lt;br /&gt;
|-&lt;br /&gt;
|    10    ||                  Pin an CN 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
|    11     ||                 Pin an CN 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
|    12    ||                  Pin an CN 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
|    13    ||                Pin L 16 an IC5 || UART2_TXD&lt;br /&gt;
|-&lt;br /&gt;
|    14     ||               Pin C 12 an IC5 || USBH1_RXDM&lt;br /&gt;
|-&lt;br /&gt;
|    15   ||                 Pin H 12 an IC5 || USBH1_TXDP&lt;br /&gt;
|-&lt;br /&gt;
|    16     ||               Pin B 19 an IC5 || CSPI2_SS2&lt;br /&gt;
|-&lt;br /&gt;
|    17   ||                 Pin B16 an IC5 || SSI2_FS&lt;br /&gt;
|-&lt;br /&gt;
|    18     ||               Pin F 18 an IC5 || KP_ROW0&lt;br /&gt;
|-&lt;br /&gt;
|    19    ||                Pin K 18 an IC5 || KP_COL4&lt;br /&gt;
|-&lt;br /&gt;
|    20    ||                Pin L 19 an IC5 || UART3_TXD&lt;br /&gt;
|-&lt;br /&gt;
|    21     ||               Pin T 14 an IC5 || RESET_IN&lt;br /&gt;
|-&lt;br /&gt;
|    22    ||    geht an + des Kondensators neben IC6 || unbekannt&lt;br /&gt;
|-&lt;br /&gt;
|    23   ||                Pin D 13 an IC 9 || CLKOUT&lt;br /&gt;
|-&lt;br /&gt;
|    24      ||             Pin E 13 an IC 9 || CLKIN_P&lt;br /&gt;
|-&lt;br /&gt;
|    25    ||                Pin A 9 an IC 9 || DAC_D&lt;br /&gt;
|-&lt;br /&gt;
|    26    ||                Pin A 8 an IC 9 || DAC_A&lt;br /&gt;
|-&lt;br /&gt;
|    27    ||                Pin A 7 an IC 9 || DAC_B&lt;br /&gt;
|-&lt;br /&gt;
|    28     ||               Pin A 6 an IC 9 || DAC_C&lt;br /&gt;
|-&lt;br /&gt;
|    29      ||             Pin L 13 an IC 5 || UART1_TXD&lt;br /&gt;
|-&lt;br /&gt;
|    30     ||              Pin T 16 an IC 5 || BOOT1&lt;br /&gt;
|-&lt;br /&gt;
|    31  ||                 Pin K 10 an IC 5 || UART1_RXD&lt;br /&gt;
|-&lt;br /&gt;
|    32    ||               Pin U 17 an IC 5 || BOOT2&lt;br /&gt;
|-&lt;br /&gt;
|    33    ||                 Pin 9 an IC 23 || unbekannt&lt;br /&gt;
|-&lt;br /&gt;
|    34    ||                Pin D 19 an IC5 || CSPI2_SCLK&lt;br /&gt;
|-&lt;br /&gt;
|    35     ||              Pin C 14 an IC5 || TIN&lt;br /&gt;
|-&lt;br /&gt;
|    36    ||                Pin C 19 an IC5 || CSPI2_SS1&lt;br /&gt;
|-&lt;br /&gt;
|    37   ||                 Pin D 18 an IC5 || CSPI2_SS0&lt;br /&gt;
|-&lt;br /&gt;
|    38     ||               Pin E 19 an IC5 || CSPI2_MOSI&lt;br /&gt;
|-&lt;br /&gt;
|    39     ||               Pin H 19 an IC5 || PWMO&lt;br /&gt;
|-&lt;br /&gt;
|    40   ||            Pin J 9 an IC 7 und IC 8 || VDD&lt;br /&gt;
|-&lt;br /&gt;
|    41   ||                 Pin J 19 an IC 5 || KP_COL2&lt;br /&gt;
|-&lt;br /&gt;
|    42   ||                Pin K 16 an IC 5 || KP_COL3&lt;br /&gt;
|-&lt;br /&gt;
|    43   ||                 Pin J 11 an IC 5 || KP_ROW2&lt;br /&gt;
|-&lt;br /&gt;
|44      ||     Pin J 17 an IC 5 || KP_COL1&lt;br /&gt;
|-&lt;br /&gt;
|45  ||         Pin G 19 an IC 5 || KP_ROW4&lt;br /&gt;
|-&lt;br /&gt;
|46  ||         Pin G 17 an IC 5 || KP_ROW3&lt;br /&gt;
|-&lt;br /&gt;
|47  ||    Pin D 5 an IC 10 und IC 11 || ACC&lt;br /&gt;
|-&lt;br /&gt;
|48 ||          Pin G 16 an IC 5 || KP_ROW1&lt;br /&gt;
|-&lt;br /&gt;
|49   ||        Pin J 18 an IC 5 || KP_COL0&lt;br /&gt;
|-&lt;br /&gt;
|50  ||         Pin V 18 an IC 5 || VDDA&lt;br /&gt;
|-&lt;br /&gt;
|51 ||      Pin 2 an CN KB-Stecker || ?&lt;br /&gt;
|-&lt;br /&gt;
|52 ||           Pin 2 an IC 15 ||  ?&lt;br /&gt;
|-&lt;br /&gt;
|53  ||      Pin 4 am LCD Stecker || ?&lt;br /&gt;
|-&lt;br /&gt;
|54  ||         Pin E 17 an IC 5 || CSPI2_MISO&lt;br /&gt;
|-&lt;br /&gt;
|55 ||  Pin 1,2,3,10,13 am LCD Stecker || ?&lt;br /&gt;
|-&lt;br /&gt;
|56  ||          Pin 3 an IC 16 ||  ?&lt;br /&gt;
|-&lt;br /&gt;
|57  ||         Pin U 10 an IC 5 || PC_PWRON&lt;br /&gt;
|-&lt;br /&gt;
|58  ||            Pin 1 IC 18 || ?&lt;br /&gt;
|-&lt;br /&gt;
|59  ||       an Diode über IC 16 || ?&lt;br /&gt;
|-&lt;br /&gt;
|60  ||          Pin 3 an IC 25 || ?&lt;br /&gt;
|-&lt;br /&gt;
|61 ||         Ladekontakt positiv || Ladegerät +&lt;br /&gt;
|-&lt;br /&gt;
|62  ||               GND || GND&lt;br /&gt;
|-&lt;br /&gt;
|63  ||        Akku Mittelkontakt || Akkustand? Temperatur?&lt;br /&gt;
|-&lt;br /&gt;
|64 ||       Transistor unter IC 16 || ?&lt;br /&gt;
|-&lt;br /&gt;
|65  ||          Pin 2 an IC 22 || ?&lt;br /&gt;
|-&lt;br /&gt;
|66   ||      Pin 1,12,30 an IC 24 || VSS&lt;br /&gt;
|-&lt;br /&gt;
|67  ||    Kondensator + unter IC 20 || ?&lt;br /&gt;
|-&lt;br /&gt;
|68   ||         Pin 5 an IC 21 || ?&lt;br /&gt;
|-&lt;br /&gt;
|69  ||           Pin 2 an IC 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
|70    ||        Pin 25 an IC24 || MCLK&lt;br /&gt;
|-&lt;br /&gt;
|71  ||       Prozessor Pin W 14 || QVDD&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Testpins am VP6500 ===&lt;br /&gt;
Original Listen von [http://www.mikrocontroller.net/topic/170483#1658720 Tino] herunterladen. [[Media:V6500_Back.xls|Rückseite]], [[Media:V6500_Front.xls|Vorderseite]].&lt;br /&gt;
&lt;br /&gt;
[[Bild:V6500_Back.jpg|thumb| Testpins auf der Rückseite]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Testpin Nr.  !!    verbunden zu !! Funktion&lt;br /&gt;
|-		&lt;br /&gt;
| 1 || Pin 21 an BGW211EG || POR_N&lt;br /&gt;
|-		&lt;br /&gt;
| 2 || Pin A 14 an i.MX21 || TOUT&lt;br /&gt;
|-		&lt;br /&gt;
| 3 || Pin 46 an BGW211EG || JTAG_TDI&lt;br /&gt;
|-		&lt;br /&gt;
| 4 || Pin 44 an BGW211EG || JTAG_TCLK&lt;br /&gt;
|-		&lt;br /&gt;
| 5 || Pin 42 an BGW211EG || JTAG_TDO&lt;br /&gt;
|-		&lt;br /&gt;
| 6 || Pin 47 an BGW211EG || JTAG_TRST_N&lt;br /&gt;
|-		&lt;br /&gt;
| 7 || PIN 45 an BGW211EG || JTAG_TMS&lt;br /&gt;
|-		&lt;br /&gt;
| 8 || Pin 43 an BGW211EG || JTAG_RTCLK&lt;br /&gt;
|-		&lt;br /&gt;
| 9 || Pin C 14 an i.MX21 || TIN&lt;br /&gt;
|-		&lt;br /&gt;
| 10 || VDD || VDD&lt;br /&gt;
|-		&lt;br /&gt;
| 11 || Pin K 10 an i.MX21 || UART1_RXD&lt;br /&gt;
|-		&lt;br /&gt;
| 12 || Pin L 13 an i.MX21 || UART1_TXD&lt;br /&gt;
|-		&lt;br /&gt;
| 13 || GND || GND&lt;br /&gt;
|-		&lt;br /&gt;
| 14 || Pin U 17 an i.MX21 || BOOT2&lt;br /&gt;
|-		&lt;br /&gt;
| 15 || Pin V 16 an i.MX21 || BOOT0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Bild:V6500_Front.jpg|thumb| Frontseite: Die ICs wurden zum Messen ausgelötet.]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Testpin Nr.  !!    verbunden zu !! Funktion&lt;br /&gt;
|-		&lt;br /&gt;
| 1 || 	Pin 29 von BGW211EG &amp;amp; F 16 an i.MX21 || RESET_N / CSPI1_SS1&lt;br /&gt;
|-		&lt;br /&gt;
| 2 || 	Pin 28 an BGW211EG &amp;amp; J 12 an i.MX21 || SPI_DAT_MOSI / CSPI1_MOSI&lt;br /&gt;
|-		&lt;br /&gt;
| 3 || 	Pin 27 an BGW211EG &amp;amp; F 19 an i.MX21 || SPI_SS_N / CSPI1_SS0&lt;br /&gt;
|-		&lt;br /&gt;
| 4 || 	Pin 26 an BGW21EG &amp;amp; F 17 an i.MX21 || SPI_DAT_MISO / CSPI1_MISO&lt;br /&gt;
|-		&lt;br /&gt;
| 5 || 	Pin 25 an BGW211EG &amp;amp; H 10 an i.MX21 || SPI_CLK / CSPI1_SCLK&lt;br /&gt;
|-		&lt;br /&gt;
| 6 || 	Pin 24 an BGW211EG &amp;amp; H 11 an i.MX21 || SPI_EXT_INT / CSPI1_RDY&lt;br /&gt;
|-		&lt;br /&gt;
| 7 || 	Pin 41 an BGW211EG || UART_TX&lt;br /&gt;
|-		&lt;br /&gt;
| 8 || 	Pin 40 an BGW211EG || UART_RX&lt;br /&gt;
|-		&lt;br /&gt;
| 9 || 	Transistor unter Testpunkt || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 10 || 	GND || GND&lt;br /&gt;
|-		&lt;br /&gt;
| 11 || 	LED || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 12 || 	Pin 8 am Kamerastecker || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 13 || 	Pin 18 am Kamerastecker || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 14 || 	Pin E 13 &amp;amp; H12 an FS455 || CLKIN / PREF&lt;br /&gt;
|-		&lt;br /&gt;
| 15 || 	Pin D 13 an FS455 || CLKOUT&lt;br /&gt;
|-		&lt;br /&gt;
| 16 || 	Pin A 11 an FS455 || XTAL_OUT&lt;br /&gt;
|-		&lt;br /&gt;
| 17 || 	VDD von FS455 || VDD&lt;br /&gt;
|-		&lt;br /&gt;
| 18 || 	Pin 15 &amp;amp; 16 am Displayconnector || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 19 || 	geht an 2 Dioden links daneben || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 20 || 	Pin M 19 an i.MX21 || UART1_CTS&lt;br /&gt;
|-		&lt;br /&gt;
| 21 || 	Pin M 18 an i.MX21 || UART1_RTS &amp;amp; GND ??&lt;br /&gt;
|-		&lt;br /&gt;
| 22 || 	VDDan i,MX21 || VDD&lt;br /&gt;
|-		&lt;br /&gt;
| 23 || 	Pin G 10 an i.MX21 || USB_BYP&lt;br /&gt;
|-		&lt;br /&gt;
| 24 || 	Pin A 19 an i.MX21 || SSI3_FS&lt;br /&gt;
|-		&lt;br /&gt;
| 25 || 	Pin D 17 an i.MX21 || SSI2_CLK&lt;br /&gt;
|-		&lt;br /&gt;
| 26 || 	VDD an i.MX21 || VDD&lt;br /&gt;
|-		&lt;br /&gt;
| 27 || 	Pin T 17 an i.MX21 || SD1_D3&lt;br /&gt;
|-		&lt;br /&gt;
| 28 || 	Pin A 15 an i.MX21 || SAP_TXDAT&lt;br /&gt;
|-		&lt;br /&gt;
| 29 || 	GND || GND&lt;br /&gt;
|-		&lt;br /&gt;
| 30 || 	Pin T 14 an i.MX21 || RESET_IN&lt;br /&gt;
|-		&lt;br /&gt;
| 31 || 	Pin R 19 an i.MX21 || TRST&lt;br /&gt;
|-		&lt;br /&gt;
| 32 || 	Pin P 19 an i.MX21 || TMS&lt;br /&gt;
|-		&lt;br /&gt;
| 33 || 	Pin N 17 an i.MX21 || TCK&lt;br /&gt;
|-		&lt;br /&gt;
| 34 || 	Pin K 11 an i.MX21 || TDO&lt;br /&gt;
|-		&lt;br /&gt;
| 35 || 	Pin P 18 an i.MX21 || TDI&lt;br /&gt;
|-		&lt;br /&gt;
| 36 || 	Pin 13 an TLV320 || OUTP2&lt;br /&gt;
|-		&lt;br /&gt;
| 37 || 	Pin 14 an TLV320 || OUTMV&lt;br /&gt;
|-		&lt;br /&gt;
| 38 || 	Pin 15 an BGW211EG || VDD&lt;br /&gt;
|-		&lt;br /&gt;
| 39 || 	Pin an Klinkenbuchse || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 40 || 	Pin an Klinkenbuchse || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 41 || 	? || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 42 || 	LED Tastatur || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 43 || 	LED Tastatur || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 44 || 	Pin 1,8 an 20XN2512 &amp;amp; Key ON || PowerON&lt;br /&gt;
|-		&lt;br /&gt;
| 45 || 	Pin 7 an BDR72K || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 46 || 	Pin 2 an BDR72K || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 47 || 	Pin 6 an MRRBGB3 || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 48 || 	LED Tastatur ||  ?&lt;br /&gt;
|-		&lt;br /&gt;
| 49 || 	Pin 10 an MRRBG3 || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 50 || 	LED Tastatur || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 51 || 	geht an Widerstand auf Rückseite ? || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 52 || 	Pin L 13 an i.MX21 || UART1_TXD&lt;br /&gt;
|-		&lt;br /&gt;
| 53 || 	geht an Diode und Kondensator auf der Rückseite || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 54 || 	Pin C 14 an i.MX21 || TIN&lt;br /&gt;
|-		&lt;br /&gt;
| 55 || 	geht an Widerstand auf der Rückseite || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 56 || 	Pin 7 an BDR72K || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 57 || 	Pin K 10 an i.MX21 || UART1_RDX&lt;br /&gt;
|-		&lt;br /&gt;
| 58 || 	Pin U 17 an i.MX21 || BOOT2&lt;br /&gt;
|-		&lt;br /&gt;
| 59 || 	Pin T 16 an i.MX21 || BOOT1&lt;br /&gt;
|-		&lt;br /&gt;
| 60 || 	geht an Widerstand auf der Rückseite || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 61 || 	Pin V 16 an i.MX21 || BOOT0&lt;br /&gt;
|-		&lt;br /&gt;
| 62 || 	LED Tastatur || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 63 || 	LED Tastatur || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 64 || 	Pin 25 an TLV320 || MLCK&lt;br /&gt;
|-		&lt;br /&gt;
| 65 || 	Pin4 an 69W2440D || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 66 || 	VDD von TLV320 || VDD&lt;br /&gt;
|-		&lt;br /&gt;
| 67 || 	geht an Widerstand auf der Rückseite ||  ?&lt;br /&gt;
|-		&lt;br /&gt;
| 68 || 	geht an Widerstand auf der Rückseite || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 69 || 	Pin 65 an MRRBG3 || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 70 || 	GND || GND&lt;br /&gt;
|-		&lt;br /&gt;
| 71 || 	LED Tastatur || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 72 || 	LED Tastatur || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 73 || 	Akku positiv || Plus Akku&lt;br /&gt;
|-		&lt;br /&gt;
| 74 || 	Ladekontakt positiv || Ladekontakt positiv&lt;br /&gt;
|-		&lt;br /&gt;
| 75 || 	Akku positiv || Plus Akku&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== UART ==&lt;br /&gt;
TIN muss auf low gezogen werden, um die Schnittstelle zu aktivieren.&lt;br /&gt;
Jedoch startet dann das Telefon nicht vollständig (Fix siehe [[#Betrieb mit aktivierter serieller Schnittstelle]], zum rooten langt es jedoch, siehe [[#per serieller Schnittstelle]])&lt;br /&gt;
&lt;br /&gt;
* Spannungs-Pegel: 3.3V&lt;br /&gt;
* Baudrate: 115200 bps&lt;br /&gt;
* Stopbits: 1&lt;br /&gt;
* Flussteuerung: keine&lt;br /&gt;
=== VP5500 ===&lt;br /&gt;
[[Bild:VP5500_seriell_highlight.svg|100px|UART-Pins VP5500(Frontseite der Platine)]]&lt;br /&gt;
&lt;br /&gt;
Die serielle Schnittstelle ist unten vom Akkufach aus zugänglich.&lt;br /&gt;
Obiges Bild kennzeichnet die für die serielle Kommunikation benötigten Pins.&lt;br /&gt;
&lt;br /&gt;
=== VP6500 ===&lt;br /&gt;
[[Bild:VP5600-Serialport-Preliminary.jpg|100px|UART-Pins VP6500]]&lt;br /&gt;
&lt;br /&gt;
Die serielle Schnittstelle ist unten vom Akkufach aus zugänglich.&lt;br /&gt;
Obiges Bild kennzeichnet die für die serielle Kommunikation benötigten Pins.&amp;lt;br&amp;gt;&lt;br /&gt;
VCC liefert anscheinend die ungeregelte Akkuspannung, Boot-Pins nicht verifiziert.&lt;br /&gt;
&lt;br /&gt;
== JTAG ==&lt;br /&gt;
[[Bild:jtag.jpg Belegung der JTAG-Pins (Rückseite der Platine)]]&lt;br /&gt;
&lt;br /&gt;
== Hardware Modifikationen ==&lt;br /&gt;
&lt;br /&gt;
Nachdem wir ja bereits wissen wie das [[#Zerlegen_des_Telefons]] geht, steht der Nachrüstung von Bauelementen und Schnittstellen generell nichts mehr im Wege.&lt;br /&gt;
&lt;br /&gt;
=== Buchse für UART ins VP5500 einbauen ===&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:10_Pins.JPG|1. unbearbeitete Pinreihe&lt;br /&gt;
Datei:11_Pins_bearbeitet.JPG|2. präperierte Pinreihe&lt;br /&gt;
Datei:09_Pads.JPG|3. präperierte Pads&lt;br /&gt;
Datei:12_Pins_ausrichten.JPG|4. Pinreiheausrichten&lt;br /&gt;
Datei:13_Pins_angelötet_1.JPG|5. angelötete Pinreihe&lt;br /&gt;
Datei:14_Pins_angelötet_2.JPG|6. angelötete Pinreihen&lt;br /&gt;
Datei:08_Mittelteil.JPG|7. Mittelteil mit ausgefeiltem Loch&lt;br /&gt;
Datei:15_Mittelteil_zusammengebaut.JPG|8. wieder zusammengesteckt&lt;br /&gt;
Datei:16_in_Aktion.JPG|9.verbundene serielle Schnittstelle&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zunächst muss das Telefon zerlegt werden ([[#Zerlegen des Telefons]])&lt;br /&gt;
Um das Gehäuse nicht zu beeinträchtigen, habe ich mich dazu entschieden, alles so zu lassen wie es ist und nur kleine Buchsen einzubauen. &lt;br /&gt;
&lt;br /&gt;
# Hierfür habe ich einreihige gedrehte IC-Sockel genutzt &lt;br /&gt;
# deren Beine abgezwickt, und etwas Lötzinn aufgetragen (mit der langen Reihe kann man die kurzen, schmalen Teile super handhaben)&lt;br /&gt;
# ebendso auf die Pads ein wenig eingezinnt&lt;br /&gt;
# ausrichten und festlöten&lt;br /&gt;
# eine Reihe&lt;br /&gt;
# die zweite Reihe&lt;br /&gt;
# bei der Gehäuseöffnung über den Pins habe ich mit einer feinen Schlüsselfeile den Rand wenig aufgeweitet. An der Gummimatte hab ich nix geändert.&lt;br /&gt;
# fertig&lt;br /&gt;
# und im Einsatz&lt;br /&gt;
&lt;br /&gt;
=== Anschluss für UART des VP6500 zugänglich machen ===&lt;br /&gt;
Vorteil beim VP6500: es muss dazu nicht zerlegt werden, da sich die Kupferpads unter den Akkus im Akkufach verstecken. Dies ermöglicht eine lötfreie Variante des seriellen Anschlusses. Die Pinbelegung ist unter [[#VP6500_2|UART]] beschrieben.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:01_Kuli-Molex.jpg|1. Benötigte Teile: Stück Plastik + Molex Stecker&lt;br /&gt;
Datei:02_gefeiltes_Plastik_18_mm.jpg|2. Länge der Aussparung im Batteriefach: 18 mm&lt;br /&gt;
Datei:03_gefeiltes_Plastik_4_mm.jpg|3. Breite der Aussparung im Batteriefach: 4 mm&lt;br /&gt;
Datei:04_gefeiltes_Plastik_passt.jpg|4. Solange feilen bis es passt&lt;br /&gt;
Datei:05_gefeiltes_Plastik_Kerben.jpg|5. Padabstand markiert&lt;br /&gt;
Datei:06_gekerbtes_Plastik_Molex.jpg|6. So bekommt man die Federn aus den Steckern&lt;br /&gt;
Datei:07_Federelement_roh.jpg|7. Frisch aus dem Stecker&lt;br /&gt;
Datei:08_Federelement_offen.jpg|8. Aufgebogen&lt;br /&gt;
Datei:10_Federelement_unter_Plastik.jpg|9. In Plastikführung&lt;br /&gt;
Datei:09_Federelement_umgebogen.jpg|10. Umgebogen&lt;br /&gt;
Datei:11_halbfertig_passt.jpg|11. Kerbung angepasst?&lt;br /&gt;
Datei:12_ganz_fertig1.jpg|12. Mit Heißkleber sichern&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
*1. Da wir 4 Pole anschließen wollen, benötigen wir 4 federnde Teile aus &amp;quot;Molex&amp;quot;-Steckern, wie man sie aus CPU-Lüftern kennt. (Entweder hat man einen 4-poligen für die modernen PWM geregeltn zur Hand den man ausschlachten kann, oder man nimmt zwei dreipolige alte auseinander.)&lt;br /&gt;
*2./3. Ferner braucht man ein Stück Plastik mit den Maßen 4 mm mal 18 mm, welches als Träger für die Federkontakte dienen soll. Die Höhe ist nicht so entscheidend. Man kann z.B. den Clip eines Kugelschreibes passend zuschneiden und feilen.&lt;br /&gt;
*4. Plastikträger so weit zufeilen, dass er in die Aussparung passt (Tip: Bindfaden darum knoten um ihn wieder entfernen zu können)&lt;br /&gt;
*5. Abstände zwischen den Kontakten die kontaktiert werden müssen (TIN, GND, RX, TX : siehe [[#UART|UART]]) markieren und in die Unterseite des Trägers Führungskerben für die Federn sägen. Ebenso braucht man kleine Aussparungen um die Metallzungen von der Platine in das Batteriefach zu führen. &lt;br /&gt;
*6./7. Aus den Molex-Steckern bekommt man die Federn sehr einfach raus, indem man mit einem kleinen flachen Schraubenzieher vorsichtig in die Aussparungen sticht und hinten am Kabel zieht.&lt;br /&gt;
*8. Die einzelnen Metallzungen nun noch auf 90° aufbiegen.&lt;br /&gt;
*9. In die Führungskerbe einschieben.&lt;br /&gt;
*10. Metallzunge umbiegen. (Zange)&lt;br /&gt;
*11. Sind alle Kerbungen und Aussparungen richtig abgemessen und gut zugefeilt, dann passt alles in die Lücke im Batteriefach, ohne dass sich die verschiedenen Metallteile berühren.&lt;br /&gt;
*12. Mit etwas Schrumpfschlauch und Heißkleiber kann man dem Verrutschen der Metallzungen vorbeugen und die Kurzschlußwahrscheinlichkeit senken. Ferner dient der Heißkleber als Kraftüberträger, damit die Batterien die leicht federnden Metallzungen fest auf die Kontakte auf der Platine drücken können.&lt;br /&gt;
*13. Batterien einsetzen. Ohne diese wird das ganze irgendwann doch wieder rausfallen und die Verbindung von Anfang an unzuverlässig sein.&lt;br /&gt;
&lt;br /&gt;
Problembehandlung:&lt;br /&gt;
* Kein Kontakt: (Man kann z.B. die Masse auf Durchgang prüfen.)&lt;br /&gt;
** Träger nicht tief genug in die Lücke gedrückt: Mit schmalem Schraubenzieher nachdrücken. Meistens auf der Seite notwendig wo die Metallzungen nach oben kommen.&lt;br /&gt;
** Träger wird nach aussen gedrückt (Metallzungen federn ja): Mehr Heißkleber um mehr Druck durch die Batterien zu bekommen.&lt;br /&gt;
** Träger tief drin, aber trotzdem keine oder unzuverlässige Verbindung: Die Metallzungen auf der Unterseite haben verschiedene &amp;quot;Dicken&amp;quot;, oder die Kerben sind unterschiedlich tief. Ein Tropfen Lötzinn auf die zu niedrigen Metallzungen erledigt dies. (Anmerkung: Der Autor musste überall ein wenig Lötzinn auftragen um die notwendige Dicke und sichere Verbindung zu erreichen.)&lt;br /&gt;
&lt;br /&gt;
= Nutzung für Voice over IP (VoIP, SIP) =&lt;br /&gt;
&lt;br /&gt;
== weiterführende Links ==&lt;br /&gt;
&lt;br /&gt;
*http://de.wikipedia.org/wiki/IP-Telefonie&lt;br /&gt;
*http://de.wikipedia.org/wiki/Session_Initiation_Protocol&lt;br /&gt;
*http://de.wikipedia.org/wiki/H.323&lt;br /&gt;
*http://de.wikipedia.org/wiki/Softphone&lt;br /&gt;
&lt;br /&gt;
Benutzer ist 103&lt;br /&gt;
&lt;br /&gt;
Mit [http://ekiga.org Ekiga] konnte so per 103@xxx.xxx.xxx.xxx bei ersten Tests eine Sprachverbindung zum Telefon aufgebaut werden.&lt;br /&gt;
&lt;br /&gt;
== SIP Einstellungen ==&lt;br /&gt;
&lt;br /&gt;
Die SIP Einstellungen können alternativ auch direkt in der Datei&lt;br /&gt;
 /user_data/data/hpr0userparam.cfg&lt;br /&gt;
vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
=== Einstellung für 1und1 ===&lt;br /&gt;
&lt;br /&gt;
* SIP1:&lt;br /&gt;
** Display Name: ...&lt;br /&gt;
** Username: 49#VORWAHLOHNE0#NUMMER#&lt;br /&gt;
** Telephone Number: 0#VORWAHLOHNE0#NUMMER#&lt;br /&gt;
* Auth:&lt;br /&gt;
** Auth Username: 49#VORWAHLOHNE0#NUMMER#&lt;br /&gt;
** Password: *********&lt;br /&gt;
* Server:&lt;br /&gt;
** sip.1und1.de:5060&lt;br /&gt;
* Proxy:&lt;br /&gt;
** sip.1und1.de:5060&lt;br /&gt;
* RTP:&lt;br /&gt;
** 30000 und 30019&lt;br /&gt;
* STUN:&lt;br /&gt;
** stun.1und1.de&lt;br /&gt;
* STUN Server Port:&lt;br /&gt;
** 3478&lt;br /&gt;
* SIP2:&lt;br /&gt;
** UDP: 5060&lt;br /&gt;
** TCP: 5060&lt;br /&gt;
&lt;br /&gt;
=== Einstellung für Vodafone NGN (Arcor NGN) ===&lt;br /&gt;
&lt;br /&gt;
* SIP1:&lt;br /&gt;
** Display Name: ...&lt;br /&gt;
** Username: VORWAHLUNDRUFNUMMER&lt;br /&gt;
** Telephone Number: (leer lassen)&lt;br /&gt;
* Auth:&lt;br /&gt;
** Auth Username: VORWAHLUNDRUFNUMMER&lt;br /&gt;
** Password: *********&lt;br /&gt;
* Server:&lt;br /&gt;
** arcor.de:5060&lt;br /&gt;
* Proxy:&lt;br /&gt;
** VORWAHL.sip.arcor.de:5060&lt;br /&gt;
* RTP:&lt;br /&gt;
** 10000 und 10001&lt;br /&gt;
* STUN:&lt;br /&gt;
** (X) use rport&lt;br /&gt;
* SIP2:&lt;br /&gt;
** UDP: 5060&lt;br /&gt;
** TCP: 5060&lt;br /&gt;
(getestet von Micha mit EasyBox 802; an EasyBox n-WLAN ausschalten)&lt;br /&gt;
&lt;br /&gt;
=== Einstellung für Sipgate ===&lt;br /&gt;
&lt;br /&gt;
*SIP1&lt;br /&gt;
**Display Name: Sipgate Username&lt;br /&gt;
**User Name: your SIPgate-ID&lt;br /&gt;
**Telephone Number:  Sipgate-Telefonnummer&lt;br /&gt;
*Auth&lt;br /&gt;
**Authentification UserName: your SIPgate-ID&lt;br /&gt;
**Password: Sipgate Passwort&lt;br /&gt;
*Server&lt;br /&gt;
**SIP register address:port: sipgate.de:5060&lt;br /&gt;
*Proxy&lt;br /&gt;
**SIP proxy1 address:port: sipgate.de:5060&lt;br /&gt;
*RTP Audio Channel&lt;br /&gt;
**RTP: 22800&lt;br /&gt;
**RTCP: 22801&lt;br /&gt;
*RTP Video Channel&lt;br /&gt;
**RTP: 22804&lt;br /&gt;
**RTCP: 22805&lt;br /&gt;
*STUN: [X] use rport&lt;br /&gt;
*SIP2&lt;br /&gt;
**SIP Port Listen&lt;br /&gt;
**for UDP: 5062&lt;br /&gt;
**for TCP: 5062&lt;br /&gt;
**for TCP TLS: 5053&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SIP Outbound muss leer sein.&lt;br /&gt;
&lt;br /&gt;
=== Alternative Einstellung für Sipgate ===&lt;br /&gt;
&lt;br /&gt;
Hinter meiner Freetzbox hat die obige Einstellung nix gebracht - incoming calls wurden nicht signalisiert. Folgendes tut dagegen:&lt;br /&gt;
&lt;br /&gt;
*SIP1&lt;br /&gt;
**Display Name: Sipgate Username&lt;br /&gt;
**User Name: your SIPgate-ID&lt;br /&gt;
**Telephone Number:  Sipgate-Telefonnummer&lt;br /&gt;
*Auth&lt;br /&gt;
**Authentification UserName: your SIPgate-ID&lt;br /&gt;
**Password: Sipgate Passwort&lt;br /&gt;
*Server&lt;br /&gt;
**SIP register address:port: sipgate.de:5060&lt;br /&gt;
*Proxy&lt;br /&gt;
** leer&lt;br /&gt;
*SIP2&lt;br /&gt;
**Symmetric Mode [X]&lt;br /&gt;
**SIP Port Listen&lt;br /&gt;
**for UDP: 5062&lt;br /&gt;
**for TCP: 5062&lt;br /&gt;
**for TCP TLS: 5053&lt;br /&gt;
*STUN: [x] use rport&lt;br /&gt;
&lt;br /&gt;
SIP Outbound muss leer sein.&lt;br /&gt;
&lt;br /&gt;
Ein Videotelefonat von Sipgate zu Sipgate zwischen zwei VP6500 wurde erfolgreich getestet. Gegebenenfalls muss die eigene Videoübertragung noch durch Drücken der Taste &#039;&#039;&#039;Video&#039;&#039;&#039; gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Bei mir hat es nur per UDP funktioniert, aber mit starken Delays (&amp;gt;1s)&lt;br /&gt;
&lt;br /&gt;
=== Einstellung für Ekiga.net ===&lt;br /&gt;
&lt;br /&gt;
*SIP1&lt;br /&gt;
**Display Name: Irgendwas&lt;br /&gt;
**User Name: username&lt;br /&gt;
**Telephone Number: leer&lt;br /&gt;
*Auth&lt;br /&gt;
**Authentication User Name: username&lt;br /&gt;
**Password: password&lt;br /&gt;
*Server&lt;br /&gt;
**SIP register: ekiga.net:5060&lt;br /&gt;
**Protocol: ( ) TCP (*) UDP&lt;br /&gt;
**Expire Timer: 3600&lt;br /&gt;
**Keep Alive: 0&lt;br /&gt;
*Proxy&lt;br /&gt;
**alle leer&lt;br /&gt;
*STUN&lt;br /&gt;
**( ) use rport&lt;br /&gt;
**STUN Server IP address: stun.ekiga.net&lt;br /&gt;
**STUN Server port: 3478&lt;br /&gt;
*SIP2&lt;br /&gt;
**(*) Symmetric Mode&lt;br /&gt;
**UDP: 5060&lt;br /&gt;
**TCP: 5060&lt;br /&gt;
**TCP TLS: 5061&lt;br /&gt;
*OBproxy&lt;br /&gt;
**alle leer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nach der (kostenlosen) Registrierung bei ekiga.net und der Anmeldung des Telefons kann man unter der 500 einen Audio und Video(!) Test machen.&amp;lt;br&amp;gt;&lt;br /&gt;
Weitere features: https://www.ekiga.net/index.php?page=services&amp;lt;br&amp;gt;&lt;br /&gt;
Ekiga teilt keine Festnetz Rufnummern zu, daher ist ein Anruf von/zu Festnetz Telefonen nicht möglich.&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;Bei Ekiga.net angemeldete Geräte können aber problemlos untereinander telefonieren, sogar mit Video. Da man vom Mainscreen des VP5500/6500 aus direkt nur numerische Kontakte (herkömmliche Telefonnumern) wählen kann, Ekiga.net Telefonnummern aber aus [Benutzername]@ekiga.net bestehen, legt man über das Menü des VP5500/6500 einfach &amp;lt;b&amp;gt;einen neuen Kontakt&amp;lt;/b&amp;gt; (Telefonbuch) an. Als Video-Rufnummer trägt man einfach [Benutzername]@ekiga.net ein, wobei [Benutzername] der Name des Ekiga-Accounts ist, den man erreichen will. Zwischen der Eingabe von Buchstaben, Zahlen und Sonderzeichen kann man dabei mit der &amp;lt;b&amp;gt;[#]&amp;lt;/b&amp;gt;-Taste des VP5500/6500 umschalten.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Sollte bei einem Telefonat über Ekiga Video einmal nicht funktionieren, hilft eventuell die manuelle Aktivierung der Videofunktion mittels der &amp;lt;b&amp;gt;Video-Taste&amp;lt;/b&amp;gt; auf der Tastatur des VP6500&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einstellung für Fritzbox 7170/7270 und andere mit SIP-Registrar ===&lt;br /&gt;
Die Anmeldung eines Telefons auf der Fritzbox starten (System/Ansicht/&amp;quot;Expertenansicht aktivieren&amp;quot;, dann Telefonie/Telefoniegeräte/&amp;quot;Neues Gerät einrichten&amp;quot;, &amp;quot;Telefon&amp;quot;, &amp;quot;Bitte auswählen&amp;quot;/&amp;quot;LAN/WLAN (IP-Telefon)&amp;quot;) und sich eine Nummer geben lassen,&amp;lt;br&amp;gt; dann in Registration auf dem VPx500 wechseln und die Einstellungen wie unten vornehmen.&amp;lt;br&amp;gt; Anschließend will das Telefon diese Einstellungen aktivieren, vorher noch auf der FB die Anmeldung starten.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Im Beispiel will die FB die Nummer 621 vergeben:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Reiter SIP1&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Display Name: egal &amp;lt;leer lassen&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
User Name: 621&amp;lt;br&amp;gt;&lt;br /&gt;
Telephone Number: 621&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Reiter Auth&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Authentication UserName: 621&amp;lt;br&amp;gt;&lt;br /&gt;
Password: [hier das gleiche, wie auf der FB eingeben]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Reiter Server&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
SIP register address:port&amp;lt;br&amp;gt;&lt;br /&gt;
192.168.2.1:5060 (IP Bitte auf Euer Netz anpassen) oder alternativ: fritz.box:5060&amp;lt;br&amp;gt;&lt;br /&gt;
Protocol: UDP&amp;lt;br&amp;gt;&lt;br /&gt;
ExpireTime: 3600&amp;lt;br&amp;gt;&lt;br /&gt;
Keep Alive: 300&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Reiter SIP2&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
[ ] Symmetric Mode&amp;lt;br&amp;gt;&lt;br /&gt;
SIP Port Listen&amp;lt;br&amp;gt;&lt;br /&gt;
for UDP: 5060&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Anmerkungen dazu:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Protokoll: UDP&amp;lt;br&amp;gt;&lt;br /&gt;
Bei TCP hat das VP6500 nach Minuten oder Stunden immer wieder die Verbindung zur FB verloren.&amp;lt;br&amp;gt; &lt;br /&gt;
Keep Alive: 300&amp;lt;br&amp;gt;&lt;br /&gt;
Die Keep Alive Time habe ich eingestellt, weil ich die TCP Probleme umgehen &amp;lt;br&amp;gt;wollte. Ich denke nicht, dass es zu Problemen bzgl. Akku kommt. Da es so &amp;lt;br&amp;gt;aber perfekt funktioniert, habe ich es gelassen. Das UDP Protokoll kommt zudem mit weniger Netzwerk-Traffic aus.&amp;lt;br&amp;gt;&lt;br /&gt;
Anmeldung:&amp;lt;br&amp;gt;&lt;br /&gt;
Die Anmeldung wurde von der Fritz!Box nicht immer erfolgreich bestätigt. Einfach Weiter klicken und die restlichen Einstellungen vornehmen.&amp;lt;br&amp;gt; Spätestens nach einem Reboot des VPx500 funktioniert alles einwandfrei.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls eure Fritz!Box keine Möglichkeit bietet, ein IP-Telefon anzumelden, empfehle ich euch mal in das http://wiki.ip-phone-forum.de/skript:speedport2fritz einzulesen.&amp;lt;br&amp;gt;&lt;br /&gt;
Bzw. mal im IP-Phone-Forum nach SIP-Registrar suchen.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der SIP Listen Port 5060 hat mich viel Zeit gekostet - stand noch von sipgate direkt auf 5062 und das VP5500 hat sich dann zwar an der fritzbox registriert aber keine eingehenden Anrufe empfangen...&lt;br /&gt;
&lt;br /&gt;
=== Fritz!Box Hinweis ===&lt;br /&gt;
Hinter meiner Fritz!Box konnte ich auf dem Port 5060 keine Incoming Calls bekommen, da die Box auf diesen Port für ihre eigenes System hört.&lt;br /&gt;
Geholfen hat mit dann ein Wechsel auf Port 5061 im Reiter SIP2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Eigener VoIP Server mit Asterisk ==&lt;br /&gt;
&lt;br /&gt;
*http://www.das-asterisk-buch.de&lt;br /&gt;
&lt;br /&gt;
===Asterisk auf einer Fritz!Box===&lt;br /&gt;
&lt;br /&gt;
*http://www.asterisk-kompakt.de/artikel/45-asterisk-auf-fritzbox-phone.html&lt;br /&gt;
&lt;br /&gt;
== Videogespräche zu anderen Clients / Softphones ==&lt;br /&gt;
=== Ekiga Softphone ===&lt;br /&gt;
&lt;br /&gt;
Damit Videos klappen, müssen Ekiga und VP6500 über mindestens einen übereinstimmenden Videocodec verfügen, klar. Im Falle des VP6500 ist es wohl so, daß ausschließlich H.263 in verschiedenen Ausprägungen zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
Ekiga kommt jedoch zunächst unter Ubuntu 9.10 nur mit H.261 und Theora Codec. Wir müssen daher den H.263-Codec in Ekiga zusätzlich einhängen.&lt;br /&gt;
&lt;br /&gt;
Leider ist der H.263-Codec nicht ganz frei zugänglich, sodaß wir eine Fremdquelle benötigen, um den Codec mit dem Paketmanager installieren zu können. Daher muß Bojos Ekiga-Plugin-PPA wie in&lt;br /&gt;
&lt;br /&gt;
https://launchpad.net/~bojo42/+archive/ekiga&lt;br /&gt;
&lt;br /&gt;
beschrieben als Paketquelle hinzugefügt werden. Den zugehörigen Schlüssel nicht vergessen!&lt;br /&gt;
Wenn die neue Quelle bekannt gemacht ist, können im Paketmanager nun die&lt;br /&gt;
&lt;br /&gt;
; Pakete&lt;br /&gt;
: libopal3.6.1-plugins-h263-1998&lt;br /&gt;
: libopal3.6.1-plugins-ilbc&lt;br /&gt;
: libavcodec-dev&lt;br /&gt;
&lt;br /&gt;
installiert werden. Darauf achten, daß alle Abhängigkeiten sauber erfüllt sind.&lt;br /&gt;
Das H.263-Plugin läßt sich nur installieren, wenn libstdc++6 &amp;gt;= 4.4.0 vorhanden ist, was meines Wissens erst ab Ubuntu 9.10 der Fall ist.&lt;br /&gt;
Nach der Installation dieser Komponenten kann Ekiga neu gestartet werden. Es sollte nun unter Bearbeiten-&amp;gt;Einstellungen-&amp;gt;Video-&amp;gt;Codecs zusätzlich den H.263-Codec anbieten. Durch Verschieben nach oben kann man diesen beim Handshake priorisieren.&lt;br /&gt;
Nach Integration des H.263-Codecs in Ekiga konnte ich mit zwei Sipgate-Accounts störungsfrei, sogar über den gleichen DSL-Anschluß, videofonieren.&lt;br /&gt;
&lt;br /&gt;
== DEMO MODE ==&lt;br /&gt;
&lt;br /&gt;
Um den DEMO MODE zwischen einem VP55 und VP65 herzustellen muss man die Dateien&lt;br /&gt;
mit den Einstellungen vom VP55 auf das VP65 übertragen. Diese liegen in&lt;br /&gt;
/usr/local/data/demo/ und es sind vier Dateien. Danach ist die SSID und der KEY&lt;br /&gt;
bei beiden gleich eingerichtet und die beiden Geräte verbinden sich miteinander.&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
== Vorsicht Fallen! ==&lt;br /&gt;
Es ist nicht schwer, sich den Zugang zum Telefon abzuschneiden, wenn man nicht aufpasst.&lt;br /&gt;
&lt;br /&gt;
== Betrieb mit aktivierter serieller Schnittstelle ==&lt;br /&gt;
&lt;br /&gt;
Das 5500 und das 6500 scheint nicht komplett zu starten wenn man TIN auf low hat&lt;br /&gt;
und die serielle Schnittstelle benutzt. Man kann das Gerät dann nicht normal bedienen. Dies lässt sich ändern indem man in der Datei&lt;br /&gt;
&lt;br /&gt;
 /usr/local/startup/daemon.sh&lt;br /&gt;
&lt;br /&gt;
ziemlich am Anfang das TINDETECT=&amp;quot;TRUE&amp;quot; ändert auf TINDETECT=&amp;quot;FALSE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Danach startet er auch mit aktiver serieller Verbindung komplett durch&lt;br /&gt;
und das Gerät ist ganz normal bedienbar.&lt;br /&gt;
&lt;br /&gt;
== Grundlagen ==&lt;br /&gt;
Bestimmte Aktionen werden immer wieder benötigt.&lt;br /&gt;
Diese sollen hier kurz beschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Es werden dennoch grundlegende Kenntnisse von Kommandozeilen vorausgesetzt.&lt;br /&gt;
&lt;br /&gt;
==== Dateien bearbeiten mit vi ====&lt;br /&gt;
Auf dem Telefon ist der minimalistische Editor vi installiert mit dem Dateien über Telnet bearbeitet werden können.&lt;br /&gt;
Für eine genaue Bedienung bitte Google benutzen.&lt;br /&gt;
Die wichtigsten Bedienelemente werden hier kurz erläutert.&lt;br /&gt;
&lt;br /&gt;
Datei Öffnen mit &#039;vi Dateipfad&#039;&lt;br /&gt;
vi kennt zwei Modi: Kommando- und Einfüge-Modus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;i&#039;&#039;&#039; - wechselt in den Einfüge-Modus, in dem geschrieben werden kann&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;a&#039;&#039;&#039; - anhängen (hinter dem aktuellem Zeichen in den Einfüge-Modus)&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;[Esc]&#039;&#039;&#039; wechselt zurück in den Kommandomodus. &lt;br /&gt;
In diesem kann mittels Pfeil- und Bildlauftasten navigiert werden.&lt;br /&gt;
:x - löscht das Zeichen an Cursor position&lt;br /&gt;
:d&#039;&#039;n&#039;&#039;d - löscht &#039;&#039;n&#039;&#039; Zeile(n) in den Zeilenbuffer (ohne &#039;&#039;n&#039;&#039; = eine Zeile)&lt;br /&gt;
:y&#039;&#039;n&#039;&#039;y - kopiert &#039;&#039;n&#039;&#039; Zeile(n) in den Zeilenbuffer (ohne &#039;&#039;n&#039;&#039; = eine Zeile)&lt;br /&gt;
:p - fügt Inhalt des Zeilenbuffer &#039;&#039;&#039;unter&#039;&#039;&#039; der aktuellen Zeile ein&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;q! - schließt ohne zu speichern&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;w - speichert&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;wq - speichert und beenden&lt;br /&gt;
&lt;br /&gt;
==== Dateien auf das Telefon laden ====&lt;br /&gt;
Um Daten von einem http-Server zu laden, benutzt man &lt;br /&gt;
 wget url&lt;br /&gt;
Die Datei wird dann in das aktuelle Verzeichnis geladen, weswegen vorher in das Zielverzeichnis wechseln.&lt;br /&gt;
&lt;br /&gt;
Um Daten von einem ftp-Server zu laden, benutzt man ftp.&lt;br /&gt;
Auch hier muss vorher in das zielverzeichnis gewechselt werden.&lt;br /&gt;
 ftp hostname&lt;br /&gt;
dann gegebenenfalls die Zugangsdaten eingeben und mittels &#039;cd&#039; und &#039;ls&#039; in das Entsprechende Verzeichnis auf dem FTP-Server wechseln&lt;br /&gt;
und anschließend mittels &lt;br /&gt;
 get dateiname&lt;br /&gt;
die Datei herunterladen.&lt;br /&gt;
 &lt;br /&gt;
==== Dateien vom Telefon herunterladen ====&lt;br /&gt;
Auch hier bietet sich ein FTP an.&lt;br /&gt;
Mittels &#039;ftp hostname&#039; verbinden, Benutzerdaten eingeben, in das entsprechende FTP-Server-Verzeischnis wechseln und mittels&lt;br /&gt;
 put localeDatei&lt;br /&gt;
eine Lokale Datei hochladen.&lt;br /&gt;
&lt;br /&gt;
==== Alternative: Dropbear ====&lt;br /&gt;
&lt;br /&gt;
Wurde der dropbear-ssh server installiert [[#Dropbear (SSH-Server) installieren]] können mittels eines Programms mit SCP-Unterstützung (zB. [http://winscp.net/eng/docs/lang:de WinSCP] für Windows) sehr komfortabel Dateien ausgetauscht werden.&lt;br /&gt;
&lt;br /&gt;
Mit WinSCP können auch Dateien direkt bearbeitet werden.&lt;br /&gt;
Der Client lädt die Datei herunter, öffnet einen Editor und lädt die Datei wieder herauf, wenn diese geändert wurde.&lt;br /&gt;
&lt;br /&gt;
== Grundkonfiguration, die das Leben erleichtert ==&lt;br /&gt;
=== .bashrc ===&lt;br /&gt;
Die installierte Shell ist die bash. Einstellungen bezieht sie aus der (versteckten) Datei &amp;quot;.bashrc&amp;quot;. Hier kann man sinnvolle Ergänzungen vornehmen, damit sich das Telefon ein bißchen mehr wie ein gewohntes Linux-System verhält:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
alias vim=vi&lt;br /&gt;
PS1=&amp;quot;[\u@\h] \w $ &amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup ==&lt;br /&gt;
=== Backup des Flash ===&lt;br /&gt;
If you want to make a backup of your root partition, you can do as&lt;br /&gt;
follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
echo &#039;#!/bin/sh&#039; &amp;gt; /tmp/backup.sh&lt;br /&gt;
echo &#039;cat /dev/mtdb2 2&amp;gt;/dev/null&#039; &amp;gt;&amp;gt; /tmp/backup.sh&lt;br /&gt;
chmod 700 /tmp/backup.sh&lt;br /&gt;
micro_inetd 31337 /tmp/backup.sh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This&#039;ll make your device listen for incoming connections on port 31337.&lt;br /&gt;
On your host system you may then simply run &lt;br /&gt;
 nc ip.of.your.phone 31337 &amp;gt; fon_rootfs&lt;br /&gt;
et voilà, you got your rootfs packed into a file.&lt;br /&gt;
&lt;br /&gt;
Note that the backed up file is not ext2, but a jffs2 formatted&lt;br /&gt;
filesystem. These can&#039;t be handled by a simple &amp;quot;mount -o loop&amp;quot; as you&#039;d&lt;br /&gt;
have thought... so here&#039;s how you mount it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
modprobe jffs2&lt;br /&gt;
modprobe mtdram total_size=65536 erase_size=128&lt;br /&gt;
modprobe mtdblock&lt;br /&gt;
mkdir /tmp/phone-root&lt;br /&gt;
mknod /tmp/phone-mtdb2 b 31 0&lt;br /&gt;
dd if=/your/backup/file of=/tmp/phone-mtdb2&lt;br /&gt;
mount -t jffs2 /tmp/phone-mtdb2 /tmp/phone-root&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[#Dateisystem herunterladen]] describes another way to dump the filesystem for closer examination.&lt;br /&gt;
&lt;br /&gt;
=== Komplettes Backup ===&lt;br /&gt;
Die Datei http://www.mikrocontroller.net/attachment/73323/S91backup_pipe auf das Gerät laden und als ausführbar markieren.&lt;br /&gt;
&lt;br /&gt;
 cd /etc/rc.d/init.d&lt;br /&gt;
 wget http://www.mikrocontroller.net/attachment/73323/S91backup_pipe&lt;br /&gt;
 chmod +x /etc/rc.d/init.d/S91backup_pipe&lt;br /&gt;
&lt;br /&gt;
Damit wird eine Art Backup-Server mit dem Boot gestartet.&lt;br /&gt;
wenn man dies nicht möchte kann man das Skript natürlich auch an jeden beliebigen anderen Ort legen und per Hand starten.&lt;br /&gt;
&lt;br /&gt;
Nun kann man von einem Rechner aus mittels nc (netcat) die Bereiche sichern:&lt;br /&gt;
&lt;br /&gt;
 nc 192.168.1.3 31337 &amp;gt; fon_rootfs&lt;br /&gt;
 nc 192.168.1.3 31338 &amp;gt; fon_udata&lt;br /&gt;
 nc 192.168.1.3 31339 &amp;gt; fon_usettings&lt;br /&gt;
 nc 192.168.1.3 31340 &amp;gt; fon_bootld&lt;br /&gt;
 nc 192.168.1.3 31341 &amp;gt; fon_kernel&lt;br /&gt;
&lt;br /&gt;
Die 192.168.1.3 natürlich mit der IP des Gerätes austauschen, die fon_*&lt;br /&gt;
Dateinamen könnt ihr natürlich auch frei vergeben.&lt;br /&gt;
&lt;br /&gt;
fon_udata ist die /user_data Partition, fon_usertings dementsprechend&lt;br /&gt;
die /user_settings Partition.&lt;br /&gt;
&lt;br /&gt;
Der bootld Bereich enthält auch die Parameter. Um das später (falls&lt;br /&gt;
überhaupt nötig) mittels blob zu restaurieren müsste die Datei noch in&lt;br /&gt;
zwei Teile aufgeteilt werden. Der erste enthält dann den reinen&lt;br /&gt;
Bootloader-Bereich, der zweite die Parameter. Wer&#039;s wirklich braucht für&lt;br /&gt;
den kann ich noch ne Anleitung zum Aufteilen geben. Wirklich Sinnvoll&lt;br /&gt;
ist das aber nicht, hat man den Bootloader erstmal mit was anderem&lt;br /&gt;
überschrieben kann man ihn ja auch nicht mehr zum Wiederherstellen&lt;br /&gt;
benutzen....&lt;br /&gt;
&lt;br /&gt;
=== Zurückspielen der Backups ===&lt;br /&gt;
&lt;br /&gt;
1) Man braucht ein (die) Backup-Image(s).&lt;br /&gt;
&lt;br /&gt;
2) Serielle Verbindung zum Telefon&lt;br /&gt;
&lt;br /&gt;
3) Akku abstecken, wieder anstecken.&lt;br /&gt;
&lt;br /&gt;
4) Telefon einschalten und im Terminalprogram auf die Tasten kloppen, so&lt;br /&gt;
das man im Bootloader landet. Dabei muss man recht schnell sein. Es&lt;br /&gt;
sollte dann ein Prompt kommen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
blob&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5) Nun gibt man ein &lt;br /&gt;
   xdownload param&lt;br /&gt;
Wobei &#039;param&#039; der Teil ist, den man wiederherstellen will:&lt;br /&gt;
* blob - Bootloader (fon_bootld)&lt;br /&gt;
* param - Parameter Bereich (Bootloader oder Kernel?) (fon_bootld)&lt;br /&gt;
* kernel - Der Kernel (fon_kernel)&lt;br /&gt;
* ramdisk - Das Root-Filesystem / (fon_rootfs)&lt;br /&gt;
* ramdisk2 - Das /user_data Filesystem (fon_udata)&lt;br /&gt;
* ramdisk3 - Das /user_settings Filesystem (fon_usettings)&lt;br /&gt;
&lt;br /&gt;
Beim Backup ist blob + param in einer Datei, müsste man also ggf.&lt;br /&gt;
erstmal aufsplitten.&lt;br /&gt;
&lt;br /&gt;
6) Er wartet dann auf den Upload. Nun startet man im Terminalprogram den&lt;br /&gt;
Upload des Backup-Images, dazu verwendet man das X-Modem Protokoll.&lt;br /&gt;
&lt;br /&gt;
7) Kaffee trinken, auf&#039;s Klo gehen, mit Frau/Freundin/Mutter ein Gespräch&lt;br /&gt;
anfangen.&lt;br /&gt;
&lt;br /&gt;
8) Irgendwann ist der Upload fertig. Dauert halt lange. Man landet&lt;br /&gt;
wieder am &amp;quot;blob&amp;gt;&amp;quot; prompt. Nun gibt man&lt;br /&gt;
 flash param&lt;br /&gt;
ein.&lt;br /&gt;
&lt;br /&gt;
9) Er schreibt nun das, was man hochgeladen hat, in das Flash.&lt;br /&gt;
&lt;br /&gt;
10) &amp;quot;boot&amp;quot; eingeben. Da Telefon bootet nun normal.&lt;br /&gt;
&lt;br /&gt;
Achtung: Wenn im Backup nicht die Änderung gemacht wurde damit das&lt;br /&gt;
Telefon auch bei angeschlossener serieller Schnittstelle startet, kommt&lt;br /&gt;
man nicht weiter als wie bis zur Sanduhr. Dann einfach die serielle&lt;br /&gt;
abstecken (Also den TIN pin wieder freigeben) und das Telefon neustarten&lt;br /&gt;
(Akku kurz ab- und wieder anstöpseln)&lt;br /&gt;
&lt;br /&gt;
=== Dateisystem herunterladen ===&lt;br /&gt;
Zum unkomplizierten Durchsuchen des Dateisystems kann es nützlich sein, dieses vom Gerät zu kopieren.&lt;br /&gt;
&lt;br /&gt;
Folgende Befehle erzeugen wie beim Backup des Flash einen kleinen Server, dessen Output auf anderer Seite mittels mittels nc abgeholt werden kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
echo &#039;#! /bin/sh&#039; &amp;gt; /tmp/backup.sh&lt;br /&gt;
echo &#039;cd /&#039; &amp;gt;&amp;gt; /tmp/backup.sh&lt;br /&gt;
chmod 700 /tmp/backup.sh&lt;br /&gt;
echo &#039;tar cf - bin boot dev etc home lib mnt opt root sbin tmp trace upgrade user_data user_settings usr var 2&amp;gt;/dev/null&#039; &amp;gt;&amp;gt; /tmp/backup.sh&lt;br /&gt;
micro_inetd 31340 /tmp/backup.sh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die lange Liste mit Unterverzeichnissen ist notwendig um /proc zu überspringen, was Probleme mit tar verursachen würde.&lt;br /&gt;
&lt;br /&gt;
Auf einem anderen Linux system (oder cygwin) kann mittels&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  nc telefon-Ip 31340 &amp;gt; file.tar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
die Datei abgerufen werden.&lt;br /&gt;
&lt;br /&gt;
Der Vorgang dauert aber ein ganz paar Minuten.&lt;br /&gt;
&lt;br /&gt;
Heraus kommt ein Tar-Archiv, was alle Dateien des Gerätes enthält - inclusive der temporären Dateien der Ram-Disks.&lt;br /&gt;
&lt;br /&gt;
== Erkunden des Systems mit Bordmitteln ==&lt;br /&gt;
&lt;br /&gt;
=== Ausgabe von &amp;lt;b&amp;gt;&amp;lt;tt&amp;gt;dmesg&amp;lt;/tt&amp;gt;&amp;lt;/b&amp;gt; auf einem VP6500 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
6&amp;gt;NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.&lt;br /&gt;
NetWinder Floating Point Emulator V0.95 (c) 1998-1999 Rebel.com&lt;br /&gt;
VFS: Mounted root (jffs2 filesystem).&lt;br /&gt;
Freeing init memory: 68K&lt;br /&gt;
PCB version: ind3 v2&lt;br /&gt;
Driver SYSTCLK: SYSTCLK-1.12 (REFERENCED)&lt;br /&gt;
Driver GPIO-1.59 (REFERENCED)&lt;br /&gt;
****p_gpio_init_low_bat****&lt;br /&gt;
GPIO: p_gpio_it_init at 762&lt;br /&gt;
Driver FRAMEBUF-1.12 (REFERENCED)&lt;br /&gt;
Driver SPI-1.20 (REFERENCED) Debug level 3&lt;br /&gt;
&lt;br /&gt;
u32_spi1_MinLenghtForDMAInTX set to 300&lt;br /&gt;
&lt;br /&gt;
u32_spi1_MinLenghtForDMAInRX set to 300&lt;br /&gt;
Driver LCD-1.20 (REFERENCED)&lt;br /&gt;
Driver TVLINK-1.45 (REFERENCED)&lt;br /&gt;
Reset from Software Reset.&lt;br /&gt;
Motorola PostProcessor Linux driver ver 0.64 - Copyright (C) 2003 Motorola Inc&lt;br /&gt;
pp: hw ver = 2&lt;br /&gt;
prp_dbg=0&lt;br /&gt;
Motorola PreProcessor Linux driver ver 0.0 - Copyright (C) 2003 Motorola Inc&lt;br /&gt;
hmp4d: base_port=0x10026800 irq=50&lt;br /&gt;
hmp4d: module inserted&lt;br /&gt;
hmp4e: base_port=0x10026c00 irq=49&lt;br /&gt;
hmp4e: Compatble HW found with ID: 0x004c1882&lt;br /&gt;
hmp4e: module inserted. Major = 249&lt;br /&gt;
SPI2:: drv_Init :PID of driver: 134&lt;br /&gt;
SPI2:: drv_Init :ScanList not provided. Will use the default scan list.&lt;br /&gt;
SPI2:: drv_Init :ScanChannelList :1 6 11 14 2 7 12 3 8 13 4 9 5 10&lt;br /&gt;
SPI2:: drv_Init :setting PhyType to: Rf-to-Rf&lt;br /&gt;
SPI2:: drv_Init :Ref.Clock parameter not provided&lt;br /&gt;
SPI2:: drv_Init :Configure target for a reference clock of &#039;default=40&#039; Mhz.&lt;br /&gt;
SPI2:: drvRegEtherDev :Interface Name is: eth%d&lt;br /&gt;
SPI2:: drv_Init :HEOCSIWPOWON: Powering on...&lt;br /&gt;
SPI2:: drvPhase2Init :Protocol Firmware will be loaded by driver ...&lt;br /&gt;
SPI2:: drvPhase2Init :Initializing HHAL (PhgHhalInitialize)...&lt;br /&gt;
Divider : 8&lt;br /&gt;
&lt;br /&gt;
 OCR2 : e4015308 (12582912)&lt;br /&gt;
Reset : 3 / 27 (c497cc00 / e401531c)&lt;br /&gt;
&lt;br /&gt;
Reset : 3 / 27 (c497cc00 / e401531c)&lt;br /&gt;
GPIO: p_gpio_init_gpio_status at 1262&lt;br /&gt;
GPIO: POWER_FAIL signal NOT detected at GPIO driver init carry on !!!&lt;br /&gt;
GPIO: CHARGE_IN at init&lt;br /&gt;
GPIO: LOW_BAT_OUT at init&lt;br /&gt;
GPIO: No accessory plugged at init.  - Set Video on jack&lt;br /&gt;
GPIO: camera to front at init&lt;br /&gt;
**ChargeStatusPmb=========gpio_Read_ChargeStatus_Ready=1&lt;br /&gt;
SPI2:: PhgOsal_linux_init_thread :assigning thread name and deamonize() ..&lt;br /&gt;
SPI2:: drvPhase2Init :Success&lt;br /&gt;
SPI2:: drvPhase2Init : registering callbacks with HHAL..&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVNT_INIT_COMPLETE; setting CARRIER_ON&lt;br /&gt;
SPI2:: drvPhase2Init :calling PhgHhalQueueMgmtReq()!&lt;br /&gt;
PhgHhalQueueMgmtReq:1172:HHAL got Init message&lt;br /&gt;
PhgHhalQueueMgmtReq:1217:HHAL done Init message&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PS wake (0) in Drvmain&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVENT_DISCONNECT; setting CARRIER_OFF&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :netdev-&amp;gt;flags=0x00001002, IFF_UP=0&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :device was already closed&lt;br /&gt;
SPI2:: drvMgmtCfmHndler :Using MAC Address: 00:08:c6:86:8b:99&lt;br /&gt;
SPI2:: drvPhase2Init :init etherdev; stopping queue, setting CARRIER_OFF&lt;br /&gt;
SPI2:: drv_Init :Philips WLAN Drv - loaded - in state: 1&lt;br /&gt;
SPI2:: drvInit :Philips WLAN Drv - loaded&lt;br /&gt;
SPI2:: drvOpen :opening net device&lt;br /&gt;
SPI2:: drvOpen :Device is not associated!&lt;br /&gt;
SPI2:: drvOpen :Carrier flag is already set to CARRIER_OFF&lt;br /&gt;
SPI2:: drvOpen :Disabling again netqueue&lt;br /&gt;
requested reg.domain code setting = 3&lt;br /&gt;
SPI2:: drvIoctl :set u8LinkAdaptation  : 1 Result=[0]&lt;br /&gt;
SPI2:: drvIoctl :changed HEOCSIWLNADPALLOWRATES: 8 allowed rate codes&lt;br /&gt;
SPI2:: drvInitConnect :Req to connect to new WLAN network&lt;br /&gt;
SPI2:: drvInitConnect :Disabling TX queue and setting CARRIER_OFF&lt;br /&gt;
SPI2:: drvInitConnect :Connecting To AP...&lt;br /&gt;
SPI2:: drvInitConnect :step2&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVENT_DISCONNECT; setting CARRIER_OFF&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :netdev-&amp;gt;flags=0x00001003, IFF_UP=1&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :device was already opened; stopping queue&lt;br /&gt;
SPI2:: drvInitConnect :step3 : u8Status 255&lt;br /&gt;
SPI2:: drvInitConnect :step5&lt;br /&gt;
SPI2:: drvInitConnect :TIMEDOUT&lt;br /&gt;
SPI2:: drvInitConnect :step6&lt;br /&gt;
SPI2:: drvInitParamsAndPowerOnAndConnect :Connect failed!&lt;br /&gt;
Motorola CSI Linux driver ver 0.1&lt;br /&gt;
 - Copyright (C) 2004 Motorola Inc&lt;br /&gt;
&lt;br /&gt;
Driver SENSOR-1.29 (REFERENCED)&lt;br /&gt;
i2c-client version : 1.9&lt;br /&gt;
Initialize i2c-client-aic14 module&lt;br /&gt;
Module i2c-client-aic14 initialized&lt;br /&gt;
Insert module aic14 (AIC14-1.0)&lt;br /&gt;
Module AIC14 assumes CODEC MCLK already configured for 20480000Hz&lt;br /&gt;
Driver KPP-1.36 (REFERENCED)&lt;br /&gt;
Driver DOZE-1.27 (REFERENCED)&lt;br /&gt;
SPI2:: drvDoScan :Buero (bittorf)&lt;br /&gt;
SPI2:: drvProcessScanCfm :Scan Confirm: Success 1 APs&lt;br /&gt;
SPI2:: drvInitConnect :Req to connect to new WLAN network&lt;br /&gt;
SPI2:: drvInitConnect :Disabling TX queue and setting CARRIER_OFF&lt;br /&gt;
SPI2:: drvInitConnect :Connecting To AP...&lt;br /&gt;
SPI2:: drvInitConnect :step2&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVNT_INIT_CONNECT; setting CARRIER_ON&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :netdev-&amp;gt;flags=0x00001003, IFF_UP=1&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :device was already opened; enabling queue&lt;br /&gt;
SPI2:: drvInitConnect :step3 : u8Status 8&lt;br /&gt;
SPI2:: drvInitConnect :step4&lt;br /&gt;
SPI2:: drvInitConnect :Successful&lt;br /&gt;
SPI2:: drvInitConnect :step6&lt;br /&gt;
SPI2:: drvIoctl :dot11LongRetryLimitAC0 = 8&lt;br /&gt;
SPI2:: drvIoctl :dot11LongRetryLimitAC1 = 8&lt;br /&gt;
SPI2:: drvIoctl :dot11LongRetryLimitAC2 = 8&lt;br /&gt;
SPI2:: drvIoctl :dot11LongRetryLimitAC3 = 8&lt;br /&gt;
SPI2:: drvIoctl :dot11ShortRetryLimitAC0 = 8&lt;br /&gt;
SPI2:: drvIoctl :dot11ShortRetryLimitAC1 = 8&lt;br /&gt;
SPI2:: drvIoctl :dot11ShortRetryLimitAC2 = 8&lt;br /&gt;
SPI2:: drvIoctl :dot11ShortRetryLimitAC3 = 8&lt;br /&gt;
SPI2:: drvIoctl :PA Request&lt;br /&gt;
SPI2:: drvIoctl :No state change!&lt;br /&gt;
SPI2:: drvIoctl :Fast PS Request&lt;br /&gt;
PhgHhalDoM2SDMA:1661:--&amp;gt;P1&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PS Ind (1) in Drvmain&lt;br /&gt;
SPI2:: drvStop :Driver Stop: disable TX queue! (usage: 2)&lt;br /&gt;
SPI2:: drvIoctl :Deauth BSSID: 00:1d:7e:18:e3:89&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVENT_DISCONNECT; setting CARRIER_OFF&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :netdev-&amp;gt;flags=0x00000002, IFF_UP=0&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :device was already closed&lt;br /&gt;
SPI2:: drvOpen :opening net device&lt;br /&gt;
SPI2:: drvOpen :ERROR: Associated, but Carrier flag is set to CARRIER_OFF&lt;br /&gt;
SPI2:: drvDoScan :Buero (bittorf)&lt;br /&gt;
SPI2:: drvProcessScanCfm :Scan Confirm: Success 1 APs&lt;br /&gt;
SPI2:: drvInitConnect :Req to connect to new WLAN network&lt;br /&gt;
SPI2:: drvInitConnect :Disabling TX queue and setting CARRIER_OFF&lt;br /&gt;
SPI2:: drvInitConnect :Connecting To AP...&lt;br /&gt;
SPI2:: drvInitConnect :step2&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVNT_INIT_CONNECT; setting CARRIER_ON&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :netdev-&amp;gt;flags=0x00000003, IFF_UP=1&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :device was already opened; enabling queue&lt;br /&gt;
SPI2:: drvInitConnect :step3 : u8Status 8&lt;br /&gt;
SPI2:: drvInitConnect :step4&lt;br /&gt;
SPI2:: drvInitConnect :Successful&lt;br /&gt;
SPI2:: drvInitConnect :step6&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PS Ind (1) in Drvmain&lt;br /&gt;
SPI2:: drvIoctl :PA Request&lt;br /&gt;
PhgHhalDoM2SDMA:1661:--&amp;gt;P0&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PS wake (0) in Drvmain&lt;br /&gt;
drvSetWOWFilter: Enable UNICAST: Disable ARP: Enable&lt;br /&gt;
Ip addr = 10.63.17.5. LMP=2&lt;br /&gt;
SPI2:: drvIoctl :PA Request&lt;br /&gt;
SPI2:: drvIoctl :No state change!&lt;br /&gt;
SPI2:: drvIoctl :Fast PS Request&lt;br /&gt;
PhgHhalDoM2SDMA:1661:--&amp;gt;P1&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PS Ind (1) in Drvmain&lt;br /&gt;
Sensor driver: initialize device OV7660&lt;br /&gt;
Warning: Remapping obsolete /dev/fb* minor 32 to 1&lt;br /&gt;
SPI2:: drvIoctl :dot11LongRetryLimitAC0 = 4&lt;br /&gt;
SPI2:: drvIoctl :dot11LongRetryLimitAC1 = 4&lt;br /&gt;
SPI2:: drvIoctl :dot11LongRetryLimitAC2 = 4&lt;br /&gt;
SPI2:: drvIoctl :dot11LongRetryLimitAC3 = 4&lt;br /&gt;
SPI2:: drvIoctl :dot11ShortRetryLimitAC0 = 4&lt;br /&gt;
SPI2:: drvIoctl :dot11ShortRetryLimitAC1 = 4&lt;br /&gt;
SPI2:: drvIoctl :dot11ShortRetryLimitAC2 = 4&lt;br /&gt;
SPI2:: drvIoctl :dot11ShortRetryLimitAC3 = 4&lt;br /&gt;
SPI2:: drvIoctl :PA Request&lt;br /&gt;
PhgHhalDoM2SDMA:1661:--&amp;gt;P0&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PS wake (0) in Drvmain&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ausgabe von &amp;lt;b&amp;gt;&amp;lt;tt&amp;gt;logread&amp;lt;/tt&amp;gt;&amp;lt;/b&amp;gt; auf einem VP6500 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Jan  1 00:00:00 imx21 syslog.info syslogd started: BusyBox v0.60.0 (2007.02.28-13:39+0000)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.emerg klogd: klogd started: BusyBox v0.60.0 (2007.02.28-13:39+0000)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Linux version 2.4.20-celf3 (root@wbul04) (gcc version 3.3.2) #1 Wed Feb 28 13:30:26 UTC 2007&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: CPU: ARM926EJ-Sid(wb) [41069264] revision 4 (ARMv?(8))&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: CPU: D undefined 14 cache&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: CPU: I cache: 16384 bytes, associativity 4, 32 byte lines, 128 sets&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: CPU: D cache: 16384 bytes, associativity 4, 32 byte lines, 128 sets&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Machine: Freescale i.MX2 ADS&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: FCLK=266000 kHz   HCLK=133000 kHz  IPGCLK=66500 kHz&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: PERCLKs: 1=44333 KHz  2=33250 kHz  3=44333 kHz  4=88666 kHz&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: On node 0 totalpages: 16384&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: zone(0): 16384 pages.&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: zone(1): 0 pages.&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: zone(2): 0 pages.&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Kernel command line: root=/dev/mtdblock2 noinitrd ip=none mtdparts=s29gl512n:256k@0x00000000&lt;br /&gt;
(bootloader)ro,896k@0x00040000(kernel)ro,50432k@0x00120000(fs#1),12800k@0x03260000(fs#2),1152k@0x03EE0000(fs#3)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.debug klogd: Relocating machine vectors to 0xffff0000&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Console: colour dummy device 80x30&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Calibrating delay loop (skipped)... 132.71 BogoMIPS&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Memory: 64MB = 64MB total&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: Memory: 63052KB available (1366K code, 299K data, 68K init)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Dentry cache hash table entries: 8192 (order: 4, 65536 bytes)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Inode cache hash table entries: 4096 (order: 3, 32768 bytes)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Mount-cache hash table entries: 1024 (order: 1, 8192 bytes)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Buffer-cache hash table entries: 4096 (order: 2, 16384 bytes)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Page-cache hash table entries: 16384 (order: 4, 65536 bytes)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: POSIX conformance testing by UNIFIX&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Linux NET4.0 for Linux 2.4&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Based upon Swansea University Computer Society NET3.039&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Initializing RT netlink socket&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: apm: Simulating APM BIOS version 1.2 (Driver version 1.0)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: i.MX21 Dynamic Power Management&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Starting kswapd&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Disabling the Out Of Memory Killer&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: JFFS2 version 2.1. (C) 2001, 2002 Red Hat, Inc., designed by Axis Communications AB.&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: i2c-core.o: i2c core module version 2.6.2 (20011118)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: pty: 256 Unix98 ptys configured&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Serial driver version 5.05c (2001-07-08) with no serial options enabled&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: UART driver version 0.3.6&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: I2C driver Feb 28 2007 / 13:31:04&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Initialize i2c-client-dbmx-codec module&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: s29gl512n: probing 16-bit flash bus&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd:  Amd/Fujitsu Extended Query Table v1.3 at 0x0040&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: number of CFI chips: 1&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: cfi_cmdset_0002: Using Write Buffer method.&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: cfi_cmdset_0002: buffer_Write_Time = 128&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: cfi_cmdset_0002: Disabling fast programming due to code brokenness.&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: Using static partition definition&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: Creating 5 MTD partitions on &amp;quot;s29gl512n&amp;quot;:&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: 0x00000000-0x00040000 : &amp;quot;bootloader&amp;quot;&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: 0x00040000-0x00120000 : &amp;quot;kernel&amp;quot;&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: 0x00120000-0x03260000 : &amp;quot;fs #1&amp;quot;&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: 0x03260000-0x03ee0000 : &amp;quot;fs #2&amp;quot;&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: 0x03ee0000-0x04000000 : &amp;quot;fs #3&amp;quot;&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: NET4: Linux TCP/IP 1.0 for NET4.0&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: IP Protocols: ICMP, UDP, TCP&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: IP: routing cache hash table of 512 buckets, 4Kbytes&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: TCP: Hash tables configured (established 4096 bind 8192)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: NetWinder Floating Point Emulator V0.95 (c) 1998-1999 Rebel.com&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: VFS: Mounted root (jffs2 filesystem).&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Freeing init memory: 68K&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: PCB version: ind3 v2&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Driver SYSTCLK: SYSTCLK-1.12 (REFERENCED)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Driver GPIO-1.59 (REFERENCED)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: ****p_gpio_init_low_bat****&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: GPIO: p_gpio_it_init at 762&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Driver FRAMEBUF-1.12 (REFERENCED)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Driver SPI-1.20 (REFERENCED) Debug level 3&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: &lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: u32_spi1_MinLenghtForDMAInTX set to 300&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: &lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: u32_spi1_MinLenghtForDMAInRX set to 300&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Driver LCD-1.20 (REFERENCED)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Driver TVLINK-1.45 (REFERENCED)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Reset from Software Reset.&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Motorola PostProcessor Linux driver ver 0.64 - Copyright (C) 2003 Motorola Inc&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: pp: hw ver = 2&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: prp_dbg=0&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: Motorola PreProcessor Linux driver ver 0.0 - Copyright (C) 2003 Motorola Inc&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.info klogd: hmp4d: base_port=0x10026800 irq=50&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.info klogd: hmp4d: module inserted&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.info klogd: hmp4e: base_port=0x10026c00 irq=49&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.info klogd: hmp4e: Compatble HW found with ID: 0x004c1882&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.info klogd: hmp4e: module inserted. Major = 249&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.err klogd: SPI2:: drv_Init :PID of driver: 134 &lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.err klogd: SPI2:: drv_Init :ScanList not provided. Will use the default scan list. &lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.err klogd: SPI2:: drv_Init :ScanChannelList :1 6 11 14 2 7 12 3 8 13 4 9 5 10 &lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.err klogd: SPI2:: drv_Init :setting PhyType to: Rf-to-Rf&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.err klogd: SPI2:: drv_Init :Ref.Clock parameter not provided&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.err klogd: SPI2:: drv_Init :Configure target for a reference clock of &#039;default=40&#039; Mhz.&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.err klogd: SPI2:: drvRegEtherDev :Interface Name is: eth%d &lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.err klogd: SPI2:: drv_Init :HEOCSIWPOWON: Powering on... &lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.err klogd: SPI2:: drvPhase2Init :Protocol Firmware will be loaded by driver ...&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.err klogd: SPI2:: drvPhase2Init :Initializing HHAL (PhgHhalInitialize)...&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: Divider : 8&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: &lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd:  OCR2 : e4015308 (12582912)&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: Reset : 3 / 27 (c497cc00 / e401531c)&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: &lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: Reset : 3 / 27 (c497cc00 / e401531c)&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: GPIO: p_gpio_init_gpio_status at 1262&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: GPIO: POWER_FAIL signal NOT detected at GPIO driver init carry on !!! &lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: GPIO: CHARGE_IN at init&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: GPIO: LOW_BAT_OUT at init&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: GPIO: No accessory plugged at init.  - Set Video on jack&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: GPIO: camera to front at init&lt;br /&gt;
Jan  1 00:00:04 imx21 daemon.warn klogd: **ChargeStatusPmb=========gpio_Read_ChargeStatus_Ready=1 &lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: PhgOsal_linux_init_thread :assigning thread name and deamonize() .. &lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvPhase2Init :Success&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvPhase2Init : registering callbacks with HHAL.. &lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVNT_INIT_COMPLETE; setting CARRIER_ON&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvPhase2Init :calling PhgHhalQueueMgmtReq()!&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.info klogd: PhgHhalQueueMgmtReq:1172:HHAL got Init message&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.info klogd: PhgHhalQueueMgmtReq:1217:HHAL done Init message&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PS wake (0) in Drvmain&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVENT_DISCONNECT; setting CARRIER_OFF&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :netdev-&amp;gt;flags=0x00001002, IFF_UP=0&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :device was already closed&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvMgmtCfmHndler :Using MAC Address: 00:08:c6:86:8b:99&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvPhase2Init :init etherdev; stopping queue, setting CARRIER_OFF&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drv_Init :Philips WLAN Drv - loaded - in state: 1 &lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvInit :Philips WLAN Drv - loaded&lt;br /&gt;
Jan  1 00:00:07 imx21 daemon.err klogd: SPI2:: drvOpen :opening net device&lt;br /&gt;
Jan  1 00:00:07 imx21 daemon.err klogd: SPI2:: drvOpen :Device is not associated!&lt;br /&gt;
Jan  1 00:00:07 imx21 daemon.err klogd: SPI2:: drvOpen :Carrier flag is already set to CARRIER_OFF&lt;br /&gt;
Jan  1 00:00:07 imx21 daemon.err klogd: SPI2:: drvOpen :Disabling again netqueue&lt;br /&gt;
Jan  1 00:00:07 imx21 daemon.warn klogd: requested reg.domain code setting = 3&lt;br /&gt;
Jan  1 00:00:07 imx21 daemon.err klogd: SPI2:: drvIoctl :set u8LinkAdaptation  : 1 Result=[0]&lt;br /&gt;
Jan  1 00:00:07 imx21 daemon.err klogd: SPI2:: drvIoctl :changed HEOCSIWLNADPALLOWRATES: 8 allowed rate codes&lt;br /&gt;
Jan  1 00:00:07 imx21 daemon.err klogd: SPI2:: drvInitConnect :Req to connect to new WLAN network&lt;br /&gt;
Jan  1 00:00:07 imx21 daemon.err klogd: SPI2:: drvInitConnect :Disabling TX queue and setting CARRIER_OFF&lt;br /&gt;
Jan  1 00:00:07 imx21 daemon.err klogd: SPI2:: drvInitConnect :Connecting To AP...&lt;br /&gt;
Jan  1 00:00:07 imx21 daemon.err klogd: SPI2:: drvInitConnect :step2&lt;br /&gt;
Jan  1 00:00:10 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
Jan  1 00:00:10 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVENT_DISCONNECT; setting CARRIER_OFF&lt;br /&gt;
Jan  1 00:00:10 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :netdev-&amp;gt;flags=0x00001003, IFF_UP=1&lt;br /&gt;
Jan  1 00:00:10 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :device was already opened; stopping queue&lt;br /&gt;
Jan  1 00:00:11 imx21 daemon.err klogd: SPI2:: drvInitConnect :step3 : u8Status 255&lt;br /&gt;
Jan  1 00:00:11 imx21 daemon.err klogd: SPI2:: drvInitConnect :step5&lt;br /&gt;
Jan  1 00:00:11 imx21 daemon.err klogd: SPI2:: drvInitConnect :TIMEDOUT&lt;br /&gt;
Jan  1 00:00:11 imx21 daemon.err klogd: SPI2:: drvInitConnect :step6&lt;br /&gt;
Jan  1 00:00:11 imx21 daemon.err klogd: SPI2:: drvInitParamsAndPowerOnAndConnect :Connect failed!&lt;br /&gt;
Jan  1 00:00:12 imx21 daemon.warn klogd: Motorola CSI Linux driver ver 0.1&lt;br /&gt;
Jan  1 00:00:12 imx21 daemon.warn klogd:  - Copyright (C) 2004 Motorola Inc&lt;br /&gt;
Jan  1 00:00:12 imx21 daemon.warn klogd: &lt;br /&gt;
Jan  1 00:00:12 imx21 daemon.info klogd: Driver SENSOR-1.29 (REFERENCED)&lt;br /&gt;
Jan  1 00:00:12 imx21 daemon.info klogd: i2c-client version : 1.9&lt;br /&gt;
Jan  1 00:00:12 imx21 daemon.info klogd: Initialize i2c-client-aic14 module&lt;br /&gt;
Jan  1 00:00:12 imx21 daemon.info klogd: Module i2c-client-aic14 initialized&lt;br /&gt;
Jan  1 00:00:12 imx21 daemon.alert klogd: Insert module aic14 (AIC14-1.0)&lt;br /&gt;
Jan  1 00:00:12 imx21 daemon.warn klogd: Module AIC14 assumes CODEC MCLK already configured for 20480000Hz&lt;br /&gt;
Jan  1 00:00:12 imx21 daemon.info klogd: Driver KPP-1.36 (REFERENCED)&lt;br /&gt;
Jan  1 00:00:13 imx21 daemon.info klogd: Driver DOZE-1.27 (REFERENCED)&lt;br /&gt;
Jan  1 00:00:14 imx21 daemon.err klogd: SPI2:: drvDoScan :Buero (bittorf)&lt;br /&gt;
Jan  1 00:00:15 imx21 daemon.err klogd: SPI2:: drvProcessScanCfm :Scan Confirm: Success 1 APs&lt;br /&gt;
Jan  1 00:00:15 imx21 daemon.info netsyncd[315]: creating FIFO_NETSYNC_HMON_NAME... &lt;br /&gt;
Jan  1 00:00:15 imx21 daemon.info netsyncd[315]: creating FIFO_HMON_NETSYNC_NAME... &lt;br /&gt;
Jan  1 00:00:18 imx21 daemon.err klogd: SPI2:: drvInitConnect :Req to connect to new WLAN network&lt;br /&gt;
Jan  1 00:00:18 imx21 daemon.err klogd: SPI2:: drvInitConnect :Disabling TX queue and setting CARRIER_OFF&lt;br /&gt;
Jan  1 00:00:18 imx21 daemon.err klogd: SPI2:: drvInitConnect :Connecting To AP...&lt;br /&gt;
Jan  1 00:00:18 imx21 daemon.err klogd: SPI2:: drvInitConnect :step2&lt;br /&gt;
Jan  1 00:00:19 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
Jan  1 00:00:19 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVNT_INIT_CONNECT; setting CARRIER_ON&lt;br /&gt;
Jan  1 00:00:19 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :netdev-&amp;gt;flags=0x00001003, IFF_UP=1&lt;br /&gt;
Jan  1 00:00:19 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :device was already opened; enabling queue&lt;br /&gt;
Jan  1 00:00:19 imx21 daemon.err klogd: SPI2:: drvInitConnect :step3 : u8Status 8&lt;br /&gt;
Jan  1 00:00:19 imx21 daemon.err klogd: SPI2:: drvInitConnect :step4&lt;br /&gt;
Jan  1 00:00:19 imx21 daemon.err klogd: SPI2:: drvInitConnect :Successful&lt;br /&gt;
Jan  1 00:00:19 imx21 daemon.err klogd: SPI2:: drvInitConnect :step6&lt;br /&gt;
Jan  1 00:00:19 imx21 daemon.err modprobe: modprobe: Can&#039;t locate module sound-slot-0&lt;br /&gt;
Jan  1 00:00:19 imx21 daemon.err modprobe: modprobe: Can&#039;t locate module sound-service-0-0&lt;br /&gt;
Jan  1 00:00:20 imx21 local0.debug dhcpcd[337]: broadcasting DHCP_DISCOVER &lt;br /&gt;
Jan  1 00:00:23 imx21 local0.debug dhcpcd[337]: DHCP_OFFER received from  (10.63.17.1) &lt;br /&gt;
Jan  1 00:00:23 imx21 local0.debug dhcpcd[337]: DHCP_ACK received from  (10.63.17.1) &lt;br /&gt;
Jan  1 00:00:23 imx21 daemon.err netsyncd[314]: father received(10) eth0 up! &lt;br /&gt;
Jan  1 00:00:23 imx21 daemon.info netsyncd[314]: Dhcp_start 337 return : 0  &lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC0 = 8&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC1 = 8&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC2 = 8&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC3 = 8&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC0 = 8&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC1 = 8&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC2 = 8&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC3 = 8&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvIoctl :PA Request&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvIoctl :No state change!&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvIoctl :Fast PS Request&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.info klogd: PhgHhalDoM2SDMA:1661:--&amp;gt;P1&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PS Ind (1) in Drvmain&lt;br /&gt;
Jan  1 00:00:28 imx21 daemon.info netsyncd[314]: Dhcp_stop 359 return : 0  &lt;br /&gt;
Jan  1 00:00:28 imx21 local0.debug dhcpcd[347]: sending DHCP_RELEASE for 10.63.17.5 to 10.63.17.1 &lt;br /&gt;
Jan  1 00:00:29 imx21 local0.err dhcpcd[347]: terminating on signal 1 &lt;br /&gt;
Jan  1 00:00:29 imx21 daemon.err netsyncd[314]: father received(12) eth0 down! &lt;br /&gt;
Jan  1 00:00:29 imx21 daemon.err klogd: SPI2:: drvStop :Driver Stop: disable TX queue! (usage: 2)&lt;br /&gt;
Jan  1 00:00:41 imx21 daemon.err klogd: SPI2:: drvIoctl :Deauth BSSID: 00:1d:7e:18:e3:89&lt;br /&gt;
Jan  1 00:00:41 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
Jan  1 00:00:41 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVENT_DISCONNECT; setting CARRIER_OFF&lt;br /&gt;
Jan  1 00:00:41 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :netdev-&amp;gt;flags=0x00000002, IFF_UP=0&lt;br /&gt;
Jan  1 00:00:41 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :device was already closed&lt;br /&gt;
Jan  1 00:00:41 imx21 daemon.err klogd: SPI2:: drvOpen :opening net device&lt;br /&gt;
Jan  1 00:00:41 imx21 daemon.err klogd: SPI2:: drvOpen :ERROR: Associated, but Carrier flag is set to CARRIER_OFF&lt;br /&gt;
Jan  1 00:00:41 imx21 daemon.err klogd: SPI2:: drvDoScan :Buero (bittorf)&lt;br /&gt;
Jan  1 00:00:42 imx21 daemon.err klogd: SPI2:: drvProcessScanCfm :Scan Confirm: Success 1 APs&lt;br /&gt;
Jan  1 00:00:45 imx21 daemon.err klogd: SPI2:: drvInitConnect :Req to connect to new WLAN network&lt;br /&gt;
Jan  1 00:00:45 imx21 daemon.err klogd: SPI2:: drvInitConnect :Disabling TX queue and setting CARRIER_OFF&lt;br /&gt;
Jan  1 00:00:45 imx21 daemon.err klogd: SPI2:: drvInitConnect :Connecting To AP...&lt;br /&gt;
Jan  1 00:00:45 imx21 daemon.err klogd: SPI2:: drvInitConnect :step2&lt;br /&gt;
Jan  1 00:00:46 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
Jan  1 00:00:46 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVNT_INIT_CONNECT; setting CARRIER_ON&lt;br /&gt;
Jan  1 00:00:46 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :netdev-&amp;gt;flags=0x00000003, IFF_UP=1&lt;br /&gt;
Jan  1 00:00:46 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :device was already opened; enabling queue&lt;br /&gt;
Jan  1 00:00:46 imx21 daemon.err klogd: SPI2:: drvInitConnect :step3 : u8Status 8&lt;br /&gt;
Jan  1 00:00:46 imx21 daemon.err klogd: SPI2:: drvInitConnect :step4&lt;br /&gt;
Jan  1 00:00:46 imx21 daemon.err klogd: SPI2:: drvInitConnect :Successful&lt;br /&gt;
Jan  1 00:00:46 imx21 daemon.err klogd: SPI2:: drvInitConnect :step6&lt;br /&gt;
Jan  1 00:00:46 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PS Ind (1) in Drvmain&lt;br /&gt;
Jan  1 00:00:54 imx21 local0.debug dhcpcd[386]: broadcasting DHCP_DISCOVER &lt;br /&gt;
Jan  1 00:00:57 imx21 local0.debug dhcpcd[386]: DHCP_OFFER received from  (10.63.17.1) &lt;br /&gt;
Jan  1 00:00:57 imx21 local0.debug dhcpcd[386]: DHCP_ACK received from  (10.63.17.1) &lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.info netsyncd[314]: Dhcp_start 386 return : 0  &lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.info netsyncd[314]: NTP server request on : ntp.xs4all.nl &lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.err klogd: SPI2:: drvIoctl :PA Request&lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.info klogd: PhgHhalDoM2SDMA:1661:--&amp;gt;P0&lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PS wake (0) in Drvmain&lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.warn klogd: drvSetWOWFilter: Enable UNICAST: Disable ARP: Enable&lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.warn klogd: Ip addr = 10.63.17.5. LMP=2&lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.err klogd: SPI2:: drvIoctl :PA Request&lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.err klogd: SPI2:: drvIoctl :No state change!&lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.err klogd: SPI2:: drvIoctl :Fast PS Request&lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.info klogd: PhgHhalDoM2SDMA:1661:--&amp;gt;P1&lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PS Ind (1) in Drvmain&lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.warn klogd: Sensor driver: initialize device OV7660&lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.warn klogd: Warning: Remapping obsolete /dev/fb* minor 32 to 1&lt;br /&gt;
Apr  7 09:58:16 imx21 daemon.info netsyncd[314]: NTP process return code : 0  &lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC0 = 4&lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC1 = 4&lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC2 = 4&lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC3 = 4&lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC0 = 4&lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC1 = 4&lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC2 = 4&lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC3 = 4&lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.err klogd: SPI2:: drvIoctl :PA Request&lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.info klogd: PhgHhalDoM2SDMA:1661:--&amp;gt;P0&lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PS wake (0) in Drvmain&lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.info upgraded[312]: K_SW0_DWNLD_ACK &lt;br /&gt;
Apr  7 09:58:27 imx21 auth.info login[393]: root login  on `ttyp0&#039; from `bittorf-AP.olsr&#039; &lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC0 = 8&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC1 = 8&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC2 = 8&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC3 = 8&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC0 = 8&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC1 = 8&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC2 = 8&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC3 = 8&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvIoctl :PA Request&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvIoctl :No state change!&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvIoctl :Fast PS Request&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.info klogd: PhgHhalDoM2SDMA:1661:--&amp;gt;P1&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PS Ind (1) in Drvmain&lt;br /&gt;
Apr  7 10:14:53 imx21 auth.info login[408]: root login  on `ttyp1&#039; from `bittorf-AP.olsr&#039; &lt;br /&gt;
Apr  7 10:17:18 imx21 syslog.info -- MARK --&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ausgabe von &amp;lt;b&amp;gt;&amp;lt;tt&amp;gt;/proc/cpuinfo&amp;lt;/tt&amp;gt;&amp;lt;/b&amp;gt; auf einem VP6500 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /proc/cpuinfo &lt;br /&gt;
Processor       : ARM926EJ-Sid(wb) rev 4 (v5EJl)&lt;br /&gt;
BogoMIPS        : 133.01&lt;br /&gt;
Features        : swp half thumb fastmult &lt;br /&gt;
CPU implementer : 0x41&lt;br /&gt;
CPU architecture: ?(8)&lt;br /&gt;
CPU variant     : 0x0&lt;br /&gt;
CPU part        : 0x926&lt;br /&gt;
CPU revision    : 4&lt;br /&gt;
Cache type      : undefined 14&lt;br /&gt;
Cache clean     : undefined 14&lt;br /&gt;
Cache lockdown  : undefined 14&lt;br /&gt;
Cache unified   : Harvard&lt;br /&gt;
I size          : 16384&lt;br /&gt;
I assoc         : 4&lt;br /&gt;
I line length   : 32&lt;br /&gt;
I sets          : 128&lt;br /&gt;
D size          : 16384&lt;br /&gt;
D assoc         : 4&lt;br /&gt;
D line length   : 32&lt;br /&gt;
D sets          : 128&lt;br /&gt;
&lt;br /&gt;
Hardware        : Freescale i.MX2 ADS&lt;br /&gt;
Revision        : 0000&lt;br /&gt;
Serial          : 0000000000000000&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Software Modifikationen ==&lt;br /&gt;
&lt;br /&gt;
=== Startscripts ===&lt;br /&gt;
Die Scripts in /etc/rc.d/&amp;quot; müssen im Hintergrund laufen. Tut ein Script das nicht, ist an dieser Stelle Schluß mit dem Bootvorgang.&lt;br /&gt;
&lt;br /&gt;
Dann darf man als nächstes den Lötkolben anheizen und die serielle Schnittstelle ([[#UART]]) zugänglich machen.&lt;br /&gt;
&lt;br /&gt;
=== Aktivierung WPA2 Unterstützung ===&lt;br /&gt;
&amp;lt;p&amp;gt;Standardmäßig kann das Telefon nur WPA, dabei unterstützt es allerdings auch &amp;lt;b&amp;gt;WPA mit AES&amp;lt;/b&amp;gt; Verschlüsselung.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Es gibt zwei verschiedene Tricks mit denen auch WPA2 aktiviert werden kann.&lt;br /&gt;
Allerdings wurde von einigen ein Einbruch der Verbindungsgeschwindigkeit festgestellt (scheint jedoch nur bei geringem Akkuladestand aufzutreten).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Trick1 ====&lt;br /&gt;
Mittels&lt;br /&gt;
 vi /etc/marvell/wpa_supplicant.conf&lt;br /&gt;
den Texteditor starten.&lt;br /&gt;
Mit PageDown (Bild runter) bis zum Ende des Files gehen.&lt;br /&gt;
Die Zeilen &lt;br /&gt;
 proto=WPA&lt;br /&gt;
 pairwise=TKIP&lt;br /&gt;
 group=TKIP&lt;br /&gt;
auskommentieren, indem ein # vorangestellt wird:&lt;br /&gt;
* cursor auf Beginn einer Zeile &lt;br /&gt;
* i drücken zum Einfügen&lt;br /&gt;
* # eintippen&lt;br /&gt;
* [Esc]&lt;br /&gt;
Sind alle Zeilen auskommentiert, dann mittels&lt;br /&gt;
 :wq[enter]&lt;br /&gt;
abspeichern und Editor verlassen.&lt;br /&gt;
&lt;br /&gt;
Danach neu booten.&lt;br /&gt;
&lt;br /&gt;
Anmerkung: Will man sich mit dieser Änderung in einem reinen WPA2 Netz anmelden (registrieren), kann man als Verschlüsselung nur noch WEP auswählen - der Verbindungsversuch scheitert natürlich! (Hardware: Fritz!Box 7270, PHILIPS VP5500)&lt;br /&gt;
&lt;br /&gt;
Also am Accesspoint WPA2 + WPA einstellen, Telefon registrieren, dann Accesspoint auf WPA2 konfigurieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;Achtung!&#039;&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Herumspielen an der wpa_supplicant.conf endet sehr schnell damit das man sich ausperrt&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Um sich eine Wiederbelebung per serieller Konsole zu ersparen, ist es günstig, immer nur Einträge an die wpa_supplicant.conf &amp;lt;u&amp;gt;hinten anzuhängen&amp;lt;/u&amp;gt;, niemals aber vorne einzufügen!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Trick2 ====&lt;br /&gt;
Dieser Trick funktioniert mit Accesspoints, bei denen man auch WPA Verbindungen mit AES verschlüsseln kann. Vorteil dieses Tricks ist, dass man die wpa_supplicant.conf nicht manuell editieren muss. Allerdings unterstützt nicht jeder Accesspoint WPA mit AES (aber dd-wrt kann das).&lt;br /&gt;
&lt;br /&gt;
Man konfiguriert den Accesspoint zunächst mit WPA PSK und wählt AES als Verschlüsselungsalgorithmus. Jetzt meldet man das Telefon an, das Telefon erkennt richtig, dass eine WPA Verbindung vorliegt und verbindet sich per WPA und AES mit dem Accesspoint. Anschliessend konfiguriert man den Accesspoint von WPA PSK AES nach WPA2 PSK AES. Jetzt schaltet man das VP5500/6500 aus und wieder ein. Nachdem es fertig gebootet hat, verbindet es sich automisch per WPA2 PSK und mit AES Verschlüsselung. Fertig.&lt;br /&gt;
&lt;br /&gt;
==== Versehentliche Aussperrung nach WPA2 Einstellversuch beheben ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. DON&#039;T PANIC!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Für den Fall das man sich den Zugangsweg per wireless abgeschnitten hat, gibt es, neben dem Bau eines seriellen Adapters und der Notwendigkeit zu löten, noch eine Variante um wieder auf das Telefon zu kommen:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;den Demo-Modus!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dieser Modus war dazu gedacht die Funktionalität der VPs ohne SIP-Server ausprobieren zu können. 2 Geräte starten dazu im WLAN-AdHoc-Modus mit unterschiedlichen IP&#039;s (192.168.10.1 + 192.168.10.2 , jeweils /24 = 255.255.255.0) und machen ein IBSS-Netzwerk mit WEP-Verschlüsselung auf (Key: VP6500 = 5648751265 beim VP5500 = 7295569793).&lt;br /&gt;
&lt;br /&gt;
Nun kann man auch ein einzelnes Telefon in den Demo-Modus versetzen (vorhandener neuer Menüeintrag nach dem rooten, oder per Tastenkombination &amp;quot;*#3 &amp;quot;), gibt sich eine passende WLAN und IP-Einstellungen auf dem Rechner und schon kann man wieder darauf connecten und Fehleinstellungen wieder beheben. Dummerweise wird eine zufällige IBSS-Cell-ID verwendet, aber neuere Betriebssysteme können der Zelle trotzdem beitreten. Als ESSID kann man &#039;&#039;demo_mode_obiwan&#039;&#039; verwenden.&lt;br /&gt;
&lt;br /&gt;
===== Schritt für Schritt Anleitung für Linux =====&lt;br /&gt;
&lt;br /&gt;
Einstellungen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;am Telefon&#039;&#039;&#039;&lt;br /&gt;
* Telefon anschalten und per Menüeintrag oder Tastenkombination &amp;quot;*#3&amp;quot; in Demomodus versetzen (z.B. als Einstellung Handset 1)&lt;br /&gt;
-&amp;gt; IP des Telefons wird danach zu 192.168.10.1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;am Computer&#039;&#039;&#039;&lt;br /&gt;
* Konsole öffnen&lt;br /&gt;
 per ifconfig checken welches das WLAN-Gerät am Rechner ist (im weiteren &amp;quot;wlan0&amp;quot; genannt)&lt;br /&gt;
 ifconfig wlan0 down&lt;br /&gt;
 iwconfig wlan0 mode ad-hoc (ad-hoc Modus aktivieren)&lt;br /&gt;
 iwconfig wlan0 essid &#039;demo_mode_obiwan&#039; (Passende essid-Kennung setzen)&lt;br /&gt;
 iwconfig wlan0 key 5648751265 (Key für das VP6500)&lt;br /&gt;
 ifconfig wlan0 up&lt;br /&gt;
 ifconfig wlan0 192.168.10.2 (setzen der IP)&lt;br /&gt;
&lt;br /&gt;
man kann nun mittels:&lt;br /&gt;
&lt;br /&gt;
 ping 192.168.10.1&lt;br /&gt;
&lt;br /&gt;
testen ob alles korrekt verlaufen ist und man eine Antwort bekommt - sollte das der Fall sein ist man &#039;&#039;&#039;fertig!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Nun kann man per telnet oder ssh, mit den üblichen Benutzerkennung und dem Passwort, auf die IP 192.168.10.1 connecten und die Probleme beheben.&lt;br /&gt;
&lt;br /&gt;
=== Menüs ===&lt;br /&gt;
==== Hauptmenu ====&lt;br /&gt;
&lt;br /&gt;
Das File &lt;br /&gt;
 /usr/local/etc/defaultbuttons.conf&lt;br /&gt;
enthält unter anderm die definition des Hauptmenus.&lt;br /&gt;
&lt;br /&gt;
Hierfür ist der Abschnitt Menu besonders interessant.&lt;br /&gt;
  [Menu]&lt;br /&gt;
  1 = Applications/camera.desktop&lt;br /&gt;
  2 = Applications/callhistory.desktop&lt;br /&gt;
  3 = Applications&lt;br /&gt;
  4 = Settings&lt;br /&gt;
  5 = Applications/addressbook.desktop&lt;br /&gt;
  6 = Settings/RingProfiles.desktop&lt;br /&gt;
  Columns = 3&lt;br /&gt;
  Default = 5&lt;br /&gt;
  Map = 123456789*0#&lt;br /&gt;
  Rows = 2&lt;br /&gt;
&lt;br /&gt;
&#039;Rows&#039; und &#039;Columns&#039; geben an, wieviel Reihen und Spalten das Hauptmenu hat.&lt;br /&gt;
Über die Zuweisungen 1 bis (Columns * Rows) kann man dann den Menüpositionen die Menüpunkte zuweisen.&lt;br /&gt;
Die Menupunkte sind definiert in den Verzeichnissen unter &lt;br /&gt;
 /usr/local/apps&lt;br /&gt;
gibt man nur ein Verzeichnis an, dann erscheint ein Submenü, dessen Icon und Name in der .directory -Datei des entsprechenden Ordner definiert ist.&lt;br /&gt;
direkte Menupunkte haben Dateinamen mit der Endung .desktop&lt;br /&gt;
&#039;Default&#039; bestimmten vorselektierten Eintrag.&lt;br /&gt;
&lt;br /&gt;
Hier ein weiteres Beispiel für ein angepasstes Menu:&lt;br /&gt;
  [Menu]&lt;br /&gt;
  1 = Applications/addressbook.desktop&lt;br /&gt;
  2 = Applications/callhistory.desktop&lt;br /&gt;
  3 = Applications/sysinfo.desktop&lt;br /&gt;
  4 = Applications&lt;br /&gt;
  5 = Settings&lt;br /&gt;
  6 = Games&lt;br /&gt;
  7 = Applications/camera.desktop&lt;br /&gt;
  8 = Applications/photoedit.desktop&lt;br /&gt;
  9 = Applications/manualsub.desktop&lt;br /&gt;
  Columns = 3&lt;br /&gt;
  Default = 5&lt;br /&gt;
  Map = 123456789*0#&lt;br /&gt;
  Rows = 3&lt;br /&gt;
&lt;br /&gt;
Der Ordner Games ist (momentan ;) leer.&lt;br /&gt;
&lt;br /&gt;
==== Genereller Aufbau Menü-Einträge ====&lt;br /&gt;
Die Einträge für die Menüs sind im Filesystem abgelegt:&lt;br /&gt;
&lt;br /&gt;
* Settings: /usr/local/apps/Settings&lt;br /&gt;
* Applications: /usr/local/apps/Applications&lt;br /&gt;
* Klingeltöne: /usr/local/etc/SystemRingTones/&lt;br /&gt;
&lt;br /&gt;
Die Dateien haben die Endung &amp;quot;.desktop&amp;quot; und sind normale Textdateien, die die relevanten Infos enthalten.&lt;br /&gt;
&lt;br /&gt;
Ein Beispiel aus dem Settingsordner:&lt;br /&gt;
  [Translation]&lt;br /&gt;
  File=QtopiaSettings&lt;br /&gt;
  Context=Sound&lt;br /&gt;
  [Desktop Entry]&lt;br /&gt;
  Type=Application&lt;br /&gt;
  Exec=sound&lt;br /&gt;
  Icon=Sound&lt;br /&gt;
  Name[]=Sound&lt;br /&gt;
  CanFastload=0&lt;br /&gt;
&lt;br /&gt;
Der Abschnitt &#039;Translation&#039; gibt an in welchem File, die Lokalisationsdaten stehen.&lt;br /&gt;
&lt;br /&gt;
Der Abschnitt &#039;Desktop Entry&#039;:&lt;br /&gt;
* Type: Typ des Eintrages &lt;br /&gt;
** Application für Anwendungen&lt;br /&gt;
** audio/x-wav für Klingeltöne&lt;br /&gt;
* Exec: Anwendung, die ausgeführt werden soll&lt;br /&gt;
* Icon: Icon, das im Menü benutzt wird. &lt;br /&gt;
** Pfad ist meist: /usr/local/pics/[Exex]/[Icon].png&lt;br /&gt;
** manchmal aber auch: /usr/local/pics/icons/[14x14|16x16|22x22]/[Icon].png&lt;br /&gt;
* Name[]: Name im Menü, wird über das in Translation angegebe File und Context aufgelöst. Dies wird verhindert, wenn die Klammern wegelassen werden, was das Einfügen eigener Einträge ermöglicht&lt;br /&gt;
&lt;br /&gt;
Hier ein Textfile mit allen desktop-Files als Referenz: [[File:alleDesktopFiles.txt]]&lt;br /&gt;
&lt;br /&gt;
==== Versteckte Menüeinträge ====&lt;br /&gt;
in den oben genannten Ordnern existieren ein paar Dateien mit der Endung &#039;.desktopMASK&#039;.&lt;br /&gt;
Benennt man diese um, werden die Einträge nach einem Neustart im Menü freigeschaltet.&lt;br /&gt;
&lt;br /&gt;
folgendes an der Kommandozeile eingeben:&lt;br /&gt;
 cd /usr/local/apps/Settings&lt;br /&gt;
 mv datetime.desktopMASK datetime.desktop&lt;br /&gt;
 mv callforward.desktopMASK callforward.desktop&lt;br /&gt;
 mv calloptions.desktopMASK calloptions.desktop&lt;br /&gt;
 mv resetparam.desktopMASK resetparam.desktop&lt;br /&gt;
 mv subkpncode.desktopMASK subkpncode.desktop&lt;br /&gt;
&lt;br /&gt;
Dies aktiviert folgende Optionen:&lt;br /&gt;
* Datums/Zeit-Einstellung&lt;br /&gt;
* Anrufweiterleitung&lt;br /&gt;
* Anrufoptionen&lt;br /&gt;
* Parameter zurücksetzen&lt;br /&gt;
* Number Switch&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die nützlichsten sind wohl die ersten Einträge.&lt;br /&gt;
Bei dem &amp;quot;Number Switch&amp;quot; ist unklar, was er bewirken soll. Beim Start wird ein Code abgefragt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Weiterhin kann im Verzeichnis /usr/local/apps/Applications eine [[File:demomode.desktop]] anlegen.&lt;br /&gt;
&lt;br /&gt;
Hierfür ist folgende Prozedur nötig:&lt;br /&gt;
* im Terminal&lt;br /&gt;
                 cd /usr/local/apps/Applications&lt;br /&gt;
                 vi demomode.desktop&lt;br /&gt;
&lt;br /&gt;
* i drücken &lt;br /&gt;
* folgendes Textfragment einfügen &lt;br /&gt;
                 [Translation]&lt;br /&gt;
                 File=QtopiaApplications&lt;br /&gt;
                 Context=DemoMode&lt;br /&gt;
                 [Desktop Entry]&lt;br /&gt;
                 Exec=demomode&lt;br /&gt;
                 Icon=Camera&lt;br /&gt;
                 Type=Application&lt;br /&gt;
                 Name[]=DemoMode&lt;br /&gt;
* [Esc] &lt;br /&gt;
* :wq [Enter] &lt;br /&gt;
&lt;br /&gt;
Dies schaltet einen Demo-Modus frei.&lt;br /&gt;
&lt;br /&gt;
===== Französisch =====&lt;br /&gt;
Es gab die Geräte wohl auch in Frankreich von der France Telekom.&lt;br /&gt;
Zumindest sind entsprechende monitor und upgrade Referenz-Dateien&lt;br /&gt;
vorhanden in denen das steht. Daher wohl auch die Französischen&lt;br /&gt;
Sprachdateien, die zwar auf dem Gerät sind, allerdings in einem&lt;br /&gt;
Unterverzeichnis, so das sie nicht auswählbar sind.&lt;br /&gt;
&lt;br /&gt;
Um diese Dateien zu aktivieren:&lt;br /&gt;
&lt;br /&gt;
 cd /usr/local/i18n&lt;br /&gt;
 mv NOTUSED/fr .&lt;br /&gt;
&lt;br /&gt;
Nun ist auch noch französisch als Sprache verfügbar.&lt;br /&gt;
&lt;br /&gt;
==== Eigene Menüeinträge ====&lt;br /&gt;
&lt;br /&gt;
Es besteht die Möglichkeit Menüeinträge anzulegen, durch die Shellskripte ausgeführt werden. Im Folgenden ist dieses Vorgehen am Beispiel des ein- und ausschaltens von SSH beschrieben.&lt;br /&gt;
&lt;br /&gt;
===== SSH aktivieren &amp;amp; deaktivieren =====&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Achtung! Folgendes Vorgehen kann das Gerät bricken, falls Telnet deaktiviert ist und irgendwas mit SSH schief läuft!&#039;&#039;&#039;&lt;br /&gt;
*Die folgenden beiden Dateien repräsentieren die Menüeinträge und rufen &#039;&#039;enablessh&#039;&#039; bzw. &#039;&#039;disablessh&#039;&#039; auf.&lt;br /&gt;
:*&#039;&#039;/usr/local/apps/Applications/enablessh.desktop&#039;&#039;:&lt;br /&gt;
 [Translation]&lt;br /&gt;
 File=QtopiaApplications&lt;br /&gt;
 Context=enablessh&lt;br /&gt;
 [Desktop Entry]&lt;br /&gt;
 Exec=enablessh&lt;br /&gt;
 Icon=Camera&lt;br /&gt;
 Type=Application&lt;br /&gt;
 Name[]=Enable SSH&lt;br /&gt;
:*&#039;&#039;/usr/local/apps/Applications/disablessh.desktop&#039;&#039;:&lt;br /&gt;
 [Translation]&lt;br /&gt;
 File=QtopiaApplications&lt;br /&gt;
 Context=disablessh&lt;br /&gt;
 [Desktop Entry]&lt;br /&gt;
 Exec=disablessh&lt;br /&gt;
 Icon=Camera&lt;br /&gt;
 Type=Application&lt;br /&gt;
 Name[]=Disable SSH&lt;br /&gt;
*&#039;&#039;enablessh&#039;&#039; und &#039;&#039;disablessh&#039;&#039; sind Shellskripte, die in &#039;&#039;/usr/local/bin/&#039;&#039; liegen und folgendes enthalten:&lt;br /&gt;
:*&#039;&#039;/usr/local/bin/enablessh&#039;&#039;:&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 touch /var/log/lastlog&lt;br /&gt;
 /etc/rc.d/init.d/S99dropbear restart&lt;br /&gt;
 exit(0)&lt;br /&gt;
:*&#039;&#039;/usr/local/bin/disablessh&#039;&#039;:&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 /etc/rc.d/init.d/S99dropbear stop&lt;br /&gt;
 exit(0)&lt;br /&gt;
*Nach einem Neustart des Telefons sollten im Menü &#039;&#039;Anwendungen&#039;&#039; die zwei neuen Menüpunkte auftauchen.&lt;br /&gt;
&lt;br /&gt;
=== Grafische Anpassungen ===&lt;br /&gt;
So gut wie alle Grafiken liegen im Verzeichnis /usr/local/pics und können beliebig ausgetauscht werden (gleicher Dateityp, gleiche Größe).&lt;br /&gt;
&lt;br /&gt;
Einige besonders interessante werden hier aufgeführt:&lt;br /&gt;
&lt;br /&gt;
===== Eigene Startup/Shutdown-Animation =====&lt;br /&gt;
&lt;br /&gt;
Die Animation beim Starten oder Herunterfahren sind normale (animierte) GIFs. Diese findet man in&lt;br /&gt;
&lt;br /&gt;
 /usr/local/pics/qpe&lt;br /&gt;
&lt;br /&gt;
Die Links &amp;quot;splash.gif&amp;quot; und &amp;quot;goodbye.gif&amp;quot; zeigen auf die tasächlich zu verwendenen Dateien (&amp;quot;splash-chuck.gif&amp;quot;, &amp;quot;goodby-chuck.gif&amp;quot;).&lt;br /&gt;
Man kann sein eigenes animiertes GIF im Format 176x220 Pixel raufladen und die&lt;br /&gt;
splash.gif entsprechend neu verlinken. Dazu löscht man zuerst die alte&lt;br /&gt;
mit:&lt;br /&gt;
&lt;br /&gt;
 rm /usr/local/pics/qpe/splash.gif&lt;br /&gt;
&lt;br /&gt;
Anschliessend erzeugt man den Link neu, dabei zeigt er dann auf die&lt;br /&gt;
eigene Datei:&lt;br /&gt;
&lt;br /&gt;
 ln -s /pfad/zur/eigenedatei.gif /usr/local/pics/qpe/splash.gif&lt;br /&gt;
&lt;br /&gt;
Danach wird dann bei jedem Neustart die eigene Animation angezeigt.&lt;br /&gt;
Analog hierzu mit der goodbye.gif.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Also, man packe das Bild auf einen Webserver. Dann am Gerät über telnet&lt;br /&gt;
anmelden und:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
cd /usr/local/pics/qpe/&lt;br /&gt;
wget http://dein.server/woauchimmer/Matrix5.gif&lt;br /&gt;
rm /usr/local/pics/qpe/splash.gif&lt;br /&gt;
ln -s Matrix5.gif splash.gif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die GIF Animation kann bis zu 176x220 Pixel groß sein.&lt;br /&gt;
Kleinere (möglicherweise auch größere) Bilder werden zentriert.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Bild:walking_baby_tux.gif&lt;br /&gt;
Bild:custwakeup2.gif&lt;br /&gt;
Bild:custgoodbye2.gif&lt;br /&gt;
Bild:94vw4.gif&lt;br /&gt;
Bild:1_Matrix--16984.gif&lt;br /&gt;
Bild:1_Matrix--16985.gif&lt;br /&gt;
Bild:3.gif&lt;br /&gt;
Bild:ClanSpider2.gif&lt;br /&gt;
Bild:TS12.gif&lt;br /&gt;
Bild:Matrix5.gif&lt;br /&gt;
Bild:qtopia3.gif&lt;br /&gt;
Bild:qtopia0.gif&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Eigener Boot/Update-Screen =====&lt;br /&gt;
&lt;br /&gt;
Der Boot-Screen, oder der Update-Screen liegen als Rohdaten vor.&lt;br /&gt;
 /user_data/data/welcome.rgb565&lt;br /&gt;
 /usr/local/startup_V4.20/update.bin&lt;br /&gt;
&lt;br /&gt;
Weitere Beispielbilder:&lt;br /&gt;
 /user_data/prod/data/lcd_test_card1.bin&lt;br /&gt;
 /user_data/prod/data/lcd_test_card2.bin&lt;br /&gt;
&lt;br /&gt;
Diese werden direkt in den Framebuffer geschrieben.&lt;br /&gt;
Daher müssen sich diese genau ein bestimmtes Format halten: &lt;br /&gt;
* Größe 240 x 220 (Das Display ist 176 x 220, der Rest ist also nicht zu sehen)&lt;br /&gt;
* 16bit pro Pixel RGB565&lt;br /&gt;
&lt;br /&gt;
Um solch ein Bild zu erstellen sind folgende Schritte notwendig:&lt;br /&gt;
# Ein Bild in Gimp mit 176x220 erstellen&lt;br /&gt;
# das Bild vertikal spiegeln&lt;br /&gt;
# Bild-&amp;gt;Leinwandgröße auf 240x220 erweitern (Bilddaten ganz nach links)&lt;br /&gt;
# Datei-&amp;gt;Kopie speichern...&lt;br /&gt;
# Als Windowsbitmap -&amp;gt; erweiterete Optionen -&amp;gt; 16bit R5G6B5&lt;br /&gt;
# BMP-Header entfernen (dies kann auch auf dem Telefon gemacht werden)&lt;br /&gt;
         tail -c 105600 input.bmp &amp;gt; output.raw&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Von der Kommandozeile kann auch manuell das Bild in den Framebuffer geschrieben werden.&lt;br /&gt;
 cat /user_data/prod/data/lcd_test_card1.bin &amp;gt; /dev/fb0&lt;br /&gt;
&lt;br /&gt;
=== Wichtige Verzeichnisse ===&lt;br /&gt;
&lt;br /&gt;
==== Adressdaten ====&lt;br /&gt;
&lt;br /&gt;
# cat /user_data/home/Applications/addressbook/addressbook.xml &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&amp;lt;!DOCTYPE Addressbook &amp;gt;&amp;lt;AddressBook&amp;gt;&lt;br /&gt;
  &amp;lt;Groups&amp;gt;&lt;br /&gt;
  &amp;lt;/Groups&amp;gt;&lt;br /&gt;
  &amp;lt;Contacts&amp;gt;&lt;br /&gt;
    &amp;lt;Contact&lt;br /&gt;
                                Uid=&amp;quot;-1269720893&amp;quot; &lt;br /&gt;
                         Categories=&amp;quot;-1269431263;-1266109093;-1266109094&amp;quot; &lt;br /&gt;
                          FirstName=&amp;quot;ich&amp;quot; &lt;br /&gt;
                             FileAs=&amp;quot;ich&amp;quot; &lt;br /&gt;
                           JobTitle=&amp;quot;cc&amp;quot; &lt;br /&gt;
                         Department=&amp;quot;dep&amp;quot;&lt;br /&gt;
                            Company=&amp;quot;aa&amp;quot; &lt;br /&gt;
                      BusinessPhone=&amp;quot;55&amp;quot; &lt;br /&gt;
                        BusinessFax=&amp;quot;77&amp;quot; &lt;br /&gt;
                     BusinessMobile=&amp;quot;66&amp;quot; &lt;br /&gt;
                          HomePhone=&amp;quot;55&amp;quot;&lt;br /&gt;
                         HomeMobile=&amp;quot;11&amp;quot; &lt;br /&gt;
                             HomePc=&amp;quot;12&amp;quot;&lt;br /&gt;
                           HomeData=&amp;quot;13&amp;quot;&lt;br /&gt;
                            HomeFax=&amp;quot;14&amp;quot;&lt;br /&gt;
                     BusinessStreet=&amp;quot;street&amp;quot;&lt;br /&gt;
                       BusinessCity=&amp;quot;city&amp;quot;&lt;br /&gt;
                      BusinessState=&amp;quot;state&amp;quot;&lt;br /&gt;
                        BusinessZip=&amp;quot;zip&amp;quot;&lt;br /&gt;
                    BusinessCountry=&amp;quot;country&amp;quot;&lt;br /&gt;
                      BusinessPager=&amp;quot;88&amp;quot;&lt;br /&gt;
                             Office=&amp;quot;office&amp;quot;&lt;br /&gt;
                         Profession=&amp;quot;prof&amp;quot;&lt;br /&gt;
                          Assistant=&amp;quot;ass&amp;quot;&lt;br /&gt;
                            Manager=&amp;quot;man&amp;quot;&lt;br /&gt;
                         HomeStreet=&amp;quot;ptjml&amp;quot;&lt;br /&gt;
                           HomeCity=&amp;quot;cit&amp;quot;&lt;br /&gt;
                          HomeState=&amp;quot;stat&amp;quot;&lt;br /&gt;
                            HomeZip=&amp;quot;zi&amp;quot;&lt;br /&gt;
                        HomeCountry=&amp;quot;coun&amp;quot;&lt;br /&gt;
                             Spouse=&amp;quot;spouse&amp;quot;&lt;br /&gt;
                             Gender=&amp;quot;1&amp;quot;&lt;br /&gt;
                           Birthday=&amp;quot;20100322&amp;quot;&lt;br /&gt;
                        Anniversary=&amp;quot;20100429&amp;quot;&lt;br /&gt;
                           Children=&amp;quot;child&amp;quot;&lt;br /&gt;
                              Notes=&amp;quot;gakm&amp;quot;&lt;br /&gt;
               CompanyPronunciation=&amp;quot;bb&amp;quot;&lt;br /&gt;
                   BUSINESS_CONTACT=&amp;quot;&amp;quot;&lt;br /&gt;
                          photofile=&amp;quot;ci-1269721575-0.jpg&amp;quot;&lt;br /&gt;
                   qdl-private-data=&amp;quot;&amp;quot;&lt;br /&gt;
                               tone=&amp;quot;/usr/local/etc/SystemRingTones/16-Tetris.desktop&amp;quot;&lt;br /&gt;
         /&amp;gt;&lt;br /&gt;
    &amp;lt;Contact Uid=&amp;quot;-1269554029&amp;quot; &lt;br /&gt;
             FirstName=&amp;quot;VoIP&amp;quot; &lt;br /&gt;
             LastName=&amp;quot;Phone1&amp;quot; &lt;br /&gt;
             FileAs=&amp;quot;VoIP Phone1&amp;quot; &lt;br /&gt;
             HomeMobile=&amp;quot;**621&amp;quot;  &lt;br /&gt;
             tone=&amp;quot;/usr/local/etc/SystemRingTones/15-Techno2.desktop&amp;quot;  /&amp;gt;&lt;br /&gt;
    &amp;lt;Contact Uid=&amp;quot;-1269554032&amp;quot; &lt;br /&gt;
             Categories=&amp;quot;-1269431263&amp;quot;&lt;br /&gt;
             FirstName=&amp;quot;VoIP&amp;quot; &lt;br /&gt;
             LastName=&amp;quot;Phone3&amp;quot; &lt;br /&gt;
             FileAs=&amp;quot;VoIP Phone3&amp;quot; &lt;br /&gt;
             HomeMobile=&amp;quot;**623&amp;quot;  &lt;br /&gt;
             BUSINESS_CONTACT=&amp;quot;&amp;quot; &lt;br /&gt;
             qdl-private-data=&amp;quot;&amp;quot; &lt;br /&gt;
             tone=&amp;quot;/usr/local/etc/SystemRingTones/08-Celtrelax.desktop&amp;quot;  /&amp;gt;&lt;br /&gt;
  &amp;lt;/Contacts&amp;gt;&lt;br /&gt;
  &amp;lt;/AddressBook&amp;gt;&lt;br /&gt;
&lt;br /&gt;
UID ist wohl egal, solange sie nicht zweimal vorkommen.&lt;br /&gt;
&lt;br /&gt;
Die Beschränkung auf 500 Adressbucheinträge kann man auch aufheben&lt;br /&gt;
&amp;quot;maxEntries = 500&amp;quot; in der &amp;quot;Contacts.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Kategorien stehen in /user_settings/Categories.xml:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&amp;lt;!DOCTYPE CategoryList&amp;gt;&lt;br /&gt;
  &amp;lt;Categories&amp;gt;&lt;br /&gt;
    &amp;lt;Category id=&amp;quot;-1269431263&amp;quot; name=&amp;quot;_Personal&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Category id=&amp;quot;-1269431262&amp;quot; name=&amp;quot;_Business&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/Categories&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man einem Kontakt eine bestimmte Kategorie zuordnet, dann wird die ID dieser Kategorie im Attribut &amp;quot;Categories&amp;quot; des Kontakts eingetragen (s.o.). Wenn die Kategorie BUSINESS gewählt wird, steht im Attribut &amp;quot;BUSINESS_CONTACT&amp;quot; eine &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Ein Einrücken der Attribute mit TABs in den Dateien ist übrigens nicht erlaubt!&lt;br /&gt;
&lt;br /&gt;
Die Software des Telefons wertet die XML Datei bei jedem Zugriff neu aus. Es ist also möglich, die Datei im laufendem Betrieb zu ändern (z.B. per Script).&lt;br /&gt;
&lt;br /&gt;
Um VCards in das XML Format zu konvertieren gibts es im Forum folgendes kleines C-Programm: [http://www.mikrocontroller.net/attachment/74583/VCardsToXML.c] [http://www.mikrocontroller.net/attachment/highlight/74583]&lt;br /&gt;
&lt;br /&gt;
==== Fotos &amp;amp; Videoschnappschüsse ====&lt;br /&gt;
&lt;br /&gt;
Alle Bilder die mit der Kamera aufgenommen werden, sowie Schnappschüsse die während eines Videocalls aufgenommen wurden, befinden sich in folgendem Verzeichnis:&lt;br /&gt;
       /user_data/home/Documents&lt;br /&gt;
&lt;br /&gt;
Die Bilder sind dabei nach folgendem Namensschema benannt:&lt;br /&gt;
&lt;br /&gt;
       DD-MM-YYYY-hh:mm:ss.jpg&lt;br /&gt;
&lt;br /&gt;
Tag (DD) und Monat (MM) können auch einstellig sein.&lt;br /&gt;
&lt;br /&gt;
=== Klingeltöne ===&lt;br /&gt;
&lt;br /&gt;
Die Klingeltöne liegen, wie oben beschrieben unter:&lt;br /&gt;
&lt;br /&gt;
/usr/local/etc/SystemRingTones/&lt;br /&gt;
&lt;br /&gt;
Es sind .wav Dateien mit (16Khz, 16Bit, Mono), welche sich z.B. mit MhWaveEdit (Linux/GTK) oder auch Audacity recht komfortabel erzeugen lassen.&lt;br /&gt;
&lt;br /&gt;
Auch .wav Dateien mit 22050Hz werden problemlos abgespielt (ein wenig bessere Qualität als 16000hz) und sind als Klingeltöne nutzbar. Dateien mit 44100Hz spielt es leider nur &#039;ruckelnd&#039; ab (32000Hhz nicht getestet).&lt;br /&gt;
&lt;br /&gt;
Zusätzlich zu den Audio Dateien müssen noch im selben Verzeichnis entsprechende *.desktop dateien angelegt werden, damit alles korrekt ins Menü integriert wird.&lt;br /&gt;
Eine für den fiktiven 16. Klingelton erzeugte Datei &amp;quot;16-Tetris.desktop&amp;quot; könnte den folgenden Inhalt haben:&lt;br /&gt;
&lt;br /&gt;
                 [Desktop Entry]&lt;br /&gt;
                 Categories =&lt;br /&gt;
                 File =16-Tetris.wav&lt;br /&gt;
                 Name[] =16-Tetris&lt;br /&gt;
                 Type = audio/x-wav&lt;br /&gt;
                 [Translation]&lt;br /&gt;
                 File=QtopiaRingTones&lt;br /&gt;
                 Context=16-Tetris&lt;br /&gt;
&lt;br /&gt;
Nach dem Anlegen der Dateien sollte sie dann im Menü auftauchen und auswählbar sein.&lt;br /&gt;
&lt;br /&gt;
=== Systemtöne ===&lt;br /&gt;
&lt;br /&gt;
*Sämtliche Systemtöne liegen unter &#039;&#039;/usr/local/sounds/&#039;&#039; und lassen sich problemlos durch andere Dateien ersetzen.&lt;br /&gt;
*z.B.:&lt;br /&gt;
**&#039;&#039;charge.wav&#039;&#039; - Ton, wenn Gerät in die Basisstation gesetzt wird&lt;br /&gt;
&lt;br /&gt;
=== Timeserver ===&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/topic/170483#1645101&lt;br /&gt;
Unter /usr/local/data steht in der monitor.cfg und monitor_ref_KPN.cfg&lt;br /&gt;
die Adressen der Zeitserver &amp;quot;ntp.xs4all.nl&amp;quot; und &amp;quot;130.142.110.71&amp;quot;. Diese&lt;br /&gt;
könnte man z.B. auf &amp;quot;ptbtime1.ptb.de&amp;quot; und &amp;quot;ptbtime2.ptb.de&amp;quot; ändern.&lt;br /&gt;
&lt;br /&gt;
(http://www.mikrocontroller.net/topic/170483#1649594)&lt;br /&gt;
das telefon benutzt *nicht ntp* sondern das time-protokoll auf port 37 -&lt;br /&gt;
time.fu-berlin.de (bzw. chronos.zedat.fu-berlin.de) kann man als server nehmen.&lt;br /&gt;
&lt;br /&gt;
vi Tipp hilfe:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
vi /usr/local/data/monitor.cfg&lt;br /&gt;
:%s/ntp.xs4all.nl/time.fu-berlin.de/g&lt;br /&gt;
:%s/130.142.110.71/130.133.1.10/g&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufgefallen ist, dass sich Telefone mit fest eingestellter IP nicht automatisch&lt;br /&gt;
die Uhrzeit abrufen. Stellt man das Telefon auf DHCP, stellt sich die Uhr&lt;br /&gt;
auch ohne Timeserver Modifikation auf die richtige Uhrzeit ein.&lt;br /&gt;
&lt;br /&gt;
Wer lieber einen NTP-Client einsetzen möchte findet unter dem Link für [[#Weitere_Konsolenkommandos]] ein Paket mit ntpd oder auch ntpdate für den schnellen Zeitabgleich via Konsole:&lt;br /&gt;
    ntpdate pool.ntp.org&lt;br /&gt;
&lt;br /&gt;
=== Zusätzliche Software ===&lt;br /&gt;
==== Dropbear (SSH-Server) installieren ====&lt;br /&gt;
&lt;br /&gt;
# Mit telnet auf dem Gerät einloggen&lt;br /&gt;
# folgendes in die Kommandozeile kopieren&lt;br /&gt;
       cd /&lt;br /&gt;
       wget http://www.mikrocontroller.net/attachment/74656/dropbear.tgz&lt;br /&gt;
       tar -xzf dropbear.tgz&lt;br /&gt;
       rm dropbear.tgz&lt;br /&gt;
       cd /etc/rc.d/init.d&lt;br /&gt;
       mv dropbear S90dropbear&lt;br /&gt;
       ./S90dropbear start&lt;br /&gt;
Das Kommando in Zeile 6 (mv ...) ist notwendig damit dropbear bei jedem Reboot automatisch gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Prüfen ob dropbear gestartet ist und läuft:&lt;br /&gt;
  # ps&lt;br /&gt;
  PID  Uid     Stat Command&lt;br /&gt;
  136 root     S    /usr/sbin/dropbear&lt;br /&gt;
&lt;br /&gt;
Bei jedem Login sucht dropbear nach der /var/log/lastlog, daher sollte man abschließend noch ein&lt;br /&gt;
&lt;br /&gt;
       touch /var/log/lastlog&lt;br /&gt;
&lt;br /&gt;
machen, um diese Datei anzulegen. Damit verschwinden auch die entsprechenden Fehlermeldungen im logread.&lt;br /&gt;
&lt;br /&gt;
==== Nano 2.2.3 installieren ====&lt;br /&gt;
&lt;br /&gt;
* Mit telnet auf dem Gerät einloggen&lt;br /&gt;
* folgendes in die Kommandozeile kopieren&lt;br /&gt;
       cd /usr/bin&lt;br /&gt;
       wget http://www.mikrocontroller.net/attachment/74023/nano&lt;br /&gt;
* Mit folgendem Befehl den Editor ausführbar machen:&lt;br /&gt;
       chmod +x /usr/bin/nano&lt;br /&gt;
* Nun ist vi Geschichte ;-)&lt;br /&gt;
&lt;br /&gt;
Ggf. kann der Fehler &amp;quot;Error opening terminal: xterm-color&amp;quot; auftreten wenn nano gestartet wird, in diesem Fall hilft folgendes:&lt;br /&gt;
&lt;br /&gt;
* /root/.bashrc öffnen (mit vi :-)&lt;br /&gt;
* &amp;quot;export TERM=xterm&amp;quot; in die Datei schreiben&lt;br /&gt;
* ausloggen / einloggen&lt;br /&gt;
&lt;br /&gt;
==== OpenVPN 2.0.9 installieren ====&lt;br /&gt;
&lt;br /&gt;
* Mit telnet auf dem Gerät einloggen&lt;br /&gt;
* folgendes in die Kommandozeile kopieren&lt;br /&gt;
       cd /&lt;br /&gt;
       wget http://www.mikrocontroller.net/attachment/74380/openvpn.tar.gz&lt;br /&gt;
       tar -xzf openvpn.tar.gz&lt;br /&gt;
       depmod&lt;br /&gt;
       mknod /dev/net/tun c 10 200&lt;br /&gt;
&lt;br /&gt;
==== OpenVPN 2.1.1 installieren ====&lt;br /&gt;
&lt;br /&gt;
* Mit telnet auf dem Gerät einloggen&lt;br /&gt;
* folgendes in die Kommandozeile kopieren&lt;br /&gt;
       cd /&lt;br /&gt;
       wget http://www.mikrocontroller.net/attachment/74395/openvpn-2.1.1.tar.gz&lt;br /&gt;
       tar -xzf openvpn-2.1.1.tar.gz&lt;br /&gt;
       depmod&lt;br /&gt;
       mknod /dev/net/tun c 10 200&lt;br /&gt;
&lt;br /&gt;
==== Tinc 1.0.12 installieren ====&lt;br /&gt;
&lt;br /&gt;
* Mit telnet auf dem Gerät einloggen&lt;br /&gt;
* folgendes in die Kommandozeile kopieren&lt;br /&gt;
       cd /&lt;br /&gt;
       wget http://www.mikrocontroller.net/attachment/74396/tinc-1.0.12.tar.gz&lt;br /&gt;
       tar -xzf tinc-1.0.12.tar.gz&lt;br /&gt;
       depmod&lt;br /&gt;
       mknod /dev/net/tun c 10 200&lt;br /&gt;
&lt;br /&gt;
==== Weitere Konsolenkommandos ====&lt;br /&gt;
&lt;br /&gt;
Auf http://thinksilicon.de/57/Hacking-the-VP6500.html finden sich einige nützliche Konsolentools. Darunter sind bc, lsof, file, curl, mc (bzw. mcedit), hexedit, mktemp, rsync, tcpdump, crond (mit crontab) und ntpd.&lt;br /&gt;
* Hinweis zu tcpdump; muss folgendermaßen ausgeführt werden:&lt;br /&gt;
       tcpdump -U root&lt;br /&gt;
&lt;br /&gt;
=== simpler WLAN-Switcher ===&lt;br /&gt;
&lt;br /&gt;
Ohne tiefer gehende GUI-Programmiererfahrungen bei Qtopia zu haben, kann man sich mit folgendem WLAN-Switcher behelfen:&lt;br /&gt;
&lt;br /&gt;
Im Script /user_data/prod/config_ats.sh stehen viele Befehle, wie man mittels &#039;&#039;config code&#039;&#039; Einstellungen vorschreiben kann. Dies habe ich mir mit folgenden eigenen Scripten zu nutze gemacht:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;/root/switch_wlan.sh&#039;&#039;&#039;&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 #================================================&lt;br /&gt;
 # WLAN-Switcher&lt;br /&gt;
 #================================================&lt;br /&gt;
 &lt;br /&gt;
 CONFIG_CODE=`cat /user_data/config_code.txt`&lt;br /&gt;
 &lt;br /&gt;
 cp -f /usr/local/data/wpa_supplicant_ref_${CONFIG_CODE}.conf /user_data/wifi/wpa_supplicant.conf&lt;br /&gt;
&lt;br /&gt;
* kopiert Anhand des &#039;&#039;config code&#039;&#039;s die wpa_supplicant.conf&lt;br /&gt;
* es muss für jeden &#039;&#039;config code&#039;&#039; eine wpa_supplicant_ref_&amp;lt;&#039;&#039;config code&#039;&#039;&amp;gt;.conf vorhanden sein, am besten dazu die aktuelle /user_data/wifi/wpa_supplicant.conf dorthin kopieren&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;/root/set_config_code.sh&#039;&#039;&#039;&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 echo &amp;quot;$1&amp;quot; &amp;gt; /user_data/config_code.txt&lt;br /&gt;
&lt;br /&gt;
* schreibt den ersten übergebenen Parameter in die Datei /user_data/config_code.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;/usr/local/bin/set2XXX&#039;&#039;&#039;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 /root/set_config_code.sh XXX&lt;br /&gt;
 /root/switch_wlan.sh&lt;br /&gt;
 reboot&lt;br /&gt;
&lt;br /&gt;
* XXX durch den &#039;&#039;config code&#039;&#039; ersetzen&lt;br /&gt;
* Script, welches als Applikation gestartet wird&lt;br /&gt;
* derzeit leider keine &amp;quot;on-the-fly&amp;quot;-Eingabe des &#039;&#039;config code&#039;&#039;s möglich, daher muss für jedes WLAN ein Script vorhanden sein&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;/usr/local/apps/Applications/set2YYY.desktop&#039;&#039;&#039;&lt;br /&gt;
 [Translation]&lt;br /&gt;
 File=QtopiaApplications&lt;br /&gt;
 Context=set2XXX&lt;br /&gt;
 [Desktop Entry]&lt;br /&gt;
 Exec=set2XXX&lt;br /&gt;
 Icon=Camera&lt;br /&gt;
 Type=Application&lt;br /&gt;
 Name[]=Enable YYY&lt;br /&gt;
&lt;br /&gt;
* XXX durch den &#039;&#039;config code&#039;&#039; ersetzen (gleicher Scriptname wie oben)&lt;br /&gt;
* YYY durch einmaligen Namen ersetzen&lt;br /&gt;
* Diese Datei erscheint unter dem Name[] im Applications-Menü&lt;br /&gt;
&lt;br /&gt;
Theoretisch kann man mit dieser Methode auch problemlos zwischen mehreren SIP-Einstellungen und vielen weiteren Telefoneinstellungen umschalten (siehe Dateien in /usr/local/data) - der DemoMode funktioniert nach dem gleichen Prinzip.&lt;br /&gt;
&lt;br /&gt;
== Buildumgebung erstellen ==&lt;br /&gt;
&lt;br /&gt;
Bislang ist die Erstellung von GUI-Applikationen (QTopia) noch nicht auf einfache Weise möglich. Das größte Problem ist, dass der Quellcode der Video-Telefon-Anwendung zum größten Teil zur Verfügung steht. Das Erstellen von Kommandozeilen-Anwendungen geht aber schon problemlos.&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
Die verwendete ARM-Entwicklungsumgebung basiert auf gcc. Mittels cygwin kann diese zwar auch als Win32-Anwendungen gebaut werden, dies ist aber in hohem Maß unüblich.&lt;br /&gt;
&lt;br /&gt;
Am besten eine aktuelle Version von Debian oder Ubuntu in &amp;quot;vmware player&amp;quot; oder &amp;quot;virtual box&amp;quot; installieren. Wenn man die virtuelle Maschine nur zum Compilieren verwendet, reicht eine kompakte Kommandozeilen-Version (z.B. Ubuntu Server 9.10). Fertige virtuelle Machinen, im vmware-Marketing-Sprech gerne auch &amp;quot;virtual appliances&amp;quot; genannt, sind reichlich verfügbar (z.B. http://www.vmware.com/appliances/directory/70918).&lt;br /&gt;
&lt;br /&gt;
=== Freetz-Linux ===&lt;br /&gt;
Für Fritzbox-Besitzer besonders geeignet ist das Freetz-linux, welches man im IP-Phone-Forum finden kann (-&amp;gt; http://www.ip-phone-forum.de/showpost.php?p=1400234&amp;amp;postcount=1).&lt;br /&gt;
Dieses kann zum Erstellen von Freetz-Images einerseits und andererseits als Buildumgebung benutzt werden. So spart man sich eine zweite VM.&lt;br /&gt;
&lt;br /&gt;
Die VM selbst braucht nur gestartet werden, den Rest macht man am Besten von seiner gewohnten Umgebung aus.&lt;br /&gt;
Mittels Samba kann einfach per Windowsnetzwerk auf das Home-Verzeichnis zugriffen werden und per SSH kann einfach eine Shell (UTF als Codierung einstellen, dann stimmen auch die Sonderrzeichen) geöffnet werden.&lt;br /&gt;
Es muss sichergestellt werden sein, dass die VM zugriff auf das lokale Netzwerk, sowie das Internet hat (am besten mit einem &#039;ping google.com&#039; überprüfen). Bei mir ging es eigenartiger weise erst, als ich die virtuelle Netzwerkkarte in den VM-Settings auf NAT gestellt habe.&lt;br /&gt;
&lt;br /&gt;
Benutzername und alle Kennwörter sind &#039;freetz&#039;&lt;br /&gt;
&lt;br /&gt;
==== Installation und Test der VP5500 Toolchain ====&lt;br /&gt;
Installation der Buildumgebung:&lt;br /&gt;
  sudo mkdir -p /opt/VP5500/toolchain&lt;br /&gt;
  cd /opt/VP5500/toolchain&lt;br /&gt;
  sudo wget http://www.handhelds.org/download/projects/toolchain/arm-linux-gcc-3.3.2.tar.bz2&lt;br /&gt;
  sudo tar xjf arm-linux-gcc-3.3.2.tar.bz2&lt;br /&gt;
  sudo rm arm-linux-gcc-3.3.2.tar.bz2&lt;br /&gt;
  sudo ln -s /opt/VP5500/toolchain/usr/local/arm /usr/local/arm&lt;br /&gt;
&lt;br /&gt;
Nach einem sudo-Kommando muss eventuell das Passwort eingegeben werden, weswegen die Befehle einzeln eingegeben werden sollten (oder man öffnet am Anfang eine sudo shell, dann kann man das auch weglassen.&lt;br /&gt;
&lt;br /&gt;
Test der Buildumgebung:&lt;br /&gt;
  cd ~&lt;br /&gt;
  wget http://www.mikrocontroller.net/attachment/73161/helloworld.tgz&lt;br /&gt;
  tar -xzf helloworld.tgz&lt;br /&gt;
  rm helloworld.tgz&lt;br /&gt;
  cd helloworld&lt;br /&gt;
  make&lt;br /&gt;
Dannach sollte im ~/helloworld verzeichnis ein neues executable liegen, was vom Hostrechner einfach via Netzwerkfreigabe (\\freetz-linux\helloworld) und via WinSCP auf das Telefon kopiert werden kann.&lt;br /&gt;
&lt;br /&gt;
==== Freetz-Linux eigentlicher Anwendungszweck ====&lt;br /&gt;
wer das Ding auch zum Bauen von Freetz-Images zum Erweitern seiner Fritz-box benutzen will muss sich zuerst ein Freetz runterladen.&lt;br /&gt;
Folgende Schritte machen dies:&lt;br /&gt;
 cd ~&lt;br /&gt;
 svn checkout  http://svn.freetz.org/trunk  freetz-trunk &lt;br /&gt;
Dannach gibts im Home-Verzeichnis das aktuelle Freetz im Verzeichnis &#039;freetz-trunk&#039;.&lt;br /&gt;
Konfigurieren mit &#039;make menuconfig&#039; und Image erstellen mit &#039;make&#039;.&lt;br /&gt;
Wenn alles gut geht kann man das image dann vom Hostrechner aus der Windowsfreigabe &#039;\\freetz-linux\freetz-trunk\images&#039; rausholen und auf die Box spielen.&lt;br /&gt;
&lt;br /&gt;
Für detailiertere Infos bitte direkt bei Freetz nachschlagen:&lt;br /&gt;
http://trac.freetz.org/&lt;br /&gt;
&lt;br /&gt;
=== Linux ===&lt;br /&gt;
Die bisher bekannten, mit VP5500 und VP6500 ausgelieferten Software-Versionen, basieren auf einer etwas älteren &amp;quot;gcc 3.3.2-ARM-Toolchain&amp;quot;. Eine passende Toolchain für ein x86-basiertes Entwicklungssystem ist unter http://www.handhelds.org/download/projects/toolchain/arm-linux-gcc-3.3.2.tar.bz2 zu finden.&lt;br /&gt;
&lt;br /&gt;
Unter Debian-basierten Linux-Distros kann dieses Archiv z.B. nach /opt/VP5500/toolchain entpackt werden (einige der Makefiles im Forum setzen diesen Speicherort voraus). Es ist jedoch zu beachten, dass diese Version der Toolchain auch über den Pfad /usr/local zugänglich sein sollte. Dazu kann mittels &amp;quot;ln -s /opt/VP5500/toolchain/usr/local/arm arm&amp;quot; in /usr/local ein Symlink auf den eigentlichen Speicherort gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
==== Hello World ====&lt;br /&gt;
Christian Klippel (ChrisK) hat unter http://www.mikrocontroller.net/attachment/73161/helloworld.tgz ein &amp;quot;Hello World&amp;quot; bereitgestellt, mit dem sich die Toolchain testen lässt und dessen &amp;quot;Makefile&amp;quot; und &amp;quot;Makefile.local&amp;quot; als Grundlage für eigene Versuche dienen kann.&lt;br /&gt;
&lt;br /&gt;
Das Archiv wird in ein lokals Verzeichnis (z.b. ~/helloworld) entpackt und dort durch Eingabe von &amp;quot;make&amp;quot; compiliert.&lt;br /&gt;
     &lt;br /&gt;
Zum Testen muss das Binary natürlich auf das Zielsystem übertragen werden. Wenn auf dem Entwicklungssystem ein http-Server oder ein ssh-Server läuft, kann man das Binary einfach in ein darüber zugängliches Verzeichnis kopieren es anschließend in einer telnet-Sitzung vom Verzeichnis /tmp aus mittels wget oder scp laden. Zum Test muss die Datei mittels &amp;quot;chmod +x helloworld&amp;quot; ausführbar gemacht werden, bevor sie mit &amp;quot;./helloworld&amp;quot; ausgeführt werden kann.&lt;br /&gt;
&lt;br /&gt;
Mittels eines ftpd (z.B. http://www.mikrocontroller.net/attachment/73780/troll-ftpd_1.28-cg2_arm.tgz) oder sshd (z.B. Dropbear von http://vp6500.bd8.nl/) auf dem Zielsystem, kann man das Kopieren auch vom Entwicklungssystem aus durchführen.&lt;br /&gt;
&lt;br /&gt;
==== Anpassen kleinerer Konsolen-Tools auf Cross-Compilierung ====&lt;br /&gt;
Die Makefiles von kleineren Projekten sind häufig nicht so sauber aufgebaut wie das helloworld-Beispiel, so dass man sie leichter ersetzt, als ändert. Am Beispiel von micro_httpd (http://www.acme.com/software/micro_httpd/ , http://www.mikrocontroller.net/attachment/73175/micro_httpd.tar.gz) kann leicht nachvollzogen werden, wie man den modularen Ansatz vom &amp;quot;Hello World&amp;quot;-Beispiel übernehmen kann (Makefile -&amp;gt; Makefile + Makefile.local).&lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
&lt;br /&gt;
== Hardware  + Software Versionen ==&lt;br /&gt;
&lt;br /&gt;
Listet mal eure Hardware- und Softwareversion aus dem &#039;&#039;&#039;Applications&#039;&#039;&#039; =&amp;gt; &#039;&#039;&#039;System Info&#039;&#039;&#039; Menü auf, wenn sie hier noch nicht stehen!&lt;br /&gt;
&lt;br /&gt;
=== VP5500 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Hardware Version             !! Date     !! Software Version   &lt;br /&gt;
|- &lt;br /&gt;
| ind5                         ||0645      || 4.20&lt;br /&gt;
|- &lt;br /&gt;
| ind5                         ||0647      || 4.20&lt;br /&gt;
|-&lt;br /&gt;
| ind5                         ||0648      || 4.20&lt;br /&gt;
|-&lt;br /&gt;
| ind5                         ||0649      || 4.20&lt;br /&gt;
|-&lt;br /&gt;
| ind5                         ||0702      || 4.20&lt;br /&gt;
|-&lt;br /&gt;
| ind5                         ||0703      || 4.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== VP6500 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Hardware Version             !! Date     !! Software Version   &lt;br /&gt;
|-&lt;br /&gt;
| ind3-v2                      || 0711     || 3.22&lt;br /&gt;
|-&lt;br /&gt;
| ind3-v2                      || 0713     || 3.22&lt;br /&gt;
|- &lt;br /&gt;
| ind3-v2                      || 0716     || 3.22&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Wünsche und Nutzungsideen =&lt;br /&gt;
&lt;br /&gt;
Wer was äußern möchte, kann das hier reintippeln, zwecks Bündelung Interessen und Kräfte. Muss ja keiner das Rad 3x erfinden und man kann schaun was der ein oder andere macht.&lt;br /&gt;
Eine Status und Kontaktangabe bei Sachen die in Arbeit sind wäre toll.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
* Audiostream-Player&lt;br /&gt;
* MP3&lt;br /&gt;
** madplay gibt es [http://www.mikrocontroller.net/topic/172616#1704777 hier], der automatische Stromsparmodus stört aber noch&lt;br /&gt;
* Browser und sei es nur für Wikipedia und Google&lt;br /&gt;
* Mailclient&lt;br /&gt;
* T9 Unterstützung bei Texteingabe&lt;br /&gt;
* Skypebenutzung&lt;br /&gt;
* Nutzungsmöglichkeit als Wireless-Webcam&lt;br /&gt;
* WLAN-Repeater&lt;br /&gt;
** besser: [http://freifunk.net Freifunk-] bzw. [http://www.olsr.org OLSR-Daemon]&lt;br /&gt;
* Wecker&lt;br /&gt;
* Voice-Crypto&lt;br /&gt;
* Unterstützung von mehreren WLAN Profilen, damit man das Gerät an mehreren APs betreiben kann ohne jedesmal SSID / Key neu eingeben zu müssen. (Sollte durch mehrere Einträge in der wpa_supplicant.conf möglich sein. Diese wird aber bei Änderungen über&#039;s Menü komplett überschrieben. Alternative: [[#simpler WLAN-Switcher]])&lt;br /&gt;
* Unterstützung von mehreren SIP Profilen, um z.b. von einem SIP-Anbieter auf den anderen zu wechseln. Ideal wäre, wenn man 2 SIP Profile gleichzeitig nutzen könnte&lt;br /&gt;
* YouTube Client, vgl. mit &amp;quot;MiniTube Linux&amp;quot;&lt;br /&gt;
* &#039;ne aktuelle Firmware? z.B: mit 2.6er Kernel und Android?&lt;br /&gt;
* Unterstützung für WLANs mit 802.1x die WPA2 verschlüsselt sind reparieren bzw. passende Konfig finden (unverschlüsselt geht schon)&lt;br /&gt;
&lt;br /&gt;
== Hardwarerweiterungen ==&lt;br /&gt;
&lt;br /&gt;
* Speichererweiterung&lt;br /&gt;
* USB Anschluss&lt;br /&gt;
* Blauzahn&lt;br /&gt;
* zusätzlicher Anschluss um eine andere Videokamera anzuschließen mit CINCH&lt;br /&gt;
&lt;br /&gt;
== Nutzungsideen ==&lt;br /&gt;
&lt;br /&gt;
* VoIP Phone und Webcam (nahliegend)&lt;br /&gt;
* WLAN-Finder&lt;br /&gt;
* Repeater&lt;br /&gt;
* mobiles Infogerät mit Wikizugriff und Mailpush in der Wireless-Bubble&lt;br /&gt;
* Türöffner, Ferncontroller&lt;br /&gt;
* Robohirn&lt;br /&gt;
* WLAN-Radio&lt;br /&gt;
* Video(Streaming)-Client in Verbindung mit VDR&lt;br /&gt;
* Barcode-Reader&lt;br /&gt;
* als Fernbedienung für PC (Winamp/Mediaplayer/VLC...&lt;br /&gt;
* Streamclient und Fernbedienung für DBOX2 mit Linux&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Projekte]]&lt;br /&gt;
[[Kategorie:Datenübertragung]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=PHILIPS_VP5500_VoIP_Telefon&amp;diff=77729</id>
		<title>PHILIPS VP5500 VoIP Telefon</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=PHILIPS_VP5500_VoIP_Telefon&amp;diff=77729"/>
		<updated>2013-07-26T17:23:59Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Änderung 77728 von 124.95.162.210 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Verwandte Artikel =&lt;br /&gt;
* Konfiguration: http://www.mikrocontroller.net/topic/170483#new&lt;br /&gt;
* Kernel/GUI Entwicklung: http://www.mikrocontroller.net/topic/172616#new&lt;br /&gt;
* http://das-labor.org/wiki/VP5500&lt;br /&gt;
* (Hack) http://spritesmods.com/?art=vpx500&lt;br /&gt;
* http://vp6500.bd8.nl/&lt;br /&gt;
&lt;br /&gt;
= Allgemeines =&lt;br /&gt;
&lt;br /&gt;
Bei den diesem Text zugrundeliegenden Geräten handelt es sich um videofähige VoIP-Phones des Herstellers Philips, die vom früheren holländischen Anbieter KPN vertrieben wurden und nach dessen Ausscheiden aus dem Markt nun günstig erhältlich sind.&lt;br /&gt;
Ihr geringer Preis, die SoC-Architektur und das darauf laufende OS macht sie dabei für all jene interessant, die ihre eigenen Ideen und Projekte auf der Basis eines solchen Gerätes verwirklichen wollen, und gibt den oft fabrikneuen Exemplaren eine Art zweite Chance.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
=== VP5500 ===&lt;br /&gt;
* Kamera-Auflösung 640x480 Pixel&lt;br /&gt;
* 30 Bilder pro Sekunde&lt;br /&gt;
* Kamera um 240° drehbar&lt;br /&gt;
* 5,6 cm (2,2&amp;quot;) TFT-Display, 176x220 Pixel, 65000 Farben&lt;br /&gt;
* Audio-/Video-Ausgang - 4fach 2,5mm Klinke-Cinch&lt;br /&gt;
* integrierter Li-Ion Akku, 3,7 V-/1100 mAh&lt;br /&gt;
* englische und niederländische Menüsprache&lt;br /&gt;
* Software Qtopia Version 2.1.0&lt;br /&gt;
* Maße (LxBxH): 134x49x24 mm.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Philips_VP5500.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== VP6500 ===&lt;br /&gt;
&lt;br /&gt;
* Kamera-Auflösung 640x480 Pixel&lt;br /&gt;
* 30 Bilder pro Sekunde&lt;br /&gt;
* Kamera um 240° drehbar&lt;br /&gt;
* 5,6 cm (2,2&amp;quot;) TFT-Display, 176x220 Pixel, 65000 Farben&lt;br /&gt;
* Audio-/Video-Ausgang - 4fach 3,5mm Klinke-Cinch&lt;br /&gt;
* 2x Philips Multilife AA/R6NM 1800mAh NiMH-Akkus, je 1,2V, Ladeempfehlung: 15h mit 180mAh&lt;br /&gt;
* englische, deutsche und niederländische Menüsprache&lt;br /&gt;
* Software Qtopia Version 2.1.0&lt;br /&gt;
* Maße (LxBxH): 134x49x24 mm.&lt;br /&gt;
* Gewicht Mobilteil: 170 g (inkl. 2 NiMH-Akkus AA)&lt;br /&gt;
[[Bild:VP6500_kl.jpg]]&lt;br /&gt;
&lt;br /&gt;
= Das VPx500 &#039;rooten&#039; =&lt;br /&gt;
&lt;br /&gt;
Um vollen Zugang zum System auf dem Gerät zu erhalten gibt es mehrere Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
== per telnet ==&lt;br /&gt;
Sobald das Telefon im Netzwerk angemeldet ist (egal ob DHCP oder statisch) kann über irgendein Terminal vom Netzwerk aus via telnet und der Telefon-IP auf das Gerät zugegriffen werden.&lt;br /&gt;
User: root / PW: toor&lt;br /&gt;
&lt;br /&gt;
== per serieller Schnittstelle ==&lt;br /&gt;
Dazu muß der [[#UART]] angeschlossen werden. Während des Bootvorgangs drückt man immer wieder ziellos irgendwelche Tasten bis man am Prompt des [http://www.lartmaker.nl/lartware/blob/ blob-Bootloaders] ist.&lt;br /&gt;
Dann kann man &lt;br /&gt;
 boot root=/dev/mtdblock2 init=/bin/sh&lt;br /&gt;
eingeben, um an eine minimale Shell zu kommen.&lt;br /&gt;
&lt;br /&gt;
In dieser setzt man dann mit &lt;br /&gt;
 passwd&lt;br /&gt;
das Passwort für &#039;&#039;root&#039;&#039;. Danach kann man sich als &#039;&#039;root&#039;&#039; mit dem gesetzten Passwort einloggen.&lt;br /&gt;
&lt;br /&gt;
== per DNS-Hack ==&lt;br /&gt;
Um den Rootzugriff zu aktivieren, wird dem Telefon ein Softwareupdate vorgegaukelt. Es versucht, auf den Updateserver von KPN zuzugreifen (den es nicht mehr gibt). Glücklicherweise geschieht dies nicht über eine feste IP, sondern über einen Hostnamen, so dass man an dieser Stelle sich durch einen eigenen DNS den Domainname auf einen eigenen Server umleiten kann. Daher ist im eigenen Netzwerk eine Umleitung des DNS erforderlich (oder ein DHCP-Server, der die Adresse des DNS bekanntgibt. Stichworte &#039;Static DNS&#039;, ..).&lt;br /&gt;
Das Gerät holt sich dann ein Updatepaket, das den Telnet-Zugang aktiviert.&lt;br /&gt;
&lt;br /&gt;
Dann lässt sich per Terminal (Linux. Windows: ....) die Kommandozeile des Geräts aufrufen:&lt;br /&gt;
&lt;br /&gt;
 telnet 123.456.789.012&lt;br /&gt;
&lt;br /&gt;
Passwort ist &amp;quot;toor&amp;quot;.&lt;br /&gt;
Das Ändern des root-Passwortes erfolgt mit dem Befehl passwd.&lt;br /&gt;
&lt;br /&gt;
Unter Applications&amp;gt;Registration sind Netzwerk- und VoIP-Einstellungen zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Anleitung für Fritz-Box-Benutzer ===&lt;br /&gt;
Die Fritzboxen bieten bisher leider keine Möglichkeit, den verwendeten DNS&lt;br /&gt;
direkt im Webinterface zu ändern, über Umwege geht es aber doch:&lt;br /&gt;
* Über das Webinterface der Fritzbox die Einstellungen sichern&lt;br /&gt;
* Exportdatei im Texteditor öffnen (am besten nicht Notepad, da der die Unix-Zeilenumbrüche nicht versteht - zur Not geht auch Wordpad)&lt;br /&gt;
* nach overwrite_dns1 suchen (gibt es zwei mal) und da den DNS 84.38.68.30 (von blooza http://www.mikrocontroller.net/topic/170483#1651124 bereitgestellt) oder 188.40.123.50 (von sprites http://spritesmods.com/?art=vpx500 bereitgestellt) eintragen&lt;br /&gt;
* am Anfang der Exportdatei VOR &amp;quot;**** CFGFILE:ar7.cfg&amp;quot; eine Zeile &#039;NoChecks = yes&#039; einfügen, damit die Fritzbox die nun nicht mehr passende Checksumme ignoriert.&lt;br /&gt;
* Einstellungen zurück in die Fritzbox übertragen.&lt;br /&gt;
&lt;br /&gt;
Wenn die Telefone entsperrt sind, den DNS wieder entfernen (Es ist&lt;br /&gt;
vielleicht eine ganz gute Idee, wenn man da zwei unabhängige DNS-Server&lt;br /&gt;
einträgt, so umgeht man auch gleich providerseitige DNS-Sperren)&lt;br /&gt;
&lt;br /&gt;
==== Alternative ====&lt;br /&gt;
Wer sich den nicht ganz ungefährlichen Weg mit den anpassungen an der Fritzbox erspahren will, wechselt seine Fritzbox in den Expertenmodus. Danach kann man unter System - Netzwerk bei dem Punkt &amp;quot;IP adresse der Fritzbox ändern&amp;quot; bei vielen modellen den internen DHCP abschalten. Dann unter windows z.B. tftpd32 (http://tftpd32.jounin.net/) starten, in dessen DHCP-Server die Fritzbox als Gateway und den entsprechenden &amp;quot;modding-dns&amp;quot; eintragen und das Telefon neustarten.&lt;br /&gt;
&lt;br /&gt;
War das Telefon schonmal angemeldet, versucht es die selbe IP vom neuen DHCP zu erzwingen, was tftpd32 nicht wirklich mag. Daher im tftpd32 die lease-ip bei 2 beginnen lassen und eine range von 250 eintragen, damit die vom Telefon verlangte IP auch im Adresspool des dhcp servers vorhanden ist.&lt;br /&gt;
&lt;br /&gt;
=== Anleitung fli4l ===&lt;br /&gt;
Mit dem [http://www.fli4l.de fli4l] ist das ganze ganz einfach.&lt;br /&gt;
&lt;br /&gt;
In der Datei config/dns_dhcp.txt den DNS  Redirect für die zwei DNS-Name Konfigurieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;file&amp;gt;&lt;br /&gt;
    DNS_REDIRECT_N=&#039;2&#039;                # number of redirected domains&lt;br /&gt;
    DNS_REDIRECT_1=&#039;ntp.xs4all.nl&#039;    # 1st redirected domain&lt;br /&gt;
    DNS_REDIRECT_1_IP=&#039;188.40.123.50&#039; # IP of redirected domain&lt;br /&gt;
&lt;br /&gt;
    DNS_REDIRECT_2=&#039;vpcm-001.cust.kpn.net&#039; &lt;br /&gt;
    DNS_REDIRECT_2_IP=&#039;188.40.123.50&#039; &lt;br /&gt;
&amp;lt;/file&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Hardware =&lt;br /&gt;
&lt;br /&gt;
== verwendete Komponenten ==&lt;br /&gt;
&lt;br /&gt;
* MCU: [http://www.mikrocontroller.net/attachment/72258/datasheet.pdf Freescale MC9328MX21] (ARM9) @ 266MHz ([http://en.wikipedia.org/wiki/I.MX21 Wikipedia_englisch]) &lt;br /&gt;
** gehört zur ARM9E-Familie: ARMv5TEJ -&amp;quot;IntructionSet&amp;quot; (ARM926EJ-S)&lt;br /&gt;
** [http://www.freescale.com/files/32bit/doc/ref_manual/MC9328MX21RM.pdf MC9328MX21 Applications Processor Reference Manual]&lt;br /&gt;
* PC-to-TV-Konverter-Chip: [http://www.mikrocontroller.net/attachment/73579/Data_Sheets.zip FS455LF]&lt;br /&gt;
* WLAN: Marvell 88w8385, als Modul von [http://www.mikrocontroller.net/attachment/72802/WM-G-MR-01-v27__01192006.pdf WM-G-MR-01] (VP5500) / Philips [http://www.mikrocontroller.net/attachment/73812/BGW211_Preliminary_Datasheet_v1.1.pdf BGW211], on-board (VP6500)&lt;br /&gt;
* SDRAM: 2 x [http://www.mikrocontroller.net/attachment/72461/K4S56163LF.pdf K4S56163LF] - 4M x 16Bit x 4 Banks im VP5500&lt;br /&gt;
* SDRAM: 1 x [http://www.mikrocontroller.net/attachment/73520/Samsung_64MB_K4M51323PC_1_8V.pdf K4M51323PC_1_8V] - 4M x 32Bit x 4 Banks im VP6500&lt;br /&gt;
* Flash: 2 x ws128j0pbfw00 [http://www.mikrocontroller.net/attachment/72462/S29WS064J.pdf S29WS128J/064J] 128/64 Megabit (8/4 M x 16-Bit) CMOS 1.8 Volt-only Simultaneous Read/Write, Burst Mode Flash Memory im VP5500&lt;br /&gt;
* Flash: 1 x [http://www.mikrocontroller.net/attachment/73521/S29GL512N.pdf S29GL512N] - 512 Megabit, 3.0 Volt-only Page Mode Flash Memory im VP6500&lt;br /&gt;
* Kamera: dc-4626.a5 by chicony&lt;br /&gt;
* Display: Samsung LTS220QC (HD66772 Controller)&lt;br /&gt;
&lt;br /&gt;
== Messungen ==&lt;br /&gt;
&lt;br /&gt;
=== Stromaufnahme ===&lt;br /&gt;
&lt;br /&gt;
==== VP5500 ====&lt;br /&gt;
FIXME &lt;br /&gt;
&lt;br /&gt;
==== VP6500 ====&lt;br /&gt;
 &lt;br /&gt;
Konfiguration: VP6500 mit aktivierter serieller Konsole an Labornetzteil, Spannung 3.67V (Bei weniger bootet es anscheinend aufgrund von Stromspitzen nicht richtig und vermeldet auf der seriellen Konsole ein &#039;battery low&#039; und schaltet sich danach selbst ab. Diese Spannung sollte noch so gerade &#039;safe&#039; sein, geht man davon aus, daß da ein Step-Up im Innern am werkeln ist und noch ein geringer Abfall über die Schottky-Diode einzurechnen ist). &lt;br /&gt;
&lt;br /&gt;
===== Telefon =====&lt;br /&gt;
* Booten: bis zu 420mA&lt;br /&gt;
* Einbuchen: ca. 400mA&lt;br /&gt;
* mit abgeschaltetem Display, aber eingebucht und laufend (idle): ca. 80mA&lt;br /&gt;
* mit angeschaltetem Display, eingebucht und idle: ca. 190mA&lt;br /&gt;
* mit 100% Prozessor-Last (von serieller Konsole ausgeführt: &amp;quot;while true; do true; done&amp;quot;): ca. 60mA mehr als idle (Scheint aber auch größere Sprünge für andere CPU-Last zu geben)&lt;br /&gt;
* im &#039;Deep Sleep&#039; (wird ein paar Minuten nach Einschalten erreicht): &amp;lt;10mA (!), mit kurzen Wachphasen mit erheblichem Stromverbrauch (&amp;gt;100mA). Beachte: Die serielle Konsole ist in diesem Modus auch nicht mehr aktiv, das Telefon ist aber nicht abgestürzt (Tastendruck aktiviert die Konsole wieder).&lt;br /&gt;
* Telefonieren ca 500mA&lt;br /&gt;
* Telefonieren mit Webcam ca 550mA&lt;br /&gt;
&lt;br /&gt;
===== Ladegerät =====&lt;br /&gt;
* Phone nicht in der Ladeschale: &amp;lt; 0.2W&lt;br /&gt;
* Phone wird geladen: ca 4W&lt;br /&gt;
&lt;br /&gt;
== System-Takte ==&lt;br /&gt;
 # cat /proc/systclk&lt;br /&gt;
 System clocks state:&lt;br /&gt;
     Ref clock :      32768Hz  (int, premult by 512)&lt;br /&gt;
     MPLL clock:  263999905Hz  (computed: 264000000Hz)&lt;br /&gt;
     SPLL clock:  163840000Hz  (computed: 163840000Hz)&lt;br /&gt;
     CPU clock :  263999905Hz  (PERSC   = 0)&lt;br /&gt;
     Bus clock :  132000000Hz  (BCLKDIV = 1, computed: 131999952Hz)&lt;br /&gt;
     CSI clock :  unknown      (cannot read register CSICR1)&lt;br /&gt;
     USB clock :   20480000Hz  (USB_DIV = 7)&lt;br /&gt;
     Wait State:  CS0U[WSC] = 10, CS0U[WSC] = 48&lt;br /&gt;
     loops_per_jiffy = 665058&lt;br /&gt;
&lt;br /&gt;
== Innenleben ==&lt;br /&gt;
&lt;br /&gt;
=== Zerlegen des VP5500 ===&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:01_offen_von_Hinten.JPG|1. Geöffnetes Akkufach&lt;br /&gt;
Datei:02_Blende_entfernt.JPG|2. hintere Schwarze Blende entfernt&lt;br /&gt;
Datei:03_Rückseite_entfernt.JPG|3. Schalenrückteil entfernt&lt;br /&gt;
Datei:04_aufhebeln_Vorderteil.JPG|4. Druck nach außen&lt;br /&gt;
Datei:05_vorderteil_entfernt.JPG|5. entferntes Vorderteil&lt;br /&gt;
Datei:06_Elektronik_entfernt.JPG|6. entfernte Elektronik&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# das Akkufach muss geöffnet und die Schrauben entfernt werden&lt;br /&gt;
# hinter der rückseitigen schwarzen Blende befinden sich zwei Schrauben, die entfernt werden müssen&lt;br /&gt;
#* Hierzu am besten mit einem schmalen kleinen Schraubendreher von der Stirnseite aus zwischen die Plastikteile fahren und vorsichtig aufhebeln und den Schraubendreher dabei weiter unter die Blende bewegen.&lt;br /&gt;
# Nun kann einfach das rückseitige Schalenteil abgeschaubt werden&lt;br /&gt;
# das Entfernen des Frontschalenteils ist etwas tricky:&lt;br /&gt;
#* von oben und unten lässt sich ganz gut ein Spalt zur Seite aufweiten&lt;br /&gt;
#* etwas unter der Mitte hängt es aber auf beiden Seiten. Dort befinden sich kleine Plastikbügel, die recht leicht zerbrechen.&lt;br /&gt;
#* Mit einem sehr schmalen Schraubendreher in eine der Lücken fahren (anfangen auf der Seite ohne Tasten) und den Schraubendreher nach innen drücken, so das der Druck in der Seite nach außen wirkt.&lt;br /&gt;
#* Mit etwas Geschick bekommt man das so ohne Bruch ab, es ist aber auch nicht kritisch, wenn der Bügel ein wenig anbricht)&lt;br /&gt;
# Die Platine zu entfernen ist nicht ganz so schwierig.&lt;br /&gt;
#* Zuerst die Seite auf der keine Knöpfe sind:&lt;br /&gt;
#* vorsichtig diese Seite leicht anheben. Am unteren Ende ist auf die Kontakte zu achten &lt;br /&gt;
#* dann versuchen die Platine seitlich nach oben aus dem Gehäuse zu ziehen&lt;br /&gt;
#* dabei auf das Lautsprecherkabel und den Kamerakonnektor achten&lt;br /&gt;
# Zusammenbau genauso, nur umgedreht ;)&lt;br /&gt;
#* nicht die Lautsprecher- und Kamera-Stecker vergessen&lt;br /&gt;
&lt;br /&gt;
=== Bilder vom VP5500 Innenleben ===&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;240&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei:Oberseite.jpg | Ansicht der Oberseite&lt;br /&gt;
Datei:Oberseite_beschriftet.jpg | Oberseite mit Beschriftung der Bauteile&lt;br /&gt;
Datei:Drumherum.jpg | Übersicht über die Komponenten&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;240&amp;quot; &amp;gt;&lt;br /&gt;
Datei:Kontakte_Oberseite.jpg | UART-Schnittstelle Oberseite&lt;br /&gt;
Datei:Kontakte_Unterseite.jpg | JTAG-Schnittstelle Unterseite&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testpins am VP5500 ===&lt;br /&gt;
Original Liste von [http://www.mikrocontroller.net/topic/170483#1646514 Tino] [[Media:Philips vp5500 Liste Testpins.pdf|herrunterladen]].&lt;br /&gt;
&lt;br /&gt;
[[Bild:Philips vp5500 testpins 1.jpg|thumb| Testpins auf der Rückseite]]&lt;br /&gt;
[[Bild:Philips vp5500 testpins 2.jpg|thumb| Frontseite: Die ICs wurden zum Messen ausgelötet.]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Testpin Nr.  !!    verbunden zu !! Funktion&lt;br /&gt;
|-&lt;br /&gt;
|   1       ||                  LED || unbekannt&lt;br /&gt;
|-&lt;br /&gt;
|    2     ||            Kamera Pin 8 an CN1 || unbekannt&lt;br /&gt;
|-&lt;br /&gt;
|    3     ||                  Pin 4 an IC1 || unbekannt&lt;br /&gt;
|-&lt;br /&gt;
|    4    ||                z.B. IC5 Pin V 18 || VDDA&lt;br /&gt;
|-&lt;br /&gt;
|    5    ||                       GND || GND&lt;br /&gt;
|-&lt;br /&gt;
|    6     ||                       NC || NC&lt;br /&gt;
|-&lt;br /&gt;
|    7     ||                Pin E 16 an IC5 || SAP_CLK&lt;br /&gt;
|-&lt;br /&gt;
|    8     ||                 Pin 1 an CN 3 || Lautsprecher&lt;br /&gt;
|-&lt;br /&gt;
|    9     ||                 Pin 2 an CN 3 || Lautsprecher&lt;br /&gt;
|-&lt;br /&gt;
|    10    ||                  Pin an CN 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
|    11     ||                 Pin an CN 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
|    12    ||                  Pin an CN 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
|    13    ||                Pin L 16 an IC5 || UART2_TXD&lt;br /&gt;
|-&lt;br /&gt;
|    14     ||               Pin C 12 an IC5 || USBH1_RXDM&lt;br /&gt;
|-&lt;br /&gt;
|    15   ||                 Pin H 12 an IC5 || USBH1_TXDP&lt;br /&gt;
|-&lt;br /&gt;
|    16     ||               Pin B 19 an IC5 || CSPI2_SS2&lt;br /&gt;
|-&lt;br /&gt;
|    17   ||                 Pin B16 an IC5 || SSI2_FS&lt;br /&gt;
|-&lt;br /&gt;
|    18     ||               Pin F 18 an IC5 || KP_ROW0&lt;br /&gt;
|-&lt;br /&gt;
|    19    ||                Pin K 18 an IC5 || KP_COL4&lt;br /&gt;
|-&lt;br /&gt;
|    20    ||                Pin L 19 an IC5 || UART3_TXD&lt;br /&gt;
|-&lt;br /&gt;
|    21     ||               Pin T 14 an IC5 || RESET_IN&lt;br /&gt;
|-&lt;br /&gt;
|    22    ||    geht an + des Kondensators neben IC6 || unbekannt&lt;br /&gt;
|-&lt;br /&gt;
|    23   ||                Pin D 13 an IC 9 || CLKOUT&lt;br /&gt;
|-&lt;br /&gt;
|    24      ||             Pin E 13 an IC 9 || CLKIN_P&lt;br /&gt;
|-&lt;br /&gt;
|    25    ||                Pin A 9 an IC 9 || DAC_D&lt;br /&gt;
|-&lt;br /&gt;
|    26    ||                Pin A 8 an IC 9 || DAC_A&lt;br /&gt;
|-&lt;br /&gt;
|    27    ||                Pin A 7 an IC 9 || DAC_B&lt;br /&gt;
|-&lt;br /&gt;
|    28     ||               Pin A 6 an IC 9 || DAC_C&lt;br /&gt;
|-&lt;br /&gt;
|    29      ||             Pin L 13 an IC 5 || UART1_TXD&lt;br /&gt;
|-&lt;br /&gt;
|    30     ||              Pin T 16 an IC 5 || BOOT1&lt;br /&gt;
|-&lt;br /&gt;
|    31  ||                 Pin K 10 an IC 5 || UART1_RXD&lt;br /&gt;
|-&lt;br /&gt;
|    32    ||               Pin U 17 an IC 5 || BOOT2&lt;br /&gt;
|-&lt;br /&gt;
|    33    ||                 Pin 9 an IC 23 || unbekannt&lt;br /&gt;
|-&lt;br /&gt;
|    34    ||                Pin D 19 an IC5 || CSPI2_SCLK&lt;br /&gt;
|-&lt;br /&gt;
|    35     ||              Pin C 14 an IC5 || TIN&lt;br /&gt;
|-&lt;br /&gt;
|    36    ||                Pin C 19 an IC5 || CSPI2_SS1&lt;br /&gt;
|-&lt;br /&gt;
|    37   ||                 Pin D 18 an IC5 || CSPI2_SS0&lt;br /&gt;
|-&lt;br /&gt;
|    38     ||               Pin E 19 an IC5 || CSPI2_MOSI&lt;br /&gt;
|-&lt;br /&gt;
|    39     ||               Pin H 19 an IC5 || PWMO&lt;br /&gt;
|-&lt;br /&gt;
|    40   ||            Pin J 9 an IC 7 und IC 8 || VDD&lt;br /&gt;
|-&lt;br /&gt;
|    41   ||                 Pin J 19 an IC 5 || KP_COL2&lt;br /&gt;
|-&lt;br /&gt;
|    42   ||                Pin K 16 an IC 5 || KP_COL3&lt;br /&gt;
|-&lt;br /&gt;
|    43   ||                 Pin J 11 an IC 5 || KP_ROW2&lt;br /&gt;
|-&lt;br /&gt;
|44      ||     Pin J 17 an IC 5 || KP_COL1&lt;br /&gt;
|-&lt;br /&gt;
|45  ||         Pin G 19 an IC 5 || KP_ROW4&lt;br /&gt;
|-&lt;br /&gt;
|46  ||         Pin G 17 an IC 5 || KP_ROW3&lt;br /&gt;
|-&lt;br /&gt;
|47  ||    Pin D 5 an IC 10 und IC 11 || ACC&lt;br /&gt;
|-&lt;br /&gt;
|48 ||          Pin G 16 an IC 5 || KP_ROW1&lt;br /&gt;
|-&lt;br /&gt;
|49   ||        Pin J 18 an IC 5 || KP_COL0&lt;br /&gt;
|-&lt;br /&gt;
|50  ||         Pin V 18 an IC 5 || VDDA&lt;br /&gt;
|-&lt;br /&gt;
|51 ||      Pin 2 an CN KB-Stecker || ?&lt;br /&gt;
|-&lt;br /&gt;
|52 ||           Pin 2 an IC 15 ||  ?&lt;br /&gt;
|-&lt;br /&gt;
|53  ||      Pin 4 am LCD Stecker || ?&lt;br /&gt;
|-&lt;br /&gt;
|54  ||         Pin E 17 an IC 5 || CSPI2_MISO&lt;br /&gt;
|-&lt;br /&gt;
|55 ||  Pin 1,2,3,10,13 am LCD Stecker || ?&lt;br /&gt;
|-&lt;br /&gt;
|56  ||          Pin 3 an IC 16 ||  ?&lt;br /&gt;
|-&lt;br /&gt;
|57  ||         Pin U 10 an IC 5 || PC_PWRON&lt;br /&gt;
|-&lt;br /&gt;
|58  ||            Pin 1 IC 18 || ?&lt;br /&gt;
|-&lt;br /&gt;
|59  ||       an Diode über IC 16 || ?&lt;br /&gt;
|-&lt;br /&gt;
|60  ||          Pin 3 an IC 25 || ?&lt;br /&gt;
|-&lt;br /&gt;
|61 ||         Ladekontakt positiv || Ladegerät +&lt;br /&gt;
|-&lt;br /&gt;
|62  ||               GND || GND&lt;br /&gt;
|-&lt;br /&gt;
|63  ||        Akku Mittelkontakt || Akkustand? Temperatur?&lt;br /&gt;
|-&lt;br /&gt;
|64 ||       Transistor unter IC 16 || ?&lt;br /&gt;
|-&lt;br /&gt;
|65  ||          Pin 2 an IC 22 || ?&lt;br /&gt;
|-&lt;br /&gt;
|66   ||      Pin 1,12,30 an IC 24 || VSS&lt;br /&gt;
|-&lt;br /&gt;
|67  ||    Kondensator + unter IC 20 || ?&lt;br /&gt;
|-&lt;br /&gt;
|68   ||         Pin 5 an IC 21 || ?&lt;br /&gt;
|-&lt;br /&gt;
|69  ||           Pin 2 an IC 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
|70    ||        Pin 25 an IC24 || MCLK&lt;br /&gt;
|-&lt;br /&gt;
|71  ||       Prozessor Pin W 14 || QVDD&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Testpins am VP6500 ===&lt;br /&gt;
Original Listen von [http://www.mikrocontroller.net/topic/170483#1658720 Tino] herunterladen. [[Media:V6500_Back.xls|Rückseite]], [[Media:V6500_Front.xls|Vorderseite]].&lt;br /&gt;
&lt;br /&gt;
[[Bild:V6500_Back.jpg|thumb| Testpins auf der Rückseite]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Testpin Nr.  !!    verbunden zu !! Funktion&lt;br /&gt;
|-		&lt;br /&gt;
| 1 || Pin 21 an BGW211EG || POR_N&lt;br /&gt;
|-		&lt;br /&gt;
| 2 || Pin A 14 an i.MX21 || TOUT&lt;br /&gt;
|-		&lt;br /&gt;
| 3 || Pin 46 an BGW211EG || JTAG_TDI&lt;br /&gt;
|-		&lt;br /&gt;
| 4 || Pin 44 an BGW211EG || JTAG_TCLK&lt;br /&gt;
|-		&lt;br /&gt;
| 5 || Pin 42 an BGW211EG || JTAG_TDO&lt;br /&gt;
|-		&lt;br /&gt;
| 6 || Pin 47 an BGW211EG || JTAG_TRST_N&lt;br /&gt;
|-		&lt;br /&gt;
| 7 || PIN 45 an BGW211EG || JTAG_TMS&lt;br /&gt;
|-		&lt;br /&gt;
| 8 || Pin 43 an BGW211EG || JTAG_RTCLK&lt;br /&gt;
|-		&lt;br /&gt;
| 9 || Pin C 14 an i.MX21 || TIN&lt;br /&gt;
|-		&lt;br /&gt;
| 10 || VDD || VDD&lt;br /&gt;
|-		&lt;br /&gt;
| 11 || Pin K 10 an i.MX21 || UART1_RXD&lt;br /&gt;
|-		&lt;br /&gt;
| 12 || Pin L 13 an i.MX21 || UART1_TXD&lt;br /&gt;
|-		&lt;br /&gt;
| 13 || GND || GND&lt;br /&gt;
|-		&lt;br /&gt;
| 14 || Pin U 17 an i.MX21 || BOOT2&lt;br /&gt;
|-		&lt;br /&gt;
| 15 || Pin V 16 an i.MX21 || BOOT0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Bild:V6500_Front.jpg|thumb| Frontseite: Die ICs wurden zum Messen ausgelötet.]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Testpin Nr.  !!    verbunden zu !! Funktion&lt;br /&gt;
|-		&lt;br /&gt;
| 1 || 	Pin 29 von BGW211EG &amp;amp; F 16 an i.MX21 || RESET_N / CSPI1_SS1&lt;br /&gt;
|-		&lt;br /&gt;
| 2 || 	Pin 28 an BGW211EG &amp;amp; J 12 an i.MX21 || SPI_DAT_MOSI / CSPI1_MOSI&lt;br /&gt;
|-		&lt;br /&gt;
| 3 || 	Pin 27 an BGW211EG &amp;amp; F 19 an i.MX21 || SPI_SS_N / CSPI1_SS0&lt;br /&gt;
|-		&lt;br /&gt;
| 4 || 	Pin 26 an BGW21EG &amp;amp; F 17 an i.MX21 || SPI_DAT_MISO / CSPI1_MISO&lt;br /&gt;
|-		&lt;br /&gt;
| 5 || 	Pin 25 an BGW211EG &amp;amp; H 10 an i.MX21 || SPI_CLK / CSPI1_SCLK&lt;br /&gt;
|-		&lt;br /&gt;
| 6 || 	Pin 24 an BGW211EG &amp;amp; H 11 an i.MX21 || SPI_EXT_INT / CSPI1_RDY&lt;br /&gt;
|-		&lt;br /&gt;
| 7 || 	Pin 41 an BGW211EG || UART_TX&lt;br /&gt;
|-		&lt;br /&gt;
| 8 || 	Pin 40 an BGW211EG || UART_RX&lt;br /&gt;
|-		&lt;br /&gt;
| 9 || 	Transistor unter Testpunkt || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 10 || 	GND || GND&lt;br /&gt;
|-		&lt;br /&gt;
| 11 || 	LED || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 12 || 	Pin 8 am Kamerastecker || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 13 || 	Pin 18 am Kamerastecker || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 14 || 	Pin E 13 &amp;amp; H12 an FS455 || CLKIN / PREF&lt;br /&gt;
|-		&lt;br /&gt;
| 15 || 	Pin D 13 an FS455 || CLKOUT&lt;br /&gt;
|-		&lt;br /&gt;
| 16 || 	Pin A 11 an FS455 || XTAL_OUT&lt;br /&gt;
|-		&lt;br /&gt;
| 17 || 	VDD von FS455 || VDD&lt;br /&gt;
|-		&lt;br /&gt;
| 18 || 	Pin 15 &amp;amp; 16 am Displayconnector || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 19 || 	geht an 2 Dioden links daneben || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 20 || 	Pin M 19 an i.MX21 || UART1_CTS&lt;br /&gt;
|-		&lt;br /&gt;
| 21 || 	Pin M 18 an i.MX21 || UART1_RTS &amp;amp; GND ??&lt;br /&gt;
|-		&lt;br /&gt;
| 22 || 	VDDan i,MX21 || VDD&lt;br /&gt;
|-		&lt;br /&gt;
| 23 || 	Pin G 10 an i.MX21 || USB_BYP&lt;br /&gt;
|-		&lt;br /&gt;
| 24 || 	Pin A 19 an i.MX21 || SSI3_FS&lt;br /&gt;
|-		&lt;br /&gt;
| 25 || 	Pin D 17 an i.MX21 || SSI2_CLK&lt;br /&gt;
|-		&lt;br /&gt;
| 26 || 	VDD an i.MX21 || VDD&lt;br /&gt;
|-		&lt;br /&gt;
| 27 || 	Pin T 17 an i.MX21 || SD1_D3&lt;br /&gt;
|-		&lt;br /&gt;
| 28 || 	Pin A 15 an i.MX21 || SAP_TXDAT&lt;br /&gt;
|-		&lt;br /&gt;
| 29 || 	GND || GND&lt;br /&gt;
|-		&lt;br /&gt;
| 30 || 	Pin T 14 an i.MX21 || RESET_IN&lt;br /&gt;
|-		&lt;br /&gt;
| 31 || 	Pin R 19 an i.MX21 || TRST&lt;br /&gt;
|-		&lt;br /&gt;
| 32 || 	Pin P 19 an i.MX21 || TMS&lt;br /&gt;
|-		&lt;br /&gt;
| 33 || 	Pin N 17 an i.MX21 || TCK&lt;br /&gt;
|-		&lt;br /&gt;
| 34 || 	Pin K 11 an i.MX21 || TDO&lt;br /&gt;
|-		&lt;br /&gt;
| 35 || 	Pin P 18 an i.MX21 || TDI&lt;br /&gt;
|-		&lt;br /&gt;
| 36 || 	Pin 13 an TLV320 || OUTP2&lt;br /&gt;
|-		&lt;br /&gt;
| 37 || 	Pin 14 an TLV320 || OUTMV&lt;br /&gt;
|-		&lt;br /&gt;
| 38 || 	Pin 15 an BGW211EG || VDD&lt;br /&gt;
|-		&lt;br /&gt;
| 39 || 	Pin an Klinkenbuchse || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 40 || 	Pin an Klinkenbuchse || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 41 || 	? || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 42 || 	LED Tastatur || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 43 || 	LED Tastatur || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 44 || 	Pin 1,8 an 20XN2512 &amp;amp; Key ON || PowerON&lt;br /&gt;
|-		&lt;br /&gt;
| 45 || 	Pin 7 an BDR72K || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 46 || 	Pin 2 an BDR72K || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 47 || 	Pin 6 an MRRBGB3 || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 48 || 	LED Tastatur ||  ?&lt;br /&gt;
|-		&lt;br /&gt;
| 49 || 	Pin 10 an MRRBG3 || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 50 || 	LED Tastatur || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 51 || 	geht an Widerstand auf Rückseite ? || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 52 || 	Pin L 13 an i.MX21 || UART1_TXD&lt;br /&gt;
|-		&lt;br /&gt;
| 53 || 	geht an Diode und Kondensator auf der Rückseite || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 54 || 	Pin C 14 an i.MX21 || TIN&lt;br /&gt;
|-		&lt;br /&gt;
| 55 || 	geht an Widerstand auf der Rückseite || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 56 || 	Pin 7 an BDR72K || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 57 || 	Pin K 10 an i.MX21 || UART1_RDX&lt;br /&gt;
|-		&lt;br /&gt;
| 58 || 	Pin U 17 an i.MX21 || BOOT2&lt;br /&gt;
|-		&lt;br /&gt;
| 59 || 	Pin T 16 an i.MX21 || BOOT1&lt;br /&gt;
|-		&lt;br /&gt;
| 60 || 	geht an Widerstand auf der Rückseite || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 61 || 	Pin V 16 an i.MX21 || BOOT0&lt;br /&gt;
|-		&lt;br /&gt;
| 62 || 	LED Tastatur || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 63 || 	LED Tastatur || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 64 || 	Pin 25 an TLV320 || MLCK&lt;br /&gt;
|-		&lt;br /&gt;
| 65 || 	Pin4 an 69W2440D || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 66 || 	VDD von TLV320 || VDD&lt;br /&gt;
|-		&lt;br /&gt;
| 67 || 	geht an Widerstand auf der Rückseite ||  ?&lt;br /&gt;
|-		&lt;br /&gt;
| 68 || 	geht an Widerstand auf der Rückseite || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 69 || 	Pin 65 an MRRBG3 || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 70 || 	GND || GND&lt;br /&gt;
|-		&lt;br /&gt;
| 71 || 	LED Tastatur || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 72 || 	LED Tastatur || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 73 || 	Akku positiv || Plus Akku&lt;br /&gt;
|-		&lt;br /&gt;
| 74 || 	Ladekontakt positiv || Ladekontakt positiv&lt;br /&gt;
|-		&lt;br /&gt;
| 75 || 	Akku positiv || Plus Akku&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== UART ==&lt;br /&gt;
TIN muss auf low gezogen werden, um die Schnittstelle zu aktivieren.&lt;br /&gt;
Jedoch startet dann das Telefon nicht vollständig (Fix siehe [[#Betrieb mit aktivierter serieller Schnittstelle]], zum rooten langt es jedoch, siehe [[#per serieller Schnittstelle]])&lt;br /&gt;
&lt;br /&gt;
* Spannungs-Pegel: 3.3V&lt;br /&gt;
* Baudrate: 115200 bps&lt;br /&gt;
* Stopbits: 1&lt;br /&gt;
* Flussteuerung: keine&lt;br /&gt;
=== VP5500 ===&lt;br /&gt;
[[Bild:VP5500_seriell_highlight.svg|100px|UART-Pins VP5500(Frontseite der Platine)]]&lt;br /&gt;
&lt;br /&gt;
Die serielle Schnittstelle ist unten vom Akkufach aus zugänglich.&lt;br /&gt;
Obiges Bild kennzeichnet die für die serielle Kommunikation benötigten Pins.&lt;br /&gt;
&lt;br /&gt;
=== VP6500 ===&lt;br /&gt;
[[Bild:VP5600-Serialport-Preliminary.jpg|100px|UART-Pins VP6500]]&lt;br /&gt;
&lt;br /&gt;
Die serielle Schnittstelle ist unten vom Akkufach aus zugänglich.&lt;br /&gt;
Obiges Bild kennzeichnet die für die serielle Kommunikation benötigten Pins.&amp;lt;br&amp;gt;&lt;br /&gt;
VCC liefert anscheinend die ungeregelte Akkuspannung, Boot-Pins nicht verifiziert.&lt;br /&gt;
&lt;br /&gt;
== JTAG ==&lt;br /&gt;
[[Bild:jtag.jpg Belegung der JTAG-Pins (Rückseite der Platine)]]&lt;br /&gt;
&lt;br /&gt;
== Hardware Modifikationen ==&lt;br /&gt;
&lt;br /&gt;
Nachdem wir ja bereits wissen wie das [[#Zerlegen_des_Telefons]] geht, steht der Nachrüstung von Bauelementen und Schnittstellen generell nichts mehr im Wege.&lt;br /&gt;
&lt;br /&gt;
=== Buchse für UART ins VP5500 einbauen ===&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:10_Pins.JPG|1. unbearbeitete Pinreihe&lt;br /&gt;
Datei:11_Pins_bearbeitet.JPG|2. präperierte Pinreihe&lt;br /&gt;
Datei:09_Pads.JPG|3. präperierte Pads&lt;br /&gt;
Datei:12_Pins_ausrichten.JPG|4. Pinreiheausrichten&lt;br /&gt;
Datei:13_Pins_angelötet_1.JPG|5. angelötete Pinreihe&lt;br /&gt;
Datei:14_Pins_angelötet_2.JPG|6. angelötete Pinreihen&lt;br /&gt;
Datei:08_Mittelteil.JPG|7. Mittelteil mit ausgefeiltem Loch&lt;br /&gt;
Datei:15_Mittelteil_zusammengebaut.JPG|8. wieder zusammengesteckt&lt;br /&gt;
Datei:16_in_Aktion.JPG|9.verbundene serielle Schnittstelle&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zunächst muss das Telefon zerlegt werden ([[#Zerlegen des Telefons]])&lt;br /&gt;
Um das Gehäuse nicht zu beeinträchtigen, habe ich mich dazu entschieden, alles so zu lassen wie es ist und nur kleine Buchsen einzubauen. &lt;br /&gt;
&lt;br /&gt;
# Hierfür habe ich einreihige gedrehte IC-Sockel genutzt &lt;br /&gt;
# deren Beine abgezwickt, und etwas Lötzinn aufgetragen (mit der langen Reihe kann man die kurzen, schmalen Teile super handhaben)&lt;br /&gt;
# ebendso auf die Pads ein wenig eingezinnt&lt;br /&gt;
# ausrichten und festlöten&lt;br /&gt;
# eine Reihe&lt;br /&gt;
# die zweite Reihe&lt;br /&gt;
# bei der Gehäuseöffnung über den Pins habe ich mit einer feinen Schlüsselfeile den Rand wenig aufgeweitet. An der Gummimatte hab ich nix geändert.&lt;br /&gt;
# fertig&lt;br /&gt;
# und im Einsatz&lt;br /&gt;
&lt;br /&gt;
=== Anschluss für UART des VP6500 zugänglich machen ===&lt;br /&gt;
Vorteil beim VP6500: es muss dazu nicht zerlegt werden, da sich die Kupferpads unter den Akkus im Akkufach verstecken. Dies ermöglicht eine lötfreie Variante des seriellen Anschlusses. Die Pinbelegung ist unter [[#VP6500_2|UART]] beschrieben.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:01_Kuli-Molex.jpg|1. Benötigte Teile: Stück Plastik + Molex Stecker&lt;br /&gt;
Datei:02_gefeiltes_Plastik_18_mm.jpg|2. Länge der Aussparung im Batteriefach: 18 mm&lt;br /&gt;
Datei:03_gefeiltes_Plastik_4_mm.jpg|3. Breite der Aussparung im Batteriefach: 4 mm&lt;br /&gt;
Datei:04_gefeiltes_Plastik_passt.jpg|4. Solange feilen bis es passt&lt;br /&gt;
Datei:05_gefeiltes_Plastik_Kerben.jpg|5. Padabstand markiert&lt;br /&gt;
Datei:06_gekerbtes_Plastik_Molex.jpg|6. So bekommt man die Federn aus den Steckern&lt;br /&gt;
Datei:07_Federelement_roh.jpg|7. Frisch aus dem Stecker&lt;br /&gt;
Datei:08_Federelement_offen.jpg|8. Aufgebogen&lt;br /&gt;
Datei:10_Federelement_unter_Plastik.jpg|9. In Plastikführung&lt;br /&gt;
Datei:09_Federelement_umgebogen.jpg|10. Umgebogen&lt;br /&gt;
Datei:11_halbfertig_passt.jpg|11. Kerbung angepasst?&lt;br /&gt;
Datei:12_ganz_fertig1.jpg|12. Mit Heißkleber sichern&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
*1. Da wir 4 Pole anschließen wollen, benötigen wir 4 federnde Teile aus &amp;quot;Molex&amp;quot;-Steckern, wie man sie aus CPU-Lüftern kennt. (Entweder hat man einen 4-poligen für die modernen PWM geregeltn zur Hand den man ausschlachten kann, oder man nimmt zwei dreipolige alte auseinander.)&lt;br /&gt;
*2./3. Ferner braucht man ein Stück Plastik mit den Maßen 4 mm mal 18 mm, welches als Träger für die Federkontakte dienen soll. Die Höhe ist nicht so entscheidend. Man kann z.B. den Clip eines Kugelschreibes passend zuschneiden und feilen.&lt;br /&gt;
*4. Plastikträger so weit zufeilen, dass er in die Aussparung passt (Tip: Bindfaden darum knoten um ihn wieder entfernen zu können)&lt;br /&gt;
*5. Abstände zwischen den Kontakten die kontaktiert werden müssen (TIN, GND, RX, TX : siehe [[#UART|UART]]) markieren und in die Unterseite des Trägers Führungskerben für die Federn sägen. Ebenso braucht man kleine Aussparungen um die Metallzungen von der Platine in das Batteriefach zu führen. &lt;br /&gt;
*6./7. Aus den Molex-Steckern bekommt man die Federn sehr einfach raus, indem man mit einem kleinen flachen Schraubenzieher vorsichtig in die Aussparungen sticht und hinten am Kabel zieht.&lt;br /&gt;
*8. Die einzelnen Metallzungen nun noch auf 90° aufbiegen.&lt;br /&gt;
*9. In die Führungskerbe einschieben.&lt;br /&gt;
*10. Metallzunge umbiegen. (Zange)&lt;br /&gt;
*11. Sind alle Kerbungen und Aussparungen richtig abgemessen und gut zugefeilt, dann passt alles in die Lücke im Batteriefach, ohne dass sich die verschiedenen Metallteile berühren.&lt;br /&gt;
*12. Mit etwas Schrumpfschlauch und Heißkleiber kann man dem Verrutschen der Metallzungen vorbeugen und die Kurzschlußwahrscheinlichkeit senken. Ferner dient der Heißkleber als Kraftüberträger, damit die Batterien die leicht federnden Metallzungen fest auf die Kontakte auf der Platine drücken können.&lt;br /&gt;
*13. Batterien einsetzen. Ohne diese wird das ganze irgendwann doch wieder rausfallen und die Verbindung von Anfang an unzuverlässig sein.&lt;br /&gt;
&lt;br /&gt;
Problembehandlung:&lt;br /&gt;
* Kein Kontakt: (Man kann z.B. die Masse auf Durchgang prüfen.)&lt;br /&gt;
** Träger nicht tief genug in die Lücke gedrückt: Mit schmalem Schraubenzieher nachdrücken. Meistens auf der Seite notwendig wo die Metallzungen nach oben kommen.&lt;br /&gt;
** Träger wird nach aussen gedrückt (Metallzungen federn ja): Mehr Heißkleber um mehr Druck durch die Batterien zu bekommen.&lt;br /&gt;
** Träger tief drin, aber trotzdem keine oder unzuverlässige Verbindung: Die Metallzungen auf der Unterseite haben verschiedene &amp;quot;Dicken&amp;quot;, oder die Kerben sind unterschiedlich tief. Ein Tropfen Lötzinn auf die zu niedrigen Metallzungen erledigt dies. (Anmerkung: Der Autor musste überall ein wenig Lötzinn auftragen um die notwendige Dicke und sichere Verbindung zu erreichen.)&lt;br /&gt;
&lt;br /&gt;
= Nutzung für Voice over IP (VoIP, SIP) =&lt;br /&gt;
&lt;br /&gt;
== weiterführende Links ==&lt;br /&gt;
&lt;br /&gt;
*http://de.wikipedia.org/wiki/IP-Telefonie&lt;br /&gt;
*http://de.wikipedia.org/wiki/Session_Initiation_Protocol&lt;br /&gt;
*http://de.wikipedia.org/wiki/H.323&lt;br /&gt;
*http://de.wikipedia.org/wiki/Softphone&lt;br /&gt;
&lt;br /&gt;
Benutzer ist 103&lt;br /&gt;
&lt;br /&gt;
Mit [http://ekiga.org Ekiga] konnte so per 103@xxx.xxx.xxx.xxx bei ersten Tests eine Sprachverbindung zum Telefon aufgebaut werden.&lt;br /&gt;
&lt;br /&gt;
== SIP Einstellungen ==&lt;br /&gt;
&lt;br /&gt;
Die SIP Einstellungen können alternativ auch direkt in der Datei&lt;br /&gt;
 /user_data/data/hpr0userparam.cfg&lt;br /&gt;
vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
=== Einstellung für 1und1 ===&lt;br /&gt;
&lt;br /&gt;
* SIP1:&lt;br /&gt;
** Display Name: ...&lt;br /&gt;
** Username: 49#VORWAHLOHNE0#NUMMER#&lt;br /&gt;
** Telephone Number: 0#VORWAHLOHNE0#NUMMER#&lt;br /&gt;
* Auth:&lt;br /&gt;
** Auth Username: 49#VORWAHLOHNE0#NUMMER#&lt;br /&gt;
** Password: *********&lt;br /&gt;
* Server:&lt;br /&gt;
** sip.1und1.de:5060&lt;br /&gt;
* Proxy:&lt;br /&gt;
** sip.1und1.de:5060&lt;br /&gt;
* RTP:&lt;br /&gt;
** 30000 und 30019&lt;br /&gt;
* STUN:&lt;br /&gt;
** stun.1und1.de&lt;br /&gt;
* STUN Server Port:&lt;br /&gt;
** 3478&lt;br /&gt;
* SIP2:&lt;br /&gt;
** UDP: 5060&lt;br /&gt;
** TCP: 5060&lt;br /&gt;
&lt;br /&gt;
=== Einstellung für Vodafone NGN (Arcor NGN) ===&lt;br /&gt;
&lt;br /&gt;
* SIP1:&lt;br /&gt;
** Display Name: ...&lt;br /&gt;
** Username: VORWAHLUNDRUFNUMMER&lt;br /&gt;
** Telephone Number: (leer lassen)&lt;br /&gt;
* Auth:&lt;br /&gt;
** Auth Username: VORWAHLUNDRUFNUMMER&lt;br /&gt;
** Password: *********&lt;br /&gt;
* Server:&lt;br /&gt;
** arcor.de:5060&lt;br /&gt;
* Proxy:&lt;br /&gt;
** VORWAHL.sip.arcor.de:5060&lt;br /&gt;
* RTP:&lt;br /&gt;
** 10000 und 10001&lt;br /&gt;
* STUN:&lt;br /&gt;
** (X) use rport&lt;br /&gt;
* SIP2:&lt;br /&gt;
** UDP: 5060&lt;br /&gt;
** TCP: 5060&lt;br /&gt;
(getestet von Micha mit EasyBox 802; an EasyBox n-WLAN ausschalten)&lt;br /&gt;
&lt;br /&gt;
=== Einstellung für Sipgate ===&lt;br /&gt;
&lt;br /&gt;
*SIP1&lt;br /&gt;
**Display Name: Sipgate Username&lt;br /&gt;
**User Name: your SIPgate-ID&lt;br /&gt;
**Telephone Number:  Sipgate-Telefonnummer&lt;br /&gt;
*Auth&lt;br /&gt;
**Authentification UserName: your SIPgate-ID&lt;br /&gt;
**Password: Sipgate Passwort&lt;br /&gt;
*Server&lt;br /&gt;
**SIP register address:port: sipgate.de:5060&lt;br /&gt;
*Proxy&lt;br /&gt;
**SIP proxy1 address:port: sipgate.de:5060&lt;br /&gt;
*RTP Audio Channel&lt;br /&gt;
**RTP: 22800&lt;br /&gt;
**RTCP: 22801&lt;br /&gt;
*RTP Video Channel&lt;br /&gt;
**RTP: 22804&lt;br /&gt;
**RTCP: 22805&lt;br /&gt;
*STUN: [X] use rport&lt;br /&gt;
*SIP2&lt;br /&gt;
**SIP Port Listen&lt;br /&gt;
**for UDP: 5062&lt;br /&gt;
**for TCP: 5062&lt;br /&gt;
**for TCP TLS: 5053&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SIP Outbound muss leer sein.&lt;br /&gt;
&lt;br /&gt;
=== Alternative Einstellung für Sipgate ===&lt;br /&gt;
&lt;br /&gt;
Hinter meiner Freetzbox hat die obige Einstellung nix gebracht - incoming calls wurden nicht signalisiert. Folgendes tut dagegen:&lt;br /&gt;
&lt;br /&gt;
*SIP1&lt;br /&gt;
**Display Name: Sipgate Username&lt;br /&gt;
**User Name: your SIPgate-ID&lt;br /&gt;
**Telephone Number:  Sipgate-Telefonnummer&lt;br /&gt;
*Auth&lt;br /&gt;
**Authentification UserName: your SIPgate-ID&lt;br /&gt;
**Password: Sipgate Passwort&lt;br /&gt;
*Server&lt;br /&gt;
**SIP register address:port: sipgate.de:5060&lt;br /&gt;
*Proxy&lt;br /&gt;
** leer&lt;br /&gt;
*SIP2&lt;br /&gt;
**Symmetric Mode [X]&lt;br /&gt;
**SIP Port Listen&lt;br /&gt;
**for UDP: 5062&lt;br /&gt;
**for TCP: 5062&lt;br /&gt;
**for TCP TLS: 5053&lt;br /&gt;
*STUN: [x] use rport&lt;br /&gt;
&lt;br /&gt;
SIP Outbound muss leer sein.&lt;br /&gt;
&lt;br /&gt;
Ein Videotelefonat von Sipgate zu Sipgate zwischen zwei VP6500 wurde erfolgreich getestet. Gegebenenfalls muss die eigene Videoübertragung noch durch Drücken der Taste &#039;&#039;&#039;Video&#039;&#039;&#039; gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Bei mir hat es nur per UDP funktioniert, aber mit starken Delays (&amp;gt;1s)&lt;br /&gt;
&lt;br /&gt;
=== Einstellung für Ekiga.net ===&lt;br /&gt;
&lt;br /&gt;
*SIP1&lt;br /&gt;
**Display Name: Irgendwas&lt;br /&gt;
**User Name: username&lt;br /&gt;
**Telephone Number: leer&lt;br /&gt;
*Auth&lt;br /&gt;
**Authentication User Name: username&lt;br /&gt;
**Password: password&lt;br /&gt;
*Server&lt;br /&gt;
**SIP register: ekiga.net:5060&lt;br /&gt;
**Protocol: ( ) TCP (*) UDP&lt;br /&gt;
**Expire Timer: 3600&lt;br /&gt;
**Keep Alive: 0&lt;br /&gt;
*Proxy&lt;br /&gt;
**alle leer&lt;br /&gt;
*STUN&lt;br /&gt;
**( ) use rport&lt;br /&gt;
**STUN Server IP address: stun.ekiga.net&lt;br /&gt;
**STUN Server port: 3478&lt;br /&gt;
*SIP2&lt;br /&gt;
**(*) Symmetric Mode&lt;br /&gt;
**UDP: 5060&lt;br /&gt;
**TCP: 5060&lt;br /&gt;
**TCP TLS: 5061&lt;br /&gt;
*OBproxy&lt;br /&gt;
**alle leer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nach der (kostenlosen) Registrierung bei ekiga.net und der Anmeldung des Telefons kann man unter der 500 einen Audio und Video(!) Test machen.&amp;lt;br&amp;gt;&lt;br /&gt;
Weitere features: https://www.ekiga.net/index.php?page=services&amp;lt;br&amp;gt;&lt;br /&gt;
Ekiga teilt keine Festnetz Rufnummern zu, daher ist ein Anruf von/zu Festnetz Telefonen nicht möglich.&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;Bei Ekiga.net angemeldete Geräte können aber problemlos untereinander telefonieren, sogar mit Video. Da man vom Mainscreen des VP5500/6500 aus direkt nur numerische Kontakte (herkömmliche Telefonnumern) wählen kann, Ekiga.net Telefonnummern aber aus [Benutzername]@ekiga.net bestehen, legt man über das Menü des VP5500/6500 einfach &amp;lt;b&amp;gt;einen neuen Kontakt&amp;lt;/b&amp;gt; (Telefonbuch) an. Als Video-Rufnummer trägt man einfach [Benutzername]@ekiga.net ein, wobei [Benutzername] der Name des Ekiga-Accounts ist, den man erreichen will. Zwischen der Eingabe von Buchstaben, Zahlen und Sonderzeichen kann man dabei mit der &amp;lt;b&amp;gt;[#]&amp;lt;/b&amp;gt;-Taste des VP5500/6500 umschalten.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Sollte bei einem Telefonat über Ekiga Video einmal nicht funktionieren, hilft eventuell die manuelle Aktivierung der Videofunktion mittels der &amp;lt;b&amp;gt;Video-Taste&amp;lt;/b&amp;gt; auf der Tastatur des VP6500&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einstellung für Fritzbox 7170/7270 und andere mit SIP-Registrar ===&lt;br /&gt;
Die Anmeldung eines Telefons auf der Fritzbox starten (System/Ansicht/&amp;quot;Expertenansicht aktivieren&amp;quot;, dann Telefonie/Telefoniegeräte/&amp;quot;Neues Gerät einrichten&amp;quot;, &amp;quot;Telefon&amp;quot;, &amp;quot;Bitte auswählen&amp;quot;/&amp;quot;LAN/WLAN (IP-Telefon)&amp;quot;) und sich eine Nummer geben lassen,&amp;lt;br&amp;gt; dann in Registration auf dem VPx500 wechseln und die Einstellungen wie unten vornehmen.&amp;lt;br&amp;gt; Anschließend will das Telefon diese Einstellungen aktivieren, vorher noch auf der FB die Anmeldung starten.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Im Beispiel will die FB die Nummer 621 vergeben:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Reiter SIP1&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Display Name: egal &amp;lt;leer lassen&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
User Name: 621&amp;lt;br&amp;gt;&lt;br /&gt;
Telephone Number: 621&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Reiter Auth&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Authentication UserName: 621&amp;lt;br&amp;gt;&lt;br /&gt;
Password: [hier das gleiche, wie auf der FB eingeben]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Reiter Server&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
SIP register address:port&amp;lt;br&amp;gt;&lt;br /&gt;
192.168.2.1:5060 (IP Bitte auf Euer Netz anpassen) oder alternativ: fritz.box:5060&amp;lt;br&amp;gt;&lt;br /&gt;
Protocol: UDP&amp;lt;br&amp;gt;&lt;br /&gt;
ExpireTime: 3600&amp;lt;br&amp;gt;&lt;br /&gt;
Keep Alive: 300&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Reiter SIP2&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
[ ] Symmetric Mode&amp;lt;br&amp;gt;&lt;br /&gt;
SIP Port Listen&amp;lt;br&amp;gt;&lt;br /&gt;
for UDP: 5060&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Anmerkungen dazu:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Protokoll: UDP&amp;lt;br&amp;gt;&lt;br /&gt;
Bei TCP hat das VP6500 nach Minuten oder Stunden immer wieder die Verbindung zur FB verloren.&amp;lt;br&amp;gt; &lt;br /&gt;
Keep Alive: 300&amp;lt;br&amp;gt;&lt;br /&gt;
Die Keep Alive Time habe ich eingestellt, weil ich die TCP Probleme umgehen &amp;lt;br&amp;gt;wollte. Ich denke nicht, dass es zu Problemen bzgl. Akku kommt. Da es so &amp;lt;br&amp;gt;aber perfekt funktioniert, habe ich es gelassen. Das UDP Protokoll kommt zudem mit weniger Netzwerk-Traffic aus.&amp;lt;br&amp;gt;&lt;br /&gt;
Anmeldung:&amp;lt;br&amp;gt;&lt;br /&gt;
Die Anmeldung wurde von der Fritz!Box nicht immer erfolgreich bestätigt. Einfach Weiter klicken und die restlichen Einstellungen vornehmen.&amp;lt;br&amp;gt; Spätestens nach einem Reboot des VPx500 funktioniert alles einwandfrei.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls eure Fritz!Box keine Möglichkeit bietet, ein IP-Telefon anzumelden, empfehle ich euch mal in das http://wiki.ip-phone-forum.de/skript:speedport2fritz einzulesen.&amp;lt;br&amp;gt;&lt;br /&gt;
Bzw. mal im IP-Phone-Forum nach SIP-Registrar suchen.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der SIP Listen Port 5060 hat mich viel Zeit gekostet - stand noch von sipgate direkt auf 5062 und das VP5500 hat sich dann zwar an der fritzbox registriert aber keine eingehenden Anrufe empfangen...&lt;br /&gt;
&lt;br /&gt;
=== Fritz!Box Hinweis ===&lt;br /&gt;
Hinter meiner Fritz!Box konnte ich auf dem Port 5060 keine Incoming Calls bekommen, da die Box auf diesen Port für ihre eigenes System hört.&lt;br /&gt;
Geholfen hat mit dann ein Wechsel auf Port 5061 im Reiter SIP2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Eigener VoIP Server mit Asterisk ==&lt;br /&gt;
&lt;br /&gt;
*http://www.das-asterisk-buch.de&lt;br /&gt;
&lt;br /&gt;
===Asterisk auf einer Fritz!Box===&lt;br /&gt;
&lt;br /&gt;
*http://www.asterisk-kompakt.de/artikel/45-asterisk-auf-fritzbox-phone.html&lt;br /&gt;
&lt;br /&gt;
== Videogespräche zu anderen Clients / Softphones ==&lt;br /&gt;
=== Ekiga Softphone ===&lt;br /&gt;
&lt;br /&gt;
Damit Videos klappen, müssen Ekiga und VP6500 über mindestens einen übereinstimmenden Videocodec verfügen, klar. Im Falle des VP6500 ist es wohl so, daß ausschließlich H.263 in verschiedenen Ausprägungen zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
Ekiga kommt jedoch zunächst unter Ubuntu 9.10 nur mit H.261 und Theora Codec. Wir müssen daher den H.263-Codec in Ekiga zusätzlich einhängen.&lt;br /&gt;
&lt;br /&gt;
Leider ist der H.263-Codec nicht ganz frei zugänglich, sodaß wir eine Fremdquelle benötigen, um den Codec mit dem Paketmanager installieren zu können. Daher muß Bojos Ekiga-Plugin-PPA wie in&lt;br /&gt;
&lt;br /&gt;
https://launchpad.net/~bojo42/+archive/ekiga&lt;br /&gt;
&lt;br /&gt;
beschrieben als Paketquelle hinzugefügt werden. Den zugehörigen Schlüssel nicht vergessen!&lt;br /&gt;
Wenn die neue Quelle bekannt gemacht ist, können im Paketmanager nun die&lt;br /&gt;
&lt;br /&gt;
; Pakete&lt;br /&gt;
: libopal3.6.1-plugins-h263-1998&lt;br /&gt;
: libopal3.6.1-plugins-ilbc&lt;br /&gt;
: libavcodec-dev&lt;br /&gt;
&lt;br /&gt;
installiert werden. Darauf achten, daß alle Abhängigkeiten sauber erfüllt sind.&lt;br /&gt;
Das H.263-Plugin läßt sich nur installieren, wenn libstdc++6 &amp;gt;= 4.4.0 vorhanden ist, was meines Wissens erst ab Ubuntu 9.10 der Fall ist.&lt;br /&gt;
Nach der Installation dieser Komponenten kann Ekiga neu gestartet werden. Es sollte nun unter Bearbeiten-&amp;gt;Einstellungen-&amp;gt;Video-&amp;gt;Codecs zusätzlich den H.263-Codec anbieten. Durch Verschieben nach oben kann man diesen beim Handshake priorisieren.&lt;br /&gt;
Nach Integration des H.263-Codecs in Ekiga konnte ich mit zwei Sipgate-Accounts störungsfrei, sogar über den gleichen DSL-Anschluß, videofonieren.&lt;br /&gt;
&lt;br /&gt;
== DEMO MODE ==&lt;br /&gt;
&lt;br /&gt;
Um den DEMO MODE zwischen einem VP55 und VP65 herzustellen muss man die Dateien&lt;br /&gt;
mit den Einstellungen vom VP55 auf das VP65 übertragen. Diese liegen in&lt;br /&gt;
/usr/local/data/demo/ und es sind vier Dateien. Danach ist die SSID und der KEY&lt;br /&gt;
bei beiden gleich eingerichtet und die beiden Geräte verbinden sich miteinander.&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
== Vorsicht Fallen! ==&lt;br /&gt;
Es ist nicht schwer, sich den Zugang zum Telefon abzuschneiden, wenn man nicht aufpasst.&lt;br /&gt;
&lt;br /&gt;
== Betrieb mit aktivierter serieller Schnittstelle ==&lt;br /&gt;
&lt;br /&gt;
Das 5500 und das 6500 scheint nicht komplett zu starten wenn man TIN auf low hat&lt;br /&gt;
und die serielle Schnittstelle benutzt. Man kann das Gerät dann nicht normal bedienen. Dies lässt sich ändern indem man in der Datei&lt;br /&gt;
&lt;br /&gt;
 /usr/local/startup/daemon.sh&lt;br /&gt;
&lt;br /&gt;
ziemlich am Anfang das TINDETECT=&amp;quot;TRUE&amp;quot; ändert auf TINDETECT=&amp;quot;FALSE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Danach startet er auch mit aktiver serieller Verbindung komplett durch&lt;br /&gt;
und das Gerät ist ganz normal bedienbar.&lt;br /&gt;
&lt;br /&gt;
== Grundlagen ==&lt;br /&gt;
Bestimmte Aktionen werden immer wieder benötigt.&lt;br /&gt;
Diese sollen hier kurz beschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Es werden dennoch grundlegende Kenntnisse von Kommandozeilen vorausgesetzt.&lt;br /&gt;
&lt;br /&gt;
==== Dateien bearbeiten mit vi ====&lt;br /&gt;
Auf dem Telefon ist der minimalistische Editor vi installiert mit dem Dateien über Telnet bearbeitet werden können.&lt;br /&gt;
Für eine genaue Bedienung bitte Google benutzen.&lt;br /&gt;
Die wichtigsten Bedienelemente werden hier kurz erläutert.&lt;br /&gt;
&lt;br /&gt;
Datei Öffnen mit &#039;vi Dateipfad&#039;&lt;br /&gt;
vi kennt zwei Modi: Kommando- und Einfüge-Modus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;i&#039;&#039;&#039; - wechselt in den Einfüge-Modus, in dem geschrieben werden kann&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;a&#039;&#039;&#039; - anhängen (hinter dem aktuellem Zeichen in den Einfüge-Modus)&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;[Esc]&#039;&#039;&#039; wechselt zurück in den Kommandomodus. &lt;br /&gt;
In diesem kann mittels Pfeil- und Bildlauftasten navigiert werden.&lt;br /&gt;
:x - löscht das Zeichen an Cursor position&lt;br /&gt;
:d&#039;&#039;n&#039;&#039;d - löscht &#039;&#039;n&#039;&#039; Zeile(n) in den Zeilenbuffer (ohne &#039;&#039;n&#039;&#039; = eine Zeile)&lt;br /&gt;
:y&#039;&#039;n&#039;&#039;y - kopiert &#039;&#039;n&#039;&#039; Zeile(n) in den Zeilenbuffer (ohne &#039;&#039;n&#039;&#039; = eine Zeile)&lt;br /&gt;
:p - fügt Inhalt des Zeilenbuffer &#039;&#039;&#039;unter&#039;&#039;&#039; der aktuellen Zeile ein&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;q! - schließt ohne zu speichern&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;w - speichert&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;wq - speichert und beenden&lt;br /&gt;
&lt;br /&gt;
==== Dateien auf das Telefon laden ====&lt;br /&gt;
Um Daten von einem http-Server zu laden, benutzt man &lt;br /&gt;
 wget url&lt;br /&gt;
Die Datei wird dann in das aktuelle Verzeichnis geladen, weswegen vorher in das Zielverzeichnis wechseln.&lt;br /&gt;
&lt;br /&gt;
Um Daten von einem ftp-Server zu laden, benutzt man ftp.&lt;br /&gt;
Auch hier muss vorher in das zielverzeichnis gewechselt werden.&lt;br /&gt;
 ftp hostname&lt;br /&gt;
dann gegebenenfalls die Zugangsdaten eingeben und mittels &#039;cd&#039; und &#039;ls&#039; in das Entsprechende Verzeichnis auf dem FTP-Server wechseln&lt;br /&gt;
und anschließend mittels &lt;br /&gt;
 get dateiname&lt;br /&gt;
die Datei herunterladen.&lt;br /&gt;
 &lt;br /&gt;
==== Dateien vom Telefon herunterladen ====&lt;br /&gt;
Auch hier bietet sich ein FTP an.&lt;br /&gt;
Mittels &#039;ftp hostname&#039; verbinden, Benutzerdaten eingeben, in das entsprechende FTP-Server-Verzeischnis wechseln und mittels&lt;br /&gt;
 put localeDatei&lt;br /&gt;
eine Lokale Datei hochladen.&lt;br /&gt;
&lt;br /&gt;
==== Alternative: Dropbear ====&lt;br /&gt;
&lt;br /&gt;
Wurde der dropbear-ssh server installiert [[#Dropbear (SSH-Server) installieren]] können mittels eines Programms mit SCP-Unterstützung (zB. [http://winscp.net/eng/docs/lang:de WinSCP] für Windows) sehr komfortabel Dateien ausgetauscht werden.&lt;br /&gt;
&lt;br /&gt;
Mit WinSCP können auch Dateien direkt bearbeitet werden.&lt;br /&gt;
Der Client lädt die Datei herunter, öffnet einen Editor und lädt die Datei wieder herauf, wenn diese geändert wurde.&lt;br /&gt;
&lt;br /&gt;
== Grundkonfiguration, die das Leben erleichtert ==&lt;br /&gt;
=== .bashrc ===&lt;br /&gt;
Die installierte Shell ist die bash. Einstellungen bezieht sie aus der (versteckten) Datei &amp;quot;.bashrc&amp;quot;. Hier kann man sinnvolle Ergänzungen vornehmen, damit sich das Telefon ein bißchen mehr wie ein gewohntes Linux-System verhält:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
alias vim=vi&lt;br /&gt;
PS1=&amp;quot;[\u@\h] \w $ &amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup ==&lt;br /&gt;
=== Backup des Flash ===&lt;br /&gt;
If you want to make a backup of your root partition, you can do as&lt;br /&gt;
follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
echo &#039;#!/bin/sh&#039; &amp;gt; /tmp/backup.sh&lt;br /&gt;
echo &#039;cat /dev/mtdb2 2&amp;gt;/dev/null&#039; &amp;gt;&amp;gt; /tmp/backup.sh&lt;br /&gt;
chmod 700 /tmp/backup.sh&lt;br /&gt;
micro_inetd 31337 /tmp/backup.sh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This&#039;ll make your device listen for incoming connections on port 31337.&lt;br /&gt;
On your host system you may then simply run &lt;br /&gt;
 nc ip.of.your.phone 31337 &amp;gt; fon_rootfs&lt;br /&gt;
et voilà, you got your rootfs packed into a file.&lt;br /&gt;
&lt;br /&gt;
Note that the backed up file is not ext2, but a jffs2 formatted&lt;br /&gt;
filesystem. These can&#039;t be handled by a simple &amp;quot;mount -o loop&amp;quot; as you&#039;d&lt;br /&gt;
have thought... so here&#039;s how you mount it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
modprobe jffs2&lt;br /&gt;
modprobe mtdram total_size=65536 erase_size=128&lt;br /&gt;
modprobe mtdblock&lt;br /&gt;
mkdir /tmp/phone-root&lt;br /&gt;
mknod /tmp/phone-mtdb2 b 31 0&lt;br /&gt;
dd if=/your/backup/file of=/tmp/phone-mtdb2&lt;br /&gt;
mount -t jffs2 /tmp/phone-mtdb2 /tmp/phone-root&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[#Dateisystem herunterladen]] describes another way to dump the filesystem for closer examination.&lt;br /&gt;
&lt;br /&gt;
=== Komplettes Backup ===&lt;br /&gt;
Die Datei http://www.mikrocontroller.net/attachment/73323/S91backup_pipe auf das Gerät laden und als ausführbar markieren.&lt;br /&gt;
&lt;br /&gt;
 cd /etc/rc.d/init.d&lt;br /&gt;
 wget http://www.mikrocontroller.net/attachment/73323/S91backup_pipe&lt;br /&gt;
 chmod +x /etc/rc.d/init.d/S91backup_pipe&lt;br /&gt;
&lt;br /&gt;
Damit wird eine Art Backup-Server mit dem Boot gestartet.&lt;br /&gt;
wenn man dies nicht möchte kann man das Skript natürlich auch an jeden beliebigen anderen Ort legen und per Hand starten.&lt;br /&gt;
&lt;br /&gt;
Nun kann man von einem Rechner aus mittels nc (netcat) die Bereiche sichern:&lt;br /&gt;
&lt;br /&gt;
 nc 192.168.1.3 31337 &amp;gt; fon_rootfs&lt;br /&gt;
 nc 192.168.1.3 31338 &amp;gt; fon_udata&lt;br /&gt;
 nc 192.168.1.3 31339 &amp;gt; fon_usettings&lt;br /&gt;
 nc 192.168.1.3 31340 &amp;gt; fon_bootld&lt;br /&gt;
 nc 192.168.1.3 31341 &amp;gt; fon_kernel&lt;br /&gt;
&lt;br /&gt;
Die 192.168.1.3 natürlich mit der IP des Gerätes austauschen, die fon_*&lt;br /&gt;
Dateinamen könnt ihr natürlich auch frei vergeben.&lt;br /&gt;
&lt;br /&gt;
fon_udata ist die /user_data Partition, fon_usertings dementsprechend&lt;br /&gt;
die /user_settings Partition.&lt;br /&gt;
&lt;br /&gt;
Der bootld Bereich enthält auch die Parameter. Um das später (falls&lt;br /&gt;
überhaupt nötig) mittels blob zu restaurieren müsste die Datei noch in&lt;br /&gt;
zwei Teile aufgeteilt werden. Der erste enthält dann den reinen&lt;br /&gt;
Bootloader-Bereich, der zweite die Parameter. Wer&#039;s wirklich braucht für&lt;br /&gt;
den kann ich noch ne Anleitung zum Aufteilen geben. Wirklich Sinnvoll&lt;br /&gt;
ist das aber nicht, hat man den Bootloader erstmal mit was anderem&lt;br /&gt;
überschrieben kann man ihn ja auch nicht mehr zum Wiederherstellen&lt;br /&gt;
benutzen....&lt;br /&gt;
&lt;br /&gt;
=== Zurückspielen der Backups ===&lt;br /&gt;
&lt;br /&gt;
1) Man braucht ein (die) Backup-Image(s).&lt;br /&gt;
&lt;br /&gt;
2) Serielle Verbindung zum Telefon&lt;br /&gt;
&lt;br /&gt;
3) Akku abstecken, wieder anstecken.&lt;br /&gt;
&lt;br /&gt;
4) Telefon einschalten und im Terminalprogram auf die Tasten kloppen, so&lt;br /&gt;
das man im Bootloader landet. Dabei muss man recht schnell sein. Es&lt;br /&gt;
sollte dann ein Prompt kommen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
blob&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5) Nun gibt man ein &lt;br /&gt;
   xdownload param&lt;br /&gt;
Wobei &#039;param&#039; der Teil ist, den man wiederherstellen will:&lt;br /&gt;
* blob - Bootloader (fon_bootld)&lt;br /&gt;
* param - Parameter Bereich (Bootloader oder Kernel?) (fon_bootld)&lt;br /&gt;
* kernel - Der Kernel (fon_kernel)&lt;br /&gt;
* ramdisk - Das Root-Filesystem / (fon_rootfs)&lt;br /&gt;
* ramdisk2 - Das /user_data Filesystem (fon_udata)&lt;br /&gt;
* ramdisk3 - Das /user_settings Filesystem (fon_usettings)&lt;br /&gt;
&lt;br /&gt;
Beim Backup ist blob + param in einer Datei, müsste man also ggf.&lt;br /&gt;
erstmal aufsplitten.&lt;br /&gt;
&lt;br /&gt;
6) Er wartet dann auf den Upload. Nun startet man im Terminalprogram den&lt;br /&gt;
Upload des Backup-Images, dazu verwendet man das X-Modem Protokoll.&lt;br /&gt;
&lt;br /&gt;
7) Kaffee trinken, auf&#039;s Klo gehen, mit Frau/Freundin/Mutter ein Gespräch&lt;br /&gt;
anfangen.&lt;br /&gt;
&lt;br /&gt;
8) Irgendwann ist der Upload fertig. Dauert halt lange. Man landet&lt;br /&gt;
wieder am &amp;quot;blob&amp;gt;&amp;quot; prompt. Nun gibt man&lt;br /&gt;
 flash param&lt;br /&gt;
ein.&lt;br /&gt;
&lt;br /&gt;
9) Er schreibt nun das, was man hochgeladen hat, in das Flash.&lt;br /&gt;
&lt;br /&gt;
10) &amp;quot;boot&amp;quot; eingeben. Da Telefon bootet nun normal.&lt;br /&gt;
&lt;br /&gt;
Achtung: Wenn im Backup nicht die Änderung gemacht wurde damit das&lt;br /&gt;
Telefon auch bei angeschlossener serieller Schnittstelle startet, kommt&lt;br /&gt;
man nicht weiter als wie bis zur Sanduhr. Dann einfach die serielle&lt;br /&gt;
abstecken (Also den TIN pin wieder freigeben) und das Telefon neustarten&lt;br /&gt;
(Akku kurz ab- und wieder anstöpseln)&lt;br /&gt;
&lt;br /&gt;
=== Dateisystem herunterladen ===&lt;br /&gt;
Zum unkomplizierten Durchsuchen des Dateisystems kann es nützlich sein, dieses vom Gerät zu kopieren.&lt;br /&gt;
&lt;br /&gt;
Folgende Befehle erzeugen wie beim Backup des Flash einen kleinen Server, dessen Output auf anderer Seite mittels mittels nc abgeholt werden kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
echo &#039;#! /bin/sh&#039; &amp;gt; /tmp/backup.sh&lt;br /&gt;
echo &#039;cd /&#039; &amp;gt;&amp;gt; /tmp/backup.sh&lt;br /&gt;
chmod 700 /tmp/backup.sh&lt;br /&gt;
echo &#039;tar cf - bin boot dev etc home lib mnt opt root sbin tmp trace upgrade user_data user_settings usr var 2&amp;gt;/dev/null&#039; &amp;gt;&amp;gt; /tmp/backup.sh&lt;br /&gt;
micro_inetd 31340 /tmp/backup.sh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die lange Liste mit Unterverzeichnissen ist notwendig um /proc zu überspringen, was Probleme mit tar verursachen würde.&lt;br /&gt;
&lt;br /&gt;
Auf einem anderen Linux system (oder cygwin) kann mittels&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  nc telefon-Ip 31340 &amp;gt; file.tar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
die Datei abgerufen werden.&lt;br /&gt;
&lt;br /&gt;
Der Vorgang dauert aber ein ganz paar Minuten.&lt;br /&gt;
&lt;br /&gt;
Heraus kommt ein Tar-Archiv, was alle Dateien des Gerätes enthält - inclusive der temporären Dateien der Ram-Disks.&lt;br /&gt;
&lt;br /&gt;
== Erkunden des Systems mit Bordmitteln ==&lt;br /&gt;
&lt;br /&gt;
=== Ausgabe von &amp;lt;b&amp;gt;&amp;lt;tt&amp;gt;dmesg&amp;lt;/tt&amp;gt;&amp;lt;/b&amp;gt; auf einem VP6500 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
6&amp;gt;NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.&lt;br /&gt;
NetWinder Floating Point Emulator V0.95 (c) 1998-1999 Rebel.com&lt;br /&gt;
VFS: Mounted root (jffs2 filesystem).&lt;br /&gt;
Freeing init memory: 68K&lt;br /&gt;
PCB version: ind3 v2&lt;br /&gt;
Driver SYSTCLK: SYSTCLK-1.12 (REFERENCED)&lt;br /&gt;
Driver GPIO-1.59 (REFERENCED)&lt;br /&gt;
****p_gpio_init_low_bat****&lt;br /&gt;
GPIO: p_gpio_it_init at 762&lt;br /&gt;
Driver FRAMEBUF-1.12 (REFERENCED)&lt;br /&gt;
Driver SPI-1.20 (REFERENCED) Debug level 3&lt;br /&gt;
&lt;br /&gt;
u32_spi1_MinLenghtForDMAInTX set to 300&lt;br /&gt;
&lt;br /&gt;
u32_spi1_MinLenghtForDMAInRX set to 300&lt;br /&gt;
Driver LCD-1.20 (REFERENCED)&lt;br /&gt;
Driver TVLINK-1.45 (REFERENCED)&lt;br /&gt;
Reset from Software Reset.&lt;br /&gt;
Motorola PostProcessor Linux driver ver 0.64 - Copyright (C) 2003 Motorola Inc&lt;br /&gt;
pp: hw ver = 2&lt;br /&gt;
prp_dbg=0&lt;br /&gt;
Motorola PreProcessor Linux driver ver 0.0 - Copyright (C) 2003 Motorola Inc&lt;br /&gt;
hmp4d: base_port=0x10026800 irq=50&lt;br /&gt;
hmp4d: module inserted&lt;br /&gt;
hmp4e: base_port=0x10026c00 irq=49&lt;br /&gt;
hmp4e: Compatble HW found with ID: 0x004c1882&lt;br /&gt;
hmp4e: module inserted. Major = 249&lt;br /&gt;
SPI2:: drv_Init :PID of driver: 134&lt;br /&gt;
SPI2:: drv_Init :ScanList not provided. Will use the default scan list.&lt;br /&gt;
SPI2:: drv_Init :ScanChannelList :1 6 11 14 2 7 12 3 8 13 4 9 5 10&lt;br /&gt;
SPI2:: drv_Init :setting PhyType to: Rf-to-Rf&lt;br /&gt;
SPI2:: drv_Init :Ref.Clock parameter not provided&lt;br /&gt;
SPI2:: drv_Init :Configure target for a reference clock of &#039;default=40&#039; Mhz.&lt;br /&gt;
SPI2:: drvRegEtherDev :Interface Name is: eth%d&lt;br /&gt;
SPI2:: drv_Init :HEOCSIWPOWON: Powering on...&lt;br /&gt;
SPI2:: drvPhase2Init :Protocol Firmware will be loaded by driver ...&lt;br /&gt;
SPI2:: drvPhase2Init :Initializing HHAL (PhgHhalInitialize)...&lt;br /&gt;
Divider : 8&lt;br /&gt;
&lt;br /&gt;
 OCR2 : e4015308 (12582912)&lt;br /&gt;
Reset : 3 / 27 (c497cc00 / e401531c)&lt;br /&gt;
&lt;br /&gt;
Reset : 3 / 27 (c497cc00 / e401531c)&lt;br /&gt;
GPIO: p_gpio_init_gpio_status at 1262&lt;br /&gt;
GPIO: POWER_FAIL signal NOT detected at GPIO driver init carry on !!!&lt;br /&gt;
GPIO: CHARGE_IN at init&lt;br /&gt;
GPIO: LOW_BAT_OUT at init&lt;br /&gt;
GPIO: No accessory plugged at init.  - Set Video on jack&lt;br /&gt;
GPIO: camera to front at init&lt;br /&gt;
**ChargeStatusPmb=========gpio_Read_ChargeStatus_Ready=1&lt;br /&gt;
SPI2:: PhgOsal_linux_init_thread :assigning thread name and deamonize() ..&lt;br /&gt;
SPI2:: drvPhase2Init :Success&lt;br /&gt;
SPI2:: drvPhase2Init : registering callbacks with HHAL..&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVNT_INIT_COMPLETE; setting CARRIER_ON&lt;br /&gt;
SPI2:: drvPhase2Init :calling PhgHhalQueueMgmtReq()!&lt;br /&gt;
PhgHhalQueueMgmtReq:1172:HHAL got Init message&lt;br /&gt;
PhgHhalQueueMgmtReq:1217:HHAL done Init message&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PS wake (0) in Drvmain&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVENT_DISCONNECT; setting CARRIER_OFF&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :netdev-&amp;gt;flags=0x00001002, IFF_UP=0&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :device was already closed&lt;br /&gt;
SPI2:: drvMgmtCfmHndler :Using MAC Address: 00:08:c6:86:8b:99&lt;br /&gt;
SPI2:: drvPhase2Init :init etherdev; stopping queue, setting CARRIER_OFF&lt;br /&gt;
SPI2:: drv_Init :Philips WLAN Drv - loaded - in state: 1&lt;br /&gt;
SPI2:: drvInit :Philips WLAN Drv - loaded&lt;br /&gt;
SPI2:: drvOpen :opening net device&lt;br /&gt;
SPI2:: drvOpen :Device is not associated!&lt;br /&gt;
SPI2:: drvOpen :Carrier flag is already set to CARRIER_OFF&lt;br /&gt;
SPI2:: drvOpen :Disabling again netqueue&lt;br /&gt;
requested reg.domain code setting = 3&lt;br /&gt;
SPI2:: drvIoctl :set u8LinkAdaptation  : 1 Result=[0]&lt;br /&gt;
SPI2:: drvIoctl :changed HEOCSIWLNADPALLOWRATES: 8 allowed rate codes&lt;br /&gt;
SPI2:: drvInitConnect :Req to connect to new WLAN network&lt;br /&gt;
SPI2:: drvInitConnect :Disabling TX queue and setting CARRIER_OFF&lt;br /&gt;
SPI2:: drvInitConnect :Connecting To AP...&lt;br /&gt;
SPI2:: drvInitConnect :step2&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVENT_DISCONNECT; setting CARRIER_OFF&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :netdev-&amp;gt;flags=0x00001003, IFF_UP=1&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :device was already opened; stopping queue&lt;br /&gt;
SPI2:: drvInitConnect :step3 : u8Status 255&lt;br /&gt;
SPI2:: drvInitConnect :step5&lt;br /&gt;
SPI2:: drvInitConnect :TIMEDOUT&lt;br /&gt;
SPI2:: drvInitConnect :step6&lt;br /&gt;
SPI2:: drvInitParamsAndPowerOnAndConnect :Connect failed!&lt;br /&gt;
Motorola CSI Linux driver ver 0.1&lt;br /&gt;
 - Copyright (C) 2004 Motorola Inc&lt;br /&gt;
&lt;br /&gt;
Driver SENSOR-1.29 (REFERENCED)&lt;br /&gt;
i2c-client version : 1.9&lt;br /&gt;
Initialize i2c-client-aic14 module&lt;br /&gt;
Module i2c-client-aic14 initialized&lt;br /&gt;
Insert module aic14 (AIC14-1.0)&lt;br /&gt;
Module AIC14 assumes CODEC MCLK already configured for 20480000Hz&lt;br /&gt;
Driver KPP-1.36 (REFERENCED)&lt;br /&gt;
Driver DOZE-1.27 (REFERENCED)&lt;br /&gt;
SPI2:: drvDoScan :Buero (bittorf)&lt;br /&gt;
SPI2:: drvProcessScanCfm :Scan Confirm: Success 1 APs&lt;br /&gt;
SPI2:: drvInitConnect :Req to connect to new WLAN network&lt;br /&gt;
SPI2:: drvInitConnect :Disabling TX queue and setting CARRIER_OFF&lt;br /&gt;
SPI2:: drvInitConnect :Connecting To AP...&lt;br /&gt;
SPI2:: drvInitConnect :step2&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVNT_INIT_CONNECT; setting CARRIER_ON&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :netdev-&amp;gt;flags=0x00001003, IFF_UP=1&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :device was already opened; enabling queue&lt;br /&gt;
SPI2:: drvInitConnect :step3 : u8Status 8&lt;br /&gt;
SPI2:: drvInitConnect :step4&lt;br /&gt;
SPI2:: drvInitConnect :Successful&lt;br /&gt;
SPI2:: drvInitConnect :step6&lt;br /&gt;
SPI2:: drvIoctl :dot11LongRetryLimitAC0 = 8&lt;br /&gt;
SPI2:: drvIoctl :dot11LongRetryLimitAC1 = 8&lt;br /&gt;
SPI2:: drvIoctl :dot11LongRetryLimitAC2 = 8&lt;br /&gt;
SPI2:: drvIoctl :dot11LongRetryLimitAC3 = 8&lt;br /&gt;
SPI2:: drvIoctl :dot11ShortRetryLimitAC0 = 8&lt;br /&gt;
SPI2:: drvIoctl :dot11ShortRetryLimitAC1 = 8&lt;br /&gt;
SPI2:: drvIoctl :dot11ShortRetryLimitAC2 = 8&lt;br /&gt;
SPI2:: drvIoctl :dot11ShortRetryLimitAC3 = 8&lt;br /&gt;
SPI2:: drvIoctl :PA Request&lt;br /&gt;
SPI2:: drvIoctl :No state change!&lt;br /&gt;
SPI2:: drvIoctl :Fast PS Request&lt;br /&gt;
PhgHhalDoM2SDMA:1661:--&amp;gt;P1&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PS Ind (1) in Drvmain&lt;br /&gt;
SPI2:: drvStop :Driver Stop: disable TX queue! (usage: 2)&lt;br /&gt;
SPI2:: drvIoctl :Deauth BSSID: 00:1d:7e:18:e3:89&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVENT_DISCONNECT; setting CARRIER_OFF&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :netdev-&amp;gt;flags=0x00000002, IFF_UP=0&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :device was already closed&lt;br /&gt;
SPI2:: drvOpen :opening net device&lt;br /&gt;
SPI2:: drvOpen :ERROR: Associated, but Carrier flag is set to CARRIER_OFF&lt;br /&gt;
SPI2:: drvDoScan :Buero (bittorf)&lt;br /&gt;
SPI2:: drvProcessScanCfm :Scan Confirm: Success 1 APs&lt;br /&gt;
SPI2:: drvInitConnect :Req to connect to new WLAN network&lt;br /&gt;
SPI2:: drvInitConnect :Disabling TX queue and setting CARRIER_OFF&lt;br /&gt;
SPI2:: drvInitConnect :Connecting To AP...&lt;br /&gt;
SPI2:: drvInitConnect :step2&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVNT_INIT_CONNECT; setting CARRIER_ON&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :netdev-&amp;gt;flags=0x00000003, IFF_UP=1&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :device was already opened; enabling queue&lt;br /&gt;
SPI2:: drvInitConnect :step3 : u8Status 8&lt;br /&gt;
SPI2:: drvInitConnect :step4&lt;br /&gt;
SPI2:: drvInitConnect :Successful&lt;br /&gt;
SPI2:: drvInitConnect :step6&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PS Ind (1) in Drvmain&lt;br /&gt;
SPI2:: drvIoctl :PA Request&lt;br /&gt;
PhgHhalDoM2SDMA:1661:--&amp;gt;P0&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PS wake (0) in Drvmain&lt;br /&gt;
drvSetWOWFilter: Enable UNICAST: Disable ARP: Enable&lt;br /&gt;
Ip addr = 10.63.17.5. LMP=2&lt;br /&gt;
SPI2:: drvIoctl :PA Request&lt;br /&gt;
SPI2:: drvIoctl :No state change!&lt;br /&gt;
SPI2:: drvIoctl :Fast PS Request&lt;br /&gt;
PhgHhalDoM2SDMA:1661:--&amp;gt;P1&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PS Ind (1) in Drvmain&lt;br /&gt;
Sensor driver: initialize device OV7660&lt;br /&gt;
Warning: Remapping obsolete /dev/fb* minor 32 to 1&lt;br /&gt;
SPI2:: drvIoctl :dot11LongRetryLimitAC0 = 4&lt;br /&gt;
SPI2:: drvIoctl :dot11LongRetryLimitAC1 = 4&lt;br /&gt;
SPI2:: drvIoctl :dot11LongRetryLimitAC2 = 4&lt;br /&gt;
SPI2:: drvIoctl :dot11LongRetryLimitAC3 = 4&lt;br /&gt;
SPI2:: drvIoctl :dot11ShortRetryLimitAC0 = 4&lt;br /&gt;
SPI2:: drvIoctl :dot11ShortRetryLimitAC1 = 4&lt;br /&gt;
SPI2:: drvIoctl :dot11ShortRetryLimitAC2 = 4&lt;br /&gt;
SPI2:: drvIoctl :dot11ShortRetryLimitAC3 = 4&lt;br /&gt;
SPI2:: drvIoctl :PA Request&lt;br /&gt;
PhgHhalDoM2SDMA:1661:--&amp;gt;P0&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PS wake (0) in Drvmain&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ausgabe von &amp;lt;b&amp;gt;&amp;lt;tt&amp;gt;logread&amp;lt;/tt&amp;gt;&amp;lt;/b&amp;gt; auf einem VP6500 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Jan  1 00:00:00 imx21 syslog.info syslogd started: BusyBox v0.60.0 (2007.02.28-13:39+0000)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.emerg klogd: klogd started: BusyBox v0.60.0 (2007.02.28-13:39+0000)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Linux version 2.4.20-celf3 (root@wbul04) (gcc version 3.3.2) #1 Wed Feb 28 13:30:26 UTC 2007&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: CPU: ARM926EJ-Sid(wb) [41069264] revision 4 (ARMv?(8))&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: CPU: D undefined 14 cache&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: CPU: I cache: 16384 bytes, associativity 4, 32 byte lines, 128 sets&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: CPU: D cache: 16384 bytes, associativity 4, 32 byte lines, 128 sets&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Machine: Freescale i.MX2 ADS&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: FCLK=266000 kHz   HCLK=133000 kHz  IPGCLK=66500 kHz&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: PERCLKs: 1=44333 KHz  2=33250 kHz  3=44333 kHz  4=88666 kHz&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: On node 0 totalpages: 16384&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: zone(0): 16384 pages.&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: zone(1): 0 pages.&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: zone(2): 0 pages.&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Kernel command line: root=/dev/mtdblock2 noinitrd ip=none mtdparts=s29gl512n:256k@0x00000000&lt;br /&gt;
(bootloader)ro,896k@0x00040000(kernel)ro,50432k@0x00120000(fs#1),12800k@0x03260000(fs#2),1152k@0x03EE0000(fs#3)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.debug klogd: Relocating machine vectors to 0xffff0000&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Console: colour dummy device 80x30&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Calibrating delay loop (skipped)... 132.71 BogoMIPS&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Memory: 64MB = 64MB total&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: Memory: 63052KB available (1366K code, 299K data, 68K init)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Dentry cache hash table entries: 8192 (order: 4, 65536 bytes)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Inode cache hash table entries: 4096 (order: 3, 32768 bytes)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Mount-cache hash table entries: 1024 (order: 1, 8192 bytes)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Buffer-cache hash table entries: 4096 (order: 2, 16384 bytes)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Page-cache hash table entries: 16384 (order: 4, 65536 bytes)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: POSIX conformance testing by UNIFIX&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Linux NET4.0 for Linux 2.4&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Based upon Swansea University Computer Society NET3.039&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Initializing RT netlink socket&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: apm: Simulating APM BIOS version 1.2 (Driver version 1.0)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: i.MX21 Dynamic Power Management&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Starting kswapd&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Disabling the Out Of Memory Killer&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: JFFS2 version 2.1. (C) 2001, 2002 Red Hat, Inc., designed by Axis Communications AB.&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: i2c-core.o: i2c core module version 2.6.2 (20011118)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: pty: 256 Unix98 ptys configured&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Serial driver version 5.05c (2001-07-08) with no serial options enabled&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: UART driver version 0.3.6&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: I2C driver Feb 28 2007 / 13:31:04&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Initialize i2c-client-dbmx-codec module&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: s29gl512n: probing 16-bit flash bus&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd:  Amd/Fujitsu Extended Query Table v1.3 at 0x0040&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: number of CFI chips: 1&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: cfi_cmdset_0002: Using Write Buffer method.&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: cfi_cmdset_0002: buffer_Write_Time = 128&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: cfi_cmdset_0002: Disabling fast programming due to code brokenness.&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: Using static partition definition&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: Creating 5 MTD partitions on &amp;quot;s29gl512n&amp;quot;:&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: 0x00000000-0x00040000 : &amp;quot;bootloader&amp;quot;&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: 0x00040000-0x00120000 : &amp;quot;kernel&amp;quot;&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: 0x00120000-0x03260000 : &amp;quot;fs #1&amp;quot;&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: 0x03260000-0x03ee0000 : &amp;quot;fs #2&amp;quot;&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: 0x03ee0000-0x04000000 : &amp;quot;fs #3&amp;quot;&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: NET4: Linux TCP/IP 1.0 for NET4.0&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: IP Protocols: ICMP, UDP, TCP&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: IP: routing cache hash table of 512 buckets, 4Kbytes&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: TCP: Hash tables configured (established 4096 bind 8192)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: NetWinder Floating Point Emulator V0.95 (c) 1998-1999 Rebel.com&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: VFS: Mounted root (jffs2 filesystem).&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Freeing init memory: 68K&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: PCB version: ind3 v2&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Driver SYSTCLK: SYSTCLK-1.12 (REFERENCED)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Driver GPIO-1.59 (REFERENCED)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: ****p_gpio_init_low_bat****&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: GPIO: p_gpio_it_init at 762&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Driver FRAMEBUF-1.12 (REFERENCED)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Driver SPI-1.20 (REFERENCED) Debug level 3&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: &lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: u32_spi1_MinLenghtForDMAInTX set to 300&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: &lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: u32_spi1_MinLenghtForDMAInRX set to 300&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Driver LCD-1.20 (REFERENCED)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Driver TVLINK-1.45 (REFERENCED)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Reset from Software Reset.&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Motorola PostProcessor Linux driver ver 0.64 - Copyright (C) 2003 Motorola Inc&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: pp: hw ver = 2&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: prp_dbg=0&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: Motorola PreProcessor Linux driver ver 0.0 - Copyright (C) 2003 Motorola Inc&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.info klogd: hmp4d: base_port=0x10026800 irq=50&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.info klogd: hmp4d: module inserted&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.info klogd: hmp4e: base_port=0x10026c00 irq=49&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.info klogd: hmp4e: Compatble HW found with ID: 0x004c1882&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.info klogd: hmp4e: module inserted. Major = 249&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.err klogd: SPI2:: drv_Init :PID of driver: 134 &lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.err klogd: SPI2:: drv_Init :ScanList not provided. Will use the default scan list. &lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.err klogd: SPI2:: drv_Init :ScanChannelList :1 6 11 14 2 7 12 3 8 13 4 9 5 10 &lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.err klogd: SPI2:: drv_Init :setting PhyType to: Rf-to-Rf&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.err klogd: SPI2:: drv_Init :Ref.Clock parameter not provided&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.err klogd: SPI2:: drv_Init :Configure target for a reference clock of &#039;default=40&#039; Mhz.&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.err klogd: SPI2:: drvRegEtherDev :Interface Name is: eth%d &lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.err klogd: SPI2:: drv_Init :HEOCSIWPOWON: Powering on... &lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.err klogd: SPI2:: drvPhase2Init :Protocol Firmware will be loaded by driver ...&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.err klogd: SPI2:: drvPhase2Init :Initializing HHAL (PhgHhalInitialize)...&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: Divider : 8&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: &lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd:  OCR2 : e4015308 (12582912)&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: Reset : 3 / 27 (c497cc00 / e401531c)&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: &lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: Reset : 3 / 27 (c497cc00 / e401531c)&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: GPIO: p_gpio_init_gpio_status at 1262&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: GPIO: POWER_FAIL signal NOT detected at GPIO driver init carry on !!! &lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: GPIO: CHARGE_IN at init&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: GPIO: LOW_BAT_OUT at init&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: GPIO: No accessory plugged at init.  - Set Video on jack&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: GPIO: camera to front at init&lt;br /&gt;
Jan  1 00:00:04 imx21 daemon.warn klogd: **ChargeStatusPmb=========gpio_Read_ChargeStatus_Ready=1 &lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: PhgOsal_linux_init_thread :assigning thread name and deamonize() .. &lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvPhase2Init :Success&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvPhase2Init : registering callbacks with HHAL.. &lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVNT_INIT_COMPLETE; setting CARRIER_ON&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvPhase2Init :calling PhgHhalQueueMgmtReq()!&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.info klogd: PhgHhalQueueMgmtReq:1172:HHAL got Init message&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.info klogd: PhgHhalQueueMgmtReq:1217:HHAL done Init message&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PS wake (0) in Drvmain&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVENT_DISCONNECT; setting CARRIER_OFF&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :netdev-&amp;gt;flags=0x00001002, IFF_UP=0&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :device was already closed&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvMgmtCfmHndler :Using MAC Address: 00:08:c6:86:8b:99&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvPhase2Init :init etherdev; stopping queue, setting CARRIER_OFF&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drv_Init :Philips WLAN Drv - loaded - in state: 1 &lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvInit :Philips WLAN Drv - loaded&lt;br /&gt;
Jan  1 00:00:07 imx21 daemon.err klogd: SPI2:: drvOpen :opening net device&lt;br /&gt;
Jan  1 00:00:07 imx21 daemon.err klogd: SPI2:: drvOpen :Device is not associated!&lt;br /&gt;
Jan  1 00:00:07 imx21 daemon.err klogd: SPI2:: drvOpen :Carrier flag is already set to CARRIER_OFF&lt;br /&gt;
Jan  1 00:00:07 imx21 daemon.err klogd: SPI2:: drvOpen :Disabling again netqueue&lt;br /&gt;
Jan  1 00:00:07 imx21 daemon.warn klogd: requested reg.domain code setting = 3&lt;br /&gt;
Jan  1 00:00:07 imx21 daemon.err klogd: SPI2:: drvIoctl :set u8LinkAdaptation  : 1 Result=[0]&lt;br /&gt;
Jan  1 00:00:07 imx21 daemon.err klogd: SPI2:: drvIoctl :changed HEOCSIWLNADPALLOWRATES: 8 allowed rate codes&lt;br /&gt;
Jan  1 00:00:07 imx21 daemon.err klogd: SPI2:: drvInitConnect :Req to connect to new WLAN network&lt;br /&gt;
Jan  1 00:00:07 imx21 daemon.err klogd: SPI2:: drvInitConnect :Disabling TX queue and setting CARRIER_OFF&lt;br /&gt;
Jan  1 00:00:07 imx21 daemon.err klogd: SPI2:: drvInitConnect :Connecting To AP...&lt;br /&gt;
Jan  1 00:00:07 imx21 daemon.err klogd: SPI2:: drvInitConnect :step2&lt;br /&gt;
Jan  1 00:00:10 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
Jan  1 00:00:10 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVENT_DISCONNECT; setting CARRIER_OFF&lt;br /&gt;
Jan  1 00:00:10 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :netdev-&amp;gt;flags=0x00001003, IFF_UP=1&lt;br /&gt;
Jan  1 00:00:10 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :device was already opened; stopping queue&lt;br /&gt;
Jan  1 00:00:11 imx21 daemon.err klogd: SPI2:: drvInitConnect :step3 : u8Status 255&lt;br /&gt;
Jan  1 00:00:11 imx21 daemon.err klogd: SPI2:: drvInitConnect :step5&lt;br /&gt;
Jan  1 00:00:11 imx21 daemon.err klogd: SPI2:: drvInitConnect :TIMEDOUT&lt;br /&gt;
Jan  1 00:00:11 imx21 daemon.err klogd: SPI2:: drvInitConnect :step6&lt;br /&gt;
Jan  1 00:00:11 imx21 daemon.err klogd: SPI2:: drvInitParamsAndPowerOnAndConnect :Connect failed!&lt;br /&gt;
Jan  1 00:00:12 imx21 daemon.warn klogd: Motorola CSI Linux driver ver 0.1&lt;br /&gt;
Jan  1 00:00:12 imx21 daemon.warn klogd:  - Copyright (C) 2004 Motorola Inc&lt;br /&gt;
Jan  1 00:00:12 imx21 daemon.warn klogd: &lt;br /&gt;
Jan  1 00:00:12 imx21 daemon.info klogd: Driver SENSOR-1.29 (REFERENCED)&lt;br /&gt;
Jan  1 00:00:12 imx21 daemon.info klogd: i2c-client version : 1.9&lt;br /&gt;
Jan  1 00:00:12 imx21 daemon.info klogd: Initialize i2c-client-aic14 module&lt;br /&gt;
Jan  1 00:00:12 imx21 daemon.info klogd: Module i2c-client-aic14 initialized&lt;br /&gt;
Jan  1 00:00:12 imx21 daemon.alert klogd: Insert module aic14 (AIC14-1.0)&lt;br /&gt;
Jan  1 00:00:12 imx21 daemon.warn klogd: Module AIC14 assumes CODEC MCLK already configured for 20480000Hz&lt;br /&gt;
Jan  1 00:00:12 imx21 daemon.info klogd: Driver KPP-1.36 (REFERENCED)&lt;br /&gt;
Jan  1 00:00:13 imx21 daemon.info klogd: Driver DOZE-1.27 (REFERENCED)&lt;br /&gt;
Jan  1 00:00:14 imx21 daemon.err klogd: SPI2:: drvDoScan :Buero (bittorf)&lt;br /&gt;
Jan  1 00:00:15 imx21 daemon.err klogd: SPI2:: drvProcessScanCfm :Scan Confirm: Success 1 APs&lt;br /&gt;
Jan  1 00:00:15 imx21 daemon.info netsyncd[315]: creating FIFO_NETSYNC_HMON_NAME... &lt;br /&gt;
Jan  1 00:00:15 imx21 daemon.info netsyncd[315]: creating FIFO_HMON_NETSYNC_NAME... &lt;br /&gt;
Jan  1 00:00:18 imx21 daemon.err klogd: SPI2:: drvInitConnect :Req to connect to new WLAN network&lt;br /&gt;
Jan  1 00:00:18 imx21 daemon.err klogd: SPI2:: drvInitConnect :Disabling TX queue and setting CARRIER_OFF&lt;br /&gt;
Jan  1 00:00:18 imx21 daemon.err klogd: SPI2:: drvInitConnect :Connecting To AP...&lt;br /&gt;
Jan  1 00:00:18 imx21 daemon.err klogd: SPI2:: drvInitConnect :step2&lt;br /&gt;
Jan  1 00:00:19 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
Jan  1 00:00:19 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVNT_INIT_CONNECT; setting CARRIER_ON&lt;br /&gt;
Jan  1 00:00:19 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :netdev-&amp;gt;flags=0x00001003, IFF_UP=1&lt;br /&gt;
Jan  1 00:00:19 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :device was already opened; enabling queue&lt;br /&gt;
Jan  1 00:00:19 imx21 daemon.err klogd: SPI2:: drvInitConnect :step3 : u8Status 8&lt;br /&gt;
Jan  1 00:00:19 imx21 daemon.err klogd: SPI2:: drvInitConnect :step4&lt;br /&gt;
Jan  1 00:00:19 imx21 daemon.err klogd: SPI2:: drvInitConnect :Successful&lt;br /&gt;
Jan  1 00:00:19 imx21 daemon.err klogd: SPI2:: drvInitConnect :step6&lt;br /&gt;
Jan  1 00:00:19 imx21 daemon.err modprobe: modprobe: Can&#039;t locate module sound-slot-0&lt;br /&gt;
Jan  1 00:00:19 imx21 daemon.err modprobe: modprobe: Can&#039;t locate module sound-service-0-0&lt;br /&gt;
Jan  1 00:00:20 imx21 local0.debug dhcpcd[337]: broadcasting DHCP_DISCOVER &lt;br /&gt;
Jan  1 00:00:23 imx21 local0.debug dhcpcd[337]: DHCP_OFFER received from  (10.63.17.1) &lt;br /&gt;
Jan  1 00:00:23 imx21 local0.debug dhcpcd[337]: DHCP_ACK received from  (10.63.17.1) &lt;br /&gt;
Jan  1 00:00:23 imx21 daemon.err netsyncd[314]: father received(10) eth0 up! &lt;br /&gt;
Jan  1 00:00:23 imx21 daemon.info netsyncd[314]: Dhcp_start 337 return : 0  &lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC0 = 8&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC1 = 8&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC2 = 8&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC3 = 8&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC0 = 8&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC1 = 8&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC2 = 8&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC3 = 8&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvIoctl :PA Request&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvIoctl :No state change!&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvIoctl :Fast PS Request&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.info klogd: PhgHhalDoM2SDMA:1661:--&amp;gt;P1&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PS Ind (1) in Drvmain&lt;br /&gt;
Jan  1 00:00:28 imx21 daemon.info netsyncd[314]: Dhcp_stop 359 return : 0  &lt;br /&gt;
Jan  1 00:00:28 imx21 local0.debug dhcpcd[347]: sending DHCP_RELEASE for 10.63.17.5 to 10.63.17.1 &lt;br /&gt;
Jan  1 00:00:29 imx21 local0.err dhcpcd[347]: terminating on signal 1 &lt;br /&gt;
Jan  1 00:00:29 imx21 daemon.err netsyncd[314]: father received(12) eth0 down! &lt;br /&gt;
Jan  1 00:00:29 imx21 daemon.err klogd: SPI2:: drvStop :Driver Stop: disable TX queue! (usage: 2)&lt;br /&gt;
Jan  1 00:00:41 imx21 daemon.err klogd: SPI2:: drvIoctl :Deauth BSSID: 00:1d:7e:18:e3:89&lt;br /&gt;
Jan  1 00:00:41 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
Jan  1 00:00:41 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVENT_DISCONNECT; setting CARRIER_OFF&lt;br /&gt;
Jan  1 00:00:41 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :netdev-&amp;gt;flags=0x00000002, IFF_UP=0&lt;br /&gt;
Jan  1 00:00:41 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :device was already closed&lt;br /&gt;
Jan  1 00:00:41 imx21 daemon.err klogd: SPI2:: drvOpen :opening net device&lt;br /&gt;
Jan  1 00:00:41 imx21 daemon.err klogd: SPI2:: drvOpen :ERROR: Associated, but Carrier flag is set to CARRIER_OFF&lt;br /&gt;
Jan  1 00:00:41 imx21 daemon.err klogd: SPI2:: drvDoScan :Buero (bittorf)&lt;br /&gt;
Jan  1 00:00:42 imx21 daemon.err klogd: SPI2:: drvProcessScanCfm :Scan Confirm: Success 1 APs&lt;br /&gt;
Jan  1 00:00:45 imx21 daemon.err klogd: SPI2:: drvInitConnect :Req to connect to new WLAN network&lt;br /&gt;
Jan  1 00:00:45 imx21 daemon.err klogd: SPI2:: drvInitConnect :Disabling TX queue and setting CARRIER_OFF&lt;br /&gt;
Jan  1 00:00:45 imx21 daemon.err klogd: SPI2:: drvInitConnect :Connecting To AP...&lt;br /&gt;
Jan  1 00:00:45 imx21 daemon.err klogd: SPI2:: drvInitConnect :step2&lt;br /&gt;
Jan  1 00:00:46 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
Jan  1 00:00:46 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVNT_INIT_CONNECT; setting CARRIER_ON&lt;br /&gt;
Jan  1 00:00:46 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :netdev-&amp;gt;flags=0x00000003, IFF_UP=1&lt;br /&gt;
Jan  1 00:00:46 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :device was already opened; enabling queue&lt;br /&gt;
Jan  1 00:00:46 imx21 daemon.err klogd: SPI2:: drvInitConnect :step3 : u8Status 8&lt;br /&gt;
Jan  1 00:00:46 imx21 daemon.err klogd: SPI2:: drvInitConnect :step4&lt;br /&gt;
Jan  1 00:00:46 imx21 daemon.err klogd: SPI2:: drvInitConnect :Successful&lt;br /&gt;
Jan  1 00:00:46 imx21 daemon.err klogd: SPI2:: drvInitConnect :step6&lt;br /&gt;
Jan  1 00:00:46 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PS Ind (1) in Drvmain&lt;br /&gt;
Jan  1 00:00:54 imx21 local0.debug dhcpcd[386]: broadcasting DHCP_DISCOVER &lt;br /&gt;
Jan  1 00:00:57 imx21 local0.debug dhcpcd[386]: DHCP_OFFER received from  (10.63.17.1) &lt;br /&gt;
Jan  1 00:00:57 imx21 local0.debug dhcpcd[386]: DHCP_ACK received from  (10.63.17.1) &lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.info netsyncd[314]: Dhcp_start 386 return : 0  &lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.info netsyncd[314]: NTP server request on : ntp.xs4all.nl &lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.err klogd: SPI2:: drvIoctl :PA Request&lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.info klogd: PhgHhalDoM2SDMA:1661:--&amp;gt;P0&lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PS wake (0) in Drvmain&lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.warn klogd: drvSetWOWFilter: Enable UNICAST: Disable ARP: Enable&lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.warn klogd: Ip addr = 10.63.17.5. LMP=2&lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.err klogd: SPI2:: drvIoctl :PA Request&lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.err klogd: SPI2:: drvIoctl :No state change!&lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.err klogd: SPI2:: drvIoctl :Fast PS Request&lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.info klogd: PhgHhalDoM2SDMA:1661:--&amp;gt;P1&lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PS Ind (1) in Drvmain&lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.warn klogd: Sensor driver: initialize device OV7660&lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.warn klogd: Warning: Remapping obsolete /dev/fb* minor 32 to 1&lt;br /&gt;
Apr  7 09:58:16 imx21 daemon.info netsyncd[314]: NTP process return code : 0  &lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC0 = 4&lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC1 = 4&lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC2 = 4&lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC3 = 4&lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC0 = 4&lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC1 = 4&lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC2 = 4&lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC3 = 4&lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.err klogd: SPI2:: drvIoctl :PA Request&lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.info klogd: PhgHhalDoM2SDMA:1661:--&amp;gt;P0&lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PS wake (0) in Drvmain&lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.info upgraded[312]: K_SW0_DWNLD_ACK &lt;br /&gt;
Apr  7 09:58:27 imx21 auth.info login[393]: root login  on `ttyp0&#039; from `bittorf-AP.olsr&#039; &lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC0 = 8&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC1 = 8&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC2 = 8&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC3 = 8&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC0 = 8&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC1 = 8&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC2 = 8&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC3 = 8&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvIoctl :PA Request&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvIoctl :No state change!&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvIoctl :Fast PS Request&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.info klogd: PhgHhalDoM2SDMA:1661:--&amp;gt;P1&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PS Ind (1) in Drvmain&lt;br /&gt;
Apr  7 10:14:53 imx21 auth.info login[408]: root login  on `ttyp1&#039; from `bittorf-AP.olsr&#039; &lt;br /&gt;
Apr  7 10:17:18 imx21 syslog.info -- MARK --&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ausgabe von &amp;lt;b&amp;gt;&amp;lt;tt&amp;gt;/proc/cpuinfo&amp;lt;/tt&amp;gt;&amp;lt;/b&amp;gt; auf einem VP6500 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /proc/cpuinfo &lt;br /&gt;
Processor       : ARM926EJ-Sid(wb) rev 4 (v5EJl)&lt;br /&gt;
BogoMIPS        : 133.01&lt;br /&gt;
Features        : swp half thumb fastmult &lt;br /&gt;
CPU implementer : 0x41&lt;br /&gt;
CPU architecture: ?(8)&lt;br /&gt;
CPU variant     : 0x0&lt;br /&gt;
CPU part        : 0x926&lt;br /&gt;
CPU revision    : 4&lt;br /&gt;
Cache type      : undefined 14&lt;br /&gt;
Cache clean     : undefined 14&lt;br /&gt;
Cache lockdown  : undefined 14&lt;br /&gt;
Cache unified   : Harvard&lt;br /&gt;
I size          : 16384&lt;br /&gt;
I assoc         : 4&lt;br /&gt;
I line length   : 32&lt;br /&gt;
I sets          : 128&lt;br /&gt;
D size          : 16384&lt;br /&gt;
D assoc         : 4&lt;br /&gt;
D line length   : 32&lt;br /&gt;
D sets          : 128&lt;br /&gt;
&lt;br /&gt;
Hardware        : Freescale i.MX2 ADS&lt;br /&gt;
Revision        : 0000&lt;br /&gt;
Serial          : 0000000000000000&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Software Modifikationen ==&lt;br /&gt;
&lt;br /&gt;
=== Startscripts ===&lt;br /&gt;
Die Scripts in /etc/rc.d/&amp;quot; müssen im Hintergrund laufen. Tut ein Script das nicht, ist an dieser Stelle Schluß mit dem Bootvorgang.&lt;br /&gt;
&lt;br /&gt;
Dann darf man als nächstes den Lötkolben anheizen und die serielle Schnittstelle ([[#UART]]) zugänglich machen.&lt;br /&gt;
&lt;br /&gt;
=== Aktivierung WPA2 Unterstützung ===&lt;br /&gt;
&amp;lt;p&amp;gt;Standardmäßig kann das Telefon nur WPA, dabei unterstützt es allerdings auch &amp;lt;b&amp;gt;WPA mit AES&amp;lt;/b&amp;gt; Verschlüsselung.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Es gibt zwei verschiedene Tricks mit denen auch WPA2 aktiviert werden kann.&lt;br /&gt;
Allerdings wurde von einigen ein Einbruch der Verbindungsgeschwindigkeit festgestellt (scheint jedoch nur bei geringem Akkuladestand aufzutreten).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Trick1 ====&lt;br /&gt;
Mittels&lt;br /&gt;
 vi /etc/marvell/wpa_supplicant.conf&lt;br /&gt;
den Texteditor starten.&lt;br /&gt;
Mit PageDown (Bild runter) bis zum Ende des Files gehen.&lt;br /&gt;
Die Zeilen &lt;br /&gt;
 proto=WPA&lt;br /&gt;
 pairwise=TKIP&lt;br /&gt;
 group=TKIP&lt;br /&gt;
auskommentieren, indem ein # vorangestellt wird:&lt;br /&gt;
* cursor auf Beginn einer Zeile &lt;br /&gt;
* i drücken zum Einfügen&lt;br /&gt;
* # eintippen&lt;br /&gt;
* [Esc]&lt;br /&gt;
Sind alle Zeilen auskommentiert, dann mittels&lt;br /&gt;
 :wq[enter]&lt;br /&gt;
abspeichern und Editor verlassen.&lt;br /&gt;
&lt;br /&gt;
Danach neu booten.&lt;br /&gt;
&lt;br /&gt;
Anmerkung: Will man sich mit dieser Änderung in einem reinen WPA2 Netz anmelden (registrieren), kann man als Verschlüsselung nur noch WEP auswählen - der Verbindungsversuch scheitert natürlich! (Hardware: Fritz!Box 7270, PHILIPS VP5500)&lt;br /&gt;
&lt;br /&gt;
Also am Accesspoint WPA2 + WPA einstellen, Telefon registrieren, dann Accesspoint auf WPA2 konfigurieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;Achtung!&#039;&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Herumspielen an der wpa_supplicant.conf endet sehr schnell damit das man sich ausperrt&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Um sich eine Wiederbelebung per serieller Konsole zu ersparen, ist es günstig, immer nur Einträge an die wpa_supplicant.conf &amp;lt;u&amp;gt;hinten anzuhängen&amp;lt;/u&amp;gt;, niemals aber vorne einzufügen!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Trick2 ====&lt;br /&gt;
Dieser Trick funktioniert mit Accesspoints, bei denen man auch WPA Verbindungen mit AES verschlüsseln kann. Vorteil dieses Tricks ist, dass man die wpa_supplicant.conf nicht manuell editieren muss. Allerdings unterstützt nicht jeder Accesspoint WPA mit AES (aber dd-wrt kann das).&lt;br /&gt;
&lt;br /&gt;
Man konfiguriert den Accesspoint zunächst mit WPA PSK und wählt AES als Verschlüsselungsalgorithmus. Jetzt meldet man das Telefon an, das Telefon erkennt richtig, dass eine WPA Verbindung vorliegt und verbindet sich per WPA und AES mit dem Accesspoint. Anschliessend konfiguriert man den Accesspoint von WPA PSK AES nach WPA2 PSK AES. Jetzt schaltet man das VP5500/6500 aus und wieder ein. Nachdem es fertig gebootet hat, verbindet es sich automisch per WPA2 PSK und mit AES Verschlüsselung. Fertig.&lt;br /&gt;
&lt;br /&gt;
==== Versehentliche Aussperrung nach WPA2 Einstellversuch beheben ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. DON&#039;T PANIC!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Für den Fall das man sich den Zugangsweg per wireless abgeschnitten hat, gibt es, neben dem Bau eines seriellen Adapters und der Notwendigkeit zu löten, noch eine Variante um wieder auf das Telefon zu kommen:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;den Demo-Modus!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dieser Modus war dazu gedacht die Funktionalität der VPs ohne SIP-Server ausprobieren zu können. 2 Geräte starten dazu im WLAN-AdHoc-Modus mit unterschiedlichen IP&#039;s (192.168.10.1 + 192.168.10.2 , jeweils /24 = 255.255.255.0) und machen ein IBSS-Netzwerk mit WEP-Verschlüsselung auf (Key: VP6500 = 5648751265 beim VP5500 = 7295569793).&lt;br /&gt;
&lt;br /&gt;
Nun kann man auch ein einzelnes Telefon in den Demo-Modus versetzen (vorhandener neuer Menüeintrag nach dem rooten, oder per Tastenkombination &amp;quot;*#3 &amp;quot;), gibt sich eine passende WLAN und IP-Einstellungen auf dem Rechner und schon kann man wieder darauf connecten und Fehleinstellungen wieder beheben. Dummerweise wird eine zufällige IBSS-Cell-ID verwendet, aber neuere Betriebssysteme können der Zelle trotzdem beitreten. Als ESSID kann man &#039;&#039;demo_mode_obiwan&#039;&#039; verwenden.&lt;br /&gt;
&lt;br /&gt;
===== Schritt für Schritt Anleitung für Linux =====&lt;br /&gt;
&lt;br /&gt;
Einstellungen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;am Telefon&#039;&#039;&#039;&lt;br /&gt;
* Telefon anschalten und per Menüeintrag oder Tastenkombination &amp;quot;*#3&amp;quot; in Demomodus versetzen (z.B. als Einstellung Handset 1)&lt;br /&gt;
-&amp;gt; IP des Telefons wird danach zu 192.168.10.1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;am Computer&#039;&#039;&#039;&lt;br /&gt;
* Konsole öffnen&lt;br /&gt;
 per ifconfig checken welches das WLAN-Gerät am Rechner ist (im weiteren &amp;quot;wlan0&amp;quot; genannt)&lt;br /&gt;
 ifconfig wlan0 down&lt;br /&gt;
 iwconfig wlan0 mode ad-hoc (ad-hoc Modus aktivieren)&lt;br /&gt;
 iwconfig wlan0 essid &#039;demo_mode_obiwan&#039; (Passende essid-Kennung setzen)&lt;br /&gt;
 iwconfig wlan0 key 5648751265 (Key für das VP6500)&lt;br /&gt;
 ifconfig wlan0 up&lt;br /&gt;
 ifconfig wlan0 192.168.10.2 (setzen der IP)&lt;br /&gt;
&lt;br /&gt;
man kann nun mittels:&lt;br /&gt;
&lt;br /&gt;
 ping 192.168.10.1&lt;br /&gt;
&lt;br /&gt;
testen ob alles korrekt verlaufen ist und man eine Antwort bekommt - sollte das der Fall sein ist man &#039;&#039;&#039;fertig!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Nun kann man per telnet oder ssh, mit den üblichen Benutzerkennung und dem Passwort, auf die IP 192.168.10.1 connecten und die Probleme beheben.&lt;br /&gt;
&lt;br /&gt;
=== Menüs ===&lt;br /&gt;
==== Hauptmenu ====&lt;br /&gt;
&lt;br /&gt;
Das File &lt;br /&gt;
 /usr/local/etc/defaultbuttons.conf&lt;br /&gt;
enthält unter anderm die definition des Hauptmenus.&lt;br /&gt;
&lt;br /&gt;
Hierfür ist der Abschnitt Menu besonders interessant.&lt;br /&gt;
  [Menu]&lt;br /&gt;
  1 = Applications/camera.desktop&lt;br /&gt;
  2 = Applications/callhistory.desktop&lt;br /&gt;
  3 = Applications&lt;br /&gt;
  4 = Settings&lt;br /&gt;
  5 = Applications/addressbook.desktop&lt;br /&gt;
  6 = Settings/RingProfiles.desktop&lt;br /&gt;
  Columns = 3&lt;br /&gt;
  Default = 5&lt;br /&gt;
  Map = 123456789*0#&lt;br /&gt;
  Rows = 2&lt;br /&gt;
&lt;br /&gt;
&#039;Rows&#039; und &#039;Columns&#039; geben an, wieviel Reihen und Spalten das Hauptmenu hat.&lt;br /&gt;
Über die Zuweisungen 1 bis (Columns * Rows) kann man dann den Menüpositionen die Menüpunkte zuweisen.&lt;br /&gt;
Die Menupunkte sind definiert in den Verzeichnissen unter &lt;br /&gt;
 /usr/local/apps&lt;br /&gt;
gibt man nur ein Verzeichnis an, dann erscheint ein Submenü, dessen Icon und Name in der .directory -Datei des entsprechenden Ordner definiert ist.&lt;br /&gt;
direkte Menupunkte haben Dateinamen mit der Endung .desktop&lt;br /&gt;
&#039;Default&#039; bestimmten vorselektierten Eintrag.&lt;br /&gt;
&lt;br /&gt;
Hier ein weiteres Beispiel für ein angepasstes Menu:&lt;br /&gt;
  [Menu]&lt;br /&gt;
  1 = Applications/addressbook.desktop&lt;br /&gt;
  2 = Applications/callhistory.desktop&lt;br /&gt;
  3 = Applications/sysinfo.desktop&lt;br /&gt;
  4 = Applications&lt;br /&gt;
  5 = Settings&lt;br /&gt;
  6 = Games&lt;br /&gt;
  7 = Applications/camera.desktop&lt;br /&gt;
  8 = Applications/photoedit.desktop&lt;br /&gt;
  9 = Applications/manualsub.desktop&lt;br /&gt;
  Columns = 3&lt;br /&gt;
  Default = 5&lt;br /&gt;
  Map = 123456789*0#&lt;br /&gt;
  Rows = 3&lt;br /&gt;
&lt;br /&gt;
Der Ordner Games ist (momentan ;) leer.&lt;br /&gt;
&lt;br /&gt;
==== Genereller Aufbau Menü-Einträge ====&lt;br /&gt;
Die Einträge für die Menüs sind im Filesystem abgelegt:&lt;br /&gt;
&lt;br /&gt;
* Settings: /usr/local/apps/Settings&lt;br /&gt;
* Applications: /usr/local/apps/Applications&lt;br /&gt;
* Klingeltöne: /usr/local/etc/SystemRingTones/&lt;br /&gt;
&lt;br /&gt;
Die Dateien haben die Endung &amp;quot;.desktop&amp;quot; und sind normale Textdateien, die die relevanten Infos enthalten.&lt;br /&gt;
&lt;br /&gt;
Ein Beispiel aus dem Settingsordner:&lt;br /&gt;
  [Translation]&lt;br /&gt;
  File=QtopiaSettings&lt;br /&gt;
  Context=Sound&lt;br /&gt;
  [Desktop Entry]&lt;br /&gt;
  Type=Application&lt;br /&gt;
  Exec=sound&lt;br /&gt;
  Icon=Sound&lt;br /&gt;
  Name[]=Sound&lt;br /&gt;
  CanFastload=0&lt;br /&gt;
&lt;br /&gt;
Der Abschnitt &#039;Translation&#039; gibt an in welchem File, die Lokalisationsdaten stehen.&lt;br /&gt;
&lt;br /&gt;
Der Abschnitt &#039;Desktop Entry&#039;:&lt;br /&gt;
* Type: Typ des Eintrages &lt;br /&gt;
** Application für Anwendungen&lt;br /&gt;
** audio/x-wav für Klingeltöne&lt;br /&gt;
* Exec: Anwendung, die ausgeführt werden soll&lt;br /&gt;
* Icon: Icon, das im Menü benutzt wird. &lt;br /&gt;
** Pfad ist meist: /usr/local/pics/[Exex]/[Icon].png&lt;br /&gt;
** manchmal aber auch: /usr/local/pics/icons/[14x14|16x16|22x22]/[Icon].png&lt;br /&gt;
* Name[]: Name im Menü, wird über das in Translation angegebe File und Context aufgelöst. Dies wird verhindert, wenn die Klammern wegelassen werden, was das Einfügen eigener Einträge ermöglicht&lt;br /&gt;
&lt;br /&gt;
Hier ein Textfile mit allen desktop-Files als Referenz: [[File:alleDesktopFiles.txt]]&lt;br /&gt;
&lt;br /&gt;
==== Versteckte Menüeinträge ====&lt;br /&gt;
in den oben genannten Ordnern existieren ein paar Dateien mit der Endung &#039;.desktopMASK&#039;.&lt;br /&gt;
Benennt man diese um, werden die Einträge nach einem Neustart im Menü freigeschaltet.&lt;br /&gt;
&lt;br /&gt;
folgendes an der Kommandozeile eingeben:&lt;br /&gt;
 cd /usr/local/apps/Settings&lt;br /&gt;
 mv datetime.desktopMASK datetime.desktop&lt;br /&gt;
 mv callforward.desktopMASK callforward.desktop&lt;br /&gt;
 mv calloptions.desktopMASK calloptions.desktop&lt;br /&gt;
 mv resetparam.desktopMASK resetparam.desktop&lt;br /&gt;
 mv subkpncode.desktopMASK subkpncode.desktop&lt;br /&gt;
&lt;br /&gt;
Dies aktiviert folgende Optionen:&lt;br /&gt;
* Datums/Zeit-Einstellung&lt;br /&gt;
* Anrufweiterleitung&lt;br /&gt;
* Anrufoptionen&lt;br /&gt;
* Parameter zurücksetzen&lt;br /&gt;
* Number Switch&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die nützlichsten sind wohl die ersten Einträge.&lt;br /&gt;
Bei dem &amp;quot;Number Switch&amp;quot; ist unklar, was er bewirken soll. Beim Start wird ein Code abgefragt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Weiterhin kann im Verzeichnis /usr/local/apps/Applications eine [[File:demomode.desktop]] anlegen.&lt;br /&gt;
&lt;br /&gt;
Hierfür ist folgende Prozedur nötig:&lt;br /&gt;
* im Terminal&lt;br /&gt;
                 cd /usr/local/apps/Applications&lt;br /&gt;
                 vi demomode.desktop&lt;br /&gt;
&lt;br /&gt;
* i drücken &lt;br /&gt;
* folgendes Textfragment einfügen &lt;br /&gt;
                 [Translation]&lt;br /&gt;
                 File=QtopiaApplications&lt;br /&gt;
                 Context=DemoMode&lt;br /&gt;
                 [Desktop Entry]&lt;br /&gt;
                 Exec=demomode&lt;br /&gt;
                 Icon=Camera&lt;br /&gt;
                 Type=Application&lt;br /&gt;
                 Name[]=DemoMode&lt;br /&gt;
* [Esc] &lt;br /&gt;
* :wq [Enter] &lt;br /&gt;
&lt;br /&gt;
Dies schaltet einen Demo-Modus frei.&lt;br /&gt;
&lt;br /&gt;
===== Französisch =====&lt;br /&gt;
Es gab die Geräte wohl auch in Frankreich von der France Telekom.&lt;br /&gt;
Zumindest sind entsprechende monitor und upgrade Referenz-Dateien&lt;br /&gt;
vorhanden in denen das steht. Daher wohl auch die Französischen&lt;br /&gt;
Sprachdateien, die zwar auf dem Gerät sind, allerdings in einem&lt;br /&gt;
Unterverzeichnis, so das sie nicht auswählbar sind.&lt;br /&gt;
&lt;br /&gt;
Um diese Dateien zu aktivieren:&lt;br /&gt;
&lt;br /&gt;
 cd /usr/local/i18n&lt;br /&gt;
 mv NOTUSED/fr .&lt;br /&gt;
&lt;br /&gt;
Nun ist auch noch französisch als Sprache verfügbar.&lt;br /&gt;
&lt;br /&gt;
==== Eigene Menüeinträge ====&lt;br /&gt;
&lt;br /&gt;
Es besteht die Möglichkeit Menüeinträge anzulegen, durch die Shellskripte ausgeführt werden. Im Folgenden ist dieses Vorgehen am Beispiel des ein- und ausschaltens von SSH beschrieben.&lt;br /&gt;
&lt;br /&gt;
===== SSH aktivieren &amp;amp; deaktivieren =====&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Achtung! Folgendes Vorgehen kann das Gerät bricken, falls Telnet deaktiviert ist und irgendwas mit SSH schief läuft!&#039;&#039;&#039;&lt;br /&gt;
*Die folgenden beiden Dateien repräsentieren die Menüeinträge und rufen &#039;&#039;enablessh&#039;&#039; bzw. &#039;&#039;disablessh&#039;&#039; auf.&lt;br /&gt;
:*&#039;&#039;/usr/local/apps/Applications/enablessh.desktop&#039;&#039;:&lt;br /&gt;
 [Translation]&lt;br /&gt;
 File=QtopiaApplications&lt;br /&gt;
 Context=enablessh&lt;br /&gt;
 [Desktop Entry]&lt;br /&gt;
 Exec=enablessh&lt;br /&gt;
 Icon=Camera&lt;br /&gt;
 Type=Application&lt;br /&gt;
 Name[]=Enable SSH&lt;br /&gt;
:*&#039;&#039;/usr/local/apps/Applications/disablessh.desktop&#039;&#039;:&lt;br /&gt;
 [Translation]&lt;br /&gt;
 File=QtopiaApplications&lt;br /&gt;
 Context=disablessh&lt;br /&gt;
 [Desktop Entry]&lt;br /&gt;
 Exec=disablessh&lt;br /&gt;
 Icon=Camera&lt;br /&gt;
 Type=Application&lt;br /&gt;
 Name[]=Disable SSH&lt;br /&gt;
*&#039;&#039;enablessh&#039;&#039; und &#039;&#039;disablessh&#039;&#039; sind Shellskripte, die in &#039;&#039;/usr/local/bin/&#039;&#039; liegen und folgendes enthalten:&lt;br /&gt;
:*&#039;&#039;/usr/local/bin/enablessh&#039;&#039;:&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 touch /var/log/lastlog&lt;br /&gt;
 /etc/rc.d/init.d/S99dropbear restart&lt;br /&gt;
 exit(0)&lt;br /&gt;
:*&#039;&#039;/usr/local/bin/disablessh&#039;&#039;:&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 /etc/rc.d/init.d/S99dropbear stop&lt;br /&gt;
 exit(0)&lt;br /&gt;
*Nach einem Neustart des Telefons sollten im Menü &#039;&#039;Anwendungen&#039;&#039; die zwei neuen Menüpunkte auftauchen.&lt;br /&gt;
&lt;br /&gt;
=== Grafische Anpassungen ===&lt;br /&gt;
So gut wie alle Grafiken liegen im Verzeichnis /usr/local/pics und können beliebig ausgetauscht werden (gleicher Dateityp, gleiche Größe).&lt;br /&gt;
&lt;br /&gt;
Einige besonders interessante werden hier aufgeführt:&lt;br /&gt;
&lt;br /&gt;
===== Eigene Startup/Shutdown-Animation =====&lt;br /&gt;
&lt;br /&gt;
Die Animation beim Starten oder Herunterfahren sind normale (animierte) GIFs. Diese findet man in&lt;br /&gt;
&lt;br /&gt;
 /usr/local/pics/qpe&lt;br /&gt;
&lt;br /&gt;
Die Links &amp;quot;splash.gif&amp;quot; und &amp;quot;goodbye.gif&amp;quot; zeigen auf die tasächlich zu verwendenen Dateien (&amp;quot;splash-chuck.gif&amp;quot;, &amp;quot;goodby-chuck.gif&amp;quot;).&lt;br /&gt;
Man kann sein eigenes animiertes GIF im Format 176x220 Pixel raufladen und die&lt;br /&gt;
splash.gif entsprechend neu verlinken. Dazu löscht man zuerst die alte&lt;br /&gt;
mit:&lt;br /&gt;
&lt;br /&gt;
 rm /usr/local/pics/qpe/splash.gif&lt;br /&gt;
&lt;br /&gt;
Anschliessend erzeugt man den Link neu, dabei zeigt er dann auf die&lt;br /&gt;
eigene Datei:&lt;br /&gt;
&lt;br /&gt;
 ln -s /pfad/zur/eigenedatei.gif /usr/local/pics/qpe/splash.gif&lt;br /&gt;
&lt;br /&gt;
Danach wird dann bei jedem Neustart die eigene Animation angezeigt.&lt;br /&gt;
Analog hierzu mit der goodbye.gif.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Also, man packe das Bild auf einen Webserver. Dann am Gerät über telnet&lt;br /&gt;
anmelden und:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
cd /usr/local/pics/qpe/&lt;br /&gt;
wget http://dein.server/woauchimmer/Matrix5.gif&lt;br /&gt;
rm /usr/local/pics/qpe/splash.gif&lt;br /&gt;
ln -s Matrix5.gif splash.gif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die GIF Animation kann bis zu 176x220 Pixel groß sein.&lt;br /&gt;
Kleinere (möglicherweise auch größere) Bilder werden zentriert.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Bild:walking_baby_tux.gif&lt;br /&gt;
Bild:custwakeup2.gif&lt;br /&gt;
Bild:custgoodbye2.gif&lt;br /&gt;
Bild:94vw4.gif&lt;br /&gt;
Bild:1_Matrix--16984.gif&lt;br /&gt;
Bild:1_Matrix--16985.gif&lt;br /&gt;
Bild:3.gif&lt;br /&gt;
Bild:ClanSpider2.gif&lt;br /&gt;
Bild:TS12.gif&lt;br /&gt;
Bild:Matrix5.gif&lt;br /&gt;
Bild:qtopia3.gif&lt;br /&gt;
Bild:qtopia0.gif&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Eigener Boot/Update-Screen =====&lt;br /&gt;
&lt;br /&gt;
Der Boot-Screen, oder der Update-Screen liegen als Rohdaten vor.&lt;br /&gt;
 /user_data/data/welcome.rgb565&lt;br /&gt;
 /usr/local/startup_V4.20/update.bin&lt;br /&gt;
&lt;br /&gt;
Weitere Beispielbilder:&lt;br /&gt;
 /user_data/prod/data/lcd_test_card1.bin&lt;br /&gt;
 /user_data/prod/data/lcd_test_card2.bin&lt;br /&gt;
&lt;br /&gt;
Diese werden direkt in den Framebuffer geschrieben.&lt;br /&gt;
Daher müssen sich diese genau ein bestimmtes Format halten: &lt;br /&gt;
* Größe 240 x 220 (Das Display ist 176 x 220, der Rest ist also nicht zu sehen)&lt;br /&gt;
* 16bit pro Pixel RGB565&lt;br /&gt;
&lt;br /&gt;
Um solch ein Bild zu erstellen sind folgende Schritte notwendig:&lt;br /&gt;
# Ein Bild in Gimp mit 176x220 erstellen&lt;br /&gt;
# das Bild vertikal spiegeln&lt;br /&gt;
# Bild-&amp;gt;Leinwandgröße auf 240x220 erweitern (Bilddaten ganz nach links)&lt;br /&gt;
# Datei-&amp;gt;Kopie speichern...&lt;br /&gt;
# Als Windowsbitmap -&amp;gt; erweiterete Optionen -&amp;gt; 16bit R5G6B5&lt;br /&gt;
# BMP-Header entfernen (dies kann auch auf dem Telefon gemacht werden)&lt;br /&gt;
         tail -c 105600 input.bmp &amp;gt; output.raw&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Von der Kommandozeile kann auch manuell das Bild in den Framebuffer geschrieben werden.&lt;br /&gt;
 cat /user_data/prod/data/lcd_test_card1.bin &amp;gt; /dev/fb0&lt;br /&gt;
&lt;br /&gt;
=== Wichtige Verzeichnisse ===&lt;br /&gt;
&lt;br /&gt;
==== Adressdaten ====&lt;br /&gt;
&lt;br /&gt;
# cat /user_data/home/Applications/addressbook/addressbook.xml &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&amp;lt;!DOCTYPE Addressbook &amp;gt;&amp;lt;AddressBook&amp;gt;&lt;br /&gt;
  &amp;lt;Groups&amp;gt;&lt;br /&gt;
  &amp;lt;/Groups&amp;gt;&lt;br /&gt;
  &amp;lt;Contacts&amp;gt;&lt;br /&gt;
    &amp;lt;Contact&lt;br /&gt;
                                Uid=&amp;quot;-1269720893&amp;quot; &lt;br /&gt;
                         Categories=&amp;quot;-1269431263;-1266109093;-1266109094&amp;quot; &lt;br /&gt;
                          FirstName=&amp;quot;ich&amp;quot; &lt;br /&gt;
                             FileAs=&amp;quot;ich&amp;quot; &lt;br /&gt;
                           JobTitle=&amp;quot;cc&amp;quot; &lt;br /&gt;
                         Department=&amp;quot;dep&amp;quot;&lt;br /&gt;
                            Company=&amp;quot;aa&amp;quot; &lt;br /&gt;
                      BusinessPhone=&amp;quot;55&amp;quot; &lt;br /&gt;
                        BusinessFax=&amp;quot;77&amp;quot; &lt;br /&gt;
                     BusinessMobile=&amp;quot;66&amp;quot; &lt;br /&gt;
                          HomePhone=&amp;quot;55&amp;quot;&lt;br /&gt;
                         HomeMobile=&amp;quot;11&amp;quot; &lt;br /&gt;
                             HomePc=&amp;quot;12&amp;quot;&lt;br /&gt;
                           HomeData=&amp;quot;13&amp;quot;&lt;br /&gt;
                            HomeFax=&amp;quot;14&amp;quot;&lt;br /&gt;
                     BusinessStreet=&amp;quot;street&amp;quot;&lt;br /&gt;
                       BusinessCity=&amp;quot;city&amp;quot;&lt;br /&gt;
                      BusinessState=&amp;quot;state&amp;quot;&lt;br /&gt;
                        BusinessZip=&amp;quot;zip&amp;quot;&lt;br /&gt;
                    BusinessCountry=&amp;quot;country&amp;quot;&lt;br /&gt;
                      BusinessPager=&amp;quot;88&amp;quot;&lt;br /&gt;
                             Office=&amp;quot;office&amp;quot;&lt;br /&gt;
                         Profession=&amp;quot;prof&amp;quot;&lt;br /&gt;
                          Assistant=&amp;quot;ass&amp;quot;&lt;br /&gt;
                            Manager=&amp;quot;man&amp;quot;&lt;br /&gt;
                         HomeStreet=&amp;quot;ptjml&amp;quot;&lt;br /&gt;
                           HomeCity=&amp;quot;cit&amp;quot;&lt;br /&gt;
                          HomeState=&amp;quot;stat&amp;quot;&lt;br /&gt;
                            HomeZip=&amp;quot;zi&amp;quot;&lt;br /&gt;
                        HomeCountry=&amp;quot;coun&amp;quot;&lt;br /&gt;
                             Spouse=&amp;quot;spouse&amp;quot;&lt;br /&gt;
                             Gender=&amp;quot;1&amp;quot;&lt;br /&gt;
                           Birthday=&amp;quot;20100322&amp;quot;&lt;br /&gt;
                        Anniversary=&amp;quot;20100429&amp;quot;&lt;br /&gt;
                           Children=&amp;quot;child&amp;quot;&lt;br /&gt;
                              Notes=&amp;quot;gakm&amp;quot;&lt;br /&gt;
               CompanyPronunciation=&amp;quot;bb&amp;quot;&lt;br /&gt;
                   BUSINESS_CONTACT=&amp;quot;&amp;quot;&lt;br /&gt;
                          photofile=&amp;quot;ci-1269721575-0.jpg&amp;quot;&lt;br /&gt;
                   qdl-private-data=&amp;quot;&amp;quot;&lt;br /&gt;
                               tone=&amp;quot;/usr/local/etc/SystemRingTones/16-Tetris.desktop&amp;quot;&lt;br /&gt;
         /&amp;gt;&lt;br /&gt;
    &amp;lt;Contact Uid=&amp;quot;-1269554029&amp;quot; &lt;br /&gt;
             FirstName=&amp;quot;VoIP&amp;quot; &lt;br /&gt;
             LastName=&amp;quot;Phone1&amp;quot; &lt;br /&gt;
             FileAs=&amp;quot;VoIP Phone1&amp;quot; &lt;br /&gt;
             HomeMobile=&amp;quot;**621&amp;quot;  &lt;br /&gt;
             tone=&amp;quot;/usr/local/etc/SystemRingTones/15-Techno2.desktop&amp;quot;  /&amp;gt;&lt;br /&gt;
    &amp;lt;Contact Uid=&amp;quot;-1269554032&amp;quot; &lt;br /&gt;
             Categories=&amp;quot;-1269431263&amp;quot;&lt;br /&gt;
             FirstName=&amp;quot;VoIP&amp;quot; &lt;br /&gt;
             LastName=&amp;quot;Phone3&amp;quot; &lt;br /&gt;
             FileAs=&amp;quot;VoIP Phone3&amp;quot; &lt;br /&gt;
             HomeMobile=&amp;quot;**623&amp;quot;  &lt;br /&gt;
             BUSINESS_CONTACT=&amp;quot;&amp;quot; &lt;br /&gt;
             qdl-private-data=&amp;quot;&amp;quot; &lt;br /&gt;
             tone=&amp;quot;/usr/local/etc/SystemRingTones/08-Celtrelax.desktop&amp;quot;  /&amp;gt;&lt;br /&gt;
  &amp;lt;/Contacts&amp;gt;&lt;br /&gt;
  &amp;lt;/AddressBook&amp;gt;&lt;br /&gt;
&lt;br /&gt;
UID ist wohl egal, solange sie nicht zweimal vorkommen.&lt;br /&gt;
&lt;br /&gt;
Die Beschränkung auf 500 Adressbucheinträge kann man auch aufheben&lt;br /&gt;
&amp;quot;maxEntries = 500&amp;quot; in der &amp;quot;Contacts.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Kategorien stehen in /user_settings/Categories.xml:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&amp;lt;!DOCTYPE CategoryList&amp;gt;&lt;br /&gt;
  &amp;lt;Categories&amp;gt;&lt;br /&gt;
    &amp;lt;Category id=&amp;quot;-1269431263&amp;quot; name=&amp;quot;_Personal&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Category id=&amp;quot;-1269431262&amp;quot; name=&amp;quot;_Business&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/Categories&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man einem Kontakt eine bestimmte Kategorie zuordnet, dann wird die ID dieser Kategorie im Attribut &amp;quot;Categories&amp;quot; des Kontakts eingetragen (s.o.). Wenn die Kategorie BUSINESS gewählt wird, steht im Attribut &amp;quot;BUSINESS_CONTACT&amp;quot; eine &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Ein Einrücken der Attribute mit TABs in den Dateien ist übrigens nicht erlaubt!&lt;br /&gt;
&lt;br /&gt;
Die Software des Telefons wertet die XML Datei bei jedem Zugriff neu aus. Es ist also möglich, die Datei im laufendem Betrieb zu ändern (z.B. per Script).&lt;br /&gt;
&lt;br /&gt;
Um VCards in das XML Format zu konvertieren gibts es im Forum folgendes kleines C-Programm: [http://www.mikrocontroller.net/attachment/74583/VCardsToXML.c] [http://www.mikrocontroller.net/attachment/highlight/74583]&lt;br /&gt;
&lt;br /&gt;
==== Fotos &amp;amp; Videoschnappschüsse ====&lt;br /&gt;
&lt;br /&gt;
Alle Bilder die mit der Kamera aufgenommen werden, sowie Schnappschüsse die während eines Videocalls aufgenommen wurden, befinden sich in folgendem Verzeichnis:&lt;br /&gt;
       /user_data/home/Documents&lt;br /&gt;
&lt;br /&gt;
Die Bilder sind dabei nach folgendem Namensschema benannt:&lt;br /&gt;
&lt;br /&gt;
       DD-MM-YYYY-hh:mm:ss.jpg&lt;br /&gt;
&lt;br /&gt;
Tag (DD) und Monat (MM) können auch einstellig sein.&lt;br /&gt;
&lt;br /&gt;
=== Klingeltöne ===&lt;br /&gt;
&lt;br /&gt;
Die Klingeltöne liegen, wie oben beschrieben unter:&lt;br /&gt;
&lt;br /&gt;
/usr/local/etc/SystemRingTones/&lt;br /&gt;
&lt;br /&gt;
Es sind .wav Dateien mit (16Khz, 16Bit, Mono), welche sich z.B. mit MhWaveEdit (Linux/GTK) oder auch Audacity recht komfortabel erzeugen lassen.&lt;br /&gt;
&lt;br /&gt;
Auch .wav Dateien mit 22050Hz werden problemlos abgespielt (ein wenig bessere Qualität als 16000hz) und sind als Klingeltöne nutzbar. Dateien mit 44100Hz spielt es leider nur &#039;ruckelnd&#039; ab (32000Hhz nicht getestet).&lt;br /&gt;
&lt;br /&gt;
Zusätzlich zu den Audio Dateien müssen noch im selben Verzeichnis entsprechende *.desktop dateien angelegt werden, damit alles korrekt ins Menü integriert wird.&lt;br /&gt;
Eine für den fiktiven 16. Klingelton erzeugte Datei &amp;quot;16-Tetris.desktop&amp;quot; könnte den folgenden Inhalt haben:&lt;br /&gt;
&lt;br /&gt;
                 [Desktop Entry]&lt;br /&gt;
                 Categories =&lt;br /&gt;
                 File =16-Tetris.wav&lt;br /&gt;
                 Name[] =16-Tetris&lt;br /&gt;
                 Type = audio/x-wav&lt;br /&gt;
                 [Translation]&lt;br /&gt;
                 File=QtopiaRingTones&lt;br /&gt;
                 Context=16-Tetris&lt;br /&gt;
&lt;br /&gt;
Nach dem Anlegen der Dateien sollte sie dann im Menü auftauchen und auswählbar sein.&lt;br /&gt;
&lt;br /&gt;
=== Systemtöne ===&lt;br /&gt;
&lt;br /&gt;
*Sämtliche Systemtöne liegen unter &#039;&#039;/usr/local/sounds/&#039;&#039; und lassen sich problemlos durch andere Dateien ersetzen.&lt;br /&gt;
*z.B.:&lt;br /&gt;
**&#039;&#039;charge.wav&#039;&#039; - Ton, wenn Gerät in die Basisstation gesetzt wird&lt;br /&gt;
&lt;br /&gt;
=== Timeserver ===&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/topic/170483#1645101&lt;br /&gt;
Unter /usr/local/data steht in der monitor.cfg und monitor_ref_KPN.cfg&lt;br /&gt;
die Adressen der Zeitserver &amp;quot;ntp.xs4all.nl&amp;quot; und &amp;quot;130.142.110.71&amp;quot;. Diese&lt;br /&gt;
könnte man z.B. auf &amp;quot;ptbtime1.ptb.de&amp;quot; und &amp;quot;ptbtime2.ptb.de&amp;quot; ändern.&lt;br /&gt;
&lt;br /&gt;
(http://www.mikrocontroller.net/topic/170483#1649594)&lt;br /&gt;
das telefon benutzt *nicht ntp* sondern das time-protokoll auf port 37 -&lt;br /&gt;
time.fu-berlin.de (bzw. chronos.zedat.fu-berlin.de) kann man als server nehmen.&lt;br /&gt;
&lt;br /&gt;
vi Tipp hilfe:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
vi /usr/local/data/monitor.cfg&lt;br /&gt;
:%s/ntp.xs4all.nl/time.fu-berlin.de/g&lt;br /&gt;
:%s/130.142.110.71/130.133.1.10/g&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufgefallen ist, dass sich Telefone mit fest eingestellter IP nicht automatisch&lt;br /&gt;
die Uhrzeit abrufen. Stellt man das Telefon auf DHCP, stellt sich die Uhr&lt;br /&gt;
auch ohne Timeserver Modifikation auf die richtige Uhrzeit ein.&lt;br /&gt;
&lt;br /&gt;
Wer lieber einen NTP-Client einsetzen möchte findet unter dem Link für [[#Weitere_Konsolenkommandos]] ein Paket mit ntpd oder auch ntpdate für den schnellen Zeitabgleich via Konsole:&lt;br /&gt;
    ntpdate pool.ntp.org&lt;br /&gt;
&lt;br /&gt;
=== Zusätzliche Software ===&lt;br /&gt;
==== Dropbear (SSH-Server) installieren ====&lt;br /&gt;
&lt;br /&gt;
# Mit telnet auf dem Gerät einloggen&lt;br /&gt;
# folgendes in die Kommandozeile kopieren&lt;br /&gt;
       cd /&lt;br /&gt;
       wget http://www.mikrocontroller.net/attachment/74656/dropbear.tgz&lt;br /&gt;
       tar -xzf dropbear.tgz&lt;br /&gt;
       rm dropbear.tgz&lt;br /&gt;
       cd /etc/rc.d/init.d&lt;br /&gt;
       mv dropbear S90dropbear&lt;br /&gt;
       ./S90dropbear start&lt;br /&gt;
Das Kommando in Zeile 6 (mv ...) ist notwendig damit dropbear bei jedem Reboot automatisch gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Prüfen ob dropbear gestartet ist und läuft:&lt;br /&gt;
  # ps&lt;br /&gt;
  PID  Uid     Stat Command&lt;br /&gt;
  136 root     S    /usr/sbin/dropbear&lt;br /&gt;
&lt;br /&gt;
Bei jedem Login sucht dropbear nach der /var/log/lastlog, daher sollte man abschließend noch ein&lt;br /&gt;
&lt;br /&gt;
       touch /var/log/lastlog&lt;br /&gt;
&lt;br /&gt;
machen, um diese Datei anzulegen. Damit verschwinden auch die entsprechenden Fehlermeldungen im logread.&lt;br /&gt;
&lt;br /&gt;
==== Nano 2.2.3 installieren ====&lt;br /&gt;
&lt;br /&gt;
* Mit telnet auf dem Gerät einloggen&lt;br /&gt;
* folgendes in die Kommandozeile kopieren&lt;br /&gt;
       cd /usr/bin&lt;br /&gt;
       wget http://www.mikrocontroller.net/attachment/74023/nano&lt;br /&gt;
* Mit folgendem Befehl den Editor ausführbar machen:&lt;br /&gt;
       chmod +x /usr/bin/nano&lt;br /&gt;
* Nun ist vi Geschichte ;-)&lt;br /&gt;
&lt;br /&gt;
Ggf. kann der Fehler &amp;quot;Error opening terminal: xterm-color&amp;quot; auftreten wenn nano gestartet wird, in diesem Fall hilft folgendes:&lt;br /&gt;
&lt;br /&gt;
* /root/.bashrc öffnen (mit vi :-)&lt;br /&gt;
* &amp;quot;export TERM=xterm&amp;quot; in die Datei schreiben&lt;br /&gt;
* ausloggen / einloggen&lt;br /&gt;
&lt;br /&gt;
==== OpenVPN 2.0.9 installieren ====&lt;br /&gt;
&lt;br /&gt;
* Mit telnet auf dem Gerät einloggen&lt;br /&gt;
* folgendes in die Kommandozeile kopieren&lt;br /&gt;
       cd /&lt;br /&gt;
       wget http://www.mikrocontroller.net/attachment/74380/openvpn.tar.gz&lt;br /&gt;
       tar -xzf openvpn.tar.gz&lt;br /&gt;
       depmod&lt;br /&gt;
       mknod /dev/net/tun c 10 200&lt;br /&gt;
&lt;br /&gt;
==== OpenVPN 2.1.1 installieren ====&lt;br /&gt;
&lt;br /&gt;
* Mit telnet auf dem Gerät einloggen&lt;br /&gt;
* folgendes in die Kommandozeile kopieren&lt;br /&gt;
       cd /&lt;br /&gt;
       wget http://www.mikrocontroller.net/attachment/74395/openvpn-2.1.1.tar.gz&lt;br /&gt;
       tar -xzf openvpn-2.1.1.tar.gz&lt;br /&gt;
       depmod&lt;br /&gt;
       mknod /dev/net/tun c 10 200&lt;br /&gt;
&lt;br /&gt;
==== Tinc 1.0.12 installieren ====&lt;br /&gt;
&lt;br /&gt;
* Mit telnet auf dem Gerät einloggen&lt;br /&gt;
* folgendes in die Kommandozeile kopieren&lt;br /&gt;
       cd /&lt;br /&gt;
       wget http://www.mikrocontroller.net/attachment/74396/tinc-1.0.12.tar.gz&lt;br /&gt;
       tar -xzf tinc-1.0.12.tar.gz&lt;br /&gt;
       depmod&lt;br /&gt;
       mknod /dev/net/tun c 10 200&lt;br /&gt;
&lt;br /&gt;
==== Weitere Konsolenkommandos ====&lt;br /&gt;
&lt;br /&gt;
Auf http://thinksilicon.de/57/Hacking-the-VP6500.html finden sich einige nützliche Konsolentools. Darunter sind bc, lsof, file, curl, mc (bzw. mcedit), hexedit, mktemp, rsync, tcpdump, crond (mit crontab) und ntpd.&lt;br /&gt;
* Hinweis zu tcpdump; muss folgendermaßen ausgeführt werden:&lt;br /&gt;
       tcpdump -U root&lt;br /&gt;
&lt;br /&gt;
=== simpler WLAN-Switcher ===&lt;br /&gt;
&lt;br /&gt;
Ohne tiefer gehende GUI-Programmiererfahrungen bei Qtopia zu haben, kann man sich mit folgendem WLAN-Switcher behelfen:&lt;br /&gt;
&lt;br /&gt;
Im Script /user_data/prod/config_ats.sh stehen viele Befehle, wie man mittels &#039;&#039;config code&#039;&#039; Einstellungen vorschreiben kann. Dies habe ich mir mit folgenden eigenen Scripten zu nutze gemacht:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;/root/switch_wlan.sh&#039;&#039;&#039;&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 #================================================&lt;br /&gt;
 # WLAN-Switcher&lt;br /&gt;
 #================================================&lt;br /&gt;
 &lt;br /&gt;
 CONFIG_CODE=`cat /user_data/config_code.txt`&lt;br /&gt;
 &lt;br /&gt;
 cp -f /usr/local/data/wpa_supplicant_ref_${CONFIG_CODE}.conf /user_data/wifi/wpa_supplicant.conf&lt;br /&gt;
&lt;br /&gt;
* kopiert Anhand des &#039;&#039;config code&#039;&#039;s die wpa_supplicant.conf&lt;br /&gt;
* es muss für jeden &#039;&#039;config code&#039;&#039; eine wpa_supplicant_ref_&amp;lt;&#039;&#039;config code&#039;&#039;&amp;gt;.conf vorhanden sein, am besten dazu die aktuelle /user_data/wifi/wpa_supplicant.conf dorthin kopieren&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;/root/set_config_code.sh&#039;&#039;&#039;&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 echo &amp;quot;$1&amp;quot; &amp;gt; /user_data/config_code.txt&lt;br /&gt;
&lt;br /&gt;
* schreibt den ersten übergebenen Parameter in die Datei /user_data/config_code.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;/usr/local/bin/set2XXX&#039;&#039;&#039;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 /root/set_config_code.sh XXX&lt;br /&gt;
 /root/switch_wlan.sh&lt;br /&gt;
 reboot&lt;br /&gt;
&lt;br /&gt;
* XXX durch den &#039;&#039;config code&#039;&#039; ersetzen&lt;br /&gt;
* Script, welches als Applikation gestartet wird&lt;br /&gt;
* derzeit leider keine &amp;quot;on-the-fly&amp;quot;-Eingabe des &#039;&#039;config code&#039;&#039;s möglich, daher muss für jedes WLAN ein Script vorhanden sein&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;/usr/local/apps/Applications/set2YYY.desktop&#039;&#039;&#039;&lt;br /&gt;
 [Translation]&lt;br /&gt;
 File=QtopiaApplications&lt;br /&gt;
 Context=set2XXX&lt;br /&gt;
 [Desktop Entry]&lt;br /&gt;
 Exec=set2XXX&lt;br /&gt;
 Icon=Camera&lt;br /&gt;
 Type=Application&lt;br /&gt;
 Name[]=Enable YYY&lt;br /&gt;
&lt;br /&gt;
* XXX durch den &#039;&#039;config code&#039;&#039; ersetzen (gleicher Scriptname wie oben)&lt;br /&gt;
* YYY durch einmaligen Namen ersetzen&lt;br /&gt;
* Diese Datei erscheint unter dem Name[] im Applications-Menü&lt;br /&gt;
&lt;br /&gt;
Theoretisch kann man mit dieser Methode auch problemlos zwischen mehreren SIP-Einstellungen und vielen weiteren Telefoneinstellungen umschalten (siehe Dateien in /usr/local/data) - der DemoMode funktioniert nach dem gleichen Prinzip.&lt;br /&gt;
&lt;br /&gt;
== Buildumgebung erstellen ==&lt;br /&gt;
&lt;br /&gt;
Bislang ist die Erstellung von GUI-Applikationen (QTopia) noch nicht auf einfache Weise möglich. Das größte Problem ist, dass der Quellcode der Video-Telefon-Anwendung zum größten Teil zur Verfügung steht. Das Erstellen von Kommandozeilen-Anwendungen geht aber schon problemlos.&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
Die verwendete ARM-Entwicklungsumgebung basiert auf gcc. Mittels cygwin kann diese zwar auch als Win32-Anwendungen gebaut werden, dies ist aber in hohem Maß unüblich.&lt;br /&gt;
&lt;br /&gt;
Am besten eine aktuelle Version von Debian oder Ubuntu in &amp;quot;vmware player&amp;quot; oder &amp;quot;virtual box&amp;quot; installieren. Wenn man die virtuelle Maschine nur zum Compilieren verwendet, reicht eine kompakte Kommandozeilen-Version (z.B. Ubuntu Server 9.10). Fertige virtuelle Machinen, im vmware-Marketing-Sprech gerne auch &amp;quot;virtual appliances&amp;quot; genannt, sind reichlich verfügbar (z.B. http://www.vmware.com/appliances/directory/70918).&lt;br /&gt;
&lt;br /&gt;
=== Freetz-Linux ===&lt;br /&gt;
Für Fritzbox-Besitzer besonders geeignet ist das Freetz-linux, welches man im IP-Phone-Forum finden kann (-&amp;gt; http://www.ip-phone-forum.de/showpost.php?p=1400234&amp;amp;postcount=1).&lt;br /&gt;
Dieses kann zum Erstellen von Freetz-Images einerseits und andererseits als Buildumgebung benutzt werden. So spart man sich eine zweite VM.&lt;br /&gt;
&lt;br /&gt;
Die VM selbst braucht nur gestartet werden, den Rest macht man am Besten von seiner gewohnten Umgebung aus.&lt;br /&gt;
Mittels Samba kann einfach per Windowsnetzwerk auf das Home-Verzeichnis zugriffen werden und per SSH kann einfach eine Shell (UTF als Codierung einstellen, dann stimmen auch die Sonderrzeichen) geöffnet werden.&lt;br /&gt;
Es muss sichergestellt werden sein, dass die VM zugriff auf das lokale Netzwerk, sowie das Internet hat (am besten mit einem &#039;ping google.com&#039; überprüfen). Bei mir ging es eigenartiger weise erst, als ich die virtuelle Netzwerkkarte in den VM-Settings auf NAT gestellt habe.&lt;br /&gt;
&lt;br /&gt;
Benutzername und alle Kennwörter sind &#039;freetz&#039;&lt;br /&gt;
&lt;br /&gt;
==== Installation und Test der VP5500 Toolchain ====&lt;br /&gt;
Installation der Buildumgebung:&lt;br /&gt;
  sudo mkdir -p /opt/VP5500/toolchain&lt;br /&gt;
  cd /opt/VP5500/toolchain&lt;br /&gt;
  sudo wget http://www.handhelds.org/download/projects/toolchain/arm-linux-gcc-3.3.2.tar.bz2&lt;br /&gt;
  sudo tar xjf arm-linux-gcc-3.3.2.tar.bz2&lt;br /&gt;
  sudo rm arm-linux-gcc-3.3.2.tar.bz2&lt;br /&gt;
  sudo ln -s /opt/VP5500/toolchain/usr/local/arm /usr/local/arm&lt;br /&gt;
&lt;br /&gt;
Nach einem sudo-Kommando muss eventuell das Passwort eingegeben werden, weswegen die Befehle einzeln eingegeben werden sollten (oder man öffnet am Anfang eine sudo shell, dann kann man das auch weglassen.&lt;br /&gt;
&lt;br /&gt;
Test der Buildumgebung:&lt;br /&gt;
  cd ~&lt;br /&gt;
  wget http://www.mikrocontroller.net/attachment/73161/helloworld.tgz&lt;br /&gt;
  tar -xzf helloworld.tgz&lt;br /&gt;
  rm helloworld.tgz&lt;br /&gt;
  cd helloworld&lt;br /&gt;
  make&lt;br /&gt;
Dannach sollte im ~/helloworld verzeichnis ein neues executable liegen, was vom Hostrechner einfach via Netzwerkfreigabe (\\freetz-linux\helloworld) und via WinSCP auf das Telefon kopiert werden kann.&lt;br /&gt;
&lt;br /&gt;
==== Freetz-Linux eigentlicher Anwendungszweck ====&lt;br /&gt;
wer das Ding auch zum Bauen von Freetz-Images zum Erweitern seiner Fritz-box benutzen will muss sich zuerst ein Freetz runterladen.&lt;br /&gt;
Folgende Schritte machen dies:&lt;br /&gt;
 cd ~&lt;br /&gt;
 svn checkout  http://svn.freetz.org/trunk  freetz-trunk &lt;br /&gt;
Dannach gibts im Home-Verzeichnis das aktuelle Freetz im Verzeichnis &#039;freetz-trunk&#039;.&lt;br /&gt;
Konfigurieren mit &#039;make menuconfig&#039; und Image erstellen mit &#039;make&#039;.&lt;br /&gt;
Wenn alles gut geht kann man das image dann vom Hostrechner aus der Windowsfreigabe &#039;\\freetz-linux\freetz-trunk\images&#039; rausholen und auf die Box spielen.&lt;br /&gt;
&lt;br /&gt;
Für detailiertere Infos bitte direkt bei Freetz nachschlagen:&lt;br /&gt;
http://trac.freetz.org/&lt;br /&gt;
&lt;br /&gt;
=== Linux ===&lt;br /&gt;
Die bisher bekannten, mit VP5500 und VP6500 ausgelieferten Software-Versionen, basieren auf einer etwas älteren &amp;quot;gcc 3.3.2-ARM-Toolchain&amp;quot;. Eine passende Toolchain für ein x86-basiertes Entwicklungssystem ist unter http://www.handhelds.org/download/projects/toolchain/arm-linux-gcc-3.3.2.tar.bz2 zu finden.&lt;br /&gt;
&lt;br /&gt;
Unter Debian-basierten Linux-Distros kann dieses Archiv z.B. nach /opt/VP5500/toolchain entpackt werden (einige der Makefiles im Forum setzen diesen Speicherort voraus). Es ist jedoch zu beachten, dass diese Version der Toolchain auch über den Pfad /usr/local zugänglich sein sollte. Dazu kann mittels &amp;quot;ln -s /opt/VP5500/toolchain/usr/local/arm arm&amp;quot; in /usr/local ein Symlink auf den eigentlichen Speicherort gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
==== Hello World ====&lt;br /&gt;
Christian Klippel (ChrisK) hat unter http://www.mikrocontroller.net/attachment/73161/helloworld.tgz ein &amp;quot;Hello World&amp;quot; bereitgestellt, mit dem sich die Toolchain testen lässt und dessen &amp;quot;Makefile&amp;quot; und &amp;quot;Makefile.local&amp;quot; als Grundlage für eigene Versuche dienen kann.&lt;br /&gt;
&lt;br /&gt;
Das Archiv wird in ein lokals Verzeichnis (z.b. ~/helloworld) entpackt und dort durch Eingabe von &amp;quot;make&amp;quot; compiliert.&lt;br /&gt;
     &lt;br /&gt;
Zum Testen muss das Binary natürlich auf das Zielsystem übertragen werden. Wenn auf dem Entwicklungssystem ein http-Server oder ein ssh-Server läuft, kann man das Binary einfach in ein darüber zugängliches Verzeichnis kopieren es anschließend in einer telnet-Sitzung vom Verzeichnis /tmp aus mittels wget oder scp laden. Zum Test muss die Datei mittels &amp;quot;chmod +x helloworld&amp;quot; ausführbar gemacht werden, bevor sie mit &amp;quot;./helloworld&amp;quot; ausgeführt werden kann.&lt;br /&gt;
&lt;br /&gt;
Mittels eines ftpd (z.B. http://www.mikrocontroller.net/attachment/73780/troll-ftpd_1.28-cg2_arm.tgz) oder sshd (z.B. Dropbear von http://vp6500.bd8.nl/) auf dem Zielsystem, kann man das Kopieren auch vom Entwicklungssystem aus durchführen.&lt;br /&gt;
&lt;br /&gt;
==== Anpassen kleinerer Konsolen-Tools auf Cross-Compilierung ====&lt;br /&gt;
Die Makefiles von kleineren Projekten sind häufig nicht so sauber aufgebaut wie das helloworld-Beispiel, so dass man sie leichter ersetzt, als ändert. Am Beispiel von micro_httpd (http://www.acme.com/software/micro_httpd/ , http://www.mikrocontroller.net/attachment/73175/micro_httpd.tar.gz) kann leicht nachvollzogen werden, wie man den modularen Ansatz vom &amp;quot;Hello World&amp;quot;-Beispiel übernehmen kann (Makefile -&amp;gt; Makefile + Makefile.local).&lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
&lt;br /&gt;
== Hardware  + Software Versionen ==&lt;br /&gt;
&lt;br /&gt;
Listet mal eure Hardware- und Softwareversion aus dem &#039;&#039;&#039;Applications&#039;&#039;&#039; =&amp;gt; &#039;&#039;&#039;System Info&#039;&#039;&#039; Menü auf, wenn sie hier noch nicht stehen!&lt;br /&gt;
&lt;br /&gt;
=== VP5500 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Hardware Version             !! Date     !! Software Version   &lt;br /&gt;
|- &lt;br /&gt;
| ind5                         ||0645      || 4.20&lt;br /&gt;
|- &lt;br /&gt;
| ind5                         ||0647      || 4.20&lt;br /&gt;
|-&lt;br /&gt;
| ind5                         ||0648      || 4.20&lt;br /&gt;
|-&lt;br /&gt;
| ind5                         ||0649      || 4.20&lt;br /&gt;
|-&lt;br /&gt;
| ind5                         ||0702      || 4.20&lt;br /&gt;
|-&lt;br /&gt;
| ind5                         ||0703      || 4.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== VP6500 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Hardware Version             !! Date     !! Software Version   &lt;br /&gt;
|-&lt;br /&gt;
| ind3-v2                      || 0711     || 3.22&lt;br /&gt;
|-&lt;br /&gt;
| ind3-v2                      || 0713     || 3.22&lt;br /&gt;
|- &lt;br /&gt;
| ind3-v2                      || 0716     || 3.22&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Wünsche und Nutzungsideen =&lt;br /&gt;
&lt;br /&gt;
Wer was äußern möchte, kann das hier reintippeln, zwecks Bündelung Interessen und Kräfte. Muss ja keiner das Rad 3x erfinden und man kann schaun was der ein oder andere macht.&lt;br /&gt;
Eine Status und Kontaktangabe bei Sachen die in Arbeit sind wäre toll.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
* Audiostream-Player&lt;br /&gt;
* MP3&lt;br /&gt;
** madplay gibt es [http://www.mikrocontroller.net/topic/172616#1704777 hier], der automatische Stromsparmodus stört aber noch&lt;br /&gt;
* Browser und sei es nur für Wikipedia und Google&lt;br /&gt;
* Mailclient&lt;br /&gt;
* T9 Unterstützung bei Texteingabe&lt;br /&gt;
* Skypebenutzung&lt;br /&gt;
* Nutzungsmöglichkeit als Wireless-Webcam&lt;br /&gt;
* WLAN-Repeater&lt;br /&gt;
** besser: [http://freifunk.net Freifunk-] bzw. [http://www.olsr.org OLSR-Daemon]&lt;br /&gt;
* Wecker&lt;br /&gt;
* Voice-Crypto&lt;br /&gt;
* Unterstützung von mehreren WLAN Profilen, damit man das Gerät an mehreren APs betreiben kann ohne jedesmal SSID / Key neu eingeben zu müssen. (Sollte durch mehrere Einträge in der wpa_supplicant.conf möglich sein. Diese wird aber bei Änderungen über&#039;s Menü komplett überschrieben. Alternative: [[#simpler WLAN-Switcher]])&lt;br /&gt;
* Unterstützung von mehreren SIP Profilen, um z.b. von einem SIP-Anbieter auf den anderen zu wechseln. Ideal wäre, wenn man 2 SIP Profile gleichzeitig nutzen könnte&lt;br /&gt;
* YouTube Client, vgl. mit &amp;quot;MiniTube Linux&amp;quot;&lt;br /&gt;
* &#039;ne aktuelle Firmware? z.B: mit 2.6er Kernel und Android?&lt;br /&gt;
* Unterstützung für WLANs mit 802.1x die WPA2 verschlüsselt sind reparieren bzw. passende Konfig finden (unverschlüsselt geht schon)&lt;br /&gt;
&lt;br /&gt;
== Hardwarerweiterungen ==&lt;br /&gt;
&lt;br /&gt;
* Speichererweiterung&lt;br /&gt;
* USB Anschluss&lt;br /&gt;
* Blauzahn&lt;br /&gt;
* zusätzlicher Anschluss um eine andere Videokamera anzuschließen mit CINCH&lt;br /&gt;
&lt;br /&gt;
== Nutzungsideen ==&lt;br /&gt;
&lt;br /&gt;
* VoIP Phone und Webcam (nahliegend)&lt;br /&gt;
* WLAN-Finder&lt;br /&gt;
* Repeater&lt;br /&gt;
* mobiles Infogerät mit Wikizugriff und Mailpush in der Wireless-Bubble&lt;br /&gt;
* Türöffner, Ferncontroller&lt;br /&gt;
* Robohirn&lt;br /&gt;
* WLAN-Radio&lt;br /&gt;
* Video(Streaming)-Client in Verbindung mit VDR&lt;br /&gt;
* Barcode-Reader&lt;br /&gt;
* als Fernbedienung für PC (Winamp/Mediaplayer/VLC...&lt;br /&gt;
* Streamclient und Fernbedienung für DBOX2 mit Linux&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Projekte]]&lt;br /&gt;
[[Kategorie:Datenübertragung]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=PHILIPS_VP5500_VoIP_Telefon&amp;diff=77727</id>
		<title>PHILIPS VP5500 VoIP Telefon</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=PHILIPS_VP5500_VoIP_Telefon&amp;diff=77727"/>
		<updated>2013-07-26T15:39:45Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Änderung 77722 von 221.178.200.120 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Verwandte Artikel =&lt;br /&gt;
* Konfiguration: http://www.mikrocontroller.net/topic/170483#new&lt;br /&gt;
* Kernel/GUI Entwicklung: http://www.mikrocontroller.net/topic/172616#new&lt;br /&gt;
* http://das-labor.org/wiki/VP5500&lt;br /&gt;
* (Hack) http://spritesmods.com/?art=vpx500&lt;br /&gt;
* http://vp6500.bd8.nl/&lt;br /&gt;
&lt;br /&gt;
= Allgemeines =&lt;br /&gt;
&lt;br /&gt;
Bei den diesem Text zugrundeliegenden Geräten handelt es sich um videofähige VoIP-Phones des Herstellers Philips, die vom früheren holländischen Anbieter KPN vertrieben wurden und nach dessen Ausscheiden aus dem Markt nun günstig erhältlich sind.&lt;br /&gt;
Ihr geringer Preis, die SoC-Architektur und das darauf laufende OS macht sie dabei für all jene interessant, die ihre eigenen Ideen und Projekte auf der Basis eines solchen Gerätes verwirklichen wollen, und gibt den oft fabrikneuen Exemplaren eine Art zweite Chance.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
=== VP5500 ===&lt;br /&gt;
* Kamera-Auflösung 640x480 Pixel&lt;br /&gt;
* 30 Bilder pro Sekunde&lt;br /&gt;
* Kamera um 240° drehbar&lt;br /&gt;
* 5,6 cm (2,2&amp;quot;) TFT-Display, 176x220 Pixel, 65000 Farben&lt;br /&gt;
* Audio-/Video-Ausgang - 4fach 2,5mm Klinke-Cinch&lt;br /&gt;
* integrierter Li-Ion Akku, 3,7 V-/1100 mAh&lt;br /&gt;
* englische und niederländische Menüsprache&lt;br /&gt;
* Software Qtopia Version 2.1.0&lt;br /&gt;
* Maße (LxBxH): 134x49x24 mm.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Philips_VP5500.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== VP6500 ===&lt;br /&gt;
&lt;br /&gt;
* Kamera-Auflösung 640x480 Pixel&lt;br /&gt;
* 30 Bilder pro Sekunde&lt;br /&gt;
* Kamera um 240° drehbar&lt;br /&gt;
* 5,6 cm (2,2&amp;quot;) TFT-Display, 176x220 Pixel, 65000 Farben&lt;br /&gt;
* Audio-/Video-Ausgang - 4fach 3,5mm Klinke-Cinch&lt;br /&gt;
* 2x Philips Multilife AA/R6NM 1800mAh NiMH-Akkus, je 1,2V, Ladeempfehlung: 15h mit 180mAh&lt;br /&gt;
* englische, deutsche und niederländische Menüsprache&lt;br /&gt;
* Software Qtopia Version 2.1.0&lt;br /&gt;
* Maße (LxBxH): 134x49x24 mm.&lt;br /&gt;
* Gewicht Mobilteil: 170 g (inkl. 2 NiMH-Akkus AA)&lt;br /&gt;
[[Bild:VP6500_kl.jpg]]&lt;br /&gt;
&lt;br /&gt;
= Das VPx500 &#039;rooten&#039; =&lt;br /&gt;
&lt;br /&gt;
Um vollen Zugang zum System auf dem Gerät zu erhalten gibt es mehrere Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
== per telnet ==&lt;br /&gt;
Sobald das Telefon im Netzwerk angemeldet ist (egal ob DHCP oder statisch) kann über irgendein Terminal vom Netzwerk aus via telnet und der Telefon-IP auf das Gerät zugegriffen werden.&lt;br /&gt;
User: root / PW: toor&lt;br /&gt;
&lt;br /&gt;
== per serieller Schnittstelle ==&lt;br /&gt;
Dazu muß der [[#UART]] angeschlossen werden. Während des Bootvorgangs drückt man immer wieder ziellos irgendwelche Tasten bis man am Prompt des [http://www.lartmaker.nl/lartware/blob/ blob-Bootloaders] ist.&lt;br /&gt;
Dann kann man &lt;br /&gt;
 boot root=/dev/mtdblock2 init=/bin/sh&lt;br /&gt;
eingeben, um an eine minimale Shell zu kommen.&lt;br /&gt;
&lt;br /&gt;
In dieser setzt man dann mit &lt;br /&gt;
 passwd&lt;br /&gt;
das Passwort für &#039;&#039;root&#039;&#039;. Danach kann man sich als &#039;&#039;root&#039;&#039; mit dem gesetzten Passwort einloggen.&lt;br /&gt;
&lt;br /&gt;
== per DNS-Hack ==&lt;br /&gt;
Um den Rootzugriff zu aktivieren, wird dem Telefon ein Softwareupdate vorgegaukelt. Es versucht, auf den Updateserver von KPN zuzugreifen (den es nicht mehr gibt). Glücklicherweise geschieht dies nicht über eine feste IP, sondern über einen Hostnamen, so dass man an dieser Stelle sich durch einen eigenen DNS den Domainname auf einen eigenen Server umleiten kann. Daher ist im eigenen Netzwerk eine Umleitung des DNS erforderlich (oder ein DHCP-Server, der die Adresse des DNS bekanntgibt. Stichworte &#039;Static DNS&#039;, ..).&lt;br /&gt;
Das Gerät holt sich dann ein Updatepaket, das den Telnet-Zugang aktiviert.&lt;br /&gt;
&lt;br /&gt;
Dann lässt sich per Terminal (Linux. Windows: ....) die Kommandozeile des Geräts aufrufen:&lt;br /&gt;
&lt;br /&gt;
 telnet 123.456.789.012&lt;br /&gt;
&lt;br /&gt;
Passwort ist &amp;quot;toor&amp;quot;.&lt;br /&gt;
Das Ändern des root-Passwortes erfolgt mit dem Befehl passwd.&lt;br /&gt;
&lt;br /&gt;
Unter Applications&amp;gt;Registration sind Netzwerk- und VoIP-Einstellungen zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Anleitung für Fritz-Box-Benutzer ===&lt;br /&gt;
Die Fritzboxen bieten bisher leider keine Möglichkeit, den verwendeten DNS&lt;br /&gt;
direkt im Webinterface zu ändern, über Umwege geht es aber doch:&lt;br /&gt;
* Über das Webinterface der Fritzbox die Einstellungen sichern&lt;br /&gt;
* Exportdatei im Texteditor öffnen (am besten nicht Notepad, da der die Unix-Zeilenumbrüche nicht versteht - zur Not geht auch Wordpad)&lt;br /&gt;
* nach overwrite_dns1 suchen (gibt es zwei mal) und da den DNS 84.38.68.30 (von blooza http://www.mikrocontroller.net/topic/170483#1651124 bereitgestellt) oder 188.40.123.50 (von sprites http://spritesmods.com/?art=vpx500 bereitgestellt) eintragen&lt;br /&gt;
* am Anfang der Exportdatei VOR &amp;quot;**** CFGFILE:ar7.cfg&amp;quot; eine Zeile &#039;NoChecks = yes&#039; einfügen, damit die Fritzbox die nun nicht mehr passende Checksumme ignoriert.&lt;br /&gt;
* Einstellungen zurück in die Fritzbox übertragen.&lt;br /&gt;
&lt;br /&gt;
Wenn die Telefone entsperrt sind, den DNS wieder entfernen (Es ist&lt;br /&gt;
vielleicht eine ganz gute Idee, wenn man da zwei unabhängige DNS-Server&lt;br /&gt;
einträgt, so umgeht man auch gleich providerseitige DNS-Sperren)&lt;br /&gt;
&lt;br /&gt;
==== Alternative ====&lt;br /&gt;
Wer sich den nicht ganz ungefährlichen Weg mit den anpassungen an der Fritzbox erspahren will, wechselt seine Fritzbox in den Expertenmodus. Danach kann man unter System - Netzwerk bei dem Punkt &amp;quot;IP adresse der Fritzbox ändern&amp;quot; bei vielen modellen den internen DHCP abschalten. Dann unter windows z.B. tftpd32 (http://tftpd32.jounin.net/) starten, in dessen DHCP-Server die Fritzbox als Gateway und den entsprechenden &amp;quot;modding-dns&amp;quot; eintragen und das Telefon neustarten.&lt;br /&gt;
&lt;br /&gt;
War das Telefon schonmal angemeldet, versucht es die selbe IP vom neuen DHCP zu erzwingen, was tftpd32 nicht wirklich mag. Daher im tftpd32 die lease-ip bei 2 beginnen lassen und eine range von 250 eintragen, damit die vom Telefon verlangte IP auch im Adresspool des dhcp servers vorhanden ist.&lt;br /&gt;
&lt;br /&gt;
=== Anleitung fli4l ===&lt;br /&gt;
Mit dem [http://www.fli4l.de fli4l] ist das ganze ganz einfach.&lt;br /&gt;
&lt;br /&gt;
In der Datei config/dns_dhcp.txt den DNS  Redirect für die zwei DNS-Name Konfigurieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;file&amp;gt;&lt;br /&gt;
    DNS_REDIRECT_N=&#039;2&#039;                # number of redirected domains&lt;br /&gt;
    DNS_REDIRECT_1=&#039;ntp.xs4all.nl&#039;    # 1st redirected domain&lt;br /&gt;
    DNS_REDIRECT_1_IP=&#039;188.40.123.50&#039; # IP of redirected domain&lt;br /&gt;
&lt;br /&gt;
    DNS_REDIRECT_2=&#039;vpcm-001.cust.kpn.net&#039; &lt;br /&gt;
    DNS_REDIRECT_2_IP=&#039;188.40.123.50&#039; &lt;br /&gt;
&amp;lt;/file&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Hardware =&lt;br /&gt;
&lt;br /&gt;
== verwendete Komponenten ==&lt;br /&gt;
&lt;br /&gt;
* MCU: [http://www.mikrocontroller.net/attachment/72258/datasheet.pdf Freescale MC9328MX21] (ARM9) @ 266MHz ([http://en.wikipedia.org/wiki/I.MX21 Wikipedia_englisch]) &lt;br /&gt;
** gehört zur ARM9E-Familie: ARMv5TEJ -&amp;quot;IntructionSet&amp;quot; (ARM926EJ-S)&lt;br /&gt;
** [http://www.freescale.com/files/32bit/doc/ref_manual/MC9328MX21RM.pdf MC9328MX21 Applications Processor Reference Manual]&lt;br /&gt;
* PC-to-TV-Konverter-Chip: [http://www.mikrocontroller.net/attachment/73579/Data_Sheets.zip FS455LF]&lt;br /&gt;
* WLAN: Marvell 88w8385, als Modul von [http://www.mikrocontroller.net/attachment/72802/WM-G-MR-01-v27__01192006.pdf WM-G-MR-01] (VP5500) / Philips [http://www.mikrocontroller.net/attachment/73812/BGW211_Preliminary_Datasheet_v1.1.pdf BGW211], on-board (VP6500)&lt;br /&gt;
* SDRAM: 2 x [http://www.mikrocontroller.net/attachment/72461/K4S56163LF.pdf K4S56163LF] - 4M x 16Bit x 4 Banks im VP5500&lt;br /&gt;
* SDRAM: 1 x [http://www.mikrocontroller.net/attachment/73520/Samsung_64MB_K4M51323PC_1_8V.pdf K4M51323PC_1_8V] - 4M x 32Bit x 4 Banks im VP6500&lt;br /&gt;
* Flash: 2 x ws128j0pbfw00 [http://www.mikrocontroller.net/attachment/72462/S29WS064J.pdf S29WS128J/064J] 128/64 Megabit (8/4 M x 16-Bit) CMOS 1.8 Volt-only Simultaneous Read/Write, Burst Mode Flash Memory im VP5500&lt;br /&gt;
* Flash: 1 x [http://www.mikrocontroller.net/attachment/73521/S29GL512N.pdf S29GL512N] - 512 Megabit, 3.0 Volt-only Page Mode Flash Memory im VP6500&lt;br /&gt;
* Kamera: dc-4626.a5 by chicony&lt;br /&gt;
* Display: Samsung LTS220QC (HD66772 Controller)&lt;br /&gt;
&lt;br /&gt;
== Messungen ==&lt;br /&gt;
&lt;br /&gt;
=== Stromaufnahme ===&lt;br /&gt;
&lt;br /&gt;
==== VP5500 ====&lt;br /&gt;
FIXME &lt;br /&gt;
&lt;br /&gt;
==== VP6500 ====&lt;br /&gt;
 &lt;br /&gt;
Konfiguration: VP6500 mit aktivierter serieller Konsole an Labornetzteil, Spannung 3.67V (Bei weniger bootet es anscheinend aufgrund von Stromspitzen nicht richtig und vermeldet auf der seriellen Konsole ein &#039;battery low&#039; und schaltet sich danach selbst ab. Diese Spannung sollte noch so gerade &#039;safe&#039; sein, geht man davon aus, daß da ein Step-Up im Innern am werkeln ist und noch ein geringer Abfall über die Schottky-Diode einzurechnen ist). &lt;br /&gt;
&lt;br /&gt;
===== Telefon =====&lt;br /&gt;
* Booten: bis zu 420mA&lt;br /&gt;
* Einbuchen: ca. 400mA&lt;br /&gt;
* mit abgeschaltetem Display, aber eingebucht und laufend (idle): ca. 80mA&lt;br /&gt;
* mit angeschaltetem Display, eingebucht und idle: ca. 190mA&lt;br /&gt;
* mit 100% Prozessor-Last (von serieller Konsole ausgeführt: &amp;quot;while true; do true; done&amp;quot;): ca. 60mA mehr als idle (Scheint aber auch größere Sprünge für andere CPU-Last zu geben)&lt;br /&gt;
* im &#039;Deep Sleep&#039; (wird ein paar Minuten nach Einschalten erreicht): &amp;lt;10mA (!), mit kurzen Wachphasen mit erheblichem Stromverbrauch (&amp;gt;100mA). Beachte: Die serielle Konsole ist in diesem Modus auch nicht mehr aktiv, das Telefon ist aber nicht abgestürzt (Tastendruck aktiviert die Konsole wieder).&lt;br /&gt;
* Telefonieren ca 500mA&lt;br /&gt;
* Telefonieren mit Webcam ca 550mA&lt;br /&gt;
&lt;br /&gt;
===== Ladegerät =====&lt;br /&gt;
* Phone nicht in der Ladeschale: &amp;lt; 0.2W&lt;br /&gt;
* Phone wird geladen: ca 4W&lt;br /&gt;
&lt;br /&gt;
== System-Takte ==&lt;br /&gt;
 # cat /proc/systclk&lt;br /&gt;
 System clocks state:&lt;br /&gt;
     Ref clock :      32768Hz  (int, premult by 512)&lt;br /&gt;
     MPLL clock:  263999905Hz  (computed: 264000000Hz)&lt;br /&gt;
     SPLL clock:  163840000Hz  (computed: 163840000Hz)&lt;br /&gt;
     CPU clock :  263999905Hz  (PERSC   = 0)&lt;br /&gt;
     Bus clock :  132000000Hz  (BCLKDIV = 1, computed: 131999952Hz)&lt;br /&gt;
     CSI clock :  unknown      (cannot read register CSICR1)&lt;br /&gt;
     USB clock :   20480000Hz  (USB_DIV = 7)&lt;br /&gt;
     Wait State:  CS0U[WSC] = 10, CS0U[WSC] = 48&lt;br /&gt;
     loops_per_jiffy = 665058&lt;br /&gt;
&lt;br /&gt;
== Innenleben ==&lt;br /&gt;
&lt;br /&gt;
=== Zerlegen des VP5500 ===&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:01_offen_von_Hinten.JPG|1. Geöffnetes Akkufach&lt;br /&gt;
Datei:02_Blende_entfernt.JPG|2. hintere Schwarze Blende entfernt&lt;br /&gt;
Datei:03_Rückseite_entfernt.JPG|3. Schalenrückteil entfernt&lt;br /&gt;
Datei:04_aufhebeln_Vorderteil.JPG|4. Druck nach außen&lt;br /&gt;
Datei:05_vorderteil_entfernt.JPG|5. entferntes Vorderteil&lt;br /&gt;
Datei:06_Elektronik_entfernt.JPG|6. entfernte Elektronik&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# das Akkufach muss geöffnet und die Schrauben entfernt werden&lt;br /&gt;
# hinter der rückseitigen schwarzen Blende befinden sich zwei Schrauben, die entfernt werden müssen&lt;br /&gt;
#* Hierzu am besten mit einem schmalen kleinen Schraubendreher von der Stirnseite aus zwischen die Plastikteile fahren und vorsichtig aufhebeln und den Schraubendreher dabei weiter unter die Blende bewegen.&lt;br /&gt;
# Nun kann einfach das rückseitige Schalenteil abgeschaubt werden&lt;br /&gt;
# das Entfernen des Frontschalenteils ist etwas tricky:&lt;br /&gt;
#* von oben und unten lässt sich ganz gut ein Spalt zur Seite aufweiten&lt;br /&gt;
#* etwas unter der Mitte hängt es aber auf beiden Seiten. Dort befinden sich kleine Plastikbügel, die recht leicht zerbrechen.&lt;br /&gt;
#* Mit einem sehr schmalen Schraubendreher in eine der Lücken fahren (anfangen auf der Seite ohne Tasten) und den Schraubendreher nach innen drücken, so das der Druck in der Seite nach außen wirkt.&lt;br /&gt;
#* Mit etwas Geschick bekommt man das so ohne Bruch ab, es ist aber auch nicht kritisch, wenn der Bügel ein wenig anbricht)&lt;br /&gt;
# Die Platine zu entfernen ist nicht ganz so schwierig.&lt;br /&gt;
#* Zuerst die Seite auf der keine Knöpfe sind:&lt;br /&gt;
#* vorsichtig diese Seite leicht anheben. Am unteren Ende ist auf die Kontakte zu achten &lt;br /&gt;
#* dann versuchen die Platine seitlich nach oben aus dem Gehäuse zu ziehen&lt;br /&gt;
#* dabei auf das Lautsprecherkabel und den Kamerakonnektor achten&lt;br /&gt;
# Zusammenbau genauso, nur umgedreht ;)&lt;br /&gt;
#* nicht die Lautsprecher- und Kamera-Stecker vergessen&lt;br /&gt;
&lt;br /&gt;
=== Bilder vom VP5500 Innenleben ===&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;240&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei:Oberseite.jpg | Ansicht der Oberseite&lt;br /&gt;
Datei:Oberseite_beschriftet.jpg | Oberseite mit Beschriftung der Bauteile&lt;br /&gt;
Datei:Drumherum.jpg | Übersicht über die Komponenten&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;240&amp;quot; &amp;gt;&lt;br /&gt;
Datei:Kontakte_Oberseite.jpg | UART-Schnittstelle Oberseite&lt;br /&gt;
Datei:Kontakte_Unterseite.jpg | JTAG-Schnittstelle Unterseite&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testpins am VP5500 ===&lt;br /&gt;
Original Liste von [http://www.mikrocontroller.net/topic/170483#1646514 Tino] [[Media:Philips vp5500 Liste Testpins.pdf|herrunterladen]].&lt;br /&gt;
&lt;br /&gt;
[[Bild:Philips vp5500 testpins 1.jpg|thumb| Testpins auf der Rückseite]]&lt;br /&gt;
[[Bild:Philips vp5500 testpins 2.jpg|thumb| Frontseite: Die ICs wurden zum Messen ausgelötet.]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Testpin Nr.  !!    verbunden zu !! Funktion&lt;br /&gt;
|-&lt;br /&gt;
|   1       ||                  LED || unbekannt&lt;br /&gt;
|-&lt;br /&gt;
|    2     ||            Kamera Pin 8 an CN1 || unbekannt&lt;br /&gt;
|-&lt;br /&gt;
|    3     ||                  Pin 4 an IC1 || unbekannt&lt;br /&gt;
|-&lt;br /&gt;
|    4    ||                z.B. IC5 Pin V 18 || VDDA&lt;br /&gt;
|-&lt;br /&gt;
|    5    ||                       GND || GND&lt;br /&gt;
|-&lt;br /&gt;
|    6     ||                       NC || NC&lt;br /&gt;
|-&lt;br /&gt;
|    7     ||                Pin E 16 an IC5 || SAP_CLK&lt;br /&gt;
|-&lt;br /&gt;
|    8     ||                 Pin 1 an CN 3 || Lautsprecher&lt;br /&gt;
|-&lt;br /&gt;
|    9     ||                 Pin 2 an CN 3 || Lautsprecher&lt;br /&gt;
|-&lt;br /&gt;
|    10    ||                  Pin an CN 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
|    11     ||                 Pin an CN 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
|    12    ||                  Pin an CN 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
|    13    ||                Pin L 16 an IC5 || UART2_TXD&lt;br /&gt;
|-&lt;br /&gt;
|    14     ||               Pin C 12 an IC5 || USBH1_RXDM&lt;br /&gt;
|-&lt;br /&gt;
|    15   ||                 Pin H 12 an IC5 || USBH1_TXDP&lt;br /&gt;
|-&lt;br /&gt;
|    16     ||               Pin B 19 an IC5 || CSPI2_SS2&lt;br /&gt;
|-&lt;br /&gt;
|    17   ||                 Pin B16 an IC5 || SSI2_FS&lt;br /&gt;
|-&lt;br /&gt;
|    18     ||               Pin F 18 an IC5 || KP_ROW0&lt;br /&gt;
|-&lt;br /&gt;
|    19    ||                Pin K 18 an IC5 || KP_COL4&lt;br /&gt;
|-&lt;br /&gt;
|    20    ||                Pin L 19 an IC5 || UART3_TXD&lt;br /&gt;
|-&lt;br /&gt;
|    21     ||               Pin T 14 an IC5 || RESET_IN&lt;br /&gt;
|-&lt;br /&gt;
|    22    ||    geht an + des Kondensators neben IC6 || unbekannt&lt;br /&gt;
|-&lt;br /&gt;
|    23   ||                Pin D 13 an IC 9 || CLKOUT&lt;br /&gt;
|-&lt;br /&gt;
|    24      ||             Pin E 13 an IC 9 || CLKIN_P&lt;br /&gt;
|-&lt;br /&gt;
|    25    ||                Pin A 9 an IC 9 || DAC_D&lt;br /&gt;
|-&lt;br /&gt;
|    26    ||                Pin A 8 an IC 9 || DAC_A&lt;br /&gt;
|-&lt;br /&gt;
|    27    ||                Pin A 7 an IC 9 || DAC_B&lt;br /&gt;
|-&lt;br /&gt;
|    28     ||               Pin A 6 an IC 9 || DAC_C&lt;br /&gt;
|-&lt;br /&gt;
|    29      ||             Pin L 13 an IC 5 || UART1_TXD&lt;br /&gt;
|-&lt;br /&gt;
|    30     ||              Pin T 16 an IC 5 || BOOT1&lt;br /&gt;
|-&lt;br /&gt;
|    31  ||                 Pin K 10 an IC 5 || UART1_RXD&lt;br /&gt;
|-&lt;br /&gt;
|    32    ||               Pin U 17 an IC 5 || BOOT2&lt;br /&gt;
|-&lt;br /&gt;
|    33    ||                 Pin 9 an IC 23 || unbekannt&lt;br /&gt;
|-&lt;br /&gt;
|    34    ||                Pin D 19 an IC5 || CSPI2_SCLK&lt;br /&gt;
|-&lt;br /&gt;
|    35     ||              Pin C 14 an IC5 || TIN&lt;br /&gt;
|-&lt;br /&gt;
|    36    ||                Pin C 19 an IC5 || CSPI2_SS1&lt;br /&gt;
|-&lt;br /&gt;
|    37   ||                 Pin D 18 an IC5 || CSPI2_SS0&lt;br /&gt;
|-&lt;br /&gt;
|    38     ||               Pin E 19 an IC5 || CSPI2_MOSI&lt;br /&gt;
|-&lt;br /&gt;
|    39     ||               Pin H 19 an IC5 || PWMO&lt;br /&gt;
|-&lt;br /&gt;
|    40   ||            Pin J 9 an IC 7 und IC 8 || VDD&lt;br /&gt;
|-&lt;br /&gt;
|    41   ||                 Pin J 19 an IC 5 || KP_COL2&lt;br /&gt;
|-&lt;br /&gt;
|    42   ||                Pin K 16 an IC 5 || KP_COL3&lt;br /&gt;
|-&lt;br /&gt;
|    43   ||                 Pin J 11 an IC 5 || KP_ROW2&lt;br /&gt;
|-&lt;br /&gt;
|44      ||     Pin J 17 an IC 5 || KP_COL1&lt;br /&gt;
|-&lt;br /&gt;
|45  ||         Pin G 19 an IC 5 || KP_ROW4&lt;br /&gt;
|-&lt;br /&gt;
|46  ||         Pin G 17 an IC 5 || KP_ROW3&lt;br /&gt;
|-&lt;br /&gt;
|47  ||    Pin D 5 an IC 10 und IC 11 || ACC&lt;br /&gt;
|-&lt;br /&gt;
|48 ||          Pin G 16 an IC 5 || KP_ROW1&lt;br /&gt;
|-&lt;br /&gt;
|49   ||        Pin J 18 an IC 5 || KP_COL0&lt;br /&gt;
|-&lt;br /&gt;
|50  ||         Pin V 18 an IC 5 || VDDA&lt;br /&gt;
|-&lt;br /&gt;
|51 ||      Pin 2 an CN KB-Stecker || ?&lt;br /&gt;
|-&lt;br /&gt;
|52 ||           Pin 2 an IC 15 ||  ?&lt;br /&gt;
|-&lt;br /&gt;
|53  ||      Pin 4 am LCD Stecker || ?&lt;br /&gt;
|-&lt;br /&gt;
|54  ||         Pin E 17 an IC 5 || CSPI2_MISO&lt;br /&gt;
|-&lt;br /&gt;
|55 ||  Pin 1,2,3,10,13 am LCD Stecker || ?&lt;br /&gt;
|-&lt;br /&gt;
|56  ||          Pin 3 an IC 16 ||  ?&lt;br /&gt;
|-&lt;br /&gt;
|57  ||         Pin U 10 an IC 5 || PC_PWRON&lt;br /&gt;
|-&lt;br /&gt;
|58  ||            Pin 1 IC 18 || ?&lt;br /&gt;
|-&lt;br /&gt;
|59  ||       an Diode über IC 16 || ?&lt;br /&gt;
|-&lt;br /&gt;
|60  ||          Pin 3 an IC 25 || ?&lt;br /&gt;
|-&lt;br /&gt;
|61 ||         Ladekontakt positiv || Ladegerät +&lt;br /&gt;
|-&lt;br /&gt;
|62  ||               GND || GND&lt;br /&gt;
|-&lt;br /&gt;
|63  ||        Akku Mittelkontakt || Akkustand? Temperatur?&lt;br /&gt;
|-&lt;br /&gt;
|64 ||       Transistor unter IC 16 || ?&lt;br /&gt;
|-&lt;br /&gt;
|65  ||          Pin 2 an IC 22 || ?&lt;br /&gt;
|-&lt;br /&gt;
|66   ||      Pin 1,12,30 an IC 24 || VSS&lt;br /&gt;
|-&lt;br /&gt;
|67  ||    Kondensator + unter IC 20 || ?&lt;br /&gt;
|-&lt;br /&gt;
|68   ||         Pin 5 an IC 21 || ?&lt;br /&gt;
|-&lt;br /&gt;
|69  ||           Pin 2 an IC 4 || ?&lt;br /&gt;
|-&lt;br /&gt;
|70    ||        Pin 25 an IC24 || MCLK&lt;br /&gt;
|-&lt;br /&gt;
|71  ||       Prozessor Pin W 14 || QVDD&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Testpins am VP6500 ===&lt;br /&gt;
Original Listen von [http://www.mikrocontroller.net/topic/170483#1658720 Tino] herunterladen. [[Media:V6500_Back.xls|Rückseite]], [[Media:V6500_Front.xls|Vorderseite]].&lt;br /&gt;
&lt;br /&gt;
[[Bild:V6500_Back.jpg|thumb| Testpins auf der Rückseite]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Testpin Nr.  !!    verbunden zu !! Funktion&lt;br /&gt;
|-		&lt;br /&gt;
| 1 || Pin 21 an BGW211EG || POR_N&lt;br /&gt;
|-		&lt;br /&gt;
| 2 || Pin A 14 an i.MX21 || TOUT&lt;br /&gt;
|-		&lt;br /&gt;
| 3 || Pin 46 an BGW211EG || JTAG_TDI&lt;br /&gt;
|-		&lt;br /&gt;
| 4 || Pin 44 an BGW211EG || JTAG_TCLK&lt;br /&gt;
|-		&lt;br /&gt;
| 5 || Pin 42 an BGW211EG || JTAG_TDO&lt;br /&gt;
|-		&lt;br /&gt;
| 6 || Pin 47 an BGW211EG || JTAG_TRST_N&lt;br /&gt;
|-		&lt;br /&gt;
| 7 || PIN 45 an BGW211EG || JTAG_TMS&lt;br /&gt;
|-		&lt;br /&gt;
| 8 || Pin 43 an BGW211EG || JTAG_RTCLK&lt;br /&gt;
|-		&lt;br /&gt;
| 9 || Pin C 14 an i.MX21 || TIN&lt;br /&gt;
|-		&lt;br /&gt;
| 10 || VDD || VDD&lt;br /&gt;
|-		&lt;br /&gt;
| 11 || Pin K 10 an i.MX21 || UART1_RXD&lt;br /&gt;
|-		&lt;br /&gt;
| 12 || Pin L 13 an i.MX21 || UART1_TXD&lt;br /&gt;
|-		&lt;br /&gt;
| 13 || GND || GND&lt;br /&gt;
|-		&lt;br /&gt;
| 14 || Pin U 17 an i.MX21 || BOOT2&lt;br /&gt;
|-		&lt;br /&gt;
| 15 || Pin V 16 an i.MX21 || BOOT0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Bild:V6500_Front.jpg|thumb| Frontseite: Die ICs wurden zum Messen ausgelötet.]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Testpin Nr.  !!    verbunden zu !! Funktion&lt;br /&gt;
|-		&lt;br /&gt;
| 1 || 	Pin 29 von BGW211EG &amp;amp; F 16 an i.MX21 || RESET_N / CSPI1_SS1&lt;br /&gt;
|-		&lt;br /&gt;
| 2 || 	Pin 28 an BGW211EG &amp;amp; J 12 an i.MX21 || SPI_DAT_MOSI / CSPI1_MOSI&lt;br /&gt;
|-		&lt;br /&gt;
| 3 || 	Pin 27 an BGW211EG &amp;amp; F 19 an i.MX21 || SPI_SS_N / CSPI1_SS0&lt;br /&gt;
|-		&lt;br /&gt;
| 4 || 	Pin 26 an BGW21EG &amp;amp; F 17 an i.MX21 || SPI_DAT_MISO / CSPI1_MISO&lt;br /&gt;
|-		&lt;br /&gt;
| 5 || 	Pin 25 an BGW211EG &amp;amp; H 10 an i.MX21 || SPI_CLK / CSPI1_SCLK&lt;br /&gt;
|-		&lt;br /&gt;
| 6 || 	Pin 24 an BGW211EG &amp;amp; H 11 an i.MX21 || SPI_EXT_INT / CSPI1_RDY&lt;br /&gt;
|-		&lt;br /&gt;
| 7 || 	Pin 41 an BGW211EG || UART_TX&lt;br /&gt;
|-		&lt;br /&gt;
| 8 || 	Pin 40 an BGW211EG || UART_RX&lt;br /&gt;
|-		&lt;br /&gt;
| 9 || 	Transistor unter Testpunkt || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 10 || 	GND || GND&lt;br /&gt;
|-		&lt;br /&gt;
| 11 || 	LED || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 12 || 	Pin 8 am Kamerastecker || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 13 || 	Pin 18 am Kamerastecker || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 14 || 	Pin E 13 &amp;amp; H12 an FS455 || CLKIN / PREF&lt;br /&gt;
|-		&lt;br /&gt;
| 15 || 	Pin D 13 an FS455 || CLKOUT&lt;br /&gt;
|-		&lt;br /&gt;
| 16 || 	Pin A 11 an FS455 || XTAL_OUT&lt;br /&gt;
|-		&lt;br /&gt;
| 17 || 	VDD von FS455 || VDD&lt;br /&gt;
|-		&lt;br /&gt;
| 18 || 	Pin 15 &amp;amp; 16 am Displayconnector || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 19 || 	geht an 2 Dioden links daneben || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 20 || 	Pin M 19 an i.MX21 || UART1_CTS&lt;br /&gt;
|-		&lt;br /&gt;
| 21 || 	Pin M 18 an i.MX21 || UART1_RTS &amp;amp; GND ??&lt;br /&gt;
|-		&lt;br /&gt;
| 22 || 	VDDan i,MX21 || VDD&lt;br /&gt;
|-		&lt;br /&gt;
| 23 || 	Pin G 10 an i.MX21 || USB_BYP&lt;br /&gt;
|-		&lt;br /&gt;
| 24 || 	Pin A 19 an i.MX21 || SSI3_FS&lt;br /&gt;
|-		&lt;br /&gt;
| 25 || 	Pin D 17 an i.MX21 || SSI2_CLK&lt;br /&gt;
|-		&lt;br /&gt;
| 26 || 	VDD an i.MX21 || VDD&lt;br /&gt;
|-		&lt;br /&gt;
| 27 || 	Pin T 17 an i.MX21 || SD1_D3&lt;br /&gt;
|-		&lt;br /&gt;
| 28 || 	Pin A 15 an i.MX21 || SAP_TXDAT&lt;br /&gt;
|-		&lt;br /&gt;
| 29 || 	GND || GND&lt;br /&gt;
|-		&lt;br /&gt;
| 30 || 	Pin T 14 an i.MX21 || RESET_IN&lt;br /&gt;
|-		&lt;br /&gt;
| 31 || 	Pin R 19 an i.MX21 || TRST&lt;br /&gt;
|-		&lt;br /&gt;
| 32 || 	Pin P 19 an i.MX21 || TMS&lt;br /&gt;
|-		&lt;br /&gt;
| 33 || 	Pin N 17 an i.MX21 || TCK&lt;br /&gt;
|-		&lt;br /&gt;
| 34 || 	Pin K 11 an i.MX21 || TDO&lt;br /&gt;
|-		&lt;br /&gt;
| 35 || 	Pin P 18 an i.MX21 || TDI&lt;br /&gt;
|-		&lt;br /&gt;
| 36 || 	Pin 13 an TLV320 || OUTP2&lt;br /&gt;
|-		&lt;br /&gt;
| 37 || 	Pin 14 an TLV320 || OUTMV&lt;br /&gt;
|-		&lt;br /&gt;
| 38 || 	Pin 15 an BGW211EG || VDD&lt;br /&gt;
|-		&lt;br /&gt;
| 39 || 	Pin an Klinkenbuchse || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 40 || 	Pin an Klinkenbuchse || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 41 || 	? || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 42 || 	LED Tastatur || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 43 || 	LED Tastatur || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 44 || 	Pin 1,8 an 20XN2512 &amp;amp; Key ON || PowerON&lt;br /&gt;
|-		&lt;br /&gt;
| 45 || 	Pin 7 an BDR72K || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 46 || 	Pin 2 an BDR72K || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 47 || 	Pin 6 an MRRBGB3 || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 48 || 	LED Tastatur ||  ?&lt;br /&gt;
|-		&lt;br /&gt;
| 49 || 	Pin 10 an MRRBG3 || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 50 || 	LED Tastatur || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 51 || 	geht an Widerstand auf Rückseite ? || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 52 || 	Pin L 13 an i.MX21 || UART1_TXD&lt;br /&gt;
|-		&lt;br /&gt;
| 53 || 	geht an Diode und Kondensator auf der Rückseite || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 54 || 	Pin C 14 an i.MX21 || TIN&lt;br /&gt;
|-		&lt;br /&gt;
| 55 || 	geht an Widerstand auf der Rückseite || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 56 || 	Pin 7 an BDR72K || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 57 || 	Pin K 10 an i.MX21 || UART1_RDX&lt;br /&gt;
|-		&lt;br /&gt;
| 58 || 	Pin U 17 an i.MX21 || BOOT2&lt;br /&gt;
|-		&lt;br /&gt;
| 59 || 	Pin T 16 an i.MX21 || BOOT1&lt;br /&gt;
|-		&lt;br /&gt;
| 60 || 	geht an Widerstand auf der Rückseite || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 61 || 	Pin V 16 an i.MX21 || BOOT0&lt;br /&gt;
|-		&lt;br /&gt;
| 62 || 	LED Tastatur || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 63 || 	LED Tastatur || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 64 || 	Pin 25 an TLV320 || MLCK&lt;br /&gt;
|-		&lt;br /&gt;
| 65 || 	Pin4 an 69W2440D || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 66 || 	VDD von TLV320 || VDD&lt;br /&gt;
|-		&lt;br /&gt;
| 67 || 	geht an Widerstand auf der Rückseite ||  ?&lt;br /&gt;
|-		&lt;br /&gt;
| 68 || 	geht an Widerstand auf der Rückseite || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 69 || 	Pin 65 an MRRBG3 || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 70 || 	GND || GND&lt;br /&gt;
|-		&lt;br /&gt;
| 71 || 	LED Tastatur || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 72 || 	LED Tastatur || ?&lt;br /&gt;
|-		&lt;br /&gt;
| 73 || 	Akku positiv || Plus Akku&lt;br /&gt;
|-		&lt;br /&gt;
| 74 || 	Ladekontakt positiv || Ladekontakt positiv&lt;br /&gt;
|-		&lt;br /&gt;
| 75 || 	Akku positiv || Plus Akku&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== UART ==&lt;br /&gt;
TIN muss auf low gezogen werden, um die Schnittstelle zu aktivieren.&lt;br /&gt;
Jedoch startet dann das Telefon nicht vollständig (Fix siehe [[#Betrieb mit aktivierter serieller Schnittstelle]], zum rooten langt es jedoch, siehe [[#per serieller Schnittstelle]])&lt;br /&gt;
&lt;br /&gt;
* Spannungs-Pegel: 3.3V&lt;br /&gt;
* Baudrate: 115200 bps&lt;br /&gt;
* Stopbits: 1&lt;br /&gt;
* Flussteuerung: keine&lt;br /&gt;
=== VP5500 ===&lt;br /&gt;
[[Bild:VP5500_seriell_highlight.svg|100px|UART-Pins VP5500(Frontseite der Platine)]]&lt;br /&gt;
&lt;br /&gt;
Die serielle Schnittstelle ist unten vom Akkufach aus zugänglich.&lt;br /&gt;
Obiges Bild kennzeichnet die für die serielle Kommunikation benötigten Pins.&lt;br /&gt;
&lt;br /&gt;
=== VP6500 ===&lt;br /&gt;
[[Bild:VP5600-Serialport-Preliminary.jpg|100px|UART-Pins VP6500]]&lt;br /&gt;
&lt;br /&gt;
Die serielle Schnittstelle ist unten vom Akkufach aus zugänglich.&lt;br /&gt;
Obiges Bild kennzeichnet die für die serielle Kommunikation benötigten Pins.&amp;lt;br&amp;gt;&lt;br /&gt;
VCC liefert anscheinend die ungeregelte Akkuspannung, Boot-Pins nicht verifiziert.&lt;br /&gt;
&lt;br /&gt;
== JTAG ==&lt;br /&gt;
[[Bild:jtag.jpg Belegung der JTAG-Pins (Rückseite der Platine)]]&lt;br /&gt;
&lt;br /&gt;
== Hardware Modifikationen ==&lt;br /&gt;
&lt;br /&gt;
Nachdem wir ja bereits wissen wie das [[#Zerlegen_des_Telefons]] geht, steht der Nachrüstung von Bauelementen und Schnittstellen generell nichts mehr im Wege.&lt;br /&gt;
&lt;br /&gt;
=== Buchse für UART ins VP5500 einbauen ===&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:10_Pins.JPG|1. unbearbeitete Pinreihe&lt;br /&gt;
Datei:11_Pins_bearbeitet.JPG|2. präperierte Pinreihe&lt;br /&gt;
Datei:09_Pads.JPG|3. präperierte Pads&lt;br /&gt;
Datei:12_Pins_ausrichten.JPG|4. Pinreiheausrichten&lt;br /&gt;
Datei:13_Pins_angelötet_1.JPG|5. angelötete Pinreihe&lt;br /&gt;
Datei:14_Pins_angelötet_2.JPG|6. angelötete Pinreihen&lt;br /&gt;
Datei:08_Mittelteil.JPG|7. Mittelteil mit ausgefeiltem Loch&lt;br /&gt;
Datei:15_Mittelteil_zusammengebaut.JPG|8. wieder zusammengesteckt&lt;br /&gt;
Datei:16_in_Aktion.JPG|9.verbundene serielle Schnittstelle&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zunächst muss das Telefon zerlegt werden ([[#Zerlegen des Telefons]])&lt;br /&gt;
Um das Gehäuse nicht zu beeinträchtigen, habe ich mich dazu entschieden, alles so zu lassen wie es ist und nur kleine Buchsen einzubauen. &lt;br /&gt;
&lt;br /&gt;
# Hierfür habe ich einreihige gedrehte IC-Sockel genutzt &lt;br /&gt;
# deren Beine abgezwickt, und etwas Lötzinn aufgetragen (mit der langen Reihe kann man die kurzen, schmalen Teile super handhaben)&lt;br /&gt;
# ebendso auf die Pads ein wenig eingezinnt&lt;br /&gt;
# ausrichten und festlöten&lt;br /&gt;
# eine Reihe&lt;br /&gt;
# die zweite Reihe&lt;br /&gt;
# bei der Gehäuseöffnung über den Pins habe ich mit einer feinen Schlüsselfeile den Rand wenig aufgeweitet. An der Gummimatte hab ich nix geändert.&lt;br /&gt;
# fertig&lt;br /&gt;
# und im Einsatz&lt;br /&gt;
&lt;br /&gt;
=== Anschluss für UART des VP6500 zugänglich machen ===&lt;br /&gt;
Vorteil beim VP6500: es muss dazu nicht zerlegt werden, da sich die Kupferpads unter den Akkus im Akkufach verstecken. Dies ermöglicht eine lötfreie Variante des seriellen Anschlusses. Die Pinbelegung ist unter [[#VP6500_2|UART]] beschrieben.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:01_Kuli-Molex.jpg|1. Benötigte Teile: Stück Plastik + Molex Stecker&lt;br /&gt;
Datei:02_gefeiltes_Plastik_18_mm.jpg|2. Länge der Aussparung im Batteriefach: 18 mm&lt;br /&gt;
Datei:03_gefeiltes_Plastik_4_mm.jpg|3. Breite der Aussparung im Batteriefach: 4 mm&lt;br /&gt;
Datei:04_gefeiltes_Plastik_passt.jpg|4. Solange feilen bis es passt&lt;br /&gt;
Datei:05_gefeiltes_Plastik_Kerben.jpg|5. Padabstand markiert&lt;br /&gt;
Datei:06_gekerbtes_Plastik_Molex.jpg|6. So bekommt man die Federn aus den Steckern&lt;br /&gt;
Datei:07_Federelement_roh.jpg|7. Frisch aus dem Stecker&lt;br /&gt;
Datei:08_Federelement_offen.jpg|8. Aufgebogen&lt;br /&gt;
Datei:10_Federelement_unter_Plastik.jpg|9. In Plastikführung&lt;br /&gt;
Datei:09_Federelement_umgebogen.jpg|10. Umgebogen&lt;br /&gt;
Datei:11_halbfertig_passt.jpg|11. Kerbung angepasst?&lt;br /&gt;
Datei:12_ganz_fertig1.jpg|12. Mit Heißkleber sichern&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
*1. Da wir 4 Pole anschließen wollen, benötigen wir 4 federnde Teile aus &amp;quot;Molex&amp;quot;-Steckern, wie man sie aus CPU-Lüftern kennt. (Entweder hat man einen 4-poligen für die modernen PWM geregeltn zur Hand den man ausschlachten kann, oder man nimmt zwei dreipolige alte auseinander.)&lt;br /&gt;
*2./3. Ferner braucht man ein Stück Plastik mit den Maßen 4 mm mal 18 mm, welches als Träger für die Federkontakte dienen soll. Die Höhe ist nicht so entscheidend. Man kann z.B. den Clip eines Kugelschreibes passend zuschneiden und feilen.&lt;br /&gt;
*4. Plastikträger so weit zufeilen, dass er in die Aussparung passt (Tip: Bindfaden darum knoten um ihn wieder entfernen zu können)&lt;br /&gt;
*5. Abstände zwischen den Kontakten die kontaktiert werden müssen (TIN, GND, RX, TX : siehe [[#UART|UART]]) markieren und in die Unterseite des Trägers Führungskerben für die Federn sägen. Ebenso braucht man kleine Aussparungen um die Metallzungen von der Platine in das Batteriefach zu führen. &lt;br /&gt;
*6./7. Aus den Molex-Steckern bekommt man die Federn sehr einfach raus, indem man mit einem kleinen flachen Schraubenzieher vorsichtig in die Aussparungen sticht und hinten am Kabel zieht.&lt;br /&gt;
*8. Die einzelnen Metallzungen nun noch auf 90° aufbiegen.&lt;br /&gt;
*9. In die Führungskerbe einschieben.&lt;br /&gt;
*10. Metallzunge umbiegen. (Zange)&lt;br /&gt;
*11. Sind alle Kerbungen und Aussparungen richtig abgemessen und gut zugefeilt, dann passt alles in die Lücke im Batteriefach, ohne dass sich die verschiedenen Metallteile berühren.&lt;br /&gt;
*12. Mit etwas Schrumpfschlauch und Heißkleiber kann man dem Verrutschen der Metallzungen vorbeugen und die Kurzschlußwahrscheinlichkeit senken. Ferner dient der Heißkleber als Kraftüberträger, damit die Batterien die leicht federnden Metallzungen fest auf die Kontakte auf der Platine drücken können.&lt;br /&gt;
*13. Batterien einsetzen. Ohne diese wird das ganze irgendwann doch wieder rausfallen und die Verbindung von Anfang an unzuverlässig sein.&lt;br /&gt;
&lt;br /&gt;
Problembehandlung:&lt;br /&gt;
* Kein Kontakt: (Man kann z.B. die Masse auf Durchgang prüfen.)&lt;br /&gt;
** Träger nicht tief genug in die Lücke gedrückt: Mit schmalem Schraubenzieher nachdrücken. Meistens auf der Seite notwendig wo die Metallzungen nach oben kommen.&lt;br /&gt;
** Träger wird nach aussen gedrückt (Metallzungen federn ja): Mehr Heißkleber um mehr Druck durch die Batterien zu bekommen.&lt;br /&gt;
** Träger tief drin, aber trotzdem keine oder unzuverlässige Verbindung: Die Metallzungen auf der Unterseite haben verschiedene &amp;quot;Dicken&amp;quot;, oder die Kerben sind unterschiedlich tief. Ein Tropfen Lötzinn auf die zu niedrigen Metallzungen erledigt dies. (Anmerkung: Der Autor musste überall ein wenig Lötzinn auftragen um die notwendige Dicke und sichere Verbindung zu erreichen.)&lt;br /&gt;
&lt;br /&gt;
= Nutzung für Voice over IP (VoIP, SIP) =&lt;br /&gt;
&lt;br /&gt;
== weiterführende Links ==&lt;br /&gt;
&lt;br /&gt;
*http://de.wikipedia.org/wiki/IP-Telefonie&lt;br /&gt;
*http://de.wikipedia.org/wiki/Session_Initiation_Protocol&lt;br /&gt;
*http://de.wikipedia.org/wiki/H.323&lt;br /&gt;
*http://de.wikipedia.org/wiki/Softphone&lt;br /&gt;
&lt;br /&gt;
Benutzer ist 103&lt;br /&gt;
&lt;br /&gt;
Mit [http://ekiga.org Ekiga] konnte so per 103@xxx.xxx.xxx.xxx bei ersten Tests eine Sprachverbindung zum Telefon aufgebaut werden.&lt;br /&gt;
&lt;br /&gt;
== SIP Einstellungen ==&lt;br /&gt;
&lt;br /&gt;
Die SIP Einstellungen können alternativ auch direkt in der Datei&lt;br /&gt;
 /user_data/data/hpr0userparam.cfg&lt;br /&gt;
vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
=== Einstellung für 1und1 ===&lt;br /&gt;
&lt;br /&gt;
* SIP1:&lt;br /&gt;
** Display Name: ...&lt;br /&gt;
** Username: 49#VORWAHLOHNE0#NUMMER#&lt;br /&gt;
** Telephone Number: 0#VORWAHLOHNE0#NUMMER#&lt;br /&gt;
* Auth:&lt;br /&gt;
** Auth Username: 49#VORWAHLOHNE0#NUMMER#&lt;br /&gt;
** Password: *********&lt;br /&gt;
* Server:&lt;br /&gt;
** sip.1und1.de:5060&lt;br /&gt;
* Proxy:&lt;br /&gt;
** sip.1und1.de:5060&lt;br /&gt;
* RTP:&lt;br /&gt;
** 30000 und 30019&lt;br /&gt;
* STUN:&lt;br /&gt;
** stun.1und1.de&lt;br /&gt;
* STUN Server Port:&lt;br /&gt;
** 3478&lt;br /&gt;
* SIP2:&lt;br /&gt;
** UDP: 5060&lt;br /&gt;
** TCP: 5060&lt;br /&gt;
&lt;br /&gt;
=== Einstellung für Vodafone NGN (Arcor NGN) ===&lt;br /&gt;
&lt;br /&gt;
* SIP1:&lt;br /&gt;
** Display Name: ...&lt;br /&gt;
** Username: VORWAHLUNDRUFNUMMER&lt;br /&gt;
** Telephone Number: (leer lassen)&lt;br /&gt;
* Auth:&lt;br /&gt;
** Auth Username: VORWAHLUNDRUFNUMMER&lt;br /&gt;
** Password: *********&lt;br /&gt;
* Server:&lt;br /&gt;
** arcor.de:5060&lt;br /&gt;
* Proxy:&lt;br /&gt;
** VORWAHL.sip.arcor.de:5060&lt;br /&gt;
* RTP:&lt;br /&gt;
** 10000 und 10001&lt;br /&gt;
* STUN:&lt;br /&gt;
** (X) use rport&lt;br /&gt;
* SIP2:&lt;br /&gt;
** UDP: 5060&lt;br /&gt;
** TCP: 5060&lt;br /&gt;
(getestet von Micha mit EasyBox 802; an EasyBox n-WLAN ausschalten)&lt;br /&gt;
&lt;br /&gt;
=== Einstellung für Sipgate ===&lt;br /&gt;
&lt;br /&gt;
*SIP1&lt;br /&gt;
**Display Name: Sipgate Username&lt;br /&gt;
**User Name: your SIPgate-ID&lt;br /&gt;
**Telephone Number:  Sipgate-Telefonnummer&lt;br /&gt;
*Auth&lt;br /&gt;
**Authentification UserName: your SIPgate-ID&lt;br /&gt;
**Password: Sipgate Passwort&lt;br /&gt;
*Server&lt;br /&gt;
**SIP register address:port: sipgate.de:5060&lt;br /&gt;
*Proxy&lt;br /&gt;
**SIP proxy1 address:port: sipgate.de:5060&lt;br /&gt;
*RTP Audio Channel&lt;br /&gt;
**RTP: 22800&lt;br /&gt;
**RTCP: 22801&lt;br /&gt;
*RTP Video Channel&lt;br /&gt;
**RTP: 22804&lt;br /&gt;
**RTCP: 22805&lt;br /&gt;
*STUN: [X] use rport&lt;br /&gt;
*SIP2&lt;br /&gt;
**SIP Port Listen&lt;br /&gt;
**for UDP: 5062&lt;br /&gt;
**for TCP: 5062&lt;br /&gt;
**for TCP TLS: 5053&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SIP Outbound muss leer sein.&lt;br /&gt;
&lt;br /&gt;
=== Alternative Einstellung für Sipgate ===&lt;br /&gt;
&lt;br /&gt;
Hinter meiner Freetzbox hat die obige Einstellung nix gebracht - incoming calls wurden nicht signalisiert. Folgendes tut dagegen:&lt;br /&gt;
&lt;br /&gt;
*SIP1&lt;br /&gt;
**Display Name: Sipgate Username&lt;br /&gt;
**User Name: your SIPgate-ID&lt;br /&gt;
**Telephone Number:  Sipgate-Telefonnummer&lt;br /&gt;
*Auth&lt;br /&gt;
**Authentification UserName: your SIPgate-ID&lt;br /&gt;
**Password: Sipgate Passwort&lt;br /&gt;
*Server&lt;br /&gt;
**SIP register address:port: sipgate.de:5060&lt;br /&gt;
*Proxy&lt;br /&gt;
** leer&lt;br /&gt;
*SIP2&lt;br /&gt;
**Symmetric Mode [X]&lt;br /&gt;
**SIP Port Listen&lt;br /&gt;
**for UDP: 5062&lt;br /&gt;
**for TCP: 5062&lt;br /&gt;
**for TCP TLS: 5053&lt;br /&gt;
*STUN: [x] use rport&lt;br /&gt;
&lt;br /&gt;
SIP Outbound muss leer sein.&lt;br /&gt;
&lt;br /&gt;
Ein Videotelefonat von Sipgate zu Sipgate zwischen zwei VP6500 wurde erfolgreich getestet. Gegebenenfalls muss die eigene Videoübertragung noch durch Drücken der Taste &#039;&#039;&#039;Video&#039;&#039;&#039; gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Bei mir hat es nur per UDP funktioniert, aber mit starken Delays (&amp;gt;1s)&lt;br /&gt;
&lt;br /&gt;
=== Einstellung für Ekiga.net ===&lt;br /&gt;
&lt;br /&gt;
*SIP1&lt;br /&gt;
**Display Name: Irgendwas&lt;br /&gt;
**User Name: username&lt;br /&gt;
**Telephone Number: leer&lt;br /&gt;
*Auth&lt;br /&gt;
**Authentication User Name: username&lt;br /&gt;
**Password: password&lt;br /&gt;
*Server&lt;br /&gt;
**SIP register: ekiga.net:5060&lt;br /&gt;
**Protocol: ( ) TCP (*) UDP&lt;br /&gt;
**Expire Timer: 3600&lt;br /&gt;
**Keep Alive: 0&lt;br /&gt;
*Proxy&lt;br /&gt;
**alle leer&lt;br /&gt;
*STUN&lt;br /&gt;
**( ) use rport&lt;br /&gt;
**STUN Server IP address: stun.ekiga.net&lt;br /&gt;
**STUN Server port: 3478&lt;br /&gt;
*SIP2&lt;br /&gt;
**(*) Symmetric Mode&lt;br /&gt;
**UDP: 5060&lt;br /&gt;
**TCP: 5060&lt;br /&gt;
**TCP TLS: 5061&lt;br /&gt;
*OBproxy&lt;br /&gt;
**alle leer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nach der (kostenlosen) Registrierung bei ekiga.net und der Anmeldung des Telefons kann man unter der 500 einen Audio und Video(!) Test machen.&amp;lt;br&amp;gt;&lt;br /&gt;
Weitere features: https://www.ekiga.net/index.php?page=services&amp;lt;br&amp;gt;&lt;br /&gt;
Ekiga teilt keine Festnetz Rufnummern zu, daher ist ein Anruf von/zu Festnetz Telefonen nicht möglich.&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;Bei Ekiga.net angemeldete Geräte können aber problemlos untereinander telefonieren, sogar mit Video. Da man vom Mainscreen des VP5500/6500 aus direkt nur numerische Kontakte (herkömmliche Telefonnumern) wählen kann, Ekiga.net Telefonnummern aber aus [Benutzername]@ekiga.net bestehen, legt man über das Menü des VP5500/6500 einfach &amp;lt;b&amp;gt;einen neuen Kontakt&amp;lt;/b&amp;gt; (Telefonbuch) an. Als Video-Rufnummer trägt man einfach [Benutzername]@ekiga.net ein, wobei [Benutzername] der Name des Ekiga-Accounts ist, den man erreichen will. Zwischen der Eingabe von Buchstaben, Zahlen und Sonderzeichen kann man dabei mit der &amp;lt;b&amp;gt;[#]&amp;lt;/b&amp;gt;-Taste des VP5500/6500 umschalten.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Sollte bei einem Telefonat über Ekiga Video einmal nicht funktionieren, hilft eventuell die manuelle Aktivierung der Videofunktion mittels der &amp;lt;b&amp;gt;Video-Taste&amp;lt;/b&amp;gt; auf der Tastatur des VP6500&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einstellung für Fritzbox 7170/7270 und andere mit SIP-Registrar ===&lt;br /&gt;
Die Anmeldung eines Telefons auf der Fritzbox starten (System/Ansicht/&amp;quot;Expertenansicht aktivieren&amp;quot;, dann Telefonie/Telefoniegeräte/&amp;quot;Neues Gerät einrichten&amp;quot;, &amp;quot;Telefon&amp;quot;, &amp;quot;Bitte auswählen&amp;quot;/&amp;quot;LAN/WLAN (IP-Telefon)&amp;quot;) und sich eine Nummer geben lassen,&amp;lt;br&amp;gt; dann in Registration auf dem VPx500 wechseln und die Einstellungen wie unten vornehmen.&amp;lt;br&amp;gt; Anschließend will das Telefon diese Einstellungen aktivieren, vorher noch auf der FB die Anmeldung starten.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Im Beispiel will die FB die Nummer 621 vergeben:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Reiter SIP1&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Display Name: egal &amp;lt;leer lassen&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
User Name: 621&amp;lt;br&amp;gt;&lt;br /&gt;
Telephone Number: 621&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Reiter Auth&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Authentication UserName: 621&amp;lt;br&amp;gt;&lt;br /&gt;
Password: [hier das gleiche, wie auf der FB eingeben]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Reiter Server&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
SIP register address:port&amp;lt;br&amp;gt;&lt;br /&gt;
192.168.2.1:5060 (IP Bitte auf Euer Netz anpassen) oder alternativ: fritz.box:5060&amp;lt;br&amp;gt;&lt;br /&gt;
Protocol: UDP&amp;lt;br&amp;gt;&lt;br /&gt;
ExpireTime: 3600&amp;lt;br&amp;gt;&lt;br /&gt;
Keep Alive: 300&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Reiter SIP2&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
[ ] Symmetric Mode&amp;lt;br&amp;gt;&lt;br /&gt;
SIP Port Listen&amp;lt;br&amp;gt;&lt;br /&gt;
for UDP: 5060&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Anmerkungen dazu:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Protokoll: UDP&amp;lt;br&amp;gt;&lt;br /&gt;
Bei TCP hat das VP6500 nach Minuten oder Stunden immer wieder die Verbindung zur FB verloren.&amp;lt;br&amp;gt; &lt;br /&gt;
Keep Alive: 300&amp;lt;br&amp;gt;&lt;br /&gt;
Die Keep Alive Time habe ich eingestellt, weil ich die TCP Probleme umgehen &amp;lt;br&amp;gt;wollte. Ich denke nicht, dass es zu Problemen bzgl. Akku kommt. Da es so &amp;lt;br&amp;gt;aber perfekt funktioniert, habe ich es gelassen. Das UDP Protokoll kommt zudem mit weniger Netzwerk-Traffic aus.&amp;lt;br&amp;gt;&lt;br /&gt;
Anmeldung:&amp;lt;br&amp;gt;&lt;br /&gt;
Die Anmeldung wurde von der Fritz!Box nicht immer erfolgreich bestätigt. Einfach Weiter klicken und die restlichen Einstellungen vornehmen.&amp;lt;br&amp;gt; Spätestens nach einem Reboot des VPx500 funktioniert alles einwandfrei.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls eure Fritz!Box keine Möglichkeit bietet, ein IP-Telefon anzumelden, empfehle ich euch mal in das http://wiki.ip-phone-forum.de/skript:speedport2fritz einzulesen.&amp;lt;br&amp;gt;&lt;br /&gt;
Bzw. mal im IP-Phone-Forum nach SIP-Registrar suchen.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der SIP Listen Port 5060 hat mich viel Zeit gekostet - stand noch von sipgate direkt auf 5062 und das VP5500 hat sich dann zwar an der fritzbox registriert aber keine eingehenden Anrufe empfangen...&lt;br /&gt;
&lt;br /&gt;
=== Fritz!Box Hinweis ===&lt;br /&gt;
Hinter meiner Fritz!Box konnte ich auf dem Port 5060 keine Incoming Calls bekommen, da die Box auf diesen Port für ihre eigenes System hört.&lt;br /&gt;
Geholfen hat mit dann ein Wechsel auf Port 5061 im Reiter SIP2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Eigener VoIP Server mit Asterisk ==&lt;br /&gt;
&lt;br /&gt;
*http://www.das-asterisk-buch.de&lt;br /&gt;
&lt;br /&gt;
===Asterisk auf einer Fritz!Box===&lt;br /&gt;
&lt;br /&gt;
*http://www.asterisk-kompakt.de/artikel/45-asterisk-auf-fritzbox-phone.html&lt;br /&gt;
&lt;br /&gt;
== Videogespräche zu anderen Clients / Softphones ==&lt;br /&gt;
=== Ekiga Softphone ===&lt;br /&gt;
&lt;br /&gt;
Damit Videos klappen, müssen Ekiga und VP6500 über mindestens einen übereinstimmenden Videocodec verfügen, klar. Im Falle des VP6500 ist es wohl so, daß ausschließlich H.263 in verschiedenen Ausprägungen zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
Ekiga kommt jedoch zunächst unter Ubuntu 9.10 nur mit H.261 und Theora Codec. Wir müssen daher den H.263-Codec in Ekiga zusätzlich einhängen.&lt;br /&gt;
&lt;br /&gt;
Leider ist der H.263-Codec nicht ganz frei zugänglich, sodaß wir eine Fremdquelle benötigen, um den Codec mit dem Paketmanager installieren zu können. Daher muß Bojos Ekiga-Plugin-PPA wie in&lt;br /&gt;
&lt;br /&gt;
https://launchpad.net/~bojo42/+archive/ekiga&lt;br /&gt;
&lt;br /&gt;
beschrieben als Paketquelle hinzugefügt werden. Den zugehörigen Schlüssel nicht vergessen!&lt;br /&gt;
Wenn die neue Quelle bekannt gemacht ist, können im Paketmanager nun die&lt;br /&gt;
&lt;br /&gt;
; Pakete&lt;br /&gt;
: libopal3.6.1-plugins-h263-1998&lt;br /&gt;
: libopal3.6.1-plugins-ilbc&lt;br /&gt;
: libavcodec-dev&lt;br /&gt;
&lt;br /&gt;
installiert werden. Darauf achten, daß alle Abhängigkeiten sauber erfüllt sind.&lt;br /&gt;
Das H.263-Plugin läßt sich nur installieren, wenn libstdc++6 &amp;gt;= 4.4.0 vorhanden ist, was meines Wissens erst ab Ubuntu 9.10 der Fall ist.&lt;br /&gt;
Nach der Installation dieser Komponenten kann Ekiga neu gestartet werden. Es sollte nun unter Bearbeiten-&amp;gt;Einstellungen-&amp;gt;Video-&amp;gt;Codecs zusätzlich den H.263-Codec anbieten. Durch Verschieben nach oben kann man diesen beim Handshake priorisieren.&lt;br /&gt;
Nach Integration des H.263-Codecs in Ekiga konnte ich mit zwei Sipgate-Accounts störungsfrei, sogar über den gleichen DSL-Anschluß, videofonieren.&lt;br /&gt;
&lt;br /&gt;
== DEMO MODE ==&lt;br /&gt;
&lt;br /&gt;
Um den DEMO MODE zwischen einem VP55 und VP65 herzustellen muss man die Dateien&lt;br /&gt;
mit den Einstellungen vom VP55 auf das VP65 übertragen. Diese liegen in&lt;br /&gt;
/usr/local/data/demo/ und es sind vier Dateien. Danach ist die SSID und der KEY&lt;br /&gt;
bei beiden gleich eingerichtet und die beiden Geräte verbinden sich miteinander.&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
== Vorsicht Fallen! ==&lt;br /&gt;
Es ist nicht schwer, sich den Zugang zum Telefon abzuschneiden, wenn man nicht aufpasst.&lt;br /&gt;
&lt;br /&gt;
== Betrieb mit aktivierter serieller Schnittstelle ==&lt;br /&gt;
&lt;br /&gt;
Das 5500 und das 6500 scheint nicht komplett zu starten wenn man TIN auf low hat&lt;br /&gt;
und die serielle Schnittstelle benutzt. Man kann das Gerät dann nicht normal bedienen. Dies lässt sich ändern indem man in der Datei&lt;br /&gt;
&lt;br /&gt;
 /usr/local/startup/daemon.sh&lt;br /&gt;
&lt;br /&gt;
ziemlich am Anfang das TINDETECT=&amp;quot;TRUE&amp;quot; ändert auf TINDETECT=&amp;quot;FALSE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Danach startet er auch mit aktiver serieller Verbindung komplett durch&lt;br /&gt;
und das Gerät ist ganz normal bedienbar.&lt;br /&gt;
&lt;br /&gt;
== Grundlagen ==&lt;br /&gt;
Bestimmte Aktionen werden immer wieder benötigt.&lt;br /&gt;
Diese sollen hier kurz beschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Es werden dennoch grundlegende Kenntnisse von Kommandozeilen vorausgesetzt.&lt;br /&gt;
&lt;br /&gt;
==== Dateien bearbeiten mit vi ====&lt;br /&gt;
Auf dem Telefon ist der minimalistische Editor vi installiert mit dem Dateien über Telnet bearbeitet werden können.&lt;br /&gt;
Für eine genaue Bedienung bitte Google benutzen.&lt;br /&gt;
Die wichtigsten Bedienelemente werden hier kurz erläutert.&lt;br /&gt;
&lt;br /&gt;
Datei Öffnen mit &#039;vi Dateipfad&#039;&lt;br /&gt;
vi kennt zwei Modi: Kommando- und Einfüge-Modus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;i&#039;&#039;&#039; - wechselt in den Einfüge-Modus, in dem geschrieben werden kann&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;a&#039;&#039;&#039; - anhängen (hinter dem aktuellem Zeichen in den Einfüge-Modus)&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;[Esc]&#039;&#039;&#039; wechselt zurück in den Kommandomodus. &lt;br /&gt;
In diesem kann mittels Pfeil- und Bildlauftasten navigiert werden.&lt;br /&gt;
:x - löscht das Zeichen an Cursor position&lt;br /&gt;
:d&#039;&#039;n&#039;&#039;d - löscht &#039;&#039;n&#039;&#039; Zeile(n) in den Zeilenbuffer (ohne &#039;&#039;n&#039;&#039; = eine Zeile)&lt;br /&gt;
:y&#039;&#039;n&#039;&#039;y - kopiert &#039;&#039;n&#039;&#039; Zeile(n) in den Zeilenbuffer (ohne &#039;&#039;n&#039;&#039; = eine Zeile)&lt;br /&gt;
:p - fügt Inhalt des Zeilenbuffer &#039;&#039;&#039;unter&#039;&#039;&#039; der aktuellen Zeile ein&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;q! - schließt ohne zu speichern&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;w - speichert&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;wq - speichert und beenden&lt;br /&gt;
&lt;br /&gt;
==== Dateien auf das Telefon laden ====&lt;br /&gt;
Um Daten von einem http-Server zu laden, benutzt man &lt;br /&gt;
 wget url&lt;br /&gt;
Die Datei wird dann in das aktuelle Verzeichnis geladen, weswegen vorher in das Zielverzeichnis wechseln.&lt;br /&gt;
&lt;br /&gt;
Um Daten von einem ftp-Server zu laden, benutzt man ftp.&lt;br /&gt;
Auch hier muss vorher in das zielverzeichnis gewechselt werden.&lt;br /&gt;
 ftp hostname&lt;br /&gt;
dann gegebenenfalls die Zugangsdaten eingeben und mittels &#039;cd&#039; und &#039;ls&#039; in das Entsprechende Verzeichnis auf dem FTP-Server wechseln&lt;br /&gt;
und anschließend mittels &lt;br /&gt;
 get dateiname&lt;br /&gt;
die Datei herunterladen.&lt;br /&gt;
 &lt;br /&gt;
==== Dateien vom Telefon herunterladen ====&lt;br /&gt;
Auch hier bietet sich ein FTP an.&lt;br /&gt;
Mittels &#039;ftp hostname&#039; verbinden, Benutzerdaten eingeben, in das entsprechende FTP-Server-Verzeischnis wechseln und mittels&lt;br /&gt;
 put localeDatei&lt;br /&gt;
eine Lokale Datei hochladen.&lt;br /&gt;
&lt;br /&gt;
==== Alternative: Dropbear ====&lt;br /&gt;
&lt;br /&gt;
Wurde der dropbear-ssh server installiert [[#Dropbear (SSH-Server) installieren]] können mittels eines Programms mit SCP-Unterstützung (zB. [http://winscp.net/eng/docs/lang:de WinSCP] für Windows) sehr komfortabel Dateien ausgetauscht werden.&lt;br /&gt;
&lt;br /&gt;
Mit WinSCP können auch Dateien direkt bearbeitet werden.&lt;br /&gt;
Der Client lädt die Datei herunter, öffnet einen Editor und lädt die Datei wieder herauf, wenn diese geändert wurde.&lt;br /&gt;
&lt;br /&gt;
== Grundkonfiguration, die das Leben erleichtert ==&lt;br /&gt;
=== .bashrc ===&lt;br /&gt;
Die installierte Shell ist die bash. Einstellungen bezieht sie aus der (versteckten) Datei &amp;quot;.bashrc&amp;quot;. Hier kann man sinnvolle Ergänzungen vornehmen, damit sich das Telefon ein bißchen mehr wie ein gewohntes Linux-System verhält:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
alias vim=vi&lt;br /&gt;
PS1=&amp;quot;[\u@\h] \w $ &amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Backup ==&lt;br /&gt;
=== Backup des Flash ===&lt;br /&gt;
If you want to make a backup of your root partition, you can do as&lt;br /&gt;
follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
echo &#039;#!/bin/sh&#039; &amp;gt; /tmp/backup.sh&lt;br /&gt;
echo &#039;cat /dev/mtdb2 2&amp;gt;/dev/null&#039; &amp;gt;&amp;gt; /tmp/backup.sh&lt;br /&gt;
chmod 700 /tmp/backup.sh&lt;br /&gt;
micro_inetd 31337 /tmp/backup.sh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This&#039;ll make your device listen for incoming connections on port 31337.&lt;br /&gt;
On your host system you may then simply run &lt;br /&gt;
 nc ip.of.your.phone 31337 &amp;gt; fon_rootfs&lt;br /&gt;
et voilà, you got your rootfs packed into a file.&lt;br /&gt;
&lt;br /&gt;
Note that the backed up file is not ext2, but a jffs2 formatted&lt;br /&gt;
filesystem. These can&#039;t be handled by a simple &amp;quot;mount -o loop&amp;quot; as you&#039;d&lt;br /&gt;
have thought... so here&#039;s how you mount it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
modprobe jffs2&lt;br /&gt;
modprobe mtdram total_size=65536 erase_size=128&lt;br /&gt;
modprobe mtdblock&lt;br /&gt;
mkdir /tmp/phone-root&lt;br /&gt;
mknod /tmp/phone-mtdb2 b 31 0&lt;br /&gt;
dd if=/your/backup/file of=/tmp/phone-mtdb2&lt;br /&gt;
mount -t jffs2 /tmp/phone-mtdb2 /tmp/phone-root&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[#Dateisystem herunterladen]] describes another way to dump the filesystem for closer examination.&lt;br /&gt;
&lt;br /&gt;
=== Komplettes Backup ===&lt;br /&gt;
Die Datei http://www.mikrocontroller.net/attachment/73323/S91backup_pipe auf das Gerät laden und als ausführbar markieren.&lt;br /&gt;
&lt;br /&gt;
 cd /etc/rc.d/init.d&lt;br /&gt;
 wget http://www.mikrocontroller.net/attachment/73323/S91backup_pipe&lt;br /&gt;
 chmod +x /etc/rc.d/init.d/S91backup_pipe&lt;br /&gt;
&lt;br /&gt;
Damit wird eine Art Backup-Server mit dem Boot gestartet.&lt;br /&gt;
wenn man dies nicht möchte kann man das Skript natürlich auch an jeden beliebigen anderen Ort legen und per Hand starten.&lt;br /&gt;
&lt;br /&gt;
Nun kann man von einem Rechner aus mittels nc (netcat) die Bereiche sichern:&lt;br /&gt;
&lt;br /&gt;
 nc 192.168.1.3 31337 &amp;gt; fon_rootfs&lt;br /&gt;
 nc 192.168.1.3 31338 &amp;gt; fon_udata&lt;br /&gt;
 nc 192.168.1.3 31339 &amp;gt; fon_usettings&lt;br /&gt;
 nc 192.168.1.3 31340 &amp;gt; fon_bootld&lt;br /&gt;
 nc 192.168.1.3 31341 &amp;gt; fon_kernel&lt;br /&gt;
&lt;br /&gt;
Die 192.168.1.3 natürlich mit der IP des Gerätes austauschen, die fon_*&lt;br /&gt;
Dateinamen könnt ihr natürlich auch frei vergeben.&lt;br /&gt;
&lt;br /&gt;
fon_udata ist die /user_data Partition, fon_usertings dementsprechend&lt;br /&gt;
die /user_settings Partition.&lt;br /&gt;
&lt;br /&gt;
Der bootld Bereich enthält auch die Parameter. Um das später (falls&lt;br /&gt;
überhaupt nötig) mittels blob zu restaurieren müsste die Datei noch in&lt;br /&gt;
zwei Teile aufgeteilt werden. Der erste enthält dann den reinen&lt;br /&gt;
Bootloader-Bereich, der zweite die Parameter. Wer&#039;s wirklich braucht für&lt;br /&gt;
den kann ich noch ne Anleitung zum Aufteilen geben. Wirklich Sinnvoll&lt;br /&gt;
ist das aber nicht, hat man den Bootloader erstmal mit was anderem&lt;br /&gt;
überschrieben kann man ihn ja auch nicht mehr zum Wiederherstellen&lt;br /&gt;
benutzen....&lt;br /&gt;
&lt;br /&gt;
=== Zurückspielen der Backups ===&lt;br /&gt;
&lt;br /&gt;
1) Man braucht ein (die) Backup-Image(s).&lt;br /&gt;
&lt;br /&gt;
2) Serielle Verbindung zum Telefon&lt;br /&gt;
&lt;br /&gt;
3) Akku abstecken, wieder anstecken.&lt;br /&gt;
&lt;br /&gt;
4) Telefon einschalten und im Terminalprogram auf die Tasten kloppen, so&lt;br /&gt;
das man im Bootloader landet. Dabei muss man recht schnell sein. Es&lt;br /&gt;
sollte dann ein Prompt kommen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
blob&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5) Nun gibt man ein &lt;br /&gt;
   xdownload param&lt;br /&gt;
Wobei &#039;param&#039; der Teil ist, den man wiederherstellen will:&lt;br /&gt;
* blob - Bootloader (fon_bootld)&lt;br /&gt;
* param - Parameter Bereich (Bootloader oder Kernel?) (fon_bootld)&lt;br /&gt;
* kernel - Der Kernel (fon_kernel)&lt;br /&gt;
* ramdisk - Das Root-Filesystem / (fon_rootfs)&lt;br /&gt;
* ramdisk2 - Das /user_data Filesystem (fon_udata)&lt;br /&gt;
* ramdisk3 - Das /user_settings Filesystem (fon_usettings)&lt;br /&gt;
&lt;br /&gt;
Beim Backup ist blob + param in einer Datei, müsste man also ggf.&lt;br /&gt;
erstmal aufsplitten.&lt;br /&gt;
&lt;br /&gt;
6) Er wartet dann auf den Upload. Nun startet man im Terminalprogram den&lt;br /&gt;
Upload des Backup-Images, dazu verwendet man das X-Modem Protokoll.&lt;br /&gt;
&lt;br /&gt;
7) Kaffee trinken, auf&#039;s Klo gehen, mit Frau/Freundin/Mutter ein Gespräch&lt;br /&gt;
anfangen.&lt;br /&gt;
&lt;br /&gt;
8) Irgendwann ist der Upload fertig. Dauert halt lange. Man landet&lt;br /&gt;
wieder am &amp;quot;blob&amp;gt;&amp;quot; prompt. Nun gibt man&lt;br /&gt;
 flash param&lt;br /&gt;
ein.&lt;br /&gt;
&lt;br /&gt;
9) Er schreibt nun das, was man hochgeladen hat, in das Flash.&lt;br /&gt;
&lt;br /&gt;
10) &amp;quot;boot&amp;quot; eingeben. Da Telefon bootet nun normal.&lt;br /&gt;
&lt;br /&gt;
Achtung: Wenn im Backup nicht die Änderung gemacht wurde damit das&lt;br /&gt;
Telefon auch bei angeschlossener serieller Schnittstelle startet, kommt&lt;br /&gt;
man nicht weiter als wie bis zur Sanduhr. Dann einfach die serielle&lt;br /&gt;
abstecken (Also den TIN pin wieder freigeben) und das Telefon neustarten&lt;br /&gt;
(Akku kurz ab- und wieder anstöpseln)&lt;br /&gt;
&lt;br /&gt;
=== Dateisystem herunterladen ===&lt;br /&gt;
Zum unkomplizierten Durchsuchen des Dateisystems kann es nützlich sein, dieses vom Gerät zu kopieren.&lt;br /&gt;
&lt;br /&gt;
Folgende Befehle erzeugen wie beim Backup des Flash einen kleinen Server, dessen Output auf anderer Seite mittels mittels nc abgeholt werden kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
echo &#039;#! /bin/sh&#039; &amp;gt; /tmp/backup.sh&lt;br /&gt;
echo &#039;cd /&#039; &amp;gt;&amp;gt; /tmp/backup.sh&lt;br /&gt;
chmod 700 /tmp/backup.sh&lt;br /&gt;
echo &#039;tar cf - bin boot dev etc home lib mnt opt root sbin tmp trace upgrade user_data user_settings usr var 2&amp;gt;/dev/null&#039; &amp;gt;&amp;gt; /tmp/backup.sh&lt;br /&gt;
micro_inetd 31340 /tmp/backup.sh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die lange Liste mit Unterverzeichnissen ist notwendig um /proc zu überspringen, was Probleme mit tar verursachen würde.&lt;br /&gt;
&lt;br /&gt;
Auf einem anderen Linux system (oder cygwin) kann mittels&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  nc telefon-Ip 31340 &amp;gt; file.tar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
die Datei abgerufen werden.&lt;br /&gt;
&lt;br /&gt;
Der Vorgang dauert aber ein ganz paar Minuten.&lt;br /&gt;
&lt;br /&gt;
Heraus kommt ein Tar-Archiv, was alle Dateien des Gerätes enthält - inclusive der temporären Dateien der Ram-Disks.&lt;br /&gt;
&lt;br /&gt;
== Erkunden des Systems mit Bordmitteln ==&lt;br /&gt;
&lt;br /&gt;
=== Ausgabe von &amp;lt;b&amp;gt;&amp;lt;tt&amp;gt;dmesg&amp;lt;/tt&amp;gt;&amp;lt;/b&amp;gt; auf einem VP6500 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
6&amp;gt;NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.&lt;br /&gt;
NetWinder Floating Point Emulator V0.95 (c) 1998-1999 Rebel.com&lt;br /&gt;
VFS: Mounted root (jffs2 filesystem).&lt;br /&gt;
Freeing init memory: 68K&lt;br /&gt;
PCB version: ind3 v2&lt;br /&gt;
Driver SYSTCLK: SYSTCLK-1.12 (REFERENCED)&lt;br /&gt;
Driver GPIO-1.59 (REFERENCED)&lt;br /&gt;
****p_gpio_init_low_bat****&lt;br /&gt;
GPIO: p_gpio_it_init at 762&lt;br /&gt;
Driver FRAMEBUF-1.12 (REFERENCED)&lt;br /&gt;
Driver SPI-1.20 (REFERENCED) Debug level 3&lt;br /&gt;
&lt;br /&gt;
u32_spi1_MinLenghtForDMAInTX set to 300&lt;br /&gt;
&lt;br /&gt;
u32_spi1_MinLenghtForDMAInRX set to 300&lt;br /&gt;
Driver LCD-1.20 (REFERENCED)&lt;br /&gt;
Driver TVLINK-1.45 (REFERENCED)&lt;br /&gt;
Reset from Software Reset.&lt;br /&gt;
Motorola PostProcessor Linux driver ver 0.64 - Copyright (C) 2003 Motorola Inc&lt;br /&gt;
pp: hw ver = 2&lt;br /&gt;
prp_dbg=0&lt;br /&gt;
Motorola PreProcessor Linux driver ver 0.0 - Copyright (C) 2003 Motorola Inc&lt;br /&gt;
hmp4d: base_port=0x10026800 irq=50&lt;br /&gt;
hmp4d: module inserted&lt;br /&gt;
hmp4e: base_port=0x10026c00 irq=49&lt;br /&gt;
hmp4e: Compatble HW found with ID: 0x004c1882&lt;br /&gt;
hmp4e: module inserted. Major = 249&lt;br /&gt;
SPI2:: drv_Init :PID of driver: 134&lt;br /&gt;
SPI2:: drv_Init :ScanList not provided. Will use the default scan list.&lt;br /&gt;
SPI2:: drv_Init :ScanChannelList :1 6 11 14 2 7 12 3 8 13 4 9 5 10&lt;br /&gt;
SPI2:: drv_Init :setting PhyType to: Rf-to-Rf&lt;br /&gt;
SPI2:: drv_Init :Ref.Clock parameter not provided&lt;br /&gt;
SPI2:: drv_Init :Configure target for a reference clock of &#039;default=40&#039; Mhz.&lt;br /&gt;
SPI2:: drvRegEtherDev :Interface Name is: eth%d&lt;br /&gt;
SPI2:: drv_Init :HEOCSIWPOWON: Powering on...&lt;br /&gt;
SPI2:: drvPhase2Init :Protocol Firmware will be loaded by driver ...&lt;br /&gt;
SPI2:: drvPhase2Init :Initializing HHAL (PhgHhalInitialize)...&lt;br /&gt;
Divider : 8&lt;br /&gt;
&lt;br /&gt;
 OCR2 : e4015308 (12582912)&lt;br /&gt;
Reset : 3 / 27 (c497cc00 / e401531c)&lt;br /&gt;
&lt;br /&gt;
Reset : 3 / 27 (c497cc00 / e401531c)&lt;br /&gt;
GPIO: p_gpio_init_gpio_status at 1262&lt;br /&gt;
GPIO: POWER_FAIL signal NOT detected at GPIO driver init carry on !!!&lt;br /&gt;
GPIO: CHARGE_IN at init&lt;br /&gt;
GPIO: LOW_BAT_OUT at init&lt;br /&gt;
GPIO: No accessory plugged at init.  - Set Video on jack&lt;br /&gt;
GPIO: camera to front at init&lt;br /&gt;
**ChargeStatusPmb=========gpio_Read_ChargeStatus_Ready=1&lt;br /&gt;
SPI2:: PhgOsal_linux_init_thread :assigning thread name and deamonize() ..&lt;br /&gt;
SPI2:: drvPhase2Init :Success&lt;br /&gt;
SPI2:: drvPhase2Init : registering callbacks with HHAL..&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVNT_INIT_COMPLETE; setting CARRIER_ON&lt;br /&gt;
SPI2:: drvPhase2Init :calling PhgHhalQueueMgmtReq()!&lt;br /&gt;
PhgHhalQueueMgmtReq:1172:HHAL got Init message&lt;br /&gt;
PhgHhalQueueMgmtReq:1217:HHAL done Init message&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PS wake (0) in Drvmain&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVENT_DISCONNECT; setting CARRIER_OFF&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :netdev-&amp;gt;flags=0x00001002, IFF_UP=0&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :device was already closed&lt;br /&gt;
SPI2:: drvMgmtCfmHndler :Using MAC Address: 00:08:c6:86:8b:99&lt;br /&gt;
SPI2:: drvPhase2Init :init etherdev; stopping queue, setting CARRIER_OFF&lt;br /&gt;
SPI2:: drv_Init :Philips WLAN Drv - loaded - in state: 1&lt;br /&gt;
SPI2:: drvInit :Philips WLAN Drv - loaded&lt;br /&gt;
SPI2:: drvOpen :opening net device&lt;br /&gt;
SPI2:: drvOpen :Device is not associated!&lt;br /&gt;
SPI2:: drvOpen :Carrier flag is already set to CARRIER_OFF&lt;br /&gt;
SPI2:: drvOpen :Disabling again netqueue&lt;br /&gt;
requested reg.domain code setting = 3&lt;br /&gt;
SPI2:: drvIoctl :set u8LinkAdaptation  : 1 Result=[0]&lt;br /&gt;
SPI2:: drvIoctl :changed HEOCSIWLNADPALLOWRATES: 8 allowed rate codes&lt;br /&gt;
SPI2:: drvInitConnect :Req to connect to new WLAN network&lt;br /&gt;
SPI2:: drvInitConnect :Disabling TX queue and setting CARRIER_OFF&lt;br /&gt;
SPI2:: drvInitConnect :Connecting To AP...&lt;br /&gt;
SPI2:: drvInitConnect :step2&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVENT_DISCONNECT; setting CARRIER_OFF&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :netdev-&amp;gt;flags=0x00001003, IFF_UP=1&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :device was already opened; stopping queue&lt;br /&gt;
SPI2:: drvInitConnect :step3 : u8Status 255&lt;br /&gt;
SPI2:: drvInitConnect :step5&lt;br /&gt;
SPI2:: drvInitConnect :TIMEDOUT&lt;br /&gt;
SPI2:: drvInitConnect :step6&lt;br /&gt;
SPI2:: drvInitParamsAndPowerOnAndConnect :Connect failed!&lt;br /&gt;
Motorola CSI Linux driver ver 0.1&lt;br /&gt;
 - Copyright (C) 2004 Motorola Inc&lt;br /&gt;
&lt;br /&gt;
Driver SENSOR-1.29 (REFERENCED)&lt;br /&gt;
i2c-client version : 1.9&lt;br /&gt;
Initialize i2c-client-aic14 module&lt;br /&gt;
Module i2c-client-aic14 initialized&lt;br /&gt;
Insert module aic14 (AIC14-1.0)&lt;br /&gt;
Module AIC14 assumes CODEC MCLK already configured for 20480000Hz&lt;br /&gt;
Driver KPP-1.36 (REFERENCED)&lt;br /&gt;
Driver DOZE-1.27 (REFERENCED)&lt;br /&gt;
SPI2:: drvDoScan :Buero (bittorf)&lt;br /&gt;
SPI2:: drvProcessScanCfm :Scan Confirm: Success 1 APs&lt;br /&gt;
SPI2:: drvInitConnect :Req to connect to new WLAN network&lt;br /&gt;
SPI2:: drvInitConnect :Disabling TX queue and setting CARRIER_OFF&lt;br /&gt;
SPI2:: drvInitConnect :Connecting To AP...&lt;br /&gt;
SPI2:: drvInitConnect :step2&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVNT_INIT_CONNECT; setting CARRIER_ON&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :netdev-&amp;gt;flags=0x00001003, IFF_UP=1&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :device was already opened; enabling queue&lt;br /&gt;
SPI2:: drvInitConnect :step3 : u8Status 8&lt;br /&gt;
SPI2:: drvInitConnect :step4&lt;br /&gt;
SPI2:: drvInitConnect :Successful&lt;br /&gt;
SPI2:: drvInitConnect :step6&lt;br /&gt;
SPI2:: drvIoctl :dot11LongRetryLimitAC0 = 8&lt;br /&gt;
SPI2:: drvIoctl :dot11LongRetryLimitAC1 = 8&lt;br /&gt;
SPI2:: drvIoctl :dot11LongRetryLimitAC2 = 8&lt;br /&gt;
SPI2:: drvIoctl :dot11LongRetryLimitAC3 = 8&lt;br /&gt;
SPI2:: drvIoctl :dot11ShortRetryLimitAC0 = 8&lt;br /&gt;
SPI2:: drvIoctl :dot11ShortRetryLimitAC1 = 8&lt;br /&gt;
SPI2:: drvIoctl :dot11ShortRetryLimitAC2 = 8&lt;br /&gt;
SPI2:: drvIoctl :dot11ShortRetryLimitAC3 = 8&lt;br /&gt;
SPI2:: drvIoctl :PA Request&lt;br /&gt;
SPI2:: drvIoctl :No state change!&lt;br /&gt;
SPI2:: drvIoctl :Fast PS Request&lt;br /&gt;
PhgHhalDoM2SDMA:1661:--&amp;gt;P1&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PS Ind (1) in Drvmain&lt;br /&gt;
SPI2:: drvStop :Driver Stop: disable TX queue! (usage: 2)&lt;br /&gt;
SPI2:: drvIoctl :Deauth BSSID: 00:1d:7e:18:e3:89&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVENT_DISCONNECT; setting CARRIER_OFF&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :netdev-&amp;gt;flags=0x00000002, IFF_UP=0&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :device was already closed&lt;br /&gt;
SPI2:: drvOpen :opening net device&lt;br /&gt;
SPI2:: drvOpen :ERROR: Associated, but Carrier flag is set to CARRIER_OFF&lt;br /&gt;
SPI2:: drvDoScan :Buero (bittorf)&lt;br /&gt;
SPI2:: drvProcessScanCfm :Scan Confirm: Success 1 APs&lt;br /&gt;
SPI2:: drvInitConnect :Req to connect to new WLAN network&lt;br /&gt;
SPI2:: drvInitConnect :Disabling TX queue and setting CARRIER_OFF&lt;br /&gt;
SPI2:: drvInitConnect :Connecting To AP...&lt;br /&gt;
SPI2:: drvInitConnect :step2&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVNT_INIT_CONNECT; setting CARRIER_ON&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :netdev-&amp;gt;flags=0x00000003, IFF_UP=1&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :device was already opened; enabling queue&lt;br /&gt;
SPI2:: drvInitConnect :step3 : u8Status 8&lt;br /&gt;
SPI2:: drvInitConnect :step4&lt;br /&gt;
SPI2:: drvInitConnect :Successful&lt;br /&gt;
SPI2:: drvInitConnect :step6&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PS Ind (1) in Drvmain&lt;br /&gt;
SPI2:: drvIoctl :PA Request&lt;br /&gt;
PhgHhalDoM2SDMA:1661:--&amp;gt;P0&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PS wake (0) in Drvmain&lt;br /&gt;
drvSetWOWFilter: Enable UNICAST: Disable ARP: Enable&lt;br /&gt;
Ip addr = 10.63.17.5. LMP=2&lt;br /&gt;
SPI2:: drvIoctl :PA Request&lt;br /&gt;
SPI2:: drvIoctl :No state change!&lt;br /&gt;
SPI2:: drvIoctl :Fast PS Request&lt;br /&gt;
PhgHhalDoM2SDMA:1661:--&amp;gt;P1&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PS Ind (1) in Drvmain&lt;br /&gt;
Sensor driver: initialize device OV7660&lt;br /&gt;
Warning: Remapping obsolete /dev/fb* minor 32 to 1&lt;br /&gt;
SPI2:: drvIoctl :dot11LongRetryLimitAC0 = 4&lt;br /&gt;
SPI2:: drvIoctl :dot11LongRetryLimitAC1 = 4&lt;br /&gt;
SPI2:: drvIoctl :dot11LongRetryLimitAC2 = 4&lt;br /&gt;
SPI2:: drvIoctl :dot11LongRetryLimitAC3 = 4&lt;br /&gt;
SPI2:: drvIoctl :dot11ShortRetryLimitAC0 = 4&lt;br /&gt;
SPI2:: drvIoctl :dot11ShortRetryLimitAC1 = 4&lt;br /&gt;
SPI2:: drvIoctl :dot11ShortRetryLimitAC2 = 4&lt;br /&gt;
SPI2:: drvIoctl :dot11ShortRetryLimitAC3 = 4&lt;br /&gt;
SPI2:: drvIoctl :PA Request&lt;br /&gt;
PhgHhalDoM2SDMA:1661:--&amp;gt;P0&lt;br /&gt;
SPI2:: drvHhalEventIndicationHandler :PS wake (0) in Drvmain&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ausgabe von &amp;lt;b&amp;gt;&amp;lt;tt&amp;gt;logread&amp;lt;/tt&amp;gt;&amp;lt;/b&amp;gt; auf einem VP6500 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Jan  1 00:00:00 imx21 syslog.info syslogd started: BusyBox v0.60.0 (2007.02.28-13:39+0000)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.emerg klogd: klogd started: BusyBox v0.60.0 (2007.02.28-13:39+0000)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Linux version 2.4.20-celf3 (root@wbul04) (gcc version 3.3.2) #1 Wed Feb 28 13:30:26 UTC 2007&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: CPU: ARM926EJ-Sid(wb) [41069264] revision 4 (ARMv?(8))&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: CPU: D undefined 14 cache&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: CPU: I cache: 16384 bytes, associativity 4, 32 byte lines, 128 sets&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: CPU: D cache: 16384 bytes, associativity 4, 32 byte lines, 128 sets&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Machine: Freescale i.MX2 ADS&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: FCLK=266000 kHz   HCLK=133000 kHz  IPGCLK=66500 kHz&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: PERCLKs: 1=44333 KHz  2=33250 kHz  3=44333 kHz  4=88666 kHz&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: On node 0 totalpages: 16384&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: zone(0): 16384 pages.&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: zone(1): 0 pages.&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: zone(2): 0 pages.&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Kernel command line: root=/dev/mtdblock2 noinitrd ip=none mtdparts=s29gl512n:256k@0x00000000&lt;br /&gt;
(bootloader)ro,896k@0x00040000(kernel)ro,50432k@0x00120000(fs#1),12800k@0x03260000(fs#2),1152k@0x03EE0000(fs#3)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.debug klogd: Relocating machine vectors to 0xffff0000&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Console: colour dummy device 80x30&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Calibrating delay loop (skipped)... 132.71 BogoMIPS&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Memory: 64MB = 64MB total&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: Memory: 63052KB available (1366K code, 299K data, 68K init)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Dentry cache hash table entries: 8192 (order: 4, 65536 bytes)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Inode cache hash table entries: 4096 (order: 3, 32768 bytes)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Mount-cache hash table entries: 1024 (order: 1, 8192 bytes)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Buffer-cache hash table entries: 4096 (order: 2, 16384 bytes)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Page-cache hash table entries: 16384 (order: 4, 65536 bytes)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: POSIX conformance testing by UNIFIX&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Linux NET4.0 for Linux 2.4&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Based upon Swansea University Computer Society NET3.039&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Initializing RT netlink socket&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: apm: Simulating APM BIOS version 1.2 (Driver version 1.0)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: i.MX21 Dynamic Power Management&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Starting kswapd&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Disabling the Out Of Memory Killer&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: JFFS2 version 2.1. (C) 2001, 2002 Red Hat, Inc., designed by Axis Communications AB.&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: i2c-core.o: i2c core module version 2.6.2 (20011118)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: pty: 256 Unix98 ptys configured&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Serial driver version 5.05c (2001-07-08) with no serial options enabled&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: UART driver version 0.3.6&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: I2C driver Feb 28 2007 / 13:31:04&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Initialize i2c-client-dbmx-codec module&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: s29gl512n: probing 16-bit flash bus&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd:  Amd/Fujitsu Extended Query Table v1.3 at 0x0040&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: number of CFI chips: 1&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: cfi_cmdset_0002: Using Write Buffer method.&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: cfi_cmdset_0002: buffer_Write_Time = 128&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: cfi_cmdset_0002: Disabling fast programming due to code brokenness.&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: Using static partition definition&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: Creating 5 MTD partitions on &amp;quot;s29gl512n&amp;quot;:&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: 0x00000000-0x00040000 : &amp;quot;bootloader&amp;quot;&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: 0x00040000-0x00120000 : &amp;quot;kernel&amp;quot;&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: 0x00120000-0x03260000 : &amp;quot;fs #1&amp;quot;&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: 0x03260000-0x03ee0000 : &amp;quot;fs #2&amp;quot;&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.notice klogd: 0x03ee0000-0x04000000 : &amp;quot;fs #3&amp;quot;&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: NET4: Linux TCP/IP 1.0 for NET4.0&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: IP Protocols: ICMP, UDP, TCP&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: IP: routing cache hash table of 512 buckets, 4Kbytes&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: TCP: Hash tables configured (established 4096 bind 8192)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: NetWinder Floating Point Emulator V0.95 (c) 1998-1999 Rebel.com&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: VFS: Mounted root (jffs2 filesystem).&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Freeing init memory: 68K&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: PCB version: ind3 v2&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Driver SYSTCLK: SYSTCLK-1.12 (REFERENCED)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Driver GPIO-1.59 (REFERENCED)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: ****p_gpio_init_low_bat****&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: GPIO: p_gpio_it_init at 762&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Driver FRAMEBUF-1.12 (REFERENCED)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Driver SPI-1.20 (REFERENCED) Debug level 3&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: &lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: u32_spi1_MinLenghtForDMAInTX set to 300&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: &lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: u32_spi1_MinLenghtForDMAInRX set to 300&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Driver LCD-1.20 (REFERENCED)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.info klogd: Driver TVLINK-1.45 (REFERENCED)&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Reset from Software Reset.&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: Motorola PostProcessor Linux driver ver 0.64 - Copyright (C) 2003 Motorola Inc&lt;br /&gt;
Jan  1 00:00:02 imx21 daemon.warn klogd: pp: hw ver = 2&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: prp_dbg=0&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: Motorola PreProcessor Linux driver ver 0.0 - Copyright (C) 2003 Motorola Inc&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.info klogd: hmp4d: base_port=0x10026800 irq=50&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.info klogd: hmp4d: module inserted&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.info klogd: hmp4e: base_port=0x10026c00 irq=49&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.info klogd: hmp4e: Compatble HW found with ID: 0x004c1882&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.info klogd: hmp4e: module inserted. Major = 249&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.err klogd: SPI2:: drv_Init :PID of driver: 134 &lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.err klogd: SPI2:: drv_Init :ScanList not provided. Will use the default scan list. &lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.err klogd: SPI2:: drv_Init :ScanChannelList :1 6 11 14 2 7 12 3 8 13 4 9 5 10 &lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.err klogd: SPI2:: drv_Init :setting PhyType to: Rf-to-Rf&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.err klogd: SPI2:: drv_Init :Ref.Clock parameter not provided&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.err klogd: SPI2:: drv_Init :Configure target for a reference clock of &#039;default=40&#039; Mhz.&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.err klogd: SPI2:: drvRegEtherDev :Interface Name is: eth%d &lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.err klogd: SPI2:: drv_Init :HEOCSIWPOWON: Powering on... &lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.err klogd: SPI2:: drvPhase2Init :Protocol Firmware will be loaded by driver ...&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.err klogd: SPI2:: drvPhase2Init :Initializing HHAL (PhgHhalInitialize)...&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: Divider : 8&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: &lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd:  OCR2 : e4015308 (12582912)&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: Reset : 3 / 27 (c497cc00 / e401531c)&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: &lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: Reset : 3 / 27 (c497cc00 / e401531c)&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: GPIO: p_gpio_init_gpio_status at 1262&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: GPIO: POWER_FAIL signal NOT detected at GPIO driver init carry on !!! &lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: GPIO: CHARGE_IN at init&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: GPIO: LOW_BAT_OUT at init&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: GPIO: No accessory plugged at init.  - Set Video on jack&lt;br /&gt;
Jan  1 00:00:03 imx21 daemon.warn klogd: GPIO: camera to front at init&lt;br /&gt;
Jan  1 00:00:04 imx21 daemon.warn klogd: **ChargeStatusPmb=========gpio_Read_ChargeStatus_Ready=1 &lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: PhgOsal_linux_init_thread :assigning thread name and deamonize() .. &lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvPhase2Init :Success&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvPhase2Init : registering callbacks with HHAL.. &lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVNT_INIT_COMPLETE; setting CARRIER_ON&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvPhase2Init :calling PhgHhalQueueMgmtReq()!&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.info klogd: PhgHhalQueueMgmtReq:1172:HHAL got Init message&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.info klogd: PhgHhalQueueMgmtReq:1217:HHAL done Init message&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PS wake (0) in Drvmain&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVENT_DISCONNECT; setting CARRIER_OFF&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :netdev-&amp;gt;flags=0x00001002, IFF_UP=0&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :device was already closed&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvMgmtCfmHndler :Using MAC Address: 00:08:c6:86:8b:99&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvPhase2Init :init etherdev; stopping queue, setting CARRIER_OFF&lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drv_Init :Philips WLAN Drv - loaded - in state: 1 &lt;br /&gt;
Jan  1 00:00:06 imx21 daemon.err klogd: SPI2:: drvInit :Philips WLAN Drv - loaded&lt;br /&gt;
Jan  1 00:00:07 imx21 daemon.err klogd: SPI2:: drvOpen :opening net device&lt;br /&gt;
Jan  1 00:00:07 imx21 daemon.err klogd: SPI2:: drvOpen :Device is not associated!&lt;br /&gt;
Jan  1 00:00:07 imx21 daemon.err klogd: SPI2:: drvOpen :Carrier flag is already set to CARRIER_OFF&lt;br /&gt;
Jan  1 00:00:07 imx21 daemon.err klogd: SPI2:: drvOpen :Disabling again netqueue&lt;br /&gt;
Jan  1 00:00:07 imx21 daemon.warn klogd: requested reg.domain code setting = 3&lt;br /&gt;
Jan  1 00:00:07 imx21 daemon.err klogd: SPI2:: drvIoctl :set u8LinkAdaptation  : 1 Result=[0]&lt;br /&gt;
Jan  1 00:00:07 imx21 daemon.err klogd: SPI2:: drvIoctl :changed HEOCSIWLNADPALLOWRATES: 8 allowed rate codes&lt;br /&gt;
Jan  1 00:00:07 imx21 daemon.err klogd: SPI2:: drvInitConnect :Req to connect to new WLAN network&lt;br /&gt;
Jan  1 00:00:07 imx21 daemon.err klogd: SPI2:: drvInitConnect :Disabling TX queue and setting CARRIER_OFF&lt;br /&gt;
Jan  1 00:00:07 imx21 daemon.err klogd: SPI2:: drvInitConnect :Connecting To AP...&lt;br /&gt;
Jan  1 00:00:07 imx21 daemon.err klogd: SPI2:: drvInitConnect :step2&lt;br /&gt;
Jan  1 00:00:10 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
Jan  1 00:00:10 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVENT_DISCONNECT; setting CARRIER_OFF&lt;br /&gt;
Jan  1 00:00:10 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :netdev-&amp;gt;flags=0x00001003, IFF_UP=1&lt;br /&gt;
Jan  1 00:00:10 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :device was already opened; stopping queue&lt;br /&gt;
Jan  1 00:00:11 imx21 daemon.err klogd: SPI2:: drvInitConnect :step3 : u8Status 255&lt;br /&gt;
Jan  1 00:00:11 imx21 daemon.err klogd: SPI2:: drvInitConnect :step5&lt;br /&gt;
Jan  1 00:00:11 imx21 daemon.err klogd: SPI2:: drvInitConnect :TIMEDOUT&lt;br /&gt;
Jan  1 00:00:11 imx21 daemon.err klogd: SPI2:: drvInitConnect :step6&lt;br /&gt;
Jan  1 00:00:11 imx21 daemon.err klogd: SPI2:: drvInitParamsAndPowerOnAndConnect :Connect failed!&lt;br /&gt;
Jan  1 00:00:12 imx21 daemon.warn klogd: Motorola CSI Linux driver ver 0.1&lt;br /&gt;
Jan  1 00:00:12 imx21 daemon.warn klogd:  - Copyright (C) 2004 Motorola Inc&lt;br /&gt;
Jan  1 00:00:12 imx21 daemon.warn klogd: &lt;br /&gt;
Jan  1 00:00:12 imx21 daemon.info klogd: Driver SENSOR-1.29 (REFERENCED)&lt;br /&gt;
Jan  1 00:00:12 imx21 daemon.info klogd: i2c-client version : 1.9&lt;br /&gt;
Jan  1 00:00:12 imx21 daemon.info klogd: Initialize i2c-client-aic14 module&lt;br /&gt;
Jan  1 00:00:12 imx21 daemon.info klogd: Module i2c-client-aic14 initialized&lt;br /&gt;
Jan  1 00:00:12 imx21 daemon.alert klogd: Insert module aic14 (AIC14-1.0)&lt;br /&gt;
Jan  1 00:00:12 imx21 daemon.warn klogd: Module AIC14 assumes CODEC MCLK already configured for 20480000Hz&lt;br /&gt;
Jan  1 00:00:12 imx21 daemon.info klogd: Driver KPP-1.36 (REFERENCED)&lt;br /&gt;
Jan  1 00:00:13 imx21 daemon.info klogd: Driver DOZE-1.27 (REFERENCED)&lt;br /&gt;
Jan  1 00:00:14 imx21 daemon.err klogd: SPI2:: drvDoScan :Buero (bittorf)&lt;br /&gt;
Jan  1 00:00:15 imx21 daemon.err klogd: SPI2:: drvProcessScanCfm :Scan Confirm: Success 1 APs&lt;br /&gt;
Jan  1 00:00:15 imx21 daemon.info netsyncd[315]: creating FIFO_NETSYNC_HMON_NAME... &lt;br /&gt;
Jan  1 00:00:15 imx21 daemon.info netsyncd[315]: creating FIFO_HMON_NETSYNC_NAME... &lt;br /&gt;
Jan  1 00:00:18 imx21 daemon.err klogd: SPI2:: drvInitConnect :Req to connect to new WLAN network&lt;br /&gt;
Jan  1 00:00:18 imx21 daemon.err klogd: SPI2:: drvInitConnect :Disabling TX queue and setting CARRIER_OFF&lt;br /&gt;
Jan  1 00:00:18 imx21 daemon.err klogd: SPI2:: drvInitConnect :Connecting To AP...&lt;br /&gt;
Jan  1 00:00:18 imx21 daemon.err klogd: SPI2:: drvInitConnect :step2&lt;br /&gt;
Jan  1 00:00:19 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
Jan  1 00:00:19 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVNT_INIT_CONNECT; setting CARRIER_ON&lt;br /&gt;
Jan  1 00:00:19 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :netdev-&amp;gt;flags=0x00001003, IFF_UP=1&lt;br /&gt;
Jan  1 00:00:19 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :device was already opened; enabling queue&lt;br /&gt;
Jan  1 00:00:19 imx21 daemon.err klogd: SPI2:: drvInitConnect :step3 : u8Status 8&lt;br /&gt;
Jan  1 00:00:19 imx21 daemon.err klogd: SPI2:: drvInitConnect :step4&lt;br /&gt;
Jan  1 00:00:19 imx21 daemon.err klogd: SPI2:: drvInitConnect :Successful&lt;br /&gt;
Jan  1 00:00:19 imx21 daemon.err klogd: SPI2:: drvInitConnect :step6&lt;br /&gt;
Jan  1 00:00:19 imx21 daemon.err modprobe: modprobe: Can&#039;t locate module sound-slot-0&lt;br /&gt;
Jan  1 00:00:19 imx21 daemon.err modprobe: modprobe: Can&#039;t locate module sound-service-0-0&lt;br /&gt;
Jan  1 00:00:20 imx21 local0.debug dhcpcd[337]: broadcasting DHCP_DISCOVER &lt;br /&gt;
Jan  1 00:00:23 imx21 local0.debug dhcpcd[337]: DHCP_OFFER received from  (10.63.17.1) &lt;br /&gt;
Jan  1 00:00:23 imx21 local0.debug dhcpcd[337]: DHCP_ACK received from  (10.63.17.1) &lt;br /&gt;
Jan  1 00:00:23 imx21 daemon.err netsyncd[314]: father received(10) eth0 up! &lt;br /&gt;
Jan  1 00:00:23 imx21 daemon.info netsyncd[314]: Dhcp_start 337 return : 0  &lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC0 = 8&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC1 = 8&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC2 = 8&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC3 = 8&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC0 = 8&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC1 = 8&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC2 = 8&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC3 = 8&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvIoctl :PA Request&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvIoctl :No state change!&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvIoctl :Fast PS Request&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.info klogd: PhgHhalDoM2SDMA:1661:--&amp;gt;P1&lt;br /&gt;
Jan  1 00:00:26 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PS Ind (1) in Drvmain&lt;br /&gt;
Jan  1 00:00:28 imx21 daemon.info netsyncd[314]: Dhcp_stop 359 return : 0  &lt;br /&gt;
Jan  1 00:00:28 imx21 local0.debug dhcpcd[347]: sending DHCP_RELEASE for 10.63.17.5 to 10.63.17.1 &lt;br /&gt;
Jan  1 00:00:29 imx21 local0.err dhcpcd[347]: terminating on signal 1 &lt;br /&gt;
Jan  1 00:00:29 imx21 daemon.err netsyncd[314]: father received(12) eth0 down! &lt;br /&gt;
Jan  1 00:00:29 imx21 daemon.err klogd: SPI2:: drvStop :Driver Stop: disable TX queue! (usage: 2)&lt;br /&gt;
Jan  1 00:00:41 imx21 daemon.err klogd: SPI2:: drvIoctl :Deauth BSSID: 00:1d:7e:18:e3:89&lt;br /&gt;
Jan  1 00:00:41 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
Jan  1 00:00:41 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVENT_DISCONNECT; setting CARRIER_OFF&lt;br /&gt;
Jan  1 00:00:41 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :netdev-&amp;gt;flags=0x00000002, IFF_UP=0&lt;br /&gt;
Jan  1 00:00:41 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :device was already closed&lt;br /&gt;
Jan  1 00:00:41 imx21 daemon.err klogd: SPI2:: drvOpen :opening net device&lt;br /&gt;
Jan  1 00:00:41 imx21 daemon.err klogd: SPI2:: drvOpen :ERROR: Associated, but Carrier flag is set to CARRIER_OFF&lt;br /&gt;
Jan  1 00:00:41 imx21 daemon.err klogd: SPI2:: drvDoScan :Buero (bittorf)&lt;br /&gt;
Jan  1 00:00:42 imx21 daemon.err klogd: SPI2:: drvProcessScanCfm :Scan Confirm: Success 1 APs&lt;br /&gt;
Jan  1 00:00:45 imx21 daemon.err klogd: SPI2:: drvInitConnect :Req to connect to new WLAN network&lt;br /&gt;
Jan  1 00:00:45 imx21 daemon.err klogd: SPI2:: drvInitConnect :Disabling TX queue and setting CARRIER_OFF&lt;br /&gt;
Jan  1 00:00:45 imx21 daemon.err klogd: SPI2:: drvInitConnect :Connecting To AP...&lt;br /&gt;
Jan  1 00:00:45 imx21 daemon.err klogd: SPI2:: drvInitConnect :step2&lt;br /&gt;
Jan  1 00:00:46 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :&lt;br /&gt;
Jan  1 00:00:46 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PHGHHAL_EVNT_INIT_CONNECT; setting CARRIER_ON&lt;br /&gt;
Jan  1 00:00:46 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :netdev-&amp;gt;flags=0x00000003, IFF_UP=1&lt;br /&gt;
Jan  1 00:00:46 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :device was already opened; enabling queue&lt;br /&gt;
Jan  1 00:00:46 imx21 daemon.err klogd: SPI2:: drvInitConnect :step3 : u8Status 8&lt;br /&gt;
Jan  1 00:00:46 imx21 daemon.err klogd: SPI2:: drvInitConnect :step4&lt;br /&gt;
Jan  1 00:00:46 imx21 daemon.err klogd: SPI2:: drvInitConnect :Successful&lt;br /&gt;
Jan  1 00:00:46 imx21 daemon.err klogd: SPI2:: drvInitConnect :step6&lt;br /&gt;
Jan  1 00:00:46 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PS Ind (1) in Drvmain&lt;br /&gt;
Jan  1 00:00:54 imx21 local0.debug dhcpcd[386]: broadcasting DHCP_DISCOVER &lt;br /&gt;
Jan  1 00:00:57 imx21 local0.debug dhcpcd[386]: DHCP_OFFER received from  (10.63.17.1) &lt;br /&gt;
Jan  1 00:00:57 imx21 local0.debug dhcpcd[386]: DHCP_ACK received from  (10.63.17.1) &lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.info netsyncd[314]: Dhcp_start 386 return : 0  &lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.info netsyncd[314]: NTP server request on : ntp.xs4all.nl &lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.err klogd: SPI2:: drvIoctl :PA Request&lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.info klogd: PhgHhalDoM2SDMA:1661:--&amp;gt;P0&lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PS wake (0) in Drvmain&lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.warn klogd: drvSetWOWFilter: Enable UNICAST: Disable ARP: Enable&lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.warn klogd: Ip addr = 10.63.17.5. LMP=2&lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.err klogd: SPI2:: drvIoctl :PA Request&lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.err klogd: SPI2:: drvIoctl :No state change!&lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.err klogd: SPI2:: drvIoctl :Fast PS Request&lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.info klogd: PhgHhalDoM2SDMA:1661:--&amp;gt;P1&lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PS Ind (1) in Drvmain&lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.warn klogd: Sensor driver: initialize device OV7660&lt;br /&gt;
Jan  1 00:00:57 imx21 daemon.warn klogd: Warning: Remapping obsolete /dev/fb* minor 32 to 1&lt;br /&gt;
Apr  7 09:58:16 imx21 daemon.info netsyncd[314]: NTP process return code : 0  &lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC0 = 4&lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC1 = 4&lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC2 = 4&lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC3 = 4&lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC0 = 4&lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC1 = 4&lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC2 = 4&lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC3 = 4&lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.err klogd: SPI2:: drvIoctl :PA Request&lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.info klogd: PhgHhalDoM2SDMA:1661:--&amp;gt;P0&lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PS wake (0) in Drvmain&lt;br /&gt;
Apr  7 09:58:19 imx21 daemon.info upgraded[312]: K_SW0_DWNLD_ACK &lt;br /&gt;
Apr  7 09:58:27 imx21 auth.info login[393]: root login  on `ttyp0&#039; from `bittorf-AP.olsr&#039; &lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC0 = 8&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC1 = 8&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC2 = 8&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11LongRetryLimitAC3 = 8&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC0 = 8&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC1 = 8&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC2 = 8&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvIoctl :dot11ShortRetryLimitAC3 = 8&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvIoctl :PA Request&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvIoctl :No state change!&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvIoctl :Fast PS Request&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.info klogd: PhgHhalDoM2SDMA:1661:--&amp;gt;P1&lt;br /&gt;
Apr  7 09:59:50 imx21 daemon.err klogd: SPI2:: drvHhalEventIndicationHandler :PS Ind (1) in Drvmain&lt;br /&gt;
Apr  7 10:14:53 imx21 auth.info login[408]: root login  on `ttyp1&#039; from `bittorf-AP.olsr&#039; &lt;br /&gt;
Apr  7 10:17:18 imx21 syslog.info -- MARK --&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ausgabe von &amp;lt;b&amp;gt;&amp;lt;tt&amp;gt;/proc/cpuinfo&amp;lt;/tt&amp;gt;&amp;lt;/b&amp;gt; auf einem VP6500 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /proc/cpuinfo &lt;br /&gt;
Processor       : ARM926EJ-Sid(wb) rev 4 (v5EJl)&lt;br /&gt;
BogoMIPS        : 133.01&lt;br /&gt;
Features        : swp half thumb fastmult &lt;br /&gt;
CPU implementer : 0x41&lt;br /&gt;
CPU architecture: ?(8)&lt;br /&gt;
CPU variant     : 0x0&lt;br /&gt;
CPU part        : 0x926&lt;br /&gt;
CPU revision    : 4&lt;br /&gt;
Cache type      : undefined 14&lt;br /&gt;
Cache clean     : undefined 14&lt;br /&gt;
Cache lockdown  : undefined 14&lt;br /&gt;
Cache unified   : Harvard&lt;br /&gt;
I size          : 16384&lt;br /&gt;
I assoc         : 4&lt;br /&gt;
I line length   : 32&lt;br /&gt;
I sets          : 128&lt;br /&gt;
D size          : 16384&lt;br /&gt;
D assoc         : 4&lt;br /&gt;
D line length   : 32&lt;br /&gt;
D sets          : 128&lt;br /&gt;
&lt;br /&gt;
Hardware        : Freescale i.MX2 ADS&lt;br /&gt;
Revision        : 0000&lt;br /&gt;
Serial          : 0000000000000000&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Software Modifikationen ==&lt;br /&gt;
&lt;br /&gt;
=== Startscripts ===&lt;br /&gt;
Die Scripts in /etc/rc.d/&amp;quot; müssen im Hintergrund laufen. Tut ein Script das nicht, ist an dieser Stelle Schluß mit dem Bootvorgang.&lt;br /&gt;
&lt;br /&gt;
Dann darf man als nächstes den Lötkolben anheizen und die serielle Schnittstelle ([[#UART]]) zugänglich machen.&lt;br /&gt;
&lt;br /&gt;
=== Aktivierung WPA2 Unterstützung ===&lt;br /&gt;
&amp;lt;p&amp;gt;Standardmäßig kann das Telefon nur WPA, dabei unterstützt es allerdings auch &amp;lt;b&amp;gt;WPA mit AES&amp;lt;/b&amp;gt; Verschlüsselung.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Es gibt zwei verschiedene Tricks mit denen auch WPA2 aktiviert werden kann.&lt;br /&gt;
Allerdings wurde von einigen ein Einbruch der Verbindungsgeschwindigkeit festgestellt (scheint jedoch nur bei geringem Akkuladestand aufzutreten).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Trick1 ====&lt;br /&gt;
Mittels&lt;br /&gt;
 vi /etc/marvell/wpa_supplicant.conf&lt;br /&gt;
den Texteditor starten.&lt;br /&gt;
Mit PageDown (Bild runter) bis zum Ende des Files gehen.&lt;br /&gt;
Die Zeilen &lt;br /&gt;
 proto=WPA&lt;br /&gt;
 pairwise=TKIP&lt;br /&gt;
 group=TKIP&lt;br /&gt;
auskommentieren, indem ein # vorangestellt wird:&lt;br /&gt;
* cursor auf Beginn einer Zeile &lt;br /&gt;
* i drücken zum Einfügen&lt;br /&gt;
* # eintippen&lt;br /&gt;
* [Esc]&lt;br /&gt;
Sind alle Zeilen auskommentiert, dann mittels&lt;br /&gt;
 :wq[enter]&lt;br /&gt;
abspeichern und Editor verlassen.&lt;br /&gt;
&lt;br /&gt;
Danach neu booten.&lt;br /&gt;
&lt;br /&gt;
Anmerkung: Will man sich mit dieser Änderung in einem reinen WPA2 Netz anmelden (registrieren), kann man als Verschlüsselung nur noch WEP auswählen - der Verbindungsversuch scheitert natürlich! (Hardware: Fritz!Box 7270, PHILIPS VP5500)&lt;br /&gt;
&lt;br /&gt;
Also am Accesspoint WPA2 + WPA einstellen, Telefon registrieren, dann Accesspoint auf WPA2 konfigurieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;Achtung!&#039;&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Herumspielen an der wpa_supplicant.conf endet sehr schnell damit das man sich ausperrt&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Um sich eine Wiederbelebung per serieller Konsole zu ersparen, ist es günstig, immer nur Einträge an die wpa_supplicant.conf &amp;lt;u&amp;gt;hinten anzuhängen&amp;lt;/u&amp;gt;, niemals aber vorne einzufügen!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Trick2 ====&lt;br /&gt;
Dieser Trick funktioniert mit Accesspoints, bei denen man auch WPA Verbindungen mit AES verschlüsseln kann. Vorteil dieses Tricks ist, dass man die wpa_supplicant.conf nicht manuell editieren muss. Allerdings unterstützt nicht jeder Accesspoint WPA mit AES (aber dd-wrt kann das).&lt;br /&gt;
&lt;br /&gt;
Man konfiguriert den Accesspoint zunächst mit WPA PSK und wählt AES als Verschlüsselungsalgorithmus. Jetzt meldet man das Telefon an, das Telefon erkennt richtig, dass eine WPA Verbindung vorliegt und verbindet sich per WPA und AES mit dem Accesspoint. Anschliessend konfiguriert man den Accesspoint von WPA PSK AES nach WPA2 PSK AES. Jetzt schaltet man das VP5500/6500 aus und wieder ein. Nachdem es fertig gebootet hat, verbindet es sich automisch per WPA2 PSK und mit AES Verschlüsselung. Fertig.&lt;br /&gt;
&lt;br /&gt;
==== Versehentliche Aussperrung nach WPA2 Einstellversuch beheben ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. DON&#039;T PANIC!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Für den Fall das man sich den Zugangsweg per wireless abgeschnitten hat, gibt es, neben dem Bau eines seriellen Adapters und der Notwendigkeit zu löten, noch eine Variante um wieder auf das Telefon zu kommen:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;den Demo-Modus!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dieser Modus war dazu gedacht die Funktionalität der VPs ohne SIP-Server ausprobieren zu können. 2 Geräte starten dazu im WLAN-AdHoc-Modus mit unterschiedlichen IP&#039;s (192.168.10.1 + 192.168.10.2 , jeweils /24 = 255.255.255.0) und machen ein IBSS-Netzwerk mit WEP-Verschlüsselung auf (Key: VP6500 = 5648751265 beim VP5500 = 7295569793).&lt;br /&gt;
&lt;br /&gt;
Nun kann man auch ein einzelnes Telefon in den Demo-Modus versetzen (vorhandener neuer Menüeintrag nach dem rooten, oder per Tastenkombination &amp;quot;*#3 &amp;quot;), gibt sich eine passende WLAN und IP-Einstellungen auf dem Rechner und schon kann man wieder darauf connecten und Fehleinstellungen wieder beheben. Dummerweise wird eine zufällige IBSS-Cell-ID verwendet, aber neuere Betriebssysteme können der Zelle trotzdem beitreten. Als ESSID kann man &#039;&#039;demo_mode_obiwan&#039;&#039; verwenden.&lt;br /&gt;
&lt;br /&gt;
===== Schritt für Schritt Anleitung für Linux =====&lt;br /&gt;
&lt;br /&gt;
Einstellungen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;am Telefon&#039;&#039;&#039;&lt;br /&gt;
* Telefon anschalten und per Menüeintrag oder Tastenkombination &amp;quot;*#3&amp;quot; in Demomodus versetzen (z.B. als Einstellung Handset 1)&lt;br /&gt;
-&amp;gt; IP des Telefons wird danach zu 192.168.10.1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;am Computer&#039;&#039;&#039;&lt;br /&gt;
* Konsole öffnen&lt;br /&gt;
 per ifconfig checken welches das WLAN-Gerät am Rechner ist (im weiteren &amp;quot;wlan0&amp;quot; genannt)&lt;br /&gt;
 ifconfig wlan0 down&lt;br /&gt;
 iwconfig wlan0 mode ad-hoc (ad-hoc Modus aktivieren)&lt;br /&gt;
 iwconfig wlan0 essid &#039;demo_mode_obiwan&#039; (Passende essid-Kennung setzen)&lt;br /&gt;
 iwconfig wlan0 key 5648751265 (Key für das VP6500)&lt;br /&gt;
 ifconfig wlan0 up&lt;br /&gt;
 ifconfig wlan0 192.168.10.2 (setzen der IP)&lt;br /&gt;
&lt;br /&gt;
man kann nun mittels:&lt;br /&gt;
&lt;br /&gt;
 ping 192.168.10.1&lt;br /&gt;
&lt;br /&gt;
testen ob alles korrekt verlaufen ist und man eine Antwort bekommt - sollte das der Fall sein ist man &#039;&#039;&#039;fertig!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Nun kann man per telnet oder ssh, mit den üblichen Benutzerkennung und dem Passwort, auf die IP 192.168.10.1 connecten und die Probleme beheben.&lt;br /&gt;
&lt;br /&gt;
=== Menüs ===&lt;br /&gt;
==== Hauptmenu ====&lt;br /&gt;
&lt;br /&gt;
Das File &lt;br /&gt;
 /usr/local/etc/defaultbuttons.conf&lt;br /&gt;
enthält unter anderm die definition des Hauptmenus.&lt;br /&gt;
&lt;br /&gt;
Hierfür ist der Abschnitt Menu besonders interessant.&lt;br /&gt;
  [Menu]&lt;br /&gt;
  1 = Applications/camera.desktop&lt;br /&gt;
  2 = Applications/callhistory.desktop&lt;br /&gt;
  3 = Applications&lt;br /&gt;
  4 = Settings&lt;br /&gt;
  5 = Applications/addressbook.desktop&lt;br /&gt;
  6 = Settings/RingProfiles.desktop&lt;br /&gt;
  Columns = 3&lt;br /&gt;
  Default = 5&lt;br /&gt;
  Map = 123456789*0#&lt;br /&gt;
  Rows = 2&lt;br /&gt;
&lt;br /&gt;
&#039;Rows&#039; und &#039;Columns&#039; geben an, wieviel Reihen und Spalten das Hauptmenu hat.&lt;br /&gt;
Über die Zuweisungen 1 bis (Columns * Rows) kann man dann den Menüpositionen die Menüpunkte zuweisen.&lt;br /&gt;
Die Menupunkte sind definiert in den Verzeichnissen unter &lt;br /&gt;
 /usr/local/apps&lt;br /&gt;
gibt man nur ein Verzeichnis an, dann erscheint ein Submenü, dessen Icon und Name in der .directory -Datei des entsprechenden Ordner definiert ist.&lt;br /&gt;
direkte Menupunkte haben Dateinamen mit der Endung .desktop&lt;br /&gt;
&#039;Default&#039; bestimmten vorselektierten Eintrag.&lt;br /&gt;
&lt;br /&gt;
Hier ein weiteres Beispiel für ein angepasstes Menu:&lt;br /&gt;
  [Menu]&lt;br /&gt;
  1 = Applications/addressbook.desktop&lt;br /&gt;
  2 = Applications/callhistory.desktop&lt;br /&gt;
  3 = Applications/sysinfo.desktop&lt;br /&gt;
  4 = Applications&lt;br /&gt;
  5 = Settings&lt;br /&gt;
  6 = Games&lt;br /&gt;
  7 = Applications/camera.desktop&lt;br /&gt;
  8 = Applications/photoedit.desktop&lt;br /&gt;
  9 = Applications/manualsub.desktop&lt;br /&gt;
  Columns = 3&lt;br /&gt;
  Default = 5&lt;br /&gt;
  Map = 123456789*0#&lt;br /&gt;
  Rows = 3&lt;br /&gt;
&lt;br /&gt;
Der Ordner Games ist (momentan ;) leer.&lt;br /&gt;
&lt;br /&gt;
==== Genereller Aufbau Menü-Einträge ====&lt;br /&gt;
Die Einträge für die Menüs sind im Filesystem abgelegt:&lt;br /&gt;
&lt;br /&gt;
* Settings: /usr/local/apps/Settings&lt;br /&gt;
* Applications: /usr/local/apps/Applications&lt;br /&gt;
* Klingeltöne: /usr/local/etc/SystemRingTones/&lt;br /&gt;
&lt;br /&gt;
Die Dateien haben die Endung &amp;quot;.desktop&amp;quot; und sind normale Textdateien, die die relevanten Infos enthalten.&lt;br /&gt;
&lt;br /&gt;
Ein Beispiel aus dem Settingsordner:&lt;br /&gt;
  [Translation]&lt;br /&gt;
  File=QtopiaSettings&lt;br /&gt;
  Context=Sound&lt;br /&gt;
  [Desktop Entry]&lt;br /&gt;
  Type=Application&lt;br /&gt;
  Exec=sound&lt;br /&gt;
  Icon=Sound&lt;br /&gt;
  Name[]=Sound&lt;br /&gt;
  CanFastload=0&lt;br /&gt;
&lt;br /&gt;
Der Abschnitt &#039;Translation&#039; gibt an in welchem File, die Lokalisationsdaten stehen.&lt;br /&gt;
&lt;br /&gt;
Der Abschnitt &#039;Desktop Entry&#039;:&lt;br /&gt;
* Type: Typ des Eintrages &lt;br /&gt;
** Application für Anwendungen&lt;br /&gt;
** audio/x-wav für Klingeltöne&lt;br /&gt;
* Exec: Anwendung, die ausgeführt werden soll&lt;br /&gt;
* Icon: Icon, das im Menü benutzt wird. &lt;br /&gt;
** Pfad ist meist: /usr/local/pics/[Exex]/[Icon].png&lt;br /&gt;
** manchmal aber auch: /usr/local/pics/icons/[14x14|16x16|22x22]/[Icon].png&lt;br /&gt;
* Name[]: Name im Menü, wird über das in Translation angegebe File und Context aufgelöst. Dies wird verhindert, wenn die Klammern wegelassen werden, was das Einfügen eigener Einträge ermöglicht&lt;br /&gt;
&lt;br /&gt;
Hier ein Textfile mit allen desktop-Files als Referenz: [[File:alleDesktopFiles.txt]]&lt;br /&gt;
&lt;br /&gt;
==== Versteckte Menüeinträge ====&lt;br /&gt;
in den oben genannten Ordnern existieren ein paar Dateien mit der Endung &#039;.desktopMASK&#039;.&lt;br /&gt;
Benennt man diese um, werden die Einträge nach einem Neustart im Menü freigeschaltet.&lt;br /&gt;
&lt;br /&gt;
folgendes an der Kommandozeile eingeben:&lt;br /&gt;
 cd /usr/local/apps/Settings&lt;br /&gt;
 mv datetime.desktopMASK datetime.desktop&lt;br /&gt;
 mv callforward.desktopMASK callforward.desktop&lt;br /&gt;
 mv calloptions.desktopMASK calloptions.desktop&lt;br /&gt;
 mv resetparam.desktopMASK resetparam.desktop&lt;br /&gt;
 mv subkpncode.desktopMASK subkpncode.desktop&lt;br /&gt;
&lt;br /&gt;
Dies aktiviert folgende Optionen:&lt;br /&gt;
* Datums/Zeit-Einstellung&lt;br /&gt;
* Anrufweiterleitung&lt;br /&gt;
* Anrufoptionen&lt;br /&gt;
* Parameter zurücksetzen&lt;br /&gt;
* Number Switch&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die nützlichsten sind wohl die ersten Einträge.&lt;br /&gt;
Bei dem &amp;quot;Number Switch&amp;quot; ist unklar, was er bewirken soll. Beim Start wird ein Code abgefragt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Weiterhin kann im Verzeichnis /usr/local/apps/Applications eine [[File:demomode.desktop]] anlegen.&lt;br /&gt;
&lt;br /&gt;
Hierfür ist folgende Prozedur nötig:&lt;br /&gt;
* im Terminal&lt;br /&gt;
                 cd /usr/local/apps/Applications&lt;br /&gt;
                 vi demomode.desktop&lt;br /&gt;
&lt;br /&gt;
* i drücken &lt;br /&gt;
* folgendes Textfragment einfügen &lt;br /&gt;
                 [Translation]&lt;br /&gt;
                 File=QtopiaApplications&lt;br /&gt;
                 Context=DemoMode&lt;br /&gt;
                 [Desktop Entry]&lt;br /&gt;
                 Exec=demomode&lt;br /&gt;
                 Icon=Camera&lt;br /&gt;
                 Type=Application&lt;br /&gt;
                 Name[]=DemoMode&lt;br /&gt;
* [Esc] &lt;br /&gt;
* :wq [Enter] &lt;br /&gt;
&lt;br /&gt;
Dies schaltet einen Demo-Modus frei.&lt;br /&gt;
&lt;br /&gt;
===== Französisch =====&lt;br /&gt;
Es gab die Geräte wohl auch in Frankreich von der France Telekom.&lt;br /&gt;
Zumindest sind entsprechende monitor und upgrade Referenz-Dateien&lt;br /&gt;
vorhanden in denen das steht. Daher wohl auch die Französischen&lt;br /&gt;
Sprachdateien, die zwar auf dem Gerät sind, allerdings in einem&lt;br /&gt;
Unterverzeichnis, so das sie nicht auswählbar sind.&lt;br /&gt;
&lt;br /&gt;
Um diese Dateien zu aktivieren:&lt;br /&gt;
&lt;br /&gt;
 cd /usr/local/i18n&lt;br /&gt;
 mv NOTUSED/fr .&lt;br /&gt;
&lt;br /&gt;
Nun ist auch noch französisch als Sprache verfügbar.&lt;br /&gt;
&lt;br /&gt;
==== Eigene Menüeinträge ====&lt;br /&gt;
&lt;br /&gt;
Es besteht die Möglichkeit Menüeinträge anzulegen, durch die Shellskripte ausgeführt werden. Im Folgenden ist dieses Vorgehen am Beispiel des ein- und ausschaltens von SSH beschrieben.&lt;br /&gt;
&lt;br /&gt;
===== SSH aktivieren &amp;amp; deaktivieren =====&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Achtung! Folgendes Vorgehen kann das Gerät bricken, falls Telnet deaktiviert ist und irgendwas mit SSH schief läuft!&#039;&#039;&#039;&lt;br /&gt;
*Die folgenden beiden Dateien repräsentieren die Menüeinträge und rufen &#039;&#039;enablessh&#039;&#039; bzw. &#039;&#039;disablessh&#039;&#039; auf.&lt;br /&gt;
:*&#039;&#039;/usr/local/apps/Applications/enablessh.desktop&#039;&#039;:&lt;br /&gt;
 [Translation]&lt;br /&gt;
 File=QtopiaApplications&lt;br /&gt;
 Context=enablessh&lt;br /&gt;
 [Desktop Entry]&lt;br /&gt;
 Exec=enablessh&lt;br /&gt;
 Icon=Camera&lt;br /&gt;
 Type=Application&lt;br /&gt;
 Name[]=Enable SSH&lt;br /&gt;
:*&#039;&#039;/usr/local/apps/Applications/disablessh.desktop&#039;&#039;:&lt;br /&gt;
 [Translation]&lt;br /&gt;
 File=QtopiaApplications&lt;br /&gt;
 Context=disablessh&lt;br /&gt;
 [Desktop Entry]&lt;br /&gt;
 Exec=disablessh&lt;br /&gt;
 Icon=Camera&lt;br /&gt;
 Type=Application&lt;br /&gt;
 Name[]=Disable SSH&lt;br /&gt;
*&#039;&#039;enablessh&#039;&#039; und &#039;&#039;disablessh&#039;&#039; sind Shellskripte, die in &#039;&#039;/usr/local/bin/&#039;&#039; liegen und folgendes enthalten:&lt;br /&gt;
:*&#039;&#039;/usr/local/bin/enablessh&#039;&#039;:&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 touch /var/log/lastlog&lt;br /&gt;
 /etc/rc.d/init.d/S99dropbear restart&lt;br /&gt;
 exit(0)&lt;br /&gt;
:*&#039;&#039;/usr/local/bin/disablessh&#039;&#039;:&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 /etc/rc.d/init.d/S99dropbear stop&lt;br /&gt;
 exit(0)&lt;br /&gt;
*Nach einem Neustart des Telefons sollten im Menü &#039;&#039;Anwendungen&#039;&#039; die zwei neuen Menüpunkte auftauchen.&lt;br /&gt;
&lt;br /&gt;
=== Grafische Anpassungen ===&lt;br /&gt;
So gut wie alle Grafiken liegen im Verzeichnis /usr/local/pics und können beliebig ausgetauscht werden (gleicher Dateityp, gleiche Größe).&lt;br /&gt;
&lt;br /&gt;
Einige besonders interessante werden hier aufgeführt:&lt;br /&gt;
&lt;br /&gt;
===== Eigene Startup/Shutdown-Animation =====&lt;br /&gt;
&lt;br /&gt;
Die Animation beim Starten oder Herunterfahren sind normale (animierte) GIFs. Diese findet man in&lt;br /&gt;
&lt;br /&gt;
 /usr/local/pics/qpe&lt;br /&gt;
&lt;br /&gt;
Die Links &amp;quot;splash.gif&amp;quot; und &amp;quot;goodbye.gif&amp;quot; zeigen auf die tasächlich zu verwendenen Dateien (&amp;quot;splash-chuck.gif&amp;quot;, &amp;quot;goodby-chuck.gif&amp;quot;).&lt;br /&gt;
Man kann sein eigenes animiertes GIF im Format 176x220 Pixel raufladen und die&lt;br /&gt;
splash.gif entsprechend neu verlinken. Dazu löscht man zuerst die alte&lt;br /&gt;
mit:&lt;br /&gt;
&lt;br /&gt;
 rm /usr/local/pics/qpe/splash.gif&lt;br /&gt;
&lt;br /&gt;
Anschliessend erzeugt man den Link neu, dabei zeigt er dann auf die&lt;br /&gt;
eigene Datei:&lt;br /&gt;
&lt;br /&gt;
 ln -s /pfad/zur/eigenedatei.gif /usr/local/pics/qpe/splash.gif&lt;br /&gt;
&lt;br /&gt;
Danach wird dann bei jedem Neustart die eigene Animation angezeigt.&lt;br /&gt;
Analog hierzu mit der goodbye.gif.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Also, man packe das Bild auf einen Webserver. Dann am Gerät über telnet&lt;br /&gt;
anmelden und:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
cd /usr/local/pics/qpe/&lt;br /&gt;
wget http://dein.server/woauchimmer/Matrix5.gif&lt;br /&gt;
rm /usr/local/pics/qpe/splash.gif&lt;br /&gt;
ln -s Matrix5.gif splash.gif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die GIF Animation kann bis zu 176x220 Pixel groß sein.&lt;br /&gt;
Kleinere (möglicherweise auch größere) Bilder werden zentriert.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Bild:walking_baby_tux.gif&lt;br /&gt;
Bild:custwakeup2.gif&lt;br /&gt;
Bild:custgoodbye2.gif&lt;br /&gt;
Bild:94vw4.gif&lt;br /&gt;
Bild:1_Matrix--16984.gif&lt;br /&gt;
Bild:1_Matrix--16985.gif&lt;br /&gt;
Bild:3.gif&lt;br /&gt;
Bild:ClanSpider2.gif&lt;br /&gt;
Bild:TS12.gif&lt;br /&gt;
Bild:Matrix5.gif&lt;br /&gt;
Bild:qtopia3.gif&lt;br /&gt;
Bild:qtopia0.gif&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Eigener Boot/Update-Screen =====&lt;br /&gt;
&lt;br /&gt;
Der Boot-Screen, oder der Update-Screen liegen als Rohdaten vor.&lt;br /&gt;
 /user_data/data/welcome.rgb565&lt;br /&gt;
 /usr/local/startup_V4.20/update.bin&lt;br /&gt;
&lt;br /&gt;
Weitere Beispielbilder:&lt;br /&gt;
 /user_data/prod/data/lcd_test_card1.bin&lt;br /&gt;
 /user_data/prod/data/lcd_test_card2.bin&lt;br /&gt;
&lt;br /&gt;
Diese werden direkt in den Framebuffer geschrieben.&lt;br /&gt;
Daher müssen sich diese genau ein bestimmtes Format halten: &lt;br /&gt;
* Größe 240 x 220 (Das Display ist 176 x 220, der Rest ist also nicht zu sehen)&lt;br /&gt;
* 16bit pro Pixel RGB565&lt;br /&gt;
&lt;br /&gt;
Um solch ein Bild zu erstellen sind folgende Schritte notwendig:&lt;br /&gt;
# Ein Bild in Gimp mit 176x220 erstellen&lt;br /&gt;
# das Bild vertikal spiegeln&lt;br /&gt;
# Bild-&amp;gt;Leinwandgröße auf 240x220 erweitern (Bilddaten ganz nach links)&lt;br /&gt;
# Datei-&amp;gt;Kopie speichern...&lt;br /&gt;
# Als Windowsbitmap -&amp;gt; erweiterete Optionen -&amp;gt; 16bit R5G6B5&lt;br /&gt;
# BMP-Header entfernen (dies kann auch auf dem Telefon gemacht werden)&lt;br /&gt;
         tail -c 105600 input.bmp &amp;gt; output.raw&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Von der Kommandozeile kann auch manuell das Bild in den Framebuffer geschrieben werden.&lt;br /&gt;
 cat /user_data/prod/data/lcd_test_card1.bin &amp;gt; /dev/fb0&lt;br /&gt;
&lt;br /&gt;
=== Wichtige Verzeichnisse ===&lt;br /&gt;
&lt;br /&gt;
==== Adressdaten ====&lt;br /&gt;
&lt;br /&gt;
# cat /user_data/home/Applications/addressbook/addressbook.xml &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&amp;lt;!DOCTYPE Addressbook &amp;gt;&amp;lt;AddressBook&amp;gt;&lt;br /&gt;
  &amp;lt;Groups&amp;gt;&lt;br /&gt;
  &amp;lt;/Groups&amp;gt;&lt;br /&gt;
  &amp;lt;Contacts&amp;gt;&lt;br /&gt;
    &amp;lt;Contact&lt;br /&gt;
                                Uid=&amp;quot;-1269720893&amp;quot; &lt;br /&gt;
                         Categories=&amp;quot;-1269431263;-1266109093;-1266109094&amp;quot; &lt;br /&gt;
                          FirstName=&amp;quot;ich&amp;quot; &lt;br /&gt;
                             FileAs=&amp;quot;ich&amp;quot; &lt;br /&gt;
                           JobTitle=&amp;quot;cc&amp;quot; &lt;br /&gt;
                         Department=&amp;quot;dep&amp;quot;&lt;br /&gt;
                            Company=&amp;quot;aa&amp;quot; &lt;br /&gt;
                      BusinessPhone=&amp;quot;55&amp;quot; &lt;br /&gt;
                        BusinessFax=&amp;quot;77&amp;quot; &lt;br /&gt;
                     BusinessMobile=&amp;quot;66&amp;quot; &lt;br /&gt;
                          HomePhone=&amp;quot;55&amp;quot;&lt;br /&gt;
                         HomeMobile=&amp;quot;11&amp;quot; &lt;br /&gt;
                             HomePc=&amp;quot;12&amp;quot;&lt;br /&gt;
                           HomeData=&amp;quot;13&amp;quot;&lt;br /&gt;
                            HomeFax=&amp;quot;14&amp;quot;&lt;br /&gt;
                     BusinessStreet=&amp;quot;street&amp;quot;&lt;br /&gt;
                       BusinessCity=&amp;quot;city&amp;quot;&lt;br /&gt;
                      BusinessState=&amp;quot;state&amp;quot;&lt;br /&gt;
                        BusinessZip=&amp;quot;zip&amp;quot;&lt;br /&gt;
                    BusinessCountry=&amp;quot;country&amp;quot;&lt;br /&gt;
                      BusinessPager=&amp;quot;88&amp;quot;&lt;br /&gt;
                             Office=&amp;quot;office&amp;quot;&lt;br /&gt;
                         Profession=&amp;quot;prof&amp;quot;&lt;br /&gt;
                          Assistant=&amp;quot;ass&amp;quot;&lt;br /&gt;
                            Manager=&amp;quot;man&amp;quot;&lt;br /&gt;
                         HomeStreet=&amp;quot;ptjml&amp;quot;&lt;br /&gt;
                           HomeCity=&amp;quot;cit&amp;quot;&lt;br /&gt;
                          HomeState=&amp;quot;stat&amp;quot;&lt;br /&gt;
                            HomeZip=&amp;quot;zi&amp;quot;&lt;br /&gt;
                        HomeCountry=&amp;quot;coun&amp;quot;&lt;br /&gt;
                             Spouse=&amp;quot;spouse&amp;quot;&lt;br /&gt;
                             Gender=&amp;quot;1&amp;quot;&lt;br /&gt;
                           Birthday=&amp;quot;20100322&amp;quot;&lt;br /&gt;
                        Anniversary=&amp;quot;20100429&amp;quot;&lt;br /&gt;
                           Children=&amp;quot;child&amp;quot;&lt;br /&gt;
                              Notes=&amp;quot;gakm&amp;quot;&lt;br /&gt;
               CompanyPronunciation=&amp;quot;bb&amp;quot;&lt;br /&gt;
                   BUSINESS_CONTACT=&amp;quot;&amp;quot;&lt;br /&gt;
                          photofile=&amp;quot;ci-1269721575-0.jpg&amp;quot;&lt;br /&gt;
                   qdl-private-data=&amp;quot;&amp;quot;&lt;br /&gt;
                               tone=&amp;quot;/usr/local/etc/SystemRingTones/16-Tetris.desktop&amp;quot;&lt;br /&gt;
         /&amp;gt;&lt;br /&gt;
    &amp;lt;Contact Uid=&amp;quot;-1269554029&amp;quot; &lt;br /&gt;
             FirstName=&amp;quot;VoIP&amp;quot; &lt;br /&gt;
             LastName=&amp;quot;Phone1&amp;quot; &lt;br /&gt;
             FileAs=&amp;quot;VoIP Phone1&amp;quot; &lt;br /&gt;
             HomeMobile=&amp;quot;**621&amp;quot;  &lt;br /&gt;
             tone=&amp;quot;/usr/local/etc/SystemRingTones/15-Techno2.desktop&amp;quot;  /&amp;gt;&lt;br /&gt;
    &amp;lt;Contact Uid=&amp;quot;-1269554032&amp;quot; &lt;br /&gt;
             Categories=&amp;quot;-1269431263&amp;quot;&lt;br /&gt;
             FirstName=&amp;quot;VoIP&amp;quot; &lt;br /&gt;
             LastName=&amp;quot;Phone3&amp;quot; &lt;br /&gt;
             FileAs=&amp;quot;VoIP Phone3&amp;quot; &lt;br /&gt;
             HomeMobile=&amp;quot;**623&amp;quot;  &lt;br /&gt;
             BUSINESS_CONTACT=&amp;quot;&amp;quot; &lt;br /&gt;
             qdl-private-data=&amp;quot;&amp;quot; &lt;br /&gt;
             tone=&amp;quot;/usr/local/etc/SystemRingTones/08-Celtrelax.desktop&amp;quot;  /&amp;gt;&lt;br /&gt;
  &amp;lt;/Contacts&amp;gt;&lt;br /&gt;
  &amp;lt;/AddressBook&amp;gt;&lt;br /&gt;
&lt;br /&gt;
UID ist wohl egal, solange sie nicht zweimal vorkommen.&lt;br /&gt;
&lt;br /&gt;
Die Beschränkung auf 500 Adressbucheinträge kann man auch aufheben&lt;br /&gt;
&amp;quot;maxEntries = 500&amp;quot; in der &amp;quot;Contacts.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die Kategorien stehen in /user_settings/Categories.xml:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&amp;lt;!DOCTYPE CategoryList&amp;gt;&lt;br /&gt;
  &amp;lt;Categories&amp;gt;&lt;br /&gt;
    &amp;lt;Category id=&amp;quot;-1269431263&amp;quot; name=&amp;quot;_Personal&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Category id=&amp;quot;-1269431262&amp;quot; name=&amp;quot;_Business&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/Categories&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man einem Kontakt eine bestimmte Kategorie zuordnet, dann wird die ID dieser Kategorie im Attribut &amp;quot;Categories&amp;quot; des Kontakts eingetragen (s.o.). Wenn die Kategorie BUSINESS gewählt wird, steht im Attribut &amp;quot;BUSINESS_CONTACT&amp;quot; eine &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Ein Einrücken der Attribute mit TABs in den Dateien ist übrigens nicht erlaubt!&lt;br /&gt;
&lt;br /&gt;
Die Software des Telefons wertet die XML Datei bei jedem Zugriff neu aus. Es ist also möglich, die Datei im laufendem Betrieb zu ändern (z.B. per Script).&lt;br /&gt;
&lt;br /&gt;
Um VCards in das XML Format zu konvertieren gibts es im Forum folgendes kleines C-Programm: [http://www.mikrocontroller.net/attachment/74583/VCardsToXML.c] [http://www.mikrocontroller.net/attachment/highlight/74583]&lt;br /&gt;
&lt;br /&gt;
==== Fotos &amp;amp; Videoschnappschüsse ====&lt;br /&gt;
&lt;br /&gt;
Alle Bilder die mit der Kamera aufgenommen werden, sowie Schnappschüsse die während eines Videocalls aufgenommen wurden, befinden sich in folgendem Verzeichnis:&lt;br /&gt;
       /user_data/home/Documents&lt;br /&gt;
&lt;br /&gt;
Die Bilder sind dabei nach folgendem Namensschema benannt:&lt;br /&gt;
&lt;br /&gt;
       DD-MM-YYYY-hh:mm:ss.jpg&lt;br /&gt;
&lt;br /&gt;
Tag (DD) und Monat (MM) können auch einstellig sein.&lt;br /&gt;
&lt;br /&gt;
=== Klingeltöne ===&lt;br /&gt;
&lt;br /&gt;
Die Klingeltöne liegen, wie oben beschrieben unter:&lt;br /&gt;
&lt;br /&gt;
/usr/local/etc/SystemRingTones/&lt;br /&gt;
&lt;br /&gt;
Es sind .wav Dateien mit (16Khz, 16Bit, Mono), welche sich z.B. mit MhWaveEdit (Linux/GTK) oder auch Audacity recht komfortabel erzeugen lassen.&lt;br /&gt;
&lt;br /&gt;
Auch .wav Dateien mit 22050Hz werden problemlos abgespielt (ein wenig bessere Qualität als 16000hz) und sind als Klingeltöne nutzbar. Dateien mit 44100Hz spielt es leider nur &#039;ruckelnd&#039; ab (32000Hhz nicht getestet).&lt;br /&gt;
&lt;br /&gt;
Zusätzlich zu den Audio Dateien müssen noch im selben Verzeichnis entsprechende *.desktop dateien angelegt werden, damit alles korrekt ins Menü integriert wird.&lt;br /&gt;
Eine für den fiktiven 16. Klingelton erzeugte Datei &amp;quot;16-Tetris.desktop&amp;quot; könnte den folgenden Inhalt haben:&lt;br /&gt;
&lt;br /&gt;
                 [Desktop Entry]&lt;br /&gt;
                 Categories =&lt;br /&gt;
                 File =16-Tetris.wav&lt;br /&gt;
                 Name[] =16-Tetris&lt;br /&gt;
                 Type = audio/x-wav&lt;br /&gt;
                 [Translation]&lt;br /&gt;
                 File=QtopiaRingTones&lt;br /&gt;
                 Context=16-Tetris&lt;br /&gt;
&lt;br /&gt;
Nach dem Anlegen der Dateien sollte sie dann im Menü auftauchen und auswählbar sein.&lt;br /&gt;
&lt;br /&gt;
=== Systemtöne ===&lt;br /&gt;
&lt;br /&gt;
*Sämtliche Systemtöne liegen unter &#039;&#039;/usr/local/sounds/&#039;&#039; und lassen sich problemlos durch andere Dateien ersetzen.&lt;br /&gt;
*z.B.:&lt;br /&gt;
**&#039;&#039;charge.wav&#039;&#039; - Ton, wenn Gerät in die Basisstation gesetzt wird&lt;br /&gt;
&lt;br /&gt;
=== Timeserver ===&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/topic/170483#1645101&lt;br /&gt;
Unter /usr/local/data steht in der monitor.cfg und monitor_ref_KPN.cfg&lt;br /&gt;
die Adressen der Zeitserver &amp;quot;ntp.xs4all.nl&amp;quot; und &amp;quot;130.142.110.71&amp;quot;. Diese&lt;br /&gt;
könnte man z.B. auf &amp;quot;ptbtime1.ptb.de&amp;quot; und &amp;quot;ptbtime2.ptb.de&amp;quot; ändern.&lt;br /&gt;
&lt;br /&gt;
(http://www.mikrocontroller.net/topic/170483#1649594)&lt;br /&gt;
das telefon benutzt *nicht ntp* sondern das time-protokoll auf port 37 -&lt;br /&gt;
time.fu-berlin.de (bzw. chronos.zedat.fu-berlin.de) kann man als server nehmen.&lt;br /&gt;
&lt;br /&gt;
vi Tipp hilfe:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
vi /usr/local/data/monitor.cfg&lt;br /&gt;
:%s/ntp.xs4all.nl/time.fu-berlin.de/g&lt;br /&gt;
:%s/130.142.110.71/130.133.1.10/g&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufgefallen ist, dass sich Telefone mit fest eingestellter IP nicht automatisch&lt;br /&gt;
die Uhrzeit abrufen. Stellt man das Telefon auf DHCP, stellt sich die Uhr&lt;br /&gt;
auch ohne Timeserver Modifikation auf die richtige Uhrzeit ein.&lt;br /&gt;
&lt;br /&gt;
Wer lieber einen NTP-Client einsetzen möchte findet unter dem Link für [[#Weitere_Konsolenkommandos]] ein Paket mit ntpd oder auch ntpdate für den schnellen Zeitabgleich via Konsole:&lt;br /&gt;
    ntpdate pool.ntp.org&lt;br /&gt;
&lt;br /&gt;
=== Zusätzliche Software ===&lt;br /&gt;
==== Dropbear (SSH-Server) installieren ====&lt;br /&gt;
&lt;br /&gt;
# Mit telnet auf dem Gerät einloggen&lt;br /&gt;
# folgendes in die Kommandozeile kopieren&lt;br /&gt;
       cd /&lt;br /&gt;
       wget http://www.mikrocontroller.net/attachment/74656/dropbear.tgz&lt;br /&gt;
       tar -xzf dropbear.tgz&lt;br /&gt;
       rm dropbear.tgz&lt;br /&gt;
       cd /etc/rc.d/init.d&lt;br /&gt;
       mv dropbear S90dropbear&lt;br /&gt;
       ./S90dropbear start&lt;br /&gt;
Das Kommando in Zeile 6 (mv ...) ist notwendig damit dropbear bei jedem Reboot automatisch gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Prüfen ob dropbear gestartet ist und läuft:&lt;br /&gt;
  # ps&lt;br /&gt;
  PID  Uid     Stat Command&lt;br /&gt;
  136 root     S    /usr/sbin/dropbear&lt;br /&gt;
&lt;br /&gt;
Bei jedem Login sucht dropbear nach der /var/log/lastlog, daher sollte man abschließend noch ein&lt;br /&gt;
&lt;br /&gt;
       touch /var/log/lastlog&lt;br /&gt;
&lt;br /&gt;
machen, um diese Datei anzulegen. Damit verschwinden auch die entsprechenden Fehlermeldungen im logread.&lt;br /&gt;
&lt;br /&gt;
==== Nano 2.2.3 installieren ====&lt;br /&gt;
&lt;br /&gt;
* Mit telnet auf dem Gerät einloggen&lt;br /&gt;
* folgendes in die Kommandozeile kopieren&lt;br /&gt;
       cd /usr/bin&lt;br /&gt;
       wget http://www.mikrocontroller.net/attachment/74023/nano&lt;br /&gt;
* Mit folgendem Befehl den Editor ausführbar machen:&lt;br /&gt;
       chmod +x /usr/bin/nano&lt;br /&gt;
* Nun ist vi Geschichte ;-)&lt;br /&gt;
&lt;br /&gt;
Ggf. kann der Fehler &amp;quot;Error opening terminal: xterm-color&amp;quot; auftreten wenn nano gestartet wird, in diesem Fall hilft folgendes:&lt;br /&gt;
&lt;br /&gt;
* /root/.bashrc öffnen (mit vi :-)&lt;br /&gt;
* &amp;quot;export TERM=xterm&amp;quot; in die Datei schreiben&lt;br /&gt;
* ausloggen / einloggen&lt;br /&gt;
&lt;br /&gt;
==== OpenVPN 2.0.9 installieren ====&lt;br /&gt;
&lt;br /&gt;
* Mit telnet auf dem Gerät einloggen&lt;br /&gt;
* folgendes in die Kommandozeile kopieren&lt;br /&gt;
       cd /&lt;br /&gt;
       wget http://www.mikrocontroller.net/attachment/74380/openvpn.tar.gz&lt;br /&gt;
       tar -xzf openvpn.tar.gz&lt;br /&gt;
       depmod&lt;br /&gt;
       mknod /dev/net/tun c 10 200&lt;br /&gt;
&lt;br /&gt;
==== OpenVPN 2.1.1 installieren ====&lt;br /&gt;
&lt;br /&gt;
* Mit telnet auf dem Gerät einloggen&lt;br /&gt;
* folgendes in die Kommandozeile kopieren&lt;br /&gt;
       cd /&lt;br /&gt;
       wget http://www.mikrocontroller.net/attachment/74395/openvpn-2.1.1.tar.gz&lt;br /&gt;
       tar -xzf openvpn-2.1.1.tar.gz&lt;br /&gt;
       depmod&lt;br /&gt;
       mknod /dev/net/tun c 10 200&lt;br /&gt;
&lt;br /&gt;
==== Tinc 1.0.12 installieren ====&lt;br /&gt;
&lt;br /&gt;
* Mit telnet auf dem Gerät einloggen&lt;br /&gt;
* folgendes in die Kommandozeile kopieren&lt;br /&gt;
       cd /&lt;br /&gt;
       wget http://www.mikrocontroller.net/attachment/74396/tinc-1.0.12.tar.gz&lt;br /&gt;
       tar -xzf tinc-1.0.12.tar.gz&lt;br /&gt;
       depmod&lt;br /&gt;
       mknod /dev/net/tun c 10 200&lt;br /&gt;
&lt;br /&gt;
==== Weitere Konsolenkommandos ====&lt;br /&gt;
&lt;br /&gt;
Auf http://thinksilicon.de/57/Hacking-the-VP6500.html finden sich einige nützliche Konsolentools. Darunter sind bc, lsof, file, curl, mc (bzw. mcedit), hexedit, mktemp, rsync, tcpdump, crond (mit crontab) und ntpd.&lt;br /&gt;
* Hinweis zu tcpdump; muss folgendermaßen ausgeführt werden:&lt;br /&gt;
       tcpdump -U root&lt;br /&gt;
&lt;br /&gt;
=== simpler WLAN-Switcher ===&lt;br /&gt;
&lt;br /&gt;
Ohne tiefer gehende GUI-Programmiererfahrungen bei Qtopia zu haben, kann man sich mit folgendem WLAN-Switcher behelfen:&lt;br /&gt;
&lt;br /&gt;
Im Script /user_data/prod/config_ats.sh stehen viele Befehle, wie man mittels &#039;&#039;config code&#039;&#039; Einstellungen vorschreiben kann. Dies habe ich mir mit folgenden eigenen Scripten zu nutze gemacht:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;/root/switch_wlan.sh&#039;&#039;&#039;&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 #================================================&lt;br /&gt;
 # WLAN-Switcher&lt;br /&gt;
 #================================================&lt;br /&gt;
 &lt;br /&gt;
 CONFIG_CODE=`cat /user_data/config_code.txt`&lt;br /&gt;
 &lt;br /&gt;
 cp -f /usr/local/data/wpa_supplicant_ref_${CONFIG_CODE}.conf /user_data/wifi/wpa_supplicant.conf&lt;br /&gt;
&lt;br /&gt;
* kopiert Anhand des &#039;&#039;config code&#039;&#039;s die wpa_supplicant.conf&lt;br /&gt;
* es muss für jeden &#039;&#039;config code&#039;&#039; eine wpa_supplicant_ref_&amp;lt;&#039;&#039;config code&#039;&#039;&amp;gt;.conf vorhanden sein, am besten dazu die aktuelle /user_data/wifi/wpa_supplicant.conf dorthin kopieren&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;/root/set_config_code.sh&#039;&#039;&#039;&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 echo &amp;quot;$1&amp;quot; &amp;gt; /user_data/config_code.txt&lt;br /&gt;
&lt;br /&gt;
* schreibt den ersten übergebenen Parameter in die Datei /user_data/config_code.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;/usr/local/bin/set2XXX&#039;&#039;&#039;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 /root/set_config_code.sh XXX&lt;br /&gt;
 /root/switch_wlan.sh&lt;br /&gt;
 reboot&lt;br /&gt;
&lt;br /&gt;
* XXX durch den &#039;&#039;config code&#039;&#039; ersetzen&lt;br /&gt;
* Script, welches als Applikation gestartet wird&lt;br /&gt;
* derzeit leider keine &amp;quot;on-the-fly&amp;quot;-Eingabe des &#039;&#039;config code&#039;&#039;s möglich, daher muss für jedes WLAN ein Script vorhanden sein&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;/usr/local/apps/Applications/set2YYY.desktop&#039;&#039;&#039;&lt;br /&gt;
 [Translation]&lt;br /&gt;
 File=QtopiaApplications&lt;br /&gt;
 Context=set2XXX&lt;br /&gt;
 [Desktop Entry]&lt;br /&gt;
 Exec=set2XXX&lt;br /&gt;
 Icon=Camera&lt;br /&gt;
 Type=Application&lt;br /&gt;
 Name[]=Enable YYY&lt;br /&gt;
&lt;br /&gt;
* XXX durch den &#039;&#039;config code&#039;&#039; ersetzen (gleicher Scriptname wie oben)&lt;br /&gt;
* YYY durch einmaligen Namen ersetzen&lt;br /&gt;
* Diese Datei erscheint unter dem Name[] im Applications-Menü&lt;br /&gt;
&lt;br /&gt;
Theoretisch kann man mit dieser Methode auch problemlos zwischen mehreren SIP-Einstellungen und vielen weiteren Telefoneinstellungen umschalten (siehe Dateien in /usr/local/data) - der DemoMode funktioniert nach dem gleichen Prinzip.&lt;br /&gt;
&lt;br /&gt;
== Buildumgebung erstellen ==&lt;br /&gt;
&lt;br /&gt;
Bislang ist die Erstellung von GUI-Applikationen (QTopia) noch nicht auf einfache Weise möglich. Das größte Problem ist, dass der Quellcode der Video-Telefon-Anwendung zum größten Teil zur Verfügung steht. Das Erstellen von Kommandozeilen-Anwendungen geht aber schon problemlos.&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
Die verwendete ARM-Entwicklungsumgebung basiert auf gcc. Mittels cygwin kann diese zwar auch als Win32-Anwendungen gebaut werden, dies ist aber in hohem Maß unüblich.&lt;br /&gt;
&lt;br /&gt;
Am besten eine aktuelle Version von Debian oder Ubuntu in &amp;quot;vmware player&amp;quot; oder &amp;quot;virtual box&amp;quot; installieren. Wenn man die virtuelle Maschine nur zum Compilieren verwendet, reicht eine kompakte Kommandozeilen-Version (z.B. Ubuntu Server 9.10). Fertige virtuelle Machinen, im vmware-Marketing-Sprech gerne auch &amp;quot;virtual appliances&amp;quot; genannt, sind reichlich verfügbar (z.B. http://www.vmware.com/appliances/directory/70918).&lt;br /&gt;
&lt;br /&gt;
=== Freetz-Linux ===&lt;br /&gt;
Für Fritzbox-Besitzer besonders geeignet ist das Freetz-linux, welches man im IP-Phone-Forum finden kann (-&amp;gt; http://www.ip-phone-forum.de/showpost.php?p=1400234&amp;amp;postcount=1).&lt;br /&gt;
Dieses kann zum Erstellen von Freetz-Images einerseits und andererseits als Buildumgebung benutzt werden. So spart man sich eine zweite VM.&lt;br /&gt;
&lt;br /&gt;
Die VM selbst braucht nur gestartet werden, den Rest macht man am Besten von seiner gewohnten Umgebung aus.&lt;br /&gt;
Mittels Samba kann einfach per Windowsnetzwerk auf das Home-Verzeichnis zugriffen werden und per SSH kann einfach eine Shell (UTF als Codierung einstellen, dann stimmen auch die Sonderrzeichen) geöffnet werden.&lt;br /&gt;
Es muss sichergestellt werden sein, dass die VM zugriff auf das lokale Netzwerk, sowie das Internet hat (am besten mit einem &#039;ping google.com&#039; überprüfen). Bei mir ging es eigenartiger weise erst, als ich die virtuelle Netzwerkkarte in den VM-Settings auf NAT gestellt habe.&lt;br /&gt;
&lt;br /&gt;
Benutzername und alle Kennwörter sind &#039;freetz&#039;&lt;br /&gt;
&lt;br /&gt;
==== Installation und Test der VP5500 Toolchain ====&lt;br /&gt;
Installation der Buildumgebung:&lt;br /&gt;
  sudo mkdir -p /opt/VP5500/toolchain&lt;br /&gt;
  cd /opt/VP5500/toolchain&lt;br /&gt;
  sudo wget http://www.handhelds.org/download/projects/toolchain/arm-linux-gcc-3.3.2.tar.bz2&lt;br /&gt;
  sudo tar xjf arm-linux-gcc-3.3.2.tar.bz2&lt;br /&gt;
  sudo rm arm-linux-gcc-3.3.2.tar.bz2&lt;br /&gt;
  sudo ln -s /opt/VP5500/toolchain/usr/local/arm /usr/local/arm&lt;br /&gt;
&lt;br /&gt;
Nach einem sudo-Kommando muss eventuell das Passwort eingegeben werden, weswegen die Befehle einzeln eingegeben werden sollten (oder man öffnet am Anfang eine sudo shell, dann kann man das auch weglassen.&lt;br /&gt;
&lt;br /&gt;
Test der Buildumgebung:&lt;br /&gt;
  cd ~&lt;br /&gt;
  wget http://www.mikrocontroller.net/attachment/73161/helloworld.tgz&lt;br /&gt;
  tar -xzf helloworld.tgz&lt;br /&gt;
  rm helloworld.tgz&lt;br /&gt;
  cd helloworld&lt;br /&gt;
  make&lt;br /&gt;
Dannach sollte im ~/helloworld verzeichnis ein neues executable liegen, was vom Hostrechner einfach via Netzwerkfreigabe (\\freetz-linux\helloworld) und via WinSCP auf das Telefon kopiert werden kann.&lt;br /&gt;
&lt;br /&gt;
==== Freetz-Linux eigentlicher Anwendungszweck ====&lt;br /&gt;
wer das Ding auch zum Bauen von Freetz-Images zum Erweitern seiner Fritz-box benutzen will muss sich zuerst ein Freetz runterladen.&lt;br /&gt;
Folgende Schritte machen dies:&lt;br /&gt;
 cd ~&lt;br /&gt;
 svn checkout  http://svn.freetz.org/trunk  freetz-trunk &lt;br /&gt;
Dannach gibts im Home-Verzeichnis das aktuelle Freetz im Verzeichnis &#039;freetz-trunk&#039;.&lt;br /&gt;
Konfigurieren mit &#039;make menuconfig&#039; und Image erstellen mit &#039;make&#039;.&lt;br /&gt;
Wenn alles gut geht kann man das image dann vom Hostrechner aus der Windowsfreigabe &#039;\\freetz-linux\freetz-trunk\images&#039; rausholen und auf die Box spielen.&lt;br /&gt;
&lt;br /&gt;
Für detailiertere Infos bitte direkt bei Freetz nachschlagen:&lt;br /&gt;
http://trac.freetz.org/&lt;br /&gt;
&lt;br /&gt;
=== Linux ===&lt;br /&gt;
Die bisher bekannten, mit VP5500 und VP6500 ausgelieferten Software-Versionen, basieren auf einer etwas älteren &amp;quot;gcc 3.3.2-ARM-Toolchain&amp;quot;. Eine passende Toolchain für ein x86-basiertes Entwicklungssystem ist unter http://www.handhelds.org/download/projects/toolchain/arm-linux-gcc-3.3.2.tar.bz2 zu finden.&lt;br /&gt;
&lt;br /&gt;
Unter Debian-basierten Linux-Distros kann dieses Archiv z.B. nach /opt/VP5500/toolchain entpackt werden (einige der Makefiles im Forum setzen diesen Speicherort voraus). Es ist jedoch zu beachten, dass diese Version der Toolchain auch über den Pfad /usr/local zugänglich sein sollte. Dazu kann mittels &amp;quot;ln -s /opt/VP5500/toolchain/usr/local/arm arm&amp;quot; in /usr/local ein Symlink auf den eigentlichen Speicherort gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
==== Hello World ====&lt;br /&gt;
Christian Klippel (ChrisK) hat unter http://www.mikrocontroller.net/attachment/73161/helloworld.tgz ein &amp;quot;Hello World&amp;quot; bereitgestellt, mit dem sich die Toolchain testen lässt und dessen &amp;quot;Makefile&amp;quot; und &amp;quot;Makefile.local&amp;quot; als Grundlage für eigene Versuche dienen kann.&lt;br /&gt;
&lt;br /&gt;
Das Archiv wird in ein lokals Verzeichnis (z.b. ~/helloworld) entpackt und dort durch Eingabe von &amp;quot;make&amp;quot; compiliert.&lt;br /&gt;
     &lt;br /&gt;
Zum Testen muss das Binary natürlich auf das Zielsystem übertragen werden. Wenn auf dem Entwicklungssystem ein http-Server oder ein ssh-Server läuft, kann man das Binary einfach in ein darüber zugängliches Verzeichnis kopieren es anschließend in einer telnet-Sitzung vom Verzeichnis /tmp aus mittels wget oder scp laden. Zum Test muss die Datei mittels &amp;quot;chmod +x helloworld&amp;quot; ausführbar gemacht werden, bevor sie mit &amp;quot;./helloworld&amp;quot; ausgeführt werden kann.&lt;br /&gt;
&lt;br /&gt;
Mittels eines ftpd (z.B. http://www.mikrocontroller.net/attachment/73780/troll-ftpd_1.28-cg2_arm.tgz) oder sshd (z.B. Dropbear von http://vp6500.bd8.nl/) auf dem Zielsystem, kann man das Kopieren auch vom Entwicklungssystem aus durchführen.&lt;br /&gt;
&lt;br /&gt;
==== Anpassen kleinerer Konsolen-Tools auf Cross-Compilierung ====&lt;br /&gt;
Die Makefiles von kleineren Projekten sind häufig nicht so sauber aufgebaut wie das helloworld-Beispiel, so dass man sie leichter ersetzt, als ändert. Am Beispiel von micro_httpd (http://www.acme.com/software/micro_httpd/ , http://www.mikrocontroller.net/attachment/73175/micro_httpd.tar.gz) kann leicht nachvollzogen werden, wie man den modularen Ansatz vom &amp;quot;Hello World&amp;quot;-Beispiel übernehmen kann (Makefile -&amp;gt; Makefile + Makefile.local).&lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
&lt;br /&gt;
== Hardware  + Software Versionen ==&lt;br /&gt;
&lt;br /&gt;
Listet mal eure Hardware- und Softwareversion aus dem &#039;&#039;&#039;Applications&#039;&#039;&#039; =&amp;gt; &#039;&#039;&#039;System Info&#039;&#039;&#039; Menü auf, wenn sie hier noch nicht stehen!&lt;br /&gt;
&lt;br /&gt;
=== VP5500 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Hardware Version             !! Date     !! Software Version   &lt;br /&gt;
|- &lt;br /&gt;
| ind5                         ||0645      || 4.20&lt;br /&gt;
|- &lt;br /&gt;
| ind5                         ||0647      || 4.20&lt;br /&gt;
|-&lt;br /&gt;
| ind5                         ||0648      || 4.20&lt;br /&gt;
|-&lt;br /&gt;
| ind5                         ||0649      || 4.20&lt;br /&gt;
|-&lt;br /&gt;
| ind5                         ||0702      || 4.20&lt;br /&gt;
|-&lt;br /&gt;
| ind5                         ||0703      || 4.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== VP6500 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Hardware Version             !! Date     !! Software Version   &lt;br /&gt;
|-&lt;br /&gt;
| ind3-v2                      || 0711     || 3.22&lt;br /&gt;
|-&lt;br /&gt;
| ind3-v2                      || 0713     || 3.22&lt;br /&gt;
|- &lt;br /&gt;
| ind3-v2                      || 0716     || 3.22&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Wünsche und Nutzungsideen =&lt;br /&gt;
&lt;br /&gt;
Wer was äußern möchte, kann das hier reintippeln, zwecks Bündelung Interessen und Kräfte. Muss ja keiner das Rad 3x erfinden und man kann schaun was der ein oder andere macht.&lt;br /&gt;
Eine Status und Kontaktangabe bei Sachen die in Arbeit sind wäre toll.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
* Audiostream-Player&lt;br /&gt;
* MP3&lt;br /&gt;
** madplay gibt es [http://www.mikrocontroller.net/topic/172616#1704777 hier], der automatische Stromsparmodus stört aber noch&lt;br /&gt;
* Browser und sei es nur für Wikipedia und Google&lt;br /&gt;
* Mailclient&lt;br /&gt;
* T9 Unterstützung bei Texteingabe&lt;br /&gt;
* Skypebenutzung&lt;br /&gt;
* Nutzungsmöglichkeit als Wireless-Webcam&lt;br /&gt;
* WLAN-Repeater&lt;br /&gt;
** besser: [http://freifunk.net Freifunk-] bzw. [http://www.olsr.org OLSR-Daemon]&lt;br /&gt;
* Wecker&lt;br /&gt;
* Voice-Crypto&lt;br /&gt;
* Unterstützung von mehreren WLAN Profilen, damit man das Gerät an mehreren APs betreiben kann ohne jedesmal SSID / Key neu eingeben zu müssen. (Sollte durch mehrere Einträge in der wpa_supplicant.conf möglich sein. Diese wird aber bei Änderungen über&#039;s Menü komplett überschrieben. Alternative: [[#simpler WLAN-Switcher]])&lt;br /&gt;
* Unterstützung von mehreren SIP Profilen, um z.b. von einem SIP-Anbieter auf den anderen zu wechseln. Ideal wäre, wenn man 2 SIP Profile gleichzeitig nutzen könnte&lt;br /&gt;
* YouTube Client, vgl. mit &amp;quot;MiniTube Linux&amp;quot;&lt;br /&gt;
* &#039;ne aktuelle Firmware? z.B: mit 2.6er Kernel und Android?&lt;br /&gt;
* Unterstützung für WLANs mit 802.1x die WPA2 verschlüsselt sind reparieren bzw. passende Konfig finden (unverschlüsselt geht schon)&lt;br /&gt;
&lt;br /&gt;
== Hardwarerweiterungen ==&lt;br /&gt;
&lt;br /&gt;
* Speichererweiterung&lt;br /&gt;
* USB Anschluss&lt;br /&gt;
* Blauzahn&lt;br /&gt;
* zusätzlicher Anschluss um eine andere Videokamera anzuschließen mit CINCH&lt;br /&gt;
&lt;br /&gt;
== Nutzungsideen ==&lt;br /&gt;
&lt;br /&gt;
* VoIP Phone und Webcam (nahliegend)&lt;br /&gt;
* WLAN-Finder&lt;br /&gt;
* Repeater&lt;br /&gt;
* mobiles Infogerät mit Wikizugriff und Mailpush in der Wireless-Bubble&lt;br /&gt;
* Türöffner, Ferncontroller&lt;br /&gt;
* Robohirn&lt;br /&gt;
* WLAN-Radio&lt;br /&gt;
* Video(Streaming)-Client in Verbindung mit VDR&lt;br /&gt;
* Barcode-Reader&lt;br /&gt;
* als Fernbedienung für PC (Winamp/Mediaplayer/VLC...&lt;br /&gt;
* Streamclient und Fernbedienung für DBOX2 mit Linux&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Projekte]]&lt;br /&gt;
[[Kategorie:Datenübertragung]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Kategorie:Forum&amp;diff=77656</id>
		<title>Kategorie:Forum</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Kategorie:Forum&amp;diff=77656"/>
		<updated>2013-07-20T07:18:51Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Änderung 77655 von 111.243.243.66 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Receiver-Mainboard_Plattform_Philips_PNX8950&amp;diff=77638</id>
		<title>Receiver-Mainboard Plattform Philips PNX8950</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Receiver-Mainboard_Plattform_Philips_PNX8950&amp;diff=77638"/>
		<updated>2013-07-18T20:28:41Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Änderung 77637 von 137.175.105.34 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Wichtige Links =&lt;br /&gt;
Hier nur die wichtigsten Links (Hauptdiskussionsthread und andere Wikis), den Rest unter &amp;quot;weitergehende Infos im Netz&amp;quot;&lt;br /&gt;
* Diskussionsthread [http://www.mikrocontroller.net/topic/210759 Pollin - Receiver-Mainboard mit Twin DVB-T/C Tuner, NXP PNX8950EH]&lt;br /&gt;
&lt;br /&gt;
* Bedienungsanleitung [http://www1.medion.de/downloads/download.pl?lang=de&amp;amp;filename=bda_md29052_de.pdf&amp;amp;id=7946&amp;amp;type=anleitungen MEDION LIFE S27200 - MD 29052]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Wichtiger Hinweis =&lt;br /&gt;
&amp;lt;span style=&amp;quot;background-color:red;color:white;font-weight:bold&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Vor dem Arbeiten an der Platine oder Öffnen des Gehäuses ist der Netzstecker (230V) zu ziehen. Denn: Der Kühlkörper (des Netzteils) führt eine Spannung von 115V!!!&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Betriebssysteme =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Bestehenden Inhalt aus dem Flash auslesen ==&lt;br /&gt;
&lt;br /&gt;
Von User AgentData wird freundlicherweise die [http://www.mikrocontroller.net/attachment/106071/complete_nand_layout.rar Erklärung sowie der Source für den Dumper] zur Verfügung gestellt. Im Ergebnis bekommt man dafür die Original Firmware-Dateien und kann so den Lieferzustand jederzeit wieder herstellen. Der für den direkten Zugriff auf das NAND benötigte Code befindet sich übrigens in der Datei /Windows/TmToolbox.dll (read/write/erase).&lt;br /&gt;
&lt;br /&gt;
== Neues Firmware-Image installieren ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Der Flashvorgang der Box besitzt keine Sicherung - da offenbar erst der Speicher gelöscht und dann neu geschrieben wird führt ein Stromausfall während des Vorgangs zu einem formschönen Ziegelstein.&lt;br /&gt;
&lt;br /&gt;
# Auf einen mit FAT32 formatierten USB-Stick folgende Dateien kopieren: &lt;br /&gt;
:* flashing.txt&lt;br /&gt;
:* phStbRootApp_256M_0_t.mi&lt;br /&gt;
:* phStbRootApp_256M_1_t.mi&lt;br /&gt;
:* WinCe1.nb0 &lt;br /&gt;
:Die Dateien befinden sich z.B. im Ordner WCE1 der Datei swu.zip&lt;br /&gt;
# Receiver ausschalten (Wippschalter auf der Geräterückseite)&lt;br /&gt;
# SW1 auf ON (DIL Schalter auf Pollin Board)&lt;br /&gt;
# USB-Stick am USB-Port auf der Geräterück- oder Vorderseite des Receivers anschließen&lt;br /&gt;
# Receiver einschalten (Wippschalter auf der Geräterückseite)&lt;br /&gt;
# Auf der Fernbedienung auf Power drücken. Bei einer Fehlermeldung auf dem Bildschirm kann Folgendes probiert werden:&lt;br /&gt;
:* Anderer USB Stick (oder eine SD-Karte mit Reader)&lt;br /&gt;
:* Bei der Nutzung eines IDE/SATA-Adapters muss die Festplatte via Jumper als Master gesetzt sein, um erkannt zu werden&lt;br /&gt;
:* Die Fehlermeldung &amp;quot;ERROR writing update software. Please power cycle the box to try again&amp;quot; zeigt ein fehlerhaftes Image an.&lt;br /&gt;
Wenn alles funktioniert, erscheint eine Anzeige auf dem Bildschirm, dass das Update durchgeführt wird und man den Receiver nicht ausschalten soll, bis das Update eingespielt ist. Falls irgendetwas falsch läuft, startet das Windows CE und zeigt den Telegen-Desktop. Dann nochmal alles überprüfen.&lt;br /&gt;
# Auf dem roten, 4-stelligen Frontdisplay der Box wird nun für die insgesamt 4 Flash-Vorgänge jeweils der Fortschritt in Prozent angezeigt. Achtung: Es werden insgesamt 4 Dateien einzeln geflasht, die Prozentzahl klettert also vier Mal bis auf 100%.&lt;br /&gt;
# Nach kurzer Zeit (1 oder 2 Minuten) erscheint eine Meldung, dass das Software-Update erfolgreich war&lt;br /&gt;
# Receiver ausschalten (Wippschalter auf der Geräterückseite)&lt;br /&gt;
# SW1 auf OFF setzen. &lt;br /&gt;
&lt;br /&gt;
Nun wird die Box beim Einschalten auf dem TV einen hin- und herwandernden roten Balken zeigen. Die weiteren Programmpunkte sind selbsterklärend.&lt;br /&gt;
&lt;br /&gt;
== WindowsCE (Original) ==&lt;br /&gt;
&lt;br /&gt;
*Windows CE 5.0&lt;br /&gt;
*Windows CE Kernel for MIPS (Built on Mar 29 2005 at 14:00:54)&lt;br /&gt;
*Telegent Kernel V0.9.3.16 (Built on Sep  4 2006 at 22:23:55)&lt;br /&gt;
&lt;br /&gt;
Mit aktiver More.tv Firmware oder bei Err0 während der Flashversuche führt der einfachste Weg zurück zum Auslieferungszustand über das &amp;lt;u&amp;gt;[http://www.mikrocontroller.net/attachment/111731/reflash_wince.rar Reflash-Attachment aus dem Forum]&amp;lt;/u&amp;gt;.&lt;br /&gt;
Kurzgefasst: Box aus; DIP Schalter 1 auf ON stellen; Dateien (im Wurzelverzeichnis auf Fat32) per USB Speicher in die Box einstecken; Box per Fernbedienung und &amp;lt;u&amp;gt;nicht&amp;lt;/u&amp;gt; per Taster auf Frontseite einschalten. Wenn alle &amp;lt;u&amp;gt;vier&amp;lt;/u&amp;gt; Flashdurchänge abgeschlossen sind die Box ausschalten und den DIP-Schalter auf Off zurückstellen.&lt;br /&gt;
&lt;br /&gt;
Das oben genannte Attachment enthält folgendes:&lt;br /&gt;
* WinCe0.nb0&lt;br /&gt;
* WinCe1.nb0&lt;br /&gt;
* phStbRootApp_256M_0_t.mi&lt;br /&gt;
* phStbRootApp_256M_1_t.mi&lt;br /&gt;
* flashme.exe&lt;br /&gt;
* flashing.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
User AgentData hat [https://www.mikrocontroller.net/attachment/105978/org_firmware_dump.rar das im Auslieferungszustand auf dem Gerät befindliche WindowsCE] ausgelesen (siehe hierzu [http://www.mikrocontroller.net/articles/Receiver-Mainboard_Plattform_Philips_PNX8950#Bestehenden_Inhalt_aus_dem_Flash_auslesen Inhalt aus dem Flash auslesen]). Dadurch kann beispielsweise eine [http://www.mikrocontroller.net/articles/Receiver-Mainboard_Plattform_Philips_PNX8950#MoreTv_als_Medion_gelabelt mit MoreTV &amp;quot;aktualisierte&amp;quot;] Box nun auch wieder in den Auslieferungszustand zurückversetzt werden. Die [http://www.mikrocontroller.net/articles/Receiver-Mainboard_Plattform_Philips_PNX8950#Neues_Firmwareimage_installieren Update-Prozedur] ist identisch.&lt;br /&gt;
&lt;br /&gt;
Screenshot der Windows CE 5.0 Oberfläche (über VNC mit der Box verbunden http://efonvnc.sourceforge.net/)&lt;br /&gt;
&lt;br /&gt;
[[Datei:CEscreenshot.png]]&lt;br /&gt;
&lt;br /&gt;
== MoreTv als Medion gelabelt ==&lt;br /&gt;
&lt;br /&gt;
Die MoreTV-Firmware stammt aus Receivern, welche u.A. von Medion verkauft wurden. Sowohl DVB-T als auch DVB-C werden unterstützt, bei letzterem jedoch kein QAM256. Die Funktionen umfassen EPG, PIP, Timergesteuerte- und Sofortaufnahmen sowie Timeshift.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein großes Danke gilt den Benutzern Fritz und M. W.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Verwendete Soft- und Hardware&lt;br /&gt;
# Festplatte SATA-Anschluss, 160GB oder mehr (im Original 250GB), Formatierung s.u.&lt;br /&gt;
# USB-Stick, FAT32 formatiert&lt;br /&gt;
# Software-Archiv: [http://www.mikrocontroller.net/attachment/105209/swu.zip Archiv] (Forum, ZIP) &#039;&#039;&#039;oder&#039;&#039;&#039; [http://www.mikrocontroller.net/wikifiles/b/b7/Swu.part1.rar Teil 1] [http://www.mikrocontroller.net/wikifiles/2/26/Swu.part2.rar Teil 2] (Wiki, 2 Teile, 10% Recovery-Informationen, RAR).&lt;br /&gt;
&lt;br /&gt;
Ein Hinweis&lt;br /&gt;
:Beim Start der Box ohne Modifikation wird WindowsCE gestartet und kann mittels USB-Maus und Tastatur bedient werden. Nach erfolgtem Flash-Vorgang ist dies nicht mehr möglich. Ohne Festplatte läuft die MoreTV-Software nicht - es erscheint nur ein Startbalken, da ein Teil der Software von der Festplatte geladen wird! Ein Sendersuchlauf sollte direkt nach dem Werksreset durchgeführt werden, da ein nachträglicher Suchlauf zwar Sender findet diese jedoch scheinbar nicht korrekt gespeichert werden (kein Signal) - ein manuelles Hinzufügen der Sender funktioniert jedoch.&lt;br /&gt;
&lt;br /&gt;
Hier nun die Kurzanleitung zum &#039;Tuning&#039;&lt;br /&gt;
* USB-Stick vorbereiten&lt;br /&gt;
:Den Inhalt des Ordner WCE1, aus der Datei [http://www.mikrocontroller.net/attachment/105209/swu.zip] (SWU_Finland_V1.0.3.454), auf einen formatierten USB-Stick (FAT32) kopieren und wie [http://www.mikrocontroller.net/articles/Receiver-Mainboard_Plattform_Philips_PNX8950#Neues_Firmware-Image_installieren hier] beschrieben installieren.&lt;br /&gt;
&lt;br /&gt;
* Festplatte vorbereiten&lt;br /&gt;
:# Auf der einzubauenden Festplatte eine erweiterte Partition mit zwei logischen Laufwerken mit FAT32-Dateisystem anlegen. Mit dem kostenlosen Windows Programm &amp;quot;[http://www.easeus.com/download.htm EASEUS Partition Master 8.0.1 Home Edition]&amp;quot; lassen sich die Partitionen leicht anlegen, unter Linux ist FAT32 im Programm fdisk übrigens der Typ &#039;b&#039;. &lt;br /&gt;
:# Auf das erste logische Laufwerk (minimum 2GB, im Original 19,53GB, das entspricht exakt 20000MB) den gesamten Inhalt des zuvor ausgepackten [https://www.more.tv/softwareupdate/SWU_Finland/SWU_Finland_V1.0.3.454/swu.zip SoftWareUpdates] kopieren.&lt;br /&gt;
:# Die Ordner moreTV&#039;&#039;&#039;n&#039;&#039;&#039; und moreTV&#039;&#039;&#039;n&#039;&#039;&#039;.INIT nach &#039;&#039;&#039;moreTV&#039;&#039;&#039; und &#039;&#039;&#039;moreTV.INIT&#039;&#039;&#039; kopieren.&lt;br /&gt;
:# Das zweite logische Laufwerk (je größer desto besser, im Original 213,4GB) bleibt leer.&lt;br /&gt;
&lt;br /&gt;
: Die fehlenden Ordner auf der Festplatte werden beim ersten Starten der Box automatisch angelegt.&lt;br /&gt;
&lt;br /&gt;
ACHTUNG: Die USB-Anschlüsse werden nach der Installation von der MoreTV-Software nicht mehr unterstützt. Eine Ausnahme bildet einzig und alleine das [http://www.mikrocontroller.net/articles/Receiver-Mainboard_Plattform_Philips_PNX8950#Neues_Firmwareimage_installieren Flash-Update].&lt;br /&gt;
USB-Speichersticks und Externe-Festplatten werden zwar noch erkannt und als USBDisk in das Dateisystem eingebunden können aber über die MoreTV-Software nicht angesprochen werden. USB-Keyboard und -Maus werden unter MoreTV nicht mehr erkannt und können auch nicht benutzt werden.&lt;br /&gt;
&lt;br /&gt;
Bei der More.TV-Software ist zu beachten, dass im Forum zwei unterschiedliche Versionen zum Einsatz kommen: Zum Einen die oben genannte Update-Version, welche ursprünglich über den Downloadserver der inzwischen insolventen More.TV frei verfügbar war. Zum Anderen haben einige Mitstreiter den Festplatteninhalt einer original Medion-Box kopiert, diese enthalten eine aktuellere Version welche prinzipiell einige Bugs behebt, jedoch wurde die EPG-Funktion eingeschränkt. Die Versionen lassen sich über das &amp;quot;More&amp;quot;-Menü unterscheiden: Heißt der erste Menüpunkt &amp;quot;Programm&amp;quot; handelt es sich um die Update-Version des More.TV-Servers, die Medion-Version zeigt als ersten Punkt die Beschriftung &amp;quot;EPG&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Zeitzonen-Einstellung ===&lt;br /&gt;
&lt;br /&gt;
Eigentlich sollte sich die Uhrzeit bei richtigem Empfang automatisch einstellen.&lt;br /&gt;
Dies ist nicht immer der Fall, der folgende Trick hat bei DVB-C geholfen (und zumindest Methode 1 auch bei DVB-T).&lt;br /&gt;
&lt;br /&gt;
==== Methode 1: Werksreset/Ländereinstellung ====&lt;br /&gt;
Bei der Ländereinstellung muss Finnland ausgewählt und als PLZ 00100 (Helsinki) eingegeben werden. Dazu  Setup-&amp;gt;Sonstiges-&amp;gt;Werkseinstellung  aufrufen. Natürlich sind dann alle Einstellungen (Programme) neu einzustellen.&lt;br /&gt;
&lt;br /&gt;
Damit wird die Zeitzone auf Finnland umgestellt +1 Std. Die Finnen haben&lt;br /&gt;
zwar auch Sommerzeit, da die Sommerzeitumstellung aber ja nicht&lt;br /&gt;
funktioniert passt es dann. Das muss allerdings zum Ende der Sommerzeit&lt;br /&gt;
wieder zurückgestellt werden, mit den gleichen Unannehmlichkeiten.&lt;br /&gt;
&lt;br /&gt;
==== Methode 2: Datenbank ändern ====&lt;br /&gt;
&lt;br /&gt;
Alternativ lässt sich die Ländereinstellung auf Dateiebene ändern, hierbei handelt es sich jedoch leider um ein binäres Datenbankformat. Die Konfiguration befindet sich in der Datei /HardDisk/moreTV.persistent/tbConfigurations.xbc welche z.B. über FTP erreichbar ist. Die Datei lässt sich z.B. mit einem Hex-Editor wie GHex2 unter Linux öffnen, es sollte eine Struktur mit Wertenamen und deren Variablen erkennbar sein. Recht im Anfang befindet sich eine Einstellung &amp;quot;COUNTRY_ID&amp;quot; - nach vier kleinen Werten befindet sich (hier Offset 0x32) eine ASCII-Zahl, z.B. 1 (0x31) für Deutschland(?). In meinem Fall brachte eine Änderung auf 2 (0x32) mit anschließendem Neustart den gewünschten Effekt für die Zeiteinstellung.&lt;br /&gt;
&lt;br /&gt;
= Linux =&lt;br /&gt;
&lt;br /&gt;
Die CPU wird pauschal von Linux unterstützt.&lt;br /&gt;
&lt;br /&gt;
Der Kernel ist hier erhältlich:&lt;br /&gt;
*Einstiegsseite: http://www.linux-mips.org/wiki/Main_Page &lt;br /&gt;
*Download: http://www.linux-mips.org/pub/linux/mips/kernel/v2.6/&lt;br /&gt;
&lt;br /&gt;
=== GCC Cross Compiler ===&lt;br /&gt;
&lt;br /&gt;
Für das Kompilieren von Programmen und von dem Kernel selber wird ein gcc Cross Compiler benötigt. Hier werden verschiedene Optionen für das Installieren, bzw. Kompilieren beschrieben.&lt;br /&gt;
&lt;br /&gt;
==== Debian ====&lt;br /&gt;
&#039;&#039;&#039;Ungetestet&#039;&#039;&#039; Bitte testen und anschließend diese Zeile löschen&lt;br /&gt;
&lt;br /&gt;
Emdebian stellt einen MIPS Cross Compiler mit gcc 4.3 zur Verfügung. Für die Installation dieser sind die Anweisungen der [http://wiki.debian.org/EmdebianToolchain#Get_the_binaries Wikipedia von Emdebian] zu folgen.&lt;br /&gt;
&lt;br /&gt;
__________________________________________________________________________&lt;br /&gt;
&lt;br /&gt;
Ich habe folgenden Weg auf einem Debian Squeeze AMD64 gewählt:&lt;br /&gt;
&lt;br /&gt;
In der Datei:&lt;br /&gt;
&lt;br /&gt;
/etc/apt/sources.list.d/emdebian.sources.list&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
deb http://www.emdebian.org/debian/ squeeze main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
eingefügt. &lt;br /&gt;
Beim &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Kam folgende Fehlermeldung:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
The following signatures couldn&#039;t be verified because the public key is not available: NO_PUBKEY 010908312D230C5F&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
dies kann man mit:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gpg --keyserver pgpkeys.mit.edu --recv-key  010908312D230C5F &lt;br /&gt;
gpg -a --export 010908312D230C5F | sudo apt-key add -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
beheben. (Den Key durch den bei euch angezeigten ersetzen)&lt;br /&gt;
&lt;br /&gt;
Danach dann folgende Pakete wie in Embedian angeben installieren. Evtl. sind das auch einige zu viel, wer Ahnung davon hat bitte zusammenkürzen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install linux-libc-dev-mipsel-cross&lt;br /&gt;
apt-get install libc6-mipsel-cross  libc6-dev-mipsel-cross&lt;br /&gt;
apt-get install binutils-mipsel-linux-gnu&lt;br /&gt;
apt-get install gcc-4.4-mipsel-linux-gnu&lt;br /&gt;
apt-get install g++-4.4-mipsel-linux-gnu&lt;br /&gt;
apt-get install apt-cross dpkg-cross&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Der Richtige Export ist dann:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export CROSS_COMPILE=mipsel-linux-gnu-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Danach solltet ihr alles fehlerfrei Übersetzen können.&lt;br /&gt;
&lt;br /&gt;
Auf Lauffähigkeit habe ich das u-Boot allerdings noch nicht getestet. (Wird entfernt, wenn es geschehen ist)&lt;br /&gt;
&lt;br /&gt;
==== Ubuntu ====&lt;br /&gt;
Scheinbar gibt es kein eigenes Package in den Ubuntu Repositories. Aus diesem Grund sollte hier die Beschreibung bei [[#Generischer Linux|Generischen Linux]] befolgt werden.&lt;br /&gt;
&lt;br /&gt;
==== RedHat ====&lt;br /&gt;
&#039;&#039;&#039;Ergänzen&#039;&#039;&#039; Da ich kein RedHat System am Laufen habe, kann ich nicht sagen ob die Distribution ein MIPS Cross Compiler zur Verfügung stellt.&lt;br /&gt;
&lt;br /&gt;
==== Gentoo ====&lt;br /&gt;
&#039;&#039;&#039;siehe RedHat&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Arch ====&lt;br /&gt;
Durch das Paket cross-mipsel-linux-gnu-gcc aus dem AUR kann der Compiler installiert werden.&lt;br /&gt;
&lt;br /&gt;
==== Generischer Linux ====&lt;br /&gt;
Die hier beschriebenen Optionen sind nicht an eine Distribution gebunden. Der daraus erwachsende Nachteil ist, dass diese Programme &#039;&#039;&#039;nicht&#039;&#039;&#039; im Standard Pfad installiert werden sollten da sie sonst möglicherweise Dateien überschreiben könnten, die unter der Versionsverwaltung der einzelnen Distributionen stehen. &lt;br /&gt;
&lt;br /&gt;
===== ELDK =====&lt;br /&gt;
Um den Embedded Linux Development Kit zu installieren folgt man am Besten der Anleitung auf der [http://www.denx.de/wiki/view/DULG/ELDKInstallation Seite des Herstellers]. Zu beachten ist, dass ELDK 4.1 verwendet werden sollte, wenn U-Boot zu kompilieren ist.&lt;br /&gt;
&lt;br /&gt;
===== crosstool-ng =====&lt;br /&gt;
[http://crosstool-ng.org/ crosstool-ng] automatisiert die Kompilierung und Installation eines Cross Compilers. Das Programm ist normalerweise in den Repositories der verwendeten Linux Distribution enthalten. Ansonsten muss es auf dem Host Rechner kompiliert und installiert werden. In Folge werden anhand beispielhafter Befehle die Schritte für die Erstellung eines Cross Compilers gezeigt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ct-ng mipsel-unknown-linux-gnu&lt;br /&gt;
ct-ng menuconfig&lt;br /&gt;
ct-ng build&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im menuconfig sind die Pfade des Compilers anzupassen, wenn diese nicht in $HOME/x-tools installiert werden sollen. Zu beachten ist, dass ct-ng Schreibrechte für den entsprechenden Pfad braucht. Ein mit crosstool-ng erstellter Compiler ist [http://wird-ergaenzt.at hier] zu finden. Zu beachten ist, dass dieser für den Pfad /opt erstellt wurde und auch dort installiert werden muss.&lt;br /&gt;
&lt;br /&gt;
===== buildroot =====&lt;br /&gt;
In der Standardeinstellung erstellt Buildroot seinen eigenen Cross Compiler, welcher auch außerhalb der Umgebung verwendet werden kann. Hierfür sind die Beschreibungen in der [http://buildroot.uclibc.org/downloads/buildroot.html#using_toolchain Dokumentation] von buildroot zu befolgen. Zu beachten ist, dass ein gcc 4.2.4 verwendet werden sollte, wenn ein Kernel mit der Version 2.6.21 kompiliert wird.&lt;br /&gt;
&lt;br /&gt;
=== UBoot ===&lt;br /&gt;
&lt;br /&gt;
U-Boot 2011.09 wurde auf die Receiver Platine portiert. Der Port kann aus der Repository von [https://github.com/tuxx42/PNX8550_U-BOOT gihub/tuxx42] bezogen werden. Für die Kompilierung ist ein GCC der Version 4.1 oder Höher notwendig. Zurzeit unterstützt U-Boot das Laden und Booten des Kernels aus dem Netzwerk, aus dem NAND Flash und von der Festplatte. In weiterer Folge werden alle notwendigen Schritte beschrieben um U-Boot auf der Receiver Platine zum Laufen zu bringen.&lt;br /&gt;
&lt;br /&gt;
==== Vorbereitung ====&lt;br /&gt;
&lt;br /&gt;
* Der gesamte Vorgang ist auf einem Linux oder in einer Linux-Ähnlichen Umgebung wie zum Beispiel cygwin (&#039;&#039;&#039;ungetestet&#039;&#039;&#039;) auszuführen.&lt;br /&gt;
* Der MIPS Compiler sollte im Pfad enthalten sein.&lt;br /&gt;
* Es muss das Programm &#039;&#039;make&#039;&#039; im Pfad erhalten sein.&lt;br /&gt;
&lt;br /&gt;
===== kermit =====&lt;br /&gt;
&lt;br /&gt;
Für das Flashen des endgültigen Systems ist das Programm kermit notwendig. Diese kann bei Debian Varianten über den Befehl &amp;lt;pre&amp;gt;sudo apt-get install ckermit&amp;lt;/pre&amp;gt; installiert werden. Die Konfiguration von kermit geschieht am Besten über die Konfigurationsdatei ~/.kermrc. Folgende Einträge haben sich hierbei bewährt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set line /dev/ttyUSB0  # auf den serielen Port ändern&lt;br /&gt;
set speed 38400&lt;br /&gt;
set carrier-watch off&lt;br /&gt;
set handshake none&lt;br /&gt;
set flow-control none&lt;br /&gt;
robust&lt;br /&gt;
set file type bin&lt;br /&gt;
set file name lit&lt;br /&gt;
set rec pack 1000&lt;br /&gt;
set send pack 1000&lt;br /&gt;
set window 5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Folge werden einige wichtigen Befehle für die Handhabung von kermit beschrieben. Eine ausführliche Anleitung findet sich auf der Webseite von der [http://www.columbia.edu/kermit/ckututor.html Columbia Universität].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;(/home/foo/) C-Kermit&amp;gt;send foo.bar&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Datei foo.bar über die Serielle senden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;(/home/foo/) C-Kermit&amp;gt;connect&amp;lt;/pre&amp;gt;&lt;br /&gt;
Verbindet sich zu der seriellen Schnittstelle&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Escape Character: strg + strg-alt + ß&amp;lt;/pre&amp;gt;&lt;br /&gt;
Wird gebraucht um wieder auf die kermit Konsole wechseln zu können.&lt;br /&gt;
&lt;br /&gt;
==== U-Boot Flashen ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG&#039;&#039;&#039; Zurzeit sind nur 5MB für den Linux Kernel vorgesehen. Dies reicht nicht aus um den original Elecard Kernel mit einem initrd zu integrieren. Dieser Fehler wird zurzeit behoben und in Kürze ein neues Flash-Paket veröffentlicht.&lt;br /&gt;
&lt;br /&gt;
Das gesamte Archiv aus dem [http://www.mikrocontroller.net/attachment/127634/U-Boot.zip Board] auf einen FAT32 formatierten USB-Stick entpacken und die Datei u-boot.img in ein Verzeichnis auf dem Host-Rechner kopieren. Alle weiteren Schritte, wie in [[#System flashen|System flashen]] beschrieben, durchführen. Anschließend kermit starten und mit &amp;quot;connect&amp;quot; auf das Terminal verbinden. Nach dem booten von U-Boot muss die Ausgabe &amp;quot;flasher# &amp;quot; auf der seriellen Schnittstelle J2 erscheinen. &lt;br /&gt;
&lt;br /&gt;
# Mit &amp;quot;connect&amp;quot; auf die U-Boot Konsole wechseln&lt;br /&gt;
## loadb 82000000&lt;br /&gt;
# Mit dem Escape Character und c auf die kermit Konsole wechseln&lt;br /&gt;
## cd folder/with/u-boot/image&lt;br /&gt;
## send u-boot.img&lt;br /&gt;
# Mit &amp;quot;connect&amp;quot; auf die U-Boot Konsole wechseln&lt;br /&gt;
## mtdparts default&lt;br /&gt;
## nand erase.part U-Boot&lt;br /&gt;
## nand write $(loadaddr) U-Boot $(filesize)&lt;br /&gt;
&lt;br /&gt;
Sollten keine Fehler bei dem Beschreiben des Flash aufgetreten sein, so kann U-Boot mit dem Befehl &amp;quot;reset&amp;quot; neu gestartet werden. Bei Fehlern kann der Flasher mittels dem WinCE wieder hergestellt werden.&lt;br /&gt;
&lt;br /&gt;
Sollte der Schreibvorgang mit einem &amp;quot;Attempt to write outside the flash area&amp;quot; fehlschlagen, so sind wahrscheinlich die Umgebungsvariablen von loadb nicht gesetzt worden.&lt;br /&gt;
In diesem Fall per &amp;quot;printenv&amp;quot; die gesetzten Variablen anzeigen und die Fehlenden ergänzen:&lt;br /&gt;
# setenv loadaddr 82000000&lt;br /&gt;
# setenv filesize 38000&lt;br /&gt;
Danach kann mit Schritt 3 weitergemacht werden.&lt;br /&gt;
&lt;br /&gt;
==== Kernel Flashen ====&lt;br /&gt;
&lt;br /&gt;
Der vorbereitete Kernel vom [ Board] muss vor dem Flashen in den Speicher des Receivers kopiert werden. Wenn eine Netzwerkverbindung besteht, bietet es sich an die Datei aufgrund ihrer Größe mit TFTP statt mit kermit zu kopieren.&lt;br /&gt;
&lt;br /&gt;
# Laden des Kernels&lt;br /&gt;
## Mittels TFTP:   tftp $(loadaddr) 111.222.333.444:uImage&lt;br /&gt;
## Mittels kermit: loadb $(loadaddr)&lt;br /&gt;
# Flashen des Kernels: Mit &amp;quot;connect&amp;quot; auf die Box wechseln&lt;br /&gt;
## mtdparts default&lt;br /&gt;
## nand erase.part Linux&lt;br /&gt;
## nand write $(loadaddr) Linux $(filesize)&lt;br /&gt;
&lt;br /&gt;
==== Kernel booten ====&lt;br /&gt;
&lt;br /&gt;
Der Kernel kann auch von anderen Medien geladen werden, dies wird in den folgenden Abschnitten beschrieben. Voraussetzung hierfür ist, wie auch für das Flashen des Kernels, ein erfolgreich installierter U-Boot Bootloader.&lt;br /&gt;
&lt;br /&gt;
===== Netzwerk booten =====&lt;br /&gt;
Um den Kernel vom Netzwerk zu booten muss ein TFTP-Server exsistieren, der das Kernelimage bereitstellt. Das Image wird in diesem Beispiel auf dem Server unter /tftboot/pollinux/uImage hinterlegt, wobei tftpboot das Rootverzeichnis des TFTP-Servers ist. Außerdem müssen die Netzwerkeinstellungen des Receivers evtl. angepasst werden:&lt;br /&gt;
&lt;br /&gt;
# Mit &amp;quot;connect&amp;quot; auf die U-Boot Konsole wechseln und IP-Adresse des Servers eingeben (z.B. 192.168.0.1):&lt;br /&gt;
## setenv serverip 192.168.0.1&lt;br /&gt;
# Netzwerkmaske setzen/korrigieren, wenn nötig:&lt;br /&gt;
## setenv netmask 255.255.255.0&lt;br /&gt;
# IP-Adresse des Receivers festlegen (z.B. 192.168.0.3)&lt;br /&gt;
## setenv ipaddr 192.168.0.3&lt;br /&gt;
# TFTP-Pfad zum Kernelimage festlegen (z.B. pollinux/uImage - Rootverzeichnis weglassen)&lt;br /&gt;
## set bootfile pollinux/uImage&lt;br /&gt;
# Konfiguration speichern im Flash:&lt;br /&gt;
## saveenv&lt;br /&gt;
# Booten des Receivers mit TFTP&lt;br /&gt;
## tftpboot&lt;br /&gt;
&lt;br /&gt;
Sollte diese Methode nicht funktionieren, kann man auch den Kernel von einer nfs-Freigabe laden und starten:&lt;br /&gt;
&lt;br /&gt;
# Mit &amp;quot;connect&amp;quot; auf die U-Boot Konsole wechseln und IP-Adresse des Servers eingeben (z.B. 192.168.0.1):&lt;br /&gt;
## setenv serverip 192.168.0.1&lt;br /&gt;
## setenv gatewayip 192.168.0.1&lt;br /&gt;
# Netzwerkmaske setzen/korrigieren, wenn nötig:&lt;br /&gt;
## setenv netmask 255.255.255.0&lt;br /&gt;
# IP-Adresse des Receivers festlegen (z.B. 192.168.0.3)&lt;br /&gt;
## setenv ipaddr 192.168.0.3&lt;br /&gt;
# NFS-Pfad zum Kernelimage festlegen (z.B. /srv/nfs/pollinux/uImage) - die Freigabe (/srv/nfs/pollinux) muss in der Datei /etc/exports auf dem Server eingetragen werden (z.B. &amp;quot;/srv/nfs/pollinux/ *(rw,no_subtree_check,no_root_squash)&amp;quot; )&lt;br /&gt;
## set bootfile /srv/nfs/pollinux/uImage&lt;br /&gt;
# Kernel Image laden&lt;br /&gt;
## nfs&lt;br /&gt;
# Starten&lt;br /&gt;
## boot&lt;br /&gt;
&lt;br /&gt;
===== Flash booten =====&lt;br /&gt;
Um den geflashten Kernel automatisch zu booten, muss die nandboot-Variable angepasst werden:&lt;br /&gt;
&lt;br /&gt;
# Mit &amp;quot;connect&amp;quot; auf die U-Boot Konsole wechseln und Variable aktualisieren:&lt;br /&gt;
## setenv bootcmd run nandboot&lt;br /&gt;
## setenv nandboot mtdparts default;nboot Linux;run ideargs addip;bootm&lt;br /&gt;
# Wenn vom USB-Stick gebootet werden soll, muss evtl. noch das root-device angegeben werden (z.B. /dev/sda1):&lt;br /&gt;
## setenv rootdev /dev/sda1&lt;br /&gt;
# Konfiguration im Flash speichern&lt;br /&gt;
## saveenv&lt;br /&gt;
# System neustarten&lt;br /&gt;
&lt;br /&gt;
===== Festplatte booten =====&lt;br /&gt;
&amp;lt;wird noch geschrieben&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== U-Boot vom Source kompilieren ====&lt;br /&gt;
&lt;br /&gt;
===== Flasher =====&lt;br /&gt;
Die U-Boot git aus-checken, beziehungsweise einen komprimierten Snapshot von [https://github.com/tuxx42/PNX8550_U-BOOT gihub/tuxx42] laden. Die folgenden Befehle sind als Anhaltspunkte für das Vorgehen bei der Kompilierung gedacht. Es können Abweichungen durch einen anderen Setup entstehen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd u-boot&lt;br /&gt;
export CROSS_COMPILE=&amp;lt;mipsel-gcc-prefix-&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In dieser Zeile ist der Prefix des Cross Compilers einzufügen. Dieser kann sich zwischen den verwendeten Systemen unterscheiden. Bei der Verwendung von ELDK entspricht dies mips_4KCle-, bei der Verwendung eines mit crosstool-ng oder buildroot erstellten Compiler entspricht dies mipsel-linux-&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make mrproper&lt;br /&gt;
make pollinux_flasher_config&lt;br /&gt;
make&lt;br /&gt;
./tools/mkpollinux u-boot.bin 00004000_00040000__loader.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Originaldatei mit der Ausgabe von mkpollinux auf dem USB Stick ersetzten. Ab hier sind die Anweisungen in [[#System flashen|System flashen]] zu befolgen und alle 3 Dateien auf die Box zu flashen. Nach dem Booten ist U-Boot über die gewählte serielle Schnittstelle verfügbar und es kann mit dem Flashen des endgültigen Systems begonnen werden.&lt;br /&gt;
&lt;br /&gt;
===== U-Boot =====&lt;br /&gt;
Im ersten Schritt muss das endgültige U-Boot kompiliert werden. Hierfür muss U-Boot mit pollinux_config konfiguriert und kompiliert werden. Anschließend können alle weiteren Schritte aus [[#Flasher|Flasher]] übernommen werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Anpassung von U-Boot ====&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;u&amp;gt;Serielle Schnittstelle:&amp;lt;/u&amp;gt; Sollte die Ausgabe auf J33 statt auf J2 geführt werden, so muss in der Datei include/configs/pollinux.h das Define CONFIG_CONSOLE_PORT auf CONFIG_SERIAL_PORT_2 geändert werden.&lt;br /&gt;
&lt;br /&gt;
=== Elecard ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG&#039;&#039;&#039; Diese Anleitung ist veraltet und muss noch aktualisiert werden- bitte auch im Board lesen - [http://www.mikrocontroller.net/topic/210759#2232954 Version 0.2] | [http://www.mikrocontroller.net/topic/210759#2233950 Version für USB/HDD-Installation ohne NFS]&lt;br /&gt;
&lt;br /&gt;
(via AgentData)&lt;br /&gt;
&lt;br /&gt;
Um das NAND zu schonen werden rootfs, userfs, configfs und profile bis auf Weiteres über NFS, also Netzwerk, von einem Linux-PC (oder einer VM) geladen.&lt;br /&gt;
&lt;br /&gt;
==== Vorbereitungen ====&lt;br /&gt;
&lt;br /&gt;
* Das gesamte Archiv aus dem [http://www.mikrocontroller.net/attachment/109811/Pollinux.rar Board] auf einen FAT32 formatierten USB-Stick entpacken&lt;br /&gt;
* Linux-PC und Pollin-Box müssen im selben Netzwerk sein, am besten ein Crossover-Kabel verwenden um Netzprobleme ausschließen zu können&lt;br /&gt;
* Die Beispiele gehen davon aus, dass der NFS-Server auf der IP 192.168.0.3 läuft. Die Box nutzt je nach Rootfs DHCP oder ist auf die IP 192.168.0.254 vorkonfiguriert.&lt;br /&gt;
&lt;br /&gt;
==== System flashen ====&lt;br /&gt;
&lt;br /&gt;
Hinweise für Entwickler:&lt;br /&gt;
* die cmdline für den Kernel befindet sich im File 00004000_00040000__loader.bin @ offset 0x7000&lt;br /&gt;
&lt;br /&gt;
* Pollin-Box auf Auslieferungszustand bringen (Anleitung gibts im WIKI)&lt;br /&gt;
* Pollin-Box DIP1 auf OFF (WCE1) und reboot&lt;br /&gt;
* USB-Stick anstecken und flashme.exe starten&lt;br /&gt;
* an der Pollin-Box Taste Pfeil runter oder auf der Fernbedienung die Taste 1 drücken =&amp;gt; loader wird geflashed&lt;br /&gt;
* an der Pollin-Box Taste Pfeil hoch oder auf der Fernbedienung die Taste 2 drücken =&amp;gt; kernel wird geflashed&lt;br /&gt;
* an der Pollin-Box Taste Pfeil links oder auf der Fernbedienung die Taste 3 drücken =&amp;gt; wince0 wird geflashed&lt;br /&gt;
** wince0 ist ein modifiziertes Image welches statt TGUpdater.exe die&lt;br /&gt;
flashme.exe vom USB-Stick startet -&amp;gt; erhält uns die Möglichkeit von&lt;br /&gt;
WinCE aus zu flashen&lt;br /&gt;
* Box ausschalten&lt;br /&gt;
* USB-Stick abziehen &#039;&#039;Wichtig! Ein Boot mit USB-Stick kann in einigen Konfigurationen den Bootloader zerstören, eine Wiederherstellung der Box ist in diesem Fall nur schwer möglich!&#039;&#039;&lt;br /&gt;
* DIP1 auf ON&lt;br /&gt;
&lt;br /&gt;
==== LINUX NFS Server vorbereiten ====&lt;br /&gt;
&lt;br /&gt;
Die Box erwartet den NFS-Server auf der IP 192.168.0.3&lt;br /&gt;
&lt;br /&gt;
Anm. des Autors: Da ich bis vor einer Woche noch nie ein Linux System von nahem gesehen habe arbeite ich momentan noch mit einer Knoppix Live CD. Sämtliche Pfadangaben beziehen sich also auf dieses System es ist nicht wirklich nötig mit einem USB-Stick zu arbeiten - aber ich denk die Linuxer wissen das. Ich würde trotzdem vorschlagen bis auf weiteres mit Partitionen zu arbeiten da es dann für uns ganz einfach ist Änderungen als ext2 Image der jeweiligen Partition auszutauschen. Nachfolgend also die Anleitung wie ich es bei mir gemacht habe.&lt;br /&gt;
&lt;br /&gt;
===== Linux-Box booten =====&lt;br /&gt;
&lt;br /&gt;
...und die Dateien nfsroot.ext2, nfsuser.ext2 und pollinux_start_nfs aus&lt;br /&gt;
dem Download Archiv auf den Knoppix Desktop kopieren&lt;br /&gt;
&lt;br /&gt;
===== USB-Stick partitionieren =====&lt;br /&gt;
Mit GParted auf einem USB-Stick vier primäre ext2 Partitionen anlegen&lt;br /&gt;
&lt;br /&gt;
 sdb1     50 mb    -&amp;gt; später mounted als rootfs&lt;br /&gt;
 sdb2    100 mb    -&amp;gt; später mounted als userfs&lt;br /&gt;
 sdb3      5 mb    -&amp;gt; später mounted als configfs&lt;br /&gt;
 sdb4      5 mb    -&amp;gt; später mounted als profile&lt;br /&gt;
&lt;br /&gt;
* abschließend die vier neuen Partitionen mounten&lt;br /&gt;
* bei mir werden sie unter /dev/sdb1 bis /dev/sdb4 bzw. /media/sdb1 bis&lt;br /&gt;
/media/sdb4 eingehängt&lt;br /&gt;
&lt;br /&gt;
=====Daten Kopieren=====&lt;br /&gt;
Das nfsroot und nfsuser ext2 image auf den USB-Stick kopieren&lt;br /&gt;
&lt;br /&gt;
* benötigt werden hier die files nfsroot.ext2 und nfsuser.ext2 aus dem&lt;br /&gt;
Download Archiv&lt;br /&gt;
* wenn ihr meine Anleitung befolgt hab liegen sie auf dem Knoppix&lt;br /&gt;
Desktop -&amp;gt; wenn nicht müsst ihr die Pfade anpassen&lt;br /&gt;
** /home/knoppix/Desktop/nfsroot.ext2&lt;br /&gt;
** /home/knoppix/Desktop/nfsuser.ext2&lt;br /&gt;
* terminal starten&lt;br /&gt;
* mit su [ret] als superuser einloggen&lt;br /&gt;
* nfsroot kopieren:&lt;br /&gt;
** -&amp;gt; dd if=/home/knoppix/Desktop/nfsroot.ext2 of=/dev/sdb1&lt;br /&gt;
* nfsuser kopieren:&lt;br /&gt;
** dd if=/home/knoppix/Desktop/nfsuser.ext2 of=/dev/sdb2&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung&#039;&#039;&#039; Die Imagedateien in der Originaldatei sind beschädigt, stattdessen sollten die Dateien aus der [http://www.mikrocontroller.net/attachment/109976/pollinux.tar.gz pollinlinux.tar.gz] verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=====NFS Server starten=====&lt;br /&gt;
&lt;br /&gt;
* benötigt wird hier das Script pollinux_start_nfs aus dem Download Archiv&lt;br /&gt;
* wenn ihr meine Anleitung befolgt hab liegt es auf dem Knoppix Desktop&lt;br /&gt;
** wenn nicht müsst ihr die Pfade anpassen&lt;br /&gt;
** /home/knoppix/Desktop/pollinux_start_nfs&lt;br /&gt;
* terminal starten&lt;br /&gt;
* mit su [ret] als superuser einloggen&lt;br /&gt;
* nfs server starten:&lt;br /&gt;
** /home/knoppix/Desktop/pollinux_start_nfs&lt;br /&gt;
&lt;br /&gt;
Achtung bei Nicht Live-Systemen: Das Script überschreibt die /etc/exports - es sind folgende Freigaben notwendig:&lt;br /&gt;
&lt;br /&gt;
 /pollinux/nandfs                *(rw,insecure,no_root_squash,no_subtree_check)&lt;br /&gt;
 /pollinux/nandfs.user           *(rw,insecure,no_root_squash,no_subtree_check)&lt;br /&gt;
 /pollinux/nandfs.config         *(rw,insecure,no_root_squash,no_subtree_check)&lt;br /&gt;
 /pollinux/nandfs.profile        *(rw,insecure,no_root_squash,no_subtree_check)&lt;br /&gt;
&lt;br /&gt;
==== Ergänzungen ====&lt;br /&gt;
&lt;br /&gt;
* wenn alles glatt läuft müsstet ihr jetzt die Pollin-Box booten können und die Partitionen werden über nfs mounted&lt;br /&gt;
* es gilt jetzt die Scripte für einen fehlerfreien boot anzupassen&lt;br /&gt;
* login als root auf die Pollin-Box funktioniert per telnet problemlos&lt;br /&gt;
* DVB-T-Devices werden erkannt, eine Sendersuche per w_scan war erfolgreich&lt;br /&gt;
* Alternativ zu den USB-Partitionen kann natürlich auch eine einfache NFS-Freigabe verwendet werden, eine Anleitung hat [http://www.mikrocontroller.net/topic/210759#2186133 Laszlo H.]&lt;br /&gt;
* Beim Boot wird eine serielle Konsole mit 38400bps gestartet&lt;br /&gt;
* Um eine serielle Shell zu erhalten in der /etc/inittab den Eintrag &amp;quot;ttyS1&amp;quot; durch &amp;quot;ttyS0&amp;quot; ersetzen.&lt;br /&gt;
* Der Soundchip wird zwar erkannt, eine Soundausgabe bisher jedoch nicht gelungen.&lt;br /&gt;
&lt;br /&gt;
Folgende Programme lassen sich starten:&lt;br /&gt;
&lt;br /&gt;
* Haupt-Anwendung (Youtube-Player, XviD von SD-Karte, usw.)&lt;br /&gt;
 cd /opt/elecard/bin/&lt;br /&gt;
 ./mainapp.sh&lt;br /&gt;
&lt;br /&gt;
* Ein Webbrowser&lt;br /&gt;
 cd /usr/local/webkit/&lt;br /&gt;
 ./_start.sh&lt;br /&gt;
&lt;br /&gt;
* Für DVB-C muss die Datei &#039;/etc/init.d/S30pretmmodules&#039; wie folgt angepasst werden:&lt;br /&gt;
 #modprobe phStbDemux_dvbpnx8550 fe_model_name=&amp;quot;TU1216&amp;quot;&lt;br /&gt;
 modprobe phStbDemux_dvbpnx8550 fe_model_name=&amp;quot;CU1216&amp;quot;&lt;br /&gt;
Mit dem Modul werden die nötigen Frontends erstellt, ein Zugriff über die elecard-Mainapp ist möglich, QAM256 wird im Gegensatz zu MoreTV unterstützt.&lt;br /&gt;
&lt;br /&gt;
== Interessant zum weiteren Testen ==&lt;br /&gt;
&lt;br /&gt;
*MontaVista Linux Professional Edition&lt;br /&gt;
&lt;br /&gt;
= Unterstützte Codecs =&lt;br /&gt;
&lt;br /&gt;
Quelle: [http://www.synnex.com.tw/oem/mic_link/seminar%20download/y70303.pdf]&lt;br /&gt;
&lt;br /&gt;
*dual: SD MPEG-1/2&lt;br /&gt;
*single: SD MPEG-4, WM9, H264,DivX; HD MPEG-2 (1080i), WM9(720p)&lt;br /&gt;
*Audio: dual stereo (2.0 + 2.0),MPEG-1, Dolby AC-3&lt;br /&gt;
&lt;br /&gt;
= Bezugsquellen = &lt;br /&gt;
&lt;br /&gt;
===Platinen===&lt;br /&gt;
* [http://www.pollin.de/shop/dt/NzQ5OTA2OTk-/Bausaetze_Module/Module/Receiver_Mainboard_mit_Twin_DVB_T_Tuner.html Pollin : Receiver-Mainboard mit Twin DVB-T Tuner (390 052, 5,95€)]&lt;br /&gt;
* [http://www.pollin.de/shop/dt/NjQ5OTA2OTk-/Bausaetze_Module/Module/Receiver_Mainboard_mit_Twin_DVB_C_Tuner.html Pollin : Receiver-Mainboard mit Twin DVB-C Tuner (390 053, 5,95€)]&lt;br /&gt;
* [http://www.pollin.de/shop/dt/MzQxODcyOTk-/Computer_und_Zubehoer/Hardware/Kabel_Stecker_Adapter/RS232_Einbaubuchse.html Pollin : RS232-Einbaubuchse (721 856, 0,25€)], zur Befestigung werden noch zwei passende Sechskant-Schraubbolzen benötigt&lt;br /&gt;
* [http://www.pollin.de/shop/dt/NDQxODcyOTk-/Computer_und_Zubehoer/Hardware/Kabel_Stecker_Adapter/USB_2_0_Einbaubuchse.html Pollin : USB 2.0-Einbaubuchse (721 855, 0,25€)]&lt;br /&gt;
&lt;br /&gt;
===Zubehör===&lt;br /&gt;
:Netzteil, Gehäuse, Fernbedienung:&lt;br /&gt;
*[http://www.pollin.de/shop/dt/NjUwOTQ2OTk-/Stromversorgung/Netzgeraete/Festspannungs_Netzgeraete/Schaltnetzteil_DELTA_EADP_50DF_12_V_4_16_A.html Pollin : Schaltnetzteil DELTA EADP-50DF, 12 V-/4,16 A (350 943 , 4,95€)]&lt;br /&gt;
*[http://www.pollin.de/shop/dt/MDg4OTM1OTk-/Bauelemente_Bauteile/Gehaeuse/Stahlblech_Gehaeuse_mit_Frontblende.html Pollin : Stahlblech-Gehäuse mit Frontblende (460 119, 2,50€)]&lt;br /&gt;
*[http://www.pollin.de/shop/dt/ODc5OTczOTk-/SAT_Antennentechnik/Satelliten_Technik/Fernbedienungen/Infrarot_Fernbedienung_RCX161.html Pollin : Infrarot-Fernbedienung RCX161 (620 021, 1,99€)] (empfohlen)&lt;br /&gt;
*[http://www.pollin.de/shop/dt/Nzc5OTczOTk-/SAT_Antennentechnik/Satelliten_Technik/Fernbedienungen/Infrarot_Fernbedienung_RCX155.html Pollin : Infrarot-Fernbedienung RCX155 (620 022, 1,50€)]&lt;br /&gt;
&lt;br /&gt;
:SATA:&lt;br /&gt;
*[http://www.pollin.de/shop/dt/NTQxODcyOTk-/Computer_und_Zubehoer/Hardware/Kabel_Stecker_Adapter/SATA_Kabel.html Pollin : SATA-Kabel, 2x SATA-Stecker, 0,35m (721 854, 0,50€)]&lt;br /&gt;
*[http://www.pollin.de/shop/dt/MDM0OTcyOTk-/Computer_und_Zubehoer/Hardware/Kabel_Stecker_Adapter/HDD_Stromversorgungskabel.html Pollin : PC-Stromversorgungskabel, 2x 5,25&amp;quot;- Stecker, 2x HDD-Stecker, 70mm (720 569, 0,20€)]&lt;br /&gt;
*[http://www.pollin.de/shop/dt/NDI1ODcyOTk-/Computer_und_Zubehoer/Hardware/Kabel_Stecker_Adapter/SATA_Stromversorgungsadapter.html Pollin : SATA-Stromversorgungsadapter (721 475, 0,60)] oder alternativ&lt;br /&gt;
*[http://www.pollin.de/shop/dt/MTUwOTcyOTk-/Computer_und_Zubehoer/Hardware/Kabel_Stecker_Adapter/SATA_Stromversorgungsadapter.html Pollin : SATA-Stromversorgungsadapter, mit Rastnase! (720 948, 0,45)]&lt;br /&gt;
:WLAN:&lt;br /&gt;
*[http://www.pollin.de/shop/dt/NDY5ODgyOTk-/Computer_und_Zubehoer/Netzwerktechnik/Wireless_LAN/WLAN_miniPCI_Karte_XG_603.html Pollin : WLAN miniPCI-Karte XG-603 (711 035, 1,95€)]&lt;br /&gt;
*[http://www.pollin.de/shop/dt/MjUwOTgyOTk-/Computer_und_Zubehoer/Netzwerktechnik/Wireless_LAN/Wireless_LAN_Antennen_Adapterkabel.html Pollin : WLAN-Antennen-Adapterkabel (710 947, 4,95€)]&lt;br /&gt;
*[http://www.pollin.de/shop/dt/MTM5ODgyOTk-/Computer_und_Zubehoer/Netzwerktechnik/Wireless_LAN/Wireless_LAN_Rundstrahlantenne.html Pollin : WLAN-Antenne 4 dBi. Länge 140 mm Reverse-SMA (710 068, 1,95€)] oder alternativ &lt;br /&gt;
*[http://www.pollin.de/shop/dt/NzY3ODgyOTk-/Computer_und_Zubehoer/Netzwerktechnik/Wireless_LAN/WLAN_Antenne_FSC_5_dBi_RP_SMA.html Pollin : WLAN-Antenne, mit Standfuß, Reverse-SMA, 5 dBi (711 232, 3,95€)] oder alternativ&lt;br /&gt;
*[http://www.pollin.de/shop/dt/NDE0OTgyOTk-/Computer_und_Zubehoer/Netzwerktechnik/Wireless_LAN/Wireless_LAN_Rundstrahlantenne.html Pollin : WLAN-Antenne, Reverse-SMA, 5 dBi (710 585, 3,95€)] oder alternativ&lt;br /&gt;
*[http://www.pollin.de/shop/dt/ODI5ODgyOTk-/Computer_und_Zubehoer/Netzwerktechnik/Wireless_LAN/Wireless_LAN_Antenne.html Pollin : WLAN-Antenne, mit magnetischem Standfuß, Reverse-SMA, 7 dBi (711 071, 6,95€)] oder alternativ&lt;br /&gt;
*[http://www.reichelt.de/?ACTION=3;ARTICLE=61136;PROVID=2402 Reichelt: LAN DN-70100, WLAN-Antenne, Reverse-SMA, 5 dBi (LAN DN-70100, 2,95€)]&lt;br /&gt;
 &lt;br /&gt;
:DVB-T und DVB-C:&lt;br /&gt;
*[http://www.pollin.de/shop/dt/MzQ3ODI0OTk-/SAT_Antennentechnik/Kabel/Antennen_Anschlusskabel_75_150_mm.html Pollin : Antennen-Anschlusskabel 75 Ω, 150 mm (571 256, 0,20€)] zum Durchschleifen des DVB-Signals&lt;br /&gt;
:DVB-T:&lt;br /&gt;
*Bitte beachten: Passive Antennen sind grundsätzlich nicht zu empfehlen. Zumindest nicht im Zimmer. Außer man wohnt am Sender :D&lt;br /&gt;
*[http://www.pollin.de/shop/dt/MTc4ODI0OTk-/SAT_Antennentechnik/DVB_T_DVB_C/Antennen/DVB_T_Antenne_QOSMIO.html Pollin : DVB-T Antenne QOSMIO, passiv (571 128, 2,95€)]&lt;br /&gt;
:DVB-S:&lt;br /&gt;
*[http://www.elsner-computer.de/product_info.php?info=p430032_Dream-Multimedia-Tuner-7020S---7020Si---DVB-S.html Tuner 7020S Elsner Shop 39€ mit Alps Tuner, läuft (noch?) nicht unter WIN CE !!!]&lt;br /&gt;
*[http://www.hm-sat-shop.de/receiver-digital-dreambox/sat-tuner-fuer-dreambox-7020-philips.html HM Sat Shop:DVB-S Tuner zum Sat-Umbau, 49€.] &lt;br /&gt;
*[http://www.devilcards.de/Ersatzteile-Dreambox/Dream-Multimedia-Tuner-7020S-7020Si-DVB-S::225.html DevilCards Dream Multimedia Tuner 7020S DVB-S 37€ mit Alps Tuner, läuft (noch?) nicht unter WIN CE !!! ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entweder zwei identische Tuner bestücken oder exklusiv nur einen. Mischbetrieb ist scheinbar nicht möglich!&lt;br /&gt;
&lt;br /&gt;
*...außerdem Plexiglas/Kunststoff-Zuschnitt (13cm x 15cm) als HD-Träger sowie diverse Schrauben aus der PC-Grabbelkiste (7* Gehäuse, 1* Front-USB, 4* Schaltnetzteil, 6* Mainboard, 4* HD-Träger, 4* HD, 3* Frontpanel)&lt;br /&gt;
*...gut eignet sich auch das Bodenblech aus einem alten CD-Laufwerk: quer eingebaut und den überstehenden Teil abgesägt, 3.5mm-Löcher reingebohrt -- fertig!&lt;br /&gt;
*zu guter letzt wäre ein passender [http://www.mikrocontroller.net/attachment/106125/box.jpg Berührungsschutz für das Schaltnetzteil] noch eine sinnvolle Maßnahme zur Vermeidung von Personenschäden. Auch hier kann wieder ein Plexiglas/Kunststoff-Zuschnitt zum Einsatz kommen.&lt;br /&gt;
&lt;br /&gt;
= Hardware =&lt;br /&gt;
Aufbauend auf der Telegent TG 15666 EVO1, auch bekannt als Maxdome 15666 kommt die bei Pollin vertriebene Hardware jedoch mit zusätzlichen Features wie beispielsweise DVB-Tuner, CI-Slot, CONAX-SLot, SATA-Anschluss für interne Festplatte und Display zur Anzeige der Sendernummer.&lt;br /&gt;
== technische Daten ==&lt;br /&gt;
:Hauptprozessor PNX-8950 CPU (little endian)&lt;br /&gt;
:Flash-ROM 64 MB&lt;br /&gt;
:RAM-Speicher 256 MB&lt;br /&gt;
:Festplatte 250 GB (bei original Medion-Gerät) &lt;br /&gt;
*Conditional Access Interface&lt;br /&gt;
:1 Steckplatz (PCMCIA, DVB Common Interface Standard)&lt;br /&gt;
:1 Steckplatz (CONAX und andere)&lt;br /&gt;
*A/V &amp;amp; Data In/Out-Anschlüsse extern&lt;br /&gt;
:Video CVBS/S-VIDEO-Ausgang (PAL)&lt;br /&gt;
:TV-SCART (PAL/RGB-Ausgang)&lt;br /&gt;
:VCR-SCART&lt;br /&gt;
:Audio L/R-Ausgang&lt;br /&gt;
:Optical S/PDIF Digital Audio- oder Dolby AC-3 Bitstream-Ausgang&lt;br /&gt;
:serielle Schnittstelle (9-poliger D-Sub Type)&lt;br /&gt;
:RJ 45 (LAN 10/100MBit)&lt;br /&gt;
:WLAN-Antennensockel (Reverse-SMA Buchse)&lt;br /&gt;
:2x USB (1 Vorder-/Rückseite)&lt;br /&gt;
:2x Tuner (Philips DVB-T Tuner TU1216L/IVP über Input/Loop-Through-Connector F-Type, IEC 169-2, Buchse/Stecker)&lt;br /&gt;
*Ports/Anschlüsse intern&lt;br /&gt;
:3x USB 2.0 (einer davon über Kabel mit Front-USB verbunden)&lt;br /&gt;
:2x SATA-150&lt;br /&gt;
:RS232 (Console)&lt;br /&gt;
:miniPCI für WLAN-Karte XG-603 (über Verbindungskabel mit U.FL-Stecker an rückwärtige Reverse-SMA Buchse)&lt;br /&gt;
*Tuner &amp;amp; Service Decoder&lt;br /&gt;
:2 x Philips DVB-T Tuner &amp;quot;TU1216L/I V P&amp;quot; oder DVB-C Tuner &amp;quot;CU1216L/A I G V-3&amp;quot;&lt;br /&gt;
:RF-Anschlussimpedanz 75Ω&lt;br /&gt;
:Input/Loop-through-Connector F-Type, IEC 600169-2/24 (IEC-F-Anschluss)&lt;br /&gt;
:Frequenzbereich 45 ~ 860 MHz&lt;br /&gt;
:Signalpegel Eingang min. 74 dBm&lt;br /&gt;
:Modulation QPSK, 16 und 64 QAM&lt;br /&gt;
*MPEG Transport-Stream A/V Decoding&lt;br /&gt;
:Transport-Stream ISO/IEC 13818-1 MPEG-2&lt;br /&gt;
:Profile-Level 2x MPEG-2 MP@ML (PIP)&lt;br /&gt;
:Aspect Ratio 4:3, 16:9, Pan &amp;amp; Scan, Letterbox&lt;br /&gt;
:Videoauflösung 720x576&lt;br /&gt;
:Audio-Decoding MPEG-1 Layer 1, 2, 3&lt;br /&gt;
*Stromversorgung&lt;br /&gt;
:Eingangsspannung 100~240V AC, 1,5 A, 50/60 Hz&lt;br /&gt;
:Stromaufnahme ohne HDD max. 2 A&lt;br /&gt;
:Energieverbrauch im Betrieb Max. 50 W, Standby: 12 W&lt;br /&gt;
:Schutz durch Interne Sicherung (auf Schaltnetzteil eingelötet)&lt;br /&gt;
:HDD-Stromversorgung on Board&lt;br /&gt;
*Physische Spezifikationen&lt;br /&gt;
:Größe/Abmessungen (BxHxT) 440 x 265 x 70 mm&lt;br /&gt;
:Betriebstemperatur +5°C - +40°C&lt;br /&gt;
&lt;br /&gt;
== Jumper ==&lt;br /&gt;
* J1: JTAG (Header 2x5, nicht bestückt)&lt;br /&gt;
* J2: RS-232 Console (3:RX=RS232.3, 5:TX=RS232.2, 9:GND=RS232.5, Header 2x5)&lt;br /&gt;
* J4: (Header 2*10)&lt;br /&gt;
* J6: (Header 2x1, neben HD-Power)&lt;br /&gt;
* J8: (Header 2x3 nicht bestückt)&lt;br /&gt;
* J27: Massepunkt(1:GND, 2:GND, Header 2*1, zwischen SCART und Audio-Buchse)&lt;br /&gt;
* J30: USB Port 4 (über 4 pol Kabel verbunden mit Front USB, Header 1x4) &lt;br /&gt;
* J31: USB Port 3 (Header 1x4)&lt;br /&gt;
* J32: (Header 2x1, nicht bestückt, neben SW1)&lt;br /&gt;
* J33: RS-232 Console (Header 1x6)&lt;br /&gt;
* J34: an PIN 32 DVB-T-Tuner (Header 2x1, neben Tuner 1, bei DVB-C-Tuner nicht benutzt)&lt;br /&gt;
* J35: +5V für aktive Antenne (Header 2x1, nicht bestückt, neben Tuner 1, Zur Spannungsversorgung der am Tuner 1 angeschlossenen aktiven Antenne mit 5V)&lt;br /&gt;
* J36: an PIN 32 DVB-T-Tuner (Header 2x1, neben Tuner 2, bei DVB-C-Tuner nicht benutzt)&lt;br /&gt;
* J37: +5V für aktive Antenne (Header 2x1, nicht bestückt, neben Tuner 2, Zur Spannungsversorgung der am Tuner 2 angeschlossenen aktiven Antenne mit 5V)&lt;br /&gt;
* J41: Anschluss Bedien-PCB,  7-Seg. Display(5 pol)&lt;br /&gt;
* J42: Anschluss Bedien-PCB, Tastatur + Infrarot-Receiver (10 pol)&lt;br /&gt;
* J43: 12V von Schaltnetzteil&lt;br /&gt;
* J45: 12V Spannungsversorgung, nicht bestückt, Hohlbuchse&lt;br /&gt;
* J46: USB Port 2 (Header 1x4)&lt;br /&gt;
* J47: SPDIF-Ausgang&lt;br /&gt;
&lt;br /&gt;
== Schalter ==&lt;br /&gt;
SW1:  ON: Consoleport 38400 bps, Flashloader aktiv, Softwareupdate von externem USB-Stick laden&lt;br /&gt;
:OFF: Consoleport@115200N81, Flashloader passiv(default)&lt;br /&gt;
SW2:  ON: EJTAG enabled&lt;br /&gt;
:OFF: EJTAG disabled (default)&lt;br /&gt;
&lt;br /&gt;
Wenn man die Serielle zum loggen nutzt, ist zu beachten, dass Ausgaben&lt;br /&gt;
vom Flashloader (SW1 on)  mit 38400 Baud erfolgen, wenn allerdings SW1&lt;br /&gt;
auf &amp;quot;off&amp;quot; steht muss man das Terminal auf 115200 8-N-1 stellen.&lt;br /&gt;
&lt;br /&gt;
== LEDs ==&lt;br /&gt;
* &amp;lt;span style=&amp;quot;background-color:lightgreen;color:black&amp;quot;&amp;gt;LED1: grün&amp;lt;/span&amp;gt;, blinkt, wenn am rückwärtigen USB-Anschluss beispielsweise eine Maus angeschlossen ist (zwischen U1 und nicht bestücktem DVI-Chip U42)&lt;br /&gt;
* &amp;lt;span style=&amp;quot;background-color:blue;color:white&amp;quot;&amp;gt;LED2: blau&amp;lt;/span&amp;gt; (neben Befestigungsloch H3)&lt;br /&gt;
* &amp;lt;span style=&amp;quot;background-color:red;color:white&amp;quot;&amp;gt;LED3: rot&amp;lt;/span&amp;gt;, wahrscheinlich Netzkontroll-LED (Nähe J4)&lt;br /&gt;
* &amp;lt;span style=&amp;quot;background-color:lightgreen;color:black&amp;quot;&amp;gt;LED4: grün&amp;lt;/span&amp;gt;, leuchtet nur ganz schwach (neben LED3, Nähe J4)&lt;br /&gt;
* &amp;lt;span style=&amp;quot;background-color:lightgreen;color:black&amp;quot;&amp;gt;LED5: grün&amp;lt;/span&amp;gt; (neben Prozessor)&lt;br /&gt;
* &amp;lt;span style=&amp;quot;background-color:blue;color:white&amp;quot;&amp;gt;LED6: blau&amp;lt;/span&amp;gt; CPU Heartbeat, blinkt im Sekundentakt (neben Prozessor) - Anmerkung: blinkt nur bei Windows CE!&lt;br /&gt;
* &amp;lt;span style=&amp;quot;background-color:red;color:white&amp;quot;&amp;gt;LED7: rot&amp;lt;/span&amp;gt; (neben LED5)&lt;br /&gt;
* &amp;lt;span style=&amp;quot;background-color:lightgreen;color:black&amp;quot;&amp;gt;LED8: grün&amp;lt;/span&amp;gt;, zeigt HD-Schreibzugriff bei einer Aufnahme an (neben J6, USB Port 2)&lt;br /&gt;
&lt;br /&gt;
== Netzteil ==&lt;br /&gt;
Open Frame Schaltnetzteil, Typ DELTA EADP-50DF (bei Pollin AUSVERKAUFT)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Technische Daten:&#039;&#039;&#039;&lt;br /&gt;
*Eingang 100...240 V~&lt;br /&gt;
*Ausgang 12 V-/4,16 A&lt;br /&gt;
*Leistungsaufnahme unbelastet nur 0,5 W&lt;br /&gt;
*eingangsseitiges Euro-Netzkabel 1,3 m mit Zugentlastung&lt;br /&gt;
*Snap-In Netzschalter (Einbauöffnung 20x13 mm)&lt;br /&gt;
*4 Bohrungen (ø 3,5 mm) zur Befestigung der Platine&lt;br /&gt;
*Maße (LxBxH): 150x60x26 mm. &lt;br /&gt;
&lt;br /&gt;
Das Netzteil hat elektrisch KEINEN Kontakt zum Gehäuse, es sei denn die mit J4 bezeichnete [http://www.mikrocontroller.net/attachment/104993/00027.jpg Brücke] wird auf der Netzteilplatine nachträglich eingelötet. Das ganze ist sehr gut auf dem [http://www.mikrocontroller.net/attachment/104992/00025.jpg Foto] erkennbar.&lt;br /&gt;
Dieser Jumper sorgt dafür, dass die Masse der Sekudärseite mit dem Gehäuse verbunden wird. Dies passiert sowieso über die Receiverplatine; ein gesetzter Jumper sorgt so eher für eine Masseschleife...&lt;br /&gt;
&lt;br /&gt;
Nicht zu verachten ist jedoch der auf dem Netzteil befindliche Kühlkörper. Dieser führt die halbe Netzspannung, also 115V AC! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG: Gegen versehentliche Berührung sichern. Vor Arbeiten am Gerät immer Netzstecker ziehen!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Aussage von Pollin auf Facebook am 27.2.2012: ... leider ist das Schaltnetzteil (350 943) komplett ausverkauft und bekommen es nicht mehr ins Sortiment.&lt;br /&gt;
&lt;br /&gt;
==Bestückungsvarianten der Hauptplatine==&lt;br /&gt;
===DVB-T===&lt;br /&gt;
===DVB-C===&lt;br /&gt;
Die Box kann hardwareseitig QAM256 modulierte Programme wiedergeben.&lt;br /&gt;
&lt;br /&gt;
===DVB-S===&lt;br /&gt;
Offiziell gab es die Box nur mit DVB-T und DVB-C Tunern. Jedoch ist es möglich, nach Auslöten der original Tuner nachträglich DVB-S Tuner zu verbauen. Gemischter Betrieb ist dabei nicht möglich. Dies liegt unter anderem daran, dass moreTV nicht zwei Senderlisten (für jeden Tuner eine eigene) verwaltet, sondern nur eine gemeinsame Senderliste. Mit einem Tuner aus einer defekten DM7020 (Tuner: Philips SU1278) wurde DVB-S erfolgreich getestet.&lt;br /&gt;
Bezugsmöglichkeiten:&lt;br /&gt;
http://www.hm-sat-shop.de/receiver-digital-dreambox/sat-tuner-fuer-dreambox-7020-philips.html&lt;br /&gt;
&lt;br /&gt;
== Bilder/Innenleben ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;300&amp;quot; heights=&amp;quot;225&amp;quot; perrow=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
Bild:moretv_1.jpg|Gesamtansicht&lt;br /&gt;
Bild:moretv_2.jpg|JTAG-Anschluss für LPC921F (unter anderem) und Platz zur Montage einer 3,5&amp;quot; Festplatte&lt;br /&gt;
Bild:moretv_3.jpg|Board komplett&lt;br /&gt;
Bild:moretv_4.jpg|DVI – nicht bestückt&lt;br /&gt;
Bild:moretv_5.jpg|DVB-T Tuner&lt;br /&gt;
Bild:moretv_6.jpg|CPU RAM etc.&lt;br /&gt;
Bild:PNX8950 ohne kuehlkoerper.JPG|CPU ohne Kühlkörper&lt;br /&gt;
Bild:moretv_7.jpg|mini PCI, Sata, CI-Slot, Smartcard&lt;br /&gt;
Bild:moretv_8.jpg|Rückseite komplett&lt;br /&gt;
Bild:moretv_9.jpg|CI-Controller&lt;br /&gt;
Bild:moretv_10.jpg|Sata-Controller&lt;br /&gt;
Bild:moretv_11.jpg|RAM und TDA8024T SmartCard-Interface&lt;br /&gt;
Bild:moretv_12.jpg|LAN DP83816 (fast identisch zu SiS 900)&lt;br /&gt;
Bild:moretv_13.jpg|SW1 auf ON = SW-Update&amp;lt;br/&amp;gt;SW2 auf ON = JTAG Enable&lt;br /&gt;
Bild:moretv_14.jpg|Stromversorgung und zweiter RS-232 Anschluss (J33) oben im Bild (einreihig)&lt;br /&gt;
Bild:moretv_15.jpg|Anschluss J4&lt;br /&gt;
Bild:EJTAG.jpg|CON1: EJTAG für den PNX8950&lt;br /&gt;
Bild:Tuner_Jumper1.JPG|Wie man sieht, müssen keinerlei Jumper gesetzt sein, um DVB-T empfangen zu können.&lt;br /&gt;
Bild:Console.png|RS-232 Console auf J2&lt;br /&gt;
Bild:lpc_8051_power.png|3,3Volt auf J4&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schnittstellen ==&lt;br /&gt;
&lt;br /&gt;
* 4x USB (bei Verwendung von moreTV werden die USB-Ports nicht mehr unterstützt)&lt;br /&gt;
** 3x intern: J31 USB Port3, J46 USB Port2&lt;br /&gt;
** 2x extern: J30 USB Port4 (Frontpanel), CON9 (rückwärtiger USB Port1, unterhalb der RJ45-Buchse)&lt;br /&gt;
** &#039;&#039;&#039;Pinout&#039;&#039;&#039;:&lt;br /&gt;
::* Pin1: +5V (Rot)&lt;br /&gt;
::* PIN2: D-  (Weiss)&lt;br /&gt;
::* PIN3: D+  (Grün)&lt;br /&gt;
::* PIN4: GND (Schwarz)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* 2x RS-232&lt;br /&gt;
:* 1x intern, Pinbelegung (J33)&lt;br /&gt;
::* PIN1: GND&lt;br /&gt;
::* PIN2: TX (Board-&amp;gt;PC)&lt;br /&gt;
::* PIN4: RX (PC-&amp;gt;Board)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:*1x extern, Pinbelegung (J2):&lt;br /&gt;
::* 6 gnd&lt;br /&gt;
::* 5 rx1 r2in MAX2333 (U10)&lt;br /&gt;
::* 4 rx2 r1in MAX2333 (U10)&lt;br /&gt;
::* 3 tx1 T2out MAX2333 (U10)&lt;br /&gt;
::* 2 tx2 T1out MAX2333 (U10)&lt;br /&gt;
::* 1 gnd  0&lt;br /&gt;
::* das O ist die Markierung auf der Platine&lt;br /&gt;
&lt;br /&gt;
== Chips ==&lt;br /&gt;
Übersicht über die verwendeten Bausteine mit Links auf entsprechende Datenblätter, Quellen etc.&lt;br /&gt;
&lt;br /&gt;
* Multimedia-CPU Philips PNX8950EH/M2/S1 (MIPS32)&lt;br /&gt;
**[http://datasheet.octopart.com/PNX8950EH/M2/S1%2C55-NXP-datasheet-8325175.pdf Datasheet PNX8950EH/M2/S1]&lt;br /&gt;
**[http://www.brightsign.biz/documents/HD2000HardwareGuide.pdf Brightsign Hardwareguide]&lt;br /&gt;
**[http://www.kanecomputing.co.uk/pdfs/mds_mds810.pdf MDS-810]&lt;br /&gt;
*[http://www.alldatasheet.com/datasheet-pdf/pdf/98585/SAMSUNG/K4H511638C-UCCC.html 4x 512 MBit DDR SDRAM SAMSUNG K4H511638C-UCCC]&lt;br /&gt;
* [http://www.hynix.com/datasheet/pdf/flash/HY27(U_S)S(08_16)121A%20Series(Rev1.3).pdf HYNIX HY27US08121A 512 Mbit NAND Flash]&lt;br /&gt;
* [http://www.siliconimage.com/docs/SiI-DS-0102-D.pdf SiI3512 SATA150 Controller]&lt;br /&gt;
*[http://www.national.com/ds/DP/DP83816.pdf 10/100 Mbps PCI Ethernet-Controller NATIONAL DP83816]&lt;br /&gt;
* High Speed USB PCI Host Controller Philips ISP1561BM [http://www.nxp.com/acrobat_download2/expired_datasheets/ISP1561_2.pdf Datasheet]&lt;br /&gt;
* [http://www.maxim-ic.com/datasheet/index.mvp/id/1068 MAX3222]&lt;br /&gt;
* PNX8510HW [http://www.datasheetcatalog.org/datasheet/philips/PNX8510_PNX8511_4.pdf Datasheet]&lt;br /&gt;
* Bedienteil mit LED-Display, Infrarotempfänger usw.&lt;br /&gt;
* In der DVB-C-Version: Philips CU1216 DVB-C Tuner [http://read.pudn.com/downloads138/sourcecode/others/589797/CU1216L-3-datasheet.pdf Datasheet]&lt;br /&gt;
** Philips TDA10023 (DVB-C Channel Decoder) [http://www.datasheetdownload.com/download.php?id=677273 Datasheet]&lt;br /&gt;
* In der DVB-T-Version: Philips TU1216 DVB-T Tuner&lt;br /&gt;
** Philips TDA10046 (DVB-T Channel Decoder) [http://www.nxp.com/acrobat/literature/9397/75009522.pdf Spec Sheet] [http://git.linuxtv.org/media_tree.git?a=blob;f=drivers/media/dvb/frontends/tda1004x.c - linuxtv.org Frontend Treiber]&lt;br /&gt;
** Philips TDA6650 (5 V mixer/oscillator and low noise PLL synthesizer for hybrid terrestrial tuner) [http://www.nxp.com/documents/data_sheet/TDA6650TT_6651TT.pdf Datasheet] [http://git.linuxtv.org/media_tree.git?a=blob;f=drivers/media/dvb/frontends/tda665x.c - linuxtv.org Tuner Treiber]&lt;br /&gt;
* Philips TDA8024T (IC Card Interface) [http://www.nxp.com/documents/data_sheet/TDA8024.pdf Datasheet]&lt;br /&gt;
* U19: [http://ics.nxp.com/products/lpc900/all/~P89LPC921/ Philips P89LPC921] 8-Bit Mikrocontroller mit 8051-Kern&lt;br /&gt;
* U24: [http://www.nxp.com/documents/data_sheet/PCF8563.pdf Philips PCF8563T] Echtzeituhr (RTC)&lt;br /&gt;
* U82 (SOIC) oder U38 (DIP): [http://atmel.com/dyn/resources/prod_documents/doc5140.pdf Atmel 93C46] 1kbit serial EEPROM&lt;br /&gt;
&lt;br /&gt;
Nicht bestückte ICs:&lt;br /&gt;
* U42 DVI (wahrscheinlich [http://www.nxp.com/products/interface_and_connectivity/hdmi/hdmi_transmitters/TDA9981B.html Philips TDA9983])&lt;br /&gt;
* U40 ????&lt;br /&gt;
* U41 ????&lt;br /&gt;
* U44 ????&lt;br /&gt;
* U45 ????&lt;br /&gt;
* U48 ????&lt;br /&gt;
* U51 ????&lt;br /&gt;
* U59 ????&lt;br /&gt;
&lt;br /&gt;
== Fernbedienung ==&lt;br /&gt;
Bitte bei der Fernbedienung RCX161 von Pollin beachten:&lt;br /&gt;
Das ist eine FB, die für unterschiedliche Geräte gedacht ist. Wenn die FB nicht im richtigen Modus ist, dann blinkt zwar der Receiver bei jedem Tastendruck, TUT ABER NIX! Die Knöpfe links oben schalten den Code und/oder die Adressen um:&amp;lt;br /&amp;gt;&lt;br /&gt;
- TV  : schaltet auf RC5 (Adresse 0) um&amp;lt;br /&amp;gt;&lt;br /&gt;
- STB : schaltet auf NEC-Protokoll (Adresse 68) um. Das ist die Betriebsart für die weiter unten beschriebenen Tastencodes. Beispiel: &lt;br /&gt;
        Taste &amp;quot;1&amp;quot; gedrückt --&amp;gt; 446B10EFh wird empfangen. &lt;br /&gt;
        das entspricht Adresse 68 (44h) und Code 16 (10h)&amp;lt;br /&amp;gt;&lt;br /&gt;
- DVD : schaltet auf NEC-Protokoll (Adresse 0) um.&amp;lt;br /&amp;gt;&lt;br /&gt;
- VCR : wahrscheinlich JVC-Format (nur 37 Halbbits)&amp;lt;br /&amp;gt;&lt;br /&gt;
        hier mal ne Aufzeichnung:&lt;br /&gt;
        8.1 ms Lo, 3.8 ms Hi, 0.5 ms Lo, 1.39 ms Hi, 0.55 ms Lo ....&lt;br /&gt;
- AUX : schaltet auf NEC-Protokoll (Adresse 32)&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Tastencodes sind je nach Gerät unterschiedlich.&lt;br /&gt;
Die NEC-Protokolle sind klassisch, d.h. im 1. Byte kommt die Adresse,&lt;br /&gt;
im 2. Byte die negierte Adresse, im 3. Byte der Tastencode und im&lt;br /&gt;
4.Byte der negierte Tastencode. (Es gibt auch FB, die es mit den&lt;br /&gt;
negierten Adressen und Codes nicht so genau nehmen)&lt;br /&gt;
&lt;br /&gt;
[[IRMP]] Codes (nur für den Modus &amp;quot;STB&amp;quot;):  &lt;br /&gt;
&lt;br /&gt;
Protokoll: NEC&amp;lt;br /&amp;gt;&lt;br /&gt;
Geräte ID: 68 (dez) bzw. 0x6B44&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Tastencodes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Code || Taste&lt;br /&gt;
|-&lt;br /&gt;
| 00 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 01 || EXIT&lt;br /&gt;
|-&lt;br /&gt;
| 02 || 8&lt;br /&gt;
|-&lt;br /&gt;
| 03 || INFO&lt;br /&gt;
|-&lt;br /&gt;
| 04 || 4&lt;br /&gt;
|-&lt;br /&gt;
| 05 || Stumm&lt;br /&gt;
|-&lt;br /&gt;
| 06 || HELP&lt;br /&gt;
|-&lt;br /&gt;
| 07 || OK&lt;br /&gt;
|-&lt;br /&gt;
| 08 || 2&lt;br /&gt;
|-&lt;br /&gt;
| 09 || REC&lt;br /&gt;
|-&lt;br /&gt;
| 0B || Marker&lt;br /&gt;
|-&lt;br /&gt;
| 0C || 6&lt;br /&gt;
|-&lt;br /&gt;
| 0E || Down&lt;br /&gt;
|-&lt;br /&gt;
| 0F || V-&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 11 || AV&lt;br /&gt;
|-&lt;br /&gt;
| 12 || 9&lt;br /&gt;
|-&lt;br /&gt;
| 13 || Right&lt;br /&gt;
|-&lt;br /&gt;
| 14 || 5&lt;br /&gt;
|-&lt;br /&gt;
| 15 || Archiv&lt;br /&gt;
|-&lt;br /&gt;
| 17 || P-&lt;br /&gt;
|-&lt;br /&gt;
| 18 || 3&lt;br /&gt;
|-&lt;br /&gt;
| 19 || Up&lt;br /&gt;
|-&lt;br /&gt;
| 1A || Yellow&lt;br /&gt;
|-&lt;br /&gt;
| 1B || Left&lt;br /&gt;
|-&lt;br /&gt;
| 1C || 7&lt;br /&gt;
|-&lt;br /&gt;
| 1D || Stop/LIVE&lt;br /&gt;
|-&lt;br /&gt;
| 1E || RED&lt;br /&gt;
|-&lt;br /&gt;
| 1F || V+&lt;br /&gt;
|-&lt;br /&gt;
| 40 || MORE&lt;br /&gt;
|-&lt;br /&gt;
| 41 || LIST&lt;br /&gt;
|-&lt;br /&gt;
| 42 || FFWD&lt;br /&gt;
|-&lt;br /&gt;
| 44 || Chap-&lt;br /&gt;
|-&lt;br /&gt;
| 46 || Play&lt;br /&gt;
|-&lt;br /&gt;
| 48 || TV&lt;br /&gt;
|-&lt;br /&gt;
| 49 || #&lt;br /&gt;
|-&lt;br /&gt;
| 4A || GREEN&lt;br /&gt;
|-&lt;br /&gt;
| 4C || EPG&lt;br /&gt;
|-&lt;br /&gt;
| 4E || SLOW&lt;br /&gt;
|-&lt;br /&gt;
| 50 || P+&lt;br /&gt;
|-&lt;br /&gt;
| 51 || *&lt;br /&gt;
|-&lt;br /&gt;
| 52 || POWER&lt;br /&gt;
|-&lt;br /&gt;
| 54 || FREW&lt;br /&gt;
|-&lt;br /&gt;
| 56 || PAUSE&lt;br /&gt;
|-&lt;br /&gt;
| 58 || Setup&lt;br /&gt;
|-&lt;br /&gt;
| 59 || TEXT&lt;br /&gt;
|-&lt;br /&gt;
| 5A || BLUE&lt;br /&gt;
|-&lt;br /&gt;
| 5C || Chap+&lt;br /&gt;
|-&lt;br /&gt;
| 5E || PiP&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DVI Schnittstelle ==&lt;br /&gt;
&lt;br /&gt;
Das Layout für eine DVI Buchse ist vorhanden. Leider ist dieses nicht bestückt. Bisher ist keine erfolgreiche Bestückung bekannt. Hier wird nun der aktuelle Stand dokumentiert.&lt;br /&gt;
&lt;br /&gt;
Den aktuellen Stand findet Ihr hier: http://www.mikrocontroller.net/topic/226429&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Momentane Bauteilliste:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* U42: NXP TDA9984BHW&lt;br /&gt;
* D70, D74: BOURNS CDSC706-0504C&lt;br /&gt;
* L121-L124: TDK ACM2012-900-2P&lt;br /&gt;
* U41: ON SEMICONDUCTOR MC74VHC1GT50DFT1&lt;br /&gt;
* Q2, Q3: NXP BSS123 oder BSH112&lt;br /&gt;
* Q25: LM1117IMPX-ADJ&lt;br /&gt;
* L136, L137, L140: ?&lt;br /&gt;
&lt;br /&gt;
= Anwendungen und Ideen =&lt;br /&gt;
&lt;br /&gt;
==Realisierte Projekte/Anwendungen für MoreTV==&lt;br /&gt;
&lt;br /&gt;
Hier finden sich Installationsanleitungen zu verschiedenen Softwarepaketen und Erweiterungen. Da das System keine .cab-Dateien unterstützt muss dabei viel manuell erledigt werden. Viele der Anpassungen laufen auch mit dem original Windows CE.&lt;br /&gt;
&lt;br /&gt;
=== FTP-Server installieren  ===&lt;br /&gt;
* Auf der Festplatte in der Datei &amp;quot;moreTV.cfg&amp;quot; im Abschnitt &amp;quot;Shell_startup&amp;quot; die Zeile für den Start des ftp-Servers einfügen&lt;br /&gt;
::  &amp;lt;Shell_startup&amp;gt;&lt;br /&gt;
::  &amp;lt;run cmd=&amp;quot;$H\ftpsvr.exe&amp;quot;/&amp;gt;  &amp;lt;!-- diese Zeile einfügen --&amp;gt;&lt;br /&gt;
::  &amp;lt;run cmd=&amp;quot;$H\moreTV\DC.exe&amp;quot;/&amp;gt;&lt;br /&gt;
::  &amp;lt;!--  &amp;lt;run cmd=&amp;quot;$H\moreTV\Ivon.exe&amp;quot;/&amp;gt; --&amp;gt;&lt;br /&gt;
::  &amp;lt;run cmd=&amp;quot;$H\moreTV\MaxAktiv.exe&amp;quot;/&amp;gt;&lt;br /&gt;
::  &amp;lt;/Shell_startup&amp;gt;&lt;br /&gt;
* Den FTP-Server [http://www.mikrocontroller.net/attachment/104995/ftpsvr.exe hier] downloaden und nach $H:\ kopieren, also in das Hauptverzeichnis des ersten logischen Laufwerkes der Festplatte.&lt;br /&gt;
* Als Login-Daten für den FTP-Server können beliebige Werte eingeben, z.B.&lt;br /&gt;
::   Benutzer: root&lt;br /&gt;
::   Passwort: root&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkungen:&#039;&#039;&#039;&lt;br /&gt;
* Die Exe-Dateien aus dem Windows-Verzeichnis können aber nicht bzw. nicht alle kopiert werden. Im Total-Commander werden die Attribute 555 angezeigt. Vielleicht hat ja noch jemand eine Idee, wie man das überwinden kann. Das sind Dateien, die im ROM angeordnet und bereits auf feste Adressen geladen sind, so dass sie direkt ausführbar sind - also nicht direkt kopier- und an anderer Stelle verwendbar. Idee: wahrscheinlich finden sich diese Dateien in einem Plattform-Kit oder einer EVC-Version (EmbeddedVisualC..) von Microsoft.&lt;br /&gt;
* Der FTP-Server unterstützt nicht alle Befehle des FTP-Protokolls, so ist es mit einigen Clients z.B. nicht möglich eine Datei zu überschreiben - die aktuelle Datei löschen und dann die Neue in den Ordner kopieren funktioniert jedoch.&lt;br /&gt;
&lt;br /&gt;
=== VNC-Server installieren  ===&lt;br /&gt;
* Auf der Festplatte in der Datei &amp;quot;moreTV.cfg&amp;quot; im Abschnitt &amp;quot;Shell_startup&amp;quot; die Zeile für den Start des vnc-Servers einfügen&lt;br /&gt;
::  &amp;lt;Shell_startup&amp;gt;&lt;br /&gt;
::  &amp;lt;run cmd=&amp;quot;$H\winvnc.exe&amp;quot;/&amp;gt;  &amp;lt;!-- diese Zeile einfügen --&amp;gt;&lt;br /&gt;
::  &amp;lt;run cmd=&amp;quot;\Windows\explorer.exe&amp;quot;/&amp;gt;&lt;br /&gt;
::  &amp;lt;run cmd=&amp;quot;$H\moreTV\DC.exe&amp;quot;/&amp;gt;&lt;br /&gt;
::  &amp;lt;!--  &amp;lt;run cmd=&amp;quot;$H\moreTV\Ivon.exe&amp;quot;/&amp;gt; --&amp;gt;&lt;br /&gt;
::  &amp;lt;run cmd=&amp;quot;$H\moreTV\MaxAktiv.exe&amp;quot;/&amp;gt;&lt;br /&gt;
::  &amp;lt;/Shell_startup&amp;gt;&lt;br /&gt;
* Den VNC-Server [http://www.mikrocontroller.net/attachment/105859/winvnc.exe hier] downloaden und nach $H:\ kopieren, also in das Hauptverzeichnis des ersten logischen Laufwerkes der Festplatte.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkungen:&#039;&#039;&#039;&lt;br /&gt;
* Sofern More.TV läuft ist auf dem Client nur ein schwarzer Bildschirm zu sehen. Minimiert man es lässt sich die WinCE-Oberfläche normal nutzen.&lt;br /&gt;
* Durch Auskommentieren der Zeile mit MaxAktiv.exe kann man den automatischen Start der More.TV-Software verhindern, man erhält den üblichen Windows-Desktop. Die Software lässt sich später über die genannte EXE manuell starten.&lt;br /&gt;
&lt;br /&gt;
=== More.TV als UPnP-Client ===&lt;br /&gt;
&lt;br /&gt;
Die More.TV-Firmware kann prinzipiell als UPnP-AV-Client verwendet werden, also Audio- und Videodateien von einem entsprechend ausgestatteten Netzwerkspeicher abspielen. Die Einrichtung wird durch einen Bug erschwert, die Funktion ist recht beschränkt.&lt;br /&gt;
&lt;br /&gt;
Ist die Box korrekt mit dem Netzwerk verbunden kann unter Setup &amp;gt; Netzwerk &amp;gt;&lt;br /&gt;
Media-Server der aktive Medienserver ausgewählt werden. Ist nur ein UPnP-AV-Server im Netz verfügbar wird dieser nicht in der Datenbank eingetragen, versucht man im More-Menü auf &amp;quot;Medien&amp;quot; zuzugreifen erhält man die Meldung &amp;quot;No Media Server found. Please check connection&amp;quot;. Zur Korrekten Einrichtung müssen im Netz zwei Mediaserver vorhanden sein - wählt man nun auf der Box einen aus der Liste aus wird der Server korrekt gespeichert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Technische Info:&#039;&#039; Der aktuelle Mediaserver wird in der Datei &#039;&#039;&#039;/HardDisk/moreTV.persistent/tbConfigurations.xbc&#039;&#039;&#039; als Variable &amp;quot;MEDIA_SERVER&amp;quot; gespeichert. Sie ist als Standard &amp;quot;0&amp;quot;, wenn ein Server ausgewählt ist befindet sich hier der UPnP-Server-Name.&lt;br /&gt;
&lt;br /&gt;
Ist ein Mediaserver eingetragen lässt sich der Menüpunkt &amp;quot;Medien&amp;quot; ohne Fehler aufrufen, es bestehen 3 Ordner (Video, Musik, Bilder). Bei den getesteten Linux-UPnP-Servern mediatomb und fuppes waren diese Ordner leer, ein Zugriff auf die Dateien nicht möglich. Mit dem integrieren Server des Windows Media Players können Dateien abgespielt werden, die Formate sind jedoch auf MPEG/TS und WMV (?) beschränkt, andere Formate führen zu Fehlermeldungen oder dem Aufhängen der Box.&lt;br /&gt;
&lt;br /&gt;
=== The Core Pocket Media Player (TCPMP) ===&lt;br /&gt;
&lt;br /&gt;
TCPMP ist ein hochoptimiertes Abspielprogramm für Videos und Audio. Eine Anleitung zur Installation auf dieser Box ist bei [http://thomson.dreamgates.de/dokuwiki/doku.php?id=sot:installation:telegent#tcpmp_installieren dreamgates.de] zu finden. Es kann wie CE3-Version verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=== Total Commander ===&lt;br /&gt;
&lt;br /&gt;
TotalCommander (TCMD) ist ein alternativer Dateimanager welcher u.A. ZIP-funktionalität und Netzwerkzugriff (SMB,FTP) bietet. Die WinCE-Version steht als .cab zum [http://www.ghisler.com/wince2x.htm Download auf der Herstellerseite] bereit. Sie kann z.B. mit der Software &amp;quot;WinCE Cab Manager&amp;quot; entpackt werden, die Dateien werden in &amp;quot;\Programme\Total Commander&amp;quot; platziert.&lt;br /&gt;
&lt;br /&gt;
==Anwendungsideen==&lt;br /&gt;
&lt;br /&gt;
===Unter Linux===&lt;br /&gt;
* Festplattenreceiver&lt;br /&gt;
* Asterisk Server&lt;br /&gt;
* NAS&lt;br /&gt;
* Car-PC&lt;br /&gt;
* Multimedia Client/Server&lt;br /&gt;
* Wetterstation logging Server&lt;br /&gt;
* Solar logging Server&lt;br /&gt;
&lt;br /&gt;
===Unter WinCE===&lt;br /&gt;
* Festplattenreceiver&lt;br /&gt;
* NAS&lt;br /&gt;
* Car-PC&lt;br /&gt;
* Media Portal Client/Server&lt;br /&gt;
* Kamera Server&lt;br /&gt;
* Spielekonsole für minigames&lt;br /&gt;
* Download Server&lt;br /&gt;
&lt;br /&gt;
==== ROM entpacken / erweitern ====&lt;br /&gt;
Über die Software [http://www.xs4all.nl/~itsme/projects/xda/dumprom.html dumprom] soll sich die Systempartition entpacken lassen, mit [http://www.xs4all.nl/~itsme/projects/xda/romtools.html romtools] vielleicht wieder zusammenbauen.&lt;br /&gt;
 &lt;br /&gt;
Über diesen Weg könnte es möglich sein eine bestehende CE-Installation um weitere Funktionen zu ergänzen. &lt;br /&gt;
&lt;br /&gt;
Beide WinCE-Images können entpackt werden. Zumindest meldet Dumprom keine Fehler.&lt;br /&gt;
Nicht entpackt werden kann bislang nur 0_nboot, Dumprom läuft in eine Endlosschleife.&lt;br /&gt;
&lt;br /&gt;
Hier ein Vergleich des originalen Images mit dem aus der SWU&lt;br /&gt;
&lt;br /&gt;
Dateien in 2_WinCE1, die nicht in SWU_WinCe1 vorkommen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
connmc.exe, connpnl.cpl, conshid.dll, ethman.dll, hidparse.dll, ISP1561-ehci.dll, kbdhid.dll, MouHid.dll, mp3dmod.dll, ndispwr.dll, phStbRootApp.sym, rnaapp.exe, tapi.dll, TT7268M_.TTF, usbhid.dll&lt;br /&gt;
&lt;br /&gt;
zusätzliche Bytes: 594940&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dateien in SWU_WinCe1, die nicht in 2_WinCE1 vorkommen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
av_dll.dll, cedrm2.dll, ddcore.dll, ddhel.dll, ddraw.dll, devcerttemplate.dat, DspImageBuild.txt, icm.dll, imaadpcm.dll, janus_wince.dll, MediaRenderer.dll, mediarenderer.xml, mediarendereravtransportservice.xml, mediarendererconnectionmanagerservice.xml, mediarendererrenderingcontrolservice.xml, msadpcm.dll, msg711.dll, msgsm610.dll, msrle32.dll, mTVshell.exe, phStbRootApp_0.mi.size, phStbRootApp_0.sym, phStbRootApp_1.mi.size, phStbRootApp_1.sym, Pnx8550Mmio.dll, PNX8550_UART.dll, StandbyMicro.mapping, TFFS3.dll, TmStream.dll, wmdrmpd.dat&lt;br /&gt;
&lt;br /&gt;
zusätzliche Bytes: 1587378&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dateien, die ungleich sind: zu viele um sie hier zu posten.&lt;br /&gt;
&lt;br /&gt;
===Hardware-Mods===&lt;br /&gt;
====SATA Power-Mod====&lt;br /&gt;
Der interne Molex für die SATA-Platte liefert an der +12V-Schiene nur ca. 11V welche unter Last bis auf ca. 10V einbrechen können. Für den Anlaufstrom vor allem älterer Festplatten kann dies ggf. zu wenig sein.&lt;br /&gt;
&lt;br /&gt;
Ich habe die +12V der Festplatte vom Molex getrennt und direkt mit der 12V-Schiene des Netzteils verbunden. Da die Kommandos zum Abschalten der Festplatte per SATA gegeben werden ist der Standby-Betrieb durch diese Änderung nicht beeinträchtigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Antennenspannung für aktive Antennen über den Receiver (DVB-T)====&lt;br /&gt;
Neben dem Tuner 1 befinden sich zwei unbestückte Lötaugen (siehe Foto). Werden diese miteinander verbunden, liegt am Antennenanschluss 5V für die Versorgung einer aktiven Antenne über den Receiver an.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;300&amp;quot; heights=&amp;quot;225&amp;quot; perrow=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
Bild:Antennenanschluss.jpg|5V Antennenspannung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= weitergehende Infos im Netz =&lt;br /&gt;
Alles was noch weiterführende Infos bietet. Andere Wikis, Beiträge, etc.&lt;br /&gt;
* [http://www.oohito.com/wince/mips_o_j.htm MIPS FTP Server]&lt;br /&gt;
* [http://thomson.dreamgates.de/dokuwiki/doku.php?id=stb:telegent:15666:start Dreamgates.de - TG 15666/EVO1]&lt;br /&gt;
* [http://hackdaworld.org/cgi-bin/awki.cgi/PnxStb hacking a pnx8950 based set top box]&lt;br /&gt;
* [http://linux-party.at/ Elecard Linux Installation - VDR mit streamdev (siehe Schnelleinstieg)]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Boards]]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR&amp;diff=77441</id>
		<title>AVR</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR&amp;diff=77441"/>
		<updated>2013-07-02T13:41:25Z</updated>

		<summary type="html">&lt;p&gt;Sternst: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die AVR-[[Mikrocontroller]] von [http://www.atmel.com Atmel] sind wegen ihrer übersichtlichen internen Struktur, der [[ISP | In-System-Programmierbarkeit]], und der Vielzahl von kostenlosen Programmen zur Softwareentwicklung (Assembler, Compiler) beliebt. Diese Eigenschaften und der Umstand, dass viele Typen in einfach handhabbaren DIL-Gehäusen (DIP) verfügbar sind, machen den AVR zum idealen Mikrocontroller für Anfänger. &lt;br /&gt;
&lt;br /&gt;
Über die Bedeutung des Namens &amp;quot;AVR&amp;quot; gibt es verschiedene Ansichten; manche meinen er sei eine Abkürzung für &#039;&#039;&#039;A&#039;&#039;&#039;dvanced &#039;&#039;&#039;V&#039;&#039;&#039;irtual [[RISC|&#039;&#039;&#039;R&#039;&#039;&#039;ISC]], andere vermuten dass der Name aus den Anfangsbuchstaben der Namen der Entwickler (&#039;&#039;&#039;A&#039;&#039;&#039;lf Egin Bogen und &#039;&#039;&#039;V&#039;&#039;&#039;egard Wollan &#039;&#039;&#039;R&#039;&#039;&#039;ISC) zusammengesetzt wurde. Laut Atmel ist der Name bedeutungslos.&lt;br /&gt;
&lt;br /&gt;
==Architektur==&lt;br /&gt;
&lt;br /&gt;
Die Architektur ist eine 8-Bit-[[Harvard-Architektur]], das heißt, es gibt getrennte Busse zum Programmspeicher ([[Speicher#Flash-ROM |Flash-ROM]], dieser ist 16 bit breit) und Schreib-Lese-Speicher ([[Speicher#RAM |RAM]]). Programmcode kann ausschließlich aus dem Programmspeicher ausgeführt werden. Weiterhin sind die Adressräume getrennt (d.h. die erste Speicherstelle im Flash-Speicher hat die gleiche Adresse (0) wie die erste Speicherstelle im RAM). Bei der Programmierung in Assembler und einigen C-Compilern bedeutet dies, dass sich Konstanten aus dem ROM nicht mit dem gleichen Code laden lassen wie Daten aus dem RAM. Abgesehen davon ist der Aufbau des Controllers recht übersichtlich und birgt wenige Fallstricke.&lt;br /&gt;
&lt;br /&gt;
* 32 größtenteils gleichwertige Register&lt;br /&gt;
* davon 1-3 16-bit-Zeigerregister (paarweise)&lt;br /&gt;
* ca. 110 Befehle, die meist 1-2 Taktzyklen dauern&lt;br /&gt;
* Taktfrequenz bis 32MHz&lt;br /&gt;
* Betriebsspannung von 1,8 - 5,5 V&lt;br /&gt;
* Speicher&lt;br /&gt;
**1-256 kB [[Speicher#Flash-ROM | Flash-ROM]]&lt;br /&gt;
**0-4 kB [[Speicher#EEPROM | EEPROM]]&lt;br /&gt;
**0-16 kB [[speicher#RAM | RAM]]&lt;br /&gt;
* Peripherie: [[AD-Wandler]] 10 bit, 8- und 16-Bit-[[Timer]] mit [[PWM]], [[SPI]], [[I²C]] (TWI), [[UART]], Analog-[[Komparator]], [[Watchdog]]&lt;br /&gt;
* [[Speicher#Mit_XMEM-Interface | 64kB Externer SRAM]] (ATmega128, ATmega64,  ATmega8515/162); (Bei den XMEGAs bis zu 16 MB (128 Mbit) externer SDRAM)&lt;br /&gt;
* [[JTAG]] bei den größeren ATmegas&lt;br /&gt;
* [[debugWire]] bei den neueren AVRs&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
* [http://www.mikroe.com/mikropascal/avr]: Mikropascal, mit einer eingeschränkten kostenlosen Testversion&lt;br /&gt;
* [[AVR-Studio]]: Kostenlose Enwicklungsumgebung mit Simulator&lt;br /&gt;
* [http://sourceforge.net/projects/kontrollerlab/ KontrollerLab]: Kostenlose Entwicklungsumgebung für KDE&lt;br /&gt;
* [http://corpsman.de/index.php?doc=projekte/klab Klab]: Kostenlose Entwicklungsumgebung für KDE/GTK2/Win32 (als FPC/Lazarus Quellcode verfügbar, Nachbau von KontrollerLab)&lt;br /&gt;
* [http://www.microsoft.com/germany/Express/product/visualcplusplusexpress.aspx Microsoft Visual C++ Express]: Kostenlose Enwicklungsumgebung (Win),über makefile&lt;br /&gt;
* [http://netbeans.org Netbeans]: Plugin-basierte, kostenlose Entwicklungsumgebung (Windows, Mac, Linux, und Solaris). [http://mattzz.dyndns.org/wiki/bin/view/Projects/ArduinoAndNetbeans  Hier] findet sich ein Howto für das Setup von AVR (z.B. für Arduino)&lt;br /&gt;
* [[AVR Eclipse]]: Plugin-basierte kostenlose Entwicklungsumgebung (Win, Linux, Mac)&lt;br /&gt;
* [[Code::Blocks]]: Freie Entwicklungsumgebung (Win, Linux, Mac), die auch für AVR-Projekte Unterstützung anbietet&lt;br /&gt;
* [[AVR-GCC]]: Kostenloser C-Compiler&lt;br /&gt;
* [[LunaAVR]]: Kostenlose, objektbasierte Basic/Pascal-ähnliche Programmiersprache und Entwicklungsumgebung mit Compiler/Assembler und Disassembler (Win, Linux, Mac). http://avr.myluna.de&lt;br /&gt;
* [http://sourceforge.net/projects/avra/ AVRA]: freier AVR-Assembler&lt;br /&gt;
* [http://www.mcselec.com/bascom-avr.htm Bascom AVR] beliebter Basic-Compiler&lt;br /&gt;
* [http://www.e-lab.de AVRCo Pascal Compiler]&lt;br /&gt;
* [http://amforth.sourceforge.net/ amforth]:  interaktiver und erweiterbarer Kommandointerpreter für AVR unter GNU Lizenz (Open Source)&lt;br /&gt;
* [[SJC]]: Experimenteller Java-Compiler unter GPL mit AVR-Unterstützung&lt;br /&gt;
* [http://www.atnel.pl/mkAVRCalculator_build_57en.rar mkAvrCalculator]: User friendly fuse bits calculator and GUI for avrdude&lt;br /&gt;
&lt;br /&gt;
== Boards &amp;amp; Starterkits ==&lt;br /&gt;
&lt;br /&gt;
Siehe dazu auch die Artikel in der [[:Kategorie:AVR-Boards|Kategorie AVR-Boards]] und den Artikel zur [[AVR_In_System_Programmer|AVR Programmierung]].&lt;br /&gt;
&lt;br /&gt;
* [[STK200]]&lt;br /&gt;
* [[STK500]]&lt;br /&gt;
* [[STK600]]&lt;br /&gt;
* [[AVR Dragon]] &lt;br /&gt;
* [[AVR Butterfly]]&lt;br /&gt;
* [[AVR Raven]]&lt;br /&gt;
* AVR-ISP / AVR-ISP mkII&lt;br /&gt;
* [http://www.ehajo.de/Bausaetze/AVR-ISP-Stick AVR-ISP-Stick]&lt;br /&gt;
* [http://www.ehajo.de/Bausaetze/µISP-Stick µISP-Stick]&lt;br /&gt;
* AVR JTAG-ICE&lt;br /&gt;
* [http://www.robotikhardware.de RN-Control]&lt;br /&gt;
* [http://www.conrad.de C-Control PRO]&lt;br /&gt;
* [http://www.myavr.de myAVR Board]&lt;br /&gt;
* [http://www.rowalt.de AVR Lehrbuch und -bausatz]&lt;br /&gt;
* [http://www.pollin.de Pollin] - preiswerte Starterkits sowie Lösungen für RFID-125kHz und EtherNet&lt;br /&gt;
* [http://www.lochraster.org/rumpus Rumpus von lochraster.org] ist ein günstiges und gut dokumentiertes Starterkit mit Atmega 168&lt;br /&gt;
* [http://www.das-labor.org/wiki/Laborboard  Laborboard von das-labor.org] - Bauplan Lochrasterplatine mit Atmega32&lt;br /&gt;
* [http://nibo.nicai-systems.de Roboterbausatz NIBO 2] - autonomer Roboter mit einem ATmega128 und einem ATmega88 / [http://nibobee.nicai-systems.de Roboterbausatz NIBObee] - Roboter für Einsteiger mit ATmega16 und integriertem USB-Programmer&lt;br /&gt;
* [http://www.nerdkits.com Nerdkit - Starterkit inkl. Doku] - ideal für Anfänger&lt;br /&gt;
* [http://arduino.cc/ Arduino] - Ein modulares System mit verschiedenen Entwicklungsboards (insbesondere auch eins mit ATmega1280, dem mit den vielen dünnen Beinchen), das aufgrund der Nutzung einer JAVA-IDE und &amp;quot;Wiring&amp;quot; besonders einfach zu nutzen ist. Es gibt verschiedene Clones unter Namen wie Freeduino, Seeeduino etc., auch den Lilypad zum Einnähen in Kleidung und Verschaltung mittels leitender Fäden. Die neueren Versionen können über einen standardmäßig mit ausgelieferten Bootloader ohne sonstige Hardware direkt über USB bespielt werden.&lt;br /&gt;
* [http://www.aevum-mechatronik.de Modularis] - AVR Mikrocontroller-Boards (z.T. mit Zusatz-Speicher und USB) die über Flachbandkabel erweitert werden können. Es gibt bis jetzt Zubehör-Module mit Taster, Motor H-Brücke, XBee und Winkelsensor.&lt;br /&gt;
* [http://www.b-redemann.de AVR Mikrocontroller Lehrbuch (R. Walter, 3. Auflage 2009) und Bauteilesatz incl. Leiterplatte; www.b-redemann.de]&lt;br /&gt;
* [http://weigu.lu/b/mices2 mices2] - Entwicklungsboard zum [http://www.weigu.lu/a Gratis Assembler Kurs]. Integriertes Programmiergerät (USB, avrisp mk2 kompatibel). Spannungsvrsorgung über USB. Platine einseitig, leicht zu bestücken. Viele Schnittstellen (1-Wire, I2C, EIA232 ...), D/A-Wandler, Mikrofonschaltung., Audioverstärker ...&lt;br /&gt;
* [https://guloshop.de/shop/Mikrocontroller-Programmierung/::45.html gulostart] – [[Steckbrett|Steckplatinen]]-basiertes Lernpaket / Einsteiger-Set mit ausführlicher Anleitung. Verwendet ausschließlich [http://de.wikipedia.org/wiki/Open_source Open-Source-Software], kann fast alle DIP-ATtiny/ATmega programmieren. Für USB-Schnittstelle.&lt;br /&gt;
* [http://corpsman.de/index.php?doc=avrnetio/atmegaboard Atmegaboard] Eagle Daten für ein Testboard zur Nutzung 2er Atmegas gleichzeitig. Weitere Adapterplatinen sowie Source Code sind ebenfalls verfügbar.&lt;br /&gt;
* [http://matrixstorm.com/avr/tinyusbboard/ tinyUSBboard] - Ein sehr sehr preiswertes, Arduino und BASCOM kompatibles Board mit onboard USB Interface und [http://matrixstorm.com/avr/tinyusbboard/#firmwaresotherbootloader auswechelbarem Bootloader].&lt;br /&gt;
* [http://www.ehajo.de/Bausaetze/aTeVaL aTeVaL-Board] - Nachfolger des bekannten Pollin Evalboards. ISP-mkii-Klon &amp;amp; Seriell/USB-Wandler via USB. Testhardware auf der Platine: Taster, LED, Summer, Potis, ...&lt;br /&gt;
* [https://www.olimex.com/Products/AVR/ verschiedene Boards von Olimex]&lt;br /&gt;
&lt;br /&gt;
== Projekte ==&lt;br /&gt;
Siehe dazu auch die Artikel in der [[:Kategorie:AVR-Projekte|Kategorie AVR-Projekte]].&lt;br /&gt;
&lt;br /&gt;
* [[PWM_foxlight]] - LED Lampe mit PWM&lt;br /&gt;
* [[Digitaler Funktionsgenerator]]&lt;br /&gt;
* [[Midi Rekorder mit MMC/SD-Karte]]&lt;br /&gt;
* [[Schrittmotor-Controller (Stepper)]]&lt;br /&gt;
* [[Pulsuhrempfänger mit AVR Butterfly]]&lt;br /&gt;
* [[DCF77-Funkwecker mit AVR]]&lt;br /&gt;
* [[Fahrradcomputer]]&lt;br /&gt;
* [[Einfacher und billiger Webserver mit AtMega32]]&lt;br /&gt;
* [[AVR RFM12]]&lt;br /&gt;
* [[RF SOAP]] USB / AtMega88 / RFM12, optional LiPo Akku mit Lader&lt;br /&gt;
* [http://www.andreadrian.de/schach/#Selbstbau_Schachcomputer_SHAH Selbstbau Schachcomputer SHAH mit ATMega88V]&lt;br /&gt;
* [[Giess-o-mat]] - vollautomatische Blumengießanlage&lt;br /&gt;
* [http://www.zipfelmaus.com/led-flitzer/ POV-LED mit ATmega8, USB und Beschleunigungssensor]&lt;br /&gt;
* [http://g-heinrichs.de/attiny/ ATtiny-Mikrokontroller für Schulbedarf]&lt;br /&gt;
* [http://www.weigu.lu/b Kleine USB-Bibliothek (C, BASCOM und Assembler) für ATMEL-USB-AVRs]&lt;br /&gt;
* [http://volkszaehler.org/ Ein tolles Smartmeter mit kompletter Middleware!]&lt;br /&gt;
&lt;br /&gt;
== Tutorials ==&lt;br /&gt;
&lt;br /&gt;
* [[AVR-Tutorial]]&lt;br /&gt;
* [[AVR-GCC-Tutorial]]&lt;br /&gt;
* http://www.avr-asm-tutorial.net&lt;br /&gt;
* [http://www.weigu.lu/a weigu.lu/a]: Gratis Assembler Kurs (pdf). Mehrere hundert Seiten mit vielen neuen Grafiken. Besonders zum Selbststudium geeignet. Es existiert auch ein [http://www.weigu.lu/b/mices2 Entwicklungsboard] zum Kurs.&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
 	&lt;br /&gt;
* C.Kühnel Programmieren der AVR RISC Mikrocontroller mit BASCOM-AVR ISBN 3898119378 (2000) ISBN 3907857046 (2.Aufl.2004) ISBN 978-3-907857-14-4 (3. überarbeitete und erweiterte Auflage 2010)&lt;br /&gt;
* R.Mittermayr AVR-RISC: Embedded Software selbst entwickeln Franzis 2008 ISBN 3772341071&lt;br /&gt;
* F.Schäffer AVR: Hardware und C-Programmierung in der Praxis Elektor 2008 ISBN 3895762008 [http://www.blafusel.de/books/avr.html Webseite des Autors, Codebeispiele und Leseprobe]&lt;br /&gt;
* G.Schmitt Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie...Oldenbourg 4.Aufl.2008  ISBN 3486587900 ISBN 3486580167 (2006) ISBN 3486577174 (2005) [http://www.oldenbourg-wissenschaftsverlag.de/olb/de/1.c.1495224.de Verlags-Webseite mit Buchauszügen]&lt;br /&gt;
* M.Schwabl-Schmidt Programmiertechniken für AVR-Mikrocontroller Elektor 2008 ISBN 3895761761 [http://www.schwabl-schmidt.de/index.php/buecher Webseite des Autors]&lt;br /&gt;
* M.Schwabl-Schmidt Systemprogrammierung für AVR-Mikrocontroller Elektor 2009 ISBN 3895762180&lt;br /&gt;
* W.Trampert Messen,Steuern und Regeln mit AVR Mikrocontrollern Franzis 2004 ISBN 3772342981&lt;br /&gt;
* W.Trampert AVR-RISC Mikrocontroller Franzis ISBN 3772354769 (2003) ISBN 3772354742 (2002) ISBN 3772354750 (2000)&lt;br /&gt;
* P.Urbanek Embedded Systems: Ein umfassendes Grundlagenwerk ... (2007) ISBN 3981123018 [http://www.ulb.tu-darmstadt.de/tocs/188146911.pdf Inhaltsverzeichnis]&lt;br /&gt;
* S./F.Volpe AVR-Mikrocontroller-Praxis Elektor 2001 ISBN 3895760633&lt;br /&gt;
* R.Walter AVR-Mikrocontroller-Lehrbuch 3. Auflage Denkholz 2009 ISBN 9783981189445 [http://www.rowalt.de/mc/avr/avrbuch/index.htm Webseite des Autors, Buch-Download in geringer Auflösung]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tipps &amp;amp; Hinweise ==&lt;br /&gt;
&lt;br /&gt;
* [[AVR Typen]] - Die verschiedenen Typen (AT90S, ATmega, ATtiny)&lt;br /&gt;
* [[AVR Checkliste]] - Liste mit Hinweisen zur Lösung üblicher Probleme&lt;br /&gt;
* [http://blog.coldtobi.de/1_coldtobis_blog/archive/87_little_endianess_guide_for_atmel_avr.html (Little) Endianess Guide for Atmel AVR] Übersicht über die Endianess der AVR und AVR32&lt;br /&gt;
* [[AVR Fuses|Fuse-Bits]] - Das Setzen der Fuse-Bits ist ein berüchtigter Fallstrick bei den AVRs; vor dem Rumspielen damit unbedingt diese Hinweise lesen!&lt;br /&gt;
* [[AVR In System Programmer]] - Programmierhardware&lt;br /&gt;
* [[Pony-Prog Tutorial]] - Hinweise zur Programmiersoftware PonyProg&lt;br /&gt;
* [[AVRDUDE]] - Programmiersoftware für die Kommandozeile&lt;br /&gt;
* [[AVR-GCC-Codeoptimierung]] - Wie man mehr aus dem Controller herausholen kann, ohne ein Assembler-Guru sein zu muessen.&lt;br /&gt;
* [[AVR Softwarepool]] - Verschiedene Softwaremodule und Codeschnippsel aus der Codesammlung&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://revision3.com/systm/avr101 AVR101] - systm Videocast von Revision3 Internet Television (engl.).&lt;br /&gt;
&lt;br /&gt;
Weitere Verweise (Links) auf externe Informationen und Projekte finden sich in der &#039;&#039;&#039;[[Linksammlung#AVR|Linksammlung]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Anmerkungen ===&lt;br /&gt;
&lt;br /&gt;
Es gibt nur wenige Typen mit D/A-Wandler (z.B. AT90PWM2); hierfür benutze man PWM oder externe Bausteine.&lt;br /&gt;
&lt;br /&gt;
Die Takterzeugung ist bei AVRs recht einfach gehalten. So gibt es bei den meisten Modellen keine internen PLLs um „krumme“ Prozessor- oder Peripherietaktfrequenzen zu erzeugen, noch ist der Peripherie-Takt vom Prozessortakt abkoppelbar. Einige AVR verfügen über eine PLL, um damit z.B. einen Timer mit Frequenzen über der Systemfrequenz zu takten oder höhere Systemfrequenz aus niederfrequenteren Taktquellen zu erzeugen (vgl. u.a. Datenblatt ATtiny861). Die Baudrate serieller Schnittstellen lässt sich nicht gebrochen einstellen, so dass gegebenenfalls ein zur Baudrate passender Quarz oder Resonator zu verwenden ist.&lt;br /&gt;
&lt;br /&gt;
Für die serielle Programmierung des Flash-Speichers sind 4 Datenleitungen erforderlich und die Taktversorgung muss sicher gestellt sein. Es ist darauf zu achten, dass bei Einstellung der Taktquelle (Fuses) auch die vorhandene Taktquelle ausgewählt wird. Für die Hochvolt-Programmierung (so genannt wegen 12 V am RESET-Anschluss) werden je nach Chip sehr viele Leitungen benötigt. Einige Modelle verfügen über eine Debugwire-Schnittstelle, für die im Betrieb zwei Leitungen ausreichen.&lt;br /&gt;
&lt;br /&gt;
Nicht zu verwechseln ist die 8-bit-AVR-Serie mit AVR32. Letztere ist eine 32-bit-Architektur mit recht viel Ähnlichkeit zu Controllern auf Basis eines ARM-Cores. Controller der ATxmega-Serie verfügen über mehr Funktionen als die &amp;quot;traditionellen&amp;quot; AVR (z.B. DMA- und Eventsystem, 12Bit A-D-Wandler). ATxmega sind jedoch für 3,3V-Betrieb ausgelegt und ausschließlich in SMD-Bauform erhältlich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Mikrocontroller]]&lt;br /&gt;
[[Category:AVR| ]]&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Entwicklungsboard_mit_PIC&amp;diff=75788</id>
		<title>Entwicklungsboard mit PIC</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Entwicklungsboard_mit_PIC&amp;diff=75788"/>
		<updated>2013-05-22T13:33:31Z</updated>

		<summary type="html">&lt;p&gt;Sternst: Änderung 75782 von 175.42.95.150 (Diskussion) wurde rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Wettbewerb]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;von Denys Maiier&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
      [[Datei:brd mini.jpg]]  [[Datei:Entwicklungsboard_gefräst.JPG]]&lt;br /&gt;
&lt;br /&gt;
== Vorwort ==&lt;br /&gt;
&lt;br /&gt;
Dieses Kit dient als Lehrmittel  für Studenten, Schüler und diejenigen, die Grundlagen und Funktionalität der Mikroprozessortechnik, am Beispiel des Microcontrollers der PIC18 Familie von der Firma Microchip, beherrschen möchten.  Mit Hilfe der im Kit erhaltenen Modulen  können folgende Programmieraufgaben gelöst werden:&lt;br /&gt;
&lt;br /&gt;
•	Ein- und Ausgabe über I/O Ports und Kontrolle  der Ausgabe über 16 LED’s&lt;br /&gt;
&lt;br /&gt;
•	Externe Programmunterbrechung über 3 Interruptquellen(3 Buttons)&lt;br /&gt;
&lt;br /&gt;
•	Verbindung mit dem PC über UART &lt;br /&gt;
&lt;br /&gt;
•	Datenübertragung über IR&lt;br /&gt;
&lt;br /&gt;
•	Tonausgabe (Buzzer)&lt;br /&gt;
&lt;br /&gt;
•	Datenübertragung über SPI und I²C  im Halb-Duplex-Mode&lt;br /&gt;
&lt;br /&gt;
•	Schrittmotorensteuerung&lt;br /&gt;
&lt;br /&gt;
•	Dynamische Tastatureingabe&lt;br /&gt;
&lt;br /&gt;
•	AD- Umwandlung&lt;br /&gt;
&lt;br /&gt;
•	Datenausgabe auf dem HD44780 Display&lt;br /&gt;
&lt;br /&gt;
== Projektinhalt ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
     a.	Mainboard&lt;br /&gt;
     b.	SPI-Board&lt;br /&gt;
     c.	I²C-Board&lt;br /&gt;
     d.	Com-Board&lt;br /&gt;
     e.	Hitachi LCD Board&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Projekt der Entwicklungsplatine basiert sich auf dem PIC 18F4520 Microcontroller und besteht aus dem Main-board und Peripherie-Modulen , die mit Hilfe der Kabelverbindungen mit Main-board verbunden werden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Mainboard ==&lt;br /&gt;
&lt;br /&gt;
Mainboard verfügt über 33 I/O Ports, die allerdings spezifisch benutzt werden können. Die PORTB I/O Pins können softwaremäßig an die innere Pull-Up Widerstände angeschlossen werden. Das MCU wird über Quarz/Keramik Oszillator taktversorgt.Die Kapazität der Kondensatoren liegt im Bereich 15-25pF und von den Quartzeigenschaften abhängig.Die empfohlene Größe steht üblicherweise im Datenblatt. Buzzer SG1  kann anhand dem Jumper JP2 an Port RE2 angeschlossen werden. Drei Tasten (INT1-INT3) zusammen mit Widerständen R69 bis R71 und R20 bis R23 ermöglichen die externe Programmunterbrechung. Mikrocontroller PIC18 verfügt über ICSP Modul und kann über ICSP Input direkt im Board programmiert werden.  16 separat gesteuerte LED sind  über JP5 und JP10 an die Output-Pins von PIC18 anzuschließen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Mainboard Modul&#039;&#039;&lt;br /&gt;
[[Datei:Mainboard V1.0.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PIC 18 verfügt über Master Synchronous Serial Port und kann im SPI oder I²C Modus arbeiten. Dieses Entwicklungsboard hat zwei Module womit die  Grundlagen der  seriellen Übertragung  geübt werden können.&lt;br /&gt;
&lt;br /&gt;
== SPI-Interface Board ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;SPI Modul&#039;&#039;&lt;br /&gt;
[[Datei:SPI Modul.png]]&lt;br /&gt;
&lt;br /&gt;
Wenn MSSP als SPI eingestellt ist, sollen die Pins RC3-RC5 des PIC18 entsprechend softwaremäßig eingestellt und mit ISP – Modul verbunden werden. Benötigt wird auch noch ein Port-Pin des MCU um den Chip Select Eingänge der MCP23S17  zu steuern.&lt;br /&gt;
SPI Interface Modul – Platine ermöglicht separate Steuerung von zwei MCP23S17 Bausteinen, die allerdings mit dem gemeinsamen Chip Select Signal  und unterschiedlichen HW-Adressen (000 und 111) als I/ O  Serial – zu –Parallel Treiber funktionieren. &lt;br /&gt;
IC2 ist mit 4 Binär zu Dezimal Wandler ausgestattet und  wird zur Ausgabe der 16 Bit Daten benutzt.  &lt;br /&gt;
Die ersten 8 Bit vom IC3 können über JP15 mit zwei L293D Schritt-Motoren –Treiber beschaltet werden. &lt;br /&gt;
Die Bits 9 bis 16 dienen als Inputs und können mit externer Tastatur  4x4 angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== I²C Interface Board ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;I²C Modul&#039;&#039; [[Datei:I2C Interface.jpg]]&lt;br /&gt;
&lt;br /&gt;
Wenn MSSP im I²C Modus ist, wird die I²C Interface Platine benötigt.  Entsprechende MCU Pins RC3 und RC4 sollen dann mit I2C-Input beschaltet werden. &lt;br /&gt;
Über I²C Protokoll können  folgende Peripherie-Bauteile angesteuert werden: Real Clock Modul, EEProm, ADU Umwander mit 4 über Potis beschalteten  Analog- Eingängen, Serial-to-Parallel Wandler mit 8 LED , Serial-to-Parallel Wandler mit 4x4 Tastatur und ein Temperatursensor.&lt;br /&gt;
Zugang zu den einzelnen Bauelementen erfolgt über  verschiedene Adressen der Peripherie. Damit werden die Kollisionen vermieden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;HW-Adressen der I²C Peripherie&#039;&#039;&lt;br /&gt;
[[Datei:HW-Adresse.bmp]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Comm-Modul ==&lt;br /&gt;
RS-232&amp;amp; USB Modul [[Datei:USB&amp;amp;RS-232&amp;amp;Keyboard.jpg]]&lt;br /&gt;
&lt;br /&gt;
Peripherie- Com-Modul ermöglicht die Datenübertragung zwischen dem PC und MCU über eine UART Schnittstelle. Dafür müssen gewisse Änderungen im Software vorgenommen werden. Außerdem sollen die Port-Pins RC6 und RC7 mit den entsprechenden Kontakten der JP18 JP17 verbunden sein(Siehe Videobeispiel &amp;quot;Anschluß mit PC über USB&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== LCD-Modul ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;PVC200403P&#039;&#039;[[Datei:PVC200403P.JPG]]&lt;br /&gt;
&lt;br /&gt;
Über  die Pin-Heads JP8(JP6 oder JP7) und JP19 kann die parallele Steuerung des LCD-Moduls organisiert werden. In meinem Fall habe ich ein Display PVC200403P von PICVUE  genommen.  Das ist ein Hitachi HD44780 Standard- Display, und verfügt über 8–bit Daten-Bus + 3 Steuerung-Wires.  Erlaubt ist auch die Datenübertragung über 4-bit Daten-Bus+3 Steuerung-Wires. D.h. benötigt werden mindestens 7 Adern des MCU + Stromversorgung. Im Beispiel 3 und 4 (Siehe Anhang &amp;quot;Videobeispiele&amp;quot;), habe ich mein Display mit insgesamt 8 Adern gesteuert(-,+ -Stromversorgung, E-Enable, RS-Register Select, 4-bit Datenbus). Alle anderen Eingänge wurden mit &amp;quot;-&amp;quot; verbunden.  Diese Lösung spart Euch I/O, benötigt allerdings bisschen komplexere LCD-Initialisierung. Die im Datenblatt&amp;quot;PVC200403P&amp;quot; angegebene Zeitverzögerungen zwischen den Initialisierungsbefehlen habe ich mit Timer1 realisiert und damit die Abfrage des Busy-Flags gespart.&lt;br /&gt;
&lt;br /&gt;
== ICSP Programmierung ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;ICSP I/O  Beschaltung&#039;&#039; [[Datei:ICSP.png]]&lt;br /&gt;
&lt;br /&gt;
Ein ICSP I/O ermöglicht die interne Programmierung des Microcontrollers, &lt;br /&gt;
Z.b. via PicKit2 oder PicKit3. In meinem Fall habe ich ein EEPRom Programmiergerät mit ZIF-Socket zu ICSP Adapter genommen(Siehe Anhang).&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/wikifiles/2/2f/ICSP_Programmierung.JPG EEPROM_Programmer + ICSP Adapter]&lt;br /&gt;
&lt;br /&gt;
== Leiterplatte ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;A4 Größe Design&#039;&#039; [[Datei:Brd Entwicklungsboard.png]]&lt;br /&gt;
&lt;br /&gt;
Schaltplandesign und Leiterplattenentwurf wurde im Eagle realisiert. Der Prototyp wurde auf der doppelseitigen Leiterplatte gefräst und bestückt. Das MCU wurde im Sockel befestigt. Hiermit können die weitere Erweiterungen und MCU-Wechsel ohne Löten durchgeführt werden.&lt;br /&gt;
Der Spannungsregler wurde auf die Leiterplatte gelegt und übers Wärmeleitpad mit dem Lötzinn befestigt. Somit spielt die Plattenfläche auch die Rolle des Kühlkörpers. &lt;br /&gt;
&lt;br /&gt;
[[Datei:7805T.JPG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Praktische Anwendung ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Real Time Clock &#039;&#039; [[Datei:Realtime_Clock.BMP]]&lt;br /&gt;
&lt;br /&gt;
Eine der möglichen Anwendungen der Entwicklungsplatine ist ein Real-Clock mit der Ausgabe auf dem LCD-Display (siehe Bild). Hiermit werden die Prinzipien der I2C-, Parallel Datenübertragung und der dynamischen Tastenabfrage geübt. In dem Fall benötigen wir ein HD44780 Modul, Mainboard- Modul und ein I2C Modul. &lt;br /&gt;
Die 4x4 Tastatur wird direkt an PortB des MCU angeschlossen. Die ersten 4 Bits sind als Ausgange konfiguriert und die letzten 4 Bits dienen als Eingange mit den inneren Pull-Up Widerständen. Die parallele Datenübertragung zwischen dem MCU und LCD-Modul erfolgt über Port D und Port E des Microcontrollers. Die beiden Peripherie – Bausteine PCF8574 und PCF8583 benötigen serielle Datenübertragung  im I²C Mode mit Taktfrequenz &amp;lt;100kHz. Damit es nicht zu Kollisionen führt, haben die beiden Bausteine verschiedene Adressen. Achten Sie auch darauf, dass alle Bausteine der I²C Peripherie eigene Protokollspezifik haben. Z.B.:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;PCF8574_Read_Mode&#039;&#039;  [[Datei:8574_Read_Mode.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;PCF8574_Write_Mode&#039;&#039;  [[Datei:8574 Write Mode.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;PCF8583_Read_Mode&#039;&#039;  [[Datei:Clock_Read_Mode.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;PCF8583_Write_Mode&#039;&#039;  [[Datei:Clock_Write_Mode.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
Der Einstieg in die moderne Mikroprozessor- und Mikrocontroller-welt ist praktisch ohne Evaluations-Kits nicht möglich. An manchen Stellen ist die Simulationsprogramm ungenau, insbesondere ist sehr von der Prozessorbelastung abhängig,und lässt die äußere Einflüsse nicht simulieren.In dem Fall ist der Einsatz der Entwicklungsplatine unvermeidlich. Mehrere auf dem Markt vorgestellte Platten sind wegen ihren hohen Preisen nicht an einen durchschnittlichen Käufer(Studenten oder Schüler) gedacht und beziehen sich auf den konkreten Mikroprozessor, der nicht auszutauschen ist. In diesem Zusammenhang , bietet die angebotene Entwicklungsplatine die Universalität, kann leicht nachgebaut und erweitert werden. Der IC-Sockel ermöglicht den unkomplizierten MCU-Tausch, Upgrade oder Übergang zu dem MCU anderer Hersteller.  &lt;br /&gt;
&lt;br /&gt;
== Kontakt ==&lt;br /&gt;
Nach Anfrage kann ich auch die Quellcode, sowie PCB-Design und Programmierbeispiele zur Verfügung stellen.&lt;br /&gt;
Ihre Fragen bitte an : maiierok@t-online.de&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Videobeispiele ==&lt;br /&gt;
&#039;&#039;Video &amp;quot;Anwendung Real-Time Clock&amp;quot;&#039;&#039;&lt;br /&gt;
[http://www.youtube.com/watch?v=9R3alJx_ldA Simulation im Proteus]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Video &amp;quot;Versuch #1 LED&amp;amp; Buzzer- Steuerung&amp;quot;&#039;&#039;&lt;br /&gt;
[http://youtu.be/Yn8-Ny-1He0  LED&amp;amp;Buzzer TEST#1 ]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Beispiel 3 &amp;quot;Liebeserklärung&#039;&#039;&lt;br /&gt;
[http://youtu.be/26qt7u2WQ8s Mainboard + HD44780]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Beispiel 4 &amp;quot;Anschluß mit PC über USB&#039;&#039;&lt;br /&gt;
[http://www.youtube.com/watch?v=nqvd8O5QHOQ Mainboard+ Comm-Board+ HD44780]&lt;br /&gt;
&lt;br /&gt;
== Link ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;PIC18 Datasheet&#039;&#039;  [[Datei:Pic18f2420-2520-4420-4520.pdf]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;A200_ua7805&#039;&#039;  [[Datei:A200_ua7805.pdf]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;PCF8583&#039;&#039;  [[Datei:Clock and Calendar.pdf]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;PCF8574&#039;&#039;  [[Datei:PCF8574.pdf]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;I²C_ Temperature Sensor&#039;&#039;  [[Datei:Thermo_I²C.pdf]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Mcp23s17 SPI Expander&#039;&#039;  [[Datei:Mcp23s17.pdf]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;HD44780 Display&#039;&#039;  [http://www.adafruit.com/datasheets/HD44780.pdf  Datasheet]&lt;/div&gt;</summary>
		<author><name>Sternst</name></author>
	</entry>
</feed>