<?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=134.76.63.190</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=134.76.63.190"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/134.76.63.190"/>
	<updated>2026-04-10T23:20:40Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-GCC-Tutorial/Der_UART&amp;diff=50993</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=50993"/>
		<updated>2010-09-29T20:05:46Z</updated>

		<summary type="html">&lt;p&gt;134.76.63.190: /* UART initialisieren */&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;) 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ähigen 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 oder zwei 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;
Der UART wird über vier separate Register angesprochen. 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 eintreffen. 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, wenn 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;
&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 Sendeschieberegister ü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 eine 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 irgnoriert.&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;
&#039;&#039;&#039;UMSEL&#039;&#039;&#039; (USART Mode Select)&lt;br /&gt;
:Durch dieses Bit kann eine asynchroner- oder synchroner Übertragung eingestellt werden. Durch setzten 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 Stopp-Bits eines Frames. Beim Setzen werden 2 Stopp-Bits übertragen, anderenfalls nur 1 Stopp-Bit.&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 setzten in Verbindung mit UCSZ2 aus dem UCSRB Register die Anzahl der Datenbits eines Frames.&lt;br /&gt;
:Diese Bits setzten 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&lt;br /&gt;
kommunizieren möchten. Der Wert, der in dieses Register geschrieben&lt;br /&gt;
werden muss, errechnet sich nach folgender Formel:&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 zu 115200 Baud und höher möglich.&lt;br /&gt;
|}&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&lt;br /&gt;
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&lt;br /&gt;
Partnergerät invertiert werden. Für die Anpassung der Pegel und das&lt;br /&gt;
Invertieren der Signale gibt es fertige Schnittstellenbausteine. Der bekannteste&lt;br /&gt;
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&lt;br /&gt;
TTL-Pegel vom AVR. Allerdings müssen wir immer noch die Signale invertieren. Im&lt;br /&gt;
einfachtesn Fall verwenden wir dazu jeweils einen einfachen NPN-Transistor und 2&lt;br /&gt;
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;
== 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;c&amp;gt;&lt;br /&gt;
  UCSRB |= (1&amp;lt;&amp;lt;TXEN);&lt;br /&gt;
&amp;lt;/c&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;c&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;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun ist noch das Baudratenregister &#039;&#039;&#039;UBRR&#039;&#039;&#039; einzustellen. Bei neueren AVRs besteht es aus zwei Registern &#039;&#039;&#039;UBRRL&#039;&#039;&#039; und &#039;&#039;&#039;UBRRH&#039;&#039;&#039;. Der Wert dafür ergibt sich aus der 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. Aus diesem Grund kann man sich einem kleinen Trick bedienen, indem vor der eigentlichen Division bei der Zuweisung die Hälfte des Wertes dazu addiert wird. Allgemein formuliert bedeutet das: &amp;lt;c&amp;gt;int i = ( a + b/2 ) / b;&amp;lt;/c&amp;gt; Dies wird in der unten angegebenen Berechnung von UBRR_VAL ausgenutzt um den Fehler zu minimieren. &lt;br /&gt;
&lt;br /&gt;
Eine ausführliche Erklärung zum &#039;&#039;cleveren Runden&#039;&#039; findet sich in der Forumsdiskussion [http://www.mikrocontroller.net/topic/170617#1631916]. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&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;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Makros sind sehr praktisch, da sie sowohl automatisch den Wert für UBRR als auch den Fehler in der generierten Baudrate berechnen und im Falle einer Überschreitung (+/-1%) einen Fehler und somit Abbruch im Compilerablauf generieren. 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;
Inzwischen gibt es in der avr-libc Makros für obige Berechnung der UBRR Registerwerte aus Taktrate F_CPU und Baudrate BAUD in der Includedatei &amp;lt;util/setbaud.h&amp;gt; ([http://www.nongnu.org/avr-libc/user-manual/group__util__setbaud.html]).&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;c&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_VALUE;&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;/c&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;c&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;
  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;
  UBRRH = UBRR_VALUE &amp;gt;&amp;gt; 8;&lt;br /&gt;
  UBRRL = UBRR_VALUE &amp;amp; 0xFF;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&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;c&amp;gt;&lt;br /&gt;
// bei neueren AVRs steht der Status in UCSRA/UCSR0A/UCSR1A, hier z.&amp;amp;nbsp;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;/c&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;c&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&amp;quot; */&lt;br /&gt;
        uart_putc(*s);&lt;br /&gt;
        s++;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&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;c&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;
   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;/c&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;c&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;/c&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;c&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;/c&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;c&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;
    UCSRB |= (1&amp;lt;&amp;lt;RXEN);                         // UART RX 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;
    UBRRH = UBRR_VAL &amp;gt;&amp;gt; 8;&lt;br /&gt;
    UBRRL = UBRR_VAL &amp;amp; 0xFF;&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;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Funktion blockiert den Programmablauf. Alternativ kann das RXC-Bit in einer Programmschleife abgefragt werden und dann nur bei gesetztem RXC-Bit UDR ausgelesen werden. 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_printf Die Nutzung von 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;C&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;/C&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;C&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;/C&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;C&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;/C&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Interruptbetrieb==&lt;br /&gt;
&lt;br /&gt;
Beim ATMEGA8 muss das RXCIE Bit im Register UCSRB gesetzt werden, damit ein Interrupt ausgelöst werden kann.&lt;br /&gt;
&amp;lt;c&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;
  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;
  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;
  UBRRH = UBRR_VAL &amp;gt;&amp;gt; 8;&lt;br /&gt;
  UBRRL = UBRR_VAL &amp;amp; 0xFF;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Der Interrupt wird immer ausgelöst, wenn ein Zeichen erfolgreich empfangen wurde. Zudem werden ein paar globale Variablen und defines benötigt:&lt;br /&gt;
&amp;lt;c&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;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusätzlich braucht man die Interrupt-Routine:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&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 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 - 1 ) {&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;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
natürlich muss &amp;quot;Global Interrupt Enable&amp;quot; aktiviert sein ( sei() ).&lt;br /&gt;
!! Nur getestet beim ATMEGA8 !!&lt;br /&gt;
&lt;br /&gt;
Wurde eine komplette Zeichenkette empfangen, also das Ende (\n oder \r) erkannt oder die maximale Länge uart_maxstrlen erreicht, wird die globale Variable uart_str_complete auf &#039;1&#039; gesetzt. Damit wird dem Hauptprogramm, welches auf diese Variable pollt, mitgeteil, dass die Zeichenkette uart_string zur Verarbeitung bereit steht. Nach der Verarbeitung der Zeichenkette in der entsprechenden main-Routine, muss die Variable uart_str_complete wieder auf &#039;0&#039; gesetzt werden. Dadurch werden alle neu empfangenen Zeichen wieder in den globalen Puffer geschrieben.&lt;br /&gt;
&lt;br /&gt;
[BAUSTELLE! Aus Lerngründen eventuell als eigenen UART-Interrupt-Block hinter den grundlegenden Interrupt-Teil im Tutorial und hier eine kurze Einführung und einen Verweis darauf anbieten.]&lt;br /&gt;
&lt;br /&gt;
* Unterschied Polling-Betrieb (bisher, oben) und Interrupt-Betrieb&lt;br /&gt;
* Empfangen (Receive)&lt;br /&gt;
** Verändertes UART-Init, ISR (RXC), ggf. Fallstricke ([http://www.mikrocontroller.net/topic/84256#707214 UDR in der ISR lesen!]), Philosophie einer ISR (kurz und schmerzlos), Datenaustausch ISR zu Restprogramm (volatile)&lt;br /&gt;
** Einfachstbeispiel ([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;
* FIFO-Puffer, Ringpuffer&lt;br /&gt;
* Senden (Transmit)&lt;br /&gt;
** Variante &amp;quot;UART Data Register Empty&amp;quot; (UDRE) &lt;br /&gt;
** Variante &amp;quot;UART Transmit Complete&amp;quot; (TXC) &lt;br /&gt;
* Fertige UART-Bibliotheken (-&amp;gt;Fleury, -&amp;gt;Procyon)&lt;br /&gt;
* Literatur: &lt;br /&gt;
** 1/ [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;
** 2/ 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;
** 3/ [[Interrupt]] und atomarer Datenzugriff&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://hubbard.engr.scu.edu/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. Statt dessen werden besondere ASCII-Zeichen benutzt, die der Gegenstelle signalisieren, daß Senden einzustellen bzw. wieder aufzunehmen.&amp;lt;br /&amp;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 es, dass dadurch keine direkte binäre Datenübertragung mehr möglich ist. Von den möglichen 256 Bytewerten werden ja 2 (nämlich &#039;&#039;&#039;XON&#039;&#039;&#039; und &#039;&#039;&#039;XOFF&#039;&#039;&#039;) für besondere Zwecke benutzt und fallen daher aus.&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>134.76.63.190</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Entscheidung_Mikrocontroller&amp;diff=35264</id>
		<title>Entscheidung Mikrocontroller</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Entscheidung_Mikrocontroller&amp;diff=35264"/>
		<updated>2009-03-22T12:16:21Z</updated>

		<summary type="html">&lt;p&gt;134.76.63.190: /* [http://www.microchip.com/ Microchip] */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Mikrocontroller]]&lt;br /&gt;
Die meisten Anfänger stellen sich die Frage, welchen [[Mikrocontroller]] sie verwenden sollen. Es gibt dutzende Hersteller, und jeder davon hat unzählige Varianten im Angebot. Stellt man die Frage in einem Diskussionsforum, dann bekommt man viele verschiedene (sich teilweise widersprechende) Antworten. Bei der Entscheidung sollten u.a. die unten stehenden Kriterien beachtet werden. Dieser Artikel ist primär für Hobbyisten gedacht, da im professionellen Einsatz oftmals völlig andere Kriterien beachtet werden müssen. Weitere vergleichende Informationen über verschiedene Controllerfamilien gibt der Artikel: [[AVR_PIC_51-Vergleich]]&lt;br /&gt;
&lt;br /&gt;
== Verfügbarkeit ==&lt;br /&gt;
* Während man manche Mikrocontroller an jeder Straßenecke bekommt, sind andere nur in großen Stückzahlen und mit Gewerbenachweis erhältlich. Dazu einfach mal in die Kataloge der einschlägigen Privatkundenhändler schauen. Dabei auch darauf achten, dass der gewünschte Controller auch in der richtigen Bauform erhältlich ist (DIP, TQFP, MLF,usw.), s.u.&lt;br /&gt;
* Ab und zu kündigen Hersteller ein neues Modell an (und veröffentlichen das Datenblatt dazu), können aber erst ein Jahr später nennenswerte Stückzahlen liefern. Also den Controller nicht einfach anhand der Übersichten beim Hersteller aussuchen, sondern überprüfen, was die Händler auch wirklich liefern können.&lt;br /&gt;
* Lebenszyklus: Kein Modell wird ewig hergestellt, deswegen sollte man überprüfen, ob der Hersteller vielleicht schon angekündigt hat, dass er ein bestimmtes Modell nicht mehr herstellen will. Die Hersteller schreiben dann z.B. &amp;quot;Mature Product (Not Recommended for New Designs)&amp;quot;. Für Neuentwicklungen oder den Einstieg sollte man folgende Modelle nicht verwenden:&lt;br /&gt;
** AVR AT90-Reihe, &lt;br /&gt;
** AVR ATMega 103(L), 161(L), 163(L), 323(L).&lt;br /&gt;
* Für alle abgekündigten AVR-Controller gibt es jedoch pin- und funktionskompatible Nachfolger. Daher kommt es nur in den seltensten Fällen zu Problemen. Probleme können nur entstehen wenn ein Programm nur in kompilierter Version zur Verfügung steht.&lt;br /&gt;
* Dagegen sind Mikrocontroller der [[8051|MCS51-Familie]] von Intel eher für langfristige Investitionen geeignet. Der 8051 wurde 1979 (!) als erstes Mitglied dieser Familie vorgestellt. Heute gibt es bereits hunderte von 8051-Derivaten von dutzenden von Halbleiterherstellern, zum Teil auch mit weiterentwickelten Prozessorkernen. Wird ein Derivat tatsächlich mal abgekündigt, findet man bei dieser Riesenauswahl meist leicht adäquaten Ersatz.&lt;br /&gt;
&lt;br /&gt;
== Preis ==&lt;br /&gt;
Einerseits kann es lästig sein, wenn man durch die Verwendung eines kleineren Modells 2 Euro gespart hat und dann mit dessen Unzulänglichkeiten kämpft, andererseits ist ein versehentlich zerstörter Chip für 30 Euro ziemlich ärgerlich. Auch ist es oft ganz praktisch, wenn man einige Controller auf Vorrat hat.&lt;br /&gt;
&lt;br /&gt;
Zum Preis eines einzelnen Mikrocontrollers kommen noch die Kosten für die Entwicklungswerkzeuge, wie [[Compiler]], Programmübertragung und Debugging hinzu (s.u. Programmiersprache und Programmübertragung).&lt;br /&gt;
&lt;br /&gt;
== Dokumentation ==&lt;br /&gt;
Die wichtigste Informationsquelle zu einem Mikrocontroller ist das Datenblatt. Diese gibt es heutzutage aber fast ausschließlich in Englisch. Wer damit nicht zurecht kommt muss vorher schauen, ob es irgendwelche Tutorials oder Bücher in seiner Lieblingssprache gibt.&lt;br /&gt;
&lt;br /&gt;
Je mehr Funktionen ein Mikrocontroller beherrscht, desto umfangreicher wird auch das Datenblatt. Das führt dazu, dass bei manchen Mikrocontrollern das Datenblatt über 1000 Seiten hat. Da ist die Gefahr groß, dass ein Anfänger den Überblick verliert.&lt;br /&gt;
&lt;br /&gt;
== Unterstützung/Community ==&lt;br /&gt;
Gerade als Anfänger ist man oft auf die Hilfe anderer angewiesen. Da empfiehlt es sich, der Masse hinterherzulaufen und keine exotischen Typen zu verwenden. Im Bastlerbereich populäre Mikrocontroller-Familien sind die AVRs von Atmel und die PICs von Microchip. Für diese Architekturen gibt es z.B. im Forum dieser Internet-Seite gute und meist auch schnelle Hilfestellung bei Problemen.&lt;br /&gt;
&lt;br /&gt;
== Bauformen == &lt;br /&gt;
Neben den klassischen (bedrahteten) Bauformen setzt sich heutzutage [[SMD]] immer mehr durch. Manche Mikrocontroller sind nur noch in SMD-Bauformen erhältlich. Für SMD benutzt man üblicherweise geätzte Platinen oder Adapter/Sockel (die aber wieder extra kosten). Will man mit Lochrasterplatinen oder [[Breadboard]]s arbeiten, dann braucht man die klassischen Bauformen, z.B. PDIP. Zu beachten ist dabei, dass es PDIP oft nur bis DIP40 (also mit 40 Pins) gibt, d.h. einen Mikrocontroller mit 50 I/O-Pins kann es dann nur als SMD geben.&lt;br /&gt;
&lt;br /&gt;
Viele Mikrocontroller sind in verschiedenen Bauformen verfügbar. Nur in SMD verfügbar sind:&lt;br /&gt;
* MSP430 (Die kleinen sind mittlerweile auch als DIP erhältlich)&lt;br /&gt;
* AVR ATMega 64, 128, 169&lt;br /&gt;
&lt;br /&gt;
In der klassischen (wenn auch in der Anzahl der verfügbaren IO-Pins limitiert) PDIP Bauform gibt es unter anderem:&lt;br /&gt;
* AVR ATMega 8, 16, 32&lt;br /&gt;
* viele 8051-Derivate, z.B. Atmel 89S8252&lt;br /&gt;
&lt;br /&gt;
== Spannung ==&lt;br /&gt;
Während früher die meisten Mikrocontroller und die gesamte Peripherie mit 5V liefen, so gibt es heute auch alle möglichen anderen Varianten. Zu beachten ist:&lt;br /&gt;
* Controller und Peripherie müssen zusammenpassen. Man kann nicht einfach (ohne weitere Vorkehrungen) ein 3,3V-RAM an einen 5V-Controller anschließen und umgekehrt.&lt;br /&gt;
* Manche Controller besitzen, obwohl sie intern mit einer anderen Spannung arbeiten, 5V-kompatible IO-Pins (Beispiel: [[LPC2000 Philips ARM7TDMI-Familie|LPC2100]]).&lt;br /&gt;
* Manche Controller brauchen zwei verschiedene Spannungen. Dies ist aber relativ selten, z.B. bei den [[LPC2000 Philips ARM7TDMI-Familie|LPC2100]].&lt;br /&gt;
&lt;br /&gt;
* Billig-Netzteile liefern im Leerlauf manchmal deutlich mehr Spannung als angegeben, ein [[Standardbauelemente|Spannungsregler]] (z.B. 78xx) ist also Pflicht!&lt;br /&gt;
* Bei Batterien und Akkus sinkt die Spannung ab, wenn sie leerer werden. Braucht der Controller z.B. mindestens 2,7V, dann wird man mit zwei 1,5V-Batterien nicht lange Freude haben (außer man benutzt spezielle Schaltregler).&lt;br /&gt;
&lt;br /&gt;
== Stromverbrauch ==&lt;br /&gt;
Im Vergleich zu PC-Prozessoren (Pentium, Athlon usw.) brauchen Mikrocontroller relativ wenig Strom. Will man sie allerdings mit Batterien betreiben, dann wird der Stromverbrauch plötzlich doch wichtig. Die meisten Mikrocontroller besitzen hierfür Stromsparmodi, mit denen man den Controller teilweise abschalten kann. Für einen extrem geringen Stromverbrauch sind z.B. die [[MSP430]]-Controller optimiert.&lt;br /&gt;
&lt;br /&gt;
Der Stromverbrauch hängt auch stark vom Takt und der Versorgungsspannung ab. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0&lt;br /&gt;
! Frequenz !! ATMega8 (2.7V) !! ATMega8 (5.0V) !! PIC16LF84A(2.0V) !! PIC16F84A (5.5V)&lt;br /&gt;
|-&lt;br /&gt;
! 32KHz &lt;br /&gt;
|62µA||80µA||45µA||-&lt;br /&gt;
|-&lt;br /&gt;
! 100KHz &lt;br /&gt;
|0,3mA||0,5mA||-||-&lt;br /&gt;
|-&lt;br /&gt;
!1MHz, 2MHz*&lt;br /&gt;
|1,5mA ||2,3mA||4mA||-&lt;br /&gt;
|-&lt;br /&gt;
!8MHz, 4MHz*&lt;br /&gt;
|5mA   ||7/15mA**||-||4.5mA&lt;br /&gt;
|-&lt;br /&gt;
!16MHz, 20MHz*&lt;br /&gt;
| -    ||20mA||-||20mA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[*] Abweichende Taktangabe für PIC16*F84A, da hier keine entsprechenden Werte für die Frequenzen des ATmega8 im Datenblatt (PIC16F84A Data Sheet, Microchip 2001, 35007b.pdf) vorliegen.&lt;br /&gt;
&lt;br /&gt;
[**] Angaben sind in der Folge Idle/Active (Quelle: Atmel, ATmega8/L, doc2486.pdf).&lt;br /&gt;
&lt;br /&gt;
== Takt/Geschwindigkeit ==&lt;br /&gt;
Einerseits wünscht man sich oft einen möglichst schnellen Controller, insbesondere als Anfänger, wenn man effiziente Lösungen noch nicht so kennt, andererseits schlägt sich ein hoher Takt auch im Stromverbrauch und im Preis nieder. Man sollte sich dabei nicht von den hohen Taktraten der PC-Prozessoren irritieren lassen. Für viele Anwendungen reicht 1-MHz-Takt völlig aus.&lt;br /&gt;
&lt;br /&gt;
Bei einem Geschwindigkeitsvergleich sollte man beachten, dass man nicht einfach den Takt vergleichen kann: &lt;br /&gt;
* Während manche Controller 12 Takte für einen Befehl brauchen (z.B. die Original-[[8051]]), kommen andere mit einem Takt pro Befehl aus (z.B. [[AVR]]).&lt;br /&gt;
* Manche Controller unterstützen gewisse Operationen hardwareseitig, die auf anderen Controllern in Software nachgebildet werden muss. Beispiele sind z.B. Multiplikation und Division. Wer in einer Hochsprache programmiert merkt davon nicht viel, da es dort die Befehle sowieso zur Verfügung stehen, aber sie brauchen auf einem Controller ohne Hardwareunterstützung eben deutlich länger. &lt;br /&gt;
* Die Datenbus- bzw. Registerbreite spielt eine wichtige Rolle, weil man z.B. für eine 16-Bit-Addition auf einer 8-Bit-CPU zwei Befehle und auf einer 16-Bit-CPU nur einen Befehl braucht.&lt;br /&gt;
&lt;br /&gt;
== Speicher ==&lt;br /&gt;
Während früher oft nur die [[Register]] im Mikrocontroller waren, und der gesamte restliche Speicher extern angebunden werden musste, so sind heute die Speicher oft komplett im Mikrocontroller integriert. Das bedeutet aber teilweise auch, dass man sie nicht erweitern kann. Wichtig ist dabei u.a. die Größe des Programmspeichers (meist ein [[Flash-ROM]]) und das [[RAM#SRAM|SRAM]]. Fehlt letzteres, dann kann es mit der Compilerunterstützung schwierig werden.&lt;br /&gt;
&lt;br /&gt;
Zu unterscheiden sind hier außerdem Controller in [[Von Neumann-Architektur|Von-Neumann-Architektur]] und [[Harvard-Architektur]]. Bei letzterer liegen Programmspeicher (ROM) und Datenspeicher (RAM) in getrennten Speicherbereichen; dies hat den Nachteil, dass für den Zugriff auf den Programmspeicher spezielle Befehle notwendig sind (was die Verwendung von im ROM abgelegten Daten in C-Compilern ziemlich umständlich macht), und dass man keine Programmteile direkt aus dem Datenspeicher ausführen kann.&lt;br /&gt;
&lt;br /&gt;
== Onboard-Peripherie ==&lt;br /&gt;
Mikrocontroller haben meist eine ganze Menge Funktionen integriert, z.B. [[AD-Wandler]], [[I²C]]-Bus, [[SPI]], [[PWM]], [[RS-232]] usw. usf. Der Vorteil liegt darin, dass der Controller damit mehrere Dinge gleichzeitig machen kann. Dadurch steigt zum einen die Gesamtleistung des Controllers, zum anderen sind viele Dinge zeitkritisch, und die Programmierung ist deutlich einfacher, wenn man zehn zeitkritische Dinge gleichzeitig erledigen muss.&lt;br /&gt;
&lt;br /&gt;
== Störfestigkeit ==&lt;br /&gt;
Eigentlich ein wichtiges Thema, andererseits findet man dazu nur sehr wenig Informationen. Bekannt ist beispielsweise, dass bei der [[AVR]]-Familie die ATmegas deutlich störfester sind als die alten AT90S. &lt;br /&gt;
&lt;br /&gt;
== Programmiersprachen ==&lt;br /&gt;
Den direktesten Zugriff auf die &amp;quot;Innereien&amp;quot; eines Prozessors hat man mit [[Assembler]]. Dies ist jedoch gleichzeitig - zumindest auf den ersten Blick - die &amp;quot;abschreckendste&amp;quot; Sprache, denn sie erfordert einen hohen Lernaufwand. Aufgrund stark unterschiedlicher Befehlssätze verschiedener Controllerfamilien ist das Gelernte nie 1-zu-1 übertragbar und meist nur direkt auf einen einzigen Prozessor oder allenfalls auf eine Familie &amp;quot;verwandter&amp;quot; Produkte anwendbar. Dennoch kann man sich mit einiger Erfahrung recht schnell in einen anderen Befehlssatz einarbeiten. In bestimmten Bereichen oder Teilen eines Projekts wird die Verwendung von Assembler dennoch unabdingbar sein. (Diese Teile mögen projektabhängig zwischen 100% oder auch nur deutlich unter 1% umfassen.)&lt;br /&gt;
&lt;br /&gt;
Die Auswahl der richtigen Programmiersprache hängt auch stark vom geplanten Einsatzzweck ab. Ein Elektrotechnik-Student, der sich für sein späteres Berufsleben vorbereiten möchte, sollte sich mit C und Assembler befassen. Wer dagegen gar nicht vorhat sich allzu tief einzuarbeiten und sowieso schon Basic oder Pascal kann, der sollte zu diesen Sprachen greifen.&lt;br /&gt;
&lt;br /&gt;
Für einige Controllerfamilien (z.B. AVR, ARM, MSP430) gibt es eine Portierung des kostenlosen [[GCC|GNU-C-Compilers]], wodurch C auch im Hobby-Bereich stark vertreten ist und es auch viele Programmierbeispiele dafür gibt.&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
Bei der Fehlerbeseitigung trennen sich Profi von Amateur und es kann richtig teuer werden. Genau hier haben die Hersteller von Mikrocontrollern und/oder Compilern eine Möglichkeit gefunden den Gelegenheitsprogrammierer abzuweisen und nur den zahlenden Profi vorzulassen.&lt;br /&gt;
&lt;br /&gt;
Die preisgünstigste aber auch unkomfortabelste Art des Debuggings ist der Einbau von Testcode in das Programm. Dieser Testcode informiert den Programmierer über erreichte Programmpunkte und dabei aufgetretene Datenwerte. Die Ausgabe erfolgt per optisch/akustischer Anzeige oder serieller Schnittstelle. Der Nachteil dieser Methode liegt in ihrem Zeitaufwand. Für jedes Problem muss ein kurzes Stück Testcode erdacht und in das Programm eingefügt werden. Danach wird das Programm kompiliert/assembliert und in den Flashspeicher des Mikrocontrollers gebrannt. Zu guter Letzt muss das Programm von Begin an durchlaufen und mit etwas Glück liefert der Testcode Informationen über das Problem.&lt;br /&gt;
&lt;br /&gt;
Deutlich effektiver ist die Fehlersuche mittels einer in die PC-Entwicklungsumgebung integrierten Debugger Software. Üblicherweise besteht diese Software aus mehreren Fenstern zur Anzeige folgender Informationen:&lt;br /&gt;
&lt;br /&gt;
* Programm- und Datenspeicher des Mikrocontrollers.&lt;br /&gt;
* Arbeits- und Konfigurationsregister des Mikrocontrollers.&lt;br /&gt;
* Programm Quellcode in Hochsprache (z.B. C) und/oder Assembler.&lt;br /&gt;
* Werte von Programm Variablen.&lt;br /&gt;
&lt;br /&gt;
Ausgehend vom Quellcode/Assembler-Fenster kann man den Programmcode auf das Zielsystem laden, den Programmlauf starten und an beliebigen Stellen stoppen, das Programm zeilenweise oder wiederholend abarbeiten, Variablen/Speicher/Register anzeigen und auch verändern. Diese Vorgänge werden bei modernen Debuggern mit wenigen Funktionstasten und Kontextmenü gesteuert. Angemerkt sei, Debugging einer Hochsprache wie C funktioniert nur richtig wenn die Codeoptimierung des Compilers deaktiviert ist. Diese Bedingung bringt es mit sich, dass für die Entwicklungsphase bis zu 30% mehr Programmspeicher benötigt werden.&lt;br /&gt;
&lt;br /&gt;
Der Programmlauf kann in einem Software-Simulator oder direkt auf dem Mikrocontroller erfolgen. Leider können Simulatoren weder die Signale der Controller Umgebung noch Interrupts realistisch nachahmen. Hier hilft nur In-System Debugging direkt auf dem Zielsystem.&lt;br /&gt;
&lt;br /&gt;
Für das In-System Debugging wird der Ziel-Mikrocontroller mit seiner In-Circuit Debugging Hardware benutzt. Diese integrierte Hardware kommuniziert über teils genormte Schnittstellen mit der Debugger Software auf dem PC. Als Verbindungsglied dient ein Kabel mit mehr oder weniger komplexer Elektronik. Diese Elektronik, das fehlende Wissen um ihre Funktion und die teils eingebaute Donglefunktion verhindern preisgünstigen Nachbau und machen ihren Hersteller sicher vor unautorisierter Benutzung der Entwicklungsumgebung.&lt;br /&gt;
&lt;br /&gt;
Bei der Vielzahl von Controller- und Compiler-Herstellen ist es kaum möglich einen Überblick über die Debugger Hardware/Software zu geben. Hier nur einige Beispiele:&lt;br /&gt;
&lt;br /&gt;
=== [http://www.atmel.com/ Atmel] ===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!System&lt;br /&gt;
!Preis&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2737 AVR JTAG ICE] Clone (wenige ATmega Typen)&lt;br /&gt;
| ~ 35€&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3891 AVR Dragon] (Debugging &amp;lt;= 32kB)&lt;br /&gt;
| ~ 55€&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.keeelectronics.com/mkii.htm AVR JTAG ICE MKII - CN]&lt;br /&gt;
| ~ 85$&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3353 AVR JTAG ICE MKII] / Clone&lt;br /&gt;
| ~ 280€/140$&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.atmel.com/dyn/products/tools_card.asp?tool_id=4279 AVR ONE!]&lt;br /&gt;
| ~ 550€&lt;br /&gt;
|}&lt;br /&gt;
 &lt;br /&gt;
[http://atmel.com/products/avr32/default.asp AVR32 Controller (32-Bit)] können mit Atmels freiem [http://atmel.com/dyn/products/tools_card.asp?tool_id=4116 AVR32 Studio], basierend auf der [http://www.eclipse.org/ Eclipse IDE], programmiert und debugt werden. Die IDE bedient sich dabei der [http://atmel.com/dyn/products/tools_card.asp?tool_id=4118 AVR32 GNU Toolchain].&lt;br /&gt;
&lt;br /&gt;
Der Debugger für [http://atmel.com/products/avr/default.asp AVR 8-Bit] RISC Controller ist in Atmels freie [http://atmel.com/dyn/products/tools_card.asp?tool_id=2725 AVR Studio] IDE integriert. In Verbindung mit dem GNU C++ Compiler für AVR ([http://winavr.sourceforge.net/ WinAVR]) und der integrierten Bibliothek [http://www.nongnu.org/avr-libc/ AVR Libc] ist Hochsprach-Entwicklung und -Debugging möglich.&lt;br /&gt;
&lt;br /&gt;
Der [[JTAG|AVR JTAG]] ICE Clone kann nur nachfolgende ältere ATmega Controller debuggen: ATmega16, ATmega16L, ATmega162, ATmega162L, ATmega162V, ATmega165,  ATmega165V, ATmega169, ATmega169L, ATmega169V, ATmega32, ATmega32L, ATmega323, ATmega323L, ATmega64, ATmega64L, ATmega128, ATmega128L, AT90CAN128. Trotzdem ist er ein sehr wertvolles, weil günstiges, Werkzeug wenn man die Typbeschränkung akzeptieren kann.&lt;br /&gt;
&lt;br /&gt;
Atmel [[AVR]] Dragon kann ATtiny, ATmega und AT32UC3x programmieren aber nur ATtiny und ATmega bis 32 kB Flash-Speicher Größe debuggen.&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/topic/107070 AVR JTAG ICE MKII – CN] ist ein Produkt aus China mit der versprochenen Funktionalität eines originalen AVR JTAG ICE MKII von Atmel. Es besitzt eigenständige Elektronik und auch die aktualisierbare Firmware ist vom Original verschieden. Oftmals ist dieses Produkt beim nicht unbekannten Online-Auktionshaus zu finden.&lt;br /&gt;
&lt;br /&gt;
=== [http://www.microchip.com/ Microchip] ===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!System&lt;br /&gt;
!Preis&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en023805 MPLAB PICkit2 / PICkit2 Debug Express]&lt;br /&gt;
| ~ 30€/55€&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en538340 MPLAB PICkit3 Debug Express]&lt;br /&gt;
| ~ 65€&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en010046&amp;amp;part=DV164005 MPLAB ICD 2] / [http://www.keeelectronics.com/icd25debugger.html Clone ICD2.5] / [http://www.sivava.com/MPLAB_ICD2.html Clone ICD2]&lt;br /&gt;
| ~ 90€/40€/40€&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en537580 MPLAB ICD 3]&lt;br /&gt;
| ~ 190€&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Alle Typen von Microchip Debugger Hardware werden von Microchips freier [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en019469&amp;amp;part=SW007002 MPLAB IDE] unterstützt. Diese IDE kann mit C-Compilern verschiedener Hersteller zusammenarbeiten. Das Setup installiert keine Microchip C-Compiler sondern bietet als Option die C-Compiler von CCS und HI-TECH. Der CCS Compiler für PIC18F45k20 ist auf 2kWord Programmcode begrenzt. Die HI-TECH Compiler für PIC10/12/16, PIC18 und PIC32 haben, wenn sie als Freeware im ‚Lite mode’ arbeiten, eingeschränkte Codeoptimierung. Microchips C-Compiler für [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en010014 PIC18], [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en535364 PIC24], [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en535363 dsPIC DSCs] und/oder [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2615&amp;amp;dDocName=en532454 PIC32] können zusätzlich installiert werden. In der zum freien Download bereitstehenden ‚Student Edition’ stellen sie nach 60 Tagen einen Teil der Codeoptimierung ein. Das MPLAB Setup bietet optional die Installation der, im nächsten Absatz behandelten, HI-TECH IDE ‚HI-TIDE 3’ an.&lt;br /&gt;
&lt;br /&gt;
Die Debugger Hardware ICD 2 von Microchip wird auch von der freien, auf [http://www.eclipse.org/ Eclipse] basierenden,  HI-TECH IDE [http://www.htsoft.com/downloads/demos.php#hitide ‚HI-TIDE 3’] unterstützt. Diese moderne IDE kann zusammen mit Microchips MPLAB oder separat installiert werden. Zusätzlich zu installieren sind HI-TECHs C-Compiler für die Microchip Reihen [http://www.htsoft.com/microchip/products/compilers/piccpro-modes.php PIC10/12/16], [http://www.htsoft.com/microchip/products/compilers/picc18pro-modes.php PIC18] und/oder [http://www.htsoft.com/microchip/products/compilers/pic32-modes.php PIC32]. Ihre im ‚Lite mode’ bestehende Einschränkung wurde bereits erwähnt.&lt;br /&gt;
&lt;br /&gt;
Die beiden für PICs vorhandenen IDEs von Microchip und HI-TECH bilden zusammen mit den freien C-Compilern und den preisgünstigen ICD 2 Clones eine kostengünstige Möglichkeit PIC-Code zu erstellen und zu debuggen. Die eingeschränkte Codeoptimierung ist für Amateure verschmerzbarer. Zu beachten ist, dass einige kleine PICs keine In-Circuit Debugging Hardware besitzt. Sie sind nur mit Hilfe eines kostspieligen [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en538769 Header Boards] debugbar.&lt;br /&gt;
&lt;br /&gt;
=== [http://focus.ti.com/mcu/docs/mcuprodoverview.tsp?sectionId=95&amp;amp;tabId=140&amp;amp;familyId=342 TI MSP430] ===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!System&lt;br /&gt;
!Preis&lt;br /&gt;
|-&lt;br /&gt;
| Olimex [http://shop.embedded-projects.net/product_info.php/info/p58_MSP430-JTAG-Parallelportkabel--MSP430-JTAG-.html MSP430 JTAG (parallel)]&lt;br /&gt;
| ~ 15€&lt;br /&gt;
|-&lt;br /&gt;
| Olimex [http://shop.embedded-projects.net/product_info.php/info/p63_MSP430-USB-JTAG-Adapter--MSP430-JTAG-TINY-.html MSP430-JTAG-TINY (USB)]&lt;br /&gt;
| ~ 65€&lt;br /&gt;
|-&lt;br /&gt;
| TI-FET [http://focus.ti.com/docs/toolsw/folders/print/msp-fet430uif.html MSP430 USB Debugging Interface]&lt;br /&gt;
| ~ 115€&lt;br /&gt;
|-&lt;br /&gt;
| TI [http://focus.ti.com/docs/toolsw/folders/print/ez430-f2013.html MSP430 USB Stick Development Tool]&lt;br /&gt;
| ~ 30€&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[http://focus.ti.com/lit/ug/slau265/slau265.pdf Programmierung] und Debugging der MSP430 erfolgt über JTAG-Schnittstelle und in neusten Varianten (MSP430F20xx, F21x2, F22xx) über ‚Spy-Bi-Wire’ (2-wire JTAG). Die ursprüngliche JTAG-Schnittstelle benötigt 4 Signalleitungen plus Reset. Bei ‚Spy-Bi-Wire’ sind die Signalleitungen auf 2 reduziert.&lt;br /&gt;
&lt;br /&gt;
Jeder anwenderprogrammierbare MSP430 enthält einen [[Bootloader]]. Bei den Typenreihen MSP430F1xx, F2xx und F4xx befindet er sich im ROM. Bei den MSP430F6xx im Flash-Speicher.&lt;br /&gt;
&lt;br /&gt;
TI bezeichnet die Programmier- und Debugging-Hardware als Flash Emulation Tool (FET). Es existieren die Varianten ‚Parallel Port’ und USB. Die preisgünstigen parallelen Systeme beherrschen nur JTAG. Bei den USB-Systemen ist zusätzlich ‚Spy-Bi-Wire’ implementiert und man kann damit die Codeschutz Sicherung des Mikrocontrollers auslösen.&lt;br /&gt;
&lt;br /&gt;
Die [http://www.olimex.com/dev/index.html Olimex] Produkte entsprechen in ihrer Funktion weitestgehend den TI Vorbildern und können mit jeder, die TI Werkzeuge unterstützenden, Software verwendet werden. Kleine Abweichungen bestehen bei der [http://www.olimex.com/dev/images/MSP430/SPY-BI-WIRE-CONNECTION.jpg Olimex Implementierung] der ‚Spy-Bi-Wire’ Verbindung des MSP430-JTAG-TINY.&lt;br /&gt;
&lt;br /&gt;
Das ‚MSP430 USB Stick Development Tool’ ist eine eigenständige Debugging-Hardware mit aufgestecktem eZ430-F2013 Zielsystem. Der Stick beherrscht aber nur ‚Spy-Bi-Wire’ wodurch die Anzahl der unterstützten Controller begrenzt ist. &lt;br /&gt;
&lt;br /&gt;
Als Entwicklungsumgebung stellt TI den auf der [http://www.eclipse.org/ Eclipse IDE] aufbauenden ‚Code Compose Essentials’ bereit. In der freien Version [http://focus.ti.com/docs/toolsw/folders/print/msp-cce430.html ‚CCE Core Edition’] ist dieses Paket auf 16kB Code begrenzt.&lt;br /&gt;
&lt;br /&gt;
Mit der freien IDE Eclipse, dem GNU C-Compiler für MSP430, einigen Zutaten und dem Olimex Parallelport-Adapter kann man die wohl preiswerteste, unbeschränkte Entwicklungsumgebung für Mikrocontroller zusammenstellen. Es ist keine perfekte Kombination und die Installation macht einige Mühe; im Ergebnis hat man aber eine Arbeitsplattform, einschließlich Debugger, ohne unverständliche Skripte oder kryptischen Make-Files. Über diese beiden Links&lt;br /&gt;
&lt;br /&gt;
* [[Eclipse und MSPGCC unter Windows]] (03/2009)&lt;br /&gt;
* [http://matthias-hartmann.blogspot.com/ Use Eclipse and mspgcc - the easy way] (Windows 02/2009)&lt;br /&gt;
&lt;br /&gt;
findet man zwei verschiedenartige Lösungen der Installation unter Windows. Obwohl beide Varianten auf teils verschiedene Werkzeuge zurückgreifen sind sie kombinierbar und ergeben damit Spielraum für persönliche Vorlieben.&lt;br /&gt;
&lt;br /&gt;
=== [http://www.zilog.com/ Zilog] ===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!System&lt;br /&gt;
!Preis&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.zilog.com/index.php?option=com_product&amp;amp;Itemid=26&amp;amp;mode=showProdDet&amp;amp;businessLine=1&amp;amp;familyId=6&amp;amp;productId=ZUSBSC00100ZACG USB Smart Kabel]&lt;br /&gt;
| ~ 30$&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.zilog.com/index.php?option=com_product&amp;amp;Itemid=26&amp;amp;mode=showProdDet&amp;amp;businessLine=1&amp;amp;familyId=6&amp;amp;productId=ZENETSC0100ZACG Ethernet Smart Kabel]&lt;br /&gt;
| ~ 70$&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die [[Zilog]] Entwicklungssysteme [http://www.zilog.com/index.php?option=com_content&amp;amp;task=view&amp;amp;id=40&amp;amp;Itemid=137 ZDS II] (C/ASM) für [http://www.zilog.com/index.php?option=com_product&amp;amp;Itemid=26&amp;amp;mode=showFamilyDetails&amp;amp;familyId=5&amp;amp;parent_id=2 Z8 Encore!®], [http://www.zilog.com/index.php?option=com_product&amp;amp;Itemid=26&amp;amp;mode=showFamilyDetails&amp;amp;familyId=6&amp;amp;parent_id=2 Z8 Encore! XP®], [http://www.zilog.com/index.php?option=com_product&amp;amp;Itemid=26&amp;amp;mode=showFamilyDetails&amp;amp;familyId=7&amp;amp;parent_id=2 Z8 Encore! MC™] sowie [http://www.zilog.com/index.php?option=com_product&amp;amp;Itemid=26&amp;amp;mode=showFamilyDetails&amp;amp;familyId=8&amp;amp;parent_id=2 ZNEO™ Z16F] Controller haben keine Beschränkungen sind aber ganz zu Unrecht in Europa kaum bekannt oder erhältlich.&lt;br /&gt;
&lt;br /&gt;
== Programmübertragung ==&lt;br /&gt;
Im Idealfall stellt sich die Frage, wie das Programm in den Mikrocontroller kommt, für den Programm-Entwickler nicht. Die Debugging-Hardware erledigt diese Aufgabe ganz unauffällig mit. Da die Umstände aber nicht immer ideal sind, muss der Entwickler manchmal auf andere Methoden zurückgreifen.&lt;br /&gt;
&lt;br /&gt;
Früher wurden überwiegend teure und umständlich zu handhabende Programmiergeräte verwendet, mit deren Hilfe der Programmspeicher außerhalb des Zielsystems gefüllt wurde. Heute sind die meisten Mikrocontroller über verschiedene ISP-Schnittstellen oder über das [[UART]] ‚In-System’-programmierbar.&lt;br /&gt;
&lt;br /&gt;
Die ISP-Schnittstelle ist entweder als universelle Debugging- und Programmier-Schnittstelle, z.B. [[JTAG]], oder als dedizierte Programmier-Schnittstelle realisiert. Für den zweiten Fall benötigt man einen speziellen Programmier-Adapter den man, meistens in verschiedenen Ausführungen, kaufen oder selber bauen kann. Dazugehörig ist ein passendes Programmier-Programm für den PC. Spezialisierte Programmier-Adapter und –Programme werden auch gern in der laufenden Produktion eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Mikrocontroller mit integriertem [[Bootloader]] können mit der entsprechenden PC-Software direkt über den seriellen Port programmiert werden.&lt;/div&gt;</summary>
		<author><name>134.76.63.190</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Mikrocontroller_Vergleich&amp;diff=35230</id>
		<title>Mikrocontroller Vergleich</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Mikrocontroller_Vergleich&amp;diff=35230"/>
		<updated>2009-03-21T14:33:48Z</updated>

		<summary type="html">&lt;p&gt;134.76.63.190: /* Starterkits */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein paar Kriterien für den CPU-Core und die µC-Familie.&lt;br /&gt;
&lt;br /&gt;
==Compiler verfügbar, bzw wieviel will man dafür ausgeben?==&lt;br /&gt;
&lt;br /&gt;
Und wie verbreitet ist der Compiler? Finde ich dafür Hilfe, beispielsweise in Form von Support-Foren?&lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;[[ARM]]&#039;&#039;&#039;, &#039;&#039;&#039;[[AVR]]&#039;&#039;&#039; und &#039;&#039;&#039;[[MSP430]]&#039;&#039;&#039; gibt es mit GCC einen guten und kostenlosen Compiler. Bei &#039;&#039;&#039;ARM&#039;&#039;&#039; sind jedoch die Schritte zum fertigen Programm recht komplex und Library/Laufzeitsystem benötigen einige Handarbeit. &lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;ARM&#039;&#039;&#039; gibt es von IAR eine auf 32KB begrenzte kostenlose Version eines umgänglicheren kommerziellen Compilers.&lt;br /&gt;
&lt;br /&gt;
Des Weiteren gibt es für &#039;&#039;&#039;[[MSP430]]&#039;&#039;&#039; eine auf 4KB begrenzte kostenlose Version der Entwicklungsumgebung von IAR und eine auf 8KB begrenzte kostenlose Version der Entwicklungsumgebung Code Composer Essentials (basiert auf Eclipse) von Texas Instruments.&lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;[[PIC]]&#039;&#039;&#039; und &#039;&#039;&#039;[[8051]]&#039;&#039;&#039; kann man entweder den Open-Source-Compiler [http://www.sf.net/projects/sdcc SDCC] verwenden (brauchbar, aber nicht mit GCC vergleichbar) oder diverse Löhnwares, bis 4-stellige Beträge (Keil: 2600&amp;amp;#8364;), teils auch als Demoversion mit Tricks. Auch der offizielle C18-Compiler kann als großzügiges Demo heruntergeladen werden.&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;PIC&#039;&#039;&#039; sind das der PICC Lite von HI-TECH, der nur eine handvoll PIC12 und PIC16 unterstützt, und der CC5X, welcher zwar keine High-End PICs unterstützt, dafür die meisten Mid-Range; einzige Einschränkung der freien Version des CC5X ist die Limitierung auf 1024 Instruktionen pro Modul, nicht so gute Codeoptimierung und die Begrenzung von Variablen auf 16-Bit. Ein Vergleich aller C-Compiler für PIC findet sich hier: http://www.informel.de/pic/ccompiler.htm&lt;br /&gt;
&lt;br /&gt;
Für die &#039;&#039;&#039;[[PIC24]]&#039;&#039;&#039; und &#039;&#039;&#039;[[dsPIC]]&#039;&#039;&#039; gibt es den C30 von Microchip. Er basiert auf gcc und ist frei erhältlich, wobei nach 6 Wochen nicht mehr alle Optimierungsstufen wählbar sind, dann maximal -O1. Wie für alle PIC ist mit dem MPLAB eine kostenlose IDE mit Debugger und Simulator verfügbar.&lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;[[R8C]]/M16C&#039;&#039;&#039; gibt es eine Demoversion des Herstellers und eine noch ziemlich frische (lies: Stand 2005 nicht ausgereifte) Version vom GCC.&lt;br /&gt;
&lt;br /&gt;
Zilog stellt für &#039;&#039;&#039;[[Z8]]e&#039;&#039;&#039; eine unbeschränkte IDE mit C-Compiler, Debugger und Simulator kostenlos per Download zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pascal&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Für PIC,DSPIC und AVR gibt es einen sehr guten PASCAL-Compiler &amp;quot;MikroPascal&amp;quot;&lt;br /&gt;
der, in der Downloadversion Code-Size begrenzt ist,&lt;br /&gt;
und den man zu moderaten Preisen zur &amp;quot;Vollversion&amp;quot; aufrüsten kann.&lt;br /&gt;
http://www.mikroelektronika.co.yu/&lt;br /&gt;
( ab 149,- &amp;amp;#8364; )&lt;br /&gt;
&lt;br /&gt;
Elektor-Verlag &#039;Pascal für 8051 und Derivate&#039; Buch+Compiler(Vollversion)&lt;br /&gt;
&lt;br /&gt;
AVRco Pascal Compiler (http://www.e-lab.de/), &lt;br /&gt;
Kostenlose Version für Mega8/88&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BASIC:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sowohl für den AVR als auch für die 8051er gibts von MCS-Electronics eine Demoversion eines BASIC-Compilers,&lt;br /&gt;
der leicht im Funktionsumfang und Codegröße eingeschränkt ist. &lt;br /&gt;
[http://www.mcselec.com/]&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus kursieren im Netz Versionen eines BASIC-Interpreters für 8052er mit dem Namen &amp;quot;8052 AH-BASIC&amp;quot;. Dieser Interpreter unterstüzt sogar Fließkommarithmetik und soll als Freeware verfügbar sein.&lt;br /&gt;
&lt;br /&gt;
==Architektur==&lt;br /&gt;
&lt;br /&gt;
Betrifft vor allem Assembler-Programmierung und die Frage, wie einfach oder umständlich sich C-Code in Maschinensprache übersetzen lässt. &lt;br /&gt;
&lt;br /&gt;
Dass für alle Architekturen teils mehrere C-Compiler existieren, hat wenig mit Eignung und viel mit Markt zu tun. Zudem ist meist nur entscheidend, ob ein Controller die Anforderungen erfüllt, nicht jedoch wie gut er das tut.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Manches davon ist durchaus subjektiv. Bei abweichender Meinung bitte als Diskussion starten, nicht einfach löschen.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Typische Akkumulator-orientierte 8-Bit Architektur. Eine gewisse Komplexität entstand durch die sukzessive Erweiterung auf mehr RAM als ursprünglich vorgesehen war, mit etlichen unterschiedlich adressierten RAM-Bereichen als Folge. Für C-Compiler nur eingeschränkt geeignet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: 32bit RISC-Architektur. In den gängigen Implementierungen mit dem  ARM7TDMI-Core (Architektur V4 = ARMv4T) stehen 2 Befehlssätze zur Verfügung: 32bit-codiert für Tempo, sofern der Speicherdurchsatz das zulässt, und 16bit-codiert (Thumb) für kompakte Programme. Cortex M3 (ARMv7) kennt ausschliesslich 16bit codierte Befehle. Einheitlicher 32bit-Adressraum. Exzellente Zielmaschine für C-Compiler.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: Register-orientierte, an RISC Prinzipien angelehnte 8-Bit Architektur. Getrennte Adressräume für RAM und ROM. Registersatz nicht einheitlich nutzbar. I/O-Bereich nicht einheitlich adressierbar. Nur ein Teil des I/O-Bereiches ist bitweise manipulierbar. Einheitliche RAM-Adressierung. Für C-Compiler geeignet.Bemerkung: Laut Wikipedia wurde der Controller während der Entwicklungsphase für den Einsatz von C-Compilern optimiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: Register-orientierte 16-Bit RISC-Architektur mit vollständiger Orthogonalität. Einheitlicher Adressraum für RAM und ROM. Exzellente Zielmaschine für C-Compiler. Angelehnt an die legendäre PDP-11, vieles wurde übernommen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: Akkumulator-orientierte 8-Bit Architektur. Getrennte Adressräume für RAM und ROM. RAM-Banking, ROM-banking. Umständlicher Zugriff auf Daten im ROM (nur 12/14-Bit Versionen). Viele für C-Compiler wesentliche Elemente sind nur umständlich realisierbar (z.B. Code/Datenadressierung mit Banking, Vergleich mit Vorzeichen).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC24&#039;&#039;&#039;: Register-orientierte 16-Bit Architektur mit getrennten Adressräumen für RAM und ROM, wobei ein Teil des ROM in den RAM-Adressbereich eingeblendet werden kann. Fast alle Befehle sind auf Register und RAM anwendbar, incl. Bitmanipulationen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;dsPIC&#039;&#039;&#039;: wie &#039;&#039;&#039;PIC24&#039;&#039;&#039;, mit zusätzlichen DSP Befehlen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C&#039;&#039;&#039;: 16-Bit 2-Adress CISC-Architektur. Einheitlicher 64KB Adressraum für RAM und ROM. Gute Zielmaschine für C-Compiler.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;M16C&#039;&#039;&#039;: Unter Bezeichnung M16C existieren sich zwei verschiedene inkompatible Architekturen. Die Modelle bis /6x sind grundsätzlich identisch mit R8C, die /8x Modelle mit M32C (hier nicht näher betrachtet). Der 64KB RAM-I/O-Adressraum ist ein Teil des 1MB großen Gesamtadressraumes, Daten im ROM liegen jedoch ausserhalb dieser 64KB und sind daher anders als beim R8C nicht mit 16-Bit Zeigern adressierbar. Gute Zielmaschine für spezialisierte C-Compiler, GCC jedoch tut sich etwas schwer mit den Adressräumen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: Register-orientierte 8-Bit Architektur, 2-Adress-CISC. Getrennte Adressräume für RAM und ROM. Historisch bedingt 3 RAM-Adressräume (8-Bit, 12-Bit, 16-Bit). Für C-Compiler geeignet&lt;br /&gt;
&lt;br /&gt;
Kleiner nicht repräsentativer Compiler-Vergleich. Verwendet wurde eine Variante des crc8-Code von Colin O&#039;Flynn. Jeweils kleinstes Speichermodell, auf Platz optimiert:&lt;br /&gt;
{|&lt;br /&gt;
|Compiler&lt;br /&gt;
|  Befehle(1)&lt;br /&gt;
|  Bytes(1)&lt;br /&gt;
|  Befehle(2)&lt;br /&gt;
|  Bytes(2)&lt;br /&gt;
|-&lt;br /&gt;
|GCC AVR&lt;br /&gt;
|24&lt;br /&gt;
|48&lt;br /&gt;
|24&lt;br /&gt;
|48&lt;br /&gt;
|-&lt;br /&gt;
|Keil 8051&lt;br /&gt;
|24&lt;br /&gt;
|38&lt;br /&gt;
|74&lt;br /&gt;
|109&lt;br /&gt;
|-&lt;br /&gt;
|SDCC 8051&lt;br /&gt;
|24&lt;br /&gt;
|40&lt;br /&gt;
|35&lt;br /&gt;
|54&lt;br /&gt;
|-&lt;br /&gt;
|Zilog Z8e&lt;br /&gt;
|21&lt;br /&gt;
|54&lt;br /&gt;
|27&lt;br /&gt;
|73&lt;br /&gt;
|-&lt;br /&gt;
|PIC C18&lt;br /&gt;
|26&lt;br /&gt;
|52&lt;br /&gt;
|95&lt;br /&gt;
|206&lt;br /&gt;
|-&lt;br /&gt;
|SDCC PIC18&lt;br /&gt;
|41&lt;br /&gt;
|112&lt;br /&gt;
|41&lt;br /&gt;
|112&lt;br /&gt;
|-&lt;br /&gt;
|SDCC PIC16&lt;br /&gt;
|26&lt;br /&gt;
|52&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| (for pic16f84)&lt;br /&gt;
|-&lt;br /&gt;
|HEW R8C/M16C&lt;br /&gt;
|20&lt;br /&gt;
|48&lt;br /&gt;
|20&lt;br /&gt;
|48&lt;br /&gt;
|-&lt;br /&gt;
|GCC 68HC11&lt;br /&gt;
|36&lt;br /&gt;
|65&lt;br /&gt;
|36&lt;br /&gt;
|65&lt;br /&gt;
|-&lt;br /&gt;
|GCC MSP430&lt;br /&gt;
|17&lt;br /&gt;
|40&lt;br /&gt;
|17&lt;br /&gt;
|40&lt;br /&gt;
|-&lt;br /&gt;
|GCC ARM7&lt;br /&gt;
|12&lt;br /&gt;
|48&lt;br /&gt;
|12&lt;br /&gt;
|48&lt;br /&gt;
|-&lt;br /&gt;
|GCC ARM7-Thumb&lt;br /&gt;
|20&lt;br /&gt;
|40&lt;br /&gt;
|20&lt;br /&gt;
|40&lt;br /&gt;
|}&lt;br /&gt;
(1): Lokale Daten ggf. statisch gespeichert, nicht reentrant.&lt;br /&gt;
&lt;br /&gt;
(2): Lokale Daten auf dem Stack, also reentrant.&lt;br /&gt;
&lt;br /&gt;
==Sind CPU-spezifische Erweiterungen in C erforderlich?==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: &lt;br /&gt;
* 5-6 Speicherklassen für Datenspeicher (direkt, indirekt, 8-Bit &amp;quot;external&amp;quot;, 16-Bit &amp;quot;external&amp;quot;, Flash, evtl. noch Einzelbits). &lt;br /&gt;
*Außerdem noch Adresserweiterungen durch Mapping, Paging und Banking &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: &lt;br /&gt;
* 2 Speicherklassen für Datenspeicher (RAM, ROM).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;R8C&#039;&#039;&#039;: nein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: &lt;br /&gt;
* 3 Speicherklassen für Datenspeicher (shared RAM, banked RAM, ROM).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;:&lt;br /&gt;
* Für atomic execution (s.u.) notwendig, aber nicht existent.&lt;br /&gt;
* 4 Speicherklassen für Datenspeicher (256B, 4KB, 64KB, Flash).&lt;br /&gt;
&lt;br /&gt;
==Sind Daten in RAM und ROM mit dem gleichen Code benutzbar?==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;, &#039;&#039;&#039;AVR&#039;&#039;&#039;, &#039;&#039;&#039;PIC&#039;&#039;&#039;, &#039;&#039;&#039;Z8e&#039;&#039;&#039; wie generell alle [[Harvard-Architektur|Harvard-Architekturen]]: NEIN. Daten im ROM&lt;br /&gt;
erfordern anderen Zugriff als Daten im RAM. Entweder versteckt das der Compiler in Runtime-Routinen für Pointerzugriffe, oder man kann Routinen nicht so schreiben, dass sie beides als Parameter verdauen können. Bei kleinen Programmen von ein paar KB kein Problem, bei größeren jedoch schon. Bei AVR/GCC ziemlich fehlerträchtig.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC24&#039;&#039;&#039; und &#039;&#039;&#039;dsPIC&#039;&#039;&#039; können einen Teil des ROM in den RAM-Adressbereich einblenden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;M16C&#039;&#039;&#039;: Hängt vom Compiler ab. Mit 16-Bit Zeigern (GCC) nicht, 20-Bit Zeiger sind ineffizient.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;R8C&#039;&#039;&#039;: [[von Neumann-Architektur]], problemlos.&lt;br /&gt;
&lt;br /&gt;
==Lineare Adressierung vom RAM?==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;, &#039;&#039;&#039;ARM&#039;&#039;&#039;, &#039;&#039;&#039;AVR&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;R8C/M16C&#039;&#039;&#039;, &#039;&#039;&#039;Z8e&#039;&#039;&#039;: kein Problem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: PIC18 ja, PIC16,PIC12,PIC10 nein. RAM-Puffer die größer sind als das RAM in einer Bank sind nur mit Klimmzügen möglich.&lt;br /&gt;
&lt;br /&gt;
==Skalierbarkeit==&lt;br /&gt;
&lt;br /&gt;
Vor allem für jene wichtig, die sich scheuen, für&lt;br /&gt;
verschiedene Aufgaben verschiedene Lösungen zu verwenden. &lt;br /&gt;
&lt;br /&gt;
Spezielle Versionen für LCD-Ansteuerung wurden in dieser Übersicht nicht berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: 8-Pin/1KB aufwärts, überwiegend 40/44-Pin und 64/68-Pin. Architekturbedingte Grenze bei 64KB Code, 64KB RAM - Versionen mit mehr Flash  nutzbar via Banking (Compiler-Support vorhanden) existieren, Versionen mit bis zu 100 MHz Taktfrequenz verfügbar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: 48-Pin/32KB, bis 512K mit internem Flash. Versionen mit internem Cache und externem Speicher sind praktisch beliebig weit ausbaufähig.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: 8-Pin/1KB bis 64-Pin/128KB, 100-Pin/256KB in Vorbereitung. Architekturbedingte  Grenze bei 8MB Code, 64KB RAM. GCC/WinAVR derzeit nur bis 128KB Code möglich (in Arbeit).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: 14-Pin DIP/1KB bis 113-Pin BGA/256KB. DIP, SOIC, TSSOP, QFN, TQFP und BGA erhältlich, in DIP und BGA jedoch nur wenige Typen verfügbar. Architekturbedingte Grenze von 64KB für Code+Daten wird in den großen Versionen durch 20-bittige Adressen umschifft. Taktfrequenz: maximal 8, 16 und 18 MHz je nach Familie. 25 MHz-Versionen in Kürze. Stromaufnahme: Rund 2 uA im LPM3 (real time clock mode) bis ca. 5 mA, typisch 200 µA pro MHz.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: 6-Pin/512B aufwärts. Im Prinzip großer Bereich, aber innerhalb der Familie deutlich verschiedene inkompatible Architekturen mit unterschiedlichen architekturbedingen Grenzen und unterschiedlichem Compiler-Support.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC24&#039;&#039;&#039; und &#039;&#039;&#039;dsPIC&#039;&#039;&#039;: 18 bis 100-Pin mit 16 bis 256kB Code und bis zu 16kB RAM. Generell sind alle als TQFP und QFN erhältlich, die 18 und 28 Pin Modelle gibt es auch als SDIP und SSOP und SOIC. Es gibt Modelle mit 16 und 40MHz.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;eZ8&#039;&#039;&#039;: Bis 64KB Flash. Architekturbedingte Grenze bei 64KB Code, 64KB RAM.&lt;br /&gt;
&lt;br /&gt;
Empfehlung hier: Auch wenn teilweise mehr möglich ist, sind 8/16-Bit-Controller nur bis maximal 40-60K empfehlenswert. Darüber sollte eine 32-Bit-Architektur — z.B. mit [[ARM]]-Core — in Betracht gezogen werden. Insbesondere auch, weil große Programme zu Programm- und Datenstrukturen neigen, die sich auf 8-Bit-Prozessoren schlecht abbilden lassen.&lt;br /&gt;
&lt;br /&gt;
==Interrupt-feste Programmierung von I/O-Ports==&lt;br /&gt;
&lt;br /&gt;
Siehe http://www.mikrocontroller.net/articles/Interrupt.&lt;br /&gt;
&lt;br /&gt;
Das ist besonders bei &#039;&#039;&#039;AVR&#039;&#039;&#039; (ausser den Typen seit 2004: ATtiny2313 usw.) ein Problem. Architekturbedingt ist nur ein Teil der Ports bitweise schaltbar, kein Port kann mehrere Bits gleichzeitig interrupt-fest schalten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;, &#039;&#039;&#039;8051&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;R8C/M16C&#039;&#039;&#039;, &#039;&#039;&#039;Z8e&#039;&#039;&#039; können AND/OR/XOR zum Port hin, daher ist bei geeigneter Programmierung das Problem auch ohne Abschalten der Interrupts vermeidbar.&lt;br /&gt;
&lt;br /&gt;
Zu &#039;&#039;&#039;ARM&#039;&#039;&#039; ist dazu keine allgemeine Aussage möglich. Je nach Implementierung wird das Problem teilweise durch entsprechend gestaltete I/O-Ports gelöst, in anderen Fällen ist erhebliche Wachsamkeit geboten. Atmel SAM7 bereitet hier weniger Probleme als Philips LPC2000. Bei den  LPC2000 gibt es zwei getrennte Register, eines zum Setzen, das andere zum Löschen einzelner Pins. In einem weiteren Register können Bits ausmaskiert werden. Es gibt also kein read-modify-write. Gut gelöst für Push/Pull-Ausgänge, aber eine äquivalente Steuerung der Richtung wurde vergessen, was Open-Drain Pins erschwert. Implementierungen auf Basis des Cortex M3 oder der ARM Port-Macrocell verwenden statt dessen Adressbits zur Maskierung.&lt;br /&gt;
&lt;br /&gt;
Besonders pfiffig ist das beim &#039;&#039;&#039;Z8e&#039;&#039;&#039; gelöst. Ein Befehl fasst die nächsten 3 Befehle zu einer nicht unterbrechbaren Einheit zusammen (atomic execution). Allerdings wird das vom Zilog Compiler nicht unterstützt.&lt;br /&gt;
&lt;br /&gt;
==Zugriff auf I/O-Ports==&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;8051&#039;&#039;&#039; verfügt weder über eigene Register für die Steuerung der Richtung der I/O-Ports, noch über die Möglichkeit, lesend auf den Sollzustand der Ausgänge zuzugreifen. In Assembler ist das kein Problem, da abhängig vom Befehl entweder vom Zustand der Pins (Leseoperationen) oder vom Sollzustand der Ausgänge (kombinierte Lese/Schreiboperationen) ausgegangen wird. Ein korrekt arbeitender C Compiler kann damit jedoch nicht umgehen, weshalb für die Steuerung von Port-Pins spezielle Zugriffsfunktionen und eine sehr genaue Kenntnis der Arbeitsweise der Ports erforderlich sind.&lt;br /&gt;
&lt;br /&gt;
Anmerkung zum Keil 8051-Compiler: Port-Zugriff erfolgt über Pseudo-Variablen wie bei µC üblich. Infolgedessen ist in C Code nicht ersichtlich, ob beispielsweise die Port-Variable P1 für den Zustand der Pins oder den Sollzustand der Ausgänge steht. Nur der erzeugte Assembler-Code kann hier Klarheit schaffen. So haben die beiden prinzipiell identischen Zeilen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 = P1 | 0x01;&lt;br /&gt;
P1 = (P1 | 0x01) &amp;amp; ~0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
völlig unterschiedliche Auswirkung auf den Port. Der Code der ersten Zeile setzt Bit 0 und lässt alle anderen Bits unverändert. Der von der zweiten Zeile erzeugte Code setzt zusätzlich auch alle vorher als Eingang definierten Pins im Zustand 0 auf Ausgang mit Zustand 0. Das ist weder hilfreich, noch mit der Sprachdefinition von C vereinbar.&lt;br /&gt;
&lt;br /&gt;
Auch manche Modelle der &#039;&#039;&#039;PIC&#039;&#039;&#039;-Familie können nur auf den Zustand der Pins zugreifen, nicht auf den Sollzustand der Ausgänge.&lt;br /&gt;
&lt;br /&gt;
In beiden Fällen ist folglich bei Ports, die sowohl für Aus- als auch für Eingänge benutzt werden, besondere Sorgfalt nötig.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;, &#039;&#039;&#039;AVR&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;Z8e&#039;&#039;&#039; und neuere Modelle der &#039;&#039;&#039;PIC&#039;&#039;&#039;-Familie besitzen diese Probleme nicht.&lt;br /&gt;
&lt;br /&gt;
==Priorisierte Interrupts==&lt;br /&gt;
&lt;br /&gt;
Unter priorisierten Interrupts versteht man die Fähigkeit, den einzelnen Interrupt-Quellen eine Priorität zuweisen zu können um ohne Reprogrammierung der Interrupt-Quellen einen laufenden Interrupt ausschliesslich durch Interrupts höherer Priorität unterbrechbar machen zu können. Die einfache und selbstverständliche Fähigkeit, anstehende Interrupts nach fester Priorität zu sortieren, ist damit nicht gemeint.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Ja.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: Der ARM-Core unterstützt 2 Prioritäten mit entsprechenden Vektoren. Oft ist jedoch ein separater priorisierter und vektorisierter Interrupt-Controller mit integriert (Atmel, NXP, Cortex ja, Analog Devices nein). Interrupt-Nesting ist dank eines Designfehlers etwas umständlich, repariert in ARMv7 (Cortex M3).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR:&#039;&#039;&#039; Nein, aber separate Vektoren. Beim Sprung in die Interruptroutine wird implizit ein CLI ausgeführt, beim Rücksprung ein SEI. Ein &amp;quot;unwichtiger Interrupt&amp;quot; blockiert also evtl. einen &amp;quot;wichtigen&amp;quot;. Wenn aber ein Interrupt in der Interruptroutine ausgelöst wird, wird er später der internen Priorität nach ausgeführt. Immerhin haben Interruptquellen im Gegensatz zu alten PIC ihre eigenen Interruptvektoren, so dass keine Zeit mit der Suche nach der Quelle verbracht wird.&lt;br /&gt;
Um trotzdem für eine von mehreren Interruptquellen eine Reaktionszeiten im unteren Mikrosekundenbereich zu garantieren, hilft nur ein Trick: die weniger wichtigen Interruptroutinen tun nichts als eine Programmadresse auf den Stack zu PUSHen. Das RETI springt also zu dieser Adresse mit der eigentlichen Interruptbehandlung, das RET am Ende der Routine springt zur ursprünglichen Unterbruchstelle zurück; der zeitkritische Interrupt kann damit die andere Interruptbehandlung unterbrechen. &#039;&#039;Achtung: es muss gewährleistet sein, dass auch im worst case ein Interrupt sich nicht selbst unterbricht!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Anmerkung: Eine (unwichtige) Interruptroutine kann sofort nach Ansprung ein SEI ausführen, damit eine (unwichtige) Interruptroutine jederzeit von einer anderen (wichtigeren) Interruptroutine unterbrochen werden kann. Das kann pro Interruptvektor individuell entschieden werden. Dies ist jedoch nicht bei allen Interrupt-Quellen möglich (beispielsweise nicht beim TWI).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430:&#039;&#039;&#039; Ja, 16 vollpriorisierte Vektoren, davon 14 global maskierbar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC12 &amp;amp; PIC16:&#039;&#039;&#039; Nein, nur ein Interruptvektor.  Einfache PIC12 (12F508/509, 16F505) kennen gar keine Interrupts.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC18:&#039;&#039;&#039; Jeder Interruptquelle kann separat eine niedrige oder hohe Priorität zugewiesen werden, die dann auf zwei Interruptvektoren verzweigen. Welche Quelle den Interrupt ausgelöst hat, muss aber immer noch händisch festgestellt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC17:&#039;&#039;&#039; Vier Interruptvektoren mit unterschiedlicher Priorität. Scheint es allerdings nur als OTP zu geben, deswegen wohl eher uninteressant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC24&#039;&#039;&#039; und &#039;&#039;&#039;dsPIC&#039;&#039;&#039; haben 7 Prioritäten und für jeden Interrupt einen eigenen Interruptvektor.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C/M16C&#039;&#039;&#039;: 7 Prioritäten, vektorisiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: 3 Prioritäten, vektorisiert.&lt;br /&gt;
&lt;br /&gt;
== Spannungsversorgung ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;, &#039;&#039;&#039;AVR&#039;&#039;&#039;, &#039;&#039;&#039;PIC&#039;&#039;&#039;: 3-5V problemlos (evtl. eingeschränkte µC-Auswahl?). Ungeregelter Batteriebetrieb möglich. Einzelne AVR auch bis 1.8V. LV-PICs auch bis 2,2V&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC24&#039;&#039;&#039; und &#039;&#039;&#039;dsPIC33&#039;&#039;&#039;: 2-3,6V. Pins die keine analogen Funktionen übernehmen können sind 5V tolerant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: 3,3V-Versorgung, 5V-kompatibel. Je nach Modell ist eine separate 1,8V-Versorgung für den Core notwendig. Kein ungeregelter Batteriebetrieb möglich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: nur 1.8-3.6V. Nicht 5V-kompatibel, 5V-Peripherie für I2C/RS485/CAN/... ist also nur mit Pegelkonvertierung einsetzbar. Ungeregelter Batteriebetrieb möglich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: 3,3V-Versorgung, 5V-kompatibel.&lt;br /&gt;
&lt;br /&gt;
==Programmierung in der Schaltung==&lt;br /&gt;
&lt;br /&gt;
Geräte mit Debugging-Interface (s.U.) lassen sich i.d.R. auch damit programmieren. Siehe dazu nächsten Abschnitt.&lt;br /&gt;
&lt;br /&gt;
Die meisten Controller können sich selbst programmieren, Bootloader per RS232,CAN,usw sind dann problemlos realisierbar. Nur müssen solche Bootloader erst einmal auf den Chip programmiert werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: Entweder über die serielle ICSP-Schnittstelle (dafür gibt es Baupläne für billige ParPort-Programmer incl. guter Software) oder mit dem InCircuit-Debugger (~150&amp;amp;#8364;, ICD2 von Microchip). Bootloader müssen generell vorher mit einer der vorher genannten Möglichkeiten auf den Chip geflasht werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Verschieden, je nach Hersteller und Modell. Im Unterschied zu den anderen hier betrachtete Controllern existieren viele nicht in der Schaltung, sondern nur mit speziellen Interfaces programmierbare 8051 Modelle. Modelle mit seriellem Bootloader via UART, SPI, CAN oder USB existieren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: Am besten über JTAG, je nach Hersteller und Familie auch mit Bootloader, z.B. bei Philips LPC2000 über RS232 und Atmel SAM7 über USB (bei letzterem sehr unbequem und langsam!).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: Über ein an SPI orientiertes proprietäres Interface. Ist via Parallelport günstig herzustellen; der Adapter ist im besten Fall genau 5 Widerstände teuer, professioneller mit einem [[Ausgangsstufen_Logik-ICs#Tri-state|Tri-State]]-Bustreiber etwa 5-15 EUR. Darüberhinaus auch mit HV-Programmer (z.B. auf dem [[STK500]]), der u.U. auch nötig ist um falsch gesetzte Fuses wieder zu &amp;quot;reparieren&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: Via JTAG-Interface, TI &amp;quot;Spy BiWire&amp;quot; und über integrierten  Bootloader. (Schaltung zur Ansteuerung via RS232 im Datenblatt)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C&#039;&#039;&#039;: Via UART (RS-232 oder USB-RS-232 Konverter) mit Flash-Tool (Windows, Linux). Variante über Bootloader ebenfalls möglich (wird vom Software Emulator-Debugger benutzt).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: Via Debug-Interface.&lt;br /&gt;
&lt;br /&gt;
==Debugging in der Schaltung==&lt;br /&gt;
&lt;br /&gt;
Ist beispielsweise ein günstiges [[JTAG]]-Interface für In-Circuit&lt;br /&gt;
Debugging verfügbar?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Derivate mit JTAG verfügbar. ICEen gebraucht erschwinglich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: alle mit JTAG.&lt;br /&gt;
* Günstiges Parallel-Port-Interface verfügbar und einfach zu bauen (Wiggler), aber langsam und problematisch im Betrieb unter WinNT+ (besser: ocdremote unter Win9x auf Zweitrechner, via LAN). Kostenlose Debugger ([[GDB]]) unterstützen seit OCDremote 2.14 mit Einschränkungen auch Programme im Flash. &lt;br /&gt;
* Schnelles JTAG Interface basierend auf FT2232C für [[GDB]]/OpenOCD günstig und einfach zu bauen (http://www.fh-augsburg.de/~hhoegl/proj/usbjtag/usbjtag.html) oder fertig erhältlich (http://www.amontec.com/jtagkey.shtml).&lt;br /&gt;
* Kommerzielle Debugger per USB sind besser und schneller, aber recht teuer.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: für ATmega16/162/32/128 ist JTAG günstig verfügbar&lt;br /&gt;
(Olimex, Erostech) bzw. einfach zu bauen (Evertool). ATmegas ab 2005/2006 mit JTAG sind zu dieser Billigvariante inkompatibel. Für diese und den [[debugWIRE]] der ATtinys und ATmegaX8 existiert das JTAG ICE mkII von Atmel, aber recht teuer, sowie der preiswerte AVR Dragon.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: alle mit JTAG, Adapter sehr günstig/einfach zu bauen. Neuere Geräte mit Spy-by-Wire (braucht weniger Pins als JTAG).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: Entweder Microchips MPLAB ICD2 (&amp;amp;#8364;150-200) oder ein kompatibler Nachbau, wie z.B. http://www.stolz.de.be/. Alternativ das PICKit 2 für ~40€, dass neben dem Programmieren und Debuggen über USB auch noch als RS232-Brücke und einfacher Logic-Analyzer benutzt werden kann. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C&#039;&#039;&#039;: On-Chip Debugging ist mit dem E8 Hardware On-Chip Debugging Emulator möglich (kein JTAG). Ausserdem ist Debugging auch über einen normalen RS232 Anschluss möglich. Der E8 verwendet ein syncrones serielles Protokoll, die RS232 ein asyncrones. Daher ermöglicht der E8 das Debugging bei jeder beliebigen Taktfrequenz, bei RS232 gibt es da Einschränkungen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: Debugging möglich mit &amp;quot;Smart Cable&amp;quot; (kein JTAG), Anschluss über USB oder Seriell&lt;br /&gt;
&lt;br /&gt;
==Starterkits==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Keil MCB900 (http://www.keil.com/mcb900)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: http://www.olimex.com (z.T. hier im Shop erhältlich), http://www.embeddedartists.com,&lt;br /&gt;
http://www.mct.de&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: [[STK200]], [[STK500]], [[AVR_Butterfly]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: http://www.olimex.com (z.T. hier im Shop erhältlich), ez430 (http://www.ti.com/ez430)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: http://www.microchipdirect.com/ , Velleman-Kit K8048 (www.velleman.be)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C&#039;&#039;&#039;: Mehrere (Google Suche). Am weitesten verbreitet ist vielleicht das R8C/13 Starterkit inkl. Entwickler-CD von Glyn/Elektor (Beilage Elektor 12/2005 (ausverkauft) bzw. diverse Drittanbieter). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: Günstig verfügbar [~50&amp;amp;#8364;], teils hier im Shop, komplett inklusive unbeschränktem Compiler und In-System-Debugging. Nachteile: für jede Prozessorklasse ein eigenes Kit; eingelöteter SMD-Chip obwohl viele Typen auch im DIL-Gehäuse existieren.&lt;br /&gt;
&lt;br /&gt;
==Gehäuse==&lt;br /&gt;
&lt;br /&gt;
Mit DIP oder PLCC bastelt es sich leichter als mit *QFP. Die Domäne von&lt;br /&gt;
AVR/PIC/i51. Für MSP430 gibt es günstige fertig bestückte DIP-Adapter hier im Shop (MSP430x2xx gibt es auch in 14-Pin DIP-Gehäuse). Z8e-Chips existieren ebenfalls in DIP, sind aber schlechter verfügbar.&lt;br /&gt;
&lt;br /&gt;
==Beschaltungsaufwand==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR, PIC, 8051, Z8e, MSP430, R8C&#039;&#039;&#039;: gering, i.d.R. sind Versionen mit integriertem Oszillator verfügbar, so dass man praktisch nur die Versorgungsspannung (nebst Abblockkondensator) braucht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: aufwendigere externe Takt- und Spannungserzeugung, manchmal 2 Betriebsspannungen benötigt; Tendenz aber fallend.&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/read-1-185133.html#new Forum]&lt;br /&gt;
* [[8051]]&lt;br /&gt;
* [[AVR]]&lt;br /&gt;
* [[PIC]]&lt;br /&gt;
* [[Z8]]&lt;br /&gt;
* [[ARM]]&lt;br /&gt;
* [[MSP430]]&lt;br /&gt;
* [[R8C]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>134.76.63.190</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Mikrocontroller_Vergleich&amp;diff=35229</id>
		<title>Mikrocontroller Vergleich</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Mikrocontroller_Vergleich&amp;diff=35229"/>
		<updated>2009-03-21T14:31:11Z</updated>

		<summary type="html">&lt;p&gt;134.76.63.190: /* Debugging in der Schaltung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein paar Kriterien für den CPU-Core und die µC-Familie.&lt;br /&gt;
&lt;br /&gt;
==Compiler verfügbar, bzw wieviel will man dafür ausgeben?==&lt;br /&gt;
&lt;br /&gt;
Und wie verbreitet ist der Compiler? Finde ich dafür Hilfe, beispielsweise in Form von Support-Foren?&lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;[[ARM]]&#039;&#039;&#039;, &#039;&#039;&#039;[[AVR]]&#039;&#039;&#039; und &#039;&#039;&#039;[[MSP430]]&#039;&#039;&#039; gibt es mit GCC einen guten und kostenlosen Compiler. Bei &#039;&#039;&#039;ARM&#039;&#039;&#039; sind jedoch die Schritte zum fertigen Programm recht komplex und Library/Laufzeitsystem benötigen einige Handarbeit. &lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;ARM&#039;&#039;&#039; gibt es von IAR eine auf 32KB begrenzte kostenlose Version eines umgänglicheren kommerziellen Compilers.&lt;br /&gt;
&lt;br /&gt;
Des Weiteren gibt es für &#039;&#039;&#039;[[MSP430]]&#039;&#039;&#039; eine auf 4KB begrenzte kostenlose Version der Entwicklungsumgebung von IAR und eine auf 8KB begrenzte kostenlose Version der Entwicklungsumgebung Code Composer Essentials (basiert auf Eclipse) von Texas Instruments.&lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;[[PIC]]&#039;&#039;&#039; und &#039;&#039;&#039;[[8051]]&#039;&#039;&#039; kann man entweder den Open-Source-Compiler [http://www.sf.net/projects/sdcc SDCC] verwenden (brauchbar, aber nicht mit GCC vergleichbar) oder diverse Löhnwares, bis 4-stellige Beträge (Keil: 2600&amp;amp;#8364;), teils auch als Demoversion mit Tricks. Auch der offizielle C18-Compiler kann als großzügiges Demo heruntergeladen werden.&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;PIC&#039;&#039;&#039; sind das der PICC Lite von HI-TECH, der nur eine handvoll PIC12 und PIC16 unterstützt, und der CC5X, welcher zwar keine High-End PICs unterstützt, dafür die meisten Mid-Range; einzige Einschränkung der freien Version des CC5X ist die Limitierung auf 1024 Instruktionen pro Modul, nicht so gute Codeoptimierung und die Begrenzung von Variablen auf 16-Bit. Ein Vergleich aller C-Compiler für PIC findet sich hier: http://www.informel.de/pic/ccompiler.htm&lt;br /&gt;
&lt;br /&gt;
Für die &#039;&#039;&#039;[[PIC24]]&#039;&#039;&#039; und &#039;&#039;&#039;[[dsPIC]]&#039;&#039;&#039; gibt es den C30 von Microchip. Er basiert auf gcc und ist frei erhältlich, wobei nach 6 Wochen nicht mehr alle Optimierungsstufen wählbar sind, dann maximal -O1. Wie für alle PIC ist mit dem MPLAB eine kostenlose IDE mit Debugger und Simulator verfügbar.&lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;[[R8C]]/M16C&#039;&#039;&#039; gibt es eine Demoversion des Herstellers und eine noch ziemlich frische (lies: Stand 2005 nicht ausgereifte) Version vom GCC.&lt;br /&gt;
&lt;br /&gt;
Zilog stellt für &#039;&#039;&#039;[[Z8]]e&#039;&#039;&#039; eine unbeschränkte IDE mit C-Compiler, Debugger und Simulator kostenlos per Download zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pascal&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Für PIC,DSPIC und AVR gibt es einen sehr guten PASCAL-Compiler &amp;quot;MikroPascal&amp;quot;&lt;br /&gt;
der, in der Downloadversion Code-Size begrenzt ist,&lt;br /&gt;
und den man zu moderaten Preisen zur &amp;quot;Vollversion&amp;quot; aufrüsten kann.&lt;br /&gt;
http://www.mikroelektronika.co.yu/&lt;br /&gt;
( ab 149,- &amp;amp;#8364; )&lt;br /&gt;
&lt;br /&gt;
Elektor-Verlag &#039;Pascal für 8051 und Derivate&#039; Buch+Compiler(Vollversion)&lt;br /&gt;
&lt;br /&gt;
AVRco Pascal Compiler (http://www.e-lab.de/), &lt;br /&gt;
Kostenlose Version für Mega8/88&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BASIC:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sowohl für den AVR als auch für die 8051er gibts von MCS-Electronics eine Demoversion eines BASIC-Compilers,&lt;br /&gt;
der leicht im Funktionsumfang und Codegröße eingeschränkt ist. &lt;br /&gt;
[http://www.mcselec.com/]&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus kursieren im Netz Versionen eines BASIC-Interpreters für 8052er mit dem Namen &amp;quot;8052 AH-BASIC&amp;quot;. Dieser Interpreter unterstüzt sogar Fließkommarithmetik und soll als Freeware verfügbar sein.&lt;br /&gt;
&lt;br /&gt;
==Architektur==&lt;br /&gt;
&lt;br /&gt;
Betrifft vor allem Assembler-Programmierung und die Frage, wie einfach oder umständlich sich C-Code in Maschinensprache übersetzen lässt. &lt;br /&gt;
&lt;br /&gt;
Dass für alle Architekturen teils mehrere C-Compiler existieren, hat wenig mit Eignung und viel mit Markt zu tun. Zudem ist meist nur entscheidend, ob ein Controller die Anforderungen erfüllt, nicht jedoch wie gut er das tut.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Manches davon ist durchaus subjektiv. Bei abweichender Meinung bitte als Diskussion starten, nicht einfach löschen.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Typische Akkumulator-orientierte 8-Bit Architektur. Eine gewisse Komplexität entstand durch die sukzessive Erweiterung auf mehr RAM als ursprünglich vorgesehen war, mit etlichen unterschiedlich adressierten RAM-Bereichen als Folge. Für C-Compiler nur eingeschränkt geeignet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: 32bit RISC-Architektur. In den gängigen Implementierungen mit dem  ARM7TDMI-Core (Architektur V4 = ARMv4T) stehen 2 Befehlssätze zur Verfügung: 32bit-codiert für Tempo, sofern der Speicherdurchsatz das zulässt, und 16bit-codiert (Thumb) für kompakte Programme. Cortex M3 (ARMv7) kennt ausschliesslich 16bit codierte Befehle. Einheitlicher 32bit-Adressraum. Exzellente Zielmaschine für C-Compiler.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: Register-orientierte, an RISC Prinzipien angelehnte 8-Bit Architektur. Getrennte Adressräume für RAM und ROM. Registersatz nicht einheitlich nutzbar. I/O-Bereich nicht einheitlich adressierbar. Nur ein Teil des I/O-Bereiches ist bitweise manipulierbar. Einheitliche RAM-Adressierung. Für C-Compiler geeignet.Bemerkung: Laut Wikipedia wurde der Controller während der Entwicklungsphase für den Einsatz von C-Compilern optimiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: Register-orientierte 16-Bit RISC-Architektur mit vollständiger Orthogonalität. Einheitlicher Adressraum für RAM und ROM. Exzellente Zielmaschine für C-Compiler. Angelehnt an die legendäre PDP-11, vieles wurde übernommen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: Akkumulator-orientierte 8-Bit Architektur. Getrennte Adressräume für RAM und ROM. RAM-Banking, ROM-banking. Umständlicher Zugriff auf Daten im ROM (nur 12/14-Bit Versionen). Viele für C-Compiler wesentliche Elemente sind nur umständlich realisierbar (z.B. Code/Datenadressierung mit Banking, Vergleich mit Vorzeichen).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC24&#039;&#039;&#039;: Register-orientierte 16-Bit Architektur mit getrennten Adressräumen für RAM und ROM, wobei ein Teil des ROM in den RAM-Adressbereich eingeblendet werden kann. Fast alle Befehle sind auf Register und RAM anwendbar, incl. Bitmanipulationen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;dsPIC&#039;&#039;&#039;: wie &#039;&#039;&#039;PIC24&#039;&#039;&#039;, mit zusätzlichen DSP Befehlen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C&#039;&#039;&#039;: 16-Bit 2-Adress CISC-Architektur. Einheitlicher 64KB Adressraum für RAM und ROM. Gute Zielmaschine für C-Compiler.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;M16C&#039;&#039;&#039;: Unter Bezeichnung M16C existieren sich zwei verschiedene inkompatible Architekturen. Die Modelle bis /6x sind grundsätzlich identisch mit R8C, die /8x Modelle mit M32C (hier nicht näher betrachtet). Der 64KB RAM-I/O-Adressraum ist ein Teil des 1MB großen Gesamtadressraumes, Daten im ROM liegen jedoch ausserhalb dieser 64KB und sind daher anders als beim R8C nicht mit 16-Bit Zeigern adressierbar. Gute Zielmaschine für spezialisierte C-Compiler, GCC jedoch tut sich etwas schwer mit den Adressräumen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: Register-orientierte 8-Bit Architektur, 2-Adress-CISC. Getrennte Adressräume für RAM und ROM. Historisch bedingt 3 RAM-Adressräume (8-Bit, 12-Bit, 16-Bit). Für C-Compiler geeignet&lt;br /&gt;
&lt;br /&gt;
Kleiner nicht repräsentativer Compiler-Vergleich. Verwendet wurde eine Variante des crc8-Code von Colin O&#039;Flynn. Jeweils kleinstes Speichermodell, auf Platz optimiert:&lt;br /&gt;
{|&lt;br /&gt;
|Compiler&lt;br /&gt;
|  Befehle(1)&lt;br /&gt;
|  Bytes(1)&lt;br /&gt;
|  Befehle(2)&lt;br /&gt;
|  Bytes(2)&lt;br /&gt;
|-&lt;br /&gt;
|GCC AVR&lt;br /&gt;
|24&lt;br /&gt;
|48&lt;br /&gt;
|24&lt;br /&gt;
|48&lt;br /&gt;
|-&lt;br /&gt;
|Keil 8051&lt;br /&gt;
|24&lt;br /&gt;
|38&lt;br /&gt;
|74&lt;br /&gt;
|109&lt;br /&gt;
|-&lt;br /&gt;
|SDCC 8051&lt;br /&gt;
|24&lt;br /&gt;
|40&lt;br /&gt;
|35&lt;br /&gt;
|54&lt;br /&gt;
|-&lt;br /&gt;
|Zilog Z8e&lt;br /&gt;
|21&lt;br /&gt;
|54&lt;br /&gt;
|27&lt;br /&gt;
|73&lt;br /&gt;
|-&lt;br /&gt;
|PIC C18&lt;br /&gt;
|26&lt;br /&gt;
|52&lt;br /&gt;
|95&lt;br /&gt;
|206&lt;br /&gt;
|-&lt;br /&gt;
|SDCC PIC18&lt;br /&gt;
|41&lt;br /&gt;
|112&lt;br /&gt;
|41&lt;br /&gt;
|112&lt;br /&gt;
|-&lt;br /&gt;
|SDCC PIC16&lt;br /&gt;
|26&lt;br /&gt;
|52&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| (for pic16f84)&lt;br /&gt;
|-&lt;br /&gt;
|HEW R8C/M16C&lt;br /&gt;
|20&lt;br /&gt;
|48&lt;br /&gt;
|20&lt;br /&gt;
|48&lt;br /&gt;
|-&lt;br /&gt;
|GCC 68HC11&lt;br /&gt;
|36&lt;br /&gt;
|65&lt;br /&gt;
|36&lt;br /&gt;
|65&lt;br /&gt;
|-&lt;br /&gt;
|GCC MSP430&lt;br /&gt;
|17&lt;br /&gt;
|40&lt;br /&gt;
|17&lt;br /&gt;
|40&lt;br /&gt;
|-&lt;br /&gt;
|GCC ARM7&lt;br /&gt;
|12&lt;br /&gt;
|48&lt;br /&gt;
|12&lt;br /&gt;
|48&lt;br /&gt;
|-&lt;br /&gt;
|GCC ARM7-Thumb&lt;br /&gt;
|20&lt;br /&gt;
|40&lt;br /&gt;
|20&lt;br /&gt;
|40&lt;br /&gt;
|}&lt;br /&gt;
(1): Lokale Daten ggf. statisch gespeichert, nicht reentrant.&lt;br /&gt;
&lt;br /&gt;
(2): Lokale Daten auf dem Stack, also reentrant.&lt;br /&gt;
&lt;br /&gt;
==Sind CPU-spezifische Erweiterungen in C erforderlich?==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: &lt;br /&gt;
* 5-6 Speicherklassen für Datenspeicher (direkt, indirekt, 8-Bit &amp;quot;external&amp;quot;, 16-Bit &amp;quot;external&amp;quot;, Flash, evtl. noch Einzelbits). &lt;br /&gt;
*Außerdem noch Adresserweiterungen durch Mapping, Paging und Banking &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: &lt;br /&gt;
* 2 Speicherklassen für Datenspeicher (RAM, ROM).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;R8C&#039;&#039;&#039;: nein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: &lt;br /&gt;
* 3 Speicherklassen für Datenspeicher (shared RAM, banked RAM, ROM).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;:&lt;br /&gt;
* Für atomic execution (s.u.) notwendig, aber nicht existent.&lt;br /&gt;
* 4 Speicherklassen für Datenspeicher (256B, 4KB, 64KB, Flash).&lt;br /&gt;
&lt;br /&gt;
==Sind Daten in RAM und ROM mit dem gleichen Code benutzbar?==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;, &#039;&#039;&#039;AVR&#039;&#039;&#039;, &#039;&#039;&#039;PIC&#039;&#039;&#039;, &#039;&#039;&#039;Z8e&#039;&#039;&#039; wie generell alle [[Harvard-Architektur|Harvard-Architekturen]]: NEIN. Daten im ROM&lt;br /&gt;
erfordern anderen Zugriff als Daten im RAM. Entweder versteckt das der Compiler in Runtime-Routinen für Pointerzugriffe, oder man kann Routinen nicht so schreiben, dass sie beides als Parameter verdauen können. Bei kleinen Programmen von ein paar KB kein Problem, bei größeren jedoch schon. Bei AVR/GCC ziemlich fehlerträchtig.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC24&#039;&#039;&#039; und &#039;&#039;&#039;dsPIC&#039;&#039;&#039; können einen Teil des ROM in den RAM-Adressbereich einblenden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;M16C&#039;&#039;&#039;: Hängt vom Compiler ab. Mit 16-Bit Zeigern (GCC) nicht, 20-Bit Zeiger sind ineffizient.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;R8C&#039;&#039;&#039;: [[von Neumann-Architektur]], problemlos.&lt;br /&gt;
&lt;br /&gt;
==Lineare Adressierung vom RAM?==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;, &#039;&#039;&#039;ARM&#039;&#039;&#039;, &#039;&#039;&#039;AVR&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;R8C/M16C&#039;&#039;&#039;, &#039;&#039;&#039;Z8e&#039;&#039;&#039;: kein Problem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: PIC18 ja, PIC16,PIC12,PIC10 nein. RAM-Puffer die größer sind als das RAM in einer Bank sind nur mit Klimmzügen möglich.&lt;br /&gt;
&lt;br /&gt;
==Skalierbarkeit==&lt;br /&gt;
&lt;br /&gt;
Vor allem für jene wichtig, die sich scheuen, für&lt;br /&gt;
verschiedene Aufgaben verschiedene Lösungen zu verwenden. &lt;br /&gt;
&lt;br /&gt;
Spezielle Versionen für LCD-Ansteuerung wurden in dieser Übersicht nicht berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: 8-Pin/1KB aufwärts, überwiegend 40/44-Pin und 64/68-Pin. Architekturbedingte Grenze bei 64KB Code, 64KB RAM - Versionen mit mehr Flash  nutzbar via Banking (Compiler-Support vorhanden) existieren, Versionen mit bis zu 100 MHz Taktfrequenz verfügbar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: 48-Pin/32KB, bis 512K mit internem Flash. Versionen mit internem Cache und externem Speicher sind praktisch beliebig weit ausbaufähig.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: 8-Pin/1KB bis 64-Pin/128KB, 100-Pin/256KB in Vorbereitung. Architekturbedingte  Grenze bei 8MB Code, 64KB RAM. GCC/WinAVR derzeit nur bis 128KB Code möglich (in Arbeit).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: 14-Pin DIP/1KB bis 113-Pin BGA/256KB. DIP, SOIC, TSSOP, QFN, TQFP und BGA erhältlich, in DIP und BGA jedoch nur wenige Typen verfügbar. Architekturbedingte Grenze von 64KB für Code+Daten wird in den großen Versionen durch 20-bittige Adressen umschifft. Taktfrequenz: maximal 8, 16 und 18 MHz je nach Familie. 25 MHz-Versionen in Kürze. Stromaufnahme: Rund 2 uA im LPM3 (real time clock mode) bis ca. 5 mA, typisch 200 µA pro MHz.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: 6-Pin/512B aufwärts. Im Prinzip großer Bereich, aber innerhalb der Familie deutlich verschiedene inkompatible Architekturen mit unterschiedlichen architekturbedingen Grenzen und unterschiedlichem Compiler-Support.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC24&#039;&#039;&#039; und &#039;&#039;&#039;dsPIC&#039;&#039;&#039;: 18 bis 100-Pin mit 16 bis 256kB Code und bis zu 16kB RAM. Generell sind alle als TQFP und QFN erhältlich, die 18 und 28 Pin Modelle gibt es auch als SDIP und SSOP und SOIC. Es gibt Modelle mit 16 und 40MHz.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;eZ8&#039;&#039;&#039;: Bis 64KB Flash. Architekturbedingte Grenze bei 64KB Code, 64KB RAM.&lt;br /&gt;
&lt;br /&gt;
Empfehlung hier: Auch wenn teilweise mehr möglich ist, sind 8/16-Bit-Controller nur bis maximal 40-60K empfehlenswert. Darüber sollte eine 32-Bit-Architektur — z.B. mit [[ARM]]-Core — in Betracht gezogen werden. Insbesondere auch, weil große Programme zu Programm- und Datenstrukturen neigen, die sich auf 8-Bit-Prozessoren schlecht abbilden lassen.&lt;br /&gt;
&lt;br /&gt;
==Interrupt-feste Programmierung von I/O-Ports==&lt;br /&gt;
&lt;br /&gt;
Siehe http://www.mikrocontroller.net/articles/Interrupt.&lt;br /&gt;
&lt;br /&gt;
Das ist besonders bei &#039;&#039;&#039;AVR&#039;&#039;&#039; (ausser den Typen seit 2004: ATtiny2313 usw.) ein Problem. Architekturbedingt ist nur ein Teil der Ports bitweise schaltbar, kein Port kann mehrere Bits gleichzeitig interrupt-fest schalten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;, &#039;&#039;&#039;8051&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;R8C/M16C&#039;&#039;&#039;, &#039;&#039;&#039;Z8e&#039;&#039;&#039; können AND/OR/XOR zum Port hin, daher ist bei geeigneter Programmierung das Problem auch ohne Abschalten der Interrupts vermeidbar.&lt;br /&gt;
&lt;br /&gt;
Zu &#039;&#039;&#039;ARM&#039;&#039;&#039; ist dazu keine allgemeine Aussage möglich. Je nach Implementierung wird das Problem teilweise durch entsprechend gestaltete I/O-Ports gelöst, in anderen Fällen ist erhebliche Wachsamkeit geboten. Atmel SAM7 bereitet hier weniger Probleme als Philips LPC2000. Bei den  LPC2000 gibt es zwei getrennte Register, eines zum Setzen, das andere zum Löschen einzelner Pins. In einem weiteren Register können Bits ausmaskiert werden. Es gibt also kein read-modify-write. Gut gelöst für Push/Pull-Ausgänge, aber eine äquivalente Steuerung der Richtung wurde vergessen, was Open-Drain Pins erschwert. Implementierungen auf Basis des Cortex M3 oder der ARM Port-Macrocell verwenden statt dessen Adressbits zur Maskierung.&lt;br /&gt;
&lt;br /&gt;
Besonders pfiffig ist das beim &#039;&#039;&#039;Z8e&#039;&#039;&#039; gelöst. Ein Befehl fasst die nächsten 3 Befehle zu einer nicht unterbrechbaren Einheit zusammen (atomic execution). Allerdings wird das vom Zilog Compiler nicht unterstützt.&lt;br /&gt;
&lt;br /&gt;
==Zugriff auf I/O-Ports==&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;8051&#039;&#039;&#039; verfügt weder über eigene Register für die Steuerung der Richtung der I/O-Ports, noch über die Möglichkeit, lesend auf den Sollzustand der Ausgänge zuzugreifen. In Assembler ist das kein Problem, da abhängig vom Befehl entweder vom Zustand der Pins (Leseoperationen) oder vom Sollzustand der Ausgänge (kombinierte Lese/Schreiboperationen) ausgegangen wird. Ein korrekt arbeitender C Compiler kann damit jedoch nicht umgehen, weshalb für die Steuerung von Port-Pins spezielle Zugriffsfunktionen und eine sehr genaue Kenntnis der Arbeitsweise der Ports erforderlich sind.&lt;br /&gt;
&lt;br /&gt;
Anmerkung zum Keil 8051-Compiler: Port-Zugriff erfolgt über Pseudo-Variablen wie bei µC üblich. Infolgedessen ist in C Code nicht ersichtlich, ob beispielsweise die Port-Variable P1 für den Zustand der Pins oder den Sollzustand der Ausgänge steht. Nur der erzeugte Assembler-Code kann hier Klarheit schaffen. So haben die beiden prinzipiell identischen Zeilen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 = P1 | 0x01;&lt;br /&gt;
P1 = (P1 | 0x01) &amp;amp; ~0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
völlig unterschiedliche Auswirkung auf den Port. Der Code der ersten Zeile setzt Bit 0 und lässt alle anderen Bits unverändert. Der von der zweiten Zeile erzeugte Code setzt zusätzlich auch alle vorher als Eingang definierten Pins im Zustand 0 auf Ausgang mit Zustand 0. Das ist weder hilfreich, noch mit der Sprachdefinition von C vereinbar.&lt;br /&gt;
&lt;br /&gt;
Auch manche Modelle der &#039;&#039;&#039;PIC&#039;&#039;&#039;-Familie können nur auf den Zustand der Pins zugreifen, nicht auf den Sollzustand der Ausgänge.&lt;br /&gt;
&lt;br /&gt;
In beiden Fällen ist folglich bei Ports, die sowohl für Aus- als auch für Eingänge benutzt werden, besondere Sorgfalt nötig.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;, &#039;&#039;&#039;AVR&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;Z8e&#039;&#039;&#039; und neuere Modelle der &#039;&#039;&#039;PIC&#039;&#039;&#039;-Familie besitzen diese Probleme nicht.&lt;br /&gt;
&lt;br /&gt;
==Priorisierte Interrupts==&lt;br /&gt;
&lt;br /&gt;
Unter priorisierten Interrupts versteht man die Fähigkeit, den einzelnen Interrupt-Quellen eine Priorität zuweisen zu können um ohne Reprogrammierung der Interrupt-Quellen einen laufenden Interrupt ausschliesslich durch Interrupts höherer Priorität unterbrechbar machen zu können. Die einfache und selbstverständliche Fähigkeit, anstehende Interrupts nach fester Priorität zu sortieren, ist damit nicht gemeint.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Ja.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: Der ARM-Core unterstützt 2 Prioritäten mit entsprechenden Vektoren. Oft ist jedoch ein separater priorisierter und vektorisierter Interrupt-Controller mit integriert (Atmel, NXP, Cortex ja, Analog Devices nein). Interrupt-Nesting ist dank eines Designfehlers etwas umständlich, repariert in ARMv7 (Cortex M3).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR:&#039;&#039;&#039; Nein, aber separate Vektoren. Beim Sprung in die Interruptroutine wird implizit ein CLI ausgeführt, beim Rücksprung ein SEI. Ein &amp;quot;unwichtiger Interrupt&amp;quot; blockiert also evtl. einen &amp;quot;wichtigen&amp;quot;. Wenn aber ein Interrupt in der Interruptroutine ausgelöst wird, wird er später der internen Priorität nach ausgeführt. Immerhin haben Interruptquellen im Gegensatz zu alten PIC ihre eigenen Interruptvektoren, so dass keine Zeit mit der Suche nach der Quelle verbracht wird.&lt;br /&gt;
Um trotzdem für eine von mehreren Interruptquellen eine Reaktionszeiten im unteren Mikrosekundenbereich zu garantieren, hilft nur ein Trick: die weniger wichtigen Interruptroutinen tun nichts als eine Programmadresse auf den Stack zu PUSHen. Das RETI springt also zu dieser Adresse mit der eigentlichen Interruptbehandlung, das RET am Ende der Routine springt zur ursprünglichen Unterbruchstelle zurück; der zeitkritische Interrupt kann damit die andere Interruptbehandlung unterbrechen. &#039;&#039;Achtung: es muss gewährleistet sein, dass auch im worst case ein Interrupt sich nicht selbst unterbricht!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Anmerkung: Eine (unwichtige) Interruptroutine kann sofort nach Ansprung ein SEI ausführen, damit eine (unwichtige) Interruptroutine jederzeit von einer anderen (wichtigeren) Interruptroutine unterbrochen werden kann. Das kann pro Interruptvektor individuell entschieden werden. Dies ist jedoch nicht bei allen Interrupt-Quellen möglich (beispielsweise nicht beim TWI).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430:&#039;&#039;&#039; Ja, 16 vollpriorisierte Vektoren, davon 14 global maskierbar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC12 &amp;amp; PIC16:&#039;&#039;&#039; Nein, nur ein Interruptvektor.  Einfache PIC12 (12F508/509, 16F505) kennen gar keine Interrupts.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC18:&#039;&#039;&#039; Jeder Interruptquelle kann separat eine niedrige oder hohe Priorität zugewiesen werden, die dann auf zwei Interruptvektoren verzweigen. Welche Quelle den Interrupt ausgelöst hat, muss aber immer noch händisch festgestellt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC17:&#039;&#039;&#039; Vier Interruptvektoren mit unterschiedlicher Priorität. Scheint es allerdings nur als OTP zu geben, deswegen wohl eher uninteressant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC24&#039;&#039;&#039; und &#039;&#039;&#039;dsPIC&#039;&#039;&#039; haben 7 Prioritäten und für jeden Interrupt einen eigenen Interruptvektor.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C/M16C&#039;&#039;&#039;: 7 Prioritäten, vektorisiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: 3 Prioritäten, vektorisiert.&lt;br /&gt;
&lt;br /&gt;
== Spannungsversorgung ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;, &#039;&#039;&#039;AVR&#039;&#039;&#039;, &#039;&#039;&#039;PIC&#039;&#039;&#039;: 3-5V problemlos (evtl. eingeschränkte µC-Auswahl?). Ungeregelter Batteriebetrieb möglich. Einzelne AVR auch bis 1.8V. LV-PICs auch bis 2,2V&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC24&#039;&#039;&#039; und &#039;&#039;&#039;dsPIC33&#039;&#039;&#039;: 2-3,6V. Pins die keine analogen Funktionen übernehmen können sind 5V tolerant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: 3,3V-Versorgung, 5V-kompatibel. Je nach Modell ist eine separate 1,8V-Versorgung für den Core notwendig. Kein ungeregelter Batteriebetrieb möglich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: nur 1.8-3.6V. Nicht 5V-kompatibel, 5V-Peripherie für I2C/RS485/CAN/... ist also nur mit Pegelkonvertierung einsetzbar. Ungeregelter Batteriebetrieb möglich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: 3,3V-Versorgung, 5V-kompatibel.&lt;br /&gt;
&lt;br /&gt;
==Programmierung in der Schaltung==&lt;br /&gt;
&lt;br /&gt;
Geräte mit Debugging-Interface (s.U.) lassen sich i.d.R. auch damit programmieren. Siehe dazu nächsten Abschnitt.&lt;br /&gt;
&lt;br /&gt;
Die meisten Controller können sich selbst programmieren, Bootloader per RS232,CAN,usw sind dann problemlos realisierbar. Nur müssen solche Bootloader erst einmal auf den Chip programmiert werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: Entweder über die serielle ICSP-Schnittstelle (dafür gibt es Baupläne für billige ParPort-Programmer incl. guter Software) oder mit dem InCircuit-Debugger (~150&amp;amp;#8364;, ICD2 von Microchip). Bootloader müssen generell vorher mit einer der vorher genannten Möglichkeiten auf den Chip geflasht werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Verschieden, je nach Hersteller und Modell. Im Unterschied zu den anderen hier betrachtete Controllern existieren viele nicht in der Schaltung, sondern nur mit speziellen Interfaces programmierbare 8051 Modelle. Modelle mit seriellem Bootloader via UART, SPI, CAN oder USB existieren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: Am besten über JTAG, je nach Hersteller und Familie auch mit Bootloader, z.B. bei Philips LPC2000 über RS232 und Atmel SAM7 über USB (bei letzterem sehr unbequem und langsam!).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: Über ein an SPI orientiertes proprietäres Interface. Ist via Parallelport günstig herzustellen; der Adapter ist im besten Fall genau 5 Widerstände teuer, professioneller mit einem [[Ausgangsstufen_Logik-ICs#Tri-state|Tri-State]]-Bustreiber etwa 5-15 EUR. Darüberhinaus auch mit HV-Programmer (z.B. auf dem [[STK500]]), der u.U. auch nötig ist um falsch gesetzte Fuses wieder zu &amp;quot;reparieren&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: Via JTAG-Interface, TI &amp;quot;Spy BiWire&amp;quot; und über integrierten  Bootloader. (Schaltung zur Ansteuerung via RS232 im Datenblatt)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C&#039;&#039;&#039;: Via UART (RS-232 oder USB-RS-232 Konverter) mit Flash-Tool (Windows, Linux). Variante über Bootloader ebenfalls möglich (wird vom Software Emulator-Debugger benutzt).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: Via Debug-Interface.&lt;br /&gt;
&lt;br /&gt;
==Debugging in der Schaltung==&lt;br /&gt;
&lt;br /&gt;
Ist beispielsweise ein günstiges [[JTAG]]-Interface für In-Circuit&lt;br /&gt;
Debugging verfügbar?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Derivate mit JTAG verfügbar. ICEen gebraucht erschwinglich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: alle mit JTAG.&lt;br /&gt;
* Günstiges Parallel-Port-Interface verfügbar und einfach zu bauen (Wiggler), aber langsam und problematisch im Betrieb unter WinNT+ (besser: ocdremote unter Win9x auf Zweitrechner, via LAN). Kostenlose Debugger ([[GDB]]) unterstützen seit OCDremote 2.14 mit Einschränkungen auch Programme im Flash. &lt;br /&gt;
* Schnelles JTAG Interface basierend auf FT2232C für [[GDB]]/OpenOCD günstig und einfach zu bauen (http://www.fh-augsburg.de/~hhoegl/proj/usbjtag/usbjtag.html) oder fertig erhältlich (http://www.amontec.com/jtagkey.shtml).&lt;br /&gt;
* Kommerzielle Debugger per USB sind besser und schneller, aber recht teuer.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: für ATmega16/162/32/128 ist JTAG günstig verfügbar&lt;br /&gt;
(Olimex, Erostech) bzw. einfach zu bauen (Evertool). ATmegas ab 2005/2006 mit JTAG sind zu dieser Billigvariante inkompatibel. Für diese und den [[debugWIRE]] der ATtinys und ATmegaX8 existiert das JTAG ICE mkII von Atmel, aber recht teuer, sowie der preiswerte AVR Dragon.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: alle mit JTAG, Adapter sehr günstig/einfach zu bauen. Neuere Geräte mit Spy-by-Wire (braucht weniger Pins als JTAG).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: Entweder Microchips MPLAB ICD2 (&amp;amp;#8364;150-200) oder ein kompatibler Nachbau, wie z.B. http://www.stolz.de.be/. Alternativ das PICKit 2 für ~40€, dass neben dem Programmieren und Debuggen über USB auch noch als RS232-Brücke und einfacher Logic-Analyzer benutzt werden kann. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C&#039;&#039;&#039;: On-Chip Debugging ist mit dem E8 Hardware On-Chip Debugging Emulator möglich (kein JTAG). Ausserdem ist Debugging auch über einen normalen RS232 Anschluss möglich. Der E8 verwendet ein syncrones serielles Protokoll, die RS232 ein asyncrones. Daher ermöglicht der E8 das Debugging bei jeder beliebigen Taktfrequenz, bei RS232 gibt es da Einschränkungen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: Debugging möglich mit &amp;quot;Smart Cable&amp;quot; (kein JTAG), Anschluss über USB oder Seriell&lt;br /&gt;
&lt;br /&gt;
==Starterkits==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Keil MCB900 (http://www.keil.com/mcb900)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: http://www.olimex.com (z.T. hier im Shop erhältlich), http://www.embeddedartists.com,&lt;br /&gt;
http://www.mct.de&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: [[STK200]], [[STK500]], [[AVR_Butterfly]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: http://www.olimex.com (z.T. hier im Shop erhältlich), ez430 (http://www.ti.com/ez430)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: Velleman-Kit K8048 (www.velleman.be)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C&#039;&#039;&#039;: Mehrere (Google Suche). Am weitesten verbreitet ist vielleicht das R8C/13 Starterkit inkl. Entwickler-CD von Glyn/Elektor (Beilage Elektor 12/2005 (ausverkauft) bzw. diverse Drittanbieter). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: Günstig verfügbar [~50&amp;amp;#8364;], teils hier im Shop, komplett inklusive unbeschränktem Compiler und In-System-Debugging. Nachteile: für jede Prozessorklasse ein eigenes Kit; eingelöteter SMD-Chip obwohl viele Typen auch im DIL-Gehäuse existieren.&lt;br /&gt;
&lt;br /&gt;
==Gehäuse==&lt;br /&gt;
&lt;br /&gt;
Mit DIP oder PLCC bastelt es sich leichter als mit *QFP. Die Domäne von&lt;br /&gt;
AVR/PIC/i51. Für MSP430 gibt es günstige fertig bestückte DIP-Adapter hier im Shop (MSP430x2xx gibt es auch in 14-Pin DIP-Gehäuse). Z8e-Chips existieren ebenfalls in DIP, sind aber schlechter verfügbar.&lt;br /&gt;
&lt;br /&gt;
==Beschaltungsaufwand==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR, PIC, 8051, Z8e, MSP430, R8C&#039;&#039;&#039;: gering, i.d.R. sind Versionen mit integriertem Oszillator verfügbar, so dass man praktisch nur die Versorgungsspannung (nebst Abblockkondensator) braucht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: aufwendigere externe Takt- und Spannungserzeugung, manchmal 2 Betriebsspannungen benötigt; Tendenz aber fallend.&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/read-1-185133.html#new Forum]&lt;br /&gt;
* [[8051]]&lt;br /&gt;
* [[AVR]]&lt;br /&gt;
* [[PIC]]&lt;br /&gt;
* [[Z8]]&lt;br /&gt;
* [[ARM]]&lt;br /&gt;
* [[MSP430]]&lt;br /&gt;
* [[R8C]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>134.76.63.190</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Mikrocontroller_Vergleich&amp;diff=35228</id>
		<title>Mikrocontroller Vergleich</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Mikrocontroller_Vergleich&amp;diff=35228"/>
		<updated>2009-03-21T14:24:27Z</updated>

		<summary type="html">&lt;p&gt;134.76.63.190: /* Spannungsversorgung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein paar Kriterien für den CPU-Core und die µC-Familie.&lt;br /&gt;
&lt;br /&gt;
==Compiler verfügbar, bzw wieviel will man dafür ausgeben?==&lt;br /&gt;
&lt;br /&gt;
Und wie verbreitet ist der Compiler? Finde ich dafür Hilfe, beispielsweise in Form von Support-Foren?&lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;[[ARM]]&#039;&#039;&#039;, &#039;&#039;&#039;[[AVR]]&#039;&#039;&#039; und &#039;&#039;&#039;[[MSP430]]&#039;&#039;&#039; gibt es mit GCC einen guten und kostenlosen Compiler. Bei &#039;&#039;&#039;ARM&#039;&#039;&#039; sind jedoch die Schritte zum fertigen Programm recht komplex und Library/Laufzeitsystem benötigen einige Handarbeit. &lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;ARM&#039;&#039;&#039; gibt es von IAR eine auf 32KB begrenzte kostenlose Version eines umgänglicheren kommerziellen Compilers.&lt;br /&gt;
&lt;br /&gt;
Des Weiteren gibt es für &#039;&#039;&#039;[[MSP430]]&#039;&#039;&#039; eine auf 4KB begrenzte kostenlose Version der Entwicklungsumgebung von IAR und eine auf 8KB begrenzte kostenlose Version der Entwicklungsumgebung Code Composer Essentials (basiert auf Eclipse) von Texas Instruments.&lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;[[PIC]]&#039;&#039;&#039; und &#039;&#039;&#039;[[8051]]&#039;&#039;&#039; kann man entweder den Open-Source-Compiler [http://www.sf.net/projects/sdcc SDCC] verwenden (brauchbar, aber nicht mit GCC vergleichbar) oder diverse Löhnwares, bis 4-stellige Beträge (Keil: 2600&amp;amp;#8364;), teils auch als Demoversion mit Tricks. Auch der offizielle C18-Compiler kann als großzügiges Demo heruntergeladen werden.&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;PIC&#039;&#039;&#039; sind das der PICC Lite von HI-TECH, der nur eine handvoll PIC12 und PIC16 unterstützt, und der CC5X, welcher zwar keine High-End PICs unterstützt, dafür die meisten Mid-Range; einzige Einschränkung der freien Version des CC5X ist die Limitierung auf 1024 Instruktionen pro Modul, nicht so gute Codeoptimierung und die Begrenzung von Variablen auf 16-Bit. Ein Vergleich aller C-Compiler für PIC findet sich hier: http://www.informel.de/pic/ccompiler.htm&lt;br /&gt;
&lt;br /&gt;
Für die &#039;&#039;&#039;[[PIC24]]&#039;&#039;&#039; und &#039;&#039;&#039;[[dsPIC]]&#039;&#039;&#039; gibt es den C30 von Microchip. Er basiert auf gcc und ist frei erhältlich, wobei nach 6 Wochen nicht mehr alle Optimierungsstufen wählbar sind, dann maximal -O1. Wie für alle PIC ist mit dem MPLAB eine kostenlose IDE mit Debugger und Simulator verfügbar.&lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;[[R8C]]/M16C&#039;&#039;&#039; gibt es eine Demoversion des Herstellers und eine noch ziemlich frische (lies: Stand 2005 nicht ausgereifte) Version vom GCC.&lt;br /&gt;
&lt;br /&gt;
Zilog stellt für &#039;&#039;&#039;[[Z8]]e&#039;&#039;&#039; eine unbeschränkte IDE mit C-Compiler, Debugger und Simulator kostenlos per Download zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pascal&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Für PIC,DSPIC und AVR gibt es einen sehr guten PASCAL-Compiler &amp;quot;MikroPascal&amp;quot;&lt;br /&gt;
der, in der Downloadversion Code-Size begrenzt ist,&lt;br /&gt;
und den man zu moderaten Preisen zur &amp;quot;Vollversion&amp;quot; aufrüsten kann.&lt;br /&gt;
http://www.mikroelektronika.co.yu/&lt;br /&gt;
( ab 149,- &amp;amp;#8364; )&lt;br /&gt;
&lt;br /&gt;
Elektor-Verlag &#039;Pascal für 8051 und Derivate&#039; Buch+Compiler(Vollversion)&lt;br /&gt;
&lt;br /&gt;
AVRco Pascal Compiler (http://www.e-lab.de/), &lt;br /&gt;
Kostenlose Version für Mega8/88&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BASIC:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sowohl für den AVR als auch für die 8051er gibts von MCS-Electronics eine Demoversion eines BASIC-Compilers,&lt;br /&gt;
der leicht im Funktionsumfang und Codegröße eingeschränkt ist. &lt;br /&gt;
[http://www.mcselec.com/]&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus kursieren im Netz Versionen eines BASIC-Interpreters für 8052er mit dem Namen &amp;quot;8052 AH-BASIC&amp;quot;. Dieser Interpreter unterstüzt sogar Fließkommarithmetik und soll als Freeware verfügbar sein.&lt;br /&gt;
&lt;br /&gt;
==Architektur==&lt;br /&gt;
&lt;br /&gt;
Betrifft vor allem Assembler-Programmierung und die Frage, wie einfach oder umständlich sich C-Code in Maschinensprache übersetzen lässt. &lt;br /&gt;
&lt;br /&gt;
Dass für alle Architekturen teils mehrere C-Compiler existieren, hat wenig mit Eignung und viel mit Markt zu tun. Zudem ist meist nur entscheidend, ob ein Controller die Anforderungen erfüllt, nicht jedoch wie gut er das tut.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Manches davon ist durchaus subjektiv. Bei abweichender Meinung bitte als Diskussion starten, nicht einfach löschen.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Typische Akkumulator-orientierte 8-Bit Architektur. Eine gewisse Komplexität entstand durch die sukzessive Erweiterung auf mehr RAM als ursprünglich vorgesehen war, mit etlichen unterschiedlich adressierten RAM-Bereichen als Folge. Für C-Compiler nur eingeschränkt geeignet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: 32bit RISC-Architektur. In den gängigen Implementierungen mit dem  ARM7TDMI-Core (Architektur V4 = ARMv4T) stehen 2 Befehlssätze zur Verfügung: 32bit-codiert für Tempo, sofern der Speicherdurchsatz das zulässt, und 16bit-codiert (Thumb) für kompakte Programme. Cortex M3 (ARMv7) kennt ausschliesslich 16bit codierte Befehle. Einheitlicher 32bit-Adressraum. Exzellente Zielmaschine für C-Compiler.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: Register-orientierte, an RISC Prinzipien angelehnte 8-Bit Architektur. Getrennte Adressräume für RAM und ROM. Registersatz nicht einheitlich nutzbar. I/O-Bereich nicht einheitlich adressierbar. Nur ein Teil des I/O-Bereiches ist bitweise manipulierbar. Einheitliche RAM-Adressierung. Für C-Compiler geeignet.Bemerkung: Laut Wikipedia wurde der Controller während der Entwicklungsphase für den Einsatz von C-Compilern optimiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: Register-orientierte 16-Bit RISC-Architektur mit vollständiger Orthogonalität. Einheitlicher Adressraum für RAM und ROM. Exzellente Zielmaschine für C-Compiler. Angelehnt an die legendäre PDP-11, vieles wurde übernommen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: Akkumulator-orientierte 8-Bit Architektur. Getrennte Adressräume für RAM und ROM. RAM-Banking, ROM-banking. Umständlicher Zugriff auf Daten im ROM (nur 12/14-Bit Versionen). Viele für C-Compiler wesentliche Elemente sind nur umständlich realisierbar (z.B. Code/Datenadressierung mit Banking, Vergleich mit Vorzeichen).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC24&#039;&#039;&#039;: Register-orientierte 16-Bit Architektur mit getrennten Adressräumen für RAM und ROM, wobei ein Teil des ROM in den RAM-Adressbereich eingeblendet werden kann. Fast alle Befehle sind auf Register und RAM anwendbar, incl. Bitmanipulationen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;dsPIC&#039;&#039;&#039;: wie &#039;&#039;&#039;PIC24&#039;&#039;&#039;, mit zusätzlichen DSP Befehlen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C&#039;&#039;&#039;: 16-Bit 2-Adress CISC-Architektur. Einheitlicher 64KB Adressraum für RAM und ROM. Gute Zielmaschine für C-Compiler.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;M16C&#039;&#039;&#039;: Unter Bezeichnung M16C existieren sich zwei verschiedene inkompatible Architekturen. Die Modelle bis /6x sind grundsätzlich identisch mit R8C, die /8x Modelle mit M32C (hier nicht näher betrachtet). Der 64KB RAM-I/O-Adressraum ist ein Teil des 1MB großen Gesamtadressraumes, Daten im ROM liegen jedoch ausserhalb dieser 64KB und sind daher anders als beim R8C nicht mit 16-Bit Zeigern adressierbar. Gute Zielmaschine für spezialisierte C-Compiler, GCC jedoch tut sich etwas schwer mit den Adressräumen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: Register-orientierte 8-Bit Architektur, 2-Adress-CISC. Getrennte Adressräume für RAM und ROM. Historisch bedingt 3 RAM-Adressräume (8-Bit, 12-Bit, 16-Bit). Für C-Compiler geeignet&lt;br /&gt;
&lt;br /&gt;
Kleiner nicht repräsentativer Compiler-Vergleich. Verwendet wurde eine Variante des crc8-Code von Colin O&#039;Flynn. Jeweils kleinstes Speichermodell, auf Platz optimiert:&lt;br /&gt;
{|&lt;br /&gt;
|Compiler&lt;br /&gt;
|  Befehle(1)&lt;br /&gt;
|  Bytes(1)&lt;br /&gt;
|  Befehle(2)&lt;br /&gt;
|  Bytes(2)&lt;br /&gt;
|-&lt;br /&gt;
|GCC AVR&lt;br /&gt;
|24&lt;br /&gt;
|48&lt;br /&gt;
|24&lt;br /&gt;
|48&lt;br /&gt;
|-&lt;br /&gt;
|Keil 8051&lt;br /&gt;
|24&lt;br /&gt;
|38&lt;br /&gt;
|74&lt;br /&gt;
|109&lt;br /&gt;
|-&lt;br /&gt;
|SDCC 8051&lt;br /&gt;
|24&lt;br /&gt;
|40&lt;br /&gt;
|35&lt;br /&gt;
|54&lt;br /&gt;
|-&lt;br /&gt;
|Zilog Z8e&lt;br /&gt;
|21&lt;br /&gt;
|54&lt;br /&gt;
|27&lt;br /&gt;
|73&lt;br /&gt;
|-&lt;br /&gt;
|PIC C18&lt;br /&gt;
|26&lt;br /&gt;
|52&lt;br /&gt;
|95&lt;br /&gt;
|206&lt;br /&gt;
|-&lt;br /&gt;
|SDCC PIC18&lt;br /&gt;
|41&lt;br /&gt;
|112&lt;br /&gt;
|41&lt;br /&gt;
|112&lt;br /&gt;
|-&lt;br /&gt;
|SDCC PIC16&lt;br /&gt;
|26&lt;br /&gt;
|52&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| (for pic16f84)&lt;br /&gt;
|-&lt;br /&gt;
|HEW R8C/M16C&lt;br /&gt;
|20&lt;br /&gt;
|48&lt;br /&gt;
|20&lt;br /&gt;
|48&lt;br /&gt;
|-&lt;br /&gt;
|GCC 68HC11&lt;br /&gt;
|36&lt;br /&gt;
|65&lt;br /&gt;
|36&lt;br /&gt;
|65&lt;br /&gt;
|-&lt;br /&gt;
|GCC MSP430&lt;br /&gt;
|17&lt;br /&gt;
|40&lt;br /&gt;
|17&lt;br /&gt;
|40&lt;br /&gt;
|-&lt;br /&gt;
|GCC ARM7&lt;br /&gt;
|12&lt;br /&gt;
|48&lt;br /&gt;
|12&lt;br /&gt;
|48&lt;br /&gt;
|-&lt;br /&gt;
|GCC ARM7-Thumb&lt;br /&gt;
|20&lt;br /&gt;
|40&lt;br /&gt;
|20&lt;br /&gt;
|40&lt;br /&gt;
|}&lt;br /&gt;
(1): Lokale Daten ggf. statisch gespeichert, nicht reentrant.&lt;br /&gt;
&lt;br /&gt;
(2): Lokale Daten auf dem Stack, also reentrant.&lt;br /&gt;
&lt;br /&gt;
==Sind CPU-spezifische Erweiterungen in C erforderlich?==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: &lt;br /&gt;
* 5-6 Speicherklassen für Datenspeicher (direkt, indirekt, 8-Bit &amp;quot;external&amp;quot;, 16-Bit &amp;quot;external&amp;quot;, Flash, evtl. noch Einzelbits). &lt;br /&gt;
*Außerdem noch Adresserweiterungen durch Mapping, Paging und Banking &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: &lt;br /&gt;
* 2 Speicherklassen für Datenspeicher (RAM, ROM).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;R8C&#039;&#039;&#039;: nein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: &lt;br /&gt;
* 3 Speicherklassen für Datenspeicher (shared RAM, banked RAM, ROM).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;:&lt;br /&gt;
* Für atomic execution (s.u.) notwendig, aber nicht existent.&lt;br /&gt;
* 4 Speicherklassen für Datenspeicher (256B, 4KB, 64KB, Flash).&lt;br /&gt;
&lt;br /&gt;
==Sind Daten in RAM und ROM mit dem gleichen Code benutzbar?==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;, &#039;&#039;&#039;AVR&#039;&#039;&#039;, &#039;&#039;&#039;PIC&#039;&#039;&#039;, &#039;&#039;&#039;Z8e&#039;&#039;&#039; wie generell alle [[Harvard-Architektur|Harvard-Architekturen]]: NEIN. Daten im ROM&lt;br /&gt;
erfordern anderen Zugriff als Daten im RAM. Entweder versteckt das der Compiler in Runtime-Routinen für Pointerzugriffe, oder man kann Routinen nicht so schreiben, dass sie beides als Parameter verdauen können. Bei kleinen Programmen von ein paar KB kein Problem, bei größeren jedoch schon. Bei AVR/GCC ziemlich fehlerträchtig.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC24&#039;&#039;&#039; und &#039;&#039;&#039;dsPIC&#039;&#039;&#039; können einen Teil des ROM in den RAM-Adressbereich einblenden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;M16C&#039;&#039;&#039;: Hängt vom Compiler ab. Mit 16-Bit Zeigern (GCC) nicht, 20-Bit Zeiger sind ineffizient.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;R8C&#039;&#039;&#039;: [[von Neumann-Architektur]], problemlos.&lt;br /&gt;
&lt;br /&gt;
==Lineare Adressierung vom RAM?==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;, &#039;&#039;&#039;ARM&#039;&#039;&#039;, &#039;&#039;&#039;AVR&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;R8C/M16C&#039;&#039;&#039;, &#039;&#039;&#039;Z8e&#039;&#039;&#039;: kein Problem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: PIC18 ja, PIC16,PIC12,PIC10 nein. RAM-Puffer die größer sind als das RAM in einer Bank sind nur mit Klimmzügen möglich.&lt;br /&gt;
&lt;br /&gt;
==Skalierbarkeit==&lt;br /&gt;
&lt;br /&gt;
Vor allem für jene wichtig, die sich scheuen, für&lt;br /&gt;
verschiedene Aufgaben verschiedene Lösungen zu verwenden. &lt;br /&gt;
&lt;br /&gt;
Spezielle Versionen für LCD-Ansteuerung wurden in dieser Übersicht nicht berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: 8-Pin/1KB aufwärts, überwiegend 40/44-Pin und 64/68-Pin. Architekturbedingte Grenze bei 64KB Code, 64KB RAM - Versionen mit mehr Flash  nutzbar via Banking (Compiler-Support vorhanden) existieren, Versionen mit bis zu 100 MHz Taktfrequenz verfügbar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: 48-Pin/32KB, bis 512K mit internem Flash. Versionen mit internem Cache und externem Speicher sind praktisch beliebig weit ausbaufähig.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: 8-Pin/1KB bis 64-Pin/128KB, 100-Pin/256KB in Vorbereitung. Architekturbedingte  Grenze bei 8MB Code, 64KB RAM. GCC/WinAVR derzeit nur bis 128KB Code möglich (in Arbeit).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: 14-Pin DIP/1KB bis 113-Pin BGA/256KB. DIP, SOIC, TSSOP, QFN, TQFP und BGA erhältlich, in DIP und BGA jedoch nur wenige Typen verfügbar. Architekturbedingte Grenze von 64KB für Code+Daten wird in den großen Versionen durch 20-bittige Adressen umschifft. Taktfrequenz: maximal 8, 16 und 18 MHz je nach Familie. 25 MHz-Versionen in Kürze. Stromaufnahme: Rund 2 uA im LPM3 (real time clock mode) bis ca. 5 mA, typisch 200 µA pro MHz.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: 6-Pin/512B aufwärts. Im Prinzip großer Bereich, aber innerhalb der Familie deutlich verschiedene inkompatible Architekturen mit unterschiedlichen architekturbedingen Grenzen und unterschiedlichem Compiler-Support.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC24&#039;&#039;&#039; und &#039;&#039;&#039;dsPIC&#039;&#039;&#039;: 18 bis 100-Pin mit 16 bis 256kB Code und bis zu 16kB RAM. Generell sind alle als TQFP und QFN erhältlich, die 18 und 28 Pin Modelle gibt es auch als SDIP und SSOP und SOIC. Es gibt Modelle mit 16 und 40MHz.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;eZ8&#039;&#039;&#039;: Bis 64KB Flash. Architekturbedingte Grenze bei 64KB Code, 64KB RAM.&lt;br /&gt;
&lt;br /&gt;
Empfehlung hier: Auch wenn teilweise mehr möglich ist, sind 8/16-Bit-Controller nur bis maximal 40-60K empfehlenswert. Darüber sollte eine 32-Bit-Architektur — z.B. mit [[ARM]]-Core — in Betracht gezogen werden. Insbesondere auch, weil große Programme zu Programm- und Datenstrukturen neigen, die sich auf 8-Bit-Prozessoren schlecht abbilden lassen.&lt;br /&gt;
&lt;br /&gt;
==Interrupt-feste Programmierung von I/O-Ports==&lt;br /&gt;
&lt;br /&gt;
Siehe http://www.mikrocontroller.net/articles/Interrupt.&lt;br /&gt;
&lt;br /&gt;
Das ist besonders bei &#039;&#039;&#039;AVR&#039;&#039;&#039; (ausser den Typen seit 2004: ATtiny2313 usw.) ein Problem. Architekturbedingt ist nur ein Teil der Ports bitweise schaltbar, kein Port kann mehrere Bits gleichzeitig interrupt-fest schalten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;, &#039;&#039;&#039;8051&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;R8C/M16C&#039;&#039;&#039;, &#039;&#039;&#039;Z8e&#039;&#039;&#039; können AND/OR/XOR zum Port hin, daher ist bei geeigneter Programmierung das Problem auch ohne Abschalten der Interrupts vermeidbar.&lt;br /&gt;
&lt;br /&gt;
Zu &#039;&#039;&#039;ARM&#039;&#039;&#039; ist dazu keine allgemeine Aussage möglich. Je nach Implementierung wird das Problem teilweise durch entsprechend gestaltete I/O-Ports gelöst, in anderen Fällen ist erhebliche Wachsamkeit geboten. Atmel SAM7 bereitet hier weniger Probleme als Philips LPC2000. Bei den  LPC2000 gibt es zwei getrennte Register, eines zum Setzen, das andere zum Löschen einzelner Pins. In einem weiteren Register können Bits ausmaskiert werden. Es gibt also kein read-modify-write. Gut gelöst für Push/Pull-Ausgänge, aber eine äquivalente Steuerung der Richtung wurde vergessen, was Open-Drain Pins erschwert. Implementierungen auf Basis des Cortex M3 oder der ARM Port-Macrocell verwenden statt dessen Adressbits zur Maskierung.&lt;br /&gt;
&lt;br /&gt;
Besonders pfiffig ist das beim &#039;&#039;&#039;Z8e&#039;&#039;&#039; gelöst. Ein Befehl fasst die nächsten 3 Befehle zu einer nicht unterbrechbaren Einheit zusammen (atomic execution). Allerdings wird das vom Zilog Compiler nicht unterstützt.&lt;br /&gt;
&lt;br /&gt;
==Zugriff auf I/O-Ports==&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;8051&#039;&#039;&#039; verfügt weder über eigene Register für die Steuerung der Richtung der I/O-Ports, noch über die Möglichkeit, lesend auf den Sollzustand der Ausgänge zuzugreifen. In Assembler ist das kein Problem, da abhängig vom Befehl entweder vom Zustand der Pins (Leseoperationen) oder vom Sollzustand der Ausgänge (kombinierte Lese/Schreiboperationen) ausgegangen wird. Ein korrekt arbeitender C Compiler kann damit jedoch nicht umgehen, weshalb für die Steuerung von Port-Pins spezielle Zugriffsfunktionen und eine sehr genaue Kenntnis der Arbeitsweise der Ports erforderlich sind.&lt;br /&gt;
&lt;br /&gt;
Anmerkung zum Keil 8051-Compiler: Port-Zugriff erfolgt über Pseudo-Variablen wie bei µC üblich. Infolgedessen ist in C Code nicht ersichtlich, ob beispielsweise die Port-Variable P1 für den Zustand der Pins oder den Sollzustand der Ausgänge steht. Nur der erzeugte Assembler-Code kann hier Klarheit schaffen. So haben die beiden prinzipiell identischen Zeilen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 = P1 | 0x01;&lt;br /&gt;
P1 = (P1 | 0x01) &amp;amp; ~0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
völlig unterschiedliche Auswirkung auf den Port. Der Code der ersten Zeile setzt Bit 0 und lässt alle anderen Bits unverändert. Der von der zweiten Zeile erzeugte Code setzt zusätzlich auch alle vorher als Eingang definierten Pins im Zustand 0 auf Ausgang mit Zustand 0. Das ist weder hilfreich, noch mit der Sprachdefinition von C vereinbar.&lt;br /&gt;
&lt;br /&gt;
Auch manche Modelle der &#039;&#039;&#039;PIC&#039;&#039;&#039;-Familie können nur auf den Zustand der Pins zugreifen, nicht auf den Sollzustand der Ausgänge.&lt;br /&gt;
&lt;br /&gt;
In beiden Fällen ist folglich bei Ports, die sowohl für Aus- als auch für Eingänge benutzt werden, besondere Sorgfalt nötig.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;, &#039;&#039;&#039;AVR&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;Z8e&#039;&#039;&#039; und neuere Modelle der &#039;&#039;&#039;PIC&#039;&#039;&#039;-Familie besitzen diese Probleme nicht.&lt;br /&gt;
&lt;br /&gt;
==Priorisierte Interrupts==&lt;br /&gt;
&lt;br /&gt;
Unter priorisierten Interrupts versteht man die Fähigkeit, den einzelnen Interrupt-Quellen eine Priorität zuweisen zu können um ohne Reprogrammierung der Interrupt-Quellen einen laufenden Interrupt ausschliesslich durch Interrupts höherer Priorität unterbrechbar machen zu können. Die einfache und selbstverständliche Fähigkeit, anstehende Interrupts nach fester Priorität zu sortieren, ist damit nicht gemeint.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Ja.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: Der ARM-Core unterstützt 2 Prioritäten mit entsprechenden Vektoren. Oft ist jedoch ein separater priorisierter und vektorisierter Interrupt-Controller mit integriert (Atmel, NXP, Cortex ja, Analog Devices nein). Interrupt-Nesting ist dank eines Designfehlers etwas umständlich, repariert in ARMv7 (Cortex M3).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR:&#039;&#039;&#039; Nein, aber separate Vektoren. Beim Sprung in die Interruptroutine wird implizit ein CLI ausgeführt, beim Rücksprung ein SEI. Ein &amp;quot;unwichtiger Interrupt&amp;quot; blockiert also evtl. einen &amp;quot;wichtigen&amp;quot;. Wenn aber ein Interrupt in der Interruptroutine ausgelöst wird, wird er später der internen Priorität nach ausgeführt. Immerhin haben Interruptquellen im Gegensatz zu alten PIC ihre eigenen Interruptvektoren, so dass keine Zeit mit der Suche nach der Quelle verbracht wird.&lt;br /&gt;
Um trotzdem für eine von mehreren Interruptquellen eine Reaktionszeiten im unteren Mikrosekundenbereich zu garantieren, hilft nur ein Trick: die weniger wichtigen Interruptroutinen tun nichts als eine Programmadresse auf den Stack zu PUSHen. Das RETI springt also zu dieser Adresse mit der eigentlichen Interruptbehandlung, das RET am Ende der Routine springt zur ursprünglichen Unterbruchstelle zurück; der zeitkritische Interrupt kann damit die andere Interruptbehandlung unterbrechen. &#039;&#039;Achtung: es muss gewährleistet sein, dass auch im worst case ein Interrupt sich nicht selbst unterbricht!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Anmerkung: Eine (unwichtige) Interruptroutine kann sofort nach Ansprung ein SEI ausführen, damit eine (unwichtige) Interruptroutine jederzeit von einer anderen (wichtigeren) Interruptroutine unterbrochen werden kann. Das kann pro Interruptvektor individuell entschieden werden. Dies ist jedoch nicht bei allen Interrupt-Quellen möglich (beispielsweise nicht beim TWI).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430:&#039;&#039;&#039; Ja, 16 vollpriorisierte Vektoren, davon 14 global maskierbar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC12 &amp;amp; PIC16:&#039;&#039;&#039; Nein, nur ein Interruptvektor.  Einfache PIC12 (12F508/509, 16F505) kennen gar keine Interrupts.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC18:&#039;&#039;&#039; Jeder Interruptquelle kann separat eine niedrige oder hohe Priorität zugewiesen werden, die dann auf zwei Interruptvektoren verzweigen. Welche Quelle den Interrupt ausgelöst hat, muss aber immer noch händisch festgestellt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC17:&#039;&#039;&#039; Vier Interruptvektoren mit unterschiedlicher Priorität. Scheint es allerdings nur als OTP zu geben, deswegen wohl eher uninteressant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC24&#039;&#039;&#039; und &#039;&#039;&#039;dsPIC&#039;&#039;&#039; haben 7 Prioritäten und für jeden Interrupt einen eigenen Interruptvektor.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C/M16C&#039;&#039;&#039;: 7 Prioritäten, vektorisiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: 3 Prioritäten, vektorisiert.&lt;br /&gt;
&lt;br /&gt;
== Spannungsversorgung ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;, &#039;&#039;&#039;AVR&#039;&#039;&#039;, &#039;&#039;&#039;PIC&#039;&#039;&#039;: 3-5V problemlos (evtl. eingeschränkte µC-Auswahl?). Ungeregelter Batteriebetrieb möglich. Einzelne AVR auch bis 1.8V. LV-PICs auch bis 2,2V&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC24&#039;&#039;&#039; und &#039;&#039;&#039;dsPIC33&#039;&#039;&#039;: 2-3,6V. Pins die keine analogen Funktionen übernehmen können sind 5V tolerant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: 3,3V-Versorgung, 5V-kompatibel. Je nach Modell ist eine separate 1,8V-Versorgung für den Core notwendig. Kein ungeregelter Batteriebetrieb möglich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: nur 1.8-3.6V. Nicht 5V-kompatibel, 5V-Peripherie für I2C/RS485/CAN/... ist also nur mit Pegelkonvertierung einsetzbar. Ungeregelter Batteriebetrieb möglich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: 3,3V-Versorgung, 5V-kompatibel.&lt;br /&gt;
&lt;br /&gt;
==Programmierung in der Schaltung==&lt;br /&gt;
&lt;br /&gt;
Geräte mit Debugging-Interface (s.U.) lassen sich i.d.R. auch damit programmieren. Siehe dazu nächsten Abschnitt.&lt;br /&gt;
&lt;br /&gt;
Die meisten Controller können sich selbst programmieren, Bootloader per RS232,CAN,usw sind dann problemlos realisierbar. Nur müssen solche Bootloader erst einmal auf den Chip programmiert werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: Entweder über die serielle ICSP-Schnittstelle (dafür gibt es Baupläne für billige ParPort-Programmer incl. guter Software) oder mit dem InCircuit-Debugger (~150&amp;amp;#8364;, ICD2 von Microchip). Bootloader müssen generell vorher mit einer der vorher genannten Möglichkeiten auf den Chip geflasht werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Verschieden, je nach Hersteller und Modell. Im Unterschied zu den anderen hier betrachtete Controllern existieren viele nicht in der Schaltung, sondern nur mit speziellen Interfaces programmierbare 8051 Modelle. Modelle mit seriellem Bootloader via UART, SPI, CAN oder USB existieren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: Am besten über JTAG, je nach Hersteller und Familie auch mit Bootloader, z.B. bei Philips LPC2000 über RS232 und Atmel SAM7 über USB (bei letzterem sehr unbequem und langsam!).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: Über ein an SPI orientiertes proprietäres Interface. Ist via Parallelport günstig herzustellen; der Adapter ist im besten Fall genau 5 Widerstände teuer, professioneller mit einem [[Ausgangsstufen_Logik-ICs#Tri-state|Tri-State]]-Bustreiber etwa 5-15 EUR. Darüberhinaus auch mit HV-Programmer (z.B. auf dem [[STK500]]), der u.U. auch nötig ist um falsch gesetzte Fuses wieder zu &amp;quot;reparieren&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: Via JTAG-Interface, TI &amp;quot;Spy BiWire&amp;quot; und über integrierten  Bootloader. (Schaltung zur Ansteuerung via RS232 im Datenblatt)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C&#039;&#039;&#039;: Via UART (RS-232 oder USB-RS-232 Konverter) mit Flash-Tool (Windows, Linux). Variante über Bootloader ebenfalls möglich (wird vom Software Emulator-Debugger benutzt).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: Via Debug-Interface.&lt;br /&gt;
&lt;br /&gt;
==Debugging in der Schaltung==&lt;br /&gt;
&lt;br /&gt;
Ist beispielsweise ein günstiges [[JTAG]]-Interface für In-Circuit&lt;br /&gt;
Debugging verfügbar?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Derivate mit JTAG verfügbar. ICEen gebraucht erschwinglich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: alle mit JTAG.&lt;br /&gt;
* Günstiges Parallel-Port-Interface verfügbar und einfach zu bauen (Wiggler), aber langsam und problematisch im Betrieb unter WinNT+ (besser: ocdremote unter Win9x auf Zweitrechner, via LAN). Kostenlose Debugger ([[GDB]]) unterstützen seit OCDremote 2.14 mit Einschränkungen auch Programme im Flash. &lt;br /&gt;
* Schnelles JTAG Interface basierend auf FT2232C für [[GDB]]/OpenOCD günstig und einfach zu bauen (http://www.fh-augsburg.de/~hhoegl/proj/usbjtag/usbjtag.html) oder fertig erhältlich (http://www.amontec.com/jtagkey.shtml).&lt;br /&gt;
* Kommerzielle Debugger per USB sind besser und schneller, aber recht teuer.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: für ATmega16/162/32/128 ist JTAG günstig verfügbar&lt;br /&gt;
(Olimex, Erostech) bzw. einfach zu bauen (Evertool). ATmegas ab 2005/2006 mit JTAG sind zu dieser Billigvariante inkompatibel. Für diese und den [[debugWIRE]] der ATtinys und ATmegaX8 existiert das JTAG ICE mkII von Atmel, aber recht teuer, sowie der preiswerte AVR Dragon.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: alle mit JTAG, Adapter sehr günstig/einfach zu bauen. Neuere Geräte mit Spy-by-Wire (braucht weniger Pins als JTAG).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: Entweder Microchips MPLAB ICD2 (&amp;amp;#8364;150-200) oder ein kompatibler Nachbau, wie z.B. http://www.stolz.de.be/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C&#039;&#039;&#039;: On-Chip Debugging ist mit dem E8 Hardware On-Chip Debugging Emulator möglich (kein JTAG). Ausserdem ist Debugging auch über einen normalen RS232 Anschluss möglich. Der E8 verwendet ein syncrones serielles Protokoll, die RS232 ein asyncrones. Daher ermöglicht der E8 das Debugging bei jeder beliebigen Taktfrequenz, bei RS232 gibt es da Einschränkungen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: Debugging möglich mit &amp;quot;Smart Cable&amp;quot; (kein JTAG), Anschluss über USB oder Seriell&lt;br /&gt;
&lt;br /&gt;
==Starterkits==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Keil MCB900 (http://www.keil.com/mcb900)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: http://www.olimex.com (z.T. hier im Shop erhältlich), http://www.embeddedartists.com,&lt;br /&gt;
http://www.mct.de&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: [[STK200]], [[STK500]], [[AVR_Butterfly]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: http://www.olimex.com (z.T. hier im Shop erhältlich), ez430 (http://www.ti.com/ez430)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: Velleman-Kit K8048 (www.velleman.be)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C&#039;&#039;&#039;: Mehrere (Google Suche). Am weitesten verbreitet ist vielleicht das R8C/13 Starterkit inkl. Entwickler-CD von Glyn/Elektor (Beilage Elektor 12/2005 (ausverkauft) bzw. diverse Drittanbieter). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: Günstig verfügbar [~50&amp;amp;#8364;], teils hier im Shop, komplett inklusive unbeschränktem Compiler und In-System-Debugging. Nachteile: für jede Prozessorklasse ein eigenes Kit; eingelöteter SMD-Chip obwohl viele Typen auch im DIL-Gehäuse existieren.&lt;br /&gt;
&lt;br /&gt;
==Gehäuse==&lt;br /&gt;
&lt;br /&gt;
Mit DIP oder PLCC bastelt es sich leichter als mit *QFP. Die Domäne von&lt;br /&gt;
AVR/PIC/i51. Für MSP430 gibt es günstige fertig bestückte DIP-Adapter hier im Shop (MSP430x2xx gibt es auch in 14-Pin DIP-Gehäuse). Z8e-Chips existieren ebenfalls in DIP, sind aber schlechter verfügbar.&lt;br /&gt;
&lt;br /&gt;
==Beschaltungsaufwand==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR, PIC, 8051, Z8e, MSP430, R8C&#039;&#039;&#039;: gering, i.d.R. sind Versionen mit integriertem Oszillator verfügbar, so dass man praktisch nur die Versorgungsspannung (nebst Abblockkondensator) braucht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: aufwendigere externe Takt- und Spannungserzeugung, manchmal 2 Betriebsspannungen benötigt; Tendenz aber fallend.&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/read-1-185133.html#new Forum]&lt;br /&gt;
* [[8051]]&lt;br /&gt;
* [[AVR]]&lt;br /&gt;
* [[PIC]]&lt;br /&gt;
* [[Z8]]&lt;br /&gt;
* [[ARM]]&lt;br /&gt;
* [[MSP430]]&lt;br /&gt;
* [[R8C]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>134.76.63.190</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Mikrocontroller_Vergleich&amp;diff=35227</id>
		<title>Mikrocontroller Vergleich</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Mikrocontroller_Vergleich&amp;diff=35227"/>
		<updated>2009-03-21T14:21:51Z</updated>

		<summary type="html">&lt;p&gt;134.76.63.190: /* Priorisierte Interrupts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein paar Kriterien für den CPU-Core und die µC-Familie.&lt;br /&gt;
&lt;br /&gt;
==Compiler verfügbar, bzw wieviel will man dafür ausgeben?==&lt;br /&gt;
&lt;br /&gt;
Und wie verbreitet ist der Compiler? Finde ich dafür Hilfe, beispielsweise in Form von Support-Foren?&lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;[[ARM]]&#039;&#039;&#039;, &#039;&#039;&#039;[[AVR]]&#039;&#039;&#039; und &#039;&#039;&#039;[[MSP430]]&#039;&#039;&#039; gibt es mit GCC einen guten und kostenlosen Compiler. Bei &#039;&#039;&#039;ARM&#039;&#039;&#039; sind jedoch die Schritte zum fertigen Programm recht komplex und Library/Laufzeitsystem benötigen einige Handarbeit. &lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;ARM&#039;&#039;&#039; gibt es von IAR eine auf 32KB begrenzte kostenlose Version eines umgänglicheren kommerziellen Compilers.&lt;br /&gt;
&lt;br /&gt;
Des Weiteren gibt es für &#039;&#039;&#039;[[MSP430]]&#039;&#039;&#039; eine auf 4KB begrenzte kostenlose Version der Entwicklungsumgebung von IAR und eine auf 8KB begrenzte kostenlose Version der Entwicklungsumgebung Code Composer Essentials (basiert auf Eclipse) von Texas Instruments.&lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;[[PIC]]&#039;&#039;&#039; und &#039;&#039;&#039;[[8051]]&#039;&#039;&#039; kann man entweder den Open-Source-Compiler [http://www.sf.net/projects/sdcc SDCC] verwenden (brauchbar, aber nicht mit GCC vergleichbar) oder diverse Löhnwares, bis 4-stellige Beträge (Keil: 2600&amp;amp;#8364;), teils auch als Demoversion mit Tricks. Auch der offizielle C18-Compiler kann als großzügiges Demo heruntergeladen werden.&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;PIC&#039;&#039;&#039; sind das der PICC Lite von HI-TECH, der nur eine handvoll PIC12 und PIC16 unterstützt, und der CC5X, welcher zwar keine High-End PICs unterstützt, dafür die meisten Mid-Range; einzige Einschränkung der freien Version des CC5X ist die Limitierung auf 1024 Instruktionen pro Modul, nicht so gute Codeoptimierung und die Begrenzung von Variablen auf 16-Bit. Ein Vergleich aller C-Compiler für PIC findet sich hier: http://www.informel.de/pic/ccompiler.htm&lt;br /&gt;
&lt;br /&gt;
Für die &#039;&#039;&#039;[[PIC24]]&#039;&#039;&#039; und &#039;&#039;&#039;[[dsPIC]]&#039;&#039;&#039; gibt es den C30 von Microchip. Er basiert auf gcc und ist frei erhältlich, wobei nach 6 Wochen nicht mehr alle Optimierungsstufen wählbar sind, dann maximal -O1. Wie für alle PIC ist mit dem MPLAB eine kostenlose IDE mit Debugger und Simulator verfügbar.&lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;[[R8C]]/M16C&#039;&#039;&#039; gibt es eine Demoversion des Herstellers und eine noch ziemlich frische (lies: Stand 2005 nicht ausgereifte) Version vom GCC.&lt;br /&gt;
&lt;br /&gt;
Zilog stellt für &#039;&#039;&#039;[[Z8]]e&#039;&#039;&#039; eine unbeschränkte IDE mit C-Compiler, Debugger und Simulator kostenlos per Download zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pascal&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Für PIC,DSPIC und AVR gibt es einen sehr guten PASCAL-Compiler &amp;quot;MikroPascal&amp;quot;&lt;br /&gt;
der, in der Downloadversion Code-Size begrenzt ist,&lt;br /&gt;
und den man zu moderaten Preisen zur &amp;quot;Vollversion&amp;quot; aufrüsten kann.&lt;br /&gt;
http://www.mikroelektronika.co.yu/&lt;br /&gt;
( ab 149,- &amp;amp;#8364; )&lt;br /&gt;
&lt;br /&gt;
Elektor-Verlag &#039;Pascal für 8051 und Derivate&#039; Buch+Compiler(Vollversion)&lt;br /&gt;
&lt;br /&gt;
AVRco Pascal Compiler (http://www.e-lab.de/), &lt;br /&gt;
Kostenlose Version für Mega8/88&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BASIC:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sowohl für den AVR als auch für die 8051er gibts von MCS-Electronics eine Demoversion eines BASIC-Compilers,&lt;br /&gt;
der leicht im Funktionsumfang und Codegröße eingeschränkt ist. &lt;br /&gt;
[http://www.mcselec.com/]&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus kursieren im Netz Versionen eines BASIC-Interpreters für 8052er mit dem Namen &amp;quot;8052 AH-BASIC&amp;quot;. Dieser Interpreter unterstüzt sogar Fließkommarithmetik und soll als Freeware verfügbar sein.&lt;br /&gt;
&lt;br /&gt;
==Architektur==&lt;br /&gt;
&lt;br /&gt;
Betrifft vor allem Assembler-Programmierung und die Frage, wie einfach oder umständlich sich C-Code in Maschinensprache übersetzen lässt. &lt;br /&gt;
&lt;br /&gt;
Dass für alle Architekturen teils mehrere C-Compiler existieren, hat wenig mit Eignung und viel mit Markt zu tun. Zudem ist meist nur entscheidend, ob ein Controller die Anforderungen erfüllt, nicht jedoch wie gut er das tut.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Manches davon ist durchaus subjektiv. Bei abweichender Meinung bitte als Diskussion starten, nicht einfach löschen.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Typische Akkumulator-orientierte 8-Bit Architektur. Eine gewisse Komplexität entstand durch die sukzessive Erweiterung auf mehr RAM als ursprünglich vorgesehen war, mit etlichen unterschiedlich adressierten RAM-Bereichen als Folge. Für C-Compiler nur eingeschränkt geeignet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: 32bit RISC-Architektur. In den gängigen Implementierungen mit dem  ARM7TDMI-Core (Architektur V4 = ARMv4T) stehen 2 Befehlssätze zur Verfügung: 32bit-codiert für Tempo, sofern der Speicherdurchsatz das zulässt, und 16bit-codiert (Thumb) für kompakte Programme. Cortex M3 (ARMv7) kennt ausschliesslich 16bit codierte Befehle. Einheitlicher 32bit-Adressraum. Exzellente Zielmaschine für C-Compiler.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: Register-orientierte, an RISC Prinzipien angelehnte 8-Bit Architektur. Getrennte Adressräume für RAM und ROM. Registersatz nicht einheitlich nutzbar. I/O-Bereich nicht einheitlich adressierbar. Nur ein Teil des I/O-Bereiches ist bitweise manipulierbar. Einheitliche RAM-Adressierung. Für C-Compiler geeignet.Bemerkung: Laut Wikipedia wurde der Controller während der Entwicklungsphase für den Einsatz von C-Compilern optimiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: Register-orientierte 16-Bit RISC-Architektur mit vollständiger Orthogonalität. Einheitlicher Adressraum für RAM und ROM. Exzellente Zielmaschine für C-Compiler. Angelehnt an die legendäre PDP-11, vieles wurde übernommen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: Akkumulator-orientierte 8-Bit Architektur. Getrennte Adressräume für RAM und ROM. RAM-Banking, ROM-banking. Umständlicher Zugriff auf Daten im ROM (nur 12/14-Bit Versionen). Viele für C-Compiler wesentliche Elemente sind nur umständlich realisierbar (z.B. Code/Datenadressierung mit Banking, Vergleich mit Vorzeichen).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC24&#039;&#039;&#039;: Register-orientierte 16-Bit Architektur mit getrennten Adressräumen für RAM und ROM, wobei ein Teil des ROM in den RAM-Adressbereich eingeblendet werden kann. Fast alle Befehle sind auf Register und RAM anwendbar, incl. Bitmanipulationen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;dsPIC&#039;&#039;&#039;: wie &#039;&#039;&#039;PIC24&#039;&#039;&#039;, mit zusätzlichen DSP Befehlen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C&#039;&#039;&#039;: 16-Bit 2-Adress CISC-Architektur. Einheitlicher 64KB Adressraum für RAM und ROM. Gute Zielmaschine für C-Compiler.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;M16C&#039;&#039;&#039;: Unter Bezeichnung M16C existieren sich zwei verschiedene inkompatible Architekturen. Die Modelle bis /6x sind grundsätzlich identisch mit R8C, die /8x Modelle mit M32C (hier nicht näher betrachtet). Der 64KB RAM-I/O-Adressraum ist ein Teil des 1MB großen Gesamtadressraumes, Daten im ROM liegen jedoch ausserhalb dieser 64KB und sind daher anders als beim R8C nicht mit 16-Bit Zeigern adressierbar. Gute Zielmaschine für spezialisierte C-Compiler, GCC jedoch tut sich etwas schwer mit den Adressräumen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: Register-orientierte 8-Bit Architektur, 2-Adress-CISC. Getrennte Adressräume für RAM und ROM. Historisch bedingt 3 RAM-Adressräume (8-Bit, 12-Bit, 16-Bit). Für C-Compiler geeignet&lt;br /&gt;
&lt;br /&gt;
Kleiner nicht repräsentativer Compiler-Vergleich. Verwendet wurde eine Variante des crc8-Code von Colin O&#039;Flynn. Jeweils kleinstes Speichermodell, auf Platz optimiert:&lt;br /&gt;
{|&lt;br /&gt;
|Compiler&lt;br /&gt;
|  Befehle(1)&lt;br /&gt;
|  Bytes(1)&lt;br /&gt;
|  Befehle(2)&lt;br /&gt;
|  Bytes(2)&lt;br /&gt;
|-&lt;br /&gt;
|GCC AVR&lt;br /&gt;
|24&lt;br /&gt;
|48&lt;br /&gt;
|24&lt;br /&gt;
|48&lt;br /&gt;
|-&lt;br /&gt;
|Keil 8051&lt;br /&gt;
|24&lt;br /&gt;
|38&lt;br /&gt;
|74&lt;br /&gt;
|109&lt;br /&gt;
|-&lt;br /&gt;
|SDCC 8051&lt;br /&gt;
|24&lt;br /&gt;
|40&lt;br /&gt;
|35&lt;br /&gt;
|54&lt;br /&gt;
|-&lt;br /&gt;
|Zilog Z8e&lt;br /&gt;
|21&lt;br /&gt;
|54&lt;br /&gt;
|27&lt;br /&gt;
|73&lt;br /&gt;
|-&lt;br /&gt;
|PIC C18&lt;br /&gt;
|26&lt;br /&gt;
|52&lt;br /&gt;
|95&lt;br /&gt;
|206&lt;br /&gt;
|-&lt;br /&gt;
|SDCC PIC18&lt;br /&gt;
|41&lt;br /&gt;
|112&lt;br /&gt;
|41&lt;br /&gt;
|112&lt;br /&gt;
|-&lt;br /&gt;
|SDCC PIC16&lt;br /&gt;
|26&lt;br /&gt;
|52&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| (for pic16f84)&lt;br /&gt;
|-&lt;br /&gt;
|HEW R8C/M16C&lt;br /&gt;
|20&lt;br /&gt;
|48&lt;br /&gt;
|20&lt;br /&gt;
|48&lt;br /&gt;
|-&lt;br /&gt;
|GCC 68HC11&lt;br /&gt;
|36&lt;br /&gt;
|65&lt;br /&gt;
|36&lt;br /&gt;
|65&lt;br /&gt;
|-&lt;br /&gt;
|GCC MSP430&lt;br /&gt;
|17&lt;br /&gt;
|40&lt;br /&gt;
|17&lt;br /&gt;
|40&lt;br /&gt;
|-&lt;br /&gt;
|GCC ARM7&lt;br /&gt;
|12&lt;br /&gt;
|48&lt;br /&gt;
|12&lt;br /&gt;
|48&lt;br /&gt;
|-&lt;br /&gt;
|GCC ARM7-Thumb&lt;br /&gt;
|20&lt;br /&gt;
|40&lt;br /&gt;
|20&lt;br /&gt;
|40&lt;br /&gt;
|}&lt;br /&gt;
(1): Lokale Daten ggf. statisch gespeichert, nicht reentrant.&lt;br /&gt;
&lt;br /&gt;
(2): Lokale Daten auf dem Stack, also reentrant.&lt;br /&gt;
&lt;br /&gt;
==Sind CPU-spezifische Erweiterungen in C erforderlich?==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: &lt;br /&gt;
* 5-6 Speicherklassen für Datenspeicher (direkt, indirekt, 8-Bit &amp;quot;external&amp;quot;, 16-Bit &amp;quot;external&amp;quot;, Flash, evtl. noch Einzelbits). &lt;br /&gt;
*Außerdem noch Adresserweiterungen durch Mapping, Paging und Banking &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: &lt;br /&gt;
* 2 Speicherklassen für Datenspeicher (RAM, ROM).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;R8C&#039;&#039;&#039;: nein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: &lt;br /&gt;
* 3 Speicherklassen für Datenspeicher (shared RAM, banked RAM, ROM).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;:&lt;br /&gt;
* Für atomic execution (s.u.) notwendig, aber nicht existent.&lt;br /&gt;
* 4 Speicherklassen für Datenspeicher (256B, 4KB, 64KB, Flash).&lt;br /&gt;
&lt;br /&gt;
==Sind Daten in RAM und ROM mit dem gleichen Code benutzbar?==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;, &#039;&#039;&#039;AVR&#039;&#039;&#039;, &#039;&#039;&#039;PIC&#039;&#039;&#039;, &#039;&#039;&#039;Z8e&#039;&#039;&#039; wie generell alle [[Harvard-Architektur|Harvard-Architekturen]]: NEIN. Daten im ROM&lt;br /&gt;
erfordern anderen Zugriff als Daten im RAM. Entweder versteckt das der Compiler in Runtime-Routinen für Pointerzugriffe, oder man kann Routinen nicht so schreiben, dass sie beides als Parameter verdauen können. Bei kleinen Programmen von ein paar KB kein Problem, bei größeren jedoch schon. Bei AVR/GCC ziemlich fehlerträchtig.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC24&#039;&#039;&#039; und &#039;&#039;&#039;dsPIC&#039;&#039;&#039; können einen Teil des ROM in den RAM-Adressbereich einblenden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;M16C&#039;&#039;&#039;: Hängt vom Compiler ab. Mit 16-Bit Zeigern (GCC) nicht, 20-Bit Zeiger sind ineffizient.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;R8C&#039;&#039;&#039;: [[von Neumann-Architektur]], problemlos.&lt;br /&gt;
&lt;br /&gt;
==Lineare Adressierung vom RAM?==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;, &#039;&#039;&#039;ARM&#039;&#039;&#039;, &#039;&#039;&#039;AVR&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;R8C/M16C&#039;&#039;&#039;, &#039;&#039;&#039;Z8e&#039;&#039;&#039;: kein Problem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: PIC18 ja, PIC16,PIC12,PIC10 nein. RAM-Puffer die größer sind als das RAM in einer Bank sind nur mit Klimmzügen möglich.&lt;br /&gt;
&lt;br /&gt;
==Skalierbarkeit==&lt;br /&gt;
&lt;br /&gt;
Vor allem für jene wichtig, die sich scheuen, für&lt;br /&gt;
verschiedene Aufgaben verschiedene Lösungen zu verwenden. &lt;br /&gt;
&lt;br /&gt;
Spezielle Versionen für LCD-Ansteuerung wurden in dieser Übersicht nicht berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: 8-Pin/1KB aufwärts, überwiegend 40/44-Pin und 64/68-Pin. Architekturbedingte Grenze bei 64KB Code, 64KB RAM - Versionen mit mehr Flash  nutzbar via Banking (Compiler-Support vorhanden) existieren, Versionen mit bis zu 100 MHz Taktfrequenz verfügbar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: 48-Pin/32KB, bis 512K mit internem Flash. Versionen mit internem Cache und externem Speicher sind praktisch beliebig weit ausbaufähig.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: 8-Pin/1KB bis 64-Pin/128KB, 100-Pin/256KB in Vorbereitung. Architekturbedingte  Grenze bei 8MB Code, 64KB RAM. GCC/WinAVR derzeit nur bis 128KB Code möglich (in Arbeit).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: 14-Pin DIP/1KB bis 113-Pin BGA/256KB. DIP, SOIC, TSSOP, QFN, TQFP und BGA erhältlich, in DIP und BGA jedoch nur wenige Typen verfügbar. Architekturbedingte Grenze von 64KB für Code+Daten wird in den großen Versionen durch 20-bittige Adressen umschifft. Taktfrequenz: maximal 8, 16 und 18 MHz je nach Familie. 25 MHz-Versionen in Kürze. Stromaufnahme: Rund 2 uA im LPM3 (real time clock mode) bis ca. 5 mA, typisch 200 µA pro MHz.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: 6-Pin/512B aufwärts. Im Prinzip großer Bereich, aber innerhalb der Familie deutlich verschiedene inkompatible Architekturen mit unterschiedlichen architekturbedingen Grenzen und unterschiedlichem Compiler-Support.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC24&#039;&#039;&#039; und &#039;&#039;&#039;dsPIC&#039;&#039;&#039;: 18 bis 100-Pin mit 16 bis 256kB Code und bis zu 16kB RAM. Generell sind alle als TQFP und QFN erhältlich, die 18 und 28 Pin Modelle gibt es auch als SDIP und SSOP und SOIC. Es gibt Modelle mit 16 und 40MHz.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;eZ8&#039;&#039;&#039;: Bis 64KB Flash. Architekturbedingte Grenze bei 64KB Code, 64KB RAM.&lt;br /&gt;
&lt;br /&gt;
Empfehlung hier: Auch wenn teilweise mehr möglich ist, sind 8/16-Bit-Controller nur bis maximal 40-60K empfehlenswert. Darüber sollte eine 32-Bit-Architektur — z.B. mit [[ARM]]-Core — in Betracht gezogen werden. Insbesondere auch, weil große Programme zu Programm- und Datenstrukturen neigen, die sich auf 8-Bit-Prozessoren schlecht abbilden lassen.&lt;br /&gt;
&lt;br /&gt;
==Interrupt-feste Programmierung von I/O-Ports==&lt;br /&gt;
&lt;br /&gt;
Siehe http://www.mikrocontroller.net/articles/Interrupt.&lt;br /&gt;
&lt;br /&gt;
Das ist besonders bei &#039;&#039;&#039;AVR&#039;&#039;&#039; (ausser den Typen seit 2004: ATtiny2313 usw.) ein Problem. Architekturbedingt ist nur ein Teil der Ports bitweise schaltbar, kein Port kann mehrere Bits gleichzeitig interrupt-fest schalten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;, &#039;&#039;&#039;8051&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;R8C/M16C&#039;&#039;&#039;, &#039;&#039;&#039;Z8e&#039;&#039;&#039; können AND/OR/XOR zum Port hin, daher ist bei geeigneter Programmierung das Problem auch ohne Abschalten der Interrupts vermeidbar.&lt;br /&gt;
&lt;br /&gt;
Zu &#039;&#039;&#039;ARM&#039;&#039;&#039; ist dazu keine allgemeine Aussage möglich. Je nach Implementierung wird das Problem teilweise durch entsprechend gestaltete I/O-Ports gelöst, in anderen Fällen ist erhebliche Wachsamkeit geboten. Atmel SAM7 bereitet hier weniger Probleme als Philips LPC2000. Bei den  LPC2000 gibt es zwei getrennte Register, eines zum Setzen, das andere zum Löschen einzelner Pins. In einem weiteren Register können Bits ausmaskiert werden. Es gibt also kein read-modify-write. Gut gelöst für Push/Pull-Ausgänge, aber eine äquivalente Steuerung der Richtung wurde vergessen, was Open-Drain Pins erschwert. Implementierungen auf Basis des Cortex M3 oder der ARM Port-Macrocell verwenden statt dessen Adressbits zur Maskierung.&lt;br /&gt;
&lt;br /&gt;
Besonders pfiffig ist das beim &#039;&#039;&#039;Z8e&#039;&#039;&#039; gelöst. Ein Befehl fasst die nächsten 3 Befehle zu einer nicht unterbrechbaren Einheit zusammen (atomic execution). Allerdings wird das vom Zilog Compiler nicht unterstützt.&lt;br /&gt;
&lt;br /&gt;
==Zugriff auf I/O-Ports==&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;8051&#039;&#039;&#039; verfügt weder über eigene Register für die Steuerung der Richtung der I/O-Ports, noch über die Möglichkeit, lesend auf den Sollzustand der Ausgänge zuzugreifen. In Assembler ist das kein Problem, da abhängig vom Befehl entweder vom Zustand der Pins (Leseoperationen) oder vom Sollzustand der Ausgänge (kombinierte Lese/Schreiboperationen) ausgegangen wird. Ein korrekt arbeitender C Compiler kann damit jedoch nicht umgehen, weshalb für die Steuerung von Port-Pins spezielle Zugriffsfunktionen und eine sehr genaue Kenntnis der Arbeitsweise der Ports erforderlich sind.&lt;br /&gt;
&lt;br /&gt;
Anmerkung zum Keil 8051-Compiler: Port-Zugriff erfolgt über Pseudo-Variablen wie bei µC üblich. Infolgedessen ist in C Code nicht ersichtlich, ob beispielsweise die Port-Variable P1 für den Zustand der Pins oder den Sollzustand der Ausgänge steht. Nur der erzeugte Assembler-Code kann hier Klarheit schaffen. So haben die beiden prinzipiell identischen Zeilen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 = P1 | 0x01;&lt;br /&gt;
P1 = (P1 | 0x01) &amp;amp; ~0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
völlig unterschiedliche Auswirkung auf den Port. Der Code der ersten Zeile setzt Bit 0 und lässt alle anderen Bits unverändert. Der von der zweiten Zeile erzeugte Code setzt zusätzlich auch alle vorher als Eingang definierten Pins im Zustand 0 auf Ausgang mit Zustand 0. Das ist weder hilfreich, noch mit der Sprachdefinition von C vereinbar.&lt;br /&gt;
&lt;br /&gt;
Auch manche Modelle der &#039;&#039;&#039;PIC&#039;&#039;&#039;-Familie können nur auf den Zustand der Pins zugreifen, nicht auf den Sollzustand der Ausgänge.&lt;br /&gt;
&lt;br /&gt;
In beiden Fällen ist folglich bei Ports, die sowohl für Aus- als auch für Eingänge benutzt werden, besondere Sorgfalt nötig.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;, &#039;&#039;&#039;AVR&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;Z8e&#039;&#039;&#039; und neuere Modelle der &#039;&#039;&#039;PIC&#039;&#039;&#039;-Familie besitzen diese Probleme nicht.&lt;br /&gt;
&lt;br /&gt;
==Priorisierte Interrupts==&lt;br /&gt;
&lt;br /&gt;
Unter priorisierten Interrupts versteht man die Fähigkeit, den einzelnen Interrupt-Quellen eine Priorität zuweisen zu können um ohne Reprogrammierung der Interrupt-Quellen einen laufenden Interrupt ausschliesslich durch Interrupts höherer Priorität unterbrechbar machen zu können. Die einfache und selbstverständliche Fähigkeit, anstehende Interrupts nach fester Priorität zu sortieren, ist damit nicht gemeint.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Ja.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: Der ARM-Core unterstützt 2 Prioritäten mit entsprechenden Vektoren. Oft ist jedoch ein separater priorisierter und vektorisierter Interrupt-Controller mit integriert (Atmel, NXP, Cortex ja, Analog Devices nein). Interrupt-Nesting ist dank eines Designfehlers etwas umständlich, repariert in ARMv7 (Cortex M3).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR:&#039;&#039;&#039; Nein, aber separate Vektoren. Beim Sprung in die Interruptroutine wird implizit ein CLI ausgeführt, beim Rücksprung ein SEI. Ein &amp;quot;unwichtiger Interrupt&amp;quot; blockiert also evtl. einen &amp;quot;wichtigen&amp;quot;. Wenn aber ein Interrupt in der Interruptroutine ausgelöst wird, wird er später der internen Priorität nach ausgeführt. Immerhin haben Interruptquellen im Gegensatz zu alten PIC ihre eigenen Interruptvektoren, so dass keine Zeit mit der Suche nach der Quelle verbracht wird.&lt;br /&gt;
Um trotzdem für eine von mehreren Interruptquellen eine Reaktionszeiten im unteren Mikrosekundenbereich zu garantieren, hilft nur ein Trick: die weniger wichtigen Interruptroutinen tun nichts als eine Programmadresse auf den Stack zu PUSHen. Das RETI springt also zu dieser Adresse mit der eigentlichen Interruptbehandlung, das RET am Ende der Routine springt zur ursprünglichen Unterbruchstelle zurück; der zeitkritische Interrupt kann damit die andere Interruptbehandlung unterbrechen. &#039;&#039;Achtung: es muss gewährleistet sein, dass auch im worst case ein Interrupt sich nicht selbst unterbricht!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Anmerkung: Eine (unwichtige) Interruptroutine kann sofort nach Ansprung ein SEI ausführen, damit eine (unwichtige) Interruptroutine jederzeit von einer anderen (wichtigeren) Interruptroutine unterbrochen werden kann. Das kann pro Interruptvektor individuell entschieden werden. Dies ist jedoch nicht bei allen Interrupt-Quellen möglich (beispielsweise nicht beim TWI).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430:&#039;&#039;&#039; Ja, 16 vollpriorisierte Vektoren, davon 14 global maskierbar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC12 &amp;amp; PIC16:&#039;&#039;&#039; Nein, nur ein Interruptvektor.  Einfache PIC12 (12F508/509, 16F505) kennen gar keine Interrupts.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC18:&#039;&#039;&#039; Jeder Interruptquelle kann separat eine niedrige oder hohe Priorität zugewiesen werden, die dann auf zwei Interruptvektoren verzweigen. Welche Quelle den Interrupt ausgelöst hat, muss aber immer noch händisch festgestellt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC17:&#039;&#039;&#039; Vier Interruptvektoren mit unterschiedlicher Priorität. Scheint es allerdings nur als OTP zu geben, deswegen wohl eher uninteressant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC24&#039;&#039;&#039; und &#039;&#039;&#039;dsPIC&#039;&#039;&#039; haben 7 Prioritäten und für jeden Interrupt einen eigenen Interruptvektor.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C/M16C&#039;&#039;&#039;: 7 Prioritäten, vektorisiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: 3 Prioritäten, vektorisiert.&lt;br /&gt;
&lt;br /&gt;
== Spannungsversorgung ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;, &#039;&#039;&#039;AVR&#039;&#039;&#039;, &#039;&#039;&#039;PIC&#039;&#039;&#039;: 3-5V problemlos (evtl. eingeschränkte µC-Auswahl?). Ungeregelter Batteriebetrieb möglich. Einzelne AVR auch bis 1.8V. LV-PICs auch bis 2,2V&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: 3,3V-Versorgung, 5V-kompatibel. Je nach Modell ist eine separate 1,8V-Versorgung für den Core notwendig. Kein ungeregelter Batteriebetrieb möglich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: nur 1.8-3.6V. Nicht 5V-kompatibel, 5V-Peripherie für I2C/RS485/CAN/... ist also nur mit Pegelkonvertierung einsetzbar. Ungeregelter Batteriebetrieb möglich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: 3,3V-Versorgung, 5V-kompatibel.&lt;br /&gt;
&lt;br /&gt;
==Programmierung in der Schaltung==&lt;br /&gt;
&lt;br /&gt;
Geräte mit Debugging-Interface (s.U.) lassen sich i.d.R. auch damit programmieren. Siehe dazu nächsten Abschnitt.&lt;br /&gt;
&lt;br /&gt;
Die meisten Controller können sich selbst programmieren, Bootloader per RS232,CAN,usw sind dann problemlos realisierbar. Nur müssen solche Bootloader erst einmal auf den Chip programmiert werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: Entweder über die serielle ICSP-Schnittstelle (dafür gibt es Baupläne für billige ParPort-Programmer incl. guter Software) oder mit dem InCircuit-Debugger (~150&amp;amp;#8364;, ICD2 von Microchip). Bootloader müssen generell vorher mit einer der vorher genannten Möglichkeiten auf den Chip geflasht werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Verschieden, je nach Hersteller und Modell. Im Unterschied zu den anderen hier betrachtete Controllern existieren viele nicht in der Schaltung, sondern nur mit speziellen Interfaces programmierbare 8051 Modelle. Modelle mit seriellem Bootloader via UART, SPI, CAN oder USB existieren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: Am besten über JTAG, je nach Hersteller und Familie auch mit Bootloader, z.B. bei Philips LPC2000 über RS232 und Atmel SAM7 über USB (bei letzterem sehr unbequem und langsam!).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: Über ein an SPI orientiertes proprietäres Interface. Ist via Parallelport günstig herzustellen; der Adapter ist im besten Fall genau 5 Widerstände teuer, professioneller mit einem [[Ausgangsstufen_Logik-ICs#Tri-state|Tri-State]]-Bustreiber etwa 5-15 EUR. Darüberhinaus auch mit HV-Programmer (z.B. auf dem [[STK500]]), der u.U. auch nötig ist um falsch gesetzte Fuses wieder zu &amp;quot;reparieren&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: Via JTAG-Interface, TI &amp;quot;Spy BiWire&amp;quot; und über integrierten  Bootloader. (Schaltung zur Ansteuerung via RS232 im Datenblatt)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C&#039;&#039;&#039;: Via UART (RS-232 oder USB-RS-232 Konverter) mit Flash-Tool (Windows, Linux). Variante über Bootloader ebenfalls möglich (wird vom Software Emulator-Debugger benutzt).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: Via Debug-Interface.&lt;br /&gt;
&lt;br /&gt;
==Debugging in der Schaltung==&lt;br /&gt;
&lt;br /&gt;
Ist beispielsweise ein günstiges [[JTAG]]-Interface für In-Circuit&lt;br /&gt;
Debugging verfügbar?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Derivate mit JTAG verfügbar. ICEen gebraucht erschwinglich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: alle mit JTAG.&lt;br /&gt;
* Günstiges Parallel-Port-Interface verfügbar und einfach zu bauen (Wiggler), aber langsam und problematisch im Betrieb unter WinNT+ (besser: ocdremote unter Win9x auf Zweitrechner, via LAN). Kostenlose Debugger ([[GDB]]) unterstützen seit OCDremote 2.14 mit Einschränkungen auch Programme im Flash. &lt;br /&gt;
* Schnelles JTAG Interface basierend auf FT2232C für [[GDB]]/OpenOCD günstig und einfach zu bauen (http://www.fh-augsburg.de/~hhoegl/proj/usbjtag/usbjtag.html) oder fertig erhältlich (http://www.amontec.com/jtagkey.shtml).&lt;br /&gt;
* Kommerzielle Debugger per USB sind besser und schneller, aber recht teuer.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: für ATmega16/162/32/128 ist JTAG günstig verfügbar&lt;br /&gt;
(Olimex, Erostech) bzw. einfach zu bauen (Evertool). ATmegas ab 2005/2006 mit JTAG sind zu dieser Billigvariante inkompatibel. Für diese und den [[debugWIRE]] der ATtinys und ATmegaX8 existiert das JTAG ICE mkII von Atmel, aber recht teuer, sowie der preiswerte AVR Dragon.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: alle mit JTAG, Adapter sehr günstig/einfach zu bauen. Neuere Geräte mit Spy-by-Wire (braucht weniger Pins als JTAG).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: Entweder Microchips MPLAB ICD2 (&amp;amp;#8364;150-200) oder ein kompatibler Nachbau, wie z.B. http://www.stolz.de.be/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C&#039;&#039;&#039;: On-Chip Debugging ist mit dem E8 Hardware On-Chip Debugging Emulator möglich (kein JTAG). Ausserdem ist Debugging auch über einen normalen RS232 Anschluss möglich. Der E8 verwendet ein syncrones serielles Protokoll, die RS232 ein asyncrones. Daher ermöglicht der E8 das Debugging bei jeder beliebigen Taktfrequenz, bei RS232 gibt es da Einschränkungen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: Debugging möglich mit &amp;quot;Smart Cable&amp;quot; (kein JTAG), Anschluss über USB oder Seriell&lt;br /&gt;
&lt;br /&gt;
==Starterkits==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Keil MCB900 (http://www.keil.com/mcb900)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: http://www.olimex.com (z.T. hier im Shop erhältlich), http://www.embeddedartists.com,&lt;br /&gt;
http://www.mct.de&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: [[STK200]], [[STK500]], [[AVR_Butterfly]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: http://www.olimex.com (z.T. hier im Shop erhältlich), ez430 (http://www.ti.com/ez430)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: Velleman-Kit K8048 (www.velleman.be)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C&#039;&#039;&#039;: Mehrere (Google Suche). Am weitesten verbreitet ist vielleicht das R8C/13 Starterkit inkl. Entwickler-CD von Glyn/Elektor (Beilage Elektor 12/2005 (ausverkauft) bzw. diverse Drittanbieter). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: Günstig verfügbar [~50&amp;amp;#8364;], teils hier im Shop, komplett inklusive unbeschränktem Compiler und In-System-Debugging. Nachteile: für jede Prozessorklasse ein eigenes Kit; eingelöteter SMD-Chip obwohl viele Typen auch im DIL-Gehäuse existieren.&lt;br /&gt;
&lt;br /&gt;
==Gehäuse==&lt;br /&gt;
&lt;br /&gt;
Mit DIP oder PLCC bastelt es sich leichter als mit *QFP. Die Domäne von&lt;br /&gt;
AVR/PIC/i51. Für MSP430 gibt es günstige fertig bestückte DIP-Adapter hier im Shop (MSP430x2xx gibt es auch in 14-Pin DIP-Gehäuse). Z8e-Chips existieren ebenfalls in DIP, sind aber schlechter verfügbar.&lt;br /&gt;
&lt;br /&gt;
==Beschaltungsaufwand==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR, PIC, 8051, Z8e, MSP430, R8C&#039;&#039;&#039;: gering, i.d.R. sind Versionen mit integriertem Oszillator verfügbar, so dass man praktisch nur die Versorgungsspannung (nebst Abblockkondensator) braucht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: aufwendigere externe Takt- und Spannungserzeugung, manchmal 2 Betriebsspannungen benötigt; Tendenz aber fallend.&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/read-1-185133.html#new Forum]&lt;br /&gt;
* [[8051]]&lt;br /&gt;
* [[AVR]]&lt;br /&gt;
* [[PIC]]&lt;br /&gt;
* [[Z8]]&lt;br /&gt;
* [[ARM]]&lt;br /&gt;
* [[MSP430]]&lt;br /&gt;
* [[R8C]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>134.76.63.190</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Mikrocontroller_Vergleich&amp;diff=35226</id>
		<title>Mikrocontroller Vergleich</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Mikrocontroller_Vergleich&amp;diff=35226"/>
		<updated>2009-03-21T14:17:16Z</updated>

		<summary type="html">&lt;p&gt;134.76.63.190: /* Skalierbarkeit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein paar Kriterien für den CPU-Core und die µC-Familie.&lt;br /&gt;
&lt;br /&gt;
==Compiler verfügbar, bzw wieviel will man dafür ausgeben?==&lt;br /&gt;
&lt;br /&gt;
Und wie verbreitet ist der Compiler? Finde ich dafür Hilfe, beispielsweise in Form von Support-Foren?&lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;[[ARM]]&#039;&#039;&#039;, &#039;&#039;&#039;[[AVR]]&#039;&#039;&#039; und &#039;&#039;&#039;[[MSP430]]&#039;&#039;&#039; gibt es mit GCC einen guten und kostenlosen Compiler. Bei &#039;&#039;&#039;ARM&#039;&#039;&#039; sind jedoch die Schritte zum fertigen Programm recht komplex und Library/Laufzeitsystem benötigen einige Handarbeit. &lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;ARM&#039;&#039;&#039; gibt es von IAR eine auf 32KB begrenzte kostenlose Version eines umgänglicheren kommerziellen Compilers.&lt;br /&gt;
&lt;br /&gt;
Des Weiteren gibt es für &#039;&#039;&#039;[[MSP430]]&#039;&#039;&#039; eine auf 4KB begrenzte kostenlose Version der Entwicklungsumgebung von IAR und eine auf 8KB begrenzte kostenlose Version der Entwicklungsumgebung Code Composer Essentials (basiert auf Eclipse) von Texas Instruments.&lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;[[PIC]]&#039;&#039;&#039; und &#039;&#039;&#039;[[8051]]&#039;&#039;&#039; kann man entweder den Open-Source-Compiler [http://www.sf.net/projects/sdcc SDCC] verwenden (brauchbar, aber nicht mit GCC vergleichbar) oder diverse Löhnwares, bis 4-stellige Beträge (Keil: 2600&amp;amp;#8364;), teils auch als Demoversion mit Tricks. Auch der offizielle C18-Compiler kann als großzügiges Demo heruntergeladen werden.&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;PIC&#039;&#039;&#039; sind das der PICC Lite von HI-TECH, der nur eine handvoll PIC12 und PIC16 unterstützt, und der CC5X, welcher zwar keine High-End PICs unterstützt, dafür die meisten Mid-Range; einzige Einschränkung der freien Version des CC5X ist die Limitierung auf 1024 Instruktionen pro Modul, nicht so gute Codeoptimierung und die Begrenzung von Variablen auf 16-Bit. Ein Vergleich aller C-Compiler für PIC findet sich hier: http://www.informel.de/pic/ccompiler.htm&lt;br /&gt;
&lt;br /&gt;
Für die &#039;&#039;&#039;[[PIC24]]&#039;&#039;&#039; und &#039;&#039;&#039;[[dsPIC]]&#039;&#039;&#039; gibt es den C30 von Microchip. Er basiert auf gcc und ist frei erhältlich, wobei nach 6 Wochen nicht mehr alle Optimierungsstufen wählbar sind, dann maximal -O1. Wie für alle PIC ist mit dem MPLAB eine kostenlose IDE mit Debugger und Simulator verfügbar.&lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;[[R8C]]/M16C&#039;&#039;&#039; gibt es eine Demoversion des Herstellers und eine noch ziemlich frische (lies: Stand 2005 nicht ausgereifte) Version vom GCC.&lt;br /&gt;
&lt;br /&gt;
Zilog stellt für &#039;&#039;&#039;[[Z8]]e&#039;&#039;&#039; eine unbeschränkte IDE mit C-Compiler, Debugger und Simulator kostenlos per Download zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pascal&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Für PIC,DSPIC und AVR gibt es einen sehr guten PASCAL-Compiler &amp;quot;MikroPascal&amp;quot;&lt;br /&gt;
der, in der Downloadversion Code-Size begrenzt ist,&lt;br /&gt;
und den man zu moderaten Preisen zur &amp;quot;Vollversion&amp;quot; aufrüsten kann.&lt;br /&gt;
http://www.mikroelektronika.co.yu/&lt;br /&gt;
( ab 149,- &amp;amp;#8364; )&lt;br /&gt;
&lt;br /&gt;
Elektor-Verlag &#039;Pascal für 8051 und Derivate&#039; Buch+Compiler(Vollversion)&lt;br /&gt;
&lt;br /&gt;
AVRco Pascal Compiler (http://www.e-lab.de/), &lt;br /&gt;
Kostenlose Version für Mega8/88&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BASIC:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sowohl für den AVR als auch für die 8051er gibts von MCS-Electronics eine Demoversion eines BASIC-Compilers,&lt;br /&gt;
der leicht im Funktionsumfang und Codegröße eingeschränkt ist. &lt;br /&gt;
[http://www.mcselec.com/]&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus kursieren im Netz Versionen eines BASIC-Interpreters für 8052er mit dem Namen &amp;quot;8052 AH-BASIC&amp;quot;. Dieser Interpreter unterstüzt sogar Fließkommarithmetik und soll als Freeware verfügbar sein.&lt;br /&gt;
&lt;br /&gt;
==Architektur==&lt;br /&gt;
&lt;br /&gt;
Betrifft vor allem Assembler-Programmierung und die Frage, wie einfach oder umständlich sich C-Code in Maschinensprache übersetzen lässt. &lt;br /&gt;
&lt;br /&gt;
Dass für alle Architekturen teils mehrere C-Compiler existieren, hat wenig mit Eignung und viel mit Markt zu tun. Zudem ist meist nur entscheidend, ob ein Controller die Anforderungen erfüllt, nicht jedoch wie gut er das tut.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Manches davon ist durchaus subjektiv. Bei abweichender Meinung bitte als Diskussion starten, nicht einfach löschen.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Typische Akkumulator-orientierte 8-Bit Architektur. Eine gewisse Komplexität entstand durch die sukzessive Erweiterung auf mehr RAM als ursprünglich vorgesehen war, mit etlichen unterschiedlich adressierten RAM-Bereichen als Folge. Für C-Compiler nur eingeschränkt geeignet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: 32bit RISC-Architektur. In den gängigen Implementierungen mit dem  ARM7TDMI-Core (Architektur V4 = ARMv4T) stehen 2 Befehlssätze zur Verfügung: 32bit-codiert für Tempo, sofern der Speicherdurchsatz das zulässt, und 16bit-codiert (Thumb) für kompakte Programme. Cortex M3 (ARMv7) kennt ausschliesslich 16bit codierte Befehle. Einheitlicher 32bit-Adressraum. Exzellente Zielmaschine für C-Compiler.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: Register-orientierte, an RISC Prinzipien angelehnte 8-Bit Architektur. Getrennte Adressräume für RAM und ROM. Registersatz nicht einheitlich nutzbar. I/O-Bereich nicht einheitlich adressierbar. Nur ein Teil des I/O-Bereiches ist bitweise manipulierbar. Einheitliche RAM-Adressierung. Für C-Compiler geeignet.Bemerkung: Laut Wikipedia wurde der Controller während der Entwicklungsphase für den Einsatz von C-Compilern optimiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: Register-orientierte 16-Bit RISC-Architektur mit vollständiger Orthogonalität. Einheitlicher Adressraum für RAM und ROM. Exzellente Zielmaschine für C-Compiler. Angelehnt an die legendäre PDP-11, vieles wurde übernommen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: Akkumulator-orientierte 8-Bit Architektur. Getrennte Adressräume für RAM und ROM. RAM-Banking, ROM-banking. Umständlicher Zugriff auf Daten im ROM (nur 12/14-Bit Versionen). Viele für C-Compiler wesentliche Elemente sind nur umständlich realisierbar (z.B. Code/Datenadressierung mit Banking, Vergleich mit Vorzeichen).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC24&#039;&#039;&#039;: Register-orientierte 16-Bit Architektur mit getrennten Adressräumen für RAM und ROM, wobei ein Teil des ROM in den RAM-Adressbereich eingeblendet werden kann. Fast alle Befehle sind auf Register und RAM anwendbar, incl. Bitmanipulationen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;dsPIC&#039;&#039;&#039;: wie &#039;&#039;&#039;PIC24&#039;&#039;&#039;, mit zusätzlichen DSP Befehlen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C&#039;&#039;&#039;: 16-Bit 2-Adress CISC-Architektur. Einheitlicher 64KB Adressraum für RAM und ROM. Gute Zielmaschine für C-Compiler.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;M16C&#039;&#039;&#039;: Unter Bezeichnung M16C existieren sich zwei verschiedene inkompatible Architekturen. Die Modelle bis /6x sind grundsätzlich identisch mit R8C, die /8x Modelle mit M32C (hier nicht näher betrachtet). Der 64KB RAM-I/O-Adressraum ist ein Teil des 1MB großen Gesamtadressraumes, Daten im ROM liegen jedoch ausserhalb dieser 64KB und sind daher anders als beim R8C nicht mit 16-Bit Zeigern adressierbar. Gute Zielmaschine für spezialisierte C-Compiler, GCC jedoch tut sich etwas schwer mit den Adressräumen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: Register-orientierte 8-Bit Architektur, 2-Adress-CISC. Getrennte Adressräume für RAM und ROM. Historisch bedingt 3 RAM-Adressräume (8-Bit, 12-Bit, 16-Bit). Für C-Compiler geeignet&lt;br /&gt;
&lt;br /&gt;
Kleiner nicht repräsentativer Compiler-Vergleich. Verwendet wurde eine Variante des crc8-Code von Colin O&#039;Flynn. Jeweils kleinstes Speichermodell, auf Platz optimiert:&lt;br /&gt;
{|&lt;br /&gt;
|Compiler&lt;br /&gt;
|  Befehle(1)&lt;br /&gt;
|  Bytes(1)&lt;br /&gt;
|  Befehle(2)&lt;br /&gt;
|  Bytes(2)&lt;br /&gt;
|-&lt;br /&gt;
|GCC AVR&lt;br /&gt;
|24&lt;br /&gt;
|48&lt;br /&gt;
|24&lt;br /&gt;
|48&lt;br /&gt;
|-&lt;br /&gt;
|Keil 8051&lt;br /&gt;
|24&lt;br /&gt;
|38&lt;br /&gt;
|74&lt;br /&gt;
|109&lt;br /&gt;
|-&lt;br /&gt;
|SDCC 8051&lt;br /&gt;
|24&lt;br /&gt;
|40&lt;br /&gt;
|35&lt;br /&gt;
|54&lt;br /&gt;
|-&lt;br /&gt;
|Zilog Z8e&lt;br /&gt;
|21&lt;br /&gt;
|54&lt;br /&gt;
|27&lt;br /&gt;
|73&lt;br /&gt;
|-&lt;br /&gt;
|PIC C18&lt;br /&gt;
|26&lt;br /&gt;
|52&lt;br /&gt;
|95&lt;br /&gt;
|206&lt;br /&gt;
|-&lt;br /&gt;
|SDCC PIC18&lt;br /&gt;
|41&lt;br /&gt;
|112&lt;br /&gt;
|41&lt;br /&gt;
|112&lt;br /&gt;
|-&lt;br /&gt;
|SDCC PIC16&lt;br /&gt;
|26&lt;br /&gt;
|52&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| (for pic16f84)&lt;br /&gt;
|-&lt;br /&gt;
|HEW R8C/M16C&lt;br /&gt;
|20&lt;br /&gt;
|48&lt;br /&gt;
|20&lt;br /&gt;
|48&lt;br /&gt;
|-&lt;br /&gt;
|GCC 68HC11&lt;br /&gt;
|36&lt;br /&gt;
|65&lt;br /&gt;
|36&lt;br /&gt;
|65&lt;br /&gt;
|-&lt;br /&gt;
|GCC MSP430&lt;br /&gt;
|17&lt;br /&gt;
|40&lt;br /&gt;
|17&lt;br /&gt;
|40&lt;br /&gt;
|-&lt;br /&gt;
|GCC ARM7&lt;br /&gt;
|12&lt;br /&gt;
|48&lt;br /&gt;
|12&lt;br /&gt;
|48&lt;br /&gt;
|-&lt;br /&gt;
|GCC ARM7-Thumb&lt;br /&gt;
|20&lt;br /&gt;
|40&lt;br /&gt;
|20&lt;br /&gt;
|40&lt;br /&gt;
|}&lt;br /&gt;
(1): Lokale Daten ggf. statisch gespeichert, nicht reentrant.&lt;br /&gt;
&lt;br /&gt;
(2): Lokale Daten auf dem Stack, also reentrant.&lt;br /&gt;
&lt;br /&gt;
==Sind CPU-spezifische Erweiterungen in C erforderlich?==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: &lt;br /&gt;
* 5-6 Speicherklassen für Datenspeicher (direkt, indirekt, 8-Bit &amp;quot;external&amp;quot;, 16-Bit &amp;quot;external&amp;quot;, Flash, evtl. noch Einzelbits). &lt;br /&gt;
*Außerdem noch Adresserweiterungen durch Mapping, Paging und Banking &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: &lt;br /&gt;
* 2 Speicherklassen für Datenspeicher (RAM, ROM).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;R8C&#039;&#039;&#039;: nein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: &lt;br /&gt;
* 3 Speicherklassen für Datenspeicher (shared RAM, banked RAM, ROM).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;:&lt;br /&gt;
* Für atomic execution (s.u.) notwendig, aber nicht existent.&lt;br /&gt;
* 4 Speicherklassen für Datenspeicher (256B, 4KB, 64KB, Flash).&lt;br /&gt;
&lt;br /&gt;
==Sind Daten in RAM und ROM mit dem gleichen Code benutzbar?==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;, &#039;&#039;&#039;AVR&#039;&#039;&#039;, &#039;&#039;&#039;PIC&#039;&#039;&#039;, &#039;&#039;&#039;Z8e&#039;&#039;&#039; wie generell alle [[Harvard-Architektur|Harvard-Architekturen]]: NEIN. Daten im ROM&lt;br /&gt;
erfordern anderen Zugriff als Daten im RAM. Entweder versteckt das der Compiler in Runtime-Routinen für Pointerzugriffe, oder man kann Routinen nicht so schreiben, dass sie beides als Parameter verdauen können. Bei kleinen Programmen von ein paar KB kein Problem, bei größeren jedoch schon. Bei AVR/GCC ziemlich fehlerträchtig.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC24&#039;&#039;&#039; und &#039;&#039;&#039;dsPIC&#039;&#039;&#039; können einen Teil des ROM in den RAM-Adressbereich einblenden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;M16C&#039;&#039;&#039;: Hängt vom Compiler ab. Mit 16-Bit Zeigern (GCC) nicht, 20-Bit Zeiger sind ineffizient.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;R8C&#039;&#039;&#039;: [[von Neumann-Architektur]], problemlos.&lt;br /&gt;
&lt;br /&gt;
==Lineare Adressierung vom RAM?==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;, &#039;&#039;&#039;ARM&#039;&#039;&#039;, &#039;&#039;&#039;AVR&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;R8C/M16C&#039;&#039;&#039;, &#039;&#039;&#039;Z8e&#039;&#039;&#039;: kein Problem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: PIC18 ja, PIC16,PIC12,PIC10 nein. RAM-Puffer die größer sind als das RAM in einer Bank sind nur mit Klimmzügen möglich.&lt;br /&gt;
&lt;br /&gt;
==Skalierbarkeit==&lt;br /&gt;
&lt;br /&gt;
Vor allem für jene wichtig, die sich scheuen, für&lt;br /&gt;
verschiedene Aufgaben verschiedene Lösungen zu verwenden. &lt;br /&gt;
&lt;br /&gt;
Spezielle Versionen für LCD-Ansteuerung wurden in dieser Übersicht nicht berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: 8-Pin/1KB aufwärts, überwiegend 40/44-Pin und 64/68-Pin. Architekturbedingte Grenze bei 64KB Code, 64KB RAM - Versionen mit mehr Flash  nutzbar via Banking (Compiler-Support vorhanden) existieren, Versionen mit bis zu 100 MHz Taktfrequenz verfügbar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: 48-Pin/32KB, bis 512K mit internem Flash. Versionen mit internem Cache und externem Speicher sind praktisch beliebig weit ausbaufähig.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: 8-Pin/1KB bis 64-Pin/128KB, 100-Pin/256KB in Vorbereitung. Architekturbedingte  Grenze bei 8MB Code, 64KB RAM. GCC/WinAVR derzeit nur bis 128KB Code möglich (in Arbeit).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: 14-Pin DIP/1KB bis 113-Pin BGA/256KB. DIP, SOIC, TSSOP, QFN, TQFP und BGA erhältlich, in DIP und BGA jedoch nur wenige Typen verfügbar. Architekturbedingte Grenze von 64KB für Code+Daten wird in den großen Versionen durch 20-bittige Adressen umschifft. Taktfrequenz: maximal 8, 16 und 18 MHz je nach Familie. 25 MHz-Versionen in Kürze. Stromaufnahme: Rund 2 uA im LPM3 (real time clock mode) bis ca. 5 mA, typisch 200 µA pro MHz.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: 6-Pin/512B aufwärts. Im Prinzip großer Bereich, aber innerhalb der Familie deutlich verschiedene inkompatible Architekturen mit unterschiedlichen architekturbedingen Grenzen und unterschiedlichem Compiler-Support.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC24&#039;&#039;&#039; und &#039;&#039;&#039;dsPIC&#039;&#039;&#039;: 18 bis 100-Pin mit 16 bis 256kB Code und bis zu 16kB RAM. Generell sind alle als TQFP und QFN erhältlich, die 18 und 28 Pin Modelle gibt es auch als SDIP und SSOP und SOIC. Es gibt Modelle mit 16 und 40MHz.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;eZ8&#039;&#039;&#039;: Bis 64KB Flash. Architekturbedingte Grenze bei 64KB Code, 64KB RAM.&lt;br /&gt;
&lt;br /&gt;
Empfehlung hier: Auch wenn teilweise mehr möglich ist, sind 8/16-Bit-Controller nur bis maximal 40-60K empfehlenswert. Darüber sollte eine 32-Bit-Architektur — z.B. mit [[ARM]]-Core — in Betracht gezogen werden. Insbesondere auch, weil große Programme zu Programm- und Datenstrukturen neigen, die sich auf 8-Bit-Prozessoren schlecht abbilden lassen.&lt;br /&gt;
&lt;br /&gt;
==Interrupt-feste Programmierung von I/O-Ports==&lt;br /&gt;
&lt;br /&gt;
Siehe http://www.mikrocontroller.net/articles/Interrupt.&lt;br /&gt;
&lt;br /&gt;
Das ist besonders bei &#039;&#039;&#039;AVR&#039;&#039;&#039; (ausser den Typen seit 2004: ATtiny2313 usw.) ein Problem. Architekturbedingt ist nur ein Teil der Ports bitweise schaltbar, kein Port kann mehrere Bits gleichzeitig interrupt-fest schalten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;, &#039;&#039;&#039;8051&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;R8C/M16C&#039;&#039;&#039;, &#039;&#039;&#039;Z8e&#039;&#039;&#039; können AND/OR/XOR zum Port hin, daher ist bei geeigneter Programmierung das Problem auch ohne Abschalten der Interrupts vermeidbar.&lt;br /&gt;
&lt;br /&gt;
Zu &#039;&#039;&#039;ARM&#039;&#039;&#039; ist dazu keine allgemeine Aussage möglich. Je nach Implementierung wird das Problem teilweise durch entsprechend gestaltete I/O-Ports gelöst, in anderen Fällen ist erhebliche Wachsamkeit geboten. Atmel SAM7 bereitet hier weniger Probleme als Philips LPC2000. Bei den  LPC2000 gibt es zwei getrennte Register, eines zum Setzen, das andere zum Löschen einzelner Pins. In einem weiteren Register können Bits ausmaskiert werden. Es gibt also kein read-modify-write. Gut gelöst für Push/Pull-Ausgänge, aber eine äquivalente Steuerung der Richtung wurde vergessen, was Open-Drain Pins erschwert. Implementierungen auf Basis des Cortex M3 oder der ARM Port-Macrocell verwenden statt dessen Adressbits zur Maskierung.&lt;br /&gt;
&lt;br /&gt;
Besonders pfiffig ist das beim &#039;&#039;&#039;Z8e&#039;&#039;&#039; gelöst. Ein Befehl fasst die nächsten 3 Befehle zu einer nicht unterbrechbaren Einheit zusammen (atomic execution). Allerdings wird das vom Zilog Compiler nicht unterstützt.&lt;br /&gt;
&lt;br /&gt;
==Zugriff auf I/O-Ports==&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;8051&#039;&#039;&#039; verfügt weder über eigene Register für die Steuerung der Richtung der I/O-Ports, noch über die Möglichkeit, lesend auf den Sollzustand der Ausgänge zuzugreifen. In Assembler ist das kein Problem, da abhängig vom Befehl entweder vom Zustand der Pins (Leseoperationen) oder vom Sollzustand der Ausgänge (kombinierte Lese/Schreiboperationen) ausgegangen wird. Ein korrekt arbeitender C Compiler kann damit jedoch nicht umgehen, weshalb für die Steuerung von Port-Pins spezielle Zugriffsfunktionen und eine sehr genaue Kenntnis der Arbeitsweise der Ports erforderlich sind.&lt;br /&gt;
&lt;br /&gt;
Anmerkung zum Keil 8051-Compiler: Port-Zugriff erfolgt über Pseudo-Variablen wie bei µC üblich. Infolgedessen ist in C Code nicht ersichtlich, ob beispielsweise die Port-Variable P1 für den Zustand der Pins oder den Sollzustand der Ausgänge steht. Nur der erzeugte Assembler-Code kann hier Klarheit schaffen. So haben die beiden prinzipiell identischen Zeilen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 = P1 | 0x01;&lt;br /&gt;
P1 = (P1 | 0x01) &amp;amp; ~0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
völlig unterschiedliche Auswirkung auf den Port. Der Code der ersten Zeile setzt Bit 0 und lässt alle anderen Bits unverändert. Der von der zweiten Zeile erzeugte Code setzt zusätzlich auch alle vorher als Eingang definierten Pins im Zustand 0 auf Ausgang mit Zustand 0. Das ist weder hilfreich, noch mit der Sprachdefinition von C vereinbar.&lt;br /&gt;
&lt;br /&gt;
Auch manche Modelle der &#039;&#039;&#039;PIC&#039;&#039;&#039;-Familie können nur auf den Zustand der Pins zugreifen, nicht auf den Sollzustand der Ausgänge.&lt;br /&gt;
&lt;br /&gt;
In beiden Fällen ist folglich bei Ports, die sowohl für Aus- als auch für Eingänge benutzt werden, besondere Sorgfalt nötig.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;, &#039;&#039;&#039;AVR&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;Z8e&#039;&#039;&#039; und neuere Modelle der &#039;&#039;&#039;PIC&#039;&#039;&#039;-Familie besitzen diese Probleme nicht.&lt;br /&gt;
&lt;br /&gt;
==Priorisierte Interrupts==&lt;br /&gt;
&lt;br /&gt;
Unter priorisierten Interrupts versteht man die Fähigkeit, den einzelnen Interrupt-Quellen eine Priorität zuweisen zu können um ohne Reprogrammierung der Interrupt-Quellen einen laufenden Interrupt ausschliesslich durch Interrupts höherer Priorität unterbrechbar machen zu können. Die einfache und selbstverständliche Fähigkeit, anstehende Interrupts nach fester Priorität zu sortieren, ist damit nicht gemeint.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Ja.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: Der ARM-Core unterstützt 2 Prioritäten mit entsprechenden Vektoren. Oft ist jedoch ein separater priorisierter und vektorisierter Interrupt-Controller mit integriert (Atmel, NXP, Cortex ja, Analog Devices nein). Interrupt-Nesting ist dank eines Designfehlers etwas umständlich, repariert in ARMv7 (Cortex M3).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR:&#039;&#039;&#039; Nein, aber separate Vektoren. Beim Sprung in die Interruptroutine wird implizit ein CLI ausgeführt, beim Rücksprung ein SEI. Ein &amp;quot;unwichtiger Interrupt&amp;quot; blockiert also evtl. einen &amp;quot;wichtigen&amp;quot;. Wenn aber ein Interrupt in der Interruptroutine ausgelöst wird, wird er später der internen Priorität nach ausgeführt. Immerhin haben Interruptquellen im Gegensatz zum PIC ihre eigenen Interruptvektoren, so dass keine Zeit mit der Suche nach der Quelle verbracht wird.&lt;br /&gt;
Um trotzdem für eine von mehreren Interruptquellen eine Reaktionszeiten im unteren Mikrosekundenbereich zu garantieren, hilft nur ein Trick: die weniger wichtigen Interruptroutinen tun nichts als eine Programmadresse auf den Stack zu PUSHen. Das RETI springt also zu dieser Adresse mit der eigentlichen Interruptbehandlung, das RET am Ende der Routine springt zur ursprünglichen Unterbruchstelle zurück; der zeitkritische Interrupt kann damit die andere Interruptbehandlung unterbrechen. &#039;&#039;Achtung: es muss gewährleistet sein, dass auch im worst case ein Interrupt sich nicht selbst unterbricht!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Anmerkung: Eine (unwichtige) Interruptroutine kann sofort nach Ansprung ein SEI ausführen, damit eine (unwichtige) Interruptroutine jederzeit von einer anderen (wichtigeren) Interruptroutine unterbrochen werden kann. Das kann pro Interruptvektor individuell entschieden werden. Dies ist jedoch nicht bei allen Interrupt-Quellen möglich (beispielsweise nicht beim TWI).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430:&#039;&#039;&#039; Ja, 16 vollpriorisierte Vektoren, davon 14 global maskierbar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC12 &amp;amp; PIC16:&#039;&#039;&#039; Nein, nur ein Interruptvektor.  Einfache PIC12 (12F508/509, 16F505) kennen gar keine Interrupts.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC18:&#039;&#039;&#039; Jeder Interruptquelle kann separat eine niedrige oder hohe Priorität zugewiesen werden, die dann auf zwei Interruptvektoren verzweigen. Welche Quelle den Interrupt ausgelöst hat, muss aber immer noch händisch festgestellt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC17:&#039;&#039;&#039; Vier Interruptvektoren mit unterschiedlicher Priorität. Scheint es allerdings nur als OTP zu geben, deswegen wohl eher uninteressant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C/M16C&#039;&#039;&#039;: 7 Prioritäten, vektorisiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: 3 Prioritäten, vektorisiert.&lt;br /&gt;
&lt;br /&gt;
== Spannungsversorgung ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;, &#039;&#039;&#039;AVR&#039;&#039;&#039;, &#039;&#039;&#039;PIC&#039;&#039;&#039;: 3-5V problemlos (evtl. eingeschränkte µC-Auswahl?). Ungeregelter Batteriebetrieb möglich. Einzelne AVR auch bis 1.8V. LV-PICs auch bis 2,2V&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: 3,3V-Versorgung, 5V-kompatibel. Je nach Modell ist eine separate 1,8V-Versorgung für den Core notwendig. Kein ungeregelter Batteriebetrieb möglich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: nur 1.8-3.6V. Nicht 5V-kompatibel, 5V-Peripherie für I2C/RS485/CAN/... ist also nur mit Pegelkonvertierung einsetzbar. Ungeregelter Batteriebetrieb möglich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: 3,3V-Versorgung, 5V-kompatibel.&lt;br /&gt;
&lt;br /&gt;
==Programmierung in der Schaltung==&lt;br /&gt;
&lt;br /&gt;
Geräte mit Debugging-Interface (s.U.) lassen sich i.d.R. auch damit programmieren. Siehe dazu nächsten Abschnitt.&lt;br /&gt;
&lt;br /&gt;
Die meisten Controller können sich selbst programmieren, Bootloader per RS232,CAN,usw sind dann problemlos realisierbar. Nur müssen solche Bootloader erst einmal auf den Chip programmiert werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: Entweder über die serielle ICSP-Schnittstelle (dafür gibt es Baupläne für billige ParPort-Programmer incl. guter Software) oder mit dem InCircuit-Debugger (~150&amp;amp;#8364;, ICD2 von Microchip). Bootloader müssen generell vorher mit einer der vorher genannten Möglichkeiten auf den Chip geflasht werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Verschieden, je nach Hersteller und Modell. Im Unterschied zu den anderen hier betrachtete Controllern existieren viele nicht in der Schaltung, sondern nur mit speziellen Interfaces programmierbare 8051 Modelle. Modelle mit seriellem Bootloader via UART, SPI, CAN oder USB existieren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: Am besten über JTAG, je nach Hersteller und Familie auch mit Bootloader, z.B. bei Philips LPC2000 über RS232 und Atmel SAM7 über USB (bei letzterem sehr unbequem und langsam!).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: Über ein an SPI orientiertes proprietäres Interface. Ist via Parallelport günstig herzustellen; der Adapter ist im besten Fall genau 5 Widerstände teuer, professioneller mit einem [[Ausgangsstufen_Logik-ICs#Tri-state|Tri-State]]-Bustreiber etwa 5-15 EUR. Darüberhinaus auch mit HV-Programmer (z.B. auf dem [[STK500]]), der u.U. auch nötig ist um falsch gesetzte Fuses wieder zu &amp;quot;reparieren&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: Via JTAG-Interface, TI &amp;quot;Spy BiWire&amp;quot; und über integrierten  Bootloader. (Schaltung zur Ansteuerung via RS232 im Datenblatt)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C&#039;&#039;&#039;: Via UART (RS-232 oder USB-RS-232 Konverter) mit Flash-Tool (Windows, Linux). Variante über Bootloader ebenfalls möglich (wird vom Software Emulator-Debugger benutzt).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: Via Debug-Interface.&lt;br /&gt;
&lt;br /&gt;
==Debugging in der Schaltung==&lt;br /&gt;
&lt;br /&gt;
Ist beispielsweise ein günstiges [[JTAG]]-Interface für In-Circuit&lt;br /&gt;
Debugging verfügbar?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Derivate mit JTAG verfügbar. ICEen gebraucht erschwinglich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: alle mit JTAG.&lt;br /&gt;
* Günstiges Parallel-Port-Interface verfügbar und einfach zu bauen (Wiggler), aber langsam und problematisch im Betrieb unter WinNT+ (besser: ocdremote unter Win9x auf Zweitrechner, via LAN). Kostenlose Debugger ([[GDB]]) unterstützen seit OCDremote 2.14 mit Einschränkungen auch Programme im Flash. &lt;br /&gt;
* Schnelles JTAG Interface basierend auf FT2232C für [[GDB]]/OpenOCD günstig und einfach zu bauen (http://www.fh-augsburg.de/~hhoegl/proj/usbjtag/usbjtag.html) oder fertig erhältlich (http://www.amontec.com/jtagkey.shtml).&lt;br /&gt;
* Kommerzielle Debugger per USB sind besser und schneller, aber recht teuer.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: für ATmega16/162/32/128 ist JTAG günstig verfügbar&lt;br /&gt;
(Olimex, Erostech) bzw. einfach zu bauen (Evertool). ATmegas ab 2005/2006 mit JTAG sind zu dieser Billigvariante inkompatibel. Für diese und den [[debugWIRE]] der ATtinys und ATmegaX8 existiert das JTAG ICE mkII von Atmel, aber recht teuer, sowie der preiswerte AVR Dragon.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: alle mit JTAG, Adapter sehr günstig/einfach zu bauen. Neuere Geräte mit Spy-by-Wire (braucht weniger Pins als JTAG).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: Entweder Microchips MPLAB ICD2 (&amp;amp;#8364;150-200) oder ein kompatibler Nachbau, wie z.B. http://www.stolz.de.be/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C&#039;&#039;&#039;: On-Chip Debugging ist mit dem E8 Hardware On-Chip Debugging Emulator möglich (kein JTAG). Ausserdem ist Debugging auch über einen normalen RS232 Anschluss möglich. Der E8 verwendet ein syncrones serielles Protokoll, die RS232 ein asyncrones. Daher ermöglicht der E8 das Debugging bei jeder beliebigen Taktfrequenz, bei RS232 gibt es da Einschränkungen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: Debugging möglich mit &amp;quot;Smart Cable&amp;quot; (kein JTAG), Anschluss über USB oder Seriell&lt;br /&gt;
&lt;br /&gt;
==Starterkits==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Keil MCB900 (http://www.keil.com/mcb900)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: http://www.olimex.com (z.T. hier im Shop erhältlich), http://www.embeddedartists.com,&lt;br /&gt;
http://www.mct.de&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: [[STK200]], [[STK500]], [[AVR_Butterfly]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: http://www.olimex.com (z.T. hier im Shop erhältlich), ez430 (http://www.ti.com/ez430)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: Velleman-Kit K8048 (www.velleman.be)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C&#039;&#039;&#039;: Mehrere (Google Suche). Am weitesten verbreitet ist vielleicht das R8C/13 Starterkit inkl. Entwickler-CD von Glyn/Elektor (Beilage Elektor 12/2005 (ausverkauft) bzw. diverse Drittanbieter). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: Günstig verfügbar [~50&amp;amp;#8364;], teils hier im Shop, komplett inklusive unbeschränktem Compiler und In-System-Debugging. Nachteile: für jede Prozessorklasse ein eigenes Kit; eingelöteter SMD-Chip obwohl viele Typen auch im DIL-Gehäuse existieren.&lt;br /&gt;
&lt;br /&gt;
==Gehäuse==&lt;br /&gt;
&lt;br /&gt;
Mit DIP oder PLCC bastelt es sich leichter als mit *QFP. Die Domäne von&lt;br /&gt;
AVR/PIC/i51. Für MSP430 gibt es günstige fertig bestückte DIP-Adapter hier im Shop (MSP430x2xx gibt es auch in 14-Pin DIP-Gehäuse). Z8e-Chips existieren ebenfalls in DIP, sind aber schlechter verfügbar.&lt;br /&gt;
&lt;br /&gt;
==Beschaltungsaufwand==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR, PIC, 8051, Z8e, MSP430, R8C&#039;&#039;&#039;: gering, i.d.R. sind Versionen mit integriertem Oszillator verfügbar, so dass man praktisch nur die Versorgungsspannung (nebst Abblockkondensator) braucht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: aufwendigere externe Takt- und Spannungserzeugung, manchmal 2 Betriebsspannungen benötigt; Tendenz aber fallend.&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/read-1-185133.html#new Forum]&lt;br /&gt;
* [[8051]]&lt;br /&gt;
* [[AVR]]&lt;br /&gt;
* [[PIC]]&lt;br /&gt;
* [[Z8]]&lt;br /&gt;
* [[ARM]]&lt;br /&gt;
* [[MSP430]]&lt;br /&gt;
* [[R8C]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>134.76.63.190</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Mikrocontroller_Vergleich&amp;diff=35225</id>
		<title>Mikrocontroller Vergleich</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Mikrocontroller_Vergleich&amp;diff=35225"/>
		<updated>2009-03-21T13:41:10Z</updated>

		<summary type="html">&lt;p&gt;134.76.63.190: /* Sind Daten in RAM und ROM mit dem gleichen Code benutzbar? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein paar Kriterien für den CPU-Core und die µC-Familie.&lt;br /&gt;
&lt;br /&gt;
==Compiler verfügbar, bzw wieviel will man dafür ausgeben?==&lt;br /&gt;
&lt;br /&gt;
Und wie verbreitet ist der Compiler? Finde ich dafür Hilfe, beispielsweise in Form von Support-Foren?&lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;[[ARM]]&#039;&#039;&#039;, &#039;&#039;&#039;[[AVR]]&#039;&#039;&#039; und &#039;&#039;&#039;[[MSP430]]&#039;&#039;&#039; gibt es mit GCC einen guten und kostenlosen Compiler. Bei &#039;&#039;&#039;ARM&#039;&#039;&#039; sind jedoch die Schritte zum fertigen Programm recht komplex und Library/Laufzeitsystem benötigen einige Handarbeit. &lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;ARM&#039;&#039;&#039; gibt es von IAR eine auf 32KB begrenzte kostenlose Version eines umgänglicheren kommerziellen Compilers.&lt;br /&gt;
&lt;br /&gt;
Des Weiteren gibt es für &#039;&#039;&#039;[[MSP430]]&#039;&#039;&#039; eine auf 4KB begrenzte kostenlose Version der Entwicklungsumgebung von IAR und eine auf 8KB begrenzte kostenlose Version der Entwicklungsumgebung Code Composer Essentials (basiert auf Eclipse) von Texas Instruments.&lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;[[PIC]]&#039;&#039;&#039; und &#039;&#039;&#039;[[8051]]&#039;&#039;&#039; kann man entweder den Open-Source-Compiler [http://www.sf.net/projects/sdcc SDCC] verwenden (brauchbar, aber nicht mit GCC vergleichbar) oder diverse Löhnwares, bis 4-stellige Beträge (Keil: 2600&amp;amp;#8364;), teils auch als Demoversion mit Tricks. Auch der offizielle C18-Compiler kann als großzügiges Demo heruntergeladen werden.&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;PIC&#039;&#039;&#039; sind das der PICC Lite von HI-TECH, der nur eine handvoll PIC12 und PIC16 unterstützt, und der CC5X, welcher zwar keine High-End PICs unterstützt, dafür die meisten Mid-Range; einzige Einschränkung der freien Version des CC5X ist die Limitierung auf 1024 Instruktionen pro Modul, nicht so gute Codeoptimierung und die Begrenzung von Variablen auf 16-Bit. Ein Vergleich aller C-Compiler für PIC findet sich hier: http://www.informel.de/pic/ccompiler.htm&lt;br /&gt;
&lt;br /&gt;
Für die &#039;&#039;&#039;[[PIC24]]&#039;&#039;&#039; und &#039;&#039;&#039;[[dsPIC]]&#039;&#039;&#039; gibt es den C30 von Microchip. Er basiert auf gcc und ist frei erhältlich, wobei nach 6 Wochen nicht mehr alle Optimierungsstufen wählbar sind, dann maximal -O1. Wie für alle PIC ist mit dem MPLAB eine kostenlose IDE mit Debugger und Simulator verfügbar.&lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;[[R8C]]/M16C&#039;&#039;&#039; gibt es eine Demoversion des Herstellers und eine noch ziemlich frische (lies: Stand 2005 nicht ausgereifte) Version vom GCC.&lt;br /&gt;
&lt;br /&gt;
Zilog stellt für &#039;&#039;&#039;[[Z8]]e&#039;&#039;&#039; eine unbeschränkte IDE mit C-Compiler, Debugger und Simulator kostenlos per Download zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pascal&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Für PIC,DSPIC und AVR gibt es einen sehr guten PASCAL-Compiler &amp;quot;MikroPascal&amp;quot;&lt;br /&gt;
der, in der Downloadversion Code-Size begrenzt ist,&lt;br /&gt;
und den man zu moderaten Preisen zur &amp;quot;Vollversion&amp;quot; aufrüsten kann.&lt;br /&gt;
http://www.mikroelektronika.co.yu/&lt;br /&gt;
( ab 149,- &amp;amp;#8364; )&lt;br /&gt;
&lt;br /&gt;
Elektor-Verlag &#039;Pascal für 8051 und Derivate&#039; Buch+Compiler(Vollversion)&lt;br /&gt;
&lt;br /&gt;
AVRco Pascal Compiler (http://www.e-lab.de/), &lt;br /&gt;
Kostenlose Version für Mega8/88&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BASIC:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sowohl für den AVR als auch für die 8051er gibts von MCS-Electronics eine Demoversion eines BASIC-Compilers,&lt;br /&gt;
der leicht im Funktionsumfang und Codegröße eingeschränkt ist. &lt;br /&gt;
[http://www.mcselec.com/]&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus kursieren im Netz Versionen eines BASIC-Interpreters für 8052er mit dem Namen &amp;quot;8052 AH-BASIC&amp;quot;. Dieser Interpreter unterstüzt sogar Fließkommarithmetik und soll als Freeware verfügbar sein.&lt;br /&gt;
&lt;br /&gt;
==Architektur==&lt;br /&gt;
&lt;br /&gt;
Betrifft vor allem Assembler-Programmierung und die Frage, wie einfach oder umständlich sich C-Code in Maschinensprache übersetzen lässt. &lt;br /&gt;
&lt;br /&gt;
Dass für alle Architekturen teils mehrere C-Compiler existieren, hat wenig mit Eignung und viel mit Markt zu tun. Zudem ist meist nur entscheidend, ob ein Controller die Anforderungen erfüllt, nicht jedoch wie gut er das tut.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Manches davon ist durchaus subjektiv. Bei abweichender Meinung bitte als Diskussion starten, nicht einfach löschen.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Typische Akkumulator-orientierte 8-Bit Architektur. Eine gewisse Komplexität entstand durch die sukzessive Erweiterung auf mehr RAM als ursprünglich vorgesehen war, mit etlichen unterschiedlich adressierten RAM-Bereichen als Folge. Für C-Compiler nur eingeschränkt geeignet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: 32bit RISC-Architektur. In den gängigen Implementierungen mit dem  ARM7TDMI-Core (Architektur V4 = ARMv4T) stehen 2 Befehlssätze zur Verfügung: 32bit-codiert für Tempo, sofern der Speicherdurchsatz das zulässt, und 16bit-codiert (Thumb) für kompakte Programme. Cortex M3 (ARMv7) kennt ausschliesslich 16bit codierte Befehle. Einheitlicher 32bit-Adressraum. Exzellente Zielmaschine für C-Compiler.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: Register-orientierte, an RISC Prinzipien angelehnte 8-Bit Architektur. Getrennte Adressräume für RAM und ROM. Registersatz nicht einheitlich nutzbar. I/O-Bereich nicht einheitlich adressierbar. Nur ein Teil des I/O-Bereiches ist bitweise manipulierbar. Einheitliche RAM-Adressierung. Für C-Compiler geeignet.Bemerkung: Laut Wikipedia wurde der Controller während der Entwicklungsphase für den Einsatz von C-Compilern optimiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: Register-orientierte 16-Bit RISC-Architektur mit vollständiger Orthogonalität. Einheitlicher Adressraum für RAM und ROM. Exzellente Zielmaschine für C-Compiler. Angelehnt an die legendäre PDP-11, vieles wurde übernommen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: Akkumulator-orientierte 8-Bit Architektur. Getrennte Adressräume für RAM und ROM. RAM-Banking, ROM-banking. Umständlicher Zugriff auf Daten im ROM (nur 12/14-Bit Versionen). Viele für C-Compiler wesentliche Elemente sind nur umständlich realisierbar (z.B. Code/Datenadressierung mit Banking, Vergleich mit Vorzeichen).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC24&#039;&#039;&#039;: Register-orientierte 16-Bit Architektur mit getrennten Adressräumen für RAM und ROM, wobei ein Teil des ROM in den RAM-Adressbereich eingeblendet werden kann. Fast alle Befehle sind auf Register und RAM anwendbar, incl. Bitmanipulationen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;dsPIC&#039;&#039;&#039;: wie &#039;&#039;&#039;PIC24&#039;&#039;&#039;, mit zusätzlichen DSP Befehlen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C&#039;&#039;&#039;: 16-Bit 2-Adress CISC-Architektur. Einheitlicher 64KB Adressraum für RAM und ROM. Gute Zielmaschine für C-Compiler.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;M16C&#039;&#039;&#039;: Unter Bezeichnung M16C existieren sich zwei verschiedene inkompatible Architekturen. Die Modelle bis /6x sind grundsätzlich identisch mit R8C, die /8x Modelle mit M32C (hier nicht näher betrachtet). Der 64KB RAM-I/O-Adressraum ist ein Teil des 1MB großen Gesamtadressraumes, Daten im ROM liegen jedoch ausserhalb dieser 64KB und sind daher anders als beim R8C nicht mit 16-Bit Zeigern adressierbar. Gute Zielmaschine für spezialisierte C-Compiler, GCC jedoch tut sich etwas schwer mit den Adressräumen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: Register-orientierte 8-Bit Architektur, 2-Adress-CISC. Getrennte Adressräume für RAM und ROM. Historisch bedingt 3 RAM-Adressräume (8-Bit, 12-Bit, 16-Bit). Für C-Compiler geeignet&lt;br /&gt;
&lt;br /&gt;
Kleiner nicht repräsentativer Compiler-Vergleich. Verwendet wurde eine Variante des crc8-Code von Colin O&#039;Flynn. Jeweils kleinstes Speichermodell, auf Platz optimiert:&lt;br /&gt;
{|&lt;br /&gt;
|Compiler&lt;br /&gt;
|  Befehle(1)&lt;br /&gt;
|  Bytes(1)&lt;br /&gt;
|  Befehle(2)&lt;br /&gt;
|  Bytes(2)&lt;br /&gt;
|-&lt;br /&gt;
|GCC AVR&lt;br /&gt;
|24&lt;br /&gt;
|48&lt;br /&gt;
|24&lt;br /&gt;
|48&lt;br /&gt;
|-&lt;br /&gt;
|Keil 8051&lt;br /&gt;
|24&lt;br /&gt;
|38&lt;br /&gt;
|74&lt;br /&gt;
|109&lt;br /&gt;
|-&lt;br /&gt;
|SDCC 8051&lt;br /&gt;
|24&lt;br /&gt;
|40&lt;br /&gt;
|35&lt;br /&gt;
|54&lt;br /&gt;
|-&lt;br /&gt;
|Zilog Z8e&lt;br /&gt;
|21&lt;br /&gt;
|54&lt;br /&gt;
|27&lt;br /&gt;
|73&lt;br /&gt;
|-&lt;br /&gt;
|PIC C18&lt;br /&gt;
|26&lt;br /&gt;
|52&lt;br /&gt;
|95&lt;br /&gt;
|206&lt;br /&gt;
|-&lt;br /&gt;
|SDCC PIC18&lt;br /&gt;
|41&lt;br /&gt;
|112&lt;br /&gt;
|41&lt;br /&gt;
|112&lt;br /&gt;
|-&lt;br /&gt;
|SDCC PIC16&lt;br /&gt;
|26&lt;br /&gt;
|52&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| (for pic16f84)&lt;br /&gt;
|-&lt;br /&gt;
|HEW R8C/M16C&lt;br /&gt;
|20&lt;br /&gt;
|48&lt;br /&gt;
|20&lt;br /&gt;
|48&lt;br /&gt;
|-&lt;br /&gt;
|GCC 68HC11&lt;br /&gt;
|36&lt;br /&gt;
|65&lt;br /&gt;
|36&lt;br /&gt;
|65&lt;br /&gt;
|-&lt;br /&gt;
|GCC MSP430&lt;br /&gt;
|17&lt;br /&gt;
|40&lt;br /&gt;
|17&lt;br /&gt;
|40&lt;br /&gt;
|-&lt;br /&gt;
|GCC ARM7&lt;br /&gt;
|12&lt;br /&gt;
|48&lt;br /&gt;
|12&lt;br /&gt;
|48&lt;br /&gt;
|-&lt;br /&gt;
|GCC ARM7-Thumb&lt;br /&gt;
|20&lt;br /&gt;
|40&lt;br /&gt;
|20&lt;br /&gt;
|40&lt;br /&gt;
|}&lt;br /&gt;
(1): Lokale Daten ggf. statisch gespeichert, nicht reentrant.&lt;br /&gt;
&lt;br /&gt;
(2): Lokale Daten auf dem Stack, also reentrant.&lt;br /&gt;
&lt;br /&gt;
==Sind CPU-spezifische Erweiterungen in C erforderlich?==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: &lt;br /&gt;
* 5-6 Speicherklassen für Datenspeicher (direkt, indirekt, 8-Bit &amp;quot;external&amp;quot;, 16-Bit &amp;quot;external&amp;quot;, Flash, evtl. noch Einzelbits). &lt;br /&gt;
*Außerdem noch Adresserweiterungen durch Mapping, Paging und Banking &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: &lt;br /&gt;
* 2 Speicherklassen für Datenspeicher (RAM, ROM).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;R8C&#039;&#039;&#039;: nein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: &lt;br /&gt;
* 3 Speicherklassen für Datenspeicher (shared RAM, banked RAM, ROM).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;:&lt;br /&gt;
* Für atomic execution (s.u.) notwendig, aber nicht existent.&lt;br /&gt;
* 4 Speicherklassen für Datenspeicher (256B, 4KB, 64KB, Flash).&lt;br /&gt;
&lt;br /&gt;
==Sind Daten in RAM und ROM mit dem gleichen Code benutzbar?==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;, &#039;&#039;&#039;AVR&#039;&#039;&#039;, &#039;&#039;&#039;PIC&#039;&#039;&#039;, &#039;&#039;&#039;Z8e&#039;&#039;&#039; wie generell alle [[Harvard-Architektur|Harvard-Architekturen]]: NEIN. Daten im ROM&lt;br /&gt;
erfordern anderen Zugriff als Daten im RAM. Entweder versteckt das der Compiler in Runtime-Routinen für Pointerzugriffe, oder man kann Routinen nicht so schreiben, dass sie beides als Parameter verdauen können. Bei kleinen Programmen von ein paar KB kein Problem, bei größeren jedoch schon. Bei AVR/GCC ziemlich fehlerträchtig.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC24&#039;&#039;&#039; und &#039;&#039;&#039;dsPIC&#039;&#039;&#039; können einen Teil des ROM in den RAM-Adressbereich einblenden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;M16C&#039;&#039;&#039;: Hängt vom Compiler ab. Mit 16-Bit Zeigern (GCC) nicht, 20-Bit Zeiger sind ineffizient.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;R8C&#039;&#039;&#039;: [[von Neumann-Architektur]], problemlos.&lt;br /&gt;
&lt;br /&gt;
==Lineare Adressierung vom RAM?==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;, &#039;&#039;&#039;ARM&#039;&#039;&#039;, &#039;&#039;&#039;AVR&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;R8C/M16C&#039;&#039;&#039;, &#039;&#039;&#039;Z8e&#039;&#039;&#039;: kein Problem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: PIC18 ja, PIC16,PIC12,PIC10 nein. RAM-Puffer die größer sind als das RAM in einer Bank sind nur mit Klimmzügen möglich.&lt;br /&gt;
&lt;br /&gt;
==Skalierbarkeit==&lt;br /&gt;
&lt;br /&gt;
Vor allem für jene wichtig, die sich scheuen, für&lt;br /&gt;
verschiedene Aufgaben verschiedene Lösungen zu verwenden. &lt;br /&gt;
&lt;br /&gt;
Spezielle Versionen für LCD-Ansteuerung wurden in dieser Übersicht nicht berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: 8-Pin/1KB aufwärts, überwiegend 40/44-Pin und 64/68-Pin. Architekturbedingte Grenze bei 64KB Code, 64KB RAM - Versionen mit mehr Flash  nutzbar via Banking (Compiler-Support vorhanden) existieren, Versionen mit bis zu 100 MHz Taktfrequenz verfügbar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: 48-Pin/32KB, bis 512K mit internem Flash. Versionen mit internem Cache und externem Speicher sind praktisch beliebig weit ausbaufähig.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: 8-Pin/1KB bis 64-Pin/128KB, 100-Pin/256KB in Vorbereitung. Architekturbedingte  Grenze bei 8MB Code, 64KB RAM. GCC/WinAVR derzeit nur bis 128KB Code möglich (in Arbeit).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: 14-Pin DIP/1KB bis 113-Pin BGA/256KB. DIP, SOIC, TSSOP, QFN, TQFP und BGA erhältlich, in DIP und BGA jedoch nur wenige Typen verfügbar. Architekturbedingte Grenze von 64KB für Code+Daten wird in den großen Versionen durch 20-bittige Adressen umschifft. Taktfrequenz: maximal 8, 16 und 18 MHz je nach Familie. 25 MHz-Versionen in Kürze. Stromaufnahme: Rund 2 uA im LPM3 (real time clock mode) bis ca. 5 mA, typisch 200 µA pro MHz.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: 6-Pin/512B aufwärts. Im Prinzip großer Bereich, aber innerhalb der Familie deutlich verschiedene inkompatible Architekturen mit unterschiedlichen architekturbedingen Grenzen und unterschiedlichem Compiler-Support.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;eZ8&#039;&#039;&#039;: Bis 64KB Flash. Architekturbedingte Grenze bei 64KB Code, 64KB RAM.&lt;br /&gt;
&lt;br /&gt;
Empfehlung hier: Auch wenn teilweise mehr möglich ist, sind 8/16-Bit-Controller nur bis maximal 40-60K empfehlenswert. Darüber sollte eine 32-Bit-Architektur — z.B. mit [[ARM]]-Core — in Betracht gezogen werden. Insbesondere auch, weil große Programme zu Programm- und Datenstrukturen neigen, die sich auf 8-Bit-Prozessoren schlecht abbilden lassen.&lt;br /&gt;
&lt;br /&gt;
==Interrupt-feste Programmierung von I/O-Ports==&lt;br /&gt;
&lt;br /&gt;
Siehe http://www.mikrocontroller.net/articles/Interrupt.&lt;br /&gt;
&lt;br /&gt;
Das ist besonders bei &#039;&#039;&#039;AVR&#039;&#039;&#039; (ausser den Typen seit 2004: ATtiny2313 usw.) ein Problem. Architekturbedingt ist nur ein Teil der Ports bitweise schaltbar, kein Port kann mehrere Bits gleichzeitig interrupt-fest schalten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;, &#039;&#039;&#039;8051&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;R8C/M16C&#039;&#039;&#039;, &#039;&#039;&#039;Z8e&#039;&#039;&#039; können AND/OR/XOR zum Port hin, daher ist bei geeigneter Programmierung das Problem auch ohne Abschalten der Interrupts vermeidbar.&lt;br /&gt;
&lt;br /&gt;
Zu &#039;&#039;&#039;ARM&#039;&#039;&#039; ist dazu keine allgemeine Aussage möglich. Je nach Implementierung wird das Problem teilweise durch entsprechend gestaltete I/O-Ports gelöst, in anderen Fällen ist erhebliche Wachsamkeit geboten. Atmel SAM7 bereitet hier weniger Probleme als Philips LPC2000. Bei den  LPC2000 gibt es zwei getrennte Register, eines zum Setzen, das andere zum Löschen einzelner Pins. In einem weiteren Register können Bits ausmaskiert werden. Es gibt also kein read-modify-write. Gut gelöst für Push/Pull-Ausgänge, aber eine äquivalente Steuerung der Richtung wurde vergessen, was Open-Drain Pins erschwert. Implementierungen auf Basis des Cortex M3 oder der ARM Port-Macrocell verwenden statt dessen Adressbits zur Maskierung.&lt;br /&gt;
&lt;br /&gt;
Besonders pfiffig ist das beim &#039;&#039;&#039;Z8e&#039;&#039;&#039; gelöst. Ein Befehl fasst die nächsten 3 Befehle zu einer nicht unterbrechbaren Einheit zusammen (atomic execution). Allerdings wird das vom Zilog Compiler nicht unterstützt.&lt;br /&gt;
&lt;br /&gt;
==Zugriff auf I/O-Ports==&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;8051&#039;&#039;&#039; verfügt weder über eigene Register für die Steuerung der Richtung der I/O-Ports, noch über die Möglichkeit, lesend auf den Sollzustand der Ausgänge zuzugreifen. In Assembler ist das kein Problem, da abhängig vom Befehl entweder vom Zustand der Pins (Leseoperationen) oder vom Sollzustand der Ausgänge (kombinierte Lese/Schreiboperationen) ausgegangen wird. Ein korrekt arbeitender C Compiler kann damit jedoch nicht umgehen, weshalb für die Steuerung von Port-Pins spezielle Zugriffsfunktionen und eine sehr genaue Kenntnis der Arbeitsweise der Ports erforderlich sind.&lt;br /&gt;
&lt;br /&gt;
Anmerkung zum Keil 8051-Compiler: Port-Zugriff erfolgt über Pseudo-Variablen wie bei µC üblich. Infolgedessen ist in C Code nicht ersichtlich, ob beispielsweise die Port-Variable P1 für den Zustand der Pins oder den Sollzustand der Ausgänge steht. Nur der erzeugte Assembler-Code kann hier Klarheit schaffen. So haben die beiden prinzipiell identischen Zeilen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 = P1 | 0x01;&lt;br /&gt;
P1 = (P1 | 0x01) &amp;amp; ~0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
völlig unterschiedliche Auswirkung auf den Port. Der Code der ersten Zeile setzt Bit 0 und lässt alle anderen Bits unverändert. Der von der zweiten Zeile erzeugte Code setzt zusätzlich auch alle vorher als Eingang definierten Pins im Zustand 0 auf Ausgang mit Zustand 0. Das ist weder hilfreich, noch mit der Sprachdefinition von C vereinbar.&lt;br /&gt;
&lt;br /&gt;
Auch manche Modelle der &#039;&#039;&#039;PIC&#039;&#039;&#039;-Familie können nur auf den Zustand der Pins zugreifen, nicht auf den Sollzustand der Ausgänge.&lt;br /&gt;
&lt;br /&gt;
In beiden Fällen ist folglich bei Ports, die sowohl für Aus- als auch für Eingänge benutzt werden, besondere Sorgfalt nötig.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;, &#039;&#039;&#039;AVR&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;Z8e&#039;&#039;&#039; und neuere Modelle der &#039;&#039;&#039;PIC&#039;&#039;&#039;-Familie besitzen diese Probleme nicht.&lt;br /&gt;
&lt;br /&gt;
==Priorisierte Interrupts==&lt;br /&gt;
&lt;br /&gt;
Unter priorisierten Interrupts versteht man die Fähigkeit, den einzelnen Interrupt-Quellen eine Priorität zuweisen zu können um ohne Reprogrammierung der Interrupt-Quellen einen laufenden Interrupt ausschliesslich durch Interrupts höherer Priorität unterbrechbar machen zu können. Die einfache und selbstverständliche Fähigkeit, anstehende Interrupts nach fester Priorität zu sortieren, ist damit nicht gemeint.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Ja.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: Der ARM-Core unterstützt 2 Prioritäten mit entsprechenden Vektoren. Oft ist jedoch ein separater priorisierter und vektorisierter Interrupt-Controller mit integriert (Atmel, NXP, Cortex ja, Analog Devices nein). Interrupt-Nesting ist dank eines Designfehlers etwas umständlich, repariert in ARMv7 (Cortex M3).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR:&#039;&#039;&#039; Nein, aber separate Vektoren. Beim Sprung in die Interruptroutine wird implizit ein CLI ausgeführt, beim Rücksprung ein SEI. Ein &amp;quot;unwichtiger Interrupt&amp;quot; blockiert also evtl. einen &amp;quot;wichtigen&amp;quot;. Wenn aber ein Interrupt in der Interruptroutine ausgelöst wird, wird er später der internen Priorität nach ausgeführt. Immerhin haben Interruptquellen im Gegensatz zum PIC ihre eigenen Interruptvektoren, so dass keine Zeit mit der Suche nach der Quelle verbracht wird.&lt;br /&gt;
Um trotzdem für eine von mehreren Interruptquellen eine Reaktionszeiten im unteren Mikrosekundenbereich zu garantieren, hilft nur ein Trick: die weniger wichtigen Interruptroutinen tun nichts als eine Programmadresse auf den Stack zu PUSHen. Das RETI springt also zu dieser Adresse mit der eigentlichen Interruptbehandlung, das RET am Ende der Routine springt zur ursprünglichen Unterbruchstelle zurück; der zeitkritische Interrupt kann damit die andere Interruptbehandlung unterbrechen. &#039;&#039;Achtung: es muss gewährleistet sein, dass auch im worst case ein Interrupt sich nicht selbst unterbricht!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Anmerkung: Eine (unwichtige) Interruptroutine kann sofort nach Ansprung ein SEI ausführen, damit eine (unwichtige) Interruptroutine jederzeit von einer anderen (wichtigeren) Interruptroutine unterbrochen werden kann. Das kann pro Interruptvektor individuell entschieden werden. Dies ist jedoch nicht bei allen Interrupt-Quellen möglich (beispielsweise nicht beim TWI).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430:&#039;&#039;&#039; Ja, 16 vollpriorisierte Vektoren, davon 14 global maskierbar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC12 &amp;amp; PIC16:&#039;&#039;&#039; Nein, nur ein Interruptvektor.  Einfache PIC12 (12F508/509, 16F505) kennen gar keine Interrupts.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC18:&#039;&#039;&#039; Jeder Interruptquelle kann separat eine niedrige oder hohe Priorität zugewiesen werden, die dann auf zwei Interruptvektoren verzweigen. Welche Quelle den Interrupt ausgelöst hat, muss aber immer noch händisch festgestellt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC17:&#039;&#039;&#039; Vier Interruptvektoren mit unterschiedlicher Priorität. Scheint es allerdings nur als OTP zu geben, deswegen wohl eher uninteressant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C/M16C&#039;&#039;&#039;: 7 Prioritäten, vektorisiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: 3 Prioritäten, vektorisiert.&lt;br /&gt;
&lt;br /&gt;
== Spannungsversorgung ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;, &#039;&#039;&#039;AVR&#039;&#039;&#039;, &#039;&#039;&#039;PIC&#039;&#039;&#039;: 3-5V problemlos (evtl. eingeschränkte µC-Auswahl?). Ungeregelter Batteriebetrieb möglich. Einzelne AVR auch bis 1.8V. LV-PICs auch bis 2,2V&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: 3,3V-Versorgung, 5V-kompatibel. Je nach Modell ist eine separate 1,8V-Versorgung für den Core notwendig. Kein ungeregelter Batteriebetrieb möglich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: nur 1.8-3.6V. Nicht 5V-kompatibel, 5V-Peripherie für I2C/RS485/CAN/... ist also nur mit Pegelkonvertierung einsetzbar. Ungeregelter Batteriebetrieb möglich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: 3,3V-Versorgung, 5V-kompatibel.&lt;br /&gt;
&lt;br /&gt;
==Programmierung in der Schaltung==&lt;br /&gt;
&lt;br /&gt;
Geräte mit Debugging-Interface (s.U.) lassen sich i.d.R. auch damit programmieren. Siehe dazu nächsten Abschnitt.&lt;br /&gt;
&lt;br /&gt;
Die meisten Controller können sich selbst programmieren, Bootloader per RS232,CAN,usw sind dann problemlos realisierbar. Nur müssen solche Bootloader erst einmal auf den Chip programmiert werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: Entweder über die serielle ICSP-Schnittstelle (dafür gibt es Baupläne für billige ParPort-Programmer incl. guter Software) oder mit dem InCircuit-Debugger (~150&amp;amp;#8364;, ICD2 von Microchip). Bootloader müssen generell vorher mit einer der vorher genannten Möglichkeiten auf den Chip geflasht werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Verschieden, je nach Hersteller und Modell. Im Unterschied zu den anderen hier betrachtete Controllern existieren viele nicht in der Schaltung, sondern nur mit speziellen Interfaces programmierbare 8051 Modelle. Modelle mit seriellem Bootloader via UART, SPI, CAN oder USB existieren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: Am besten über JTAG, je nach Hersteller und Familie auch mit Bootloader, z.B. bei Philips LPC2000 über RS232 und Atmel SAM7 über USB (bei letzterem sehr unbequem und langsam!).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: Über ein an SPI orientiertes proprietäres Interface. Ist via Parallelport günstig herzustellen; der Adapter ist im besten Fall genau 5 Widerstände teuer, professioneller mit einem [[Ausgangsstufen_Logik-ICs#Tri-state|Tri-State]]-Bustreiber etwa 5-15 EUR. Darüberhinaus auch mit HV-Programmer (z.B. auf dem [[STK500]]), der u.U. auch nötig ist um falsch gesetzte Fuses wieder zu &amp;quot;reparieren&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: Via JTAG-Interface, TI &amp;quot;Spy BiWire&amp;quot; und über integrierten  Bootloader. (Schaltung zur Ansteuerung via RS232 im Datenblatt)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C&#039;&#039;&#039;: Via UART (RS-232 oder USB-RS-232 Konverter) mit Flash-Tool (Windows, Linux). Variante über Bootloader ebenfalls möglich (wird vom Software Emulator-Debugger benutzt).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: Via Debug-Interface.&lt;br /&gt;
&lt;br /&gt;
==Debugging in der Schaltung==&lt;br /&gt;
&lt;br /&gt;
Ist beispielsweise ein günstiges [[JTAG]]-Interface für In-Circuit&lt;br /&gt;
Debugging verfügbar?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Derivate mit JTAG verfügbar. ICEen gebraucht erschwinglich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: alle mit JTAG.&lt;br /&gt;
* Günstiges Parallel-Port-Interface verfügbar und einfach zu bauen (Wiggler), aber langsam und problematisch im Betrieb unter WinNT+ (besser: ocdremote unter Win9x auf Zweitrechner, via LAN). Kostenlose Debugger ([[GDB]]) unterstützen seit OCDremote 2.14 mit Einschränkungen auch Programme im Flash. &lt;br /&gt;
* Schnelles JTAG Interface basierend auf FT2232C für [[GDB]]/OpenOCD günstig und einfach zu bauen (http://www.fh-augsburg.de/~hhoegl/proj/usbjtag/usbjtag.html) oder fertig erhältlich (http://www.amontec.com/jtagkey.shtml).&lt;br /&gt;
* Kommerzielle Debugger per USB sind besser und schneller, aber recht teuer.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: für ATmega16/162/32/128 ist JTAG günstig verfügbar&lt;br /&gt;
(Olimex, Erostech) bzw. einfach zu bauen (Evertool). ATmegas ab 2005/2006 mit JTAG sind zu dieser Billigvariante inkompatibel. Für diese und den [[debugWIRE]] der ATtinys und ATmegaX8 existiert das JTAG ICE mkII von Atmel, aber recht teuer, sowie der preiswerte AVR Dragon.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: alle mit JTAG, Adapter sehr günstig/einfach zu bauen. Neuere Geräte mit Spy-by-Wire (braucht weniger Pins als JTAG).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: Entweder Microchips MPLAB ICD2 (&amp;amp;#8364;150-200) oder ein kompatibler Nachbau, wie z.B. http://www.stolz.de.be/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C&#039;&#039;&#039;: On-Chip Debugging ist mit dem E8 Hardware On-Chip Debugging Emulator möglich (kein JTAG). Ausserdem ist Debugging auch über einen normalen RS232 Anschluss möglich. Der E8 verwendet ein syncrones serielles Protokoll, die RS232 ein asyncrones. Daher ermöglicht der E8 das Debugging bei jeder beliebigen Taktfrequenz, bei RS232 gibt es da Einschränkungen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: Debugging möglich mit &amp;quot;Smart Cable&amp;quot; (kein JTAG), Anschluss über USB oder Seriell&lt;br /&gt;
&lt;br /&gt;
==Starterkits==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Keil MCB900 (http://www.keil.com/mcb900)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: http://www.olimex.com (z.T. hier im Shop erhältlich), http://www.embeddedartists.com,&lt;br /&gt;
http://www.mct.de&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: [[STK200]], [[STK500]], [[AVR_Butterfly]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: http://www.olimex.com (z.T. hier im Shop erhältlich), ez430 (http://www.ti.com/ez430)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: Velleman-Kit K8048 (www.velleman.be)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C&#039;&#039;&#039;: Mehrere (Google Suche). Am weitesten verbreitet ist vielleicht das R8C/13 Starterkit inkl. Entwickler-CD von Glyn/Elektor (Beilage Elektor 12/2005 (ausverkauft) bzw. diverse Drittanbieter). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: Günstig verfügbar [~50&amp;amp;#8364;], teils hier im Shop, komplett inklusive unbeschränktem Compiler und In-System-Debugging. Nachteile: für jede Prozessorklasse ein eigenes Kit; eingelöteter SMD-Chip obwohl viele Typen auch im DIL-Gehäuse existieren.&lt;br /&gt;
&lt;br /&gt;
==Gehäuse==&lt;br /&gt;
&lt;br /&gt;
Mit DIP oder PLCC bastelt es sich leichter als mit *QFP. Die Domäne von&lt;br /&gt;
AVR/PIC/i51. Für MSP430 gibt es günstige fertig bestückte DIP-Adapter hier im Shop (MSP430x2xx gibt es auch in 14-Pin DIP-Gehäuse). Z8e-Chips existieren ebenfalls in DIP, sind aber schlechter verfügbar.&lt;br /&gt;
&lt;br /&gt;
==Beschaltungsaufwand==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR, PIC, 8051, Z8e, MSP430, R8C&#039;&#039;&#039;: gering, i.d.R. sind Versionen mit integriertem Oszillator verfügbar, so dass man praktisch nur die Versorgungsspannung (nebst Abblockkondensator) braucht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: aufwendigere externe Takt- und Spannungserzeugung, manchmal 2 Betriebsspannungen benötigt; Tendenz aber fallend.&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/read-1-185133.html#new Forum]&lt;br /&gt;
* [[8051]]&lt;br /&gt;
* [[AVR]]&lt;br /&gt;
* [[PIC]]&lt;br /&gt;
* [[Z8]]&lt;br /&gt;
* [[ARM]]&lt;br /&gt;
* [[MSP430]]&lt;br /&gt;
* [[R8C]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>134.76.63.190</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Mikrocontroller_Vergleich&amp;diff=35224</id>
		<title>Mikrocontroller Vergleich</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Mikrocontroller_Vergleich&amp;diff=35224"/>
		<updated>2009-03-21T13:23:47Z</updated>

		<summary type="html">&lt;p&gt;134.76.63.190: /* Architektur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein paar Kriterien für den CPU-Core und die µC-Familie.&lt;br /&gt;
&lt;br /&gt;
==Compiler verfügbar, bzw wieviel will man dafür ausgeben?==&lt;br /&gt;
&lt;br /&gt;
Und wie verbreitet ist der Compiler? Finde ich dafür Hilfe, beispielsweise in Form von Support-Foren?&lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;[[ARM]]&#039;&#039;&#039;, &#039;&#039;&#039;[[AVR]]&#039;&#039;&#039; und &#039;&#039;&#039;[[MSP430]]&#039;&#039;&#039; gibt es mit GCC einen guten und kostenlosen Compiler. Bei &#039;&#039;&#039;ARM&#039;&#039;&#039; sind jedoch die Schritte zum fertigen Programm recht komplex und Library/Laufzeitsystem benötigen einige Handarbeit. &lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;ARM&#039;&#039;&#039; gibt es von IAR eine auf 32KB begrenzte kostenlose Version eines umgänglicheren kommerziellen Compilers.&lt;br /&gt;
&lt;br /&gt;
Des Weiteren gibt es für &#039;&#039;&#039;[[MSP430]]&#039;&#039;&#039; eine auf 4KB begrenzte kostenlose Version der Entwicklungsumgebung von IAR und eine auf 8KB begrenzte kostenlose Version der Entwicklungsumgebung Code Composer Essentials (basiert auf Eclipse) von Texas Instruments.&lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;[[PIC]]&#039;&#039;&#039; und &#039;&#039;&#039;[[8051]]&#039;&#039;&#039; kann man entweder den Open-Source-Compiler [http://www.sf.net/projects/sdcc SDCC] verwenden (brauchbar, aber nicht mit GCC vergleichbar) oder diverse Löhnwares, bis 4-stellige Beträge (Keil: 2600&amp;amp;#8364;), teils auch als Demoversion mit Tricks. Auch der offizielle C18-Compiler kann als großzügiges Demo heruntergeladen werden.&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;PIC&#039;&#039;&#039; sind das der PICC Lite von HI-TECH, der nur eine handvoll PIC12 und PIC16 unterstützt, und der CC5X, welcher zwar keine High-End PICs unterstützt, dafür die meisten Mid-Range; einzige Einschränkung der freien Version des CC5X ist die Limitierung auf 1024 Instruktionen pro Modul, nicht so gute Codeoptimierung und die Begrenzung von Variablen auf 16-Bit. Ein Vergleich aller C-Compiler für PIC findet sich hier: http://www.informel.de/pic/ccompiler.htm&lt;br /&gt;
&lt;br /&gt;
Für die &#039;&#039;&#039;[[PIC24]]&#039;&#039;&#039; und &#039;&#039;&#039;[[dsPIC]]&#039;&#039;&#039; gibt es den C30 von Microchip. Er basiert auf gcc und ist frei erhältlich, wobei nach 6 Wochen nicht mehr alle Optimierungsstufen wählbar sind, dann maximal -O1. Wie für alle PIC ist mit dem MPLAB eine kostenlose IDE mit Debugger und Simulator verfügbar.&lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;[[R8C]]/M16C&#039;&#039;&#039; gibt es eine Demoversion des Herstellers und eine noch ziemlich frische (lies: Stand 2005 nicht ausgereifte) Version vom GCC.&lt;br /&gt;
&lt;br /&gt;
Zilog stellt für &#039;&#039;&#039;[[Z8]]e&#039;&#039;&#039; eine unbeschränkte IDE mit C-Compiler, Debugger und Simulator kostenlos per Download zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pascal&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Für PIC,DSPIC und AVR gibt es einen sehr guten PASCAL-Compiler &amp;quot;MikroPascal&amp;quot;&lt;br /&gt;
der, in der Downloadversion Code-Size begrenzt ist,&lt;br /&gt;
und den man zu moderaten Preisen zur &amp;quot;Vollversion&amp;quot; aufrüsten kann.&lt;br /&gt;
http://www.mikroelektronika.co.yu/&lt;br /&gt;
( ab 149,- &amp;amp;#8364; )&lt;br /&gt;
&lt;br /&gt;
Elektor-Verlag &#039;Pascal für 8051 und Derivate&#039; Buch+Compiler(Vollversion)&lt;br /&gt;
&lt;br /&gt;
AVRco Pascal Compiler (http://www.e-lab.de/), &lt;br /&gt;
Kostenlose Version für Mega8/88&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BASIC:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sowohl für den AVR als auch für die 8051er gibts von MCS-Electronics eine Demoversion eines BASIC-Compilers,&lt;br /&gt;
der leicht im Funktionsumfang und Codegröße eingeschränkt ist. &lt;br /&gt;
[http://www.mcselec.com/]&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus kursieren im Netz Versionen eines BASIC-Interpreters für 8052er mit dem Namen &amp;quot;8052 AH-BASIC&amp;quot;. Dieser Interpreter unterstüzt sogar Fließkommarithmetik und soll als Freeware verfügbar sein.&lt;br /&gt;
&lt;br /&gt;
==Architektur==&lt;br /&gt;
&lt;br /&gt;
Betrifft vor allem Assembler-Programmierung und die Frage, wie einfach oder umständlich sich C-Code in Maschinensprache übersetzen lässt. &lt;br /&gt;
&lt;br /&gt;
Dass für alle Architekturen teils mehrere C-Compiler existieren, hat wenig mit Eignung und viel mit Markt zu tun. Zudem ist meist nur entscheidend, ob ein Controller die Anforderungen erfüllt, nicht jedoch wie gut er das tut.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Manches davon ist durchaus subjektiv. Bei abweichender Meinung bitte als Diskussion starten, nicht einfach löschen.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Typische Akkumulator-orientierte 8-Bit Architektur. Eine gewisse Komplexität entstand durch die sukzessive Erweiterung auf mehr RAM als ursprünglich vorgesehen war, mit etlichen unterschiedlich adressierten RAM-Bereichen als Folge. Für C-Compiler nur eingeschränkt geeignet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: 32bit RISC-Architektur. In den gängigen Implementierungen mit dem  ARM7TDMI-Core (Architektur V4 = ARMv4T) stehen 2 Befehlssätze zur Verfügung: 32bit-codiert für Tempo, sofern der Speicherdurchsatz das zulässt, und 16bit-codiert (Thumb) für kompakte Programme. Cortex M3 (ARMv7) kennt ausschliesslich 16bit codierte Befehle. Einheitlicher 32bit-Adressraum. Exzellente Zielmaschine für C-Compiler.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: Register-orientierte, an RISC Prinzipien angelehnte 8-Bit Architektur. Getrennte Adressräume für RAM und ROM. Registersatz nicht einheitlich nutzbar. I/O-Bereich nicht einheitlich adressierbar. Nur ein Teil des I/O-Bereiches ist bitweise manipulierbar. Einheitliche RAM-Adressierung. Für C-Compiler geeignet.Bemerkung: Laut Wikipedia wurde der Controller während der Entwicklungsphase für den Einsatz von C-Compilern optimiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: Register-orientierte 16-Bit RISC-Architektur mit vollständiger Orthogonalität. Einheitlicher Adressraum für RAM und ROM. Exzellente Zielmaschine für C-Compiler. Angelehnt an die legendäre PDP-11, vieles wurde übernommen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: Akkumulator-orientierte 8-Bit Architektur. Getrennte Adressräume für RAM und ROM. RAM-Banking, ROM-banking. Umständlicher Zugriff auf Daten im ROM (nur 12/14-Bit Versionen). Viele für C-Compiler wesentliche Elemente sind nur umständlich realisierbar (z.B. Code/Datenadressierung mit Banking, Vergleich mit Vorzeichen).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC24&#039;&#039;&#039;: Register-orientierte 16-Bit Architektur mit getrennten Adressräumen für RAM und ROM, wobei ein Teil des ROM in den RAM-Adressbereich eingeblendet werden kann. Fast alle Befehle sind auf Register und RAM anwendbar, incl. Bitmanipulationen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;dsPIC&#039;&#039;&#039;: wie &#039;&#039;&#039;PIC24&#039;&#039;&#039;, mit zusätzlichen DSP Befehlen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C&#039;&#039;&#039;: 16-Bit 2-Adress CISC-Architektur. Einheitlicher 64KB Adressraum für RAM und ROM. Gute Zielmaschine für C-Compiler.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;M16C&#039;&#039;&#039;: Unter Bezeichnung M16C existieren sich zwei verschiedene inkompatible Architekturen. Die Modelle bis /6x sind grundsätzlich identisch mit R8C, die /8x Modelle mit M32C (hier nicht näher betrachtet). Der 64KB RAM-I/O-Adressraum ist ein Teil des 1MB großen Gesamtadressraumes, Daten im ROM liegen jedoch ausserhalb dieser 64KB und sind daher anders als beim R8C nicht mit 16-Bit Zeigern adressierbar. Gute Zielmaschine für spezialisierte C-Compiler, GCC jedoch tut sich etwas schwer mit den Adressräumen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: Register-orientierte 8-Bit Architektur, 2-Adress-CISC. Getrennte Adressräume für RAM und ROM. Historisch bedingt 3 RAM-Adressräume (8-Bit, 12-Bit, 16-Bit). Für C-Compiler geeignet&lt;br /&gt;
&lt;br /&gt;
Kleiner nicht repräsentativer Compiler-Vergleich. Verwendet wurde eine Variante des crc8-Code von Colin O&#039;Flynn. Jeweils kleinstes Speichermodell, auf Platz optimiert:&lt;br /&gt;
{|&lt;br /&gt;
|Compiler&lt;br /&gt;
|  Befehle(1)&lt;br /&gt;
|  Bytes(1)&lt;br /&gt;
|  Befehle(2)&lt;br /&gt;
|  Bytes(2)&lt;br /&gt;
|-&lt;br /&gt;
|GCC AVR&lt;br /&gt;
|24&lt;br /&gt;
|48&lt;br /&gt;
|24&lt;br /&gt;
|48&lt;br /&gt;
|-&lt;br /&gt;
|Keil 8051&lt;br /&gt;
|24&lt;br /&gt;
|38&lt;br /&gt;
|74&lt;br /&gt;
|109&lt;br /&gt;
|-&lt;br /&gt;
|SDCC 8051&lt;br /&gt;
|24&lt;br /&gt;
|40&lt;br /&gt;
|35&lt;br /&gt;
|54&lt;br /&gt;
|-&lt;br /&gt;
|Zilog Z8e&lt;br /&gt;
|21&lt;br /&gt;
|54&lt;br /&gt;
|27&lt;br /&gt;
|73&lt;br /&gt;
|-&lt;br /&gt;
|PIC C18&lt;br /&gt;
|26&lt;br /&gt;
|52&lt;br /&gt;
|95&lt;br /&gt;
|206&lt;br /&gt;
|-&lt;br /&gt;
|SDCC PIC18&lt;br /&gt;
|41&lt;br /&gt;
|112&lt;br /&gt;
|41&lt;br /&gt;
|112&lt;br /&gt;
|-&lt;br /&gt;
|SDCC PIC16&lt;br /&gt;
|26&lt;br /&gt;
|52&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| (for pic16f84)&lt;br /&gt;
|-&lt;br /&gt;
|HEW R8C/M16C&lt;br /&gt;
|20&lt;br /&gt;
|48&lt;br /&gt;
|20&lt;br /&gt;
|48&lt;br /&gt;
|-&lt;br /&gt;
|GCC 68HC11&lt;br /&gt;
|36&lt;br /&gt;
|65&lt;br /&gt;
|36&lt;br /&gt;
|65&lt;br /&gt;
|-&lt;br /&gt;
|GCC MSP430&lt;br /&gt;
|17&lt;br /&gt;
|40&lt;br /&gt;
|17&lt;br /&gt;
|40&lt;br /&gt;
|-&lt;br /&gt;
|GCC ARM7&lt;br /&gt;
|12&lt;br /&gt;
|48&lt;br /&gt;
|12&lt;br /&gt;
|48&lt;br /&gt;
|-&lt;br /&gt;
|GCC ARM7-Thumb&lt;br /&gt;
|20&lt;br /&gt;
|40&lt;br /&gt;
|20&lt;br /&gt;
|40&lt;br /&gt;
|}&lt;br /&gt;
(1): Lokale Daten ggf. statisch gespeichert, nicht reentrant.&lt;br /&gt;
&lt;br /&gt;
(2): Lokale Daten auf dem Stack, also reentrant.&lt;br /&gt;
&lt;br /&gt;
==Sind CPU-spezifische Erweiterungen in C erforderlich?==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: &lt;br /&gt;
* 5-6 Speicherklassen für Datenspeicher (direkt, indirekt, 8-Bit &amp;quot;external&amp;quot;, 16-Bit &amp;quot;external&amp;quot;, Flash, evtl. noch Einzelbits). &lt;br /&gt;
*Außerdem noch Adresserweiterungen durch Mapping, Paging und Banking &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: &lt;br /&gt;
* 2 Speicherklassen für Datenspeicher (RAM, ROM).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;R8C&#039;&#039;&#039;: nein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: &lt;br /&gt;
* 3 Speicherklassen für Datenspeicher (shared RAM, banked RAM, ROM).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;:&lt;br /&gt;
* Für atomic execution (s.u.) notwendig, aber nicht existent.&lt;br /&gt;
* 4 Speicherklassen für Datenspeicher (256B, 4KB, 64KB, Flash).&lt;br /&gt;
&lt;br /&gt;
==Sind Daten in RAM und ROM mit dem gleichen Code benutzbar?==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;, &#039;&#039;&#039;AVR&#039;&#039;&#039;, &#039;&#039;&#039;PIC&#039;&#039;&#039;, &#039;&#039;&#039;Z8e&#039;&#039;&#039; wie generell alle [[Harvard-Architektur|Harvard-Architekturen]]: NEIN. Daten im ROM&lt;br /&gt;
erfordern anderen Zugriff als Daten im RAM. Entweder versteckt das der Compiler in Runtime-Routinen für Pointerzugriffe, oder man kann Routinen nicht so schreiben, dass sie beides als Parameter verdauen können. Bei kleinen Programmen von ein paar KB kein Problem, bei größeren jedoch schon. Bei AVR/GCC ziemlich fehlerträchtig.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;M16C&#039;&#039;&#039;: Hängt vom Compiler ab. Mit 16-Bit Zeigern (GCC) nicht, 20-Bit Zeiger sind ineffizient.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;R8C&#039;&#039;&#039;: [[von Neumann-Architektur]], problemlos.&lt;br /&gt;
&lt;br /&gt;
==Lineare Adressierung vom RAM?==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;, &#039;&#039;&#039;ARM&#039;&#039;&#039;, &#039;&#039;&#039;AVR&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;R8C/M16C&#039;&#039;&#039;, &#039;&#039;&#039;Z8e&#039;&#039;&#039;: kein Problem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: PIC18 ja, PIC16,PIC12,PIC10 nein. RAM-Puffer die größer sind als das RAM in einer Bank sind nur mit Klimmzügen möglich.&lt;br /&gt;
&lt;br /&gt;
==Skalierbarkeit==&lt;br /&gt;
&lt;br /&gt;
Vor allem für jene wichtig, die sich scheuen, für&lt;br /&gt;
verschiedene Aufgaben verschiedene Lösungen zu verwenden. &lt;br /&gt;
&lt;br /&gt;
Spezielle Versionen für LCD-Ansteuerung wurden in dieser Übersicht nicht berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: 8-Pin/1KB aufwärts, überwiegend 40/44-Pin und 64/68-Pin. Architekturbedingte Grenze bei 64KB Code, 64KB RAM - Versionen mit mehr Flash  nutzbar via Banking (Compiler-Support vorhanden) existieren, Versionen mit bis zu 100 MHz Taktfrequenz verfügbar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: 48-Pin/32KB, bis 512K mit internem Flash. Versionen mit internem Cache und externem Speicher sind praktisch beliebig weit ausbaufähig.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: 8-Pin/1KB bis 64-Pin/128KB, 100-Pin/256KB in Vorbereitung. Architekturbedingte  Grenze bei 8MB Code, 64KB RAM. GCC/WinAVR derzeit nur bis 128KB Code möglich (in Arbeit).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: 14-Pin DIP/1KB bis 113-Pin BGA/256KB. DIP, SOIC, TSSOP, QFN, TQFP und BGA erhältlich, in DIP und BGA jedoch nur wenige Typen verfügbar. Architekturbedingte Grenze von 64KB für Code+Daten wird in den großen Versionen durch 20-bittige Adressen umschifft. Taktfrequenz: maximal 8, 16 und 18 MHz je nach Familie. 25 MHz-Versionen in Kürze. Stromaufnahme: Rund 2 uA im LPM3 (real time clock mode) bis ca. 5 mA, typisch 200 µA pro MHz.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: 6-Pin/512B aufwärts. Im Prinzip großer Bereich, aber innerhalb der Familie deutlich verschiedene inkompatible Architekturen mit unterschiedlichen architekturbedingen Grenzen und unterschiedlichem Compiler-Support.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;eZ8&#039;&#039;&#039;: Bis 64KB Flash. Architekturbedingte Grenze bei 64KB Code, 64KB RAM.&lt;br /&gt;
&lt;br /&gt;
Empfehlung hier: Auch wenn teilweise mehr möglich ist, sind 8/16-Bit-Controller nur bis maximal 40-60K empfehlenswert. Darüber sollte eine 32-Bit-Architektur — z.B. mit [[ARM]]-Core — in Betracht gezogen werden. Insbesondere auch, weil große Programme zu Programm- und Datenstrukturen neigen, die sich auf 8-Bit-Prozessoren schlecht abbilden lassen.&lt;br /&gt;
&lt;br /&gt;
==Interrupt-feste Programmierung von I/O-Ports==&lt;br /&gt;
&lt;br /&gt;
Siehe http://www.mikrocontroller.net/articles/Interrupt.&lt;br /&gt;
&lt;br /&gt;
Das ist besonders bei &#039;&#039;&#039;AVR&#039;&#039;&#039; (ausser den Typen seit 2004: ATtiny2313 usw.) ein Problem. Architekturbedingt ist nur ein Teil der Ports bitweise schaltbar, kein Port kann mehrere Bits gleichzeitig interrupt-fest schalten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;, &#039;&#039;&#039;8051&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;R8C/M16C&#039;&#039;&#039;, &#039;&#039;&#039;Z8e&#039;&#039;&#039; können AND/OR/XOR zum Port hin, daher ist bei geeigneter Programmierung das Problem auch ohne Abschalten der Interrupts vermeidbar.&lt;br /&gt;
&lt;br /&gt;
Zu &#039;&#039;&#039;ARM&#039;&#039;&#039; ist dazu keine allgemeine Aussage möglich. Je nach Implementierung wird das Problem teilweise durch entsprechend gestaltete I/O-Ports gelöst, in anderen Fällen ist erhebliche Wachsamkeit geboten. Atmel SAM7 bereitet hier weniger Probleme als Philips LPC2000. Bei den  LPC2000 gibt es zwei getrennte Register, eines zum Setzen, das andere zum Löschen einzelner Pins. In einem weiteren Register können Bits ausmaskiert werden. Es gibt also kein read-modify-write. Gut gelöst für Push/Pull-Ausgänge, aber eine äquivalente Steuerung der Richtung wurde vergessen, was Open-Drain Pins erschwert. Implementierungen auf Basis des Cortex M3 oder der ARM Port-Macrocell verwenden statt dessen Adressbits zur Maskierung.&lt;br /&gt;
&lt;br /&gt;
Besonders pfiffig ist das beim &#039;&#039;&#039;Z8e&#039;&#039;&#039; gelöst. Ein Befehl fasst die nächsten 3 Befehle zu einer nicht unterbrechbaren Einheit zusammen (atomic execution). Allerdings wird das vom Zilog Compiler nicht unterstützt.&lt;br /&gt;
&lt;br /&gt;
==Zugriff auf I/O-Ports==&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;8051&#039;&#039;&#039; verfügt weder über eigene Register für die Steuerung der Richtung der I/O-Ports, noch über die Möglichkeit, lesend auf den Sollzustand der Ausgänge zuzugreifen. In Assembler ist das kein Problem, da abhängig vom Befehl entweder vom Zustand der Pins (Leseoperationen) oder vom Sollzustand der Ausgänge (kombinierte Lese/Schreiboperationen) ausgegangen wird. Ein korrekt arbeitender C Compiler kann damit jedoch nicht umgehen, weshalb für die Steuerung von Port-Pins spezielle Zugriffsfunktionen und eine sehr genaue Kenntnis der Arbeitsweise der Ports erforderlich sind.&lt;br /&gt;
&lt;br /&gt;
Anmerkung zum Keil 8051-Compiler: Port-Zugriff erfolgt über Pseudo-Variablen wie bei µC üblich. Infolgedessen ist in C Code nicht ersichtlich, ob beispielsweise die Port-Variable P1 für den Zustand der Pins oder den Sollzustand der Ausgänge steht. Nur der erzeugte Assembler-Code kann hier Klarheit schaffen. So haben die beiden prinzipiell identischen Zeilen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 = P1 | 0x01;&lt;br /&gt;
P1 = (P1 | 0x01) &amp;amp; ~0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
völlig unterschiedliche Auswirkung auf den Port. Der Code der ersten Zeile setzt Bit 0 und lässt alle anderen Bits unverändert. Der von der zweiten Zeile erzeugte Code setzt zusätzlich auch alle vorher als Eingang definierten Pins im Zustand 0 auf Ausgang mit Zustand 0. Das ist weder hilfreich, noch mit der Sprachdefinition von C vereinbar.&lt;br /&gt;
&lt;br /&gt;
Auch manche Modelle der &#039;&#039;&#039;PIC&#039;&#039;&#039;-Familie können nur auf den Zustand der Pins zugreifen, nicht auf den Sollzustand der Ausgänge.&lt;br /&gt;
&lt;br /&gt;
In beiden Fällen ist folglich bei Ports, die sowohl für Aus- als auch für Eingänge benutzt werden, besondere Sorgfalt nötig.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;, &#039;&#039;&#039;AVR&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;Z8e&#039;&#039;&#039; und neuere Modelle der &#039;&#039;&#039;PIC&#039;&#039;&#039;-Familie besitzen diese Probleme nicht.&lt;br /&gt;
&lt;br /&gt;
==Priorisierte Interrupts==&lt;br /&gt;
&lt;br /&gt;
Unter priorisierten Interrupts versteht man die Fähigkeit, den einzelnen Interrupt-Quellen eine Priorität zuweisen zu können um ohne Reprogrammierung der Interrupt-Quellen einen laufenden Interrupt ausschliesslich durch Interrupts höherer Priorität unterbrechbar machen zu können. Die einfache und selbstverständliche Fähigkeit, anstehende Interrupts nach fester Priorität zu sortieren, ist damit nicht gemeint.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Ja.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: Der ARM-Core unterstützt 2 Prioritäten mit entsprechenden Vektoren. Oft ist jedoch ein separater priorisierter und vektorisierter Interrupt-Controller mit integriert (Atmel, NXP, Cortex ja, Analog Devices nein). Interrupt-Nesting ist dank eines Designfehlers etwas umständlich, repariert in ARMv7 (Cortex M3).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR:&#039;&#039;&#039; Nein, aber separate Vektoren. Beim Sprung in die Interruptroutine wird implizit ein CLI ausgeführt, beim Rücksprung ein SEI. Ein &amp;quot;unwichtiger Interrupt&amp;quot; blockiert also evtl. einen &amp;quot;wichtigen&amp;quot;. Wenn aber ein Interrupt in der Interruptroutine ausgelöst wird, wird er später der internen Priorität nach ausgeführt. Immerhin haben Interruptquellen im Gegensatz zum PIC ihre eigenen Interruptvektoren, so dass keine Zeit mit der Suche nach der Quelle verbracht wird.&lt;br /&gt;
Um trotzdem für eine von mehreren Interruptquellen eine Reaktionszeiten im unteren Mikrosekundenbereich zu garantieren, hilft nur ein Trick: die weniger wichtigen Interruptroutinen tun nichts als eine Programmadresse auf den Stack zu PUSHen. Das RETI springt also zu dieser Adresse mit der eigentlichen Interruptbehandlung, das RET am Ende der Routine springt zur ursprünglichen Unterbruchstelle zurück; der zeitkritische Interrupt kann damit die andere Interruptbehandlung unterbrechen. &#039;&#039;Achtung: es muss gewährleistet sein, dass auch im worst case ein Interrupt sich nicht selbst unterbricht!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Anmerkung: Eine (unwichtige) Interruptroutine kann sofort nach Ansprung ein SEI ausführen, damit eine (unwichtige) Interruptroutine jederzeit von einer anderen (wichtigeren) Interruptroutine unterbrochen werden kann. Das kann pro Interruptvektor individuell entschieden werden. Dies ist jedoch nicht bei allen Interrupt-Quellen möglich (beispielsweise nicht beim TWI).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430:&#039;&#039;&#039; Ja, 16 vollpriorisierte Vektoren, davon 14 global maskierbar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC12 &amp;amp; PIC16:&#039;&#039;&#039; Nein, nur ein Interruptvektor.  Einfache PIC12 (12F508/509, 16F505) kennen gar keine Interrupts.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC18:&#039;&#039;&#039; Jeder Interruptquelle kann separat eine niedrige oder hohe Priorität zugewiesen werden, die dann auf zwei Interruptvektoren verzweigen. Welche Quelle den Interrupt ausgelöst hat, muss aber immer noch händisch festgestellt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC17:&#039;&#039;&#039; Vier Interruptvektoren mit unterschiedlicher Priorität. Scheint es allerdings nur als OTP zu geben, deswegen wohl eher uninteressant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C/M16C&#039;&#039;&#039;: 7 Prioritäten, vektorisiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: 3 Prioritäten, vektorisiert.&lt;br /&gt;
&lt;br /&gt;
== Spannungsversorgung ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;, &#039;&#039;&#039;AVR&#039;&#039;&#039;, &#039;&#039;&#039;PIC&#039;&#039;&#039;: 3-5V problemlos (evtl. eingeschränkte µC-Auswahl?). Ungeregelter Batteriebetrieb möglich. Einzelne AVR auch bis 1.8V. LV-PICs auch bis 2,2V&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: 3,3V-Versorgung, 5V-kompatibel. Je nach Modell ist eine separate 1,8V-Versorgung für den Core notwendig. Kein ungeregelter Batteriebetrieb möglich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: nur 1.8-3.6V. Nicht 5V-kompatibel, 5V-Peripherie für I2C/RS485/CAN/... ist also nur mit Pegelkonvertierung einsetzbar. Ungeregelter Batteriebetrieb möglich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: 3,3V-Versorgung, 5V-kompatibel.&lt;br /&gt;
&lt;br /&gt;
==Programmierung in der Schaltung==&lt;br /&gt;
&lt;br /&gt;
Geräte mit Debugging-Interface (s.U.) lassen sich i.d.R. auch damit programmieren. Siehe dazu nächsten Abschnitt.&lt;br /&gt;
&lt;br /&gt;
Die meisten Controller können sich selbst programmieren, Bootloader per RS232,CAN,usw sind dann problemlos realisierbar. Nur müssen solche Bootloader erst einmal auf den Chip programmiert werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: Entweder über die serielle ICSP-Schnittstelle (dafür gibt es Baupläne für billige ParPort-Programmer incl. guter Software) oder mit dem InCircuit-Debugger (~150&amp;amp;#8364;, ICD2 von Microchip). Bootloader müssen generell vorher mit einer der vorher genannten Möglichkeiten auf den Chip geflasht werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Verschieden, je nach Hersteller und Modell. Im Unterschied zu den anderen hier betrachtete Controllern existieren viele nicht in der Schaltung, sondern nur mit speziellen Interfaces programmierbare 8051 Modelle. Modelle mit seriellem Bootloader via UART, SPI, CAN oder USB existieren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: Am besten über JTAG, je nach Hersteller und Familie auch mit Bootloader, z.B. bei Philips LPC2000 über RS232 und Atmel SAM7 über USB (bei letzterem sehr unbequem und langsam!).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: Über ein an SPI orientiertes proprietäres Interface. Ist via Parallelport günstig herzustellen; der Adapter ist im besten Fall genau 5 Widerstände teuer, professioneller mit einem [[Ausgangsstufen_Logik-ICs#Tri-state|Tri-State]]-Bustreiber etwa 5-15 EUR. Darüberhinaus auch mit HV-Programmer (z.B. auf dem [[STK500]]), der u.U. auch nötig ist um falsch gesetzte Fuses wieder zu &amp;quot;reparieren&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: Via JTAG-Interface, TI &amp;quot;Spy BiWire&amp;quot; und über integrierten  Bootloader. (Schaltung zur Ansteuerung via RS232 im Datenblatt)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C&#039;&#039;&#039;: Via UART (RS-232 oder USB-RS-232 Konverter) mit Flash-Tool (Windows, Linux). Variante über Bootloader ebenfalls möglich (wird vom Software Emulator-Debugger benutzt).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: Via Debug-Interface.&lt;br /&gt;
&lt;br /&gt;
==Debugging in der Schaltung==&lt;br /&gt;
&lt;br /&gt;
Ist beispielsweise ein günstiges [[JTAG]]-Interface für In-Circuit&lt;br /&gt;
Debugging verfügbar?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Derivate mit JTAG verfügbar. ICEen gebraucht erschwinglich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: alle mit JTAG.&lt;br /&gt;
* Günstiges Parallel-Port-Interface verfügbar und einfach zu bauen (Wiggler), aber langsam und problematisch im Betrieb unter WinNT+ (besser: ocdremote unter Win9x auf Zweitrechner, via LAN). Kostenlose Debugger ([[GDB]]) unterstützen seit OCDremote 2.14 mit Einschränkungen auch Programme im Flash. &lt;br /&gt;
* Schnelles JTAG Interface basierend auf FT2232C für [[GDB]]/OpenOCD günstig und einfach zu bauen (http://www.fh-augsburg.de/~hhoegl/proj/usbjtag/usbjtag.html) oder fertig erhältlich (http://www.amontec.com/jtagkey.shtml).&lt;br /&gt;
* Kommerzielle Debugger per USB sind besser und schneller, aber recht teuer.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: für ATmega16/162/32/128 ist JTAG günstig verfügbar&lt;br /&gt;
(Olimex, Erostech) bzw. einfach zu bauen (Evertool). ATmegas ab 2005/2006 mit JTAG sind zu dieser Billigvariante inkompatibel. Für diese und den [[debugWIRE]] der ATtinys und ATmegaX8 existiert das JTAG ICE mkII von Atmel, aber recht teuer, sowie der preiswerte AVR Dragon.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: alle mit JTAG, Adapter sehr günstig/einfach zu bauen. Neuere Geräte mit Spy-by-Wire (braucht weniger Pins als JTAG).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: Entweder Microchips MPLAB ICD2 (&amp;amp;#8364;150-200) oder ein kompatibler Nachbau, wie z.B. http://www.stolz.de.be/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C&#039;&#039;&#039;: On-Chip Debugging ist mit dem E8 Hardware On-Chip Debugging Emulator möglich (kein JTAG). Ausserdem ist Debugging auch über einen normalen RS232 Anschluss möglich. Der E8 verwendet ein syncrones serielles Protokoll, die RS232 ein asyncrones. Daher ermöglicht der E8 das Debugging bei jeder beliebigen Taktfrequenz, bei RS232 gibt es da Einschränkungen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: Debugging möglich mit &amp;quot;Smart Cable&amp;quot; (kein JTAG), Anschluss über USB oder Seriell&lt;br /&gt;
&lt;br /&gt;
==Starterkits==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Keil MCB900 (http://www.keil.com/mcb900)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: http://www.olimex.com (z.T. hier im Shop erhältlich), http://www.embeddedartists.com,&lt;br /&gt;
http://www.mct.de&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: [[STK200]], [[STK500]], [[AVR_Butterfly]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: http://www.olimex.com (z.T. hier im Shop erhältlich), ez430 (http://www.ti.com/ez430)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: Velleman-Kit K8048 (www.velleman.be)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C&#039;&#039;&#039;: Mehrere (Google Suche). Am weitesten verbreitet ist vielleicht das R8C/13 Starterkit inkl. Entwickler-CD von Glyn/Elektor (Beilage Elektor 12/2005 (ausverkauft) bzw. diverse Drittanbieter). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: Günstig verfügbar [~50&amp;amp;#8364;], teils hier im Shop, komplett inklusive unbeschränktem Compiler und In-System-Debugging. Nachteile: für jede Prozessorklasse ein eigenes Kit; eingelöteter SMD-Chip obwohl viele Typen auch im DIL-Gehäuse existieren.&lt;br /&gt;
&lt;br /&gt;
==Gehäuse==&lt;br /&gt;
&lt;br /&gt;
Mit DIP oder PLCC bastelt es sich leichter als mit *QFP. Die Domäne von&lt;br /&gt;
AVR/PIC/i51. Für MSP430 gibt es günstige fertig bestückte DIP-Adapter hier im Shop (MSP430x2xx gibt es auch in 14-Pin DIP-Gehäuse). Z8e-Chips existieren ebenfalls in DIP, sind aber schlechter verfügbar.&lt;br /&gt;
&lt;br /&gt;
==Beschaltungsaufwand==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR, PIC, 8051, Z8e, MSP430, R8C&#039;&#039;&#039;: gering, i.d.R. sind Versionen mit integriertem Oszillator verfügbar, so dass man praktisch nur die Versorgungsspannung (nebst Abblockkondensator) braucht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: aufwendigere externe Takt- und Spannungserzeugung, manchmal 2 Betriebsspannungen benötigt; Tendenz aber fallend.&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/read-1-185133.html#new Forum]&lt;br /&gt;
* [[8051]]&lt;br /&gt;
* [[AVR]]&lt;br /&gt;
* [[PIC]]&lt;br /&gt;
* [[Z8]]&lt;br /&gt;
* [[ARM]]&lt;br /&gt;
* [[MSP430]]&lt;br /&gt;
* [[R8C]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>134.76.63.190</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Mikrocontroller_Vergleich&amp;diff=35223</id>
		<title>Mikrocontroller Vergleich</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Mikrocontroller_Vergleich&amp;diff=35223"/>
		<updated>2009-03-21T13:12:56Z</updated>

		<summary type="html">&lt;p&gt;134.76.63.190: /* Compiler verfügbar, bzw wieviel will man dafür ausgeben? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein paar Kriterien für den CPU-Core und die µC-Familie.&lt;br /&gt;
&lt;br /&gt;
==Compiler verfügbar, bzw wieviel will man dafür ausgeben?==&lt;br /&gt;
&lt;br /&gt;
Und wie verbreitet ist der Compiler? Finde ich dafür Hilfe, beispielsweise in Form von Support-Foren?&lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;[[ARM]]&#039;&#039;&#039;, &#039;&#039;&#039;[[AVR]]&#039;&#039;&#039; und &#039;&#039;&#039;[[MSP430]]&#039;&#039;&#039; gibt es mit GCC einen guten und kostenlosen Compiler. Bei &#039;&#039;&#039;ARM&#039;&#039;&#039; sind jedoch die Schritte zum fertigen Programm recht komplex und Library/Laufzeitsystem benötigen einige Handarbeit. &lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;ARM&#039;&#039;&#039; gibt es von IAR eine auf 32KB begrenzte kostenlose Version eines umgänglicheren kommerziellen Compilers.&lt;br /&gt;
&lt;br /&gt;
Des Weiteren gibt es für &#039;&#039;&#039;[[MSP430]]&#039;&#039;&#039; eine auf 4KB begrenzte kostenlose Version der Entwicklungsumgebung von IAR und eine auf 8KB begrenzte kostenlose Version der Entwicklungsumgebung Code Composer Essentials (basiert auf Eclipse) von Texas Instruments.&lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;[[PIC]]&#039;&#039;&#039; und &#039;&#039;&#039;[[8051]]&#039;&#039;&#039; kann man entweder den Open-Source-Compiler [http://www.sf.net/projects/sdcc SDCC] verwenden (brauchbar, aber nicht mit GCC vergleichbar) oder diverse Löhnwares, bis 4-stellige Beträge (Keil: 2600&amp;amp;#8364;), teils auch als Demoversion mit Tricks. Auch der offizielle C18-Compiler kann als großzügiges Demo heruntergeladen werden.&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;PIC&#039;&#039;&#039; sind das der PICC Lite von HI-TECH, der nur eine handvoll PIC12 und PIC16 unterstützt, und der CC5X, welcher zwar keine High-End PICs unterstützt, dafür die meisten Mid-Range; einzige Einschränkung der freien Version des CC5X ist die Limitierung auf 1024 Instruktionen pro Modul, nicht so gute Codeoptimierung und die Begrenzung von Variablen auf 16-Bit. Ein Vergleich aller C-Compiler für PIC findet sich hier: http://www.informel.de/pic/ccompiler.htm&lt;br /&gt;
&lt;br /&gt;
Für die &#039;&#039;&#039;[[PIC24]]&#039;&#039;&#039; und &#039;&#039;&#039;[[dsPIC]]&#039;&#039;&#039; gibt es den C30 von Microchip. Er basiert auf gcc und ist frei erhältlich, wobei nach 6 Wochen nicht mehr alle Optimierungsstufen wählbar sind, dann maximal -O1. Wie für alle PIC ist mit dem MPLAB eine kostenlose IDE mit Debugger und Simulator verfügbar.&lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;[[R8C]]/M16C&#039;&#039;&#039; gibt es eine Demoversion des Herstellers und eine noch ziemlich frische (lies: Stand 2005 nicht ausgereifte) Version vom GCC.&lt;br /&gt;
&lt;br /&gt;
Zilog stellt für &#039;&#039;&#039;[[Z8]]e&#039;&#039;&#039; eine unbeschränkte IDE mit C-Compiler, Debugger und Simulator kostenlos per Download zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pascal&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Für PIC,DSPIC und AVR gibt es einen sehr guten PASCAL-Compiler &amp;quot;MikroPascal&amp;quot;&lt;br /&gt;
der, in der Downloadversion Code-Size begrenzt ist,&lt;br /&gt;
und den man zu moderaten Preisen zur &amp;quot;Vollversion&amp;quot; aufrüsten kann.&lt;br /&gt;
http://www.mikroelektronika.co.yu/&lt;br /&gt;
( ab 149,- &amp;amp;#8364; )&lt;br /&gt;
&lt;br /&gt;
Elektor-Verlag &#039;Pascal für 8051 und Derivate&#039; Buch+Compiler(Vollversion)&lt;br /&gt;
&lt;br /&gt;
AVRco Pascal Compiler (http://www.e-lab.de/), &lt;br /&gt;
Kostenlose Version für Mega8/88&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BASIC:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sowohl für den AVR als auch für die 8051er gibts von MCS-Electronics eine Demoversion eines BASIC-Compilers,&lt;br /&gt;
der leicht im Funktionsumfang und Codegröße eingeschränkt ist. &lt;br /&gt;
[http://www.mcselec.com/]&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus kursieren im Netz Versionen eines BASIC-Interpreters für 8052er mit dem Namen &amp;quot;8052 AH-BASIC&amp;quot;. Dieser Interpreter unterstüzt sogar Fließkommarithmetik und soll als Freeware verfügbar sein.&lt;br /&gt;
&lt;br /&gt;
==Architektur==&lt;br /&gt;
&lt;br /&gt;
Betrifft vor allem Assembler-Programmierung und die Frage, wie einfach oder umständlich sich C-Code in Maschinensprache übersetzen lässt. &lt;br /&gt;
&lt;br /&gt;
Dass für alle Architekturen teils mehrere C-Compiler existieren, hat wenig mit Eignung und viel mit Markt zu tun. Zudem ist meist nur entscheidend, ob ein Controller die Anforderungen erfüllt, nicht jedoch wie gut er das tut.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Manches davon ist durchaus subjektiv. Bei abweichender Meinung bitte als Diskussion starten, nicht einfach löschen.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Typische Akkumulator-orientierte 8-Bit Architektur. Eine gewisse Komplexität entstand durch die sukzessive Erweiterung auf mehr RAM als ursprünglich vorgesehen war, mit etlichen unterschiedlich adressierten RAM-Bereichen als Folge. Für C-Compiler nur eingeschränkt geeignet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: 32bit RISC-Architektur. In den gängigen Implementierungen mit dem  ARM7TDMI-Core (Architektur V4 = ARMv4T) stehen 2 Befehlssätze zur Verfügung: 32bit-codiert für Tempo, sofern der Speicherdurchsatz das zulässt, und 16bit-codiert (Thumb) für kompakte Programme. Cortex M3 (ARMv7) kennt ausschliesslich 16bit codierte Befehle. Einheitlicher 32bit-Adressraum. Exzellente Zielmaschine für C-Compiler.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: Register-orientierte, an RISC Prinzipien angelehnte 8-Bit Architektur. Getrennte Adressräume für RAM und ROM. Registersatz nicht einheitlich nutzbar. I/O-Bereich nicht einheitlich adressierbar. Nur ein Teil des I/O-Bereiches ist bitweise manipulierbar. Einheitliche RAM-Adressierung. Für C-Compiler geeignet.Bemerkung: Laut Wikipedia wurde der Controller während der Entwicklungsphase für den Einsatz von C-Compilern optimiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: Register-orientierte 16-Bit RISC-Architektur mit vollständiger Orthogonalität. Einheitlicher Adressraum für RAM und ROM. Exzellente Zielmaschine für C-Compiler. Angelehnt an die legendäre PDP-11, vieles wurde übernommen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: Akkumulator-orientierte 8-Bit Architektur. Getrennte Adressräume für RAM und ROM. RAM-Banking, ROM-banking. Umständlicher Zugriff auf Daten im ROM (nur 12/14-Bit Versionen). Viele für C-Compiler wesentliche Elemente sind nur umständlich realisierbar (z.B. Code/Datenadressierung mit Banking, Vergleich mit Vorzeichen). Mit der neueren 16-Bit (Programmspeicherbreite) Architektur wurden einige dieser Probleme beseitigt, andere nicht. Microchip hat auch eine Familie mit 16-Bit Datenbusbreite angekündigt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C&#039;&#039;&#039;: 16-Bit 2-Adress CISC-Architektur. Einheitlicher 64KB Adressraum für RAM und ROM. Gute Zielmaschine für C-Compiler.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;M16C&#039;&#039;&#039;: Unter Bezeichnung M16C existieren sich zwei verschiedene inkompatible Architekturen. Die Modelle bis /6x sind grundsätzlich identisch mit R8C, die /8x Modelle mit M32C (hier nicht näher betrachtet). Der 64KB RAM-I/O-Adressraum ist ein Teil des 1MB großen Gesamtadressraumes, Daten im ROM liegen jedoch ausserhalb dieser 64KB und sind daher anders als beim R8C nicht mit 16-Bit Zeigern adressierbar. Gute Zielmaschine für spezialisierte C-Compiler, GCC jedoch tut sich etwas schwer mit den Adressräumen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: Register-orientierte 8-Bit Architektur, 2-Adress-CISC. Getrennte Adressräume für RAM und ROM. Historisch bedingt 3 RAM-Adressräume (8-Bit, 12-Bit, 16-Bit). Für C-Compiler geeignet&lt;br /&gt;
&lt;br /&gt;
Kleiner nicht repräsentativer Compiler-Vergleich. Verwendet wurde eine Variante des crc8-Code von Colin O&#039;Flynn. Jeweils kleinstes Speichermodell, auf Platz optimiert:&lt;br /&gt;
{|&lt;br /&gt;
|Compiler&lt;br /&gt;
|  Befehle(1)&lt;br /&gt;
|  Bytes(1)&lt;br /&gt;
|  Befehle(2)&lt;br /&gt;
|  Bytes(2)&lt;br /&gt;
|-&lt;br /&gt;
|GCC AVR&lt;br /&gt;
|24&lt;br /&gt;
|48&lt;br /&gt;
|24&lt;br /&gt;
|48&lt;br /&gt;
|-&lt;br /&gt;
|Keil 8051&lt;br /&gt;
|24&lt;br /&gt;
|38&lt;br /&gt;
|74&lt;br /&gt;
|109&lt;br /&gt;
|-&lt;br /&gt;
|SDCC 8051&lt;br /&gt;
|24&lt;br /&gt;
|40&lt;br /&gt;
|35&lt;br /&gt;
|54&lt;br /&gt;
|-&lt;br /&gt;
|Zilog Z8e&lt;br /&gt;
|21&lt;br /&gt;
|54&lt;br /&gt;
|27&lt;br /&gt;
|73&lt;br /&gt;
|-&lt;br /&gt;
|PIC C18&lt;br /&gt;
|26&lt;br /&gt;
|52&lt;br /&gt;
|95&lt;br /&gt;
|206&lt;br /&gt;
|-&lt;br /&gt;
|SDCC PIC18&lt;br /&gt;
|41&lt;br /&gt;
|112&lt;br /&gt;
|41&lt;br /&gt;
|112&lt;br /&gt;
|-&lt;br /&gt;
|SDCC PIC16&lt;br /&gt;
|26&lt;br /&gt;
|52&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| (for pic16f84)&lt;br /&gt;
|-&lt;br /&gt;
|HEW R8C/M16C&lt;br /&gt;
|20&lt;br /&gt;
|48&lt;br /&gt;
|20&lt;br /&gt;
|48&lt;br /&gt;
|-&lt;br /&gt;
|GCC 68HC11&lt;br /&gt;
|36&lt;br /&gt;
|65&lt;br /&gt;
|36&lt;br /&gt;
|65&lt;br /&gt;
|-&lt;br /&gt;
|GCC MSP430&lt;br /&gt;
|17&lt;br /&gt;
|40&lt;br /&gt;
|17&lt;br /&gt;
|40&lt;br /&gt;
|-&lt;br /&gt;
|GCC ARM7&lt;br /&gt;
|12&lt;br /&gt;
|48&lt;br /&gt;
|12&lt;br /&gt;
|48&lt;br /&gt;
|-&lt;br /&gt;
|GCC ARM7-Thumb&lt;br /&gt;
|20&lt;br /&gt;
|40&lt;br /&gt;
|20&lt;br /&gt;
|40&lt;br /&gt;
|}&lt;br /&gt;
(1): Lokale Daten ggf. statisch gespeichert, nicht reentrant.&lt;br /&gt;
&lt;br /&gt;
(2): Lokale Daten auf dem Stack, also reentrant.&lt;br /&gt;
&lt;br /&gt;
==Sind CPU-spezifische Erweiterungen in C erforderlich?==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: &lt;br /&gt;
* 5-6 Speicherklassen für Datenspeicher (direkt, indirekt, 8-Bit &amp;quot;external&amp;quot;, 16-Bit &amp;quot;external&amp;quot;, Flash, evtl. noch Einzelbits). &lt;br /&gt;
*Außerdem noch Adresserweiterungen durch Mapping, Paging und Banking &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: &lt;br /&gt;
* 2 Speicherklassen für Datenspeicher (RAM, ROM).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;R8C&#039;&#039;&#039;: nein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: &lt;br /&gt;
* 3 Speicherklassen für Datenspeicher (shared RAM, banked RAM, ROM).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;:&lt;br /&gt;
* Für atomic execution (s.u.) notwendig, aber nicht existent.&lt;br /&gt;
* 4 Speicherklassen für Datenspeicher (256B, 4KB, 64KB, Flash).&lt;br /&gt;
&lt;br /&gt;
==Sind Daten in RAM und ROM mit dem gleichen Code benutzbar?==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;, &#039;&#039;&#039;AVR&#039;&#039;&#039;, &#039;&#039;&#039;PIC&#039;&#039;&#039;, &#039;&#039;&#039;Z8e&#039;&#039;&#039; wie generell alle [[Harvard-Architektur|Harvard-Architekturen]]: NEIN. Daten im ROM&lt;br /&gt;
erfordern anderen Zugriff als Daten im RAM. Entweder versteckt das der Compiler in Runtime-Routinen für Pointerzugriffe, oder man kann Routinen nicht so schreiben, dass sie beides als Parameter verdauen können. Bei kleinen Programmen von ein paar KB kein Problem, bei größeren jedoch schon. Bei AVR/GCC ziemlich fehlerträchtig.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;M16C&#039;&#039;&#039;: Hängt vom Compiler ab. Mit 16-Bit Zeigern (GCC) nicht, 20-Bit Zeiger sind ineffizient.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;R8C&#039;&#039;&#039;: [[von Neumann-Architektur]], problemlos.&lt;br /&gt;
&lt;br /&gt;
==Lineare Adressierung vom RAM?==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;, &#039;&#039;&#039;ARM&#039;&#039;&#039;, &#039;&#039;&#039;AVR&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;R8C/M16C&#039;&#039;&#039;, &#039;&#039;&#039;Z8e&#039;&#039;&#039;: kein Problem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: PIC18 ja, PIC16,PIC12,PIC10 nein. RAM-Puffer die größer sind als das RAM in einer Bank sind nur mit Klimmzügen möglich.&lt;br /&gt;
&lt;br /&gt;
==Skalierbarkeit==&lt;br /&gt;
&lt;br /&gt;
Vor allem für jene wichtig, die sich scheuen, für&lt;br /&gt;
verschiedene Aufgaben verschiedene Lösungen zu verwenden. &lt;br /&gt;
&lt;br /&gt;
Spezielle Versionen für LCD-Ansteuerung wurden in dieser Übersicht nicht berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: 8-Pin/1KB aufwärts, überwiegend 40/44-Pin und 64/68-Pin. Architekturbedingte Grenze bei 64KB Code, 64KB RAM - Versionen mit mehr Flash  nutzbar via Banking (Compiler-Support vorhanden) existieren, Versionen mit bis zu 100 MHz Taktfrequenz verfügbar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: 48-Pin/32KB, bis 512K mit internem Flash. Versionen mit internem Cache und externem Speicher sind praktisch beliebig weit ausbaufähig.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: 8-Pin/1KB bis 64-Pin/128KB, 100-Pin/256KB in Vorbereitung. Architekturbedingte  Grenze bei 8MB Code, 64KB RAM. GCC/WinAVR derzeit nur bis 128KB Code möglich (in Arbeit).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: 14-Pin DIP/1KB bis 113-Pin BGA/256KB. DIP, SOIC, TSSOP, QFN, TQFP und BGA erhältlich, in DIP und BGA jedoch nur wenige Typen verfügbar. Architekturbedingte Grenze von 64KB für Code+Daten wird in den großen Versionen durch 20-bittige Adressen umschifft. Taktfrequenz: maximal 8, 16 und 18 MHz je nach Familie. 25 MHz-Versionen in Kürze. Stromaufnahme: Rund 2 uA im LPM3 (real time clock mode) bis ca. 5 mA, typisch 200 µA pro MHz.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: 6-Pin/512B aufwärts. Im Prinzip großer Bereich, aber innerhalb der Familie deutlich verschiedene inkompatible Architekturen mit unterschiedlichen architekturbedingen Grenzen und unterschiedlichem Compiler-Support.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;eZ8&#039;&#039;&#039;: Bis 64KB Flash. Architekturbedingte Grenze bei 64KB Code, 64KB RAM.&lt;br /&gt;
&lt;br /&gt;
Empfehlung hier: Auch wenn teilweise mehr möglich ist, sind 8/16-Bit-Controller nur bis maximal 40-60K empfehlenswert. Darüber sollte eine 32-Bit-Architektur — z.B. mit [[ARM]]-Core — in Betracht gezogen werden. Insbesondere auch, weil große Programme zu Programm- und Datenstrukturen neigen, die sich auf 8-Bit-Prozessoren schlecht abbilden lassen.&lt;br /&gt;
&lt;br /&gt;
==Interrupt-feste Programmierung von I/O-Ports==&lt;br /&gt;
&lt;br /&gt;
Siehe http://www.mikrocontroller.net/articles/Interrupt.&lt;br /&gt;
&lt;br /&gt;
Das ist besonders bei &#039;&#039;&#039;AVR&#039;&#039;&#039; (ausser den Typen seit 2004: ATtiny2313 usw.) ein Problem. Architekturbedingt ist nur ein Teil der Ports bitweise schaltbar, kein Port kann mehrere Bits gleichzeitig interrupt-fest schalten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;, &#039;&#039;&#039;8051&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;R8C/M16C&#039;&#039;&#039;, &#039;&#039;&#039;Z8e&#039;&#039;&#039; können AND/OR/XOR zum Port hin, daher ist bei geeigneter Programmierung das Problem auch ohne Abschalten der Interrupts vermeidbar.&lt;br /&gt;
&lt;br /&gt;
Zu &#039;&#039;&#039;ARM&#039;&#039;&#039; ist dazu keine allgemeine Aussage möglich. Je nach Implementierung wird das Problem teilweise durch entsprechend gestaltete I/O-Ports gelöst, in anderen Fällen ist erhebliche Wachsamkeit geboten. Atmel SAM7 bereitet hier weniger Probleme als Philips LPC2000. Bei den  LPC2000 gibt es zwei getrennte Register, eines zum Setzen, das andere zum Löschen einzelner Pins. In einem weiteren Register können Bits ausmaskiert werden. Es gibt also kein read-modify-write. Gut gelöst für Push/Pull-Ausgänge, aber eine äquivalente Steuerung der Richtung wurde vergessen, was Open-Drain Pins erschwert. Implementierungen auf Basis des Cortex M3 oder der ARM Port-Macrocell verwenden statt dessen Adressbits zur Maskierung.&lt;br /&gt;
&lt;br /&gt;
Besonders pfiffig ist das beim &#039;&#039;&#039;Z8e&#039;&#039;&#039; gelöst. Ein Befehl fasst die nächsten 3 Befehle zu einer nicht unterbrechbaren Einheit zusammen (atomic execution). Allerdings wird das vom Zilog Compiler nicht unterstützt.&lt;br /&gt;
&lt;br /&gt;
==Zugriff auf I/O-Ports==&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;8051&#039;&#039;&#039; verfügt weder über eigene Register für die Steuerung der Richtung der I/O-Ports, noch über die Möglichkeit, lesend auf den Sollzustand der Ausgänge zuzugreifen. In Assembler ist das kein Problem, da abhängig vom Befehl entweder vom Zustand der Pins (Leseoperationen) oder vom Sollzustand der Ausgänge (kombinierte Lese/Schreiboperationen) ausgegangen wird. Ein korrekt arbeitender C Compiler kann damit jedoch nicht umgehen, weshalb für die Steuerung von Port-Pins spezielle Zugriffsfunktionen und eine sehr genaue Kenntnis der Arbeitsweise der Ports erforderlich sind.&lt;br /&gt;
&lt;br /&gt;
Anmerkung zum Keil 8051-Compiler: Port-Zugriff erfolgt über Pseudo-Variablen wie bei µC üblich. Infolgedessen ist in C Code nicht ersichtlich, ob beispielsweise die Port-Variable P1 für den Zustand der Pins oder den Sollzustand der Ausgänge steht. Nur der erzeugte Assembler-Code kann hier Klarheit schaffen. So haben die beiden prinzipiell identischen Zeilen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
P1 = P1 | 0x01;&lt;br /&gt;
P1 = (P1 | 0x01) &amp;amp; ~0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
völlig unterschiedliche Auswirkung auf den Port. Der Code der ersten Zeile setzt Bit 0 und lässt alle anderen Bits unverändert. Der von der zweiten Zeile erzeugte Code setzt zusätzlich auch alle vorher als Eingang definierten Pins im Zustand 0 auf Ausgang mit Zustand 0. Das ist weder hilfreich, noch mit der Sprachdefinition von C vereinbar.&lt;br /&gt;
&lt;br /&gt;
Auch manche Modelle der &#039;&#039;&#039;PIC&#039;&#039;&#039;-Familie können nur auf den Zustand der Pins zugreifen, nicht auf den Sollzustand der Ausgänge.&lt;br /&gt;
&lt;br /&gt;
In beiden Fällen ist folglich bei Ports, die sowohl für Aus- als auch für Eingänge benutzt werden, besondere Sorgfalt nötig.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;, &#039;&#039;&#039;AVR&#039;&#039;&#039;, &#039;&#039;&#039;MSP430&#039;&#039;&#039;, &#039;&#039;&#039;Z8e&#039;&#039;&#039; und neuere Modelle der &#039;&#039;&#039;PIC&#039;&#039;&#039;-Familie besitzen diese Probleme nicht.&lt;br /&gt;
&lt;br /&gt;
==Priorisierte Interrupts==&lt;br /&gt;
&lt;br /&gt;
Unter priorisierten Interrupts versteht man die Fähigkeit, den einzelnen Interrupt-Quellen eine Priorität zuweisen zu können um ohne Reprogrammierung der Interrupt-Quellen einen laufenden Interrupt ausschliesslich durch Interrupts höherer Priorität unterbrechbar machen zu können. Die einfache und selbstverständliche Fähigkeit, anstehende Interrupts nach fester Priorität zu sortieren, ist damit nicht gemeint.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Ja.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: Der ARM-Core unterstützt 2 Prioritäten mit entsprechenden Vektoren. Oft ist jedoch ein separater priorisierter und vektorisierter Interrupt-Controller mit integriert (Atmel, NXP, Cortex ja, Analog Devices nein). Interrupt-Nesting ist dank eines Designfehlers etwas umständlich, repariert in ARMv7 (Cortex M3).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR:&#039;&#039;&#039; Nein, aber separate Vektoren. Beim Sprung in die Interruptroutine wird implizit ein CLI ausgeführt, beim Rücksprung ein SEI. Ein &amp;quot;unwichtiger Interrupt&amp;quot; blockiert also evtl. einen &amp;quot;wichtigen&amp;quot;. Wenn aber ein Interrupt in der Interruptroutine ausgelöst wird, wird er später der internen Priorität nach ausgeführt. Immerhin haben Interruptquellen im Gegensatz zum PIC ihre eigenen Interruptvektoren, so dass keine Zeit mit der Suche nach der Quelle verbracht wird.&lt;br /&gt;
Um trotzdem für eine von mehreren Interruptquellen eine Reaktionszeiten im unteren Mikrosekundenbereich zu garantieren, hilft nur ein Trick: die weniger wichtigen Interruptroutinen tun nichts als eine Programmadresse auf den Stack zu PUSHen. Das RETI springt also zu dieser Adresse mit der eigentlichen Interruptbehandlung, das RET am Ende der Routine springt zur ursprünglichen Unterbruchstelle zurück; der zeitkritische Interrupt kann damit die andere Interruptbehandlung unterbrechen. &#039;&#039;Achtung: es muss gewährleistet sein, dass auch im worst case ein Interrupt sich nicht selbst unterbricht!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Anmerkung: Eine (unwichtige) Interruptroutine kann sofort nach Ansprung ein SEI ausführen, damit eine (unwichtige) Interruptroutine jederzeit von einer anderen (wichtigeren) Interruptroutine unterbrochen werden kann. Das kann pro Interruptvektor individuell entschieden werden. Dies ist jedoch nicht bei allen Interrupt-Quellen möglich (beispielsweise nicht beim TWI).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430:&#039;&#039;&#039; Ja, 16 vollpriorisierte Vektoren, davon 14 global maskierbar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC12 &amp;amp; PIC16:&#039;&#039;&#039; Nein, nur ein Interruptvektor.  Einfache PIC12 (12F508/509, 16F505) kennen gar keine Interrupts.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC18:&#039;&#039;&#039; Jeder Interruptquelle kann separat eine niedrige oder hohe Priorität zugewiesen werden, die dann auf zwei Interruptvektoren verzweigen. Welche Quelle den Interrupt ausgelöst hat, muss aber immer noch händisch festgestellt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC17:&#039;&#039;&#039; Vier Interruptvektoren mit unterschiedlicher Priorität. Scheint es allerdings nur als OTP zu geben, deswegen wohl eher uninteressant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C/M16C&#039;&#039;&#039;: 7 Prioritäten, vektorisiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: 3 Prioritäten, vektorisiert.&lt;br /&gt;
&lt;br /&gt;
== Spannungsversorgung ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;, &#039;&#039;&#039;AVR&#039;&#039;&#039;, &#039;&#039;&#039;PIC&#039;&#039;&#039;: 3-5V problemlos (evtl. eingeschränkte µC-Auswahl?). Ungeregelter Batteriebetrieb möglich. Einzelne AVR auch bis 1.8V. LV-PICs auch bis 2,2V&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: 3,3V-Versorgung, 5V-kompatibel. Je nach Modell ist eine separate 1,8V-Versorgung für den Core notwendig. Kein ungeregelter Batteriebetrieb möglich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: nur 1.8-3.6V. Nicht 5V-kompatibel, 5V-Peripherie für I2C/RS485/CAN/... ist also nur mit Pegelkonvertierung einsetzbar. Ungeregelter Batteriebetrieb möglich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: 3,3V-Versorgung, 5V-kompatibel.&lt;br /&gt;
&lt;br /&gt;
==Programmierung in der Schaltung==&lt;br /&gt;
&lt;br /&gt;
Geräte mit Debugging-Interface (s.U.) lassen sich i.d.R. auch damit programmieren. Siehe dazu nächsten Abschnitt.&lt;br /&gt;
&lt;br /&gt;
Die meisten Controller können sich selbst programmieren, Bootloader per RS232,CAN,usw sind dann problemlos realisierbar. Nur müssen solche Bootloader erst einmal auf den Chip programmiert werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: Entweder über die serielle ICSP-Schnittstelle (dafür gibt es Baupläne für billige ParPort-Programmer incl. guter Software) oder mit dem InCircuit-Debugger (~150&amp;amp;#8364;, ICD2 von Microchip). Bootloader müssen generell vorher mit einer der vorher genannten Möglichkeiten auf den Chip geflasht werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Verschieden, je nach Hersteller und Modell. Im Unterschied zu den anderen hier betrachtete Controllern existieren viele nicht in der Schaltung, sondern nur mit speziellen Interfaces programmierbare 8051 Modelle. Modelle mit seriellem Bootloader via UART, SPI, CAN oder USB existieren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: Am besten über JTAG, je nach Hersteller und Familie auch mit Bootloader, z.B. bei Philips LPC2000 über RS232 und Atmel SAM7 über USB (bei letzterem sehr unbequem und langsam!).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: Über ein an SPI orientiertes proprietäres Interface. Ist via Parallelport günstig herzustellen; der Adapter ist im besten Fall genau 5 Widerstände teuer, professioneller mit einem [[Ausgangsstufen_Logik-ICs#Tri-state|Tri-State]]-Bustreiber etwa 5-15 EUR. Darüberhinaus auch mit HV-Programmer (z.B. auf dem [[STK500]]), der u.U. auch nötig ist um falsch gesetzte Fuses wieder zu &amp;quot;reparieren&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: Via JTAG-Interface, TI &amp;quot;Spy BiWire&amp;quot; und über integrierten  Bootloader. (Schaltung zur Ansteuerung via RS232 im Datenblatt)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C&#039;&#039;&#039;: Via UART (RS-232 oder USB-RS-232 Konverter) mit Flash-Tool (Windows, Linux). Variante über Bootloader ebenfalls möglich (wird vom Software Emulator-Debugger benutzt).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: Via Debug-Interface.&lt;br /&gt;
&lt;br /&gt;
==Debugging in der Schaltung==&lt;br /&gt;
&lt;br /&gt;
Ist beispielsweise ein günstiges [[JTAG]]-Interface für In-Circuit&lt;br /&gt;
Debugging verfügbar?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Derivate mit JTAG verfügbar. ICEen gebraucht erschwinglich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: alle mit JTAG.&lt;br /&gt;
* Günstiges Parallel-Port-Interface verfügbar und einfach zu bauen (Wiggler), aber langsam und problematisch im Betrieb unter WinNT+ (besser: ocdremote unter Win9x auf Zweitrechner, via LAN). Kostenlose Debugger ([[GDB]]) unterstützen seit OCDremote 2.14 mit Einschränkungen auch Programme im Flash. &lt;br /&gt;
* Schnelles JTAG Interface basierend auf FT2232C für [[GDB]]/OpenOCD günstig und einfach zu bauen (http://www.fh-augsburg.de/~hhoegl/proj/usbjtag/usbjtag.html) oder fertig erhältlich (http://www.amontec.com/jtagkey.shtml).&lt;br /&gt;
* Kommerzielle Debugger per USB sind besser und schneller, aber recht teuer.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: für ATmega16/162/32/128 ist JTAG günstig verfügbar&lt;br /&gt;
(Olimex, Erostech) bzw. einfach zu bauen (Evertool). ATmegas ab 2005/2006 mit JTAG sind zu dieser Billigvariante inkompatibel. Für diese und den [[debugWIRE]] der ATtinys und ATmegaX8 existiert das JTAG ICE mkII von Atmel, aber recht teuer, sowie der preiswerte AVR Dragon.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: alle mit JTAG, Adapter sehr günstig/einfach zu bauen. Neuere Geräte mit Spy-by-Wire (braucht weniger Pins als JTAG).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: Entweder Microchips MPLAB ICD2 (&amp;amp;#8364;150-200) oder ein kompatibler Nachbau, wie z.B. http://www.stolz.de.be/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C&#039;&#039;&#039;: On-Chip Debugging ist mit dem E8 Hardware On-Chip Debugging Emulator möglich (kein JTAG). Ausserdem ist Debugging auch über einen normalen RS232 Anschluss möglich. Der E8 verwendet ein syncrones serielles Protokoll, die RS232 ein asyncrones. Daher ermöglicht der E8 das Debugging bei jeder beliebigen Taktfrequenz, bei RS232 gibt es da Einschränkungen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: Debugging möglich mit &amp;quot;Smart Cable&amp;quot; (kein JTAG), Anschluss über USB oder Seriell&lt;br /&gt;
&lt;br /&gt;
==Starterkits==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8051&#039;&#039;&#039;: Keil MCB900 (http://www.keil.com/mcb900)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: http://www.olimex.com (z.T. hier im Shop erhältlich), http://www.embeddedartists.com,&lt;br /&gt;
http://www.mct.de&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR&#039;&#039;&#039;: [[STK200]], [[STK500]], [[AVR_Butterfly]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MSP430&#039;&#039;&#039;: http://www.olimex.com (z.T. hier im Shop erhältlich), ez430 (http://www.ti.com/ez430)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PIC&#039;&#039;&#039;: Velleman-Kit K8048 (www.velleman.be)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;R8C&#039;&#039;&#039;: Mehrere (Google Suche). Am weitesten verbreitet ist vielleicht das R8C/13 Starterkit inkl. Entwickler-CD von Glyn/Elektor (Beilage Elektor 12/2005 (ausverkauft) bzw. diverse Drittanbieter). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Z8e&#039;&#039;&#039;: Günstig verfügbar [~50&amp;amp;#8364;], teils hier im Shop, komplett inklusive unbeschränktem Compiler und In-System-Debugging. Nachteile: für jede Prozessorklasse ein eigenes Kit; eingelöteter SMD-Chip obwohl viele Typen auch im DIL-Gehäuse existieren.&lt;br /&gt;
&lt;br /&gt;
==Gehäuse==&lt;br /&gt;
&lt;br /&gt;
Mit DIP oder PLCC bastelt es sich leichter als mit *QFP. Die Domäne von&lt;br /&gt;
AVR/PIC/i51. Für MSP430 gibt es günstige fertig bestückte DIP-Adapter hier im Shop (MSP430x2xx gibt es auch in 14-Pin DIP-Gehäuse). Z8e-Chips existieren ebenfalls in DIP, sind aber schlechter verfügbar.&lt;br /&gt;
&lt;br /&gt;
==Beschaltungsaufwand==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AVR, PIC, 8051, Z8e, MSP430, R8C&#039;&#039;&#039;: gering, i.d.R. sind Versionen mit integriertem Oszillator verfügbar, so dass man praktisch nur die Versorgungsspannung (nebst Abblockkondensator) braucht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARM&#039;&#039;&#039;: aufwendigere externe Takt- und Spannungserzeugung, manchmal 2 Betriebsspannungen benötigt; Tendenz aber fallend.&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/read-1-185133.html#new Forum]&lt;br /&gt;
* [[8051]]&lt;br /&gt;
* [[AVR]]&lt;br /&gt;
* [[PIC]]&lt;br /&gt;
* [[Z8]]&lt;br /&gt;
* [[ARM]]&lt;br /&gt;
* [[MSP430]]&lt;br /&gt;
* [[R8C]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Mikrocontroller]]&lt;/div&gt;</summary>
		<author><name>134.76.63.190</name></author>
	</entry>
</feed>