<?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=Hansschall</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=Hansschall"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Hansschall"/>
	<updated>2026-04-11T04:11:30Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Embedded-Rust&amp;diff=107792</id>
		<title>Embedded-Rust</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Embedded-Rust&amp;diff=107792"/>
		<updated>2025-11-29T20:28:19Z</updated>

		<summary type="html">&lt;p&gt;Hansschall: Neue section für Embassy&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmiersprachen]]&lt;br /&gt;
Diese Seite ist aktuell noch im Aufbau&lt;br /&gt;
&lt;br /&gt;
== Warum Rust? ==&lt;br /&gt;
&lt;br /&gt;
C/C++ ist im Embedded-Bereich noch mehr als sonst der Quasi-Standard für Software aller Art. Versuche, modernere Programmiersprachen auf Mikrocontrollern zum laufen zu bringen sind bisher nur im Arduino-Umfeld bekannt geworden (siehe MicroPython) und mit erheblichen Performanceeinbußen verbunden (je nach Quelle 10-100x). Rust hingegen ist mit einer Performance die je nach Programmierstil zwischen C++ und besser als C (Ja, wirklich!) liegt deutlich konkurrenzfähig. Gleichzeitig bringt Rust eine moderne Syntax, ein hohes Abstraktionsniveau und sehr gute Tool-Integration mit.&lt;br /&gt;
&lt;br /&gt;
== Vorteile ==&lt;br /&gt;
&lt;br /&gt;
* Bei Rust immer zitiert: Speichersicherheit. In Rust stellt der sogenannte Borrow-Checker als Teil des Typsystems sicher, dass jedes Stück Daten genau einen Besitzer (Owner) und entweder mehrere lesbare Referenzen (borrow) oder eine einzige schreibbare Referenz (mutable borrow) hat. Außerdem stellt er sicher, dass nur valide Referenzen (in C Pointer) verwendet werden können. Sobald eine Variable ihren Gültigkeitsbereich verlässt wird (auch dynamisch allokierter) Speicher automatisch freigegeben. Letztendlich besitzt jedes (safe) Rust-Programm ohne Compilerfehler nachweißlich keine Speicherfehler.&lt;br /&gt;
* Borrow-Checker für Peripherals: Eine der genialsten Funktionen im Embedded-Bereich. Die Garantien für Speichersicherheit werden von den HALs auch für ganze Peripherals erzwungen. Auf diese Art ist es unmöglich einen Pin aus Versehen doppelt oder ohne vorherige Konfiguration zu benutzen. Was bei IOs noch einigermaßen von Hand zu lösen wäre, ist bei DMA-Channels eine echte Erleichterung.&lt;br /&gt;
* Durch das genauere Typsystem können vom Compiler einige Optimierungen durchgeführt werden, die in C nicht möglich wären (v.a. in Zusammenhang mit readonly Pointern)&lt;br /&gt;
* Fokussierung auf den Stack: In Rust läuft fast alles über den (schnellen und deterministischen) Stack. Sehr viele Embedded-Rust Programme (auch mit Netzwerk/BT/USB) haben überhaupt keinen Heap konfiguriert. Es spricht allerdings auch nichts dagegen einen zu verwenden&lt;br /&gt;
* Asynchrone Programmierung: Natürlich kann man auch in Rust blockierende Funktionen programmieren, aber async/await ermöglicht mit wenig Aufwand extrem effiziente Nebenläufigkeit ohne ein RTOS.&lt;br /&gt;
* Debugging: Neben dem Debugging mittels Breakpoints führt häufig auch ein einfaches println zu schnellem Erfolg. Allerdings sind Stringoperationen nicht gerade effizient. Für Rust-Nutzer gibt es da [https://docs.rs/defmt/latest/defmt/ defmt]. Dabei werden nur eine ID für jedes Log-Statement und die Formatierungsargumente in einen Ringpuffer geschrieben und vom Debugger ausgelesen. Die eigentliche - beliebig aufwendige - Formatierung erfolgt auf dem Hostrechner&lt;br /&gt;
&lt;br /&gt;
== Hardwareunterstützung ==&lt;br /&gt;
&lt;br /&gt;
* STM32: sehr gut, nicht nur für einzelne Chips&lt;br /&gt;
* RP2040/RP235x: sehr gut, aufgrund der großen Popularität des Raspberry Pico&lt;br /&gt;
* Nordic Semiconductor nrf: sehr gut, der Artikelautor hat aber keinerlei Erfahrungen mit nrf&lt;br /&gt;
* AVR: vom Compiler unterstützt, das HAL-Projekt ist aber etwas (sehr) eingeschlafen&lt;br /&gt;
* ESP32: sehr gut, wird von Espressif selbst unterstützt, wenn auch etwas gespalten zwischen pure-Rust(no_std)/ESP-IDF(std) und Xtensa/Risc-V&lt;br /&gt;
&lt;br /&gt;
== Was ist Embassy? ==&lt;br /&gt;
&lt;br /&gt;
[https://embassy.dev/ Embassy] ist ein Framework für Embeddeded Rust das zahlreiche elementare Funktionen breitstellt:&lt;br /&gt;
&lt;br /&gt;
* HAL&lt;br /&gt;
* Timer&lt;br /&gt;
* Einen task Scheduler/Async Runtime&lt;br /&gt;
* Synchronisierung: Mutex, etc.&lt;br /&gt;
&lt;br /&gt;
Außer AVR unterstützt Embassy alle der oben genannten Plattformen.&lt;br /&gt;
&lt;br /&gt;
Embassy ist allerdings nicht die einzige Möglichkeit, neben der asynchronen Programmierung mit Embassy kann man natürlich wie in C auch klassischen blockierenden/interruptgetriebenen Code - mit oder ohne RTOS - schreiben. Dafür kann man sowohl den Embassy HAL also auch andere HALs verwenden&lt;br /&gt;
&lt;br /&gt;
== Unterschiede zu C / Rust-Crashkurs ==&lt;br /&gt;
&lt;br /&gt;
Wer wirklich Rust lernen will, sei auf die zahlreichen Ressourcen und vor allem [https://doc.rust-lang.org/book/ &amp;quot;The Book&amp;quot;] verwiesen.&lt;br /&gt;
&lt;br /&gt;
Im folgenden sollen kurz und knapp die wichtigsten und überraschensten Unterschiede zu C dargestellt werden, nachdem die meisten Leser hier vermutlich einen gewissen &amp;quot;C-Hintergrund&amp;quot; haben.&lt;br /&gt;
&lt;br /&gt;
=== Integertypen ===&lt;br /&gt;
&lt;br /&gt;
Rust verwendet immer explizite Integergrößen wie &#039;&#039;&#039;u32&#039;&#039;&#039; for einen unsigened 32-bit integer&lt;br /&gt;
&lt;br /&gt;
=== Typen ===&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zu C/C++ kommt in Rust der Typ immer &#039;&#039;&#039;nach&#039;&#039;&#039; dem Identifier.&lt;br /&gt;
&lt;br /&gt;
Aus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
byte foo(int x){&lt;br /&gt;
    int y = x * 2;&lt;br /&gt;
    return 5;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wird&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;rust&amp;quot;&amp;gt;&lt;br /&gt;
fn foo(x: i32) -&amp;gt; u8{&lt;br /&gt;
    //  ähnlich wie bei auto in C++ wird hier der Typ automatisch erkannt&lt;br /&gt;
    // nur in Rust funktioniert das wesentlich besser&lt;br /&gt;
    let y = x * 2;&lt;br /&gt;
&lt;br /&gt;
    // der letzte Ausdruck in einem Codeblock ist auch automatisch der Rückgabewert&lt;br /&gt;
    // Alternativ ist natürlich auch ein return 1:1 wie in C möglich&lt;br /&gt;
    5&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Generics, Closures (lambda functions), etc. ===&lt;br /&gt;
&lt;br /&gt;
Fast alle erweiterten Sprachkonstrukte können und werden im Embeddedbereich verwendet. Rust verfolgt generell ein Konzept von &amp;quot;Zero-cost abstractions&amp;quot;, also Abstraktion ohne Performanceeinbußen. Außer dynamischem Speicher (und selbst der, wenn man die Nachteile in Kauf nimmt) kann daher fast alles was Rust zu bieten hat auch verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=== Enums ===&lt;br /&gt;
&lt;br /&gt;
Enums sind vermutlich der gewaltigste Unterschied. In C sind enums eher eine Ansammlung von automatisch durchnummerierten Konstanten, während in Rust enums wesentlich mächtiger sind.&lt;br /&gt;
&lt;br /&gt;
Natürlich funktioniert der Standardfall in Rust genauso:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;rust&amp;quot;&amp;gt;&lt;br /&gt;
enum Foo {&lt;br /&gt;
    A,&lt;br /&gt;
    B,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
let foo = Foo::A;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Große Unterschied ist dass einzelne Varianten Daten haben können:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;rust&amp;quot;&amp;gt;&lt;br /&gt;
enum Foo {&lt;br /&gt;
    A(u8, bool),&lt;br /&gt;
    B{&lt;br /&gt;
        bar: u32,&lt;br /&gt;
    },&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
let foo = Foo::A(6, true);&lt;br /&gt;
let bar = Foo::B{bar: 7};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Prinzip verhält sich dieses Konstrukt wie ein C enum zusammen mit einer union über die Datenanhänge. Diese Struktur eignet sich hervorragend zur Implementierung von Zustandsautomaten.&lt;br /&gt;
&lt;br /&gt;
In der Standardbibliothek findet sich übrigens auch dieses extrem häufig verwendete enum: Option&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;rust&amp;quot;&amp;gt;&lt;br /&gt;
pub enum Option&amp;lt;T&amp;gt; {&lt;br /&gt;
    /// No value.&lt;br /&gt;
    None,&lt;br /&gt;
    /// Some value of type `T`.&lt;br /&gt;
    Some(T),&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Option&amp;lt;T&amp;gt; ist die Rust-entsprechung von null(-pointern). Anstatt den Fehler irgendwie in den Rückgabewert zu quetschen, wird der Rückgabewert in ein Option verpackt: z.B. Option&amp;lt;u32&amp;gt;. Dadurch ist klar erkennbar wenn in einer Funktion ein Fehler auftreten kann und ohne diesen Fall zu beachten kompiliert das Programm nicht. Daneben gibt es noch Result&amp;lt;R,E&amp;gt; mit einem expliziten Fehler E. Mehr dazu findet ihr in jeder Rust-einführung.&lt;br /&gt;
&lt;br /&gt;
Falls ihr euch Sorgen um den Speicherverbrauch macht, sobald T einen verbotenen Wert hat (z.B. 0 für eine Referenz (alle Referenzen in Rust sind garantiert gültig und daher nicht 0) oder 5 für einen bool), führt der Compiler automatisch eine sog. Nieschenoptimierung durch und verwendet genau diese Werte für None. Effektiv entsteht dann auch wieder ein NULLpointer, nur dass dieser auf jeden Fall explizit gehandhabt wird.&lt;br /&gt;
&lt;br /&gt;
== Asynchronität ==&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Zunächst einmal benötigt man natürlich den Rust-compiler selbst. Das empfohlene Weg dafür ist [https://rustup.rs/ rustup]. Mehr dazu findet ihr auf der [https://rust-lang.org/learn/get-started/ Rust webseite]&lt;br /&gt;
&lt;br /&gt;
Ein extra Buildsystem (z.B. Make) wie bei C benötigt ihr &#039;&#039;&#039;nicht&#039;&#039;&#039;, Rust bringt selber &#039;&#039;&#039;cargo&#039;&#039;&#039; mit, das sich auch noch um Packetdownloads kümmert.&lt;br /&gt;
&lt;br /&gt;
Für die Desktop-entwicklung hättet ihr nun alles beisammen, für die Emebdded-entiwcklung braucht ihr neben der Hardware (uC &amp;amp; Debugger) nur noch &#039;&#039;&#039;probe-rs&#039;&#039;&#039;, das ist so ähnlich wie AVRDude nur für Rust und 32-bit ARM. Folgt dazu einfach der Anleitung von Embassy https://embassy.dev/book/ , da gibt es auch gleich ein paar Beispielprogramme.&lt;br /&gt;
&lt;br /&gt;
== Beispiel für ein einfaches Programm ==&lt;br /&gt;
&lt;br /&gt;
== Weiterführende Links ==&lt;br /&gt;
&lt;br /&gt;
* [https://embassy.dev/ Embassy]: Das am häufigsten benutzte Framework für async Rust im Embeddedbereich&lt;br /&gt;
* [http://ptrace.fefe.de/ct-rust.html Was macht Rust, weshalb man es sich angucken sollte?]&lt;br /&gt;
* [https://www.reddit.com/r/rust/comments/10dhdys/rust_from_a_security_perspective_where_is_it/ Rust from a security perspective, where is it vulnerable?]&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/490782 Forumsbeitrag:] Erfahrungen mit Rust für Mikrocontroller&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/459037 Forumsbeitrag:] Rust auf AVR: AVR-Rust -&amp;gt; So geht&#039;s&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/rust-ist-das-hier-um-zu-bleiben Forumsbeitrag:] Rust - ist das hier um zu bleiben?&lt;/div&gt;</summary>
		<author><name>Hansschall</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Embedded-Rust&amp;diff=107791</id>
		<title>Embedded-Rust</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Embedded-Rust&amp;diff=107791"/>
		<updated>2025-11-29T20:13:28Z</updated>

		<summary type="html">&lt;p&gt;Hansschall: /* Installation */ Inhalt einfügen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmiersprachen]]&lt;br /&gt;
Diese Seite ist aktuell noch im Aufbau&lt;br /&gt;
&lt;br /&gt;
== Warum Rust? ==&lt;br /&gt;
&lt;br /&gt;
C/C++ ist im Embedded-Bereich noch mehr als sonst der Quasi-Standard für Software aller Art. Versuche, modernere Programmiersprachen auf Mikrocontrollern zum laufen zu bringen sind bisher nur im Arduino-Umfeld bekannt geworden (siehe MicroPython) und mit erheblichen Performanceeinbußen verbunden (je nach Quelle 10-100x). Rust hingegen ist mit einer Performance die je nach Programmierstil zwischen C++ und besser als C (Ja, wirklich!) liegt deutlich konkurrenzfähig. Gleichzeitig bringt Rust eine moderne Syntax, ein hohes Abstraktionsniveau und sehr gute Tool-Integration mit.&lt;br /&gt;
&lt;br /&gt;
== Vorteile ==&lt;br /&gt;
&lt;br /&gt;
* Bei Rust immer zitiert: Speichersicherheit. In Rust stellt der sogenannte Borrow-Checker als Teil des Typsystems sicher, dass jedes Stück Daten genau einen Besitzer (Owner) und entweder mehrere lesbare Referenzen (borrow) oder eine einzige schreibbare Referenz (mutable borrow) hat. Außerdem stellt er sicher, dass nur valide Referenzen (in C Pointer) verwendet werden können. Sobald eine Variable ihren Gültigkeitsbereich verlässt wird (auch dynamisch allokierter) Speicher automatisch freigegeben. Letztendlich besitzt jedes (safe) Rust-Programm ohne Compilerfehler nachweißlich keine Speicherfehler.&lt;br /&gt;
* Borrow-Checker für Peripherals: Eine der genialsten Funktionen im Embedded-Bereich. Die Garantien für Speichersicherheit werden von den HALs auch für ganze Peripherals erzwungen. Auf diese Art ist es unmöglich einen Pin aus Versehen doppelt oder ohne vorherige Konfiguration zu benutzen. Was bei IOs noch einigermaßen von Hand zu lösen wäre, ist bei DMA-Channels eine echte Erleichterung.&lt;br /&gt;
* Durch das genauere Typsystem können vom Compiler einige Optimierungen durchgeführt werden, die in C nicht möglich wären (v.a. in Zusammenhang mit readonly Pointern)&lt;br /&gt;
* Fokussierung auf den Stack: In Rust läuft fast alles über den (schnellen und deterministischen) Stack. Sehr viele Embedded-Rust Programme (auch mit Netzwerk/BT/USB) haben überhaupt keinen Heap konfiguriert. Es spricht allerdings auch nichts dagegen einen zu verwenden&lt;br /&gt;
* Asynchrone Programmierung: Natürlich kann man auch in Rust blockierende Funktionen programmieren, aber async/await ermöglicht mit wenig Aufwand extrem effiziente Nebenläufigkeit ohne ein RTOS.&lt;br /&gt;
* Debugging: Neben dem Debugging mittels Breakpoints führt häufig auch ein einfaches println zu schnellem Erfolg. Allerdings sind Stringoperationen nicht gerade effizient. Für Rust-Nutzer gibt es da [https://docs.rs/defmt/latest/defmt/ defmt]. Dabei werden nur eine ID für jedes Log-Statement und die Formatierungsargumente in einen Ringpuffer geschrieben und vom Debugger ausgelesen. Die eigentliche - beliebig aufwendige - Formatierung erfolgt auf dem Hostrechner&lt;br /&gt;
&lt;br /&gt;
== Hardwareunterstützung ==&lt;br /&gt;
&lt;br /&gt;
* STM32: sehr gut, nicht nur für einzelne Chips&lt;br /&gt;
* RP2040/RP235x: sehr gut, aufgrund der großen Popularität des Raspberry Pico&lt;br /&gt;
* Nordic Semiconductor nrf: sehr gut, der Artikelautor hat aber keinerlei Erfahrungen mit nrf&lt;br /&gt;
* AVR: vom Compiler unterstützt, das HAL-Projekt ist aber etwas (sehr) eingeschlafen&lt;br /&gt;
* ESP32: sehr gut, wird von Espressif selbst unterstützt, wenn auch etwas gespalten zwischen pure-Rust(no_std)/ESP-IDF(std) und Xtensa/Risc-V&lt;br /&gt;
&lt;br /&gt;
== Unterschiede zu C / Rust-Crashkurs ==&lt;br /&gt;
&lt;br /&gt;
Wer wirklich Rust lernen will, sei auf die zahlreichen Ressourcen und vor allem [https://doc.rust-lang.org/book/ &amp;quot;The Book&amp;quot;] verwiesen.&lt;br /&gt;
&lt;br /&gt;
Im folgenden sollen kurz und knapp die wichtigsten und überraschensten Unterschiede zu C dargestellt werden, nachdem die meisten Leser hier vermutlich einen gewissen &amp;quot;C-Hintergrund&amp;quot; haben.&lt;br /&gt;
&lt;br /&gt;
=== Integertypen ===&lt;br /&gt;
&lt;br /&gt;
Rust verwendet immer explizite Integergrößen wie &#039;&#039;&#039;u32&#039;&#039;&#039; for einen unsigened 32-bit integer&lt;br /&gt;
&lt;br /&gt;
=== Typen ===&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zu C/C++ kommt in Rust der Typ immer &#039;&#039;&#039;nach&#039;&#039;&#039; dem Identifier.&lt;br /&gt;
&lt;br /&gt;
Aus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
byte foo(int x){&lt;br /&gt;
    int y = x * 2;&lt;br /&gt;
    return 5;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wird&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;rust&amp;quot;&amp;gt;&lt;br /&gt;
fn foo(x: i32) -&amp;gt; u8{&lt;br /&gt;
    //  ähnlich wie bei auto in C++ wird hier der Typ automatisch erkannt&lt;br /&gt;
    // nur in Rust funktioniert das wesentlich besser&lt;br /&gt;
    let y = x * 2;&lt;br /&gt;
&lt;br /&gt;
    // der letzte Ausdruck in einem Codeblock ist auch automatisch der Rückgabewert&lt;br /&gt;
    // Alternativ ist natürlich auch ein return 1:1 wie in C möglich&lt;br /&gt;
    5&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Generics, Closures (lambda functions), etc. ===&lt;br /&gt;
&lt;br /&gt;
Fast alle erweiterten Sprachkonstrukte können und werden im Embeddedbereich verwendet. Rust verfolgt generell ein Konzept von &amp;quot;Zero-cost abstractions&amp;quot;, also Abstraktion ohne Performanceeinbußen. Außer dynamischem Speicher (und selbst der, wenn man die Nachteile in Kauf nimmt) kann daher fast alles was Rust zu bieten hat auch verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=== Enums ===&lt;br /&gt;
&lt;br /&gt;
Enums sind vermutlich der gewaltigste Unterschied. In C sind enums eher eine Ansammlung von automatisch durchnummerierten Konstanten, während in Rust enums wesentlich mächtiger sind.&lt;br /&gt;
&lt;br /&gt;
Natürlich funktioniert der Standardfall in Rust genauso:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;rust&amp;quot;&amp;gt;&lt;br /&gt;
enum Foo {&lt;br /&gt;
    A,&lt;br /&gt;
    B,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
let foo = Foo::A;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Große Unterschied ist dass einzelne Varianten Daten haben können:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;rust&amp;quot;&amp;gt;&lt;br /&gt;
enum Foo {&lt;br /&gt;
    A(u8, bool),&lt;br /&gt;
    B{&lt;br /&gt;
        bar: u32,&lt;br /&gt;
    },&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
let foo = Foo::A(6, true);&lt;br /&gt;
let bar = Foo::B{bar: 7};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Prinzip verhält sich dieses Konstrukt wie ein C enum zusammen mit einer union über die Datenanhänge. Diese Struktur eignet sich hervorragend zur Implementierung von Zustandsautomaten.&lt;br /&gt;
&lt;br /&gt;
In der Standardbibliothek findet sich übrigens auch dieses extrem häufig verwendete enum: Option&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;rust&amp;quot;&amp;gt;&lt;br /&gt;
pub enum Option&amp;lt;T&amp;gt; {&lt;br /&gt;
    /// No value.&lt;br /&gt;
    None,&lt;br /&gt;
    /// Some value of type `T`.&lt;br /&gt;
    Some(T),&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Option&amp;lt;T&amp;gt; ist die Rust-entsprechung von null(-pointern). Anstatt den Fehler irgendwie in den Rückgabewert zu quetschen, wird der Rückgabewert in ein Option verpackt: z.B. Option&amp;lt;u32&amp;gt;. Dadurch ist klar erkennbar wenn in einer Funktion ein Fehler auftreten kann und ohne diesen Fall zu beachten kompiliert das Programm nicht. Daneben gibt es noch Result&amp;lt;R,E&amp;gt; mit einem expliziten Fehler E. Mehr dazu findet ihr in jeder Rust-einführung.&lt;br /&gt;
&lt;br /&gt;
Falls ihr euch Sorgen um den Speicherverbrauch macht, sobald T einen verbotenen Wert hat (z.B. 0 für eine Referenz (alle Referenzen in Rust sind garantiert gültig und daher nicht 0) oder 5 für einen bool), führt der Compiler automatisch eine sog. Nieschenoptimierung durch und verwendet genau diese Werte für None. Effektiv entsteht dann auch wieder ein NULLpointer, nur dass dieser auf jeden Fall explizit gehandhabt wird.&lt;br /&gt;
&lt;br /&gt;
== Asynchronität ==&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Zunächst einmal benötigt man natürlich den Rust-compiler selbst. Das empfohlene Weg dafür ist [https://rustup.rs/ rustup]. Mehr dazu findet ihr auf der [https://rust-lang.org/learn/get-started/ Rust webseite]&lt;br /&gt;
&lt;br /&gt;
Ein extra Buildsystem (z.B. Make) wie bei C benötigt ihr &#039;&#039;&#039;nicht&#039;&#039;&#039;, Rust bringt selber &#039;&#039;&#039;cargo&#039;&#039;&#039; mit, das sich auch noch um Packetdownloads kümmert.&lt;br /&gt;
&lt;br /&gt;
Für die Desktop-entwicklung hättet ihr nun alles beisammen, für die Emebdded-entiwcklung braucht ihr neben der Hardware (uC &amp;amp; Debugger) nur noch &#039;&#039;&#039;probe-rs&#039;&#039;&#039;, das ist so ähnlich wie AVRDude nur für Rust und 32-bit ARM. Folgt dazu einfach der Anleitung von Embassy https://embassy.dev/book/ , da gibt es auch gleich ein paar Beispielprogramme.&lt;br /&gt;
&lt;br /&gt;
== Beispiel für ein einfaches Programm ==&lt;br /&gt;
&lt;br /&gt;
== Weiterführende Links ==&lt;br /&gt;
&lt;br /&gt;
* [https://embassy.dev/ Embassy]: Das am häufigsten benutzte Framework für async Rust im Embeddedbereich&lt;br /&gt;
* [http://ptrace.fefe.de/ct-rust.html Was macht Rust, weshalb man es sich angucken sollte?]&lt;br /&gt;
* [https://www.reddit.com/r/rust/comments/10dhdys/rust_from_a_security_perspective_where_is_it/ Rust from a security perspective, where is it vulnerable?]&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/490782 Forumsbeitrag:] Erfahrungen mit Rust für Mikrocontroller&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/459037 Forumsbeitrag:] Rust auf AVR: AVR-Rust -&amp;gt; So geht&#039;s&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/rust-ist-das-hier-um-zu-bleiben Forumsbeitrag:] Rust - ist das hier um zu bleiben?&lt;/div&gt;</summary>
		<author><name>Hansschall</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Embedded-Rust&amp;diff=107790</id>
		<title>Embedded-Rust</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Embedded-Rust&amp;diff=107790"/>
		<updated>2025-11-29T19:59:23Z</updated>

		<summary type="html">&lt;p&gt;Hansschall: /* Unterschiede zu C / Rust-Crashkurs */ Inhalt einfügen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmiersprachen]]&lt;br /&gt;
Diese Seite ist aktuell noch im Aufbau&lt;br /&gt;
&lt;br /&gt;
== Warum Rust? ==&lt;br /&gt;
&lt;br /&gt;
C/C++ ist im Embedded-Bereich noch mehr als sonst der Quasi-Standard für Software aller Art. Versuche, modernere Programmiersprachen auf Mikrocontrollern zum laufen zu bringen sind bisher nur im Arduino-Umfeld bekannt geworden (siehe MicroPython) und mit erheblichen Performanceeinbußen verbunden (je nach Quelle 10-100x). Rust hingegen ist mit einer Performance die je nach Programmierstil zwischen C++ und besser als C (Ja, wirklich!) liegt deutlich konkurrenzfähig. Gleichzeitig bringt Rust eine moderne Syntax, ein hohes Abstraktionsniveau und sehr gute Tool-Integration mit.&lt;br /&gt;
&lt;br /&gt;
== Vorteile ==&lt;br /&gt;
&lt;br /&gt;
* Bei Rust immer zitiert: Speichersicherheit. In Rust stellt der sogenannte Borrow-Checker als Teil des Typsystems sicher, dass jedes Stück Daten genau einen Besitzer (Owner) und entweder mehrere lesbare Referenzen (borrow) oder eine einzige schreibbare Referenz (mutable borrow) hat. Außerdem stellt er sicher, dass nur valide Referenzen (in C Pointer) verwendet werden können. Sobald eine Variable ihren Gültigkeitsbereich verlässt wird (auch dynamisch allokierter) Speicher automatisch freigegeben. Letztendlich besitzt jedes (safe) Rust-Programm ohne Compilerfehler nachweißlich keine Speicherfehler.&lt;br /&gt;
* Borrow-Checker für Peripherals: Eine der genialsten Funktionen im Embedded-Bereich. Die Garantien für Speichersicherheit werden von den HALs auch für ganze Peripherals erzwungen. Auf diese Art ist es unmöglich einen Pin aus Versehen doppelt oder ohne vorherige Konfiguration zu benutzen. Was bei IOs noch einigermaßen von Hand zu lösen wäre, ist bei DMA-Channels eine echte Erleichterung.&lt;br /&gt;
* Durch das genauere Typsystem können vom Compiler einige Optimierungen durchgeführt werden, die in C nicht möglich wären (v.a. in Zusammenhang mit readonly Pointern)&lt;br /&gt;
* Fokussierung auf den Stack: In Rust läuft fast alles über den (schnellen und deterministischen) Stack. Sehr viele Embedded-Rust Programme (auch mit Netzwerk/BT/USB) haben überhaupt keinen Heap konfiguriert. Es spricht allerdings auch nichts dagegen einen zu verwenden&lt;br /&gt;
* Asynchrone Programmierung: Natürlich kann man auch in Rust blockierende Funktionen programmieren, aber async/await ermöglicht mit wenig Aufwand extrem effiziente Nebenläufigkeit ohne ein RTOS.&lt;br /&gt;
* Debugging: Neben dem Debugging mittels Breakpoints führt häufig auch ein einfaches println zu schnellem Erfolg. Allerdings sind Stringoperationen nicht gerade effizient. Für Rust-Nutzer gibt es da [https://docs.rs/defmt/latest/defmt/ defmt]. Dabei werden nur eine ID für jedes Log-Statement und die Formatierungsargumente in einen Ringpuffer geschrieben und vom Debugger ausgelesen. Die eigentliche - beliebig aufwendige - Formatierung erfolgt auf dem Hostrechner&lt;br /&gt;
&lt;br /&gt;
== Hardwareunterstützung ==&lt;br /&gt;
&lt;br /&gt;
* STM32: sehr gut, nicht nur für einzelne Chips&lt;br /&gt;
* RP2040/RP235x: sehr gut, aufgrund der großen Popularität des Raspberry Pico&lt;br /&gt;
* Nordic Semiconductor nrf: sehr gut, der Artikelautor hat aber keinerlei Erfahrungen mit nrf&lt;br /&gt;
* AVR: vom Compiler unterstützt, das HAL-Projekt ist aber etwas (sehr) eingeschlafen&lt;br /&gt;
* ESP32: sehr gut, wird von Espressif selbst unterstützt, wenn auch etwas gespalten zwischen pure-Rust(no_std)/ESP-IDF(std) und Xtensa/Risc-V&lt;br /&gt;
&lt;br /&gt;
== Unterschiede zu C / Rust-Crashkurs ==&lt;br /&gt;
&lt;br /&gt;
Wer wirklich Rust lernen will, sei auf die zahlreichen Ressourcen und vor allem [https://doc.rust-lang.org/book/ &amp;quot;The Book&amp;quot;] verwiesen.&lt;br /&gt;
&lt;br /&gt;
Im folgenden sollen kurz und knapp die wichtigsten und überraschensten Unterschiede zu C dargestellt werden, nachdem die meisten Leser hier vermutlich einen gewissen &amp;quot;C-Hintergrund&amp;quot; haben.&lt;br /&gt;
&lt;br /&gt;
=== Integertypen ===&lt;br /&gt;
&lt;br /&gt;
Rust verwendet immer explizite Integergrößen wie &#039;&#039;&#039;u32&#039;&#039;&#039; for einen unsigened 32-bit integer&lt;br /&gt;
&lt;br /&gt;
=== Typen ===&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zu C/C++ kommt in Rust der Typ immer &#039;&#039;&#039;nach&#039;&#039;&#039; dem Identifier.&lt;br /&gt;
&lt;br /&gt;
Aus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
byte foo(int x){&lt;br /&gt;
    int y = x * 2;&lt;br /&gt;
    return 5;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wird&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;rust&amp;quot;&amp;gt;&lt;br /&gt;
fn foo(x: i32) -&amp;gt; u8{&lt;br /&gt;
    //  ähnlich wie bei auto in C++ wird hier der Typ automatisch erkannt&lt;br /&gt;
    // nur in Rust funktioniert das wesentlich besser&lt;br /&gt;
    let y = x * 2;&lt;br /&gt;
&lt;br /&gt;
    // der letzte Ausdruck in einem Codeblock ist auch automatisch der Rückgabewert&lt;br /&gt;
    // Alternativ ist natürlich auch ein return 1:1 wie in C möglich&lt;br /&gt;
    5&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Generics, Closures (lambda functions), etc. ===&lt;br /&gt;
&lt;br /&gt;
Fast alle erweiterten Sprachkonstrukte können und werden im Embeddedbereich verwendet. Rust verfolgt generell ein Konzept von &amp;quot;Zero-cost abstractions&amp;quot;, also Abstraktion ohne Performanceeinbußen. Außer dynamischem Speicher (und selbst der, wenn man die Nachteile in Kauf nimmt) kann daher fast alles was Rust zu bieten hat auch verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=== Enums ===&lt;br /&gt;
&lt;br /&gt;
Enums sind vermutlich der gewaltigste Unterschied. In C sind enums eher eine Ansammlung von automatisch durchnummerierten Konstanten, während in Rust enums wesentlich mächtiger sind.&lt;br /&gt;
&lt;br /&gt;
Natürlich funktioniert der Standardfall in Rust genauso:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;rust&amp;quot;&amp;gt;&lt;br /&gt;
enum Foo {&lt;br /&gt;
    A,&lt;br /&gt;
    B,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
let foo = Foo::A;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Große Unterschied ist dass einzelne Varianten Daten haben können:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;rust&amp;quot;&amp;gt;&lt;br /&gt;
enum Foo {&lt;br /&gt;
    A(u8, bool),&lt;br /&gt;
    B{&lt;br /&gt;
        bar: u32,&lt;br /&gt;
    },&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
let foo = Foo::A(6, true);&lt;br /&gt;
let bar = Foo::B{bar: 7};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Prinzip verhält sich dieses Konstrukt wie ein C enum zusammen mit einer union über die Datenanhänge. Diese Struktur eignet sich hervorragend zur Implementierung von Zustandsautomaten.&lt;br /&gt;
&lt;br /&gt;
In der Standardbibliothek findet sich übrigens auch dieses extrem häufig verwendete enum: Option&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;rust&amp;quot;&amp;gt;&lt;br /&gt;
pub enum Option&amp;lt;T&amp;gt; {&lt;br /&gt;
    /// No value.&lt;br /&gt;
    None,&lt;br /&gt;
    /// Some value of type `T`.&lt;br /&gt;
    Some(T),&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Option&amp;lt;T&amp;gt; ist die Rust-entsprechung von null(-pointern). Anstatt den Fehler irgendwie in den Rückgabewert zu quetschen, wird der Rückgabewert in ein Option verpackt: z.B. Option&amp;lt;u32&amp;gt;. Dadurch ist klar erkennbar wenn in einer Funktion ein Fehler auftreten kann und ohne diesen Fall zu beachten kompiliert das Programm nicht. Daneben gibt es noch Result&amp;lt;R,E&amp;gt; mit einem expliziten Fehler E. Mehr dazu findet ihr in jeder Rust-einführung.&lt;br /&gt;
&lt;br /&gt;
Falls ihr euch Sorgen um den Speicherverbrauch macht, sobald T einen verbotenen Wert hat (z.B. 0 für eine Referenz (alle Referenzen in Rust sind garantiert gültig und daher nicht 0) oder 5 für einen bool), führt der Compiler automatisch eine sog. Nieschenoptimierung durch und verwendet genau diese Werte für None. Effektiv entsteht dann auch wieder ein NULLpointer, nur dass dieser auf jeden Fall explizit gehandhabt wird.&lt;br /&gt;
&lt;br /&gt;
== Asynchronität ==&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
== Beispiel für ein einfaches Programm ==&lt;br /&gt;
&lt;br /&gt;
== Weiterführende Links ==&lt;br /&gt;
&lt;br /&gt;
* [https://embassy.dev/ Embassy]: Das am häufigsten benutzte Framework für async Rust im Embeddedbereich&lt;br /&gt;
* [http://ptrace.fefe.de/ct-rust.html Was macht Rust, weshalb man es sich angucken sollte?]&lt;br /&gt;
* [https://www.reddit.com/r/rust/comments/10dhdys/rust_from_a_security_perspective_where_is_it/ Rust from a security perspective, where is it vulnerable?]&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/490782 Forumsbeitrag:] Erfahrungen mit Rust für Mikrocontroller&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/459037 Forumsbeitrag:] Rust auf AVR: AVR-Rust -&amp;gt; So geht&#039;s&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/rust-ist-das-hier-um-zu-bleiben Forumsbeitrag:] Rust - ist das hier um zu bleiben?&lt;/div&gt;</summary>
		<author><name>Hansschall</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Embedded-Rust&amp;diff=107789</id>
		<title>Embedded-Rust</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Embedded-Rust&amp;diff=107789"/>
		<updated>2025-11-29T19:02:40Z</updated>

		<summary type="html">&lt;p&gt;Hansschall: /* Weiterführende Links */ Embassy link hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmiersprachen]]&lt;br /&gt;
Diese Seite ist aktuell noch im Aufbau&lt;br /&gt;
&lt;br /&gt;
== Warum Rust? ==&lt;br /&gt;
&lt;br /&gt;
C/C++ ist im Embedded-Bereich noch mehr als sonst der Quasi-Standard für Software aller Art. Versuche, modernere Programmiersprachen auf Mikrocontrollern zum laufen zu bringen sind bisher nur im Arduino-Umfeld bekannt geworden (siehe MicroPython) und mit erheblichen Performanceeinbußen verbunden (je nach Quelle 10-100x). Rust hingegen ist mit einer Performance die je nach Programmierstil zwischen C++ und besser als C (Ja, wirklich!) liegt deutlich konkurrenzfähig. Gleichzeitig bringt Rust eine moderne Syntax, ein hohes Abstraktionsniveau und sehr gute Tool-Integration mit.&lt;br /&gt;
&lt;br /&gt;
== Vorteile ==&lt;br /&gt;
&lt;br /&gt;
* Bei Rust immer zitiert: Speichersicherheit. In Rust stellt der sogenannte Borrow-Checker als Teil des Typsystems sicher, dass jedes Stück Daten genau einen Besitzer (Owner) und entweder mehrere lesbare Referenzen (borrow) oder eine einzige schreibbare Referenz (mutable borrow) hat. Außerdem stellt er sicher, dass nur valide Referenzen (in C Pointer) verwendet werden können. Sobald eine Variable ihren Gültigkeitsbereich verlässt wird (auch dynamisch allokierter) Speicher automatisch freigegeben. Letztendlich besitzt jedes (safe) Rust-Programm ohne Compilerfehler nachweißlich keine Speicherfehler.&lt;br /&gt;
* Borrow-Checker für Peripherals: Eine der genialsten Funktionen im Embedded-Bereich. Die Garantien für Speichersicherheit werden von den HALs auch für ganze Peripherals erzwungen. Auf diese Art ist es unmöglich einen Pin aus Versehen doppelt oder ohne vorherige Konfiguration zu benutzen. Was bei IOs noch einigermaßen von Hand zu lösen wäre, ist bei DMA-Channels eine echte Erleichterung.&lt;br /&gt;
* Durch das genauere Typsystem können vom Compiler einige Optimierungen durchgeführt werden, die in C nicht möglich wären (v.a. in Zusammenhang mit readonly Pointern)&lt;br /&gt;
* Fokussierung auf den Stack: In Rust läuft fast alles über den (schnellen und deterministischen) Stack. Sehr viele Embedded-Rust Programme (auch mit Netzwerk/BT/USB) haben überhaupt keinen Heap konfiguriert. Es spricht allerdings auch nichts dagegen einen zu verwenden&lt;br /&gt;
* Asynchrone Programmierung: Natürlich kann man auch in Rust blockierende Funktionen programmieren, aber async/await ermöglicht mit wenig Aufwand extrem effiziente Nebenläufigkeit ohne ein RTOS.&lt;br /&gt;
* Debugging: Neben dem Debugging mittels Breakpoints führt häufig auch ein einfaches println zu schnellem Erfolg. Allerdings sind Stringoperationen nicht gerade effizient. Für Rust-Nutzer gibt es da [https://docs.rs/defmt/latest/defmt/ defmt]. Dabei werden nur eine ID für jedes Log-Statement und die Formatierungsargumente in einen Ringpuffer geschrieben und vom Debugger ausgelesen. Die eigentliche - beliebig aufwendige - Formatierung erfolgt auf dem Hostrechner&lt;br /&gt;
&lt;br /&gt;
== Hardwareunterstützung ==&lt;br /&gt;
&lt;br /&gt;
* STM32: sehr gut, nicht nur für einzelne Chips&lt;br /&gt;
* RP2040/RP235x: sehr gut, aufgrund der großen Popularität des Raspberry Pico&lt;br /&gt;
* Nordic Semiconductor nrf: sehr gut, der Artikelautor hat aber keinerlei Erfahrungen mit nrf&lt;br /&gt;
* AVR: vom Compiler unterstützt, das HAL-Projekt ist aber etwas (sehr) eingeschlafen&lt;br /&gt;
* ESP32: sehr gut, wird von Espressif selbst unterstützt, wenn auch etwas gespalten zwischen pure-Rust(no_std)/ESP-IDF(std) und Xtensa/Risc-V&lt;br /&gt;
&lt;br /&gt;
== Unterschiede zu C / Rust-Crashkurs ==&lt;br /&gt;
&lt;br /&gt;
== Asynchronität ==&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
== Beispiel für ein einfaches Programm ==&lt;br /&gt;
&lt;br /&gt;
== Weiterführende Links ==&lt;br /&gt;
&lt;br /&gt;
* [https://embassy.dev/ Embassy]: Das am häufigsten benutzte Framework für async Rust im Embeddedbereich&lt;br /&gt;
* [http://ptrace.fefe.de/ct-rust.html Was macht Rust, weshalb man es sich angucken sollte?]&lt;br /&gt;
* [https://www.reddit.com/r/rust/comments/10dhdys/rust_from_a_security_perspective_where_is_it/ Rust from a security perspective, where is it vulnerable?]&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/490782 Forumsbeitrag:] Erfahrungen mit Rust für Mikrocontroller&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/459037 Forumsbeitrag:] Rust auf AVR: AVR-Rust -&amp;gt; So geht&#039;s&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/rust-ist-das-hier-um-zu-bleiben Forumsbeitrag:] Rust - ist das hier um zu bleiben?&lt;/div&gt;</summary>
		<author><name>Hansschall</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Embedded-Rust&amp;diff=107526</id>
		<title>Embedded-Rust</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Embedded-Rust&amp;diff=107526"/>
		<updated>2025-05-27T16:16:21Z</updated>

		<summary type="html">&lt;p&gt;Hansschall: Neue Kapitel&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmiersprachen]]&lt;br /&gt;
Diese Seite ist aktuell noch im Aufbau&lt;br /&gt;
&lt;br /&gt;
== Warum Rust? ==&lt;br /&gt;
&lt;br /&gt;
C/C++ ist im Embedded-Bereich noch mehr als sonst der Quasi-Standard für Software aller Art. Versuche, modernere Programmiersprachen auf Mikrocontrollern zum laufen zu bringen sind bisher nur im Arduino-Umfeld bekannt geworden (siehe MicroPython) und mit erheblichen Performanceeinbußen verbunden (je nach Quelle 10-100x). Rust hingegen ist mit einer Performance die je nach Programmierstil zwischen C++ und besser als C (Ja, wirklich!) liegt deutlich konkurrenzfähig. Gleichzeitig bringt Rust eine moderne Syntax, ein hohes Abstraktionsniveau und sehr gute Tool-Integration mit.&lt;br /&gt;
&lt;br /&gt;
== Vorteile ==&lt;br /&gt;
&lt;br /&gt;
* Bei Rust immer zitiert: Speichersicherheit. In Rust stellt der sogenannte Borrow-Checker als Teil des Typsystems sicher, dass jedes Stück Daten genau einen Besitzer (Owner) und entweder mehrere lesbare Referenzen (borrow) oder eine einzige schreibbare Referenz (mutable borrow) hat. Außerdem stellt er sicher, dass nur valide Referenzen (in C Pointer) verwendet werden können. Sobald eine Variable ihren Gültigkeitsbereich verlässt wird (auch dynamisch allokierter) Speicher automatisch freigegeben. Letztendlich besitzt jedes (safe) Rust-Programm ohne Compilerfehler nachweißlich keine Speicherfehler.&lt;br /&gt;
* Borrow-Checker für Peripherals: Eine der genialsten Funktionen im Embedded-Bereich. Die Garantien für Speichersicherheit werden von den HALs auch für ganze Peripherals erzwungen. Auf diese Art ist es unmöglich einen Pin aus Versehen doppelt oder ohne vorherige Konfiguration zu benutzen. Was bei IOs noch einigermaßen von Hand zu lösen wäre, ist bei DMA-Channels eine echte Erleichterung.&lt;br /&gt;
* Durch das genauere Typsystem können vom Compiler einige Optimierungen durchgeführt werden, die in C nicht möglich wären (v.a. in Zusammenhang mit readonly Pointern)&lt;br /&gt;
* Fokussierung auf den Stack: In Rust läuft fast alles über den (schnellen und deterministischen) Stack. Sehr viele Embedded-Rust Programme (auch mit Netzwerk/BT/USB) haben überhaupt keinen Heap konfiguriert. Es spricht allerdings auch nichts dagegen einen zu verwenden&lt;br /&gt;
* Asynchrone Programmierung: Natürlich kann man auch in Rust blockierende Funktionen programmieren, aber async/await ermöglicht mit wenig Aufwand extrem effiziente Nebenläufigkeit ohne ein RTOS.&lt;br /&gt;
* Debugging: Neben dem Debugging mittels Breakpoints führt häufig auch ein einfaches println zu schnellem Erfolg. Allerdings sind Stringoperationen nicht gerade effizient. Für Rust-Nutzer gibt es da [https://docs.rs/defmt/latest/defmt/ defmt]. Dabei werden nur eine ID für jedes Log-Statement und die Formatierungsargumente in einen Ringpuffer geschrieben und vom Debugger ausgelesen. Die eigentliche - beliebig aufwendige - Formatierung erfolgt auf dem Hostrechner&lt;br /&gt;
&lt;br /&gt;
== Hardwareunterstützung ==&lt;br /&gt;
&lt;br /&gt;
* STM32: sehr gut, nicht nur für einzelne Chips&lt;br /&gt;
* RP2040/RP235x: sehr gut, aufgrund der großen Popularität des Raspberry Pico&lt;br /&gt;
* Nordic Semiconductor nrf: sehr gut, der Artikelautor hat aber keinerlei Erfahrungen mit nrf&lt;br /&gt;
* AVR: vom Compiler unterstützt, das HAL-Projekt ist aber etwas (sehr) eingeschlafen&lt;br /&gt;
* ESP32: sehr gut, wird von Espressif selbst unterstützt, wenn auch etwas gespalten zwischen pure-Rust(no_std)/ESP-IDF(std) und Xtensa/Risc-V&lt;br /&gt;
&lt;br /&gt;
== Unterschiede zu C / Rust-Crashkurs ==&lt;br /&gt;
&lt;br /&gt;
== Asynchronität ==&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
== Beispiel für ein einfaches Programm ==&lt;br /&gt;
&lt;br /&gt;
== Weiterführende Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://ptrace.fefe.de/ct-rust.html Was macht Rust, weshalb man es sich angucken sollte?]&lt;br /&gt;
* [https://www.reddit.com/r/rust/comments/10dhdys/rust_from_a_security_perspective_where_is_it/ Rust from a security perspective, where is it vulnerable?]&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/490782 Forumsbeitrag:] Erfahrungen mit Rust für Mikrocontroller&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/459037 Forumsbeitrag:] Rust auf AVR: AVR-Rust -&amp;gt; So geht&#039;s&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/rust-ist-das-hier-um-zu-bleiben Forumsbeitrag:] Rust - ist das hier um zu bleiben?&lt;/div&gt;</summary>
		<author><name>Hansschall</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Embedded-Rust&amp;diff=107518</id>
		<title>Embedded-Rust</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Embedded-Rust&amp;diff=107518"/>
		<updated>2025-05-19T18:49:11Z</updated>

		<summary type="html">&lt;p&gt;Hansschall: Vorteile Teil 2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Seite ist aktuell noch im Aufbau&lt;br /&gt;
&lt;br /&gt;
== Warum Rust? ==&lt;br /&gt;
&lt;br /&gt;
C/C++ ist im Embedded-Bereich noch mehr als sonst der Quasi-Standard für Software aller Art. Versuche, modernere Programmiersprachen auf Mikrocontrollern zum laufen zu bringen sind bisher nur im Arduino-Umfeld bekannt geworden (siehe MicroPython) und mit erheblichen Performanceeinbußen verbunden (je nach Quelle 10-100x). Rust hingegen ist mit einer Performance die je nach Programmierstil zwischen C++ und besser als C (Ja, wirklich!) liegt deutlich konkurrenzfähig. Gleichzeitig bringt Rust eine moderne Syntax, ein hohes Abstraktionsniveau und sehr gute Tool-Integration mit.&lt;br /&gt;
&lt;br /&gt;
== Vorteile ==&lt;br /&gt;
&lt;br /&gt;
* Bei Rust immer zitiert: Speichersicherheit. In Rust stellt der sogenannte Borrow-Checker als Teil des Typsystems sicher, dass jedes Stück Daten genau einen Besitzer (Owner) und entweder mehrere lesbare Referenzen (borrow) oder eine einzige schreibbare Referenz (mutable borrow) hat. Außerdem stellt er sicher, dass nur valide Referenzen (in C Pointer) verwendet werden können. Sobald eine Variable ihren Gültigkeitsbereich verlässt wird (auch dynamisch allokierter) Speicher automatisch freigegeben. Letztendlich besitzt jedes (safe) Rust-Programm ohne Compilerfehler nachweißlich keine Speicherfehler.&lt;br /&gt;
* Borrow-Checker für Peripherals: Eine der genialsten Funktionen im Embedded-Bereich. Die Garantien für Speichersicherheit werden von den HALs auch für ganze Peripherals erzwungen. Auf diese Art ist es unmöglich einen Pin aus Versehen doppelt oder ohne vorherige Konfiguration zu benutzen. Was bei IOs noch einigermaßen von Hand zu lösen wäre, ist bei DMA-Channels eine echte Erleichterung.&lt;br /&gt;
* Durch das genauere Typsystem können vom Compiler einige Optimierungen durchgeführt werden, die in C nicht möglich wären (v.a. in Zusammenhang mit readonly Pointern)&lt;br /&gt;
* Fokussierung auf den Stack: In Rust läuft fast alles über den (schnellen und deterministischen) Stack. Sehr viele Embedded-Rust Programme (auch mit Netzwerk/BT/USB) haben überhaupt keinen Heap konfiguriert. Es spricht allerdings auch nichts dagegen einen zu verwenden&lt;br /&gt;
* Asynchrone Programmierung: Natürlich kann man auch in Rust blockierende Funktionen programmieren, aber async/await ermöglicht mit wenig Aufwand extrem effiziente Nebenläufigkeit ohne ein RTOS.&lt;br /&gt;
* Debugging: Neben dem Debugging mittels Breakpoints führt häufig auch ein einfaches println zu schnellem Erfolg. Allerdings sind Stringoperationen nicht gerade effizient. Für Rust-Nutzer gibt es da defmt. Dabei werden nur eine ID für jedes Log-Statement und die Formatierungsargumente in einen Ringpuffer geschrieben und vom Debugger ausgelesen. Die eigentliche - beliebig aufwendige - Formatierung erfolgt auf dem Hostrechner&lt;br /&gt;
&lt;br /&gt;
== Hardwareunterstützung ==&lt;br /&gt;
&lt;br /&gt;
* STM32: sehr gut, nicht nur für einzelne Chips&lt;br /&gt;
* RP2040/RP235x: sehr gut, aufgrund der großen Popularität des Raspberry Pico&lt;br /&gt;
* Nordic Semiconductor nrf: sehr gut, der Artikelautor hat aber keinerlei Erfahrungen mit nrf&lt;br /&gt;
* AVR: vom Compiler unterstützt, das HAL-Projekt ist aber etwas (sehr) eingeschlafen&lt;br /&gt;
* ESP32: sehr gut, wird von Espressif selbst unterstützt, wenn auch etwas gespalten zwischen pure-Rust(no_std)/ESP-IDF(std) und Xtensa/Risc-V&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
== Beispiel für ein einfaches Programm ==&lt;/div&gt;</summary>
		<author><name>Hansschall</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Embedded-Rust&amp;diff=107517</id>
		<title>Embedded-Rust</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Embedded-Rust&amp;diff=107517"/>
		<updated>2025-05-19T18:30:41Z</updated>

		<summary type="html">&lt;p&gt;Hansschall: /* Hardwareunterstützung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Seite ist aktuell noch im Aufbau&lt;br /&gt;
&lt;br /&gt;
== Warum Rust? ==&lt;br /&gt;
&lt;br /&gt;
C/C++ ist im Embedded-Bereich noch mehr als sonst der Quasi-Standard für Software aller Art. Versuche, modernere Programmiersprachen auf Mikrocontrollern zum laufen zu bringen sind bisher nur im Arduino-Umfeld bekannt geworden (siehe MicroPython) und mit erheblichen Performanceeinbußen verbunden (je nach Quelle 10-100x). Rust hingegen ist mit einer Performance die je nach Programmierstil zwischen C++ und besser als C (Ja, wirklich!) liegt deutlich konkurrenzfähig. Gleichzeitig bringt Rust eine moderne Syntax, ein hohes Abstraktionsniveau und sehr gute Tool-Integration mit.&lt;br /&gt;
&lt;br /&gt;
== Vorteile ==&lt;br /&gt;
&lt;br /&gt;
* Bei Rust immer zitiert: Speichersicherheit. In Rust stellt der sogenannte Borrow-Checker als Teil des Typsystems sicher, dass jedes Stück Daten genau einen Besitzer (Owner) und entweder mehrere lesbare Referenzen (borrow) oder eine einzige schreibbare Referenz (mutable borrow) hat. Außerdem stellt er sicher, dass nur valide Referenzen (in C Pointer genannt) verwendet werden können. Sobald eine Variable ihren Gültigkeitsbereich verlässt wird (auch dynamisch allokierter) Speicher automatisch freigegeben. Letztendlich besitzt jedes (safe) Rust-Programm ohne Compilerfehler nachweißlich keine Speicherfehler.&lt;br /&gt;
* Borrow-Checker für Peripherals: Eine der genialsten Funktionen im Embedded-Bereich. Die Garantien für Speichersicherheit werden von den HALs auch für ganze Peripherals erzwungen. Auf diese Art ist es unmöglich einen Pin aus Versehen doppelt oder ohne vorherige Konfiguration zu benutzen. Was bei IOs noch einigermaßen von Hand zu lösen wäre, ist bei DMA-Channels eine echte Erleichterung.&lt;br /&gt;
* Durch das genauere Typsystem können vom Compiler einige Optimierungen durchgeführt werden, die in C nicht möglich wären (v.a. in Zusammenhang mit readonly Pointern)&lt;br /&gt;
* Fokussierung auf den Stack: In Rust läuft fast alles über den (schnellen und deterministischen) Stack. Sehr viele Embedded-Rust Programme haben überhaupt keinen Heap konfiguriert. Es spricht allerdings auch nichts dagegen einen zu verwenden&lt;br /&gt;
&lt;br /&gt;
== Hardwareunterstützung ==&lt;br /&gt;
&lt;br /&gt;
* STM32: sehr gut, nicht nur für einzelne Chips&lt;br /&gt;
* RP2040/RP235x: sehr gut, aufgrund der großen Popularität des Raspberry Pico&lt;br /&gt;
* Nordic Semiconductor nrf: sehr gut, der Artikelautor hat aber keinerlei Erfahrungen mit nrf&lt;br /&gt;
* AVR: vom Compiler unterstützt, das HAL-Projekt ist aber etwas (sehr) eingeschlafen&lt;br /&gt;
* ESP32: sehr gut, wird von Espressif selbst unterstützt, wenn auch etwas gespalten zwischen pure-Rust(no_std)/ESP-IDF(std) und Xtensa/Risc-V&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
== Beispiel für ein einfaches Programm ==&lt;/div&gt;</summary>
		<author><name>Hansschall</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Embedded-Rust&amp;diff=107516</id>
		<title>Embedded-Rust</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Embedded-Rust&amp;diff=107516"/>
		<updated>2025-05-19T18:11:45Z</updated>

		<summary type="html">&lt;p&gt;Hansschall: Vorteile v1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Seite ist aktuell noch im Aufbau&lt;br /&gt;
&lt;br /&gt;
== Warum Rust? ==&lt;br /&gt;
&lt;br /&gt;
C/C++ ist im Embedded-Bereich noch mehr als sonst der Quasi-Standard für Software aller Art. Versuche, modernere Programmiersprachen auf Mikrocontrollern zum laufen zu bringen sind bisher nur im Arduino-Umfeld bekannt geworden (siehe MicroPython) und mit erheblichen Performanceeinbußen verbunden (je nach Quelle 10-100x). Rust hingegen ist mit einer Performance die je nach Programmierstil zwischen C++ und besser als C (Ja, wirklich!) liegt deutlich konkurrenzfähig. Gleichzeitig bringt Rust eine moderne Syntax, ein hohes Abstraktionsniveau und sehr gute Tool-Integration mit.&lt;br /&gt;
&lt;br /&gt;
== Vorteile ==&lt;br /&gt;
&lt;br /&gt;
* Bei Rust immer zitiert: Speichersicherheit. In Rust stellt der sogenannte Borrow-Checker als Teil des Typsystems sicher, dass jedes Stück Daten genau einen Besitzer (Owner) und entweder mehrere lesbare Referenzen (borrow) oder eine einzige schreibbare Referenz (mutable borrow) hat. Außerdem stellt er sicher, dass nur valide Referenzen (in C Pointer genannt) verwendet werden können. Sobald eine Variable ihren Gültigkeitsbereich verlässt wird (auch dynamisch allokierter) Speicher automatisch freigegeben. Letztendlich besitzt jedes (safe) Rust-Programm ohne Compilerfehler nachweißlich keine Speicherfehler.&lt;br /&gt;
* Borrow-Checker für Peripherals: Eine der genialsten Funktionen im Embedded-Bereich. Die Garantien für Speichersicherheit werden von den HALs auch für ganze Peripherals erzwungen. Auf diese Art ist es unmöglich einen Pin aus Versehen doppelt oder ohne vorherige Konfiguration zu benutzen. Was bei IOs noch einigermaßen von Hand zu lösen wäre, ist bei DMA-Channels eine echte Erleichterung.&lt;br /&gt;
* Durch das genauere Typsystem können vom Compiler einige Optimierungen durchgeführt werden, die in C nicht möglich wären (v.a. in Zusammenhang mit readonly Pointern)&lt;br /&gt;
* Fokussierung auf den Stack: In Rust läuft fast alles über den (schnellen und deterministischen) Stack. Sehr viele Embedded-Rust Programme haben überhaupt keinen Heap konfiguriert. Es spricht allerdings auch nichts dagegen einen zu verwenden&lt;br /&gt;
&lt;br /&gt;
== Hardwareunterstützung ==&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
== Beispiel für ein einfaches Programm ==&lt;/div&gt;</summary>
		<author><name>Hansschall</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Embedded-Rust&amp;diff=107515</id>
		<title>Embedded-Rust</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Embedded-Rust&amp;diff=107515"/>
		<updated>2025-05-19T17:33:39Z</updated>

		<summary type="html">&lt;p&gt;Hansschall: Einleitung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Seite ist aktuell noch im Aufbau&lt;br /&gt;
&lt;br /&gt;
== Warum Rust? ==&lt;br /&gt;
&lt;br /&gt;
C/C++ ist im Embedded-Bereich noch mehr als sonst der Quasi-Standard für Software aller Art. Versuche, modernere Programmiersprachen auf Mikrocontrollern zum laufen zu bringen sind bisher nur im Arduino-Umfeld bekannt geworden (siehe MicroPython) und mit erheblichen Performanceeinbußen verbunden (je nach Quelle 10-100x). Rust hingegen ist mit einer Performance die je nach Programmierstil zwischen C++ und besser als C (Ja, wirklich!) liegt deutlich konkurrenzfähig. Gleichzeitig bringt Rust eine moderne Syntax, ein hohes Abstraktionsniveau und sehr gute Tool-Integration mit.&lt;/div&gt;</summary>
		<author><name>Hansschall</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Pegelwandler&amp;diff=107225</id>
		<title>Pegelwandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Pegelwandler&amp;diff=107225"/>
		<updated>2025-01-03T14:19:28Z</updated>

		<summary type="html">&lt;p&gt;Hansschall: Einleitung überarbeitet&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Pegelwandler(engl. level shifter) sind immer dann notwendig, wenn Systeme mit unterschiedlichen Ausgangs- und Eingangsspannungen (z.&amp;amp;nbsp;B. Versorgungs- oder Logikspannungen) miteinander verbunden werden sollen. Der inzwischen wohl häufigste Anwendungsfall ist die Verschaltung von 3.3V und 5V-Bauteilen. Folgende Probleme können dabei auftreten:&lt;br /&gt;
&lt;br /&gt;
# Überlastung einer oder beider Seiten, bis hin zur Zerstörung&lt;br /&gt;
# Inkompatible Logikpegel und daraus resultierendes Nichtfunktionieren der Schaltung, oder noch schlimmer, sporadische Fehlfunktionen&lt;br /&gt;
# Verzögerungen der Signale durch die Pegelwandlung und daraus resultierende maximale Signalfrequenzen&lt;br /&gt;
&lt;br /&gt;
=== Schutzdioden ===&lt;br /&gt;
&lt;br /&gt;
Hauptursache für Überlastung von ICs mit verschiedenen Betriebsspannungen sind die in nahezu allen ICs integrierten Schutzdioden. Deren Aufgabe ist es in Normalfall, elektrostatische Entladungen (z.b. durch Anfassen) auf eine sichere Spannung zu begrenzen. Die Schutzdioden beginnen, Strom zu leiten, wenn die Eingangsspannung ca. 300 mV - 600 mV über U&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt; ansteigt oder entsprechend unter GND absinkt.&lt;br /&gt;
&lt;br /&gt;
Wenn nun z.B. 5V an einen Pin angelegt werden, der nur auf 3.3V ausgelegt ist, versuchen die Schutzdioden diese 5V abzuleiten. Dabei wird sowohl der Ausgang des Chips überlastet der das Signal bereitstellt, als auch die Schutzdioden, die im meistens nur wenige mA aushalten. Dabei weden im Regelfall die jeweiligen Pins und oft auch größere Teile der beteiligten Chips zerstört.&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_schutzdioden.png]]&lt;br /&gt;
&lt;br /&gt;
=== 5-V-tolerante Eingänge ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;5-Volt-tolerant&amp;lt;/i&amp;gt; bedeutet, dass 3.3V(oder niedriger)-Bausteine ohne Probleme von einem 5V-Baustein angesteuert werden dürfen.&lt;br /&gt;
&lt;br /&gt;
Manche Bauteile mit einer Betriebsspannung von 3V verfügen über 5V-tolerante Eingänge. Ob ein Bauteil 5V-tolerant ist und unter welchen Betriebsbedingungen das gilt, steht im Datenblatt des betreffenden Bauteils. Wenn es auf diese Eigenschaft ankommt, lieber genau bei Lieferanten nachsehen, von welchem Hersteller die Bauteile kommen. Gerde in dieser Hinsicht unterscheiden sich oft die Versionen verschiedener Hersteller.&lt;br /&gt;
&lt;br /&gt;
==== Beispiele für &#039;&#039;&#039;NICHT&#039;&#039;&#039; 5V-tolerante Bauteile ====&lt;br /&gt;
&lt;br /&gt;
* [[AVR]]s (außer natrlich, sie werden mit 5V betrieben)&lt;br /&gt;
* RaspberryPi&lt;br /&gt;
* Die meisten Standard-CMOS-Logikbausteine (74HC)&lt;br /&gt;
* Alles andere was nicht explizit dafür freigegeben wurde&lt;br /&gt;
&lt;br /&gt;
==== Beispiele für 5V-Tolerante Bauteile ====&lt;br /&gt;
&lt;br /&gt;
* manche STM32&lt;br /&gt;
* WizNet W5500&lt;br /&gt;
&lt;br /&gt;
=== Kompatibilität von Logikpegeln ===&lt;br /&gt;
&lt;br /&gt;
Verschiedene Logikfamilien haben unterschiedliche Anforderungen an ihre Eingangssignale, bei einer Wandlung von kleinerer zu größerer Spannung kann es daher Vorkommen, dass die Schaltschwellen nicht erricht werden.&lt;br /&gt;
&lt;br /&gt;
Besonders trickreich ist der häufige Fall 3.3V -&amp;gt; 5V, da es oft scheinbar ohne zusätzliche Schaltungen funktioniert, jedoch die offiziellen 5V-Schaltschwellen nicht oder nur sehr knapp erreicht werden. Kleine Schwankungen in der Versorgungsspannung oder Fertigungstoleranzen können dann schwer zu findende sporadische Fehlfunktionen auslösen.&lt;br /&gt;
&lt;br /&gt;
== UNIDIREKTIONAL ==&lt;br /&gt;
&lt;br /&gt;
=== 1,8 V ⇒ 5 V ===&lt;br /&gt;
&lt;br /&gt;
* Die besondere Eigenschaft der alten TTL-Schaltkreise, nämlich dass Strom bei LOW &#039;&#039;&#039;aus&#039;&#039;&#039; dem Eingang in den treibenden Ausgang fließt kann man sich zunutze machen, wie die nachfolgende Schaltung zeigt. In dieser wird der HIGH-Pegel des 1,8-V-Signals durch eine Schottkydiode um ca. 0,3 V auf 2,1 V erhöht. Damit ist man fast offiziell im HIGH-Bereich für TTL (Schaltschwelle 1,4 V, HIGH &amp;gt; 2,0 V). Der LOW-Pegel wird auf ca. 0,3 V erhöht, was voll den TTL-Richtlinien entspricht. Als Schaltkreisfamilie &#039;&#039;&#039;muss&#039;&#039;&#039; ein [[74xx|TTL-Typ]] eingesetzt werden, also LS, F, AS oder ähnlich. CMOS-Typen wie HC, LVC etc. funktionieren &#039;&#039;&#039;nicht&#039;&#039;&#039;!&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_LS.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=FF0000&amp;gt;Achtung&amp;lt;/font&amp;gt;: Diese Schaltung entspricht bei HIGH ungefähr einem offenen TTL-Eingang, was zwar meistens funktioniert, aber etwas störempfindlich sein kann. Davon wurde in der TTL-Ära stets abgeraten. Zudem ist der Pegelwechsel LOW nach HIGH durch den niedrigen Strom eher langsam. Man kann das jedoch mit einem Pullup-Widerstand absichern. Dann sind auch Gatter der 74HCT-Reihe einsetzbar.&lt;br /&gt;
&lt;br /&gt;
=== 3,3 V ⇒ 5 V ===&lt;br /&gt;
&lt;br /&gt;
Diese Konversion ist mit Abstand die häufigste. Dabei kann man getrost 3,3 V (früher) und 3 V (moderner) gleich setzen.&lt;br /&gt;
&lt;br /&gt;
* 3,3-V-Pegel werden bei TTL-kompatiblen Eingängen richtig erkannt (Schaltschwelle 1,4 V). Es ist kein Pegelwandler erforderlich. Direkte Verbindung. Einer der großen Vorteile klassischer TTL-Technik!&lt;br /&gt;
&lt;br /&gt;
* 5-V-CMOS Eingänge haben typisch eine minimale Eingangsspannug für HIGH (&amp;lt;math&amp;gt;V_{IH}&amp;lt;/math&amp;gt;) von 0.6 * U&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt; = 0.6 * 5 V = 3 V. Das kann ein 3,3-V-CMOS-Ausgang direkt treiben, allerdings kann sich das Zeitverhalten dadurch etwas ändern, weil der HIGH Pegel später erkannt wird. Vorsicht! Viele 5-V-CMOS-ICs wollen für HIGH offiziell mindestens 0,7 * U&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt; = 3,5 V oder manche auch 0,8 * U&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt; = 4,0V! Das geht dann offiziell nicht mehr mit einem 3,3-V-Ausgang! Für Hobbyzwecke kann man das aber ggf. probieren.&lt;br /&gt;
Zu beachten ist, dass der nicht ganz nach High durchgesteuerte Eingang Querstrom von der Speisespannung ziehen kann. Das kann für batteriebetriebene Geräte oder USB-konformes Standby durchaus ausschlaggebend sein.&lt;br /&gt;
&lt;br /&gt;
Möglich ist auch eine &#039;&#039;&#039;Zentrierung&#039;&#039;&#039; des Ausgangspegels mit 2 Widerständen wie im folgenden linken Bild. Allerdings besteht die Gefahr, dass die 3,3-V-Versorgung hochläuft, da Spannungsregler (hier: für die 3,3 V) nicht dafür ausgelegt sind, bei Überspannung an deren Ausgang zusätzlich Strom nach Masse abzuleiten: Die 3,3-V-Verbraucher müssen bei High eine Mindestlast erbringen, etwa mit einem zusätzlichen Widerstand &#039;&#039;&#039;R3&#039;&#039;&#039; vom Ausgang nach GND.&lt;br /&gt;
&lt;br /&gt;
[[bild:Zentrierung-3P3-5P.png]] [[bild:Zentrierung-3P3-5P-R3.png]]&lt;br /&gt;
&lt;br /&gt;
* 3,3-V-[[Ausgangsstufen_Logik-ICs | Open Collector]] nach 5 V (TTL oder CMOS): Einfach einen Pull-Up Widerstand hinzufügen und gut. Allerdings verbraucht der Pull-Up-Widerstand bei LOW auf jeden Fall Strom und begrenzt bei HIGH den maximalen Gate-Umladestrom. Die Schaltgeschwindigkeit von LOW nach HIGH wird durch die Größe des Pull-Ups bestimmt. Je nach Geschwindigkeitsanforderungen kann der in Mikrocontrollern meistens zuschaltbare innere Widerstand dazu benutzt werden. Zudem kann dieser, bei bekannt LOW bleibendem Eingangspegel, zur Reduktion der Stromaufnahme abgeschaltet werden. Bipolare TTL-Schaltkreise benötigen in der Bastelschaltung keinen Pull-Up (liefern Strom); bei Schaltungen mit erhöhter Zuverlässigkeit ist dennoch ein externer Pull-Up angeraten (Richtwert 4,7 kΩ).&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_oc_3-5.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Das Simulieren von Open Collector in Mikrocontrollern oder mittels Tristate-Treibern oder die Verwendung von Open-Collector-Ausgängen von Schaltkreisen, bei denen keine höhere Ausgangsspannung spezifiziert ist (etwa 74HC03), ist für diesen Zweck unzulässig und wenig hilfreich, weil Gateschutzdioden und andere parasitäre Siliziumstrukturen den Strom aus dem Widerstand nach 3,3 V ableiten und so maximal 4 V generieren. Auch hier besteht die Gefahr des Hochlaufens der 3,3-V-Versorgung.&lt;br /&gt;
&lt;br /&gt;
* 3,3 V auf echte 5 V (CMOS) geht am einfachsten mit einem Baustein der HCT-Familie (NICHT HC!). Diese haben TTL-kompatible Eingänge und echte CMOS-Ausgänge&lt;br /&gt;
&lt;br /&gt;
* Man kann einen Komparator &amp;lt;small&amp;gt;in nichtinvertierender Schaltung&amp;lt;/small&amp;gt; benutzen (LM339/393). Allerdings ist diese Lösung relativ langsam, abhängig vom verwendeten Komparator. Komparatoren bieten eine freie Wahl des Eingangsspannungsbereichs und sind deshalb eine gute Wahl bei &#039;&#039;variabler&#039;&#039; Speisespannung der Treiberseite.&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_comp_3-5.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bauteile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/part/74HCT245 74HCT245], [http://www.mikrocontroller.net/part/74HCT244 74HCT244]oder [http://www.mikrocontroller.net/part/74HCT240 74HCT240] (Das &#039;&#039;&#039;T&#039;&#039;&#039; ist wichtig. HCs können funktionieren, sind aber suboptimal, da bei 5V Versorgung und höheren Temperaturen U&amp;lt;sub&amp;gt;input,high&amp;lt;/sub&amp;gt; = 3,2 V)&lt;br /&gt;
* [http://www.mikrocontroller.net/part/74HCT125 74HCT125]: OE Pins auf Masse und dann das Signal einfach anschließen. &lt;br /&gt;
* SN74LVC07AD &lt;br /&gt;
* SN74LV1T04 (auch geeignet zur umgekehrten Konvertierung (5 V ⇒ 3,3 V))&lt;br /&gt;
* 74V1T126 (single Gatter, U&amp;lt;sub&amp;gt;input,high&amp;lt;/sub&amp;gt; = 2 V)&lt;br /&gt;
&lt;br /&gt;
=== 5 V ⇒ 9..15(..30) V ===&lt;br /&gt;
&lt;br /&gt;
* Am einfachsten geht das mit einem (geeigneten!) Open-Collector-Ausgang, einfach einen Pull-Up hinzufügen (an die hohe Spannung) und fertig. Ein 74&#039;&#039;xx&#039;&#039;03 geht hier nicht! Auch kann man nicht einen Push-Pull-Ausgang eines Mikrocontrollers dafür verwenden, indem man den Ausgang bei HIGH zum Eingang macht.&lt;br /&gt;
Hintergrund sind parasitäre Dioden zwischen Ausgang und Speisespannung.&lt;br /&gt;
Alle (geeigneten) Treiberausgänge haben eine maximal erlaubte Kollektorspannung, die zu beachten ist. Mehr Freiheit hat man bei der Verwendung von Einzeltransistoren, wobei eine gewisse Lücke von 30 V bis 200 V von Bipolartransistoren dominiert wird; für kleinere oder größere Spannungen gibt es preiswerte MOSFETs. (Die Lücke entsteht durch den geringen Bedarf des Weltmarktes an diesen Kollektorspannungen.)&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_oc_5-12.png]]&lt;br /&gt;
&lt;br /&gt;
* Man kann einen Komparator benutzen. Allerdings ist diese Lösung relativ langsam, abhängig vom verwendeten Komparator. Wenn nur zwei Signale gewandelt werden müssen bietet sich der LM393 an, ein Doppelkomparator mit Open-Collector-Ausgang, mit dem man auf einen beliebigen Pegel ausgeben kann. Der LM339 (man beachte den unauffälligen Zahlendreher) ist ein Vierfachkomparator mit den gleichen Eigenschaften. Wenn wenig Platz vorhanden ist, dann ist der TL311 im winzigen SOT-23 Gehäuse sehr empfehlenswert. Bei jedem Komparator kann auch einfach eine Invertierung gemacht werden, einfach die Eingänge + und - vertauschen. Diese Komparatoren eignen sich bis ca. 1 MHz.&lt;br /&gt;
&lt;br /&gt;
* [http://www.elektronik-kompendium.de/sites/praxis/bausatz_pegelwandler-mit-transistoren.htm Pegelwandler mit Transistor, invertierend]&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_trans_inv.png]]&lt;br /&gt;
&lt;br /&gt;
* Pegelwandler mit Transistor, nicht invertierend&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_trans_ni.png]]&lt;br /&gt;
&lt;br /&gt;
Die Idee ist einfach. Wenn der Ausgang des 5-V-Gatters auf HIGH ist dann ist der Transistor ausgeschaltet, der Pull-Up-Widerstand R7 zieht den Ausgang auf + 12 V. Ist der Ausgang des 5-V-Gatters auf LOW ist, dann ist er vollkommen durchgesteuert und der Ausgang nahe 0 V (je nach Typ ca. 300 mV). Der Vorteil ist hier erhöhte Störsicherheit im Gegensatz zur einfachen Ansteuerung der Basis über einen Vorwiderstand. Außerdem wird dadurch nicht die Logik invertiert. Nachteilig ist der geringe Strom, der bei HIGH zur Verfügung steht (typisch 100 µA). Diese Schaltung ist die seltene Anwendung einer Basisschaltung für digitale Signale. Der Vorteil der Basisschaltung ist die höhere Grenzfrequenz durch die herabgesetzte Wirksamkeit der (störenden) Miller-Kapazität.&lt;br /&gt;
&lt;br /&gt;
* Wenn mehr Geschwindigkeit, Ausgangsstrom und weniger Stromverbrauch nötig ist, dann muss ein spezieller Baustein her, wie z.&amp;amp;nbsp;B.&amp;lt;BR&amp;gt;&amp;lt;BR&amp;gt;&lt;br /&gt;
** [[Mosfet-Übersicht#Mosfet-Treiber|MOSFET-Treiber]] z.B. ICL7667&lt;br /&gt;
** [[H-Brücken Übersicht | Motortreiber]] ICs: (z.&amp;amp;nbsp;B. L293, L298, UCC27325 und deren Verwandte), wenns nicht zu schnell ist (einige Dutzend kHz)&lt;br /&gt;
** CD40109, 4fach Pegelwandler, bei Reichelt verfügbar&lt;br /&gt;
** HEF4104, 4fach Pegelwandler mit normalen und invertierten Ausgängen sowie Tristate. Um ggf. sicherzustellen, dass wie im Datenblatt beschrieben immer U&amp;lt;sub&amp;gt;DDI&amp;lt;/sub&amp;gt; &amp;lt;= U&amp;lt;sub&amp;gt;DDO&amp;lt;/sub&amp;gt; ist, kann man einfach eine Diode von U&amp;lt;sub&amp;gt;DDO&amp;lt;/sub&amp;gt; nach U&amp;lt;sub&amp;gt;DDI&amp;lt;/sub&amp;gt; schalten (z.&amp;amp;nbsp;B. Schottky SB120, aber auch 1N4148 &amp;amp; Co. sollte problemlos funktionieren)&lt;br /&gt;
** CD4504, 6fach Pegelwandler 3-20V, Eingangspegel TTL oder CMOS (umschaltbar) =&amp;gt; CMOS, keine Reihenfolge von U&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt;/U&amp;lt;sub&amp;gt;EE&amp;lt;/sub&amp;gt; erforderlich (Bezugsquelle: CSD)&lt;br /&gt;
** MAX232, der braucht nur 5 V Versorgungsspannung. Allerdings ist der Ausgangswiderstand relativ hoch (ca. 300 Ω) und man kann nur ca. 5 mA Ausgangstrom liefern. Die Ausgangsspannung beträgt maximal 10 V.&lt;br /&gt;
&lt;br /&gt;
=== 5 V ⇒ 3,3 V ===&lt;br /&gt;
&lt;br /&gt;
Ob 3,3 V (klassisch) oder 3 V (modern) ist bei dieser Betrachtung nahezu egal.&lt;br /&gt;
&lt;br /&gt;
* Zuerst sollte man prüfen, ob die Eingänge 5V-tolerant sind. Dann kann man die ICs direkt verbinden. Sehr schnell und billig!&lt;br /&gt;
&lt;br /&gt;
* Wenn die Eingänge nicht 5-V-tolerant sind und es trotzdem schnell sein soll, muss ein Gatter aus der LVC- oder AHC-Familie dazwischen geschaltet werden, also eines mit 5V-Toleranz. Bei 3 V Betriebsspannung kann man problemlos 5 V an den Eingang anlegen. Der Baustein 74HC4050 erlaubt per Definition eine Pegelwandlung bis etwa 15 V (siehe Datenblatt). Beide Anordungen haben auch eine sehr niedrige Ruhestromaufnahme.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Bauteile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:* 74LVC245A (&#039;A&#039; ist wichtig, I/Os 5V-tolerant)&lt;br /&gt;
:* 74LVC245DW &lt;br /&gt;
:* 74LVT245 &lt;br /&gt;
:* 74LVXxxx (245, 244, 240 ...) an Vcc=3,3V. Achtung: Nicht alle 74LVX sind für 5V -&amp;gt; 3,3V geeignet, da jeder Hersteller die ICs anders baut!&lt;br /&gt;
:** 74LVX04 &lt;br /&gt;
:** 74LVX244 (Fairchild)&lt;br /&gt;
:** 74LVX245 (nicht von Reichelt, nicht 5V tolerant)&lt;br /&gt;
:** bei TI heissen die 74LVX... nur 74LV...&lt;br /&gt;
&lt;br /&gt;
:* 74HC4050 (bis 15 V Step-Down-Pegelwandlung laut Datenblatt, bei Reichelt in DIP und SO erhältlich)&lt;br /&gt;
:* MAX3373/MAX3375&lt;br /&gt;
:* NC7SZ08 oder andere aus derselben Serie. CMOS-Logik mit 5-V-toleranten Eingängen, recht flott und braucht dank SOT-23 auch wenig Platz auf der Platine&lt;br /&gt;
&lt;br /&gt;
* 5 V Open Collector auf 3,3-V-Eingang. Einfach einen Pull-Up hinzufügen (Pull-Up liegt auf 3,3 V). Nachteilig ist der relativ hohe Stromverbrauch bei LOW, die begrenzte Geschwindigkeit bei hochohmigen Pull-Ups und der relativ geringe Ausgangsstrom bei HIGH (abhängig vom Pull-Up).&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_oc_5-3.png]]&lt;br /&gt;
&lt;br /&gt;
* Spannungsteiler mit 680 Ω und 1 kΩ. Der Nachteil dieser Lösung ist der relativ hohe Stromverbrauch (~3mA), der relativ geringe Ausgangsstrom (mehr als 200..300 µA sollte man da nicht rausziehen) und die relativ geringe Geschwindigkeit (ca. 10 MHz).&lt;br /&gt;
&lt;br /&gt;
[[Datei:SPI level shifter with resistor divider.png|miniatur|rechts|fehlerhafter SPI-Takt nach Pegelwandler mit Widerstandsteiler (1,8/3,3 kΩ)&amp;lt;br /&amp;gt;unten: 5V-Ausgang am Mikrocontroller&amp;lt;br /&amp;gt;&lt;br /&gt;
oben: 3,3V-Eingang an der SD-Karte nach Pegelwandler]]&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_st_5-3.png]]&lt;br /&gt;
&lt;br /&gt;
* 1 kΩ Vorwiderstand. Dadurch wird der Strom vom 5-V-Ausgang in die 3,3-V-Versorgung durch die internen Schutzdioden auf ca. 1 mA begrenzt. Diese Lösung ist auch relativ langsam (ca. 5MHz). Ggf. kann man den Vorwiderstand auf 100 Ω reduzieren, das erhöht dann wieder die Geschwindigkeit. Aufpassen, einige ICs vertragen nur 1 mA oder weniger durch die Schutzdioden! Ausserdem muss man aufpassen, da jetzt von der 5-V-Seite Strom in die 3,3-V-Versorgung eingespeist wird. Besonders in Schaltungen mit sehr niedriger Stromaufnahme kann das zum Problem werden, wenn die Stromaufnahme geringer ist, als über die Vorwiderstände eingespeist wird. Dann nimmt es meist der Spannungsregler für 3,3 V übel wenn jemand „schiebt“, sprich, Strom einspeist. Denn die allermeisten Spannungsregler können nur Strom liefern (source), aber keinen Strom aufnehmen (sink). Es gibt 4-fach-Diodennetzwerke, die die internen Schutzdioden entlasten können (Schottkydioden mit kleinerer Flusspannung von ≈ 0,3 V als die internen Silizizumdioden mit ≈ 0,7 V), außerdem ist teilweise noch eine [[Diode#Z-Diode|Zenerdiode]] enthalten, die ggf. den überschüssig eingespeisten Strom aufnehmen kann.&lt;br /&gt;
&lt;br /&gt;
Alle Lösungen mit Vorwiderständen reduzieren die Flankensteilheit der Signale. Dies kann bei Takt- und Zähleingängen zu unerwünschten Schwingungen und damit Fehlzählungen führen. Derartig benutzte Eingänge sollten Schmitt-Trigger-Verhalten aufweisen.&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_vw_5-3.png]]&lt;br /&gt;
&lt;br /&gt;
Achtung: Mindestens für 74HC(T) Gatter ist dokumentiert (Philips 74HC/T High-Speed CMOS User Guide), dass auch schon geringer Strom durch die internen Schutzdioden zu einer unerwünschten Kopplung von Eingängen führen kann, d.h. der Strom fliesst zu einem anderen Eingang wieder hinaus. Sind also andere Eingänge ebenso hochohmig angeschlossen, kann dieser Querstrom zu Fehlfunktion führen.&lt;br /&gt;
&lt;br /&gt;
== BIDIREKTIONAL ==&lt;br /&gt;
&lt;br /&gt;
Für bidirektionale Busse gibt es spezielle Pegelwandler mit 2 Versorgungsspannungen. Allerdings brauchen die meist ein Signal zur Richtungsumschaltung. Auch muss man die Reihenfolge der Versorgungsspannungen beim Einschalten beachten. Aktive bidirektionale Pegelwandler OHNE Steuereingang zur Richtungsumschaltung sind mit Vorsicht zu genießen, denn die brauchen teilweise kurzzeitig einen relativ hohen Strom, um die Eingänge zu treiben.&lt;br /&gt;
&lt;br /&gt;
=== 5 V ⇔ 3,3 V ===&lt;br /&gt;
&lt;br /&gt;
* Wenn die 5-V-Seite TTL-kompatible Eingänge hat kann wieder der Spannungsteiler oder Vorwiderstand wie bei der unidirektionalen Anpassung verwendet werden (mit all seinen Vor- und Nachteilen).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bauteile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* SN74CB3T3306&lt;br /&gt;
* SN74CBTD3861 (10 Bit,flow through, Betrieb mit 5 Volt)&lt;br /&gt;
* MAX1741 &lt;br /&gt;
* MAX3378E &lt;br /&gt;
* 74AHC126 s.u.&lt;br /&gt;
* ST2378 (bei CSD erhältlich, 3.5 eur, leider TSSOP)&lt;br /&gt;
* TXS0104E (TI: 4-BIT BIDIRECTIONAL VOLTAGE-LEVEL TRANSLATOR FOR OPEN-DRAIN AND PUSH-PULL APPLICATIONS)&lt;br /&gt;
* SN74LVC07A&lt;br /&gt;
* von Analog Devices die ADUM Serie&lt;br /&gt;
&lt;br /&gt;
=== 1,65 V ... 5,5 V ⇔ 1,65 V ... 5,5 V ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bauteile&#039;&#039;&#039;&lt;br /&gt;
* SN74LVC1T45&lt;br /&gt;
* SN74LVC2T45&lt;br /&gt;
* SN74LVC(H)8T245&lt;br /&gt;
* SN74LVC(H)16T245&lt;br /&gt;
&lt;br /&gt;
=== 1,2 V ... 3,6 V ⇔ 1,65V ... 5,5V ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bauteile&#039;&#039;&#039;&lt;br /&gt;
* TXB0101&lt;br /&gt;
* TXB0102&lt;br /&gt;
* TXB0104&lt;br /&gt;
* TXB0106&lt;br /&gt;
* TXB0108&lt;br /&gt;
&lt;br /&gt;
=== 1,2 V ... 3,6V ⇔ 1,2 V ... 3,6 V ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bauteile&#039;&#039;&#039;&lt;br /&gt;
* SN74AVC(H)1T45&lt;br /&gt;
* SN74AVC(H)2T45&lt;br /&gt;
* SN74AVC(H)4T245&lt;br /&gt;
* SN74AVC(H)8T245&lt;br /&gt;
* SN74AVC(H)16T245&lt;br /&gt;
* SN74AVC(H)20T245&lt;br /&gt;
* SN74AVC(H)24T245&lt;br /&gt;
* SN74AVC(H)32T245&lt;br /&gt;
&lt;br /&gt;
=== 1,5 V ... 3,6 V ⇔ 1,5 V ... 5,5 V ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bauteile&#039;&#039;&#039;&lt;br /&gt;
* 74LVC4245A&lt;br /&gt;
&lt;br /&gt;
== Mit galvanischer Trennung ==&lt;br /&gt;
&lt;br /&gt;
* [[Optokoppler]] (Langsam! Es gibt verschieden schnelle Koppler, aber über 1 MHz kommen sie kaum hinaus. Grundregel: Solche mit Fototransistoren sind am langsamsten, Richtwert 10 kHz, Fotodioden sind schneller, schnelle Optokoppler haben eine gesondert zu speisende Empfängerschaltung.)&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_opto.png]]&lt;br /&gt;
&lt;br /&gt;
* GMR-Koppler von der Firma NVE &lt;br /&gt;
* iCoupler Technologie von der Firma Analog Devices&lt;br /&gt;
* [[Kapazitiver Koppler]] (schnell, begrenzter Potenzialversatz)&lt;br /&gt;
* Transformatorkopplung (nur für gleichspannungsfreie Wechselsignale geeignet; sehr schnell; Beispiel: Netzwerkkarten)&lt;br /&gt;
&lt;br /&gt;
Lit.: &#039;&#039;Galvanische Trennung: Optokoppler, GMR-Koppler oder iCoupler?&#039;&#039;, Siegfried W. Best, Redaktion elektronik industrie, [http://www.elektronik-industrie.de/ei/11,2003/article/2f0082f824c.html elektronik industrie 11-2003, S. 22ff.]&lt;br /&gt;
&lt;br /&gt;
== Praktische Beispiele ==&lt;br /&gt;
&lt;br /&gt;
=== Einfaches RS232-Interface ===&lt;br /&gt;
&lt;br /&gt;
[http://web.archive.org/web/20050122013618/http://www.henrik-reimers.de/control/rs232interface.gif Erfolgreicher Einsatz bis 19200 Baud und bis zu 10 m Leitungslänge]&lt;br /&gt;
Beschränkungen:&lt;br /&gt;
&lt;br /&gt;
* ggf. Platzbedarf&lt;br /&gt;
* Geschwindigkeit s.o.&lt;br /&gt;
&lt;br /&gt;
Beispiel: http://www.hagtech.com/pdf/translator.pdf&lt;br /&gt;
&lt;br /&gt;
=== [[I2C]]-Bus: gemeinsam 3.3V und 5V ===&lt;br /&gt;
&lt;br /&gt;
* [[MSP430]] an 3,3V/5V: [https://www.ti.com/lit/pdf/slaa148 slaa148.pdf]&lt;br /&gt;
&lt;br /&gt;
* Philips [http://www.nxp.com/documents/data_sheet/PCA9515.pdf PCA9515]: I2C Puffer mit Pegelwandlung. Der PCA9515 ist ein I2C-Bus Repeater, welcher I2C Busse mit verschiedenen Spannungen isoliert. Verfügbar bei Reichelt und DigiKey.&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/attachment.php/256452/levelshifter.pdf  AN97055] von Philips, &amp;quot;Bi-directional level shifter for I²C-bus and other systems&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Bevor man ein Philips I2C Chip auswählt sollte man prüfen ob er verfügbar ist und auch das verfügbare Gehäuse wählen. Man sollte auch überlegen ob ein Puffer wirklich gebraucht wird. Wenn man echte I2C ICs mit 5V betreibt, dann sind die Eingänge vom Typ Schmitt Trigger CMOS (z.&amp;amp;nbsp;B. PCF8574). Dann müssen 3.3V Pegel auf 5V umgesetzt werden. Wenn man jedoch SMBUS Ics verwendet (z.&amp;amp;nbsp;B. ADT7461, Silabs 8051) dann sind die Schwellspannungen TTL kompatibel und es ist keine Anpassung notwendig. Für neue Pegelwandler sollte man hier nachschauen. http://www.bus-buffer.com&lt;br /&gt;
&lt;br /&gt;
* [http://www.edn.com/article/CA193193.html &amp;quot;Two-transistor circuit replaces IC&amp;quot;]. Für diese Anwendung kann ENABLE direkt mit 3.3V verbunden werden. Es ist eigentlich nur dazu da, den ICs &amp;quot;hot-swappable&amp;quot; zu machen (kann unter Spannung gesteckt und getrennt werden). Es geht sogar mit nur einem [[Transistor]] [http://www.mikrocontroller.net/topic/92447 siehe Forum]. Man sollte beachten, daß die Schaltung sowohl für SCL als auch SDA benötigt wird. &lt;br /&gt;
* Noch einfachere Lösungen mit nur einem MOSFET und zwei Pull-Up Widerständen pro Leitung sind in den folgenden Links zu finden. &lt;br /&gt;
** [https://cdn-shop.adafruit.com/datasheets/AN10441.pdf AN10441.pdf] von NXP&lt;br /&gt;
** [http://www.semiconductors.philips.com/acrobat_download/literature/9398/39340011.pdf 39340011.pdf] (Kapitel 18), bei der Berechnung der erreichbaren Geschwindigkeit dürfen die parasitären Kapazitäten der FETs nicht ignoriert werden&lt;br /&gt;
&lt;br /&gt;
=== Auswählbare Pegel ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frage:&#039;&#039;&#039;&lt;br /&gt;
Ein CMOS Logikpegel zwischen 1,8V, 2,5V und 3,3V (abhängig von der Anwendung) muss auf 5V CMOS Logikpegel gewandelt werden. Es geht nur um diese Richtung mit maximal 8MHz. Es gibt die Stromversorgung für alle Pegel. Ein normaler Komparator wie LM311 ist nicht möglich, da er beim Betrieb mit 5V Versorgunsspannung erst ab 1V zu schalten anfängt. Meine Idee ist die Verwendung eines High Speed OPVs mit R2R Eingang, z.&amp;amp;nbsp;B. LMH6645.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Antworten:&#039;&#039;&#039;&lt;br /&gt;
* Man könnte einen ultra-low threshold N-Kanal MOSFET nehmen und als Open Drain mit einem Pull-Up nach 5V betreiben, BSH103 könnte passen (Schwellspannung ~0,4V).&lt;br /&gt;
* High-Speed Single Supply Komparator wie z.&amp;amp;nbsp;B. [http://www-s.ti.com/sc/ds/tl712.pdf TL712] .&lt;br /&gt;
* SN74LVC1T45&lt;br /&gt;
* SN74LVC8T245&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frage:&#039;&#039;&#039;&lt;br /&gt;
Ich suchen einen IC, welcher eine Pegelwandlung von 3,3V nach 1,8V, 2,0V oder 5V ermöglicht und während des Betriebs umgeschaltet werden kann.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Antworten:&#039;&#039;&#039;&lt;br /&gt;
* So ein IC ist der Linear [http://www.linear.com/pc/productDetail.jsp?navId=H0,C1,C1007,C1071,P1601 LTC1555L-1.8] .&lt;br /&gt;
* SN74LVC1T45&lt;br /&gt;
* SN74LVC8T245&lt;br /&gt;
&lt;br /&gt;
=== AVR SPI (SDC/MMC)===&lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;bidirektionalen Betrieb&#039;&#039;&#039; zwischen 5V-AVR und 3,3V-Geräten und anders herum gibt es den Level-Translator &#039;&#039;&#039;MAX3378E&#039;&#039;&#039; von Maxim.&lt;br /&gt;
&lt;br /&gt;
Wenn die Datenrichtung am SPI im Zielsystem festgelegt ist, reichen &#039;&#039;&#039;unidirektionale Bausteine&#039;&#039;&#039;:&lt;br /&gt;
* 3x von 5V nach 3,3V und 1x von 3,3V nach 5V: &#039;&#039;&#039;MAX3392E&#039;&#039;&#039;&lt;br /&gt;
* 1x von 5V nach 3,3V und 3x von 3,3V nach 5V: &#039;&#039;&#039;MAX3390E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Zum Anschließen einer SDC/MMC an einen 5V-AVR eignen sich somit der MAX3978E und der MAX3392E. Beide sind u.A. im winzigen TSSOP-14-Gehäuse verfügbar, nehmen sehr wenig Energie auf und eignen sich auch für andere Spannungen. Mit 3,3 und 5V beträgt die garantierte Übertragungsrate 8Mbps.&lt;br /&gt;
&lt;br /&gt;
* [http://datasheets.maxim-ic.com/en/ds/MAX3372E-MAX3393E.pdf Datenblatt]&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit zum Übersetzen zwischen 3,3 und 5V liegt in der Verwendung des &#039;&#039;&#039;74LVC245&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Bastlerfreundlicher als &#039;&#039;&#039;MAX33XXX&#039;&#039;&#039; (in SO-Gehäuse):&lt;br /&gt;
* 5V &amp;gt; 3,3V (SCK, MOSI, CS): 74LVC-serie (z.B. 74LVC14A)&lt;br /&gt;
* 3,3V &amp;gt; 5V (MISO): 74HCT-Serie (z.B. 74HCT125, 74HCT251)&lt;br /&gt;
&lt;br /&gt;
5V-AVR an eine MMC (ohne Level-Shifter-Baustein):&lt;br /&gt;
* [http://www.microsyl.com/index.php/2010/03/24/led-sign-with-mmc-memory-card/ Projektseite] &lt;br /&gt;
* [http://www.microsyl.com/projects/ledsign/ledsign1.pdf Schaltplan]&lt;br /&gt;
&lt;br /&gt;
=== Mikrocontroller ⇔ Parallelport ([[ISP]]-Dongle, [[JTAG]] Wiggler, ...) ===&lt;br /&gt;
&lt;br /&gt;
Dieser Schaltplan funktioniert auch bei 3,3 V wenn man einen 74&amp;lt;B&amp;gt;HC&amp;lt;/B&amp;gt;244 anstatt eines 74&amp;lt;B&amp;gt;LS&amp;lt;/B&amp;gt;244 verwendet: [http://www.epanorama.net/circuits/parallel_output.html Parallel port interfacing made easy: Simple circuits and programs to show how to use PC parallel port output capabilities].&lt;br /&gt;
&lt;br /&gt;
=== Doppeltes Leitungspaar RX/TX 5V/3,3V ===&lt;br /&gt;
&lt;br /&gt;
Der [http://www.hackaday.com/2008/06/19/sparkfuns-logic-level-converter/ SparkFun&#039;s Logic Level Converter] ist eine Baugruppe mit MOSFETs [http://www.fairchildsemi.com/pf/BS/BSS138.html BSS138] für die Pegelwandlung von 5V auf 3,3V. 5V/2,8V und 5V/1,8V sind ebenfalls machbar.&lt;br /&gt;
&lt;br /&gt;
=== Steuerleitung zwischen Mikrocontroller und FPGA ===&lt;br /&gt;
&lt;br /&gt;
Oftmals werden PLDs oder FPGAs per Microcontroller-Platine angesteuert. Ältere Typen laufen meist als 5V oder sitzen in 5V-kompatiblen Platinen. Sollen moderne FPGAs angesteuert werden, trifft man fast immer auf 3,3-V-Typen, bzw. muss sogar 2,5-V- / 1,8-V-Bänke beschalten, wenn nur noch dort Pins frei sind.&lt;br /&gt;
&lt;br /&gt;
==== Mikrocontroller ⇒ FPGA ====&lt;br /&gt;
&lt;br /&gt;
Die 5 V sind also im Extremfall auf 1,8 V herabzusetzen, was bei einem maximal zulässigen Diodenstrom von 3 mA (Beispiel Xilinx) einen Mindestwiderstand von ca. 1 kΩ erfordert. Die resultierende maximale Schaltfrequenz liegt dann bei einem typischen FPGA-Eingang bei etwa &amp;lt; 500 kHz. Soll der Eingang aus Belastungsgründen nicht mit mehr als 0,3 mA belastet werden, müsste der Widerstand auf 10 kΩ steigen, wodurch die Frequenz auf 1/10 sinkt. Zudem ist der Eingang dann störempfindlicher. Daher ist es besser, man schaltet dem Eingang eine zusätzliche Z-Diode bei und dimensioniert den Vorwiderstand so, dass die Strombelastbarkeit des Mikrocontrollers ausgelastet wird.&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit ist es, die Spannung mit einer Diode in Vorwärtsrichtung herabzusetzen. Dann muss jedoch der Vorwiderstand noch exakter toleriert werden und auch Abweichungen der Spannung (Welligkeit) berücksichtigt werden.&lt;br /&gt;
&lt;br /&gt;
==== FPGA ⇒ Mikrocontroller ====&lt;br /&gt;
&lt;br /&gt;
Umgekehrt ist es oft nötig, dass Bausteine einen fremden Chip treiben müssen, dessen Eingang bereits mit einem Pull-Up versehen ist. Über diesen wird dann stets ein Strom in die Schutzdiode eingeprägt, auch wenn der Ausgang auf HIGH geht. Soll z. B. von einem PLD oder einem FPGA aus eine Mikrocontrollerplatine bedient werden, die über einen Pull-Up von 1 kΩ verfügt, würden immer ca. 1 mA in die Schutzdiode eingeprägt. Hier kann eine Seriendiode helfen, die Spannung genügend herabzusetzen, um den Ausgang zu schützen und dennoch die Funktion zu erhalten. Dann steuert ein LOW-Ausgang den Eingang auf geschätzte 1V, was aber meistens für das Erkennen von LOW noch sicher reicht.&lt;br /&gt;
&lt;br /&gt;
== Bauteile ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;74ALVC164245&#039;&#039;&#039; - &#039;&#039;16bit dual supply translating transceiver&#039;&#039;. Eine Seite von 1.5V bis 3.6V, die andere von 1.5 bis 5.5V.&lt;br /&gt;
* &#039;&#039;&#039;74LVX573&#039;&#039;&#039; (unidirektional, Latch, nicht alle Hersteller bauen diesen 5V tolerant!)&lt;br /&gt;
* &#039;&#039;&#039;74LVX245&#039;&#039;&#039; (bidirektional, nicht alle Hersteller bauen diesen 5V tolerant!)&lt;br /&gt;
* &#039;&#039;&#039;74LVX125&#039;&#039;&#039; - &#039;&#039;Low Voltage Quad Buffer with 3-STATE Outputs&#039;&#039;. http://www.fairchildsemi.com/pf/74/74LVX125.html&lt;br /&gt;
* &#039;&#039;&#039;SN74LVC2T45&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;SN74LVC8T245&#039;&#039;&#039; - &#039;&#039;8-Bit Dual-Supply Bus Transceiver with Configurable Voltage Translation and Three-State Outputs&#039;&#039;. http://focus.ti.com/docs/prod/folders/print/sn74lvc8t245.html&lt;br /&gt;
* &#039;&#039;&#039;74LCX244MSA&#039;&#039;&#039; von Fairchild.&lt;br /&gt;
* &#039;&#039;&#039;MAX3377&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;MAX3000&#039;&#039;&#039; 8-Kanal bidirektioneler Pegelwandler ohne Richtungsumschaltung&lt;br /&gt;
* &#039;&#039;&#039;ADG3308&#039;&#039;&#039; 8-Kanal bi-dir. Pegelwandler ohne Richtungsumschaltung, 1,15V..5,5V, 50MBps (hohe Umschaltströme beachten)&lt;br /&gt;
&lt;br /&gt;
Vierfachdioden im kleinen 6-poligen SMD-Gehäuse:&lt;br /&gt;
* [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/CD00130230.pdf DSILC6-4xx.pdf]&lt;br /&gt;
* [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/CD00065974.pdf DVIULC6-4SC6.pdf]&lt;br /&gt;
* [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/CD00001734.pdf DALC208.pdf]&lt;br /&gt;
* [http://www.diodes.com/datasheets/ds30195.pdf QSBT40, vierfach Schottky Terminator für Datenleitungen]&lt;br /&gt;
* [http://www.littlefuse.com/data/en/Data_Sheets/SP724Lead_Free.pdf SP724, Siliziumschutzarray]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/307702#3316500 Forumsbeitrag]: Entkopplung von FT232 und AVR&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/503454?goto=6409954#6409949 Forumsbeitrag]:  2x level shift in Reihe (I2C)&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/525065#6828127 Forumsbeitrag]: Vorsicht bei bidirektionalen Pegelwandlern mit automatischer Richtungserkennung&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* Holmes D., [http://delphys.net/d.holmes/hardware/levelshift.html Bi-directional level-shift with MOSFETs]&lt;br /&gt;
* Gaurang Kavaiya, [http://www.edn.com/design/analog/4318916/Don-t-pay-for-level-translators-in-systems-using-multiple-power-supply-voltages Don’t pay for level translators in systems using multiple power-supply voltages], EDN, MAY 25, 2006, 81-86&lt;br /&gt;
* [http://www.elektronik-kompendium.de/public/schaerer/scf3_lc.htm Einfacher Pegelwandler im ELKO]&lt;br /&gt;
* [http://www.prog-link.com/dcf77/dcf77-17.html Pegelwandler für DFC77 Module]&lt;br /&gt;
* [http://elektronik.kai-uwe-schmidt.de/index.php?page=mp3_blueschaltung Pegelwandler für [[I2C]] Bus in einem MP3 Player]&lt;br /&gt;
* [http://www.mikrocontroller.net/attachment.php/256452/levelshifter.pdf Application Note von Philips, I2C Pegelwandler]&lt;br /&gt;
* [http://www.nxp.com/documents/user_manual/UM10204.pdf I2C Spezifikation]  &lt;br /&gt;
* [http://www.mikrocontroller.net/forum/read-1-234277.html#new Forumsbeitrag zum Thema 1,8V-5V Pegelwandler] &lt;br /&gt;
* [http://www.st.com/web/en/resource/technical/document/datasheet/CD00001208.pdf 74LCX16245, 16 Bit Pegelwandler]&lt;br /&gt;
* [http://www.standardics.nxp.com/products/lvc/buffers/ LVC Logikfamilie]&lt;br /&gt;
* [http://www.standardics.nxp.com/products/lvc/transceivers/ LVC Tranceiver]&lt;br /&gt;
* [http://www.microchip.com/stellent/groups/techpub_sg/documents/devicedoc/en026368.pdf 3V Tips ‘n Tricks] (PDF) von Microchip&lt;br /&gt;
* [http://www.ti.com/lit/an/slaa148/slaa148.pdf Interfacing the 3-V MSP430 to 5-V Circuits] (PDF) von Texas Instruments&lt;br /&gt;
* [http://www.ti.com/logic-circuit/voltage-level-translation/overview.html Texas Instruments Voltage level translators]: Auswahl passender Bauelemente durch Eingabe der gewünschten Parameter&lt;br /&gt;
&lt;br /&gt;
[[Category:Bauteile]]&lt;br /&gt;
[[Kategorie:Datenübertragung]]&lt;/div&gt;</summary>
		<author><name>Hansschall</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Diskussion:Pegelwandler&amp;diff=107224</id>
		<title>Diskussion:Pegelwandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Diskussion:Pegelwandler&amp;diff=107224"/>
		<updated>2025-01-03T13:36:37Z</updated>

		<summary type="html">&lt;p&gt;Hansschall: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Im Artikel sind Pegelwandler die auf eine höher Spannung wandeln z.B. 3,3V -&amp;gt; 5V mit der Bezeichung STEP-UP angegeben. Dies ist irreführend und sollte man besser umbenennen. [[Benutzer:Esko|Esko]] 23:34, 10. Jan. 2010 (UTC)&lt;br /&gt;
: das ist sogar ziemlich falsch, würde ich sagen. Wurde aber auch schon geändert. [[Benutzer:Elektromeister|Elektromeister]] 16:18, 26. Dez. 2012 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Mosfet Pegelwandlung ==&lt;br /&gt;
&lt;br /&gt;
Sollte man das Pegelwandeln mit N-Mosfets nicht mehr behandeln und vorallem auch sagen, dass diese Methode Bidirectional ist?&lt;br /&gt;
Das Einzige, was ich gefunden habe ist Folgendes:&lt;br /&gt;
&lt;br /&gt;
Frage: Ein CMOS Logikpegel zwischen 1,8V, 2,5V und 3,3V (abhängig von der Anwendung) muss auf 5V CMOS Logikpegel gewandelt werden. Es geht nur um diese Richtung mit maximal 8MHz. Es gibt die Stromversorgung für alle Pegel. Ein normaler Komparator wie LM311 ist nicht möglich, da er beim Betrieb mit 5V Versorgunsspannung erst ab 1V zu schalten anfängt. Meine Idee ist die Verwendung eines High Speed OPVs mit R2R Eingang, z. B. LMH6645.&lt;br /&gt;
Antworten:&lt;br /&gt;
Man könnte einen ultra-low threshold N-Kanal MOSFET nehmen und als Open Drain mit einem Pull-Up nach 5V betreiben, BSH103 könnte passen (Schwellspannung ~0,4V).&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Nö, das sollte man nicht, weil es nicht stimmt. Was soll an einem einfachen MOSFET bidirektional sein?&lt;br /&gt;
Und das Hier aufgeworfenen Problem löst man damit sicher NICHT solide. Entweder, man nimmt einen fertigen, echten Pegelwandler, die gibt es haufenweise. Oder einen passenden Komparator. Der LM311 ist bei 8 MHz sowieso überfordert. Dito ein LM393. Aber die Welt hat sich weiter gedreht, es gibt schnelle CMOS-Komparatoren von TI, Analog etc. Bei minimal 2,5V Eingangsspannung könnte man ein AHCT Gatter nehmen, die haben eine 1,4V Schaltschwelle. Bei 1,8V ist das aber zu knapp.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Gemeint ist hier vermutlich eher die Schaltung wie sie weiter unten schon kurz erwähnt ist: https://www.mikrocontroller.net/articles/Pegelwandler#Doppeltes_Leitungspaar_RX/TX_5V/3,3V . Das gibt es fertig bei Amazon &amp;amp; Co. Ich werde (wenn ich mal Zeit habe) eine ausführliche Beschreibung einfügen. Und ja, obwohl sie nur aus zwei Pull-Ups und einem BSS138 besteht ist sie sehr wohl bidrektional.&lt;/div&gt;</summary>
		<author><name>Hansschall</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Pegelwandler&amp;diff=107223</id>
		<title>Pegelwandler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Pegelwandler&amp;diff=107223"/>
		<updated>2025-01-03T13:27:42Z</updated>

		<summary type="html">&lt;p&gt;Hansschall: Removed dead link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Pegelwandeln (engl. level shifting) wird oft notwendig, wenn Systeme mit unterschiedlichen Ausgangs- und Eingangsspannungen (z.&amp;amp;nbsp;B. Versorgungs- oder Logikspannungen) miteinander verbunden werden sollen. Das vielleicht bekannteste Beispiel ist die Umsetzung von 0V/5V [[TTL]] Logikpegeln auf die -13V/13V Pegel einer seriellen [[RS232]] Schnittstelle. Die Probleme beim Pegelwandeln können sein:&lt;br /&gt;
&lt;br /&gt;
# Überlastung einer oder beider Seiten, bis hin zur Zerstörung&lt;br /&gt;
# Inkompatible Logikpegel und daraus resultierendes Nichtfunktionieren der Schaltung, oder noch schlimmer, sporadische Fehlfunktionen&lt;br /&gt;
# Verzögerungen der Signale durch die Pegelwandlung und daraus resultierende maximale Signalfrequenzen&lt;br /&gt;
&lt;br /&gt;
=== Überlastung ===&lt;br /&gt;
&lt;br /&gt;
Das Erzeugen von verschiedenen Versorgungsspannungen ist ziemlich einfach, aber man muss sicher gehen, dass man die Signalpegel der Bauteile auf Toleranz überprüft. Wenn z.B. ein 5V Bauteil ein Signal an ein 3V Bauteil schickt, können beide Bauteile beschädigt werden. Vor allem für neue ICs ist es ein Problem mit &amp;quot;hohen&amp;quot; Spannungen wie 5V zu arbeiten. Auf Grund der immer kleineren Schaltkreisstrukturen (aktuelle Prozessoren werden mit 14nm Technologie hergestellt!) werden auch die Abstände und Schichtdicken immer geringer. Das reduziert natürlich auch die Spannungs- und Stromfestigkeit der Transistoren auf dem IC. Neue ICs vertragen deshalb meist nur noch 3.3V, teilweise sogar weniger! Die Überlastung erfolgt durch zu hohe Spannung und dadurch mehr oder weniger langsame Zerstörung des ICs.&lt;br /&gt;
&lt;br /&gt;
=== Schutzdioden ===&lt;br /&gt;
&lt;br /&gt;
Hauptursache Nummer zwei für Überlastung von ICs mit verschiedenen Betriebsspannungen sind die in nahezu allen ICs integrierten Schutzdioden. Deren Aufgabe ist es in Normalfall, elektrostatische Entladungen auf eine sichere, niedrige Spannung zu begrenzen. Die Entladungen geschehen durch unsachgemässe Handhabung und Transport von ICs, z.&amp;amp;nbsp;B. wenn jemand über einen Kunstfaserteppich läuft, sich dabei elektrostatisch auflädt und einen IC anfasst, oder wenn Bauteile in einem Gerät eingebaut sind und der Anwender berührt offen liegende Kontakte (RS232 Eingang, USB-Stick, PCI-Steckkarten beim Einbau etc.). Auch elektrostatische Entladungen / EMV können Ursache zu hoher Pegel auf den Leitungen sein.&lt;br /&gt;
&lt;br /&gt;
Die Schutzdioden beginnen, Strom zu leiten, wenn die Eingangsspannung ca. 300 mV - 600 mV über U&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt; ansteigt oder entsprechend unter GND absinkt. Im Normalbetrieb sollten die Schutzdioden keinen Strom leiten. Manchmal kann man sie aber zur Spannungsbegrenzung missbrauchen, siehe [[#STEP-DOWN:_5V_-.3E_3.3V | Spannungsherabsetzung mit Vorwiderstand]].&lt;br /&gt;
&lt;br /&gt;
Besonderes Augenmerk ist hierbei auf die optimale Dimensionierung des R zu legen, um sicherzustellen, dass kein zu hoher Strom über die Schutzdioden abgeführt werden muss. Je nach Chip-Type und Ausgang halten diese zwischen 100 µA und 10 mA aus.&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_schutzdioden.png]]&lt;br /&gt;
&lt;br /&gt;
=== 5-V-tolerante Eingänge ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;5-Volt-tolerant&amp;lt;/i&amp;gt; bedeutet, dass 3-Volt-Bausteine ohne Probleme von einem 5-Volt-Baustein angesteuert werden dürfen.&lt;br /&gt;
&lt;br /&gt;
Viele Bauteile mit einer Betriebsspannung von 3 V verfügen über 5-V-tolerante Eingänge. Man sollte aber grundsätzlich im Datenblatt dies nachschauen, bevor die Schaltung aufgebaut wird. Sind sie es nicht, so ist ein &amp;lt;b&amp;gt;Pegelwandler&amp;lt;/b&amp;gt; auf den Verbindungsleitungen zwischen den Bauteilen notwendig. Ein Pegelwandler kann eine einfache Zener-Diode mit einem Widerstand sein, es kann aber auch ein eigens dafür vorgesehener IC sein. Sind die Signalwege bidirektional, so wird man meist die Lösung mit einem eigenen IC bevorzugen.&lt;br /&gt;
&lt;br /&gt;
Bei geringen Geschwindigkeitsanforderungen und erlaubten flachflankigen Signalen (bei Zähl- und Takteingängen ist dazu Schmitt-Trigger-Verhalten erforderlich) genügt ein Serienwiderstand (Richtwert 10 kΩ) in Verbindung mit der Eingangsschutzbeschaltung. Bei allen derartigen „passiven Pegelkonvertern“ muss die Logikschaltschwelle durchfahren werden. Bei heutzutage üblichen treibenden CMOS-Ausgangsstufen ist das kein Problem.&lt;br /&gt;
&lt;br /&gt;
Ob ein Bauteil 5-V-tolerant ist und unter welchen Betriebsbedingungen das gilt, steht im Datenblatt des betreffenden Bauteils vom betreffenden Hersteller. Wenn es auf diese Eigenschaft ankommt, lieber genau bei Lieferanten nachsehen, von welchem Hersteller die Bauteile kommen.&lt;br /&gt;
&lt;br /&gt;
==== Beispiele ====&lt;br /&gt;
&lt;br /&gt;
[[AVR]]s sind generell &#039;&#039;&#039;nicht&#039;&#039;&#039; 5-V-tolerant, wenn sie mit 3,3 V betrieben werden! Die absolute obere Grenze für Eingangsspannungen liegt bei U&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt; + 0,5 V. Zu finden in den elektrischen Spezifikationen im Datenblatt.&lt;br /&gt;
&lt;br /&gt;
Die GPIO-Pins des Raspberry Pi sind ebenfalls &#039;&#039;&#039;nicht&#039;&#039;&#039; 5-V-tolerant!&lt;br /&gt;
&lt;br /&gt;
Vorsicht bei:&lt;br /&gt;
&lt;br /&gt;
* 74&#039;&#039;&#039;LVX&#039;&#039;&#039;xxxx und 74&#039;&#039;&#039;LCX&#039;&#039;&#039;xxxx (245, 244, 240 ...) an Vcc = 3,3 V.&amp;lt;br&amp;gt;&amp;lt;font color=FF0000&amp;gt;Achtung&amp;lt;/font&amp;gt;: Nicht alle 74LVX sind für 5 V -&amp;gt; 3,3 V geeignet, da jeder Hersteller die ICs anders baut!&lt;br /&gt;
* SN74LVC07AD&lt;br /&gt;
* SN74LV1T04 (auch geeignet zur umgekehrten Konvertierung (3,3V-&amp;gt;5V))&lt;br /&gt;
&lt;br /&gt;
=== Kompatibilität von Logikpegeln ===&lt;br /&gt;
&lt;br /&gt;
Verschiedene Mikroprozessoren haben eigene elektrische Kenndaten für HIGH- und LOW-Pegel, die abhängig von der Versorgungsspannung sind, z.&amp;amp;nbsp;B. der [[R8C]]:&lt;br /&gt;
&lt;br /&gt;
* HIGH größer 0,8 * U&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt;&lt;br /&gt;
* LOW kleiner 0,2 * U&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man muss die Spannungen der Aus- und Eingänge vergleichen. Wenn es um ein Hobbyprojekt geht, kann man einfach messen. Wenn es um eine kommerzielle Anwendung geht, die man verkaufen will, sollte man besser die Spezifikationen der ICs studieren.&lt;br /&gt;
&lt;br /&gt;
== UNIDIREKTIONAL ==&lt;br /&gt;
&lt;br /&gt;
=== 1,8 V ⇒ 5 V ===&lt;br /&gt;
&lt;br /&gt;
* Die besondere Eigenschaft der alten TTL-Schaltkreise, nämlich dass Strom bei LOW &#039;&#039;&#039;aus&#039;&#039;&#039; dem Eingang in den treibenden Ausgang fließt kann man sich zunutze machen, wie die nachfolgende Schaltung zeigt. In dieser wird der HIGH-Pegel des 1,8-V-Signals durch eine Schottkydiode um ca. 0,3 V auf 2,1 V erhöht. Damit ist man fast offiziell im HIGH-Bereich für TTL (Schaltschwelle 1,4 V, HIGH &amp;gt; 2,0 V). Der LOW-Pegel wird auf ca. 0,3 V erhöht, was voll den TTL-Richtlinien entspricht. Als Schaltkreisfamilie &#039;&#039;&#039;muss&#039;&#039;&#039; ein [[74xx|TTL-Typ]] eingesetzt werden, also LS, F, AS oder ähnlich. CMOS-Typen wie HC, LVC etc. funktionieren &#039;&#039;&#039;nicht&#039;&#039;&#039;!&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_LS.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=FF0000&amp;gt;Achtung&amp;lt;/font&amp;gt;: Diese Schaltung entspricht bei HIGH ungefähr einem offenen TTL-Eingang, was zwar meistens funktioniert, aber etwas störempfindlich sein kann. Davon wurde in der TTL-Ära stets abgeraten. Zudem ist der Pegelwechsel LOW nach HIGH durch den niedrigen Strom eher langsam. Man kann das jedoch mit einem Pullup-Widerstand absichern. Dann sind auch Gatter der 74HCT-Reihe einsetzbar.&lt;br /&gt;
&lt;br /&gt;
=== 3,3 V ⇒ 5 V ===&lt;br /&gt;
&lt;br /&gt;
Diese Konversion ist mit Abstand die häufigste. Dabei kann man getrost 3,3 V (früher) und 3 V (moderner) gleich setzen.&lt;br /&gt;
&lt;br /&gt;
* 3,3-V-Pegel werden bei TTL-kompatiblen Eingängen richtig erkannt (Schaltschwelle 1,4 V). Es ist kein Pegelwandler erforderlich. Direkte Verbindung. Einer der großen Vorteile klassischer TTL-Technik!&lt;br /&gt;
&lt;br /&gt;
* 5-V-CMOS Eingänge haben typisch eine minimale Eingangsspannug für HIGH (&amp;lt;math&amp;gt;V_{IH}&amp;lt;/math&amp;gt;) von 0.6 * U&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt; = 0.6 * 5 V = 3 V. Das kann ein 3,3-V-CMOS-Ausgang direkt treiben, allerdings kann sich das Zeitverhalten dadurch etwas ändern, weil der HIGH Pegel später erkannt wird. Vorsicht! Viele 5-V-CMOS-ICs wollen für HIGH offiziell mindestens 0,7 * U&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt; = 3,5 V oder manche auch 0,8 * U&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt; = 4,0V! Das geht dann offiziell nicht mehr mit einem 3,3-V-Ausgang! Für Hobbyzwecke kann man das aber ggf. probieren.&lt;br /&gt;
Zu beachten ist, dass der nicht ganz nach High durchgesteuerte Eingang Querstrom von der Speisespannung ziehen kann. Das kann für batteriebetriebene Geräte oder USB-konformes Standby durchaus ausschlaggebend sein.&lt;br /&gt;
&lt;br /&gt;
Möglich ist auch eine &#039;&#039;&#039;Zentrierung&#039;&#039;&#039; des Ausgangspegels mit 2 Widerständen wie im folgenden linken Bild. Allerdings besteht die Gefahr, dass die 3,3-V-Versorgung hochläuft, da Spannungsregler (hier: für die 3,3 V) nicht dafür ausgelegt sind, bei Überspannung an deren Ausgang zusätzlich Strom nach Masse abzuleiten: Die 3,3-V-Verbraucher müssen bei High eine Mindestlast erbringen, etwa mit einem zusätzlichen Widerstand &#039;&#039;&#039;R3&#039;&#039;&#039; vom Ausgang nach GND.&lt;br /&gt;
&lt;br /&gt;
[[bild:Zentrierung-3P3-5P.png]] [[bild:Zentrierung-3P3-5P-R3.png]]&lt;br /&gt;
&lt;br /&gt;
* 3,3-V-[[Ausgangsstufen_Logik-ICs | Open Collector]] nach 5 V (TTL oder CMOS): Einfach einen Pull-Up Widerstand hinzufügen und gut. Allerdings verbraucht der Pull-Up-Widerstand bei LOW auf jeden Fall Strom und begrenzt bei HIGH den maximalen Gate-Umladestrom. Die Schaltgeschwindigkeit von LOW nach HIGH wird durch die Größe des Pull-Ups bestimmt. Je nach Geschwindigkeitsanforderungen kann der in Mikrocontrollern meistens zuschaltbare innere Widerstand dazu benutzt werden. Zudem kann dieser, bei bekannt LOW bleibendem Eingangspegel, zur Reduktion der Stromaufnahme abgeschaltet werden. Bipolare TTL-Schaltkreise benötigen in der Bastelschaltung keinen Pull-Up (liefern Strom); bei Schaltungen mit erhöhter Zuverlässigkeit ist dennoch ein externer Pull-Up angeraten (Richtwert 4,7 kΩ).&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_oc_3-5.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Das Simulieren von Open Collector in Mikrocontrollern oder mittels Tristate-Treibern oder die Verwendung von Open-Collector-Ausgängen von Schaltkreisen, bei denen keine höhere Ausgangsspannung spezifiziert ist (etwa 74HC03), ist für diesen Zweck unzulässig und wenig hilfreich, weil Gateschutzdioden und andere parasitäre Siliziumstrukturen den Strom aus dem Widerstand nach 3,3 V ableiten und so maximal 4 V generieren. Auch hier besteht die Gefahr des Hochlaufens der 3,3-V-Versorgung.&lt;br /&gt;
&lt;br /&gt;
* 3,3 V auf echte 5 V (CMOS) geht am einfachsten mit einem Baustein der HCT-Familie (NICHT HC!). Diese haben TTL-kompatible Eingänge und echte CMOS-Ausgänge&lt;br /&gt;
&lt;br /&gt;
* Man kann einen Komparator &amp;lt;small&amp;gt;in nichtinvertierender Schaltung&amp;lt;/small&amp;gt; benutzen (LM339/393). Allerdings ist diese Lösung relativ langsam, abhängig vom verwendeten Komparator. Komparatoren bieten eine freie Wahl des Eingangsspannungsbereichs und sind deshalb eine gute Wahl bei &#039;&#039;variabler&#039;&#039; Speisespannung der Treiberseite.&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_comp_3-5.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bauteile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/part/74HCT245 74HCT245], [http://www.mikrocontroller.net/part/74HCT244 74HCT244]oder [http://www.mikrocontroller.net/part/74HCT240 74HCT240] (Das &#039;&#039;&#039;T&#039;&#039;&#039; ist wichtig. HCs können funktionieren, sind aber suboptimal, da bei 5V Versorgung und höheren Temperaturen U&amp;lt;sub&amp;gt;input,high&amp;lt;/sub&amp;gt; = 3,2 V)&lt;br /&gt;
* [http://www.mikrocontroller.net/part/74HCT125 74HCT125]: OE Pins auf Masse und dann das Signal einfach anschließen. &lt;br /&gt;
* SN74LVC07AD &lt;br /&gt;
* SN74LV1T04 (auch geeignet zur umgekehrten Konvertierung (5 V ⇒ 3,3 V))&lt;br /&gt;
* 74V1T126 (single Gatter, U&amp;lt;sub&amp;gt;input,high&amp;lt;/sub&amp;gt; = 2 V)&lt;br /&gt;
&lt;br /&gt;
=== 5 V ⇒ 9..15(..30) V ===&lt;br /&gt;
&lt;br /&gt;
* Am einfachsten geht das mit einem (geeigneten!) Open-Collector-Ausgang, einfach einen Pull-Up hinzufügen (an die hohe Spannung) und fertig. Ein 74&#039;&#039;xx&#039;&#039;03 geht hier nicht! Auch kann man nicht einen Push-Pull-Ausgang eines Mikrocontrollers dafür verwenden, indem man den Ausgang bei HIGH zum Eingang macht.&lt;br /&gt;
Hintergrund sind parasitäre Dioden zwischen Ausgang und Speisespannung.&lt;br /&gt;
Alle (geeigneten) Treiberausgänge haben eine maximal erlaubte Kollektorspannung, die zu beachten ist. Mehr Freiheit hat man bei der Verwendung von Einzeltransistoren, wobei eine gewisse Lücke von 30 V bis 200 V von Bipolartransistoren dominiert wird; für kleinere oder größere Spannungen gibt es preiswerte MOSFETs. (Die Lücke entsteht durch den geringen Bedarf des Weltmarktes an diesen Kollektorspannungen.)&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_oc_5-12.png]]&lt;br /&gt;
&lt;br /&gt;
* Man kann einen Komparator benutzen. Allerdings ist diese Lösung relativ langsam, abhängig vom verwendeten Komparator. Wenn nur zwei Signale gewandelt werden müssen bietet sich der LM393 an, ein Doppelkomparator mit Open-Collector-Ausgang, mit dem man auf einen beliebigen Pegel ausgeben kann. Der LM339 (man beachte den unauffälligen Zahlendreher) ist ein Vierfachkomparator mit den gleichen Eigenschaften. Wenn wenig Platz vorhanden ist, dann ist der TL311 im winzigen SOT-23 Gehäuse sehr empfehlenswert. Bei jedem Komparator kann auch einfach eine Invertierung gemacht werden, einfach die Eingänge + und - vertauschen. Diese Komparatoren eignen sich bis ca. 1 MHz.&lt;br /&gt;
&lt;br /&gt;
* [http://www.elektronik-kompendium.de/sites/praxis/bausatz_pegelwandler-mit-transistoren.htm Pegelwandler mit Transistor, invertierend]&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_trans_inv.png]]&lt;br /&gt;
&lt;br /&gt;
* Pegelwandler mit Transistor, nicht invertierend&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_trans_ni.png]]&lt;br /&gt;
&lt;br /&gt;
Die Idee ist einfach. Wenn der Ausgang des 5-V-Gatters auf HIGH ist dann ist der Transistor ausgeschaltet, der Pull-Up-Widerstand R7 zieht den Ausgang auf + 12 V. Ist der Ausgang des 5-V-Gatters auf LOW ist, dann ist er vollkommen durchgesteuert und der Ausgang nahe 0 V (je nach Typ ca. 300 mV). Der Vorteil ist hier erhöhte Störsicherheit im Gegensatz zur einfachen Ansteuerung der Basis über einen Vorwiderstand. Außerdem wird dadurch nicht die Logik invertiert. Nachteilig ist der geringe Strom, der bei HIGH zur Verfügung steht (typisch 100 µA). Diese Schaltung ist die seltene Anwendung einer Basisschaltung für digitale Signale. Der Vorteil der Basisschaltung ist die höhere Grenzfrequenz durch die herabgesetzte Wirksamkeit der (störenden) Miller-Kapazität.&lt;br /&gt;
&lt;br /&gt;
* Wenn mehr Geschwindigkeit, Ausgangsstrom und weniger Stromverbrauch nötig ist, dann muss ein spezieller Baustein her, wie z.&amp;amp;nbsp;B.&amp;lt;BR&amp;gt;&amp;lt;BR&amp;gt;&lt;br /&gt;
** [[Mosfet-Übersicht#Mosfet-Treiber|MOSFET-Treiber]] z.B. ICL7667&lt;br /&gt;
** [[H-Brücken Übersicht | Motortreiber]] ICs: (z.&amp;amp;nbsp;B. L293, L298, UCC27325 und deren Verwandte), wenns nicht zu schnell ist (einige Dutzend kHz)&lt;br /&gt;
** CD40109, 4fach Pegelwandler, bei Reichelt verfügbar&lt;br /&gt;
** HEF4104, 4fach Pegelwandler mit normalen und invertierten Ausgängen sowie Tristate. Um ggf. sicherzustellen, dass wie im Datenblatt beschrieben immer U&amp;lt;sub&amp;gt;DDI&amp;lt;/sub&amp;gt; &amp;lt;= U&amp;lt;sub&amp;gt;DDO&amp;lt;/sub&amp;gt; ist, kann man einfach eine Diode von U&amp;lt;sub&amp;gt;DDO&amp;lt;/sub&amp;gt; nach U&amp;lt;sub&amp;gt;DDI&amp;lt;/sub&amp;gt; schalten (z.&amp;amp;nbsp;B. Schottky SB120, aber auch 1N4148 &amp;amp; Co. sollte problemlos funktionieren)&lt;br /&gt;
** CD4504, 6fach Pegelwandler 3-20V, Eingangspegel TTL oder CMOS (umschaltbar) =&amp;gt; CMOS, keine Reihenfolge von U&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt;/U&amp;lt;sub&amp;gt;EE&amp;lt;/sub&amp;gt; erforderlich (Bezugsquelle: CSD)&lt;br /&gt;
** MAX232, der braucht nur 5 V Versorgungsspannung. Allerdings ist der Ausgangswiderstand relativ hoch (ca. 300 Ω) und man kann nur ca. 5 mA Ausgangstrom liefern. Die Ausgangsspannung beträgt maximal 10 V.&lt;br /&gt;
&lt;br /&gt;
=== 5 V ⇒ 3,3 V ===&lt;br /&gt;
&lt;br /&gt;
Ob 3,3 V (klassisch) oder 3 V (modern) ist bei dieser Betrachtung nahezu egal.&lt;br /&gt;
&lt;br /&gt;
* Zuerst sollte man prüfen, ob die Eingänge 5V-tolerant sind. Dann kann man die ICs direkt verbinden. Sehr schnell und billig!&lt;br /&gt;
&lt;br /&gt;
* Wenn die Eingänge nicht 5-V-tolerant sind und es trotzdem schnell sein soll, muss ein Gatter aus der LVC- oder AHC-Familie dazwischen geschaltet werden, also eines mit 5V-Toleranz. Bei 3 V Betriebsspannung kann man problemlos 5 V an den Eingang anlegen. Der Baustein 74HC4050 erlaubt per Definition eine Pegelwandlung bis etwa 15 V (siehe Datenblatt). Beide Anordungen haben auch eine sehr niedrige Ruhestromaufnahme.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Bauteile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:* 74LVC245A (&#039;A&#039; ist wichtig, I/Os 5V-tolerant)&lt;br /&gt;
:* 74LVC245DW &lt;br /&gt;
:* 74LVT245 &lt;br /&gt;
:* 74LVXxxx (245, 244, 240 ...) an Vcc=3,3V. Achtung: Nicht alle 74LVX sind für 5V -&amp;gt; 3,3V geeignet, da jeder Hersteller die ICs anders baut!&lt;br /&gt;
:** 74LVX04 &lt;br /&gt;
:** 74LVX244 (Fairchild)&lt;br /&gt;
:** 74LVX245 (nicht von Reichelt, nicht 5V tolerant)&lt;br /&gt;
:** bei TI heissen die 74LVX... nur 74LV...&lt;br /&gt;
&lt;br /&gt;
:* 74HC4050 (bis 15 V Step-Down-Pegelwandlung laut Datenblatt, bei Reichelt in DIP und SO erhältlich)&lt;br /&gt;
:* MAX3373/MAX3375&lt;br /&gt;
:* NC7SZ08 oder andere aus derselben Serie. CMOS-Logik mit 5-V-toleranten Eingängen, recht flott und braucht dank SOT-23 auch wenig Platz auf der Platine&lt;br /&gt;
&lt;br /&gt;
* 5 V Open Collector auf 3,3-V-Eingang. Einfach einen Pull-Up hinzufügen (Pull-Up liegt auf 3,3 V). Nachteilig ist der relativ hohe Stromverbrauch bei LOW, die begrenzte Geschwindigkeit bei hochohmigen Pull-Ups und der relativ geringe Ausgangsstrom bei HIGH (abhängig vom Pull-Up).&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_oc_5-3.png]]&lt;br /&gt;
&lt;br /&gt;
* Spannungsteiler mit 680 Ω und 1 kΩ. Der Nachteil dieser Lösung ist der relativ hohe Stromverbrauch (~3mA), der relativ geringe Ausgangsstrom (mehr als 200..300 µA sollte man da nicht rausziehen) und die relativ geringe Geschwindigkeit (ca. 10 MHz).&lt;br /&gt;
&lt;br /&gt;
[[Datei:SPI level shifter with resistor divider.png|miniatur|rechts|fehlerhafter SPI-Takt nach Pegelwandler mit Widerstandsteiler (1,8/3,3 kΩ)&amp;lt;br /&amp;gt;unten: 5V-Ausgang am Mikrocontroller&amp;lt;br /&amp;gt;&lt;br /&gt;
oben: 3,3V-Eingang an der SD-Karte nach Pegelwandler]]&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_st_5-3.png]]&lt;br /&gt;
&lt;br /&gt;
* 1 kΩ Vorwiderstand. Dadurch wird der Strom vom 5-V-Ausgang in die 3,3-V-Versorgung durch die internen Schutzdioden auf ca. 1 mA begrenzt. Diese Lösung ist auch relativ langsam (ca. 5MHz). Ggf. kann man den Vorwiderstand auf 100 Ω reduzieren, das erhöht dann wieder die Geschwindigkeit. Aufpassen, einige ICs vertragen nur 1 mA oder weniger durch die Schutzdioden! Ausserdem muss man aufpassen, da jetzt von der 5-V-Seite Strom in die 3,3-V-Versorgung eingespeist wird. Besonders in Schaltungen mit sehr niedriger Stromaufnahme kann das zum Problem werden, wenn die Stromaufnahme geringer ist, als über die Vorwiderstände eingespeist wird. Dann nimmt es meist der Spannungsregler für 3,3 V übel wenn jemand „schiebt“, sprich, Strom einspeist. Denn die allermeisten Spannungsregler können nur Strom liefern (source), aber keinen Strom aufnehmen (sink). Es gibt 4-fach-Diodennetzwerke, die die internen Schutzdioden entlasten können (Schottkydioden mit kleinerer Flusspannung von ≈ 0,3 V als die internen Silizizumdioden mit ≈ 0,7 V), außerdem ist teilweise noch eine [[Diode#Z-Diode|Zenerdiode]] enthalten, die ggf. den überschüssig eingespeisten Strom aufnehmen kann.&lt;br /&gt;
&lt;br /&gt;
Alle Lösungen mit Vorwiderständen reduzieren die Flankensteilheit der Signale. Dies kann bei Takt- und Zähleingängen zu unerwünschten Schwingungen und damit Fehlzählungen führen. Derartig benutzte Eingänge sollten Schmitt-Trigger-Verhalten aufweisen.&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_vw_5-3.png]]&lt;br /&gt;
&lt;br /&gt;
Achtung: Mindestens für 74HC(T) Gatter ist dokumentiert (Philips 74HC/T High-Speed CMOS User Guide), dass auch schon geringer Strom durch die internen Schutzdioden zu einer unerwünschten Kopplung von Eingängen führen kann, d.h. der Strom fliesst zu einem anderen Eingang wieder hinaus. Sind also andere Eingänge ebenso hochohmig angeschlossen, kann dieser Querstrom zu Fehlfunktion führen.&lt;br /&gt;
&lt;br /&gt;
== BIDIREKTIONAL ==&lt;br /&gt;
&lt;br /&gt;
Für bidirektionale Busse gibt es spezielle Pegelwandler mit 2 Versorgungsspannungen. Allerdings brauchen die meist ein Signal zur Richtungsumschaltung. Auch muss man die Reihenfolge der Versorgungsspannungen beim Einschalten beachten. Aktive bidirektionale Pegelwandler OHNE Steuereingang zur Richtungsumschaltung sind mit Vorsicht zu genießen, denn die brauchen teilweise kurzzeitig einen relativ hohen Strom, um die Eingänge zu treiben.&lt;br /&gt;
&lt;br /&gt;
=== 5 V ⇔ 3,3 V ===&lt;br /&gt;
&lt;br /&gt;
* Wenn die 5-V-Seite TTL-kompatible Eingänge hat kann wieder der Spannungsteiler oder Vorwiderstand wie bei der unidirektionalen Anpassung verwendet werden (mit all seinen Vor- und Nachteilen).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bauteile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* SN74CB3T3306&lt;br /&gt;
* SN74CBTD3861 (10 Bit,flow through, Betrieb mit 5 Volt)&lt;br /&gt;
* MAX1741 &lt;br /&gt;
* MAX3378E &lt;br /&gt;
* 74AHC126 s.u.&lt;br /&gt;
* ST2378 (bei CSD erhältlich, 3.5 eur, leider TSSOP)&lt;br /&gt;
* TXS0104E (TI: 4-BIT BIDIRECTIONAL VOLTAGE-LEVEL TRANSLATOR FOR OPEN-DRAIN AND PUSH-PULL APPLICATIONS)&lt;br /&gt;
* SN74LVC07A&lt;br /&gt;
* von Analog Devices die ADUM Serie&lt;br /&gt;
&lt;br /&gt;
=== 1,65 V ... 5,5 V ⇔ 1,65 V ... 5,5 V ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bauteile&#039;&#039;&#039;&lt;br /&gt;
* SN74LVC1T45&lt;br /&gt;
* SN74LVC2T45&lt;br /&gt;
* SN74LVC(H)8T245&lt;br /&gt;
* SN74LVC(H)16T245&lt;br /&gt;
&lt;br /&gt;
=== 1,2 V ... 3,6 V ⇔ 1,65V ... 5,5V ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bauteile&#039;&#039;&#039;&lt;br /&gt;
* TXB0101&lt;br /&gt;
* TXB0102&lt;br /&gt;
* TXB0104&lt;br /&gt;
* TXB0106&lt;br /&gt;
* TXB0108&lt;br /&gt;
&lt;br /&gt;
=== 1,2 V ... 3,6V ⇔ 1,2 V ... 3,6 V ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bauteile&#039;&#039;&#039;&lt;br /&gt;
* SN74AVC(H)1T45&lt;br /&gt;
* SN74AVC(H)2T45&lt;br /&gt;
* SN74AVC(H)4T245&lt;br /&gt;
* SN74AVC(H)8T245&lt;br /&gt;
* SN74AVC(H)16T245&lt;br /&gt;
* SN74AVC(H)20T245&lt;br /&gt;
* SN74AVC(H)24T245&lt;br /&gt;
* SN74AVC(H)32T245&lt;br /&gt;
&lt;br /&gt;
=== 1,5 V ... 3,6 V ⇔ 1,5 V ... 5,5 V ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bauteile&#039;&#039;&#039;&lt;br /&gt;
* 74LVC4245A&lt;br /&gt;
&lt;br /&gt;
== Mit galvanischer Trennung ==&lt;br /&gt;
&lt;br /&gt;
* [[Optokoppler]] (Langsam! Es gibt verschieden schnelle Koppler, aber über 1 MHz kommen sie kaum hinaus. Grundregel: Solche mit Fototransistoren sind am langsamsten, Richtwert 10 kHz, Fotodioden sind schneller, schnelle Optokoppler haben eine gesondert zu speisende Empfängerschaltung.)&lt;br /&gt;
&lt;br /&gt;
[[bild:pw_opto.png]]&lt;br /&gt;
&lt;br /&gt;
* GMR-Koppler von der Firma NVE &lt;br /&gt;
* iCoupler Technologie von der Firma Analog Devices&lt;br /&gt;
* [[Kapazitiver Koppler]] (schnell, begrenzter Potenzialversatz)&lt;br /&gt;
* Transformatorkopplung (nur für gleichspannungsfreie Wechselsignale geeignet; sehr schnell; Beispiel: Netzwerkkarten)&lt;br /&gt;
&lt;br /&gt;
Lit.: &#039;&#039;Galvanische Trennung: Optokoppler, GMR-Koppler oder iCoupler?&#039;&#039;, Siegfried W. Best, Redaktion elektronik industrie, [http://www.elektronik-industrie.de/ei/11,2003/article/2f0082f824c.html elektronik industrie 11-2003, S. 22ff.]&lt;br /&gt;
&lt;br /&gt;
== Praktische Beispiele ==&lt;br /&gt;
&lt;br /&gt;
=== Einfaches RS232-Interface ===&lt;br /&gt;
&lt;br /&gt;
[http://web.archive.org/web/20050122013618/http://www.henrik-reimers.de/control/rs232interface.gif Erfolgreicher Einsatz bis 19200 Baud und bis zu 10 m Leitungslänge]&lt;br /&gt;
Beschränkungen:&lt;br /&gt;
&lt;br /&gt;
* ggf. Platzbedarf&lt;br /&gt;
* Geschwindigkeit s.o.&lt;br /&gt;
&lt;br /&gt;
Beispiel: http://www.hagtech.com/pdf/translator.pdf&lt;br /&gt;
&lt;br /&gt;
=== [[I2C]]-Bus: gemeinsam 3.3V und 5V ===&lt;br /&gt;
&lt;br /&gt;
* [[MSP430]] an 3,3V/5V: [https://www.ti.com/lit/pdf/slaa148 slaa148.pdf]&lt;br /&gt;
&lt;br /&gt;
* Philips [http://www.nxp.com/documents/data_sheet/PCA9515.pdf PCA9515]: I2C Puffer mit Pegelwandlung. Der PCA9515 ist ein I2C-Bus Repeater, welcher I2C Busse mit verschiedenen Spannungen isoliert. Verfügbar bei Reichelt und DigiKey.&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/attachment.php/256452/levelshifter.pdf  AN97055] von Philips, &amp;quot;Bi-directional level shifter for I²C-bus and other systems&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Bevor man ein Philips I2C Chip auswählt sollte man prüfen ob er verfügbar ist und auch das verfügbare Gehäuse wählen. Man sollte auch überlegen ob ein Puffer wirklich gebraucht wird. Wenn man echte I2C ICs mit 5V betreibt, dann sind die Eingänge vom Typ Schmitt Trigger CMOS (z.&amp;amp;nbsp;B. PCF8574). Dann müssen 3.3V Pegel auf 5V umgesetzt werden. Wenn man jedoch SMBUS Ics verwendet (z.&amp;amp;nbsp;B. ADT7461, Silabs 8051) dann sind die Schwellspannungen TTL kompatibel und es ist keine Anpassung notwendig. Für neue Pegelwandler sollte man hier nachschauen. http://www.bus-buffer.com&lt;br /&gt;
&lt;br /&gt;
* [http://www.edn.com/article/CA193193.html &amp;quot;Two-transistor circuit replaces IC&amp;quot;]. Für diese Anwendung kann ENABLE direkt mit 3.3V verbunden werden. Es ist eigentlich nur dazu da, den ICs &amp;quot;hot-swappable&amp;quot; zu machen (kann unter Spannung gesteckt und getrennt werden). Es geht sogar mit nur einem [[Transistor]] [http://www.mikrocontroller.net/topic/92447 siehe Forum]. Man sollte beachten, daß die Schaltung sowohl für SCL als auch SDA benötigt wird. &lt;br /&gt;
* Noch einfachere Lösungen mit nur einem MOSFET und zwei Pull-Up Widerständen pro Leitung sind in den folgenden Links zu finden. &lt;br /&gt;
** [https://cdn-shop.adafruit.com/datasheets/AN10441.pdf AN10441.pdf] von NXP&lt;br /&gt;
** [http://www.semiconductors.philips.com/acrobat_download/literature/9398/39340011.pdf 39340011.pdf] (Kapitel 18), bei der Berechnung der erreichbaren Geschwindigkeit dürfen die parasitären Kapazitäten der FETs nicht ignoriert werden&lt;br /&gt;
&lt;br /&gt;
=== Auswählbare Pegel ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frage:&#039;&#039;&#039;&lt;br /&gt;
Ein CMOS Logikpegel zwischen 1,8V, 2,5V und 3,3V (abhängig von der Anwendung) muss auf 5V CMOS Logikpegel gewandelt werden. Es geht nur um diese Richtung mit maximal 8MHz. Es gibt die Stromversorgung für alle Pegel. Ein normaler Komparator wie LM311 ist nicht möglich, da er beim Betrieb mit 5V Versorgunsspannung erst ab 1V zu schalten anfängt. Meine Idee ist die Verwendung eines High Speed OPVs mit R2R Eingang, z.&amp;amp;nbsp;B. LMH6645.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Antworten:&#039;&#039;&#039;&lt;br /&gt;
* Man könnte einen ultra-low threshold N-Kanal MOSFET nehmen und als Open Drain mit einem Pull-Up nach 5V betreiben, BSH103 könnte passen (Schwellspannung ~0,4V).&lt;br /&gt;
* High-Speed Single Supply Komparator wie z.&amp;amp;nbsp;B. [http://www-s.ti.com/sc/ds/tl712.pdf TL712] .&lt;br /&gt;
* SN74LVC1T45&lt;br /&gt;
* SN74LVC8T245&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frage:&#039;&#039;&#039;&lt;br /&gt;
Ich suchen einen IC, welcher eine Pegelwandlung von 3,3V nach 1,8V, 2,0V oder 5V ermöglicht und während des Betriebs umgeschaltet werden kann.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Antworten:&#039;&#039;&#039;&lt;br /&gt;
* So ein IC ist der Linear [http://www.linear.com/pc/productDetail.jsp?navId=H0,C1,C1007,C1071,P1601 LTC1555L-1.8] .&lt;br /&gt;
* SN74LVC1T45&lt;br /&gt;
* SN74LVC8T245&lt;br /&gt;
&lt;br /&gt;
=== AVR SPI (SDC/MMC)===&lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;bidirektionalen Betrieb&#039;&#039;&#039; zwischen 5V-AVR und 3,3V-Geräten und anders herum gibt es den Level-Translator &#039;&#039;&#039;MAX3378E&#039;&#039;&#039; von Maxim.&lt;br /&gt;
&lt;br /&gt;
Wenn die Datenrichtung am SPI im Zielsystem festgelegt ist, reichen &#039;&#039;&#039;unidirektionale Bausteine&#039;&#039;&#039;:&lt;br /&gt;
* 3x von 5V nach 3,3V und 1x von 3,3V nach 5V: &#039;&#039;&#039;MAX3392E&#039;&#039;&#039;&lt;br /&gt;
* 1x von 5V nach 3,3V und 3x von 3,3V nach 5V: &#039;&#039;&#039;MAX3390E&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Zum Anschließen einer SDC/MMC an einen 5V-AVR eignen sich somit der MAX3978E und der MAX3392E. Beide sind u.A. im winzigen TSSOP-14-Gehäuse verfügbar, nehmen sehr wenig Energie auf und eignen sich auch für andere Spannungen. Mit 3,3 und 5V beträgt die garantierte Übertragungsrate 8Mbps.&lt;br /&gt;
&lt;br /&gt;
* [http://datasheets.maxim-ic.com/en/ds/MAX3372E-MAX3393E.pdf Datenblatt]&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit zum Übersetzen zwischen 3,3 und 5V liegt in der Verwendung des &#039;&#039;&#039;74LVC245&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Bastlerfreundlicher als &#039;&#039;&#039;MAX33XXX&#039;&#039;&#039; (in SO-Gehäuse):&lt;br /&gt;
* 5V &amp;gt; 3,3V (SCK, MOSI, CS): 74LVC-serie (z.B. 74LVC14A)&lt;br /&gt;
* 3,3V &amp;gt; 5V (MISO): 74HCT-Serie (z.B. 74HCT125, 74HCT251)&lt;br /&gt;
&lt;br /&gt;
5V-AVR an eine MMC (ohne Level-Shifter-Baustein):&lt;br /&gt;
* [http://www.microsyl.com/index.php/2010/03/24/led-sign-with-mmc-memory-card/ Projektseite] &lt;br /&gt;
* [http://www.microsyl.com/projects/ledsign/ledsign1.pdf Schaltplan]&lt;br /&gt;
&lt;br /&gt;
=== Mikrocontroller ⇔ Parallelport ([[ISP]]-Dongle, [[JTAG]] Wiggler, ...) ===&lt;br /&gt;
&lt;br /&gt;
Dieser Schaltplan funktioniert auch bei 3,3 V wenn man einen 74&amp;lt;B&amp;gt;HC&amp;lt;/B&amp;gt;244 anstatt eines 74&amp;lt;B&amp;gt;LS&amp;lt;/B&amp;gt;244 verwendet: [http://www.epanorama.net/circuits/parallel_output.html Parallel port interfacing made easy: Simple circuits and programs to show how to use PC parallel port output capabilities].&lt;br /&gt;
&lt;br /&gt;
=== Doppeltes Leitungspaar RX/TX 5V/3,3V ===&lt;br /&gt;
&lt;br /&gt;
Der [http://www.hackaday.com/2008/06/19/sparkfuns-logic-level-converter/ SparkFun&#039;s Logic Level Converter] ist eine Baugruppe mit MOSFETs [http://www.fairchildsemi.com/pf/BS/BSS138.html BSS138] für die Pegelwandlung von 5V auf 3,3V. 5V/2,8V und 5V/1,8V sind ebenfalls machbar.&lt;br /&gt;
&lt;br /&gt;
=== Steuerleitung zwischen Mikrocontroller und FPGA ===&lt;br /&gt;
&lt;br /&gt;
Oftmals werden PLDs oder FPGAs per Microcontroller-Platine angesteuert. Ältere Typen laufen meist als 5V oder sitzen in 5V-kompatiblen Platinen. Sollen moderne FPGAs angesteuert werden, trifft man fast immer auf 3,3-V-Typen, bzw. muss sogar 2,5-V- / 1,8-V-Bänke beschalten, wenn nur noch dort Pins frei sind.&lt;br /&gt;
&lt;br /&gt;
==== Mikrocontroller ⇒ FPGA ====&lt;br /&gt;
&lt;br /&gt;
Die 5 V sind also im Extremfall auf 1,8 V herabzusetzen, was bei einem maximal zulässigen Diodenstrom von 3 mA (Beispiel Xilinx) einen Mindestwiderstand von ca. 1 kΩ erfordert. Die resultierende maximale Schaltfrequenz liegt dann bei einem typischen FPGA-Eingang bei etwa &amp;lt; 500 kHz. Soll der Eingang aus Belastungsgründen nicht mit mehr als 0,3 mA belastet werden, müsste der Widerstand auf 10 kΩ steigen, wodurch die Frequenz auf 1/10 sinkt. Zudem ist der Eingang dann störempfindlicher. Daher ist es besser, man schaltet dem Eingang eine zusätzliche Z-Diode bei und dimensioniert den Vorwiderstand so, dass die Strombelastbarkeit des Mikrocontrollers ausgelastet wird.&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit ist es, die Spannung mit einer Diode in Vorwärtsrichtung herabzusetzen. Dann muss jedoch der Vorwiderstand noch exakter toleriert werden und auch Abweichungen der Spannung (Welligkeit) berücksichtigt werden.&lt;br /&gt;
&lt;br /&gt;
==== FPGA ⇒ Mikrocontroller ====&lt;br /&gt;
&lt;br /&gt;
Umgekehrt ist es oft nötig, dass Bausteine einen fremden Chip treiben müssen, dessen Eingang bereits mit einem Pull-Up versehen ist. Über diesen wird dann stets ein Strom in die Schutzdiode eingeprägt, auch wenn der Ausgang auf HIGH geht. Soll z. B. von einem PLD oder einem FPGA aus eine Mikrocontrollerplatine bedient werden, die über einen Pull-Up von 1 kΩ verfügt, würden immer ca. 1 mA in die Schutzdiode eingeprägt. Hier kann eine Seriendiode helfen, die Spannung genügend herabzusetzen, um den Ausgang zu schützen und dennoch die Funktion zu erhalten. Dann steuert ein LOW-Ausgang den Eingang auf geschätzte 1V, was aber meistens für das Erkennen von LOW noch sicher reicht.&lt;br /&gt;
&lt;br /&gt;
== Bauteile ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;74ALVC164245&#039;&#039;&#039; - &#039;&#039;16bit dual supply translating transceiver&#039;&#039;. Eine Seite von 1.5V bis 3.6V, die andere von 1.5 bis 5.5V.&lt;br /&gt;
* &#039;&#039;&#039;74LVX573&#039;&#039;&#039; (unidirektional, Latch, nicht alle Hersteller bauen diesen 5V tolerant!)&lt;br /&gt;
* &#039;&#039;&#039;74LVX245&#039;&#039;&#039; (bidirektional, nicht alle Hersteller bauen diesen 5V tolerant!)&lt;br /&gt;
* &#039;&#039;&#039;74LVX125&#039;&#039;&#039; - &#039;&#039;Low Voltage Quad Buffer with 3-STATE Outputs&#039;&#039;. http://www.fairchildsemi.com/pf/74/74LVX125.html&lt;br /&gt;
* &#039;&#039;&#039;SN74LVC2T45&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;SN74LVC8T245&#039;&#039;&#039; - &#039;&#039;8-Bit Dual-Supply Bus Transceiver with Configurable Voltage Translation and Three-State Outputs&#039;&#039;. http://focus.ti.com/docs/prod/folders/print/sn74lvc8t245.html&lt;br /&gt;
* &#039;&#039;&#039;74LCX244MSA&#039;&#039;&#039; von Fairchild.&lt;br /&gt;
* &#039;&#039;&#039;MAX3377&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;MAX3000&#039;&#039;&#039; 8-Kanal bidirektioneler Pegelwandler ohne Richtungsumschaltung&lt;br /&gt;
* &#039;&#039;&#039;ADG3308&#039;&#039;&#039; 8-Kanal bi-dir. Pegelwandler ohne Richtungsumschaltung, 1,15V..5,5V, 50MBps (hohe Umschaltströme beachten)&lt;br /&gt;
&lt;br /&gt;
Vierfachdioden im kleinen 6-poligen SMD-Gehäuse:&lt;br /&gt;
* [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/CD00130230.pdf DSILC6-4xx.pdf]&lt;br /&gt;
* [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/CD00065974.pdf DVIULC6-4SC6.pdf]&lt;br /&gt;
* [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/CD00001734.pdf DALC208.pdf]&lt;br /&gt;
* [http://www.diodes.com/datasheets/ds30195.pdf QSBT40, vierfach Schottky Terminator für Datenleitungen]&lt;br /&gt;
* [http://www.littlefuse.com/data/en/Data_Sheets/SP724Lead_Free.pdf SP724, Siliziumschutzarray]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/307702#3316500 Forumsbeitrag]: Entkopplung von FT232 und AVR&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/503454?goto=6409954#6409949 Forumsbeitrag]:  2x level shift in Reihe (I2C)&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/525065#6828127 Forumsbeitrag]: Vorsicht bei bidirektionalen Pegelwandlern mit automatischer Richtungserkennung&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* Holmes D., [http://delphys.net/d.holmes/hardware/levelshift.html Bi-directional level-shift with MOSFETs]&lt;br /&gt;
* Gaurang Kavaiya, [http://www.edn.com/design/analog/4318916/Don-t-pay-for-level-translators-in-systems-using-multiple-power-supply-voltages Don’t pay for level translators in systems using multiple power-supply voltages], EDN, MAY 25, 2006, 81-86&lt;br /&gt;
* [http://www.elektronik-kompendium.de/public/schaerer/scf3_lc.htm Einfacher Pegelwandler im ELKO]&lt;br /&gt;
* [http://www.prog-link.com/dcf77/dcf77-17.html Pegelwandler für DFC77 Module]&lt;br /&gt;
* [http://elektronik.kai-uwe-schmidt.de/index.php?page=mp3_blueschaltung Pegelwandler für [[I2C]] Bus in einem MP3 Player]&lt;br /&gt;
* [http://www.mikrocontroller.net/attachment.php/256452/levelshifter.pdf Application Note von Philips, I2C Pegelwandler]&lt;br /&gt;
* [http://www.nxp.com/documents/user_manual/UM10204.pdf I2C Spezifikation]  &lt;br /&gt;
* [http://www.mikrocontroller.net/forum/read-1-234277.html#new Forumsbeitrag zum Thema 1,8V-5V Pegelwandler] &lt;br /&gt;
* [http://www.st.com/web/en/resource/technical/document/datasheet/CD00001208.pdf 74LCX16245, 16 Bit Pegelwandler]&lt;br /&gt;
* [http://www.standardics.nxp.com/products/lvc/buffers/ LVC Logikfamilie]&lt;br /&gt;
* [http://www.standardics.nxp.com/products/lvc/transceivers/ LVC Tranceiver]&lt;br /&gt;
* [http://www.microchip.com/stellent/groups/techpub_sg/documents/devicedoc/en026368.pdf 3V Tips ‘n Tricks] (PDF) von Microchip&lt;br /&gt;
* [http://www.ti.com/lit/an/slaa148/slaa148.pdf Interfacing the 3-V MSP430 to 5-V Circuits] (PDF) von Texas Instruments&lt;br /&gt;
* [http://www.ti.com/logic-circuit/voltage-level-translation/overview.html Texas Instruments Voltage level translators]: Auswahl passender Bauelemente durch Eingabe der gewünschten Parameter&lt;br /&gt;
&lt;br /&gt;
[[Category:Bauteile]]&lt;br /&gt;
[[Kategorie:Datenübertragung]]&lt;/div&gt;</summary>
		<author><name>Hansschall</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_16-Bit-Register&amp;diff=106933</id>
		<title>AVR 16-Bit-Register</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_16-Bit-Register&amp;diff=106933"/>
		<updated>2024-06-16T15:56:09Z</updated>

		<summary type="html">&lt;p&gt;Hansschall: /* Allgemeines */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Allgemeines ===&lt;br /&gt;
&lt;br /&gt;
Speziell bei den [[AVR-Tutorial: Timer#Timer 1|16-Bit-Timern]] und auch beim [[AVR-Tutorial: ADC|ADC]] ist es bei allen Zugriffen auf Datenregister erforderlich, dass diese Daten synchronisiert sind. Wenn z.&amp;amp;nbsp;B. bei einem 16-Bit-Timer das High-Byte des Zählregisters gelesen wurde und vor dem Lesezugriff auf das Low-Byte ein Überlauf des Low-Bytes stattfindet, erhält man einen völlig unsinnigen Wert. Auch die Compare-Register müssen synchron geschrieben werden, da es ansonsten zu unerwünschten Compare-Ereignissen kommen kann.&lt;br /&gt;
&lt;br /&gt;
Beim ADC besteht das Problem darin, dass zwischen den Zugriffen auf die beiden Teilregister eine Wandlung beendet werden kann und der ADC ein neues Ergebnis in ADCL und ADCH schreiben will, wodurch High- und Low-Byte nicht zusammenpassen.&lt;br /&gt;
&lt;br /&gt;
Bei den Timern wird die Synchronistation über ein temporäres Register gelöst:&lt;br /&gt;
&lt;br /&gt;
Beim ersten Lesezugriff wird die jeweils andere Registerhälfte in ein temporäres Register kopiert und der zweite Zugriff automatisch auf dieses umgeleitet. Beim Schreibzugriff wird der erste Zugriff umgeleitet und erst der Zweite ändert das Register.&lt;br /&gt;
&lt;br /&gt;
Damit der Zugriff korrekt abläuft muss eine festgelegte Reihenfolge eingehalten werden.&lt;br /&gt;
&lt;br /&gt;
Beim &#039;&#039;&#039;Lesezugriff&#039;&#039;&#039; muss &#039;&#039;&#039;erst das Low-Byte, dann das High-Byte&#039;&#039;&#039; gelesen werden.&lt;br /&gt;
&lt;br /&gt;
Um den &#039;&#039;&#039;Schreibzugriff&#039;&#039;&#039; besonders kompliziert zu machen, hat Atmel die Reihenfolge dafür zwischenzeitlich geändert: Bei &#039;&#039;&#039;klassischen AVRs&#039;&#039;&#039; (z.B. ATmega328) muss &#039;&#039;&#039;zuerst das High-Byte, dann das Low-Byte&#039;&#039;&#039; geschrieben werden. Bei einigen &#039;&#039;&#039;neueren AVRs&#039;&#039;&#039; (z.B. ATtiny 0-Series) muss auch beim Schreibzugriff &#039;&#039;&#039;erst das Low-Byte, dann das High-Byte&#039;&#039;&#039; geschrieben werden. Im Zweifelsfall hilft wie immer ein Blick ins Datenblatt.&lt;br /&gt;
&lt;br /&gt;
Des weiteren ist zu beachten, dass es für alle 16-Bit-Register eines Peripherals nur ein einziges temporäres Register gibt, so dass das Auftreten eines Interrupts, in dessen Handler ein solches Register manipuliert wird, bei einem durch ihn unterbrochenen Zugriff i.&amp;amp;nbsp;d.&amp;amp;nbsp;R. zu Datenmüll führt. &#039;&#039;&#039;16-Bit-Zugriffe sind generell nicht atomar!&#039;&#039;&#039; Wenn mit &#039;&#039;&#039;Interrupts&#039;&#039;&#039; gearbeitet wird, kann es erforderlich sein, vor einem solchen Zugriff auf ein 16-Bit-Register die Interrupt-Bearbeitung (mittels &amp;lt;code&amp;gt;cli&amp;lt;/code&amp;gt;) zu deaktivieren. Alternativ kann man das TEMP-Register ähnlich den CPU-Registern im Interrupt sichern und anschlieẞend wiederherstellen (funktionert zumindest bei neueren AVRs)&lt;br /&gt;
&lt;br /&gt;
Beim &#039;&#039;&#039;ADC-Datenregister ADCH/ADCL&#039;&#039;&#039; ist die Synchronisierung anders gelöst. Hier werden beim Lesezugriff (ADCH/ADCL sind logischerweise &#039;&#039;read-only&#039;&#039;) auf das Low-Byte ADCL beide Teilregister für Zugriffe seitens des ADC so lange gesperrt, bis das High-Byte ADCH ausgelesen wurde. Dadurch kann der ADC nach einem Zugriff auf ADCL keinen neuen Wert in ADCH/ADCL ablegen, bis ADCH gelesen wurde. Ergebnisse von Wandlungen, die zwischen einem Zugriff auf ADCL und ADCH beendet werden, gehen verloren!&lt;br /&gt;
Daraus folgt:&lt;br /&gt;
&#039;&#039;&#039;Nach einem Zugriff auf ADCL muss grundsätzlich ADCH gelesen werden!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Beim ADC gibt es für den Fall, dass eine Auflösung von 8 Bit ausreicht, die Möglichkeit, das Ergebnis „linksbündig“ [[AVR-Tutorial: ADC#Die Ergebnisregister ADCL und ADCH|in ADCH/ADCL auszurichten]], so dass die relevanten 8 MSB in ADCH stehen. In diesem Fall muss bzw. sollte nur ADCH ausgelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== Zugriffe in C ===&lt;br /&gt;
&lt;br /&gt;
In beiden Fällen (also sowohl bei den Timern als auch beim ADC) werden von &#039;&#039;&#039;C-Compilern&#039;&#039;&#039; 16-Bit-Pseudo-Register zur Verfügung gestellt (z.&amp;amp;nbsp;B. TCNT1H/TCNT1L &amp;amp;rarr; TCNT1, ADCH/ADCL &amp;amp;rarr; ADC bzw. ADCW), bei deren Verwendung der Compiler automatisch die richtige Zugriffsreihenfolge regelt. &#039;&#039;&#039;In C-Programmen sollten grundsätzlich diese 16-Bit-Register verwendet werden.&#039;&#039;&#039; Sollte trotzdem ein Zugriff auf ein Teilregister erforderlich sein, sind obige Angaben zu berücksichtigen.&lt;br /&gt;
&lt;br /&gt;
Es ist darauf zu achten, dass auch ein Zugriff auf die 16-Bit-Register vom Compiler in zwei 8-Bit-Zugriffe aufgeteilt wird und dementsprechend genauso nicht-atomar ist wie die Einzelzugriffe. Auch hier gilt, dass unter Umständen die Interrupt-Bearbeitung gesperrt werden muss, um Datenmüll zu vermeiden.&lt;br /&gt;
&lt;br /&gt;
ADC und ADCW sind unterschiedliche Bezeichner für das selbe Registerpaar. Üblicherweise kann man in C-Programmen ADC verwenden, was analog zu den anderen 16-Bit-Registern benannt ist. ADCW (ADC Word) existiert nur deshalb, weil die Headerdateien auch für Assembler vorgesehen sind und es bereits einen Assembler-Befehl namens &amp;lt;code&amp;gt;adc&amp;lt;/code&amp;gt; gibt.&lt;br /&gt;
&lt;br /&gt;
=== Makros ===&lt;br /&gt;
&lt;br /&gt;
Um den Zugriff auf diese 16-Bit-Register zu vereinfachen,&lt;br /&gt;
hat ATMEL in der Application Note &#039;&#039;[https://www.microchip.com/en-us/application-notes/an1493 AVR072: Accessing 16-bit I/O Registers]&#039;&#039; folgende Makros zur freien Verwendung vorgeschlagen:&lt;br /&gt;
&lt;br /&gt;
==== AVR-Assembler-Makros ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
.macro outw&lt;br /&gt;
  cli&lt;br /&gt;
  out @0, @1&lt;br /&gt;
  out @0-1, @2&lt;br /&gt;
  sei&lt;br /&gt;
.endmacro&lt;br /&gt;
&lt;br /&gt;
.macro inw&lt;br /&gt;
  cli&lt;br /&gt;
  in @1, @2-1&lt;br /&gt;
  in @0, @2&lt;br /&gt;
  sei&lt;br /&gt;
.endmacro&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anwendung&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
.include &amp;quot;8515def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
inw r17, r16, TCNT1H  ; Reads the counter value (high, low, adr)&lt;br /&gt;
outw TCNT1H, r17, r16 ; Writes the counter value (adr, high, low)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IAR-C-Makros ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;ina90.h&amp;gt;&lt;br /&gt;
#define outw( ADDRESS, VAL )\&lt;br /&gt;
  {\&lt;br /&gt;
  _CLI();\&lt;br /&gt;
  ADDRESS = VAL;\&lt;br /&gt;
  _SEI();\&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
#define inw( ADDRESS, VAL )\&lt;br /&gt;
  {\&lt;br /&gt;
  _CLI();\&lt;br /&gt;
  VAL = ADDRESS;\&lt;br /&gt;
  _SEI();\&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anwendung&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;io8515.h&amp;gt;&lt;br /&gt;
inw( TCNT1, i ) ;  /* Reads the counter value */&lt;br /&gt;
outw( TCNT1, i ) ; /* Writes the counter value */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: AVR-Tutorial]]&lt;/div&gt;</summary>
		<author><name>Hansschall</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Wellenwiderstand&amp;diff=105824</id>
		<title>Wellenwiderstand</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Wellenwiderstand&amp;diff=105824"/>
		<updated>2023-01-08T16:04:59Z</updated>

		<summary type="html">&lt;p&gt;Hansschall: Abschnitt Berechnung hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Schnelle Digitalschaltkreise bzw. hochfrequente Analogschaltungen stellen erhöhte Anforderungen an die Verbindungsleitungen zwischen ICs und Baugruppen. Wo ein langsamer CMOS-Baustein der 4000 Serie mit ein paar Megahertz (wobei die Flankensteilheit entscheidet - nicht die Frequenz) noch problemlos auf dem Steckbrett mit wilder Klingeldrahtverkabelung funktioniert, dort versagt ein moderner, schneller IC seinen Dienst. Ähnliches passiert auf geätzten Leiterplatten. Nicht nur die Packungsdichte der Gehäuse, auch die immer kürzer werdenden Schaltzeiten der Signale verlangen mehr und mehr einen durchdachten, hochfrequenzgerechten Aufbau mit zwei, vier oder mehr Lagen. Die Verbindungsleitungen, welche bei niedrigen Frequenzen praktisch nicht auffallen, sind plötzlich sichtbare Bauelemente, welche die zwei wichtigen Parameter Wellenwiderstand und Laufzeit aufweisen.&lt;br /&gt;
&lt;br /&gt;
== Wellenwiderstand ==&lt;br /&gt;
&lt;br /&gt;
[[bild:wellenwiderstand_ersatzschaltbild.png|thumb|right|372px|Modell eines elektrischen Leiters mit Widerständen, Kapazitäten und Induktivitäten]]&lt;br /&gt;
Eine elektrische Leitung muß bei hohen Frequenzen als ein Netzwerk aus folgenden Komponenten betrachtet werden:&lt;br /&gt;
&lt;br /&gt;
* Serienwiderstand R&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;&lt;br /&gt;
* Parallelwiderstand R&amp;lt;sub&amp;gt;p&amp;lt;/sub&amp;gt;&lt;br /&gt;
* Serieninduktivität L&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;&lt;br /&gt;
* Parallelkapazität C&amp;lt;sub&amp;gt;p&amp;lt;/sub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Praktisch kann man sich das so vorstellen: Jeder elektrische Leiter hat einen [[Widerstand|ohmschen Widerstand]] Rs. Vorsicht! Das ist nicht der Wellenwiderstand! Ebenso hat jede elektrische Leitung einen Widerstand zwischen den Leitern, denn der Isolator ist nie ideal. Praktisch kann man den allerdings meist vernachlässigen, da er im Bereich von Gigaohm liegt.&lt;br /&gt;
&lt;br /&gt;
Die unvermeidlichen und ausschlaggebenden Parameter sind jedoch L&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt; und C&amp;lt;sub&amp;gt;p&amp;lt;/sub&amp;gt;. Jeder elektrische Leiter, welcher von einem Strom durchflossen wird, erzeugt ein Magnetfeld. Das ist gleichbedeutend mit der Induktivität L&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;. Ebenso besteht zwischen zwei isolierten Leitern immer ein elektrisches Feld, wodurch der Kondensator C&amp;lt;sub&amp;gt;p&amp;lt;/sub&amp;gt; gebildet wird. L&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt; und C&amp;lt;sub&amp;gt;p&amp;lt;/sub&amp;gt; sind die entscheidenden Größen zur Bestimmung des Wellenwiderstandes. Je nach geometrischer Anordnung der Leiter kann man sie in gewissen Grenzen variieren (Koaxialkabel, Twisted Pair, Flachbandkabel etc.).&lt;br /&gt;
&lt;br /&gt;
Der Wellenwiderstand berechnet sich aus&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;Z_0= \sqrt{\frac{L_s}{C_p}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Er ist eine charakteristische Größe einer Leitung und somit unabhängig von deren Länge.&lt;br /&gt;
&lt;br /&gt;
Läuft eine (nicht notwendigerweise sinusförmige) Welle entlang der positiven Richtung der Leitung, so ist das Verhältnis von U und I zu jedem Zeitpunkt und an jeder Stelle der Leitung gleich dem Wert des Wellenwiderstandes.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;Z_0= \frac{U_{h}}{I_{h}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Welle wird hier allgemein beschrieben als&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;U_h(x,t)= h(x-ct)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies gilt jedoch nur, solange keine Reflexionen an den Enden auftreten, da ansonsten zur hin- auch eine rücklaufende Welle &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;U_r(x,t)= r(x+ct)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
hinzukommt. Für letztere gilt der Zusammenhang völlig analog, &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;Z_0= \frac{U_{r}}{I_{r}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jedoch nicht für die Summe.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
* Koaxialkabel RG58 und RG174, 50Ω &lt;br /&gt;
* Koaxialkabel RG59, 75Ω;&lt;br /&gt;
* Twisted Pair CAT3/5/7 für Ethernet, 100Ω&lt;br /&gt;
* Flachbandkabel, 150Ω typ.&lt;br /&gt;
* Leiterbahnen auf Platinen mit 30...150Ω&lt;br /&gt;
&lt;br /&gt;
== Laufzeit ==&lt;br /&gt;
&lt;br /&gt;
Elektrische Signale haben eine sehr hohe, aber dennoch begrenzte Ausbreitungsgeschwindigkeit. In Luft bzw. im Vakuum breiten sich Funksignale mit Lichtgeschwindigkeit aus, das sind 300.000 km/s, oder 30cm/ns. Auf Leitungen breiten sich Signale langsamer aus, da das elektromagnetische Feld mit der Umgebung interagiert. Je nach Leitungstyp etwa mit 50..70% der Lichtgeschwindigkeit, sprich mit ca. 15..21 cm/ns.&lt;br /&gt;
&lt;br /&gt;
== Terminierung ==&lt;br /&gt;
&lt;br /&gt;
Wenn eine elektrische Leitung als lang betrachtet werden muß, dann treten Reflexionen auf. Diese sind unerwünscht und können von sporadischen Fehlern bis zum völligen Versagen einer Schaltung alles verursachen. Deshalb müssen solche Leitungen terminiert werden. Die Terminierung absorbiert die einlaufenden Signale und verhindert damit ungewollte Reflexionen. Eine Leitung wird mit einem ohmschen Widerstand terminiert, welcher den gleichen Wert wie der Wellenwiderstand aufweist. Die Terminierungswiderstände müssen möglichst am Ende der Leitung plaziert werden.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Eine Leitung ist dann als elektrisch lang zu betrachten, wenn die einfache Laufzeit der Leitung größer als ca. 1/6 der minimalen Anstiegszeit der Signale ist.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
;Ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
Ein [[AVR]] ist ein recht typischer, digitaler IC. Die minimale Anstiegszeit beträgt ca. 5ns. Nach obiger Formel darf die Laufzeit nur&lt;br /&gt;
: 1/6&amp;amp;nbsp;·&amp;amp;nbsp;5ns&amp;amp;nbsp;≈&amp;amp;nbsp;0,83ns&lt;br /&gt;
betragen. Bei einer Ausbreitungsgeschwindigkeit von 21cm/ns ergibt das eine maximal zulässige Leitungslänge von&lt;br /&gt;
: 21cm/ns&amp;amp;nbsp;·&amp;amp;nbsp;0,83ns&amp;amp;nbsp;≈&amp;amp;nbsp;17,5cm&lt;br /&gt;
Das heißt, bei einer Leitungslänge von bis zu 17,5cm &#039;&#039;und&#039;&#039; halbwegs sauberer Leitungsführung treten keine nennenswerten Reflexionen auf und eine Terminierung ist nicht notwendig. Darüber muss man aufpassen: spätestens bei dem doppelten bis dreifachen Wert ist eine Terminierung meist unverzichtbar.&lt;br /&gt;
&lt;br /&gt;
=== Serienterminierung ===&lt;br /&gt;
&lt;br /&gt;
[[bild:wellenwiderstand_serienterminierung.png|thumb|right|350px|Serienterminierung]]&lt;br /&gt;
Serienterminierung arbeitet bewußt mit Reflexionen. Von der Quelle wird ein Signal mit einem Innen&amp;amp;shy;widerstand gleich dem Wellen&amp;amp;shy;widerstand eingespeist. Dadurch ergibt sich ein Spannung&amp;amp;shy;steiler von 1:2, d.h. Das Signal hat kurzzeitig nur die halbe Amplitude. Damit läuft es bis zum Ende der Leitung, welches offen ist. Es wird zu 100% reflektiert. Dadurch entsteht der volle Spannungs&amp;amp;shy;pegel. Wenn die rücklaufende Reflexion die Quelle wieder erreicht wird sie vom Innen&amp;amp;shy;widerstand der Quelle, welcher gleich dem Wellen&amp;amp;shy;widerstand ist, absorbiert, es entsteht keine weitere Reflexion. Idealerweise sollte der externe Serien&amp;amp;shy;widerstand Rs plus der Innen&amp;amp;shy;widerstand des Ausgangs Ri gleich dem Wellen&amp;amp;shy;widerstand sein. CMOS-ICs haben Ausgangs&amp;amp;shy;widerstände zwischen 15..50Ω.&lt;br /&gt;
&lt;br /&gt;
Der Terminierungswiderstand muss in der Nähe des Ausgangs des treibenden Bausteins platziert werden -&amp;gt; Quellenterminierung.&lt;br /&gt;
&lt;br /&gt;
Datensignale können meist problemlos mit Serien&amp;amp;shy;terminierung betrieben werden. Taktsignale dürfen nur bei Punkt zu Punkt Verbindungen mit Serienterminierung betrieben werden (ein Sender und nur ein Empfänger). Anderenfalls kann es zu Fehlfunktionen kommen, da ein Takteingang, welcher in der Mitte der Leitung sitzt für ein paar Nanosekunden eine Spannung am Eingang anliegen hat die etwa VCC/2 entspricht. Das ist aber genau die Schaltschwelle von CMOS-ICs. Kleinste eingekoppelte Störungen können nun dafür sorgen, daß der Takteingang mehrere Flanken &amp;quot;sieht&amp;quot;, wo eigentlich nur eine sein sollte.&lt;br /&gt;
&lt;br /&gt;
=== Parallelterminierung ===&lt;br /&gt;
&lt;br /&gt;
[[bild:wellenwiderstand_parallelterminierung.png|thumb|right|350px|Parallelterminierung]]&lt;br /&gt;
Parallelterminierung absorbiert die ankommende Welle am Ende einer Leitung. Damit treten zu keinem Zeitpunkt Reflexionen auf. Nachteilig ist der Stromverbrauch bei HIGH-Pegel. Diese Terminierung ist nicht für 5 oder 3.3V CMOS geeignet. Parallelterminierung wird typisch bei Ethernet sowie beim RS485-Bus verwendet, dort sogar an beiden Enden. Es gibt diverse IO-Standards wie HSTL, SSTL etc., welche für schnelle ICs entwickelt wurden (DDR-RAM, DDR2-RAM), diese arbeiten mit Parallel- sowie Serien&amp;amp;shy;terminierung.&lt;br /&gt;
&lt;br /&gt;
[[bild:wellenwiderstand_vt-terminierung.png|thumb|right|350px|Terminierungsspannung]]&lt;br /&gt;
Den Stromverbrauch kann man halbieren, indem man mit einem speziellen Spannungsregler eine sog. &#039;&#039;Terminierungs&amp;amp;shy;spannung&#039;&#039; generiert (z.&amp;amp;nbsp;B. bei SCSI). Dieser Spannungsregler muss sowohl Strom liefern können (source) als auch Strom aufnehmen können (sink). Allerdings ist auch hier der Strom&amp;amp;shy;verbrauch noch recht beachtlich, jedoch hat man mit etwas stärkeren Bustreibern eine Chance, auch mit 5/3.3V CMOS eine Terminierung treiben zu können.&lt;br /&gt;
&lt;br /&gt;
Der Terminierungswiderstand muss in der Nähe des Eingangs des empfangenden Bausteins platziert werden -&amp;gt; Senkenterminierung.&lt;br /&gt;
&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
[[bild:wellenwiderstand_theveninterminierung.png|thumb|right|350px|Thevenin-Terminierung]]&lt;br /&gt;
&lt;br /&gt;
Ohne Terminierungsspannung kommt man mit der sog. &#039;&#039;Thevenin-Terminierung&#039;&#039; aus. Dabei wird der Terminierungs&amp;amp;shy;widerstand durch zwei doppelt so große Widerstände ersetzt. Aus Sicht des Kabels sind diese beiden Widerstände &#039;&#039;parallel&#039;&#039; geschaltet! Wichtig ist der zusätzliche Kondensator an VCC und GND, er stellt einen hochfrequenten Kurzschluß dar und ist wichtig für die Funktion dieser speziellen Terminierung. Er muss wie ein [[Kondensator#Entkoppelkondensator | Entkoppelkondensator]] bei einem IC betrachtet und dementsprechend nah platziert werden.&lt;br /&gt;
&lt;br /&gt;
Daher auch der Name: &#039;&#039;Thevenin Equivalent&#039;&#039; ist im Englischen die Bezeichung für eine Ersatzschaltung mit anderem Aufbau aber im Endeffekt gleichen Eigenschaften. Hier spart man auch die Hälfte des Stroms ein, allerdings fliesst jetzt auch bei LOW ein Strom durch die Terminierung. Der Stromverbrauch bzw. die Treiberbelastung ist identisch zur Nutzung einer Terminierungsspannung.&lt;br /&gt;
&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
=== AC-Terminierung ===&lt;br /&gt;
&lt;br /&gt;
[[bild:wellenwiderstand_ac-terminierung.png|thumb|rigt|350px|AC-Terminierung]]&lt;br /&gt;
Um den Stromverbrauch allgemein zu senken kann AC-Terminierung eingesetzt werden. &lt;br /&gt;
&lt;br /&gt;
Dazu wird ein Kondensator in Reihe zum Terminierungs&amp;amp;shy;widerstand geschaltet. Damit fliesst nur für eine kurze Zeit ein Strom, wenn der Pegel wechselt. Nachteilig ist die bisweilen kritische Dimensionierung des Kondensators. Er darf nicht zu klein sein, damit die Spannung nicht zu schnell steigt und somit der Terminierungs&amp;amp;shy;widerstand nicht voll wirksam ist. Andererseits darf er nicht zu groß sein, damit der Umlade&amp;amp;shy;vorgang vor dem nächsten Flanken&amp;amp;shy;wechsel abgeschlossen ist (Taktfrequenz). Hier muß man ggf. experimentieren und &#039;&#039;richtig&#039;&#039; messen. Typische Werte liegen zwischen 100pF und 10nF.&lt;br /&gt;
&lt;br /&gt;
Für Takte und Signale mit konstantem Mittelwert ([[Manchester]]kodierung, 8B10B Kodierung) kann man den Kondensator sehr groß wählen (100nF Keramik + großen Elko). Dann lädt sich der Kondensator über mehrere Dutzend Takte auf den Mittelwert der Spannung auf und hält diese. Damit wirkt er wie eine Spannungsquelle für die Terminierungs&amp;amp;shy;spannung. Der Vorteil ist der eingesparte Spannungsregler, der Stromverbrauch ist hier identisch mit der Parallel&amp;amp;shy;terminierung mit Terminierungsspannng. Als grobe Orientierung sollte die Zeitkonstante aus Terminierungs&amp;amp;shy;widerstand mal Kondensator ca. 10 mal größer sein als die Periodendauer des Taktes bzw. die Bitdauer das Datenstroms sein:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R_T \cdot C_T \;\gtrapprox\; 10 \cdot T_\text{CLK}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Datensignalen ohne konstanten Gleichanteil (also die Mehrheit) wird es etwas schwieriger. Hier kann man mit folgender Abschätzung erste Versuche starten.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;R_T \cdot C_T \;\approx\; 3 \cdot t_\text{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Stromverbrauch der AC-Terminierung ist besondes klein bei Datensignalen, welche lange Zeit keine Pegelwechsel haben (Burst, Datenpakete etc.).&lt;br /&gt;
&lt;br /&gt;
== Takt- und Datensignale ==&lt;br /&gt;
&lt;br /&gt;
Bei Datensignalen ist es meist durchaus akzeptabel, wenn ein erhöhtes Maß an Überschwingern und Reflexionen auftreten. Auf synchronen [[Bus]]systemem werden die Daten mittels eines Taktes abgetastet. Nur zu diesem Zeitpunkt müssen die Daten sauber anliegen, ein wenig davor (Setup Time) und ein wenig danach (Hold time). Ganz anders bei Takten, asynchronen Resets und Interruptsignalen. Auf diese reagiert ein digitaler IC &#039;&#039;&#039;sofort&#039;&#039;&#039; und sehr schnell. Durch Reflexionen kann es zu &amp;quot;Zacken&amp;quot; auf Taktflanken kommen, welche ein langsamer IC ignoriert aber ein schneller darauf reagiert und zwei Taktflanken &amp;quot;sieht&amp;quot;, wo eigentlich nur eine ist. Hier muss man aufpassen. Diese Signale sollten&lt;br /&gt;
&lt;br /&gt;
* sehr solide layoutet werden&lt;br /&gt;
* etwas Abstand zu allen anderen Signalen bekommen&lt;br /&gt;
* ggf. sauber terminiert werden&lt;br /&gt;
&lt;br /&gt;
Dann gibt es auch keine Probleme mit instabilen Datenübertragungen etc.&lt;br /&gt;
&lt;br /&gt;
== Leitungsführung und Layout ==&lt;br /&gt;
&lt;br /&gt;
Der Zusatz &amp;quot;und halbwegs saubere Leitungsführung&amp;quot; ist eine entscheidende Komponente bei der Verteilung schneller Signale! Irgendwelche wilde Klingeldrahtorgien oder lieblos auf die Platine geschmissene Leitungen zählen nicht dazu. Im Idealfall sind die Leitungen mit einer Impedanz von 50 oder 75Ω layoutet, bei differentiellen Signalen auch 100Ω (Ethernet, LVDS etc.). Dazu muß eine bestimmte Geometrie der Leiterbahn eingehalten werden, im wesentlichen bestimmt durch Breite und Abstand zur Referenzfläche (GND oder VCC). Die Stichworte für eine Suche im Internet lauten Microstrip und Stripline. Bei zwei- oder vierlagigen Platinen werden die Leitungen mit 50/75&amp;amp;Omega; ziemlich breit, deshalb kann man sich dort dem Ideal nur sehr grob nähern. Dennoch sollte man es vor allem für Takte versuchen und möglichst die Leitung über einer Referenzfläche führen. Das grundlegende Prinzip lautet:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die Fläche der Leiterschleife zwischen Signal und Massefläche muß minimiert werden.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Man muß immer daran denken. Strom fließt immer im Kreis, deshalb heißt es ja auch Stromkreis. Der Stromkreis beginnt am Versorgungspin des ICs, welcher das Signal generiert, läuft über den Ausgang und die Signalleitung zum Eingang des Empfängers bzw. der dort platzierten Terminierung, dort nach Masse und über die Masse zurück zum Sender-IC. Die Rückleitung über Masse ist genauso wichtig wie die Hinleitung des Signals! Eine wild geschlungene Masseleitung macht das beste Layout zunichte. Optimal sind komplette Masseflächen, doch die sind meist nur bei Platinen mit vier oder mehr Lagen machbar. Bei hochfrequenten Analogschaltungen gönnt man sich den &amp;quot;Luxus&amp;quot; auch bei zweilagigen, weil man sonst in Teufels Küche kommt. Bei schnellen Digitalschaltungen auf zweilagigen Platinen muß man Kompromisse eingehen. Aber auch hier gilt die alte Weisheit, daß die Masse möglichst sternförmig verteilt werden sollte. Entgegen der weit verbreiteten Meinung spielen 90° Winkel keine große Rolle, auch nicht weit in den den Bereich von 1 GHz! Siehe [[#Links | Abschnitt Links]].&lt;br /&gt;
&lt;br /&gt;
Wenn Kabel als Verbindung zwischen ICs verwendet werden, sollte man auch hier Sorgfalt walten lassen.&lt;br /&gt;
&lt;br /&gt;
* Idealerweise sollte man bei Flachbandkabeln jede 2. Ader auf Masse legen und auf BEIDEN Seiten der Verbindung am Stecker mit der Masse der Platine verbunden werden.&lt;br /&gt;
* Meist reicht es, jede 4.  bis 10. Ader auf Masse zu legen, wobei man Takte direkt neben die Masse legen sollte.&lt;br /&gt;
* Bei Steuerkabeln (verdrillt oder auch nicht) gilt ähnliches.&lt;br /&gt;
&lt;br /&gt;
== Zusammenfassung ==&lt;br /&gt;
&lt;br /&gt;
* Entscheidend für das Entstehen von Reflexionen ist &#039;&#039;&#039;NICHT&#039;&#039;&#039; die Taktfrequenz sondern die Anstiegszeit der Signale. Eine Schaltung mit schnellen ICs wird auch bei niedrigen Taktfrequenzen sehr schnell schalten, auch wenn das nicht unbedingt notwendig wäre.&lt;br /&gt;
* Mit Reflexionen muß man rechnen, wenn die einfache Laufzeit der Leitung grösser als ca. 1/6 der minimalen Anstiegszeit der Signale ist.&lt;br /&gt;
* Serienterminierung ist für Takte nur bei Punkt-zu-Punkt-Verbindungen sicher nutzbar.&lt;br /&gt;
* Parallelterminierung ist für 5/3,3V CMOS ungeeignet (Stromverbrauch).&lt;br /&gt;
* Auch mit Terminierung ist bei schnellen Signalen eine halbwegs saubere Leitungsführung notwendig.&lt;br /&gt;
* Man sollte nach Möglichkeit immer die langsamsten Logikbausteine verwenden, um Probleme mit Reflexionen zu minimieren (Wozu braucht man 1ns Anstiegszeit bei 5 MHz Takt?).&lt;br /&gt;
* Ausgänge sollten möglichst identische Ausgangswiderstände für LOW und HIGH haben (wie z.&amp;amp;nbsp;B. die HC-Familie), sonst wird eine Serienterminierung schwierig bis unmöglich (wie. z.&amp;amp;nbsp;B. die ABT-Familie); siehe [http://www.ti.com/litv/pdf/szza008 &amp;quot;Input and Output Characteristics of Digital Integrated Circuits&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
== Berechnung ==&lt;br /&gt;
&lt;br /&gt;
Zur Berechnung kann man eine der in den Links aufgeführten Seiten benutzen. Die bessere Lösung (einfacher und offline) sind allerdings die in vielen Layout-Programmen enthaltenen Berechnungswerkzeuge. In KiCad z.B. unter PCB-Rechner &amp;gt; TransLine.&lt;br /&gt;
&lt;br /&gt;
== Eine schöne und verständliche Erklärung aus einem Forumsthread ==&lt;br /&gt;
&lt;br /&gt;
→ [http://www.mikrocontroller.net/topic/238751 Forum: &#039;&#039;Was ist der Wellenwiderstand?&#039;&#039;]&lt;br /&gt;
# Bei einer kurzen Leitung (kürzer als ein Viertel der Wellenenlänge)&lt;br /&gt;
#* Bei einer Leitung ohne Last (Re = ∞) wirkt die Leitung wegen ihrer verteilten Kapazität (Kapazitätsbelag) kapazitiv.&lt;br /&gt;
#* Bei einer Leitung mit Kurzschluss am Ende (Re = 0) wirkt die Leitung wegen ihrer verteilten Induktivität (Induktivitätsbelag) induktiv.&lt;br /&gt;
#* Irgendwo dazwischen gibt es einen Wert, wo Induktivität und Kapazität sich gerade kompensieren: Das ist der Wellenwiderstand. Er ermöglicht eine kapazitäts- und induktivitätsfreie Übertragung.&lt;br /&gt;
# Eine Leitung gibt an einen Lastwiderstand volle Leistung nur bei einem bestimmten Strom/Spannungsverhältnis ab. Wenn der Lastwiderstand ein anderes Strom/Spannungsverhältnis erzwingt, wird ein Teil des Stroms oder der Spannung in die Leitung reflektiert. Der Widerstand, bei dem z.B. Impulse reflexionsfrei übergeben werden, ist der Wellenwiderstand.&lt;br /&gt;
# Durch die Geometrie einer Leitung werden Kapazitätsbelag und/oder Induktivitätsbelag verändert. Aus dem Verhältnis Kapazität/Induktivität lässt sich ein Widerstand errechnen, dies ist der Wellenwiderstand.&lt;br /&gt;
&lt;br /&gt;
== 90° Ecken in Leiterbahnen ==&lt;br /&gt;
&lt;br /&gt;
Das Thema wird seit Jahrzehnten diskutiert, real gemessen haben die Wenigsten. Hier die kurze Zusammenfassung aus zwei guten Quellen.&lt;br /&gt;
&lt;br /&gt;
[http://www.ultracad.com/articles/90deg.pdf Messung] von Ultraboard&lt;br /&gt;
*sieben Leiterzüge mit 20,3cm Länge, 0,25mm Breite, Microstrip mit 50 Ohm; verschiedene Winkel&lt;br /&gt;
*Messung mit TDR und 17ps Anstiegszeit, ~2,8mm Pulslänge auf der Leitung, etwa 10fache Leiterbahnbreite &lt;br /&gt;
*Auf keiner Leitung konnten Effekte nachgewiesen werden!&lt;br /&gt;
*Eine Messung der Abstrahlung mittels Antenne bis 1,3 GHz zeigte auch keine sichtbaren Unterschiede jenseits der Messungenauigkeit&lt;br /&gt;
&lt;br /&gt;
[http://www.theamphour.com/the-amp-hour-77-winsome-waveform-wizardry/ Interview] mit [http://www.signalintegrity.com/hj.htm Dr. Howard Johnson],  HF-Guru&lt;br /&gt;
* Die Legende kommt aus dem Bereich der Mikrowellen, wo die Theorie und Praxis in den 1960er Jahren sehr umfangreich erarbeitet wurde&lt;br /&gt;
* Direkte Übertragung vom Mikrowellengebiet 1-100GHz auf schnelle Digitalsignale (100MHz-10GHz) ist direkt nicht möglich, weil die Parameter anders sind&lt;br /&gt;
* Typische Leiterbahnbreiten für Digitalsignale sind 0,25mm und weniger, eine 90 Grad Ecke fügt ca. 0,02pF hinzu, typische Frequenz 1GHz bei Signalamplituden von 400mV und mehr (PECL, LVDS), hoher Störabstand (Digitalsignale), der Effekt ist kaum nachweisbar&lt;br /&gt;
* Typische Leiterbahnbreite für Mikrowellentechnik ist 3mm, Kapazitätszuwachs liegt bei ca. 0,2pF, Frequenzen von 10 GHz und mehr, Signalamplituden im Millivoltbereich mit engen Toleranzen über eine lange, analoge Verstärkerkette (+/-0,5dB über 10 Stufen)&lt;br /&gt;
&lt;br /&gt;
Fazit. Die Winkel spielen unter 1 GHz keine Rolle, darüberhinaus nur sehr wenig. VIAs spielen bei 1GHz und mehr eine Rolle. 10fach wichtiger ist jedoch immer eine solide Bezugsfläche unter der HF-Leitung!&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/181484?goto=1752540#1752540 Forumsbeitrag]: Warum HF-Leitungen abrunden?&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/299855?goto=new#3220070 Forumsbeitrag:] Thevenin-Terminierung für einen [[SPI]]-[[Bus]] mit langen Kabeln&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/299855?page=1#3216635 Forumsbeitrag]: Einfacher Treiber für Parallelterminierung.&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/106235 Forumsbeitrag]: Wellenwiderstand messen&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/402587?goto=new#4658519 Forumsbeitrag]: Serienwiderstand bei Hochfrequenz&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/441586?goto=5267064#5267064 Forumsbeitrag]: Signale an intelligenten LEDs (WS2812B) und langen Leitungen&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/467198?goto=5706637#5706637 Forumsbeitrag]: Probleme mit SPI&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Wellenimpedanz Wellenwiderstand bei Wikipedia]&lt;br /&gt;
* [http://www.signalintegrity.com www.signalintegrity.com], Die Bibel der hochfrequenten Digitalsignale&lt;br /&gt;
* [http://www.onsemi.com/pub/Collateral/AND8020-D.PDF AppNote von ON Semiconductor: Termination of ECL Logic Devices] (ausführlicher als der Artikel)&lt;br /&gt;
* [http://www.ti.com/litv/pdf/szza008 &amp;quot;Input and Output Characteristics of Digital Integrated Circuits&amp;quot;]&lt;br /&gt;
* http://www.forelec.ch/fichiers/HS-PCB-1.PDF (Sehr gutes Dokument zum Thema)&lt;br /&gt;
* [http://wiki.fed.de/fed-wiki/images/3/3f/Impedanzarten_-_Lagenaufbauten.pdf Striplines/Microstrip schnell berechnet] (PDF)&lt;br /&gt;
* [http://www1.sphere.ne.jp/i-lab/ilab/tool/cpw_e.htm Online Calculator]&lt;br /&gt;
* [http://www.hp.woodshot.com/appcad/version302/setup.exe Noch ein Offline Calculator]&lt;br /&gt;
* Linksammlung [http://www.circuitsage.com/tline.html Transmission Line Design and Analysis]&lt;br /&gt;
* [http://www.epanorama.net/circuits/tdr.html TDR Circuit], ein einfaches Time Domain Reflektometer zum selber bauen&lt;br /&gt;
*[http://www.theamphour.com/the-amp-hour-77-winsome-waveform-wizardry/ The Amp Hour #77 — Winsome Waveform Wizardry], Podcast mit Dr. Howard Johnson, HF-Guru (Ab 01:15:00 kommt die Stelle zum Thema 90° Leiterbahnen)&lt;br /&gt;
* [https://www.youtube.com/watch?v=CaiuVwsV6Bw#t=18m57s High speed data transfer], Howard Johnson über 90 Grad Ecken in Digitalschaltungen (engl.)&lt;br /&gt;
* [http://www.ultracad.com/articles/90deg.pdf Messung] von verschiedenen Winkeln von Leiterbahnen mit 17ps TDR, keinerlei Unterschiede!&lt;br /&gt;
* [http://www.afug-info.de/Tipps-Tricks/Impedanz-messen/ Impedanzen einfach und praktisch messen]&lt;br /&gt;
* [https://homepages.thm.de/~hg7313/lehre/avt/skript/avt_hightechspeed_bg_kap2.pdf Impulse auf Leitungen - Elektrische Grundlagen], Vorlesungsmaterial&lt;br /&gt;
* [http://www.tkd-kabel.com.ua/catalogs/eng/03-BUS,%20LAN,%20coaxial,%20video%20and%20system%20flat%20ribbon%20cables.pdf PDF], diverse Kabel mit Daten zum Wellenwiderstand.&lt;br /&gt;
* [http://www.interfacebus.com/Design_Termination.html Trace Termination] (engl.)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Bauteile]]&lt;br /&gt;
[[Kategorie:Datenübertragung]]&lt;/div&gt;</summary>
		<author><name>Hansschall</name></author>
	</entry>
</feed>