<?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=172.26.40.198</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=172.26.40.198"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/172.26.40.198"/>
	<updated>2026-04-10T13:48:17Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=PiBla&amp;diff=104555</id>
		<title>PiBla</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=PiBla&amp;diff=104555"/>
		<updated>2021-06-18T15:29:36Z</updated>

		<summary type="html">&lt;p&gt;172.26.40.198: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;PiBla ist eine in VHDL geschriebene 8-Bit CPU. Die Grundarchitektur und der Befehlsatz entspricht dem des PicoBlaze Controllers für Xilinx-PLDs. &lt;br /&gt;
&lt;br /&gt;
==Überblick==&lt;br /&gt;
Eine Beschreibung des Vorbildes - der Picoblaze - findet sich in der Wikipedia:&lt;br /&gt;
[http://de.wikipedia.org/wiki/Picoblaze], die Orginalbeschreibung von Xilinx dort: [http://www.xilinx.com/products/ipcenter/picoblaze.htm]. Der PiBla entstand auf dem Wunsch einen eigenen Controller zur Lernen und Forschen zu Schreiben, ohne selbst einen Assembler schreiben zu müssen oder völlig von Null (Architekturentwurf) anzufangen. Der Orginale Xilinx-Core kommt zwar auch als VHDL daher, allerdings beschreibt dies einen Netzliste aus Primitiven und eignet sich nicht wirklich um eigene Modifikation auszuforschen.&lt;br /&gt;
&lt;br /&gt;
Der Pibla besteht aus dem eigentlichen Controller-Core und einem Block-Ram in der Befehlscode hinterlegt ist. Das eigentliche Programm wird in Assembler geschrieben, übersetzt und in ein Initialisierungsfile für den BlockRam umgewandelt. &lt;br /&gt;
&lt;br /&gt;
==Zielhardware==&lt;br /&gt;
Der core wurde für den Spartan3 entwickelt und läuft auf dem Spartan3 Evalboard von Xilinx. Er ist ca 20% größer als der orginale picoblaze, da aber noch nicht völlig entwanzt, ist er auch noch nicht optimiert. Maximale Taktfrequenz lag so um 60 MHz.&lt;br /&gt;
Probeweise wurde der core auch für Altera cyclone ii übersetzt. Der Ramblock für den Programmspeicher muss extra generiert (MegaFunction) werden und es werden FF statt RamBlöcke für das RegisterFile, Subroutine-Stack und ScratchPad-Ram FlopFlops implementiert. Der Core ist also ohne weitere Handarbeiten deutlicher größer im Vergleich zum Spartan 3 (mit distributed Ram).&lt;br /&gt;
&lt;br /&gt;
==Unterschiede==&lt;br /&gt;
Zum PicoBlaze gibt es folgende Unterschiede:&lt;br /&gt;
*jeder Befehl wird in einem Takt abgearbeitet&lt;br /&gt;
*der VHDL-Code ist eine Verhaltensbeschreibung (keine Netzliste wie der Picoblaze)&lt;br /&gt;
&lt;br /&gt;
==Architekturdetails==&lt;br /&gt;
===Registerfile===&lt;br /&gt;
Alle 16 Register sind durch einen 16x8bit DualPort RAM realisiert. Die beiden Source-register werden durch die beiden 4 bit Vectoren&lt;br /&gt;
&#039;&#039;freg_aSx&#039;&#039; und &#039;&#039;freg_aSy&#039;&#039; addressiert, das Zielregister durch &#039;&#039;freg_ai&#039;&#039;. Der Dualport RAM ist als Feld von 16 Elementen integer beschreiben, die integer sind auf den Wertebereich 0 bis 255 eingeschränkt.&lt;br /&gt;
===Call/Return addressstack===&lt;br /&gt;
Der Speicher für die 10 bit breiten Rücksprungaddressen ist als Feld von 30 Elementen beschrieben und als &amp;quot;Last In&amp;quot; - &amp;quot;First Out&amp;quot;&lt;br /&gt;
Memory realisiert. Bei jedem Abspeichern (&#039;&#039;save_pc = true&#039;&#039;) wird der Addresspointer des Stacks um eins erhöht, sonst beim Rücksprung&lt;br /&gt;
(&#039;&#039;restore_pc = true&#039;&#039;) dekrementiert.. Ist beim Speichern die adresse 30 erreicht wird der pointer auf die erste Adresse (&amp;quot;1&amp;quot;) gesetzt -overflow, ist beim Rücksprung dagegen die unterste Adresse aktive wird der pointer auf die höchste Adresse gesetzt -underflow.&lt;br /&gt;
&lt;br /&gt;
===Programm counter PC===&lt;br /&gt;
Die Adresse mit dem nächsten Befehlscode kann sein:&lt;br /&gt;
*die aktuelle addresse im PC um eins inkrementiert: &#039;&#039;nx_address&#039;&#039;,&lt;br /&gt;
*die Adresse 0x3FF bei Interrupt-requests&lt;br /&gt;
*die bits 9 bis 0 des aktuellen OpCodes (Sprung-adresse): &#039;&#039;instruction(9 downto 0)&#039;&#039;&lt;br /&gt;
*der letzte Eintrag im call/Return-Stack &#039;&#039;addr4stack&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
    addr4stack &amp;lt;= stack(stack_addr);&lt;br /&gt;
&lt;br /&gt;
    nx_address &amp;lt;= (others =&amp;gt; &#039;0&#039;) when count_q = &amp;quot;1111111111&amp;quot; else&lt;br /&gt;
                  count_q + 1;&lt;br /&gt;
&lt;br /&gt;
     ld_address &amp;lt;= &amp;quot;1111111111&amp;quot; when (interrupt = &#039;1&#039;) and (interrupt_del_q = &#039;0&#039;) and int_ena_q else&lt;br /&gt;
                instruction(9 downto 0) when (load_pc or save_pc) else&lt;br /&gt;
                addr4stack; &lt;br /&gt;
   --mux: Instructionpointer (PC) is loaded with a) jump address or instruction stack (subprogramm) b) next address (incremented)&lt;br /&gt;
    count &amp;lt;= unsigned(ld_address) when load_pc or restore_pc else&lt;br /&gt;
             nx_address;&lt;br /&gt;
    &lt;br /&gt;
    process(clk)&lt;br /&gt;
    begin&lt;br /&gt;
      if rising_edge(clk) then&lt;br /&gt;
        count_q &amp;lt;= count;&lt;br /&gt;
      end if;&lt;br /&gt;
    end process;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Arithmetik/Logikeinheit - ALU ===&lt;br /&gt;
&lt;br /&gt;
==Status==&lt;br /&gt;
&lt;br /&gt;
2010-Dez-10: Alle Befehle sind implementiert, allerdings sind einige (Logic-Befehle, SUB) noch nicht komplett überprüft.&lt;br /&gt;
&lt;br /&gt;
==Sourcedepot==&lt;br /&gt;
Auch auf diesem Server:  [svn://mikrocontroller.net/pibla|SVN-Protokoll] für SVN-Clients oder [http://www.mikrocontroller.net/svnbrowser/pibla] Webbrowser (HTML).&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;br /&gt;
[[Kategorie:FPGA und Co]]&lt;br /&gt;
[[Kategorie:VHDL]]&lt;br /&gt;
[[Kategorie:C]]&lt;/div&gt;</summary>
		<author><name>172.26.40.198</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Vervielfachung_der_Frequenz_mittels_Multiplikation&amp;diff=104554</id>
		<title>Vervielfachung der Frequenz mittels Multiplikation</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Vervielfachung_der_Frequenz_mittels_Multiplikation&amp;diff=104554"/>
		<updated>2021-06-18T15:27:35Z</updated>

		<summary type="html">&lt;p&gt;172.26.40.198: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:engineer|J.S.]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die ist ein Konzept eines einfachen mathematischen Frequenzvervielfachers mittels Multiplikation:&lt;br /&gt;
&lt;br /&gt;
Für den Fall perfekter Sinuswellen, welche symmetrisch zur X-Achse liegen oder deren Mittelwert bekannt und konstant ist, können die ganzzahligen Oberwellen durch eine simple Multiplikation mit der Grundwelle erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
Das Prinzip besteht darin, eine durch die Multiplikation entstehende Verschiebung infolge eines offsets wieder zu eliminieren. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery caption=&amp;quot;Beispiel&amp;quot; widths=&amp;quot;300&amp;quot; perrow=2&amp;gt;&lt;br /&gt;
Datei:Frequenzvervielfachung-durch-multiplikation.gif | Mathematische Darstellung in Excel für X2 und X3&lt;br /&gt;
Datei:Chipscope-screen-wave-multiplier.gif | Mehrere Verdopplungen in Xilinx FPGA (25MHz * 256)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wichtig ist, dass die Welle tatsächlich zur X-Achse symmetrisch und offsetfrei ist. In den Fällen, in denen das nicht der Fall ist, muss die Welle nachgesteuert oder vorgefiltert werden. In Echtzeit kann das mit einem Tiefpass geschehen.&lt;br /&gt;
&lt;br /&gt;
==Anwendung==&lt;br /&gt;
* Soundgenerator&lt;br /&gt;
* Waveform Generator&lt;br /&gt;
* Klangsynthese&lt;br /&gt;
* Messinstrumente&lt;br /&gt;
* Oberwellendetektor&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Signalgeneratoren]]&lt;br /&gt;
[[Kategorie:Signalverarbeitung]]&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>172.26.40.198</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Erweiterung_von_digitalen_IO-Ports&amp;diff=104551</id>
		<title>Erweiterung von digitalen IO-Ports</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Erweiterung_von_digitalen_IO-Ports&amp;diff=104551"/>
		<updated>2021-06-18T15:23:59Z</updated>

		<summary type="html">&lt;p&gt;172.26.40.198: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Für einfache Steueraufgaben werden oft Referenzspannungen benötigt, die man nur relativ langsam oder gar nicht ändern muss. Dafür sollen gfs. keine Chips und weitere Pins am Controller verwendet werden. Um die Zahl der Ports zu erweitern, können folgende Schaltungen eingesetzt werden:&lt;br /&gt;
&lt;br /&gt;
== Schieberegister ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:Erweiterung digitaler ausgaenge 1.png|thumb|right|320px|Multiplex-PWM als Port-Erweiterung für FPGAs]]&lt;br /&gt;
Die nebenstehende Schaltung besteht aus einem Schieberegister, das mit einem schnellen Taktsignal getrieben wird. Es erzeugt 4 unabhängige digitale Signale, die sich infolge der Dämpfungsglieder nicht schnell mitändern können. Auf diese Weise werden multiplexte PWM-Ausgänge geschaffen, die mit einem 1/4-tel der Taktfrequenz arbeiten. Die Fehlschaltungen, die beim Durchtakten eines neuen Schaltmusters entstehen, können bei der PWM-Generation im FPGA berücksichtigt werden. Um sie als echte digitale Ausgänge nutzen zu können, kann ein Buffer nachgeschaltet werden, der auch als Leistungstreiber agieren kann.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
== Schieberegister mit Latch==&lt;br /&gt;
&lt;br /&gt;
[[Datei:Erweiterung digitaler ausgaenge 2.png|thumb|right|320px|Stabile Zusatzports mit Latch]]&lt;br /&gt;
Ist ein reiner digitaler Ausgang benötigt, der nicht zittern darf, sollte ein Latch eingesetzt werden, das dann mit nur einem der künstlich erzeugten Bits getaktet werden muss. Dazu muessen doppelt soviele Befehlssequenzen ausgegeben werden, wobei das Latch-enable eine 0/1 sehen muss. Es sollte ein Latch mit Schmitt-Trigger-Eingängen verwendet werden.&lt;br /&gt;
&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
Dafür eignen sich die Bausteine HC165 und HC595.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Artikel zur PWM-Glättung: [[Glättungsfilter für 1-Bit DA-Wandlung|1-Bit Digital-Analog-Wandlung]]&lt;br /&gt;
* Porterweiterung mit SPI : [[Porterweiterung mit SPI]]&lt;br /&gt;
* Porterweiterung mit Standard-Chips : [[Porterweiterungen]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Bauteile]]&lt;br /&gt;
[[Kategorie:Portexpander]]&lt;/div&gt;</summary>
		<author><name>172.26.40.198</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Analog-IO_mit_digitalen_Bausteinen&amp;diff=104549</id>
		<title>Analog-IO mit digitalen Bausteinen</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Analog-IO_mit_digitalen_Bausteinen&amp;diff=104549"/>
		<updated>2021-06-18T15:21:26Z</updated>

		<summary type="html">&lt;p&gt;172.26.40.198: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Oft werden bei der Nutzung digitaler Bausteine einfache Analogeingaben oder -ausgaben benötigt, um langsame Signale zu erfassen. Nicht immer lohnt dabei der Einsatz eines AD-Wandlers, weil er zu teuer ist bzw. nicht mehr nachgerüstet werden kann oder mehrere Kanäle benötigt werden, die zuviel Platz beanspruchen, oder zuviele Pins belegen würden.&lt;br /&gt;
&lt;br /&gt;
Im Artikel werden Funktionen aufgezeigt, die mit maximal 2 Pins auskommen.&lt;br /&gt;
&lt;br /&gt;
== Einfacher 1pin-DAC ==&lt;br /&gt;
Die Ausgabe erfolgt z.B. mit einer [[PCM]] oder [[PWM]] mit anschließender analoger Filterung. Diese kann mit einem einfachen RC-Glied, einem T-Filter oder einem aktiven Filter geschehen. Siehe Artikel [[1-Bit Digital-Analog-Wandlung|1-Bit Digital-Analog-Wandlung]].&lt;br /&gt;
&lt;br /&gt;
=== Beispiel Audio ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Fpga-pwm-output-audio.png|thumb|right|320px|Filter für Audio-PWM: C1=470nF, C1*=4,7uF, R1=2700, R2=1000, C2=33nF, fg=15kHz, Ri&amp;gt;1kOhm]]&lt;br /&gt;
Die Abbildung rechts zeigt eine Dimensionierung für den Audiobereich. Mit Ra &amp;lt; 100 Ohm und Ri im Bereich einigen kOhm reicht ein Filter, das selbst einig km Widerstand hat und ab 5kHz-10kHz beginnt, abzufallen. Das Filter setzt konkret 3,3V auf den benötigten Pegel von +/- 0,45V herab und hat eine Netto-GF von ca 15kHz. Durch den geringen Innenwiderstand können unterschiedliche Geräte mit variablen Impedanzen angeschossen werden, ohne die Werte zu optimieren. Mit den o.a. Werten wird wird eine Dämpfung von 60dB für PWM-Frequenzen von 1 MHz erreicht. Diese lassen sich im uC mit einem Timer realisieren.&lt;br /&gt;
&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
== Einfacher 1pin ADC ==&lt;br /&gt;
[[Datei:Adc-with-1pin-for-fpga.png|thumb|right|320px|1-Bit-Analog-IO für FPGAs und DPSs]]&lt;br /&gt;
&lt;br /&gt;
Durch Anwendung eines Komparators, der das zu messende Eingangssignal permanent mit einer Rauschquelle vergleicht, kann ein 1-Bit-Digitalsignal ähnlich einer [[Pulsdichtemodulation]] generiert werden, welches durch Filterung mit einem Dezimationsfilter (z.B. SINC-Filter) in einen digitalen Datenstrom aus Integer-Werten überführt werden kann. Auch möglich ist die Benutzung einer hochfrequenten Sinuswelle, wenn deren Frequenz und gfs. Phase bekannt ist und die mit einem steilen Notchfilter analog abgezogen oder intern per Signalverbeitung verrechnet wird. In FPGAs ist eine solche Lösung leicht realisierbar, wenn der LVDS-Eingang (mit Komparator) genutzt wird. Als Rauschquelle kann diese Schaltung verwendet werden: [[Dithering#Analog-Digital-Wandler]]&lt;br /&gt;
&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
== Kombinierter 2pin DAC ADC ==&lt;br /&gt;
[[Datei:Adc-with-2pins-for-fpga.png|thumb|right|320px|2-Bit-Analog-IO für FPGA]]&lt;br /&gt;
&lt;br /&gt;
In Erweiterung der beiden o.g. Methoden kann für niedrige Frequenzen eine Regelung gebaut werden, die einem analogen Eingangssignal folgen kann. Dazu wird mit einem internen Komparator entschieden, ob die per PWM erzeugte externe Analogspannung die eingespeiste Messspannung über- oder unterschritten hat und diese entsprechend angepasst. Die Nachführung der Regelung muss langsamer geschehen, als die Änderungsgeschwindkeit, die durch die Bandbreite PWM-Glättung gegeben ist.&lt;br /&gt;
&lt;br /&gt;
Insgesamt ist diese Schaltung etwas schneller, als die Lösung mit unkontrolliertem Rauschen.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
==== Ultraschall ====&lt;br /&gt;
Mit o.g. Schaltung können bei einem FPGA mit 50MHz eine genügend gute PWM mit &amp;lt;10% ripple erzeugt und letztlich 50kHz pro Pin mit einer Auflösung besser als 1% gescannt werden. Die Schaltung ist so in einer Applikation seit mehren Jahren im Gebrauch. Die OPs sind in einem Mehrfachgehäuse zusammengefasst, dazu wird ein analoges Notch-Vorfilter nach dem Komparator benutzt. Eine PWM wurde benutzt, um unabhängig von der Phase das so eingespeiste Rauschen wieder abziehen zu können.&lt;br /&gt;
&lt;br /&gt;
==== Consumer-Audio ====&lt;br /&gt;
Mit den heute üblichen Taktfrequenzen von FPGAs können leicht PWM-Ausgaben von 100MHz erzeugt werden, die auch mit einfachen Filtern gut auf ein akzeptables Rauschniveau herabgesetzt werden können. Die Überabtastung von &amp;gt;10000 schafft genug head room für ein Filter entsprechender Dämpfung. Bei 10KHz-Grenzfrequenz sind im wichtigen Bereich Klangqualitäten von &amp;gt;6Bit (5kHz) bis zu 10Bit (50Hz) zu erreichen, was für einfache Tonausgaben und Sprache absolut reicht.&lt;br /&gt;
&lt;br /&gt;
== 3-Pin DAC ==&lt;br /&gt;
[[Datei:R-2R.png|thumb|right|320px|Ladder Filter]]&lt;br /&gt;
Eine oft genutze Möglichkeit ist die Verwendung eines [[Widerstandsnetzwerk|R2R-Netzwerks]], um mit wenigen Pins ein quasi analoges Signal zu erzeugen. Damit wird eine direkte DA-Wandlung realisiert. Diese kann noch mit einer PWM oder PDM kombiniert werden, die auf dem untersten Bit arbeitet. Im Bereich Hi-End-Audio sind damit bereits 32-Bit-Wandler mit &amp;gt; 130dB SPDR realisiert worden. Allerdings erfordern diese ein hochgenaues Netzwerk und einen exakten Abgleich der Ansteuerung mit Kalibrierung, sowie einen sehr soliden analogen Aufbau.&lt;br /&gt;
&lt;br /&gt;
== 3-Pin ADC ==&lt;br /&gt;
Auch umgekehrt kann ein einfacher linearer Wandler erzeugt werden. Mit 4 identischen Widerständen sind die Referenzpunkte 75% 50% und 25% eines gepufferten Signals abgreifbar. Dadurch kommt es beim Anstieg des treibenden Signals zu einem Durchschreiten des Schaltpunktes der 3 Eingänge. Durch Variation der Widerstände kann eine Spannungslupe aufgebaut werden, mit der eine Betriebsspannung überwacht werden kann, z.B. 1k,100,100,1k bei Schaltschwelle 50%.&lt;br /&gt;
&lt;br /&gt;
== Erweiterung der Ports==&lt;br /&gt;
Wenn nicht genug IO-Ports für die Erzeugung von R2R-Ausgängen oder PWM-Kanälen zur Verfügung stehen, kann diese Schaltung zur [[Erweiterung von digitalen IO-Ports]] verwendet werden.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Artikel zur PWM-Glättung: [[Glättungsfilter für 1-Bit DA-Wandlung|1-Bit Digital-Analog-Wandlung]]&lt;br /&gt;
* [[AD-Wandler]]&lt;br /&gt;
* [[Soft-PWM]]&lt;br /&gt;
* [[OneBitSound]]&lt;br /&gt;
* [[DA-Wandler]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]] &lt;br /&gt;
[[Kategorie:Audio]]&lt;br /&gt;
[[Kategorie:DSP]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Bauteile]]&lt;/div&gt;</summary>
		<author><name>172.26.40.198</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=TEA6420&amp;diff=104548</id>
		<title>TEA6420</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=TEA6420&amp;diff=104548"/>
		<updated>2021-06-18T15:18:16Z</updated>

		<summary type="html">&lt;p&gt;172.26.40.198: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der TEA6420 ist ein elektronischer Baustein und stellt eine Audioswitchmatrix dar, die 5 (Stereo-)Eingänge auf 4 Ausgänge schalten  kann. Z.B. kann man Eingang 2 auf Ausgänge 1 und 3 legen, und Eingang 4 auf Ausgang 3 und 4. Gesteuert wird er über eine I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C-Schnittstelle.&lt;br /&gt;
== Erforderliche Hardware ==&lt;br /&gt;
* TEA6420&lt;br /&gt;
* Ein Breakout Board. Der TEA6420 hat nur einen Pin Abstand von 1,778 mm.&lt;br /&gt;
* Kondensatoren&lt;br /&gt;
** 18x 4,7 µF&lt;br /&gt;
** 01x 22 µF&lt;br /&gt;
** 1x 100 nF&lt;br /&gt;
* stabile 9V&lt;br /&gt;
und natürlich einen Microcontroller mit I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C.&lt;br /&gt;
&amp;lt;ref&amp;gt;http://f5ad.free.fr/Docs_ATV/TEA6420.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
== Anschluss ==&lt;br /&gt;
Es kursieren im Internet mehrere Datenblätter des TEA6420. [http://f5ad.free.fr/Docs_ATV/TEA6420.pdf Eins ist von 1996], es gibt aber auch eins von 2003, in dem einige wichtige Details nicht drin stehen. Auf Seite 4 sieht man wunderbar den Anschluss, und unten steht (nur im DB von 1996) auch, dass C1 bis C18 4,7 µF sein müssen. &lt;br /&gt;
Der Anschluss &amp;quot;SW&amp;quot; ändert die Adresse.&lt;br /&gt;
Und egal wie fest der TEA6420 in einem Breakout Board sitzt, man sollte ihn wirklich anlöten.&lt;br /&gt;
== Ansteuerung ==&lt;br /&gt;
Hier wird&#039;s knifflig. Es fängt an mit der Adresse; laut Datenblatt ist die (je nach SW):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! SW/ADDR Pin !! Binär !! Hex&lt;br /&gt;
|-&lt;br /&gt;
| Nicht verbunden / 50kΩ Pull-up&amp;lt;ref&amp;gt;http://f5ad.free.fr/Docs_ATV/TEA6420.pdf&amp;lt;/ref&amp;gt; || 1001 1010 || 0x9A&lt;br /&gt;
|-&lt;br /&gt;
| Masse || 1001 1000 || 0x98&lt;br /&gt;
|}&amp;lt;ref&amp;gt;http://f5ad.free.fr/Docs_ATV/TEA6420.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
Allerdings sind I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C-Adressen nur 7 bit lang. Der letzte Bit sagt aus, ob gelesen oder geschrieben wird.&amp;lt;ref&amp;gt;https://de.wikipedia.org/wiki/I²C#Adressierung&amp;lt;/ref&amp;gt; Die &amp;quot;richtigen&amp;quot; Adressen sind also:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! SW/ADDR Pin !! Binär !! Hex&lt;br /&gt;
|-&lt;br /&gt;
| Nicht verbunden / 50kΩ Pull-up&amp;lt;ref&amp;gt;http://f5ad.free.fr/Docs_ATV/TEA6420.pdf&amp;lt;/ref&amp;gt; || 100 1101 || 0x4D&lt;br /&gt;
|-&lt;br /&gt;
| Masse || 100 1100 || 0x4C&lt;br /&gt;
|}&lt;br /&gt;
Der Aufbau der Datenpakete ist auf Seite 3 des Datenblattes verständlich beschrieben. &lt;br /&gt;
Tipp: In der Arduino IDE nutzt man die Funktion &amp;lt;code&amp;gt;Wire#send(B01001100)&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;https://www.arduino.cc/en/Reference/WireSend&amp;lt;/ref&amp;gt;, mit dem Beispiel Ausgang 3, Eingang 5, 4dB Verstärkung.&amp;lt;ref&amp;gt;http://f5ad.free.fr/Docs_ATV/TEA6420.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Bauteile]]&lt;br /&gt;
[[Kategorie:Audio]]&lt;/div&gt;</summary>
		<author><name>172.26.40.198</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Saugdrossel_/_balancing_choke&amp;diff=104544</id>
		<title>Saugdrossel / balancing choke</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Saugdrossel_/_balancing_choke&amp;diff=104544"/>
		<updated>2021-06-18T15:14:14Z</updated>

		<summary type="html">&lt;p&gt;172.26.40.198: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: user/show/eprofi&lt;br /&gt;
&lt;br /&gt;
Die Aufgabe einer Saugdrossel ist z.B. bei einem 12-pulsigen Gleichrichter, die beiden 6-pulsigen Hälften zu verbinden. Läßt man sie weg, sinkt der Stromflusswinkel in den Trafospulen und Dioden, so dass sich die Trafoverluste verdoppeln.&lt;br /&gt;
&lt;br /&gt;
Momentan sehe ich eher einen 1:1-Spartrafo (eine Wicklung mit Mittelanzapfung) ohne Luftspalt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man zwei ungekoppelte Drosseln verwenden (nur geringfügige Verschlechterung) oder die beiden Hälften in Reihe schalten.&lt;br /&gt;
&lt;br /&gt;
Da man hierzu nur sehr wenig Informationen findet, habe ich 2009 einen wikipedia-Eintrag erstellt, der kommentarlos vom umstrittenen Power-Lösch-User Millbart ins Nirwana befördert wurde.&lt;br /&gt;
&lt;br /&gt;
Im wikipedia-Eintrag https://de.wikipedia.org/wiki/Dreiphasengleichrichter heißt es bei https://de.wikipedia.org/wiki/Dreiphasengleichrichter#Zw%C3%B6lfpulsgleichrichter :&lt;br /&gt;
&amp;quot;In Reihenschaltung, auch als B6-2S Schaltung bezeichnet, ergibt sich eine doppelte Ausgangsspannung, die Stromstärke der Schaltung entspricht der Stromstärke der einzelnen Brücken:&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Das stimmt aber nicht ganz: die Spannung ist weniger als die Summe der beiden Hälften, und der eigenltiche Grund der Reihenschaltung wird gar nicht genannt: die oben erwähnte Halbierung der Trafoverluste durch Erhöhung des Stromflußwinkels.&lt;br /&gt;
&lt;br /&gt;
Im Absatz danach ein Bild der Parallelschaltung, bei dem die Saugdrossel fehlt:&lt;br /&gt;
&amp;quot;In Parallelschaltung, auch als B6-2P Schaltung bezeichnet, ergibt sich ein hoher Ausgangsstrom, die Ausgangsspannung entspricht der Spannung der einzelnen Brücken:&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;Hier eine LTspice-Simulation:&lt;br /&gt;
[[Datei:12pulsGleichrichterVariationen.png]]&lt;br /&gt;
Die Wicklungsströme der 4 Varianten:&lt;br /&gt;
[[Datei:12pulseWindingCurrents.png]]&lt;br /&gt;
Die Verlustleistung der 4 Varianten:&lt;br /&gt;
[[Datei:12pulseWindingLosses.png]]&lt;br /&gt;
Man sieht deutlich den kurzen hohen Stromfluss. Mit Ctrl+Klick auf den Graph-Namen im Plot-Pane kann man die Durchschnittsleistung anzeigen lassen, ebenso findet sich eine Liste in der Log-Datei, die man mit Ctrl+L anzeigen lassen kann.&amp;lt;br&amp;gt;&lt;br /&gt;
Hier die LTspice-Datei:&lt;br /&gt;
[[Datei:12pulsGleichrichterVariationen.asc]]&amp;lt;br&amp;gt;&lt;br /&gt;
die dazugehörige Plot-Datei zeigt gleich nach der Simulation die relevanten Ströme:&lt;br /&gt;
[[Datei:12pulsGleichrichterVariationen.plt]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Bauteil]]&lt;/div&gt;</summary>
		<author><name>172.26.40.198</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Software-Architektur&amp;diff=104543</id>
		<title>Software-Architektur</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Software-Architektur&amp;diff=104543"/>
		<updated>2021-06-18T15:13:24Z</updated>

		<summary type="html">&lt;p&gt;172.26.40.198: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Grundlagen =&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Die vermutlich häufigste Problematik, die sich Programmierern bei der Entwicklung von Software stellt, ist die nach einer systematischen Erzeugung von &#039;gutem&#039; Code und qualitativ hochwertiger Software - sprich nach der Entwicklung von Software als Qualitätsprodukt. &#039;&#039;&#039;Software Engineering&#039;&#039;&#039; ist also nach IEEE-Definition die Anwendung ingenieursmäßiger Entwurfsmethodiken auf den Bereich des Softwareentwicklung. Mit genau dieser Fragestellung beschäftigt sich der Teilbereich der Softwaretechnik in der Informatik. &lt;br /&gt;
&lt;br /&gt;
Zweck dieses Artikels ist es, grundlegende Techniken vorzustellen, mit denen man als Entwickler seine Software etwas besser strukturieren und flexibler gegenüber Änderungen gestalten kann. Zum Verständnis dessen, wie das erreicht werden kann, müssen daher zunächst einige grundlegende Konzepte erklärt werden.&lt;br /&gt;
&lt;br /&gt;
== Daten ==&lt;br /&gt;
Essentiell für datenverarbeitende System ist der grundlegende Begriff des &#039;Datums&#039; bzw. der Daten. Darunter versteht man die zeit- und wertdiskrete Repräsentation analoger Größen (&#039;&#039;&#039;Informationen&#039;&#039;&#039;). Beispielsweise resultiert aus der Messung einer analogen Größe (z.B. Temperatur) eine digitale Zahl (AD-Wandlung). Im Umkehrschluss können aus digitalen Daten auch wieder analoge Größen erzeugt werden (DA-Wandlung).&lt;br /&gt;
&lt;br /&gt;
Daten besitzen immer ein Format, da ein diskretes Rechensystem selbst bestimmte Repräsentationen für die Berechnung an sich nutzen muss. Für Fließkommazahlen wird z.B. die IEEE-754 Repräsentation genutzt, aber selbst die Darstellung als Integer impliziert schon ein minimales und ein maximales Element und eine Zahlenauflösung dazwischen. Im Codebespiel dieses Artikels wäre ein internes 8.1 Bit-Format vom Sensor [https://www.mikrocontroller.net/part/DS1621 DS1621] in eine Komma-Darstellung zu konvertieren.&lt;br /&gt;
&lt;br /&gt;
Das heißt in der Quintessenz: Konvertierungen zwischen Datenformaten sind essentieller Bestandteil jeder Software. Entsprechend wichtig ist Konsistenz dieser Daten im Gesamtsystem.&lt;br /&gt;
&lt;br /&gt;
=== E/R Modell ===&lt;br /&gt;
Zur Modellierung von Daten eines Softwaresystems wird häufig das [https://de.wikipedia.org/wiki/Entity-Relationship-Modell Entity-Relationship-Modell] verwendet. Mit dieser Diagramm-Notation kann eindeutig ein gemeinsames und konsistentes Format von Daten spezifiziert werden. Das Codebeispiel dieses Artikels beschreibt nur die Verarbeitung eines Temperaturwerts, daher sei für kompliziertere Systeme auf die entsprechende Literatur verwiesen (Chen/IBM).&lt;br /&gt;
&lt;br /&gt;
=== Erweiterte Backus-Naur-Form ===&lt;br /&gt;
Zur Darstellung von Datenformaten eignet sich sehr gut eine Notation in der [https://de.wikipedia.org/wiki/Erweiterte_Backus-Naur-Form &#039;&#039;&#039;EBNF&#039;&#039;&#039;]. Diese kontextfreie Sprache dient zur eindeutigen Spezifikation von Daten und kann leicht durch [https://de.wikipedia.org/wiki/Syntaxdiagramm Syntaxdiagramme] visualisiert werden. Sie dient hauptsächlich zur Beschreibung von Transformationen von Daten durch Prozesse.&lt;br /&gt;
&lt;br /&gt;
== Datenfluss ==&lt;br /&gt;
&lt;br /&gt;
Software fällt nur in den seltesten Fällen innerhalb von ein paar Stunden vom Himmel und ist dann für immer einfach da. Stattdessen unterliegt die Entwicklung derselbigen eines Prozesses, also eines zeitlich dauernden Vorgangs, durch den definierte Eingaben durch Arbeit zu Ausgaben transformiert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:01-Dataflow.png|mini|Datenflussprinzip]]&lt;br /&gt;
&lt;br /&gt;
Die Strukturierte Analyse und Design von Ed Yourdon u.a setzt darauf auf, zunächst zu identifizieren und zu spezifizieren, was die Software überhaupt leisten soll (Requirements bzw. Anforderungsanalyse) und mündet in einem Anforderungsdokument.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Anforderungsdokument werden nun die Funktionen abgeleitet, welche die Software tatsächlich während ihres Betriebs leisten muss.&lt;br /&gt;
&lt;br /&gt;
Diese funktionalen Anforderungen werden innerhalb der Software auch als ein &#039;Prozess&#039; betrachtet - einen Prozess, den die Software zur Durchführung der jeweiligen Funktion durchlaufen muss. Für das Code-Beispiel zum Artikel wäre die dort maßgebliche &#039;Funktion&#039; der Software, die Werte eines I2C-Thermometers auf UART und LCD darzustellen. Der I2C-Slave ist also die Datenquelle, UART und LCD sind Datensenken.&lt;br /&gt;
&lt;br /&gt;
Durch die Kombination der Definition eines &#039;Prozess&#039; mit der hierarchischen Dekomposition eines komplizierten Vorgangs in kleinere Vorgänge (&#039;Teile-und-Herrsche&#039;) kommen also also zwei Grundprinzipien der Informatik zum Tragen:&lt;br /&gt;
&lt;br /&gt;
* Prozess = &#039;&#039;&#039;I&#039;&#039;&#039;nput-&#039;&#039;&#039;P&#039;&#039;&#039;rocessing-&#039;&#039;&#039;O&#039;&#039;&#039;utput (&#039;&#039;&#039;E&#039;&#039;&#039;ingabe-&#039;&#039;&#039;V&#039;&#039;&#039;erarbeitung-&#039;&#039;&#039;A&#039;&#039;&#039;usgabe)&lt;br /&gt;
* Teile-und-Herrsche zur Unterteilung von Prozessen in Subprozesse&lt;br /&gt;
&lt;br /&gt;
Yourdons Datenflussdiagramme (DFD) dienen dazu, diese Zerlegungen von Software-Funktionen zu beschreiben. Sie beschreiben, &#039;&#039;&#039;woher&#039;&#039;&#039; Daten kommen (&#039;&#039;&#039;Datenquelle&#039;&#039;&#039;), &#039;&#039;&#039;welche&#039;&#039;&#039; Transformationen sie in ihrer Verarbeitung durchlaufen und &#039;&#039;&#039;wohin&#039;&#039;&#039; die Daten am Ende ihrer Transformation fließen (&#039;&#039;&#039;Datensenke&#039;&#039;&#039;). Das wird letztlich als Datenflussprinzip formuliert. Diese DFDs werden immer im Zusammenhang mit Entity-Relationship-Diagrammen (ER-Diagramme) erstellt, beschreibt, was die eigentlichen Daten überhaupt sind und was relevant für die Datenhaltung ist.&lt;br /&gt;
&lt;br /&gt;
Als Datenquellen/senken in DFDs dienen Datenbanken (Persistenz, Symbol: Ξ) und Terminals (Benutzerinteraktion, Symbol: Rechtecke). Verarbeitungen werden als Prozesse in Kreisen symbolisiert. Das Code-Beispiel verwendet keine Persistenz für die Sensordaten - dort müssten sowohl der I2C-Sensor als Datenquelle, sowie die Datensenken (UART, LCD) mit einem Terminal-Symbol verwendet werden. Zum Einen, weil die formatierten Daten direkt dem Anwender gezeigt werden (LCD) oder weil sie von anderen externen Teilnehmern stammen (I2C-Sensor) bzw. zu extern geliefert werden (z.B. UART).&lt;br /&gt;
&lt;br /&gt;
Die Kombination aus DF- und ER-Diagrammen dient als erstes Design-Dokument, welches spezifiziert, was die Software überhaupt für Funktionen hat! Für den Praktiker ist an dieser Stelle wichtig, dass es gut ist, Daten fließen zu lassen und nicht zur Unkenntlichkeit zu zerstückeln.&lt;br /&gt;
&lt;br /&gt;
Um es mit Mitteln der Elektrotechnik etwas griffiger zu formulieren: Datenflussdiagramme stellen im Prinzip die Leiterbahnen und die &#039;Verbraucher&#039; dar. Analog zum &#039;Prozess&#039; ist der Stromfluss zwischen den Potentialen (von Quellen zu den Senken) - die Dauer des Prozesses kann man als Äquivalent zur elektrischen Arbeit interpretieren (⇒ was sie auf etlichen Abstraktionsebenen unterhalb der Softwareebene letztlich auch ist).&lt;br /&gt;
&lt;br /&gt;
== Kontrollfluss ==&lt;br /&gt;
Zur Erklärung des Kontrollflusses soll das Beispiel des Stromflusses erweitert werden. Oft reicht bereits einfach ein geschlossener Stromkreis (zwischen Quelle und Senke) aus, sodass ein Strom fließt und an einem Verbraucher Arbeit verrichtet wird. Manchmal muss dieser Prozess aber abhängig von bestimmten Bedingungen gemacht werden - z.B. sollte ein Dämmerungsschalter bei Tag (in nicht-arktischen Gegenden) keinen Strom fließen lassen. &#039;&#039;&#039;Bedingungen&#039;&#039;&#039; werden mit &#039;&#039;&#039;Kontrolle&#039;&#039;&#039; gleichgesetzt - man benötigt eine Instanz zum Kontrollieren, ob die Bedingung eingehalten ist. Z.B. ob ein bestimmtes Flag gesetzt ist oder ein bestimmter Schwellwert überschritten wurde. Kontrollfluß ist also etwas, was kostet (im Sinne von &#039;den Datenfluss ausbremst&#039;) und was immer an Daten gekoppelt ist. Unter Kontrollmechanismen versteht man in etwa die klassischen &#039;&#039;&#039;if&#039;&#039;&#039;/&#039;&#039;&#039;for&#039;&#039;&#039;/&#039;&#039;&#039;while&#039;&#039;&#039;/&#039;&#039;&#039;switch&#039;&#039;&#039;-Konstrukte. Kontrolle ist immer schlecht - je mehr man hat, desto mehr Overhead kann man damit erzeugen (i.S.v. die Kontrolleure kontrollieren) und dementsprechend mehr Fehlerpotential in seine Software generieren. Ziel eines sauberen Designs ist es also, Kontrolle zu minimieren. &lt;br /&gt;
&lt;br /&gt;
Datenflussdiagramme können diese Aufgabe der Kontrolllogik nicht übernehmen - sie stellen nur dar, wie Daten fließen sollen und geben somit noch kein direktes Design vor.&lt;br /&gt;
&lt;br /&gt;
=== Structure Charts ===&lt;br /&gt;
&lt;br /&gt;
Um aus den entstandenen ER- und DF-Diagrammen ein Design abzuleiten, &lt;br /&gt;
wird eine Darstellung als [https://en.wikipedia.org/wiki/Structure_chart Structure Chart] verwendet. Diese entsprechen einem Baum aus Funktionsaufrufen und visualieren, zwischen welchen Komponenten Datenfluss und wo Kontrollfluss stattfindet.&lt;br /&gt;
&lt;br /&gt;
Dieser Vorgang nutzt die in den DFDs identifizierten Prozesse und stellt diese in einer Baumstruktur dar. Datenfluss von und zu Subprozessen wird durch kleine weiße Pfeile symbolisiert. Übernimmt ein Subprozess eine Kontrollaufgabe symbolisiert ein kleiner schwarzer Pfeil das Ergebnis dieser Prüfung (&#039;&#039;&#039;Kontrolltoken&#039;&#039;&#039;). Der Aufbau des Baums erfolgt weitestgehend wieder nach IPO-Muster von links nach rechts (linkester Teilbaum prüft Eingabe des Gesamtprozess, rechtester übernimmt Ausgabeformatierung).&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;Schwerpunkt&#039;&#039;&#039; eines Prozesses (also eines Top-Level-IPO-Vorgangs) wird auch als &#039;&#039;&#039;Zentrum der Transformation&#039;&#039;&#039; bzw. objektorientiert als &#039;&#039;&#039;Top-Level-Controller&#039;&#039;&#039; bezeichnet. Hat der Baum an dieser Stelle seine Wurzel, erhält man ein Design ohne unnötige Kontrollinstanzen.&lt;br /&gt;
&lt;br /&gt;
Für ANSI-C und strukturierte Entwicklung ist man an dieser Stelle fertig. Bei Anwendung objektorientierter Analyse und Design-Methodiken werden nun die dort üblichen Handwerkszeuge vorgestellt.&lt;br /&gt;
&lt;br /&gt;
= Entwurfsmuster (Design Patterns) =&lt;br /&gt;
&lt;br /&gt;
In der Software-Architektur gibt es Konstrukte, die sich als gut funktionierend erwiesen haben und bei korrekter Anwendung ein Design drastisch verbessern können. An dieser Stelle verhält sich die Softwaretechnik als &amp;quot;praktisches Handwerk&amp;quot; analog zu anderen Tätigkeitsbereichen, wie etwa beim Design von [[Richtiges_Designen_von_Platinenlayouts|Leiterplatten]] oder in der Mechanik - also eine Art Katalog von Do&#039;s und Don&#039;ts, die ein Softwaredesign verbessern können.&lt;br /&gt;
&lt;br /&gt;
Die hier vorgestellten Entwurfsmuster sind grundsätzlich objekt-orientierter Natur, sie setzen also ein grundlegendes Verständnis des Konzeptes eines &#039;Objekts&#039; voraus, was aber die Verwendung der Muster für die rein prozedurale Programmierung (ANSI-C) nicht ausschließt.&lt;br /&gt;
&lt;br /&gt;
Im Artikel wird unter einer &#039;Variable&#039; also ein 4-Tupel verstanden, aus:&lt;br /&gt;
* Adresse zur Laufzeit &lt;br /&gt;
* Zustand (Wert)&lt;br /&gt;
* Bezeichner&lt;br /&gt;
* Datentyp&lt;br /&gt;
&lt;br /&gt;
Ein Objekt ist also einfach eine spezielle Variable von einer Klasse/Struktur/Union (Datentyp) mit den speziellen Eigenschaften:&lt;br /&gt;
&lt;br /&gt;
* Adresse zur Laufzeit: &#039;this&#039;-Pointer&lt;br /&gt;
* Zustand: Zustände aller Member-Variablen&lt;br /&gt;
* Datentyp: (Klasse/Struktur/Union)&lt;br /&gt;
&lt;br /&gt;
und dem gedanklichen Trick, der die Objektorientierung ausmacht, dem Konzept der &#039;&#039;&#039;Datenkapsel&#039;&#039;&#039;: ein Objekt beinhaltet also nur logisch irgendwie zusammenhängende Daten und Funktionen. Der Grad, in dem ein Objekt abhängig von anderen Komponenten ist, wird in der Softwaretechnik als &#039;&#039;&#039;Kopplung&#039;&#039;&#039; bezeichnet. Der Grad, wie stark logisch zusammenhängend ein Objekt zu seinen Member-Variablen ist, ist dagegen als &#039;&#039;&#039;Kohäsion&#039;&#039;&#039; bekannt. Ziel beim Entwurf einer Software-Architektur ist es, &#039;&#039;&#039;Kohäsion zu maximieren&#039;&#039;&#039; und &#039;&#039;&#039;Kopplung zu minimieren&#039;&#039;&#039;, sodass austauschbare Software-&#039;Bausteine&#039; entstehen.&lt;br /&gt;
&lt;br /&gt;
Entwurfsmuster sind dabei die Mittel, mit denen diese Minimierung von Kopplung und die Maximierung von Kohäsion erreicht werden kann.&lt;br /&gt;
&lt;br /&gt;
== Strategy-Pattern (Strategie) ==&lt;br /&gt;
&lt;br /&gt;
Das einfachste Entwurfsmuster, welches die Grundlage für fast alle weiteren Muster bildet, ist die Strategie. Das Muster zeichnet sich einfach durch Polymorphie der Implementierungen gegenüber einer abstrakten Basisklasse aus. Jede Implementierung dieser Schnittstelle ist letztlich eine wählbare Strategie.&lt;br /&gt;
&lt;br /&gt;
== State-Pattern ==&lt;br /&gt;
Verbindet man das Strategiemuster mit mehreren gleichzeitig wählbaren Strategien, entsteht ein Zustandsmuster. Eine Ampel, die zeitabhängig mehrere Zustände von alleine durchläuft, ist ein Beispiel für das State-Pattern.&lt;br /&gt;
&lt;br /&gt;
== Observer-Pattern (Beobachter) ==&lt;br /&gt;
&lt;br /&gt;
Das Beobachter-Muster beschreibt die Interaktion zwischen Objekten zur Laufzeit. Ein Beobachter möchte über Änderungen eines anderes Objektes benachrichtigt werden. Dieses Objekt stellt demzufolge einen Subscribe/Unsubscribe-Mechanismus bereit, über den sich ein abstrakter Beobachter registrieren darf. Ändert sich das Objekt, werden alle registrierten Beobachter mit dem aktuellen Objektzustand benachrichtigt.&lt;br /&gt;
&lt;br /&gt;
= Architekturmuster =&lt;br /&gt;
&lt;br /&gt;
Wie für die Strukturierte Analyse beschrieben, ist es auch bei objektorientierten Methodiken das Ziel, Kontrolle zu minimieren. Anhand der &#039;&#039;Structure Charts&#039;&#039; wurde ein Vorgehen zur hierarchischen Erstellung eines Designs beschrieben. Das objektorientierte Pendant zur Modellierung von kohäsiven und wenig gekoppelten Kontrollinstanzen stellen die Kompositmuster &#039;&#039;&#039;Model-View-Controller&#039;&#039;&#039; bzw. dessen vereinfachte Form &#039;&#039;&#039;Model-View-Presenter&#039;&#039;&#039; dar.&lt;br /&gt;
&lt;br /&gt;
== Model-View-Controller ==&lt;br /&gt;
[[Datei:02-MVC.png|mini|Model-View-Controller]]&lt;br /&gt;
&lt;br /&gt;
Das MVC-Muster ist ein etwas komplizierteres Muster, welches im Wesentlichen das Ziel hat, Verantwortlichkeiten zu trennen (also Objekte wirksam zu entkoppeln).&lt;br /&gt;
&lt;br /&gt;
In Anlehnung an die Objekthierarchie bildet es eine Baumstruktur, in welcher die Kontrollinstanz (der &#039;&#039;&#039;Controller&#039;&#039;&#039;) an der Spitze des Dreiecks sitzt. Dieser ist in dem Dreigespann auch der Einzige, der die Daten direkt verändern darf. Streng genommen zählen auch die registrierten Beobachter als Teile vom Datenmodell, daher darf deren Registrierung/Deregistrierung auch nur über den Controller verwaltet werden.&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;&#039;Datenmodell&#039;&#039;&#039; (die Daten) selber kann im Prinzip beliebig sein. Wie im Beispiel für die ThermometerGeneric&amp;lt;&amp;gt;-Policy kann das Datenmodell selber auch wieder ein Subcontroller-MVP/MVC sein. Wichtig für das Datenmodell ist eigentlich nur, dass das Datenmodell selber feststellen können muss, ob es geändert wurde oder nicht. Diese Aufgabe darf nicht durch den Controller übernommen werden (siehe Structure Charts und Anmerkung zu Kontrollfluss). Idealerweise ruft also der Controller einfach einen Setter des gewählten Datenmodells auf und dieses prüft darin, ob sich der aktuelle Parameter vom gespeicherten Zustand unterscheidet (onChange).&lt;br /&gt;
&lt;br /&gt;
Die Sichten (&#039;&#039;&#039;Views&#039;&#039;&#039;) stellen letztlich nur die Ausgabeformatierung der eigentlichen Nutzdaten dar. Eine Sicht darf sich beim Controller an- bzw. abmelden, Aktualisierungen über Datenänderungen zu erhalten. Wird über den Controller eine Änderung des Datenmodells impliziert, werden die registrierten Sichten über diese Änderung benachrichtigt.&lt;br /&gt;
&lt;br /&gt;
Ziel beim Schreiben eines MVC-Compounds sind dabei:&lt;br /&gt;
stupide Views, dünne Controller-Klassen und fette Datenmodelle.&lt;br /&gt;
&lt;br /&gt;
Für eine direkte Implementierung benötigt es im Gegensatz zu MVP Polymorphie für die Views (im Beispiel durch IView dargestellt) sowie für die Datenmodelle (im Beispiel IThermometer). Das lässt sich nicht vermeiden, benötigt aber letztlich auch nur einen Funktionsaufruf mehr, der bei einer klaren Objekthierarchie und klarem Kontrollfluss nicht teuer ist.&lt;br /&gt;
&lt;br /&gt;
== Model-View-Presenter ==&lt;br /&gt;
[[Datei:03-MVP.png|mini|Model-View-Presenter]]&lt;br /&gt;
&lt;br /&gt;
MVC ist ein sehr flexibler Mechanismus, mit dem sehr gut eine Trennung von Daten und deren Darstellung erreicht werden kann. Manchmal ist dessen volle Flexibilität gar nicht nötig und man möchte z.B. auf die Polymorphie des Datenmodells verzichten. In diesem Fall kann man ähnliche Ergebnisse auch mit einem &#039;&#039;Passive-View&#039;&#039; bzw. einem &#039;&#039;Supervising Controller&#039;&#039; erzielen. Im Codebeispiel generiert die Template-Policy Thermometer&amp;lt;&amp;gt; (cpp_generic/thermometer.hpp) eine MVP-Klasse aus Port (cpp_generic/i2cclient.hpp) und DS1621-Treiber (cpp_generic/sensor_ds1621.hpp). Die beiden Views (LCD+UART) registrieren sich auf Updates und werden bei Änderungen des Datenmodells benachrichtigt. Wesentlicher Unterschied gegenüber MVC ist es, dass das Datenmodell nicht mehr dem Benutzer gegenüber exponiert wird, sondern jeglicher Datenzugriff über den Controller (-&amp;gt; Presenter) passiert.&lt;br /&gt;
&lt;br /&gt;
== Kombinationen ==&lt;br /&gt;
[[Datei:04-MVC-MVP-Compound.png|mini|MVC-MVP-Verschachtelung]]&lt;br /&gt;
&lt;br /&gt;
Wie bereits angemerkt, kann eine Verschachtelung von MVP/MVC erfolgen, wodurch Komplexität durch weitere Dekomposition gelöst werden kann. Im mvc-tutorial/cpp_generic_final wird dies demonstriert, was einer FatClient-Implementierung entsprechen sollte. Das wäre z.B. beim RaspberryPi der Fall, wo unterschiedliche Sensorentypen an SPI oder I2C hängen können und per UI zur Laufzeit des Programms selektiert werden. Die Thermometer-Klasse dient somit als ein Proxy für die reale Implementierung durch die MVP-Policy. Vorteil ist für den Anwendungsentwickler, dass die Thermometer-Komponente immer durch die gleiche API bedient wird, aber erweiterbar für neue Sensorentypen bleibt.&lt;br /&gt;
&lt;br /&gt;
= Anwendung =&lt;br /&gt;
&lt;br /&gt;
Im Anhang des Artikels ist ein GitHub-Repository verlinkt, welches anhand eines Thermometer-ICs die Anwendung der beschriebenen Architekturmuster zeigen soll. Das Beispiel abstrahiert dabei den Sensor vollständig von der konkreten I2C-Slave-Implementierung, weswegen letztere als hardwareabhängiges Backend auch bewusst weggelassen wurde. Das Beispiel auf PIC, AVR oder ARM bzw. zu adaptieren bzw. in ein vorhandenes Framework zu integrieren ist nicht die direkte Aufgabe des Artikels.&lt;br /&gt;
&lt;br /&gt;
Generiert man sich mit Hilfe von SWIG einen C-Wrapper für die C++-Implementierung, erhält man letztlich eine Implementierung, die der Structure-Chart-Lösung sehr ähnlich sehen sollte.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Thermometer.svg|mini|Codechart-ähnliche Darstellung des hierarchischen Aufbaus der Thermometer-API]]&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
* [https://github.com/db8fs/mvc-tutorial Sourcen zum Artikel]&lt;br /&gt;
* [http://yourdon.com/strucanalysis/wiki/index.php/Chapter_9 Tutorial zu DFDs in der Strukturierten Analyse (Ed Yourdon)]&lt;br /&gt;
* [http://martinfowler.com/eaaDev/PresentationModel.html Model-View-Presenter (Martin Fowler) ]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:C]]&lt;/div&gt;</summary>
		<author><name>172.26.40.198</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Sensorlose_BLDC_Ansteuerung&amp;diff=104541</id>
		<title>Sensorlose BLDC Ansteuerung</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Sensorlose_BLDC_Ansteuerung&amp;diff=104541"/>
		<updated>2021-06-18T15:12:11Z</updated>

		<summary type="html">&lt;p&gt;172.26.40.198: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Grundlegendes zum Artikel ==&lt;br /&gt;
Dieser Artikel ist im Wesentlichen als Ergänzung zu:&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Brushless-Controller_f%C3%BCr_Modellbaumotoren Brushless-Controller für Modellbaumotoren]&lt;br /&gt;
zu verstehen. Es wird jedoch nicht mit einem analog Komparator, sondern mit einem ADC gearbeitet,&lt;br /&gt;
wie hier beschrieben:&lt;br /&gt;
* [https://www.youtube.com/watch?v=szgVUfyX8JM Texas Instruments Artikel ]&lt;br /&gt;
&lt;br /&gt;
== Einleitung==&lt;br /&gt;
Bei der sensorlosen Ansteuerung wird üblicherweise die BEMF der in der Luft hängenden Phase&lt;br /&gt;
des BLDCs ausgewertet, um den nächsten Kommutierungsschritt einzuleiten.&lt;br /&gt;
Hierbei treten diverse Probleme auf:&lt;br /&gt;
* Die BEMF ist bei niedrigen Drehzahlen nur sehr gering und von daher schwer zu erfassen&lt;br /&gt;
* Der BLDC muss häufig lange Zwangskommutiert werden, bevor er startet&lt;br /&gt;
* Die Inbetriebnahme ist umständlich und müßig&lt;br /&gt;
* Einkoppelnde Störungen auf den analog Komparator durch die PWM&lt;br /&gt;
&lt;br /&gt;
== Abhilfe ==&lt;br /&gt;
Man integriert die BEMF Spannung. Dabei achtet man darauf, dass die BEMF-Spannung größer bzw. kleiner als Endstufenspannung/2 ist, bevor man anfängt zu integrieren.&lt;br /&gt;
Synchronisiert man seine Messung nun noch mit der PWM, so sind auch eingekoppelte Störungen kein nennenswertes Problem mehr.&lt;br /&gt;
&lt;br /&gt;
== Mikrocontroller ==&lt;br /&gt;
Bei der Wahl des µC entschied ich mich für meinen lieblings 8-Bit AVR, den  Atmegaxx8. Dieser, so dachte ich, hat genügend Ressourcen. Jedoch trat ein Problem auf, das mich im Nachhinein aber nur bedingt stört, da es ja funktioniert:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Der ADC ist zu langsam:&#039;&#039;&#039;&lt;br /&gt;
Der ADC eines normalen AVRs kann mit maximal 200kHz samplen. Bei 20MHz CPU Clock ergibt sich ein Prescaler von 128, somit läuft der ADC auf 156,25kHz. Eine Wandlung dauert somit 83,2µs. Demnach wählte ich eine PWM Frequenz von 10kHz (100µs Periodendauer, pfeift furchtbar) um noch etwas Reserven zu haben. Idealerweise müsste ich die BEMF auch mit 10kHz samplen, was ja grundsätzlich möglich wäre, wenn nicht noch andere Werte mit gesamplet werden müssten wie:&lt;br /&gt;
* Spannung an der Endstufe&lt;br /&gt;
* Strom&lt;br /&gt;
* Flussintegralgrenzwert&lt;br /&gt;
&lt;br /&gt;
Somit entschied ich mich, die BEMF mit 5kHz bzw. jede zweite Messung zu machen, und die anderen drei Werte nur jede 5KHz/3. Bei einer nächsten Version würde ich wohl auf einen STM32F4 zurück greifen. Dessen ADC(s) sind viel schneller und auch komfortabler zu bediehnen.&lt;br /&gt;
Der ADC des AVR wird von einem Timer automatisch gestartet (10KHz), welcher aber kurz vor Beginn des nächsten PWM-Zyklus den ADC startet.&lt;br /&gt;
&lt;br /&gt;
== Schaltung ==&lt;br /&gt;
Zur Schaltung gibt es im Wesentlichen nicht viel zu sagen. Die Endstufe besteht aus 6 MOSFETs und wird vom µC gesteuert. Ein 100mR Widerstand ermöglich eine Überwachung des Motorstroms; falls dieser zu hoch wird setzt die Strombegrenzung ein und die Endstufe wird kurz abgeschaltet. Es ist taktisch sinnvoll, sowohl BEMF-Spannungsteiler als auch Versoungsspannungsteiler im selben Verhältnis zu skalieren, so lassen sich die Werte direkt zueinander in Bezug setzen, ohne das herumskalieren zu müssen. Alle Bauteile mit &amp;quot;n.i.p.&amp;quot; sind nicht bestückt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:BLDC Drive Power 1 .jpg|Endstufe&lt;br /&gt;
Datei:BLDC Drive Power 2 .jpg|Treiber&lt;br /&gt;
Datei:BLDC Drive uC .jpg|Mikrocontroller&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Die Software ist in C geschrieben und wurde mit Atmel Studio entwickelt. Das Programm ist sehr überschaubar.&lt;br /&gt;
In der while(1)-Schleife werden Werte über die serielle Schnittstelle ausgegeben, das wars schon.&lt;br /&gt;
Der Rest spielt sich in der PWM-ISR ab, welche mit 10kHz aufgerufen wird:&lt;br /&gt;
&lt;br /&gt;
Als erstes wird das ADC-Register in Abhängigkeit vom letzten ADMUX ausgelsen. Anschliessend wird der MUX für die nächste Messung vorbereitet. Die eigentliche Messung wird jeweils kurz vorm Timerüberlauf gestartet, damit der ADC mit seiner Messung beginnt, kurz nachdem die PWM wieder von vorn beginnt (Der ADC benötigt durchaus etwa 12µs bis er misst, nachdem er sein Startsignal bekommen hat :-) ).&lt;br /&gt;
&lt;br /&gt;
Danach wird eigentlich nur noch geguckt, was mit den Werten los ist. Ist der Strom in Ordnung bzw. hat die BEMF schon U/2 über bzw. unterschritten und kann mit der Integration begonnen werden? &lt;br /&gt;
Wird die Integrationsgrenze überschritten wird weiter kommutiert.&lt;br /&gt;
&lt;br /&gt;
Für den Fall, dass der BLDC ungünstig steht und nicht sofort anläuft wird einmal &amp;quot;per Hand&amp;quot; bzw. alle 100ms eine Zwangskommutierung durchgeführt. In der Praxis muss eigentlich bei meinem 2 polpaarigen Modellbau BLDC nur 1x Zwangskommutiert werden bzw. manchmal auch garnicht.&lt;br /&gt;
&lt;br /&gt;
Da der Motor immer im Interrupt kommutiert, lässt sich auch recht bequem die Drehzahl errechnen indem man die Interrupts zwischen 6 Kommutierungen zählt. Daraus lässt sich dann die Drehzahl einfach berechnen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; n = \frac{f_{pwm} \cdot 60}{Counts \cdot Polpaarzahl} &amp;lt;/math&amp;gt;{{clear}}&lt;br /&gt;
&lt;br /&gt;
wobei man natürlich gleich 60 und Polpaarzahl miteinander verrechnen könnte.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Programm.zip|miniatur|links]]&lt;br /&gt;
&lt;br /&gt;
== Oszillogramme ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:BEMF1.jpg|BEMF1&lt;br /&gt;
Datei:BEMF2.jpg|BEMF2&lt;br /&gt;
Datei:Startvorgang.jpg|Startvorgang&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:Aufbau BLDC.jpg|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Known Issues ==&lt;br /&gt;
Der AVR-ADC ist für hohe Drehzahlen zu langsam bzw. ist die PWM -und Samplefrequenz mit 10/5KHz zu langsam um ausreichen Auflösung für das Flussintegral zu bekommen. Die Problematik ist dann, dass nur 1-2 Samples pro Kommutierungsschritt zur Verfügung stehen, was vorn und hinten nicht ausreichend ist. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lösungen:&#039;&#039;&#039;&lt;br /&gt;
* Man verwendet einen schnelleren externen ADC&lt;br /&gt;
* Man schaltet bei hohen Drehzahlen in den Komparatormodus&lt;br /&gt;
* Anderer µC mit schnellerem ADC verweden z.B. STM32F4 - Derivat&lt;br /&gt;
&lt;br /&gt;
== Lösung mit einem schnelleren Controller ==&lt;br /&gt;
Der Controller wurde durch einen STM32F050K6 ersetzt. Dieser sampelt nun im Center-Aligned PWM Mode in der Pulsmittte alle Werte und schaufelt diese per DMA in einen Buffer. Die PWM Frequenz beträgt 20kHz.&lt;br /&gt;
Klappt alles prima.&lt;br /&gt;
&lt;br /&gt;
Ich habe den BLDC nun in ein Plexiglaswürfel &amp;quot;gesperrt&amp;quot; und weiter geforscht. Es funktioniert nun sehr gut. Es wird vor dem Anlauf die Rotorposition bestimmt und der Rotor in eine bestimmte Stellung gebracht. Das Ergebnis ist, dass der Rotor sauber anläuft.&lt;br /&gt;
&lt;br /&gt;
Hier das Programm:&lt;br /&gt;
[[Datei:Programm_STM32.zip]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;/div&gt;</summary>
		<author><name>172.26.40.198</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=SDR&amp;diff=104539</id>
		<title>SDR</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=SDR&amp;diff=104539"/>
		<updated>2021-06-18T15:10:15Z</updated>

		<summary type="html">&lt;p&gt;172.26.40.198: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Methode des Software Defined Radio, kurz SDR, erlaubt es, verschiedenste Aufgaben der digitalen Signalerfassung und -bearbeitung im Hochfrequenzbereich zu übernehmen. Im Gegensatz zu klassischen Empfangs- und Sendekonzepten erfolgt hier der Großteil der Signalverarbeitung softwareseitig. Nur auf einen kleinen Frequenzbereich abgestimmte Analoghardware ist nicht vorhanden, wodurch die Geräte z.B. nicht auf einen Funkstandard allein beschränkt sind und flexibel eingesetzt werden können.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Signalverarbeitung|P]]&lt;/div&gt;</summary>
		<author><name>172.26.40.198</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Altera_Max10_Breakout_Board&amp;diff=104534</id>
		<title>Altera Max10 Breakout Board</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Altera_Max10_Breakout_Board&amp;diff=104534"/>
		<updated>2021-06-18T14:57:53Z</updated>

		<summary type="html">&lt;p&gt;172.26.40.198: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Projektseite==&lt;br /&gt;
https://hackaday.io/project/13245-altera-max10-breakout-board&lt;br /&gt;
&lt;br /&gt;
== Warum Max10? ==&lt;br /&gt;
* Aktuell (Aug 2016) der einzig verfügbare FPGA in QFP bis 50K LUT.&amp;lt;br /&amp;gt;&lt;br /&gt;
**Eignung für geringe Stückzahlen, Handbestückung, Test/Inbetriebnahme&lt;br /&gt;
* Geringe BOM: Flash on package, single-supply&lt;br /&gt;
* 3 temperature grades für QFP: C,I,A&lt;br /&gt;
&lt;br /&gt;
== Überschlagsrechnung BOM-Kosten 10M04SC ==&lt;br /&gt;
* 10M04SC, digikey     8,22 EUR  (Abnahme 25 Stück) ODER&lt;br /&gt;
* 10M04SC, digikey    10,29 EUR  (Abnahme 01 Stück)&lt;br /&gt;
&lt;br /&gt;
* PCB, dirtypcb        0,65 USD  (10mal 10x10 für 25USD -&amp;gt; 25/(10*4))&lt;br /&gt;
* MEMS CLK, digikey    1,00 EUR&lt;br /&gt;
* Caps (keine volle Bestückung für 04SC) 1,xx EUR&lt;br /&gt;
* Pin header, ebay/ali 0,35 EUR&lt;br /&gt;
10 bis 15 EUR&lt;br /&gt;
&lt;br /&gt;
== Anforderungen ==&lt;br /&gt;
* A1. OpenSource; Design einfach modifizierbar und verwendbar&lt;br /&gt;
* A2. Max10 04K LUT bis 50K LUT QFP single-supply&lt;br /&gt;
* A3. geringe Material-Kosten für kleine Stückzahlen&lt;br /&gt;
* A4. händisch lötbar, wenig Bauteile&lt;br /&gt;
* A5. Gute GND-Anbindung auf Ansteckmodule/Baseboards&lt;br /&gt;
* A6. Auf Steckbrett verwendbar&lt;br /&gt;
* A7. Mit 2.54mm Pinheadern verwendbar&lt;br /&gt;
* A8. Breakout von möglichst vielen I/Os&lt;br /&gt;
* SI. Signal Integrity; PDN. power distribution network&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Spezifikation ==&lt;br /&gt;
* S1. Kicad-Design (A1)&lt;br /&gt;
* S2. Zwei PCBs mit Pin-kombatiblen Breakout für die package-Linien 04-25 und 40-50 (A2).&lt;br /&gt;
*** Die pinouts dieser beiden package-Linien sind ähnlich aber nicht gleich.&lt;br /&gt;
* S3. 2-Layer-PCB; max 50mm x 50mm (A3, SI)&lt;br /&gt;
* S4. Mindestens 0603; Footprints für händische Bestückung (A4)&lt;br /&gt;
* S5. Single row 1.27mm THT pin header (A8, A3, A4)&lt;br /&gt;
** Anordnung/Distanz zueinander: Vielfaches von 2.54mm&lt;br /&gt;
** A6 erfüllt bei Nutzung jedes 2. pins (GND geeignet positionieren)&lt;br /&gt;
** A7 wie folgt erfüllt: Breakout auf 2.54mm double row mittels&lt;br /&gt;
*** Adapter oder&lt;br /&gt;
*** Ribbon cable mit Klemmstecker (Seite1: 1.27mm single; Seite2: 2.54 double)&lt;br /&gt;
* S6. Optionale Bestückung mit 1.27mm THT double row für zusätzliche GND pins (A5, SI)&lt;br /&gt;
&lt;br /&gt;
== Details (Spezifikation) ==&lt;br /&gt;
* D1. Pin header an allen 4 Seiten&lt;br /&gt;
* D2. Zwischen QFP und pin header: top layer für Signal; bottom layer GND (A5, SI)&lt;br /&gt;
* D3. (Fast) alle caps direkt unter das QFP (D2)&lt;br /&gt;
* D4. Möglichst wenig Überschneidungen der Power Traces (SI)&lt;br /&gt;
* D5. 0612 caps für HF decoubling (A4, SI, PDN)&lt;br /&gt;
* D6. Pcb thickness: 0.6mm oder 0.8mm (SI, PDN)&lt;br /&gt;
* D7. Leiterbahnbreite, spacings: 0.150mm; drill: 0.300mm (A3)&lt;br /&gt;
&lt;br /&gt;
== Bewertung ADC ==&lt;br /&gt;
* Den FPGA gibt es im QFP als SA (1Msps ADC) und als SC (ohne ADC). Beim FPGA beträgt der Preisunterschied zwischen SA und SC 4-8EUR. Ein 1Msps ADC kostet ca. 4EUR.&lt;br /&gt;
* Der ADC verursacht auch im deaktivierten Zustand einen Stromverbrauch an den ADC-Pins (Device Datasheet Seite 8)&lt;br /&gt;
* Bei Verwendung des ADC sind zusätzlich erforderlich: GND-ADC, VREF-ADC, VCC-ADC&lt;br /&gt;
** Dies ist zusätzlich auf 2 Lagen schwierig zu realisieren.&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; Zunächst auf ADC verzichten und erst einmal schauen, wie gut das PDN ohne die zusätzliche ADC-Beschaltung ist.&lt;br /&gt;
&lt;br /&gt;
== Betrachtung zum PDN ==&lt;br /&gt;
* In der Mitte des Package befindet sich ein GND-Pad. Dieses muss elektrisch gut von allen 4 Seiten mit der GND-Fläche verbunden werden.&lt;br /&gt;
* Anzahl supplies, filter&lt;br /&gt;
** Der Fall Single-Supply ohne ADC ist dargestellt in &amp;quot;Device Family Pin Connection Guidelines&amp;quot; auf Seite 32 und 33. Hier werden 2 regulators vorgeschlagen.&lt;br /&gt;
** Aus Datei &amp;quot;Device Family Pin Connection Guidelines&amp;quot;:&lt;br /&gt;
*** Auf Seite 33 wird ein Filter zwischen VCC_ONE und VCCA vorgeschlagen.&lt;br /&gt;
*** Auf Seite 32 steht: &amp;quot;Both VCCA and VCC_ONE must share a single power source using proper isolation filter.&amp;quot;&lt;br /&gt;
** Aus Datei &amp;quot;Power Management User Guide&amp;quot;:&lt;br /&gt;
*** Bildchen auf Seite 4: Die VCC_ONE pins und VCCA pins sind im Package direkt miteinander verbunden.&lt;br /&gt;
** Anfrage beim Support ergibt: VCCA pins und VCC_ONE pins sind im package NICHT miteinander verbunden.&lt;br /&gt;
&lt;br /&gt;
* -&amp;gt; Spannungsversorgung des Boards über einen einzelnen 3V3-Pin.&lt;br /&gt;
* -&amp;gt; VCC_ONE und VCCO werden auf dem PCB gemeinsam als VCC_ONE_ geführt.&lt;br /&gt;
* -&amp;gt; VCCA wird über einen Filter realisiert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Arbeitspakete ==&lt;br /&gt;
=== P1 Config pins (DONE) ===&lt;br /&gt;
&lt;br /&gt;
=== P2 Betrachtung Clocks (done): ===&lt;br /&gt;
* Im Datenblatt wird auf eine relativ hohe Kopplung der pins im &lt;br /&gt;
E144-package hingewiesen. Datenleitungen sollten nicht direkt neben &lt;br /&gt;
einem CLK pin mit &amp;quot;hoher&amp;quot; Frequenz angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
=== P3 Betrachtung Unterschiede 10M04 pinout vs 10M50 pinout (done): ===&lt;br /&gt;
&lt;br /&gt;
=== P4 Anordnung der caps und Führung der Power traces (DONE) ===&lt;br /&gt;
&lt;br /&gt;
=== P5 Schematic Symbole und PCB footprints erstellen DONE lrs) ===&lt;br /&gt;
&lt;br /&gt;
===P6 Layout für breakout pcbs erstellen (DONE lrs) ===&lt;br /&gt;
* erfordert P5&lt;br /&gt;
&lt;br /&gt;
=== P7 Bestückung (TODO) ===&lt;br /&gt;
* erfordert P6&lt;br /&gt;
&lt;br /&gt;
=== P8 Basebord1 Schematic TODO) ===&lt;br /&gt;
: (̶f̶̶ü̶̶r̶̶ ̶̶p̶̶e̶̶r̶̶f̶̶o̶̶r̶̶m̶̶a̶̶n̶̶c̶̶e̶-̶t̶̶e̶̶s̶̶t̶̶s̶)&lt;br /&gt;
* ̶̶i̶/̶o̶-̶p̶̶i̶̶n̶̶s̶̶ ̶̶d̶̶e̶̶s̶̶ ̶̶f̶̶p̶̶g̶̶a̶̶ ̶̶m̶̶i̶̶t̶̶e̶̶i̶̶n̶̶a̶̶n̶̶d̶̶e̶̶r̶̶ ̶̶v̶̶e̶̶r̶̶b̶̶i̶̶n̶̶d̶̶e̶̶n̶&lt;br /&gt;
: Dafür kann man auch 2 breakout boards aufeinander stecken und gegeneinander testen.&lt;br /&gt;
* JTAG&lt;br /&gt;
* Jumper für configpin JTAGEN&lt;br /&gt;
* USB conn&lt;br /&gt;
* LDO an USB conn&lt;br /&gt;
&lt;br /&gt;
=== P9 Basebord1 Layout (TODO) ===&lt;br /&gt;
* erfordert P7, P8&lt;br /&gt;
&lt;br /&gt;
=== P10 Inbetriebnahme mit Baseboard (TODO) ===&lt;br /&gt;
* erfordert P7, P9&lt;br /&gt;
&lt;br /&gt;
=== P11 Basebord2 Schematic (optional, TODO) ===&lt;br /&gt;
* JTAG&lt;br /&gt;
* Jumper für configpin JTAGEN&lt;br /&gt;
* USB conn&lt;br /&gt;
* LDO an USB conn&lt;br /&gt;
* Pinheader für typisches NRF24&lt;br /&gt;
* Footprint für ESP8266&lt;br /&gt;
* Pin header für FTDI UM232H-B (oder ähnlich)&lt;br /&gt;
* Pin header für wiz850io&lt;br /&gt;
* ...?&lt;br /&gt;
&lt;br /&gt;
=== P12 Basebord2 Layout (optional, TODO) ===&lt;br /&gt;
* erfordert P7, P11&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
[http://www.m-pression.com/solutions/boards/odyssey/max10-teardown odyssey max10 teardown]&lt;br /&gt;
&lt;br /&gt;
[[Category:FPGA und Co]]&lt;/div&gt;</summary>
		<author><name>172.26.40.198</name></author>
	</entry>
</feed>