https://hobbyelektronik.org/w/api.php?action=feedcontributions&user=Qsysopr&feedformat=atomHobbyelektronik.org - Benutzerbeiträge [de]2024-03-29T09:55:33ZBenutzerbeiträgeMediaWiki 1.34.1https://hobbyelektronik.org/w/index.php?title=Umbau_Belkin_Auto-USB-Lader&diff=1811Umbau Belkin Auto-USB-Lader2022-11-10T21:40:40Z<p>Qsysopr: </p>
<hr />
<div>Meine Schwester braucht Strom fürs Handy im Auto und da es beim Mobilfunkanbieter mit dem roten Tropfen einen entsprechenden Adapter für 5 Euro gab, hat sie auch gleich zugeschlagen. Das Teil nennt sich "Belkin Micro USB Car Charger inkl. 30-Pin Sync-/Ladekabel" und hat die Produkt-Nummer F8J056.<br />
<br />
Einen kleinen Nachteil hat das Ding allerdings: "Designed for products with half-eaten fruits". Natürlich funktioniert es auch mit anderen Geräten, dann aber nur innerhalb (trotzdem nicht ganz eingehaltenen) USB-Spezifikation - also 500 mA. Besonders wenn man rechenlastige Dinge wie Navigation macht, kann da die Luft dünn werden.<br />
<br />
=Die Theorie=<br />
<br />
Um gut mit Android-Geräten zu funktionieren muss der Adapter umgebaut werden.<br />
<br />
Bei dem Apple-Zeug müssen die USB-Datenleitungen D+ und D- über Spannungsteiler auf ca. VBus/2=2,5 V gebracht werden, wobei meines Wissens auch der Strom (und damit die Widerstandswerte) definiert sind. Bei Androiden müssen üblicherweise D+ und D- miteinander verbunden werden. Das könnte man auch mit einem Zwischenstecker oder umgebauten USB-Kabel machen, aber das ist langweilig und kann jeder.<br />
<br />
=Auf die Dose!=<br />
[[Datei:Belkin_F8J056_offen.jpg|thumb|Geöffneter Ladeadapter]]<br />
Hier beginnt auch schon das Problem: Das Gehäuse ist ziemlich gut verschlossen. Zwischen den Massefedern außen sieht man allerdings eine feine Naht, die einen Angriffspunkt darstellt.<br />
<br />
Mit einem großen flachen Schraubendreher lassen sich die Gehäusehälften bei den Federn auch etwas auseinander biegen, mit sehr viel sanfter Gewalt kann man sich mit einem zweiten (feinen) Schraubendreher an der kompletten Kante entlang arbeiten. Am besten, man klemmt den Adapter in einen Schraubstock ein. Ich habe dabei ([http://hobbyelektronik.org/b/2011/08/stigmata/ mal wieder]) die Erfahrung gemacht, dass sich die Spitze von Schraubendrehern und Handinnenflächen nicht unbedingt vertragen (nach knapp 14 Tagen ist es immerhin wieder fast verheilt). Auf jeden Fall war das Teil damit auch geöffnet<br />
<br />
Die Leiterplatte bekommt man am besten heraus, indem man ein USB-Kabel einsteckt, und vorsichtig (!) hebelt.<br />
<br />
Zum Vorschein kommt folgendes Platinchen:<br />
<br />
<gallery><br />
Datei:Belkin_F8J056_pcb_top.jpg|Leiterplatte von oben<br />
Datei:Belkin_F8J056_pcb_bot.jpg|Leiterplatte von unten<br />
</gallery><br />
<br />
Sieht auf den ersten Blick gar nicht mal so übel aus. Nicht dieses Standard-biestige-MC34063-Design, sogar eine Polyfuse und Verpolungsschutz am Eingang wurden spendiert. Der Schaltwandler selbst (etwas anderes kann man sich aufgrund der relativ großen Induktivität, der dicken Diode und vor allem der ordentlichen 2 A am Ausgang nicht vorstellen) sitzt unter dem großen Masseblech und ermöglicht zusätzliche Wärmeabführung. Also auch mechanisch ganz nett designed.<br />
<br />
Wie dem auch sei, nachdem auf der Oberseite keine Widerstände zu sehen sind, müssen sich diese unterm Blech befinden, also weg damit:<br />
<br />
<gallery><br />
Datei:Belkin_F8J056_pcb_bot2.jpg|Leiterplatte von unten, ohne Blech<br />
</gallery><br />
<br />
=Umbau=<br />
<br />
Zum Vorschein kommt ein NT3875A von Noveltek, der laut Datenblatt genau für diesen Zweck gemacht ist. Unter der USB-Buchse befinden sich auch ein paar Widerstände, die mit den Datenleitungen verbunden sind. In der Schaltung gemessen ergibt sich:<br />
<br />
<math>R7 = \infty; R8 = 33,4 \textrm{ k}\Omega; R9 = 24,25 \textrm{ k}\Omega; R11 = 24,5 \textrm{ k}\Omega; R10 = 31,35 \textrm{ k}\Omega</math><br />
<br />
Das Auslöten zeigt: Wer misst, misst mist und natürlich: Niemals im eingebauten Zustand messen! Denn tatsächlich verhalten sich die Widerstände wie folgt:<br />
<br />
<math>R7 = \infty; R8 = 75,2 \textrm{ k}\Omega; R9 = 43,1 \textrm{ k}\Omega; R11 = 50 \textrm{ k}\Omega; R10 = 50 \textrm{ k}\Omega</math><br />
<br />
Im Endeffekt egal, denn sie kommen eh weg. Um D+ und D- zu verbinden, kann entweder R7 oder die oberen Pads von R8 und R9 gebrückt werden.<br />
<br />
Da die unter dem USB-Port liegende LED deutlich blendet, wurde deren Vorwiderstand (R6) gleich durch einen etwas größeren (4,7 k) ersetzt. Weil ich nix in 0402 bzw. 0603 da hatte, musste dann halt ein querliegender Widerstand in der Baugröße 0805 herhalten:<br />
<br />
<gallery><br />
Datei:Belkin_F8J056_umgebaut.jpg|Neuer Widerstand für die LED<br />
</gallery><br />
<br />
Ans Handy geklemmt zieht das Teil bei 12 V Eingangsspannung 0,42 A, also gehen 5W (bei meinem etwas älteren HTC) in den Akku. Passt.<br />
<br />
=Zusammenbau=<br />
Der Zusammenbau ist relativ einfach - Metallbügel anlöten, im Gehäuse versenken und dieses verschließen.<br />
<br />
Hier reicht stecken alleine nicht, es will geklebt werden. Mit 2-Komponenten-Kleber eine sichere Sache: Einmal an der Rundung entlang, etwas an den Gehäusekanten dran (nicht zu viel!) und an der "Spitze" sehr vorsichtig agieren! Läuft die Brühe bis zum [http://hamburgforbeginners.wordpress.com/2008/10/13/pinopel/ Pinöpel] vorne, kann es zu Kontaktproblemen kommen.<br />
<br />
Mir ist es natürlich passiert - durch Drehen und vorsichtiges Drücken kann man ihn wieder frei bekommen. Besser ist es aber, es gar nicht so weit kommen zu lassen.<br />
<br />
[[Kategorie:Sonstiges]]<br />
[[Kategorie:Elektronik]]<br />
[[Kategorie:Zerlegt]]</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=MediaWiki:Sidebar&diff=1810MediaWiki:Sidebar2022-11-10T21:39:44Z<p>Qsysopr: </p>
<hr />
<div>* navigation <br />
** mainpage|mainpage<br />
** http://hobbyelektronik.org/b/|Blog<br />
** recentchanges-url|recentchanges<br />
** randompage-url|randompage<br />
** Spezial:Alle_Seiten|Alle Seiten<br />
* Bereiche <br />
** Category:Elektronik|Elektronik (ohne µC)<br />
** Category:AVR|AVR<br />
** Category:PC|am PC<br />
** Category:Software|Software (PC)<br />
** Category:LCD|LCDs<br />
** Category:Sonstiges|Sonstiges<br />
** Category:Murks|Murks<br />
** Category:Reparatur|Reparatur<br />
** Category:Zerlegt|Zerlegt</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=MediaWiki:Common.css&diff=1671MediaWiki:Common.css2021-09-06T21:03:03Z<p>Qsysopr: </p>
<hr />
<div>/* <source lang="css"> */<br />
<br />
/*-----------------------------------------------------------------------------------------------*/<br />
/* ACHTUNG! Common.css enthält die gemeinsamen Skin-Anpassungen der deutschsprachigen Wikipedia */<br />
/*---------------------------------------------------------------------------------------------*/<br />
<br />
/* Common.css ist in drei grundlegende Abschnitte gegliedert: */<br />
<br />
/* 1. Editierbare Seiteninhalte */<br />
/* 2. Sonstige Anpassungen (Spezialseiten, u.a.) */<br />
/* 3. Hauptseitenspezifisches */<br />
<br />
/* Jede Ergänzung/Änderung muss vorher jeweils für alle Skins auf Tauglichkeit getestet werden, */<br />
/* individuell per User.css! Ist hier erstmal geändert, dauert es dank Cache eine Weile, bis die */<br />
/* Änderungen bei allen Nutzern sichtbar oder, bei Fehlern, korrigiert sind. */<br />
<br />
/* +++++ 1. ANPASSUNGEN DER ANZEIGE VON EDITIERBAREN SEITENINHALTEN +++++ */<br />
<br />
/* Personennamen in Kapitälchen: class="Person" */<br />
<br />
.Person {<br />
display: inline;<br />
font-variant: small-caps;<br />
font-style: normal;<br />
}<br />
<br />
/* [[Wikipedia:Zitate|Zitate]] (siehe [[Vorlage:Zitat]]) */<br />
<br />
p.Zitat {<br />
font-style: normal;<br />
margin-bottom: 0;<br />
}<br />
p.cite {<br />
margin-top: 0;<br />
padding-left: 1em;<br />
}<br />
<br />
/* [[Wikipedia:Quellenangaben|Quellenangaben]] nicht kursiv, da sie ggf. verschiedene Bestandteile enthalten */<br />
<br />
cite {<br />
font-style: normal;<br />
}<br />
<br />
/* Stylesheet-Ergänzung zu Standard-[[Wikipedia:Navigationsleisten|Navigationsleisten]] */<br />
<br />
div.BoxenVerschmelzen,<br />
div.NavFrame {<br />
margin: 1.5em 0 0;<br />
padding: 2px;<br />
border: 1px solid #aaaaaa;<br />
text-align: center;<br />
border-collapse: collapse;<br />
font-size: 95%;<br />
clear: both;<br />
}<br />
div.BoxenVerschmelzen div.NavFrame,<br />
div.NavFrame + div.NavFrame {<br />
margin-top: 0;<br />
}<br />
div.BoxenVerschmelzen div.NavFrame {<br />
border-style: none;<br />
border-style: hidden;<br />
}<br />
div.NavFrame + div.NavFrame {<br />
border-top-style: none;<br />
border-top-style: hidden;<br />
}<br />
div.NavPic {<br />
margin: 0;<br />
padding: 2px;<br />
float: left;<br />
}<br />
div.NavFrame div.NavHead {<br />
font-weight: bold;<br />
font-size: 100%;<br />
background-color: #efefef;<br />
}<br />
div.NavFrame p,<br />
div.NavFrame div.NavContent,<br />
div.NavFrame div.NavContent p {<br />
font-size: 100%;<br />
}<br />
div.NavEnd {<br />
margin: 0;<br />
padding: 0;<br />
line-height: 1px;<br />
clear: both;<br />
}<br />
<br />
/* Stylesheet fuer den 'Ausklappen'-Button an Navileisten, der in [[MediaWiki:Common.js]] implementiert wird */<br />
.NavToggle {<br />
font-size: x-small;<br />
float: right;<br />
}<br />
<br />
/* Workaround für Internet Explorer 6 */<br />
div.NavFrame,<br />
div.NavPic,<br />
.NavToggle {<br />
position: relative;<br />
}<br />
<br />
/* Stylesheet-Ergänzung zu SideBoxen (ehedem [[Wikipedia:TownBox|TownBox]]) */<br />
<br />
div.sideBox {<br />
position: relative;<br />
float: right;<br />
background: white;<br />
margin-left: 1em;<br />
border: 1px solid gray;<br />
padding: 0.3em;<br />
width: 200px;<br />
overflow: hidden;<br />
clear: right;<br />
}<br />
div.sideBox dl {<br />
padding: 0;<br />
margin: 0 0 0.3em 0;<br />
font-size: 96%;<br />
}<br />
div.sideBox dl dt {<br />
background: none;<br />
margin: 0.4em 0 0 0;<br />
}<br />
div.sideBox dl dd {<br />
margin: 0.1em 0 0 1.1em;<br />
background-color: #f3f3f3;<br />
}<br />
<br />
/* Stylesheet-Ergänzung zu [[Wikipedia:Taxoboxen|Taxoboxen]] und [[Wikipedia:Paläoboxen|Paläoboxen]] */<br />
table.taxobox,<br />
table.palaeobox {<br />
border-collapse: collapse;<br />
border: 1px solid gray;<br />
float: right;<br />
clear: right;<br />
margin-left: 0.5em;<br />
background-color: white;<br />
}<br />
table.taxobox th {<br />
background-color: #9bcd9b;<br />
}<br />
table.palaeobox th {<br />
background-color: #e7dcc3;<br />
}<br />
table.taxobox th,<br />
table.palaeobox th {<br />
border: solid 1px gray;<br />
text-align: center;<br />
font-weight: bold;<br />
}<br />
table.taxobox td,<br />
table.palaeobox td {<br />
vertical-align: top;<br />
}<br />
table.taxobox .Person,<br />
table.palaeobox .Person {<br />
font-style: normal;<br />
}<br />
table.taxobox div.thumb,<br />
table.taxobox div.thumb * {<br />
background-color: #f9f9f9;<br />
}<br />
table.taxobox div.thumb,<br />
table.taxobox div.thumb *,<br />
table.palaeobox div.thumb,<br />
table.palaeobox div.thumb * {<br />
margin: 0 auto;<br />
padding: 0;<br />
float: none;<br />
border: none;<br />
}<br />
table.taxobox div.magnify,<br />
table.palaeobox div.magnify {<br />
display: none;<br />
}<br />
table.taxobox tr td div.thumb div div.thumbcaption {<br />
text-align: center;<br />
}<br />
table.palaeobox tr td div.thumb div div.thumbcaption {<br />
text-align: left;<br />
}<br />
table.taxobox td.Person,<br />
table.palaeobox td.Person {<br />
text-align: center;<br />
display: block;<br />
}<br />
table.taxobox td.taxo-name,<br />
table.taxobox td.taxo-bild,<br />
table.palaeobox td.taxo-name,<br />
table.palaeobox td.taxo-bild,<br />
table.palaeobox td.taxo-zeit {<br />
text-align: center;<br />
}<br />
table.palaeobox td.taxo-ort {<br />
text-align: left;<br />
}<br />
<br />
/* aus Vorlage zur Entlastung, skinabhängigen Darstellung und Kombinierbarkeit hierher ausgelagert */<br />
.wikitable,<br />
.prettytable {<br />
margin: 1em 1em 1em 0;<br />
background: #f9f9f9;<br />
border: 1px #aaa solid;<br />
border-collapse: collapse;<br />
}<br />
.prettytable th,<br />
.prettytable td {<br />
border: 1px #aaa solid;<br />
padding: 0.2em;<br />
}<br />
.prettytable th {<br />
text-align: center;<br />
}<br />
.prettytable caption {<br />
font-weight: bold;<br />
}<br />
<br />
/* Zebra-Tabellen */<br />
table.wikitable.zebra tr:nth-child(even) {<br />
background: white;<br />
}<br />
<br />
.nogrid th,<br />
.nogrid td {<br />
border: none;<br />
}<br />
div.float-left,<br />
table.float-left,<br />
.float-left {<br />
float: left;<br />
clear: left;<br />
}<br />
div.float-right,<br />
table.float-right,<br />
.float-right {<br />
float: right;<br />
clear: right;<br />
margin: 1em 0 1em 1em;<br />
}<br />
div.centered,<br />
table.centered,<br />
.centered {<br />
margin-left: auto;<br />
margin-right: auto;<br />
}<br />
.toptextcells td {<br />
vertical-align: top;<br />
}<br />
<br />
/* Bitte KEINE weiteren Definitionen dieser Art für Boxen hier, das gehört in entsprechende Vorlagen! */<br />
/* Hier 20 Mal Trivialitäten wie "text-align:center" zu definieren verlangsamt alles und ist nicht */<br />
/* Sinn der Sache. (Und wer nicht weiß warum, hat's nicht verstanden.) */<br />
<br />
/* Do not expand [[Wikipedia:WikiProjekt Georeferenzierung|kvaleberg.com-URLs]] for printing */<br />
<br />
#content span.coordinates a.external.text:after,<br />
#content span.coordinates a.external.autonumber:after,<br />
#content div.coordinates a.external.text:after,<br />
#content div.coordinates a.external.autonumber:after {<br />
content: "";<br />
}<br />
<br />
/* Do not expand URLs for printing */<br />
<br />
#content span.plainlinks-print a.external.text:after,<br />
#content span.plainlinks-print a.external.autonumber:after,<br />
#content div.plainlinks-print a.external.text:after,<br />
#content div.plainlinks-print a.external.autonumber:after {<br />
content: "";<br />
}<br />
<br />
/* Metadaten (bspw. [[Wikipedia:Personendaten|Personendaten]]) */<br />
<br />
table.metadata {<br />
border: 1px solid #aaaaaa;<br />
display: none;<br />
}<br />
.metadata-label {<br />
color: #aaaaaa;<br />
}<br />
span.metadata,<br />
span.metadata-inline {<br />
display: none;<br />
}<br />
<br />
/*<br />
* Farbdefinitionen für Rahmen und Hintergründe von [[Wikipedia:Textbausteine|Textbausteinen]].<br />
* Hier: Standardvorgaben für "dunkle Schrift auf hellem Grund".<br />
* Für Hell-auf-dunkel-Skins ([[MediaWiki:Amethyst.css|Amethyst]]) müssen dort entsprechende Definitionen<br />
* zusätzlich eingetragen werden! Anpassungen für andere Skins sind optional.<br />
* (Die Angaben der Rahmenstärke dienen der Bequemlichkeit, so dass man<br />
* für dünne Rahmen nur noch "border-style" angeben muss.)<br />
*/<br />
<br />
.rahmenfarbe1 { /* Wie Inhaltsverzeichnis */<br />
border-color: #aaaaaa;<br />
border-width: 1px;<br />
}<br />
.rahmenfarbe2 { /* Unauffällig, geringer Kontrast */<br />
border-color: #e9e9e9;<br />
border-width: 1px;<br />
}<br />
.rahmenfarbe3 { /* "Rot", auffällig */<br />
border-color: #c00000;<br />
border-width: 1px;<br />
}<br />
.rahmenfarbe4 { /* Neutrale Farbe, deutlich */<br />
border-color: #8888aa;<br />
border-width: 1px;<br />
}<br />
.rahmenfarbe5 { /* "Schwarz", hoher Kontrast */<br />
border-color: #000000;<br />
border-width: 1px;<br />
}<br />
<br />
tr.hintergrundfarbe1 th,<br />
tr th.hintergrundfarbe1,<br />
table.hintergrundfarbe1,<br />
.hintergrundfarbe1 { /* Wie Inhaltsverzeichnis */<br />
background-color: #f9f9f9;<br />
}<br />
tr.hintergrundfarbe2 th,<br />
tr th.hintergrundfarbe2,<br />
table.hintergrundfarbe2,<br />
.hintergrundfarbe2 { /* "Weiß", für Nicht-Artikel-Seiten, neutral */<br />
background-color: #ffffff;<br />
}<br />
tr.hintergrundfarbe3 th,<br />
tr th.hintergrundfarbe3,<br />
table.hintergrundfarbe3,<br />
.hintergrundfarbe3 { /* "Gelb", auffällig */<br />
background-color: #ffff40;<br />
}<br />
tr.hintergrundfarbe4 th,<br />
tr th.hintergrundfarbe4,<br />
table.hintergrundfarbe4,<br />
.hintergrundfarbe4 { /* Sehr auffällig */<br />
background-color: #ffaa00;<br />
}<br />
tr.hintergrundfarbe5 th,<br />
tr th.hintergrundfarbe5,<br />
table.hintergrundfarbe5,<br />
.hintergrundfarbe5 { /* Neutral, abgesetzt */<br />
background-color: #e0e0e0;<br />
}<br />
tr.hintergrundfarbe6 th,<br />
tr th.hintergrundfarbe6,<br />
table.hintergrundfarbe6,<br />
.hintergrundfarbe6 { /* Allgemein „bunt“, für Hervorhebungen und Unterscheidungen */<br />
background-color: #b3b7ff;<br />
}<br />
tr.hintergrundfarbe7 th,<br />
tr th.hintergrundfarbe7,<br />
table.hintergrundfarbe7,<br />
.hintergrundfarbe7 { /* Allgemein „bunt“, für Hervorhebungen und Unterscheidungen */<br />
background-color: #ffcbcb;<br />
}<br />
tr.hintergrundfarbe8 th,<br />
tr th.hintergrundfarbe8,<br />
table.hintergrundfarbe8,<br />
.hintergrundfarbe8 { /* Allgemein „bunt“, für Hervorhebungen und Unterscheidungen */<br />
background-color: #ffebad;<br />
}<br />
tr.hintergrundfarbe9 th,<br />
tr th.hintergrundfarbe9,<br />
table.hintergrundfarbe9,<br />
.hintergrundfarbe9 { /* Allgemein „bunt“, für Hervorhebungen und Unterscheidungen */<br />
background-color: #b9ffc5;<br />
}<br />
<br />
/* Keine Vergrößerung der Zeilenhöhe durch hochgestellte Zahlen der Fußnoten */<br />
<br />
sup.reference {<br />
font-weight: 400;<br />
font-style: normal;<br />
}<br />
sup,<br />
sub {<br />
line-height: 1em;<br />
}<br />
<br />
/* Hervorhebung der angeklickten Fußnoten und der Rückverweise in blau */<br />
<br />
ol.references > li:target,<br />
sup.reference:target {<br />
background-color: #def;<br />
}<br />
<br />
/* Hochgestellte Buchstaben in der Einzelnachweiseliste kursiv setzen */<br />
<br />
ol.references li a[href|="#cite_ref"] {<br />
font-style: italic;<br />
}<br />
<br />
/* Inline-Verwendung der [[:Kategorie:Vorlage:Schwesterprojektverweis|Schwesterprojektverweise]] */<br />
<br />
ol.references li div.sisterproject {<br />
display: inline !important;<br />
}<br />
<br />
/* Für <nowiki><hiero>…</hiero></nowiki> */<br />
<br />
.mw-hierotable,<br />
.mw-hierotable th,<br />
.mw-hierotable td {<br />
border: 0;<br />
padding: 0;<br />
}<br />
<br />
/* Für [[MediaWiki:Anoneditwarning]] und weitere Hinweise, die alle untereinander stehen */<br />
<br />
#mw-anon-edit-warning,<br />
#mw-missingsummary,<br />
#wp_talkpagetext {<br />
width: 80%;<br />
background: #d3e1f2;<br />
border: 1px solid #1a47ff;<br />
margin: 1em auto;<br />
padding: 1em;<br />
}<br />
<br />
/* Bei URLs, die auf unser Projekt und verwandte Projekte verweisen, den Pfeil ausblenden<br />
* Dieser Pfeil dient nur dazu, auf externe Ziele hinzuweisen<br />
* Auf den Einsatz der Klasse "plainlinks" kann dadurch verzichtet werden<br />
*/<br />
#content a[href^="http://de.wikipedia.org"],<br />
#content a[href^="http://toolserver.org"] {<br />
background: none !important;<br />
padding-right: 0 !important;<br />
}<br />
#content .mw-search-formheader div.search-types ul li a[href^="http://de.wikipedia.org"],<br />
#content .mw-search-formheader div.search-types ul li a[href^="http://toolserver.org"] {<br />
padding-right: 0.5em !important; <br />
}<br />
<br />
/* Falls bei der Seitenbearbeitung vergessen wurde, die Zusammenfassung auszufüllen */<br />
.mw-summarymissed {<br />
border: 5px solid red;<br />
padding: 2px;<br />
}<br />
<br />
/* Copyrightwarnung */<br />
<br />
#editpage-copywarn {<br />
border: solid 1px #c00000;<br />
font-size: 90%;<br />
background-color: #ffffff;<br />
}<br />
<br />
.mw-tos-summary {<br />
border: solid 1px #c00000;<br />
background-color: #ffffff;<br />
padding-left: 1em;<br />
}<br />
<br />
/* +++++ 2. SONSTIGE ANPASSUNGEN (Spezialseiten u. a.) +++++ */<br />
<br />
/* Markierung von Redirects in [[Special:Allpages]], [[Special:Watchlist]], Kategorien */<br />
<br />
.allpagesredirect,<br />
.watchlistredir,<br />
.redirect-in-category {<br />
font-style: italic;<br />
}<br />
<br />
/* Fettformatierung von Admin-Spezialseiten in [[Special:Specialpages]] abschalten */<br />
.mw-specialpagerestricted strong {<br />
font-weight: normal;<br />
}<br />
/* Legende auf [[Special:Specialpages]] ebenfalls abschalten */<br />
div.mw-specialpages-notes {<br />
display: none;<br />
}<br />
<br />
/* Größerer Abstand zwischen TOC-Nummerierung und TOC-Eintrag */<br />
span.tocnumber {<br />
margin-right: 0.3em;<br />
}<br />
<br />
/* Skinabhängige absolute Positionierungen ausblenden */<br />
/* Bitte [[MediaWiki Diskussion:Common.css#Absolute_Positionierungen]] beachten */<br />
<br />
#coordinates,<br />
#coordinates_3_ObenRechts,<br />
#issnlink,<br />
#editcount,<br />
#shortcut,<br />
#artikelstadium,<br />
.topicon,<br />
#spoken-icon,<br />
#commons-icon {<br />
display: none;<br />
}<br />
<br />
/* Anpassungen für [[:Template:Link_FA]] */<br />
<br />
/* hide the template */<br />
#bodyContent span.FA {<br />
display: none;<br />
}<br />
<br />
/* change the bullets for links to special articles */<br />
#p-lang li.FA {<br />
/* hier immer auch linkFA_bullet in Common.js mit anpassen für die älteren skins! */<br />
list-style-image: url("http://upload.wikimedia.org/wikipedia/commons/d/d0/Monobook-bullet-star-transparent.png");<br />
}<br />
<br />
/* change the bullets for links to special articles */<br />
#p-lang li.GA {<br />
/* hier immer auch linkGA_bullet in Common.js mit anpassen für die älteren skins! */<br />
list-style-image: url("http://upload.wikimedia.org/wikipedia/commons/a/a1/Monobook-bullet-star-gray.png");<br />
}<br />
<br />
/* Verhindere, dass Infoboxen etc. in den Inhalt von Kategorien hineinragen.<br />
Das betrifft nur Kategorieseiten. */<br />
#mw-subcategories,<br />
#mw-pages {<br />
clear: both;<br />
}<br />
<br />
/* DIVs in ImageMaps inlinen (Vorschlag von Revolus) */<br />
.imagemap-inline div {<br />
display: inline;<br />
}<br />
<br />
/* [[Special:Hochladen]]: Warnmeldung auf bestehende Dateien, unerwünschte Prefixe usw. deutlicher hervorheben. */<br />
<br />
#wpDestFile-warning ul {<br />
border: solid red 1px;<br />
padding: 1.5em;<br />
}<br />
<br />
/* Warnmeldung für gesperrte Titel */<br />
.mw-titleprotectedwarning {<br />
background-color: #eee;<br />
border: 2px solid red;<br />
padding: 1em;<br />
}<br />
<br />
/* Warnmeldung bei der Bearbeitung von Seiten im MediaWiki-Namensraum */<br />
.mw-editinginterface {<br />
background-color: #f9f9f9;<br />
border-color: #c00000;<br />
border-width: 1px;<br />
border-style: solid;<br />
padding: 2px;<br />
}<br />
<br />
/* Überschrift 5. und 6. Ordnung proportionaler zu Fließtext */<br />
#content h5 {<br />
font-size: 108%; /* Original: 116% */<br />
}<br />
#content h6 {<br />
font-size: 100%; /* Original: 80% = kleiner als Bodytext, unschön */<br />
}<br />
#content h6 .editsection {<br />
font-size: 120%;<br />
font-weight: normal;<br />
}<br />
<br />
/* Anleitung auf Special:Search */<br />
.mw-searchresult {<br />
font-size: 84%;<br />
margin: 5px;<br />
}<br />
<br />
/* Gestaltung der Edittools-Leiste */<br />
#specialchars {<br />
margin-top: 3px;<br />
border: solid 1px #aaaaaa;<br />
padding: 1px;<br />
text-align: left;<br />
background-color: white;<br />
}<br />
<br />
/* Legende für Versionsgeschichte */<br />
.mw-history-legend {<br />
font-size: 90%;<br />
margin-top: 2px;<br />
margin-bottom: 2px;<br />
border: solid 1px #e9e9e9;<br />
padding: 0 5px 5px 5px;<br />
background-color: #f9f9f9;<br />
clear: both;<br />
}<br />
<br />
/* +++++ 3. NEUE [[Wikipedia:Hauptseite|HAUPTSEITE]] (ab 2006) +++++ */<br />
<br />
/* Kategorie verbergen */<br />
/* Überschrift verbergen */<br />
/* Redirhinweis verbergen - ACHTUNG: Je nach Skin muss jetzt der Abstand zum oberen Rand korrigiert werden */<br />
body.page-Wikipedia_Hauptseite #catlinks,<br />
body.page-Wikipedia_Hauptseite h1.firstHeading,<br />
body.page-Wikipedia_Hauptseite #contentSub {<br />
display: none;<br />
}<br />
<br />
#hauptseite h2 {<br />
background-color: #d8e8ff;<br />
border: 1px solid #8898bf;<br />
font-size: 1em;<br />
font-weight: bold;<br />
margin-top: 0;<br />
margin-bottom: 0;<br />
padding-top: 0.1em;<br />
padding-bottom: 0.1em;<br />
}<br />
#hauptseite .inhalt {<br />
background-color: #ffffff;<br />
border: 1px solid #8898bf;<br />
border-top: 0 solid white;<br />
padding: 0.3em 0.8em 0.4em 0.8em;<br />
}<br />
#hauptseite .inhalt hr {<br />
background-color: #8898bf;<br />
color: #8898bf;<br />
height: 1px;<br />
margin: 0.5em 0;<br />
padding: 0;<br />
}<br />
#hauptseite .inhalt .mehr {<br />
clear: both;<br />
font-size: 95%;<br />
margin-top: 0.8em;<br />
text-align: right;<br />
}<br />
#hauptseite table {<br />
background-color: transparent;<br />
}<br />
.hauptseite-oben,<br />
.hauptseite-links,<br />
.hauptseite-rechts {<br />
margin-bottom: 1em;<br />
}<br />
.hauptseite-links {<br />
margin-right: 0.5em;<br />
}<br />
.hauptseite-rechts {<br />
margin-left: 0.5em;<br />
}<br />
.hauptseite-oben h2,<br />
.hauptseite-unten h2 {<br />
text-align: center;<br />
}<br />
.hauptseite-oben .inhalt .portale {<br />
font-weight: bold;<br />
margin-top: 0.2em;<br />
margin-bottom: 0.2em;<br />
}<br />
.hauptseite-oben .inhalt .intern {<br />
font-size: 90%;<br />
text-align: center;<br />
}<br />
.hauptseite-links h2,<br />
.hauptseite-rechts h2 {<br />
text-indent: 0.8em;<br />
}<br />
#hauptseite-schwesterprojekte .inhalt a {<br />
font-weight: bold;<br />
}<br />
<br />
/* IPA links nicht unterstreichen */<br />
.IPA a:link,<br />
.IPA a:visited {<br />
text-decoration: none;<br />
}<br />
<br />
/* CSS-Klassen für Schriftarten als Workaround für Defizite in alten IE-Versionen.<br />
* Achtung: IE6 mag keine Zeilenumbrüche zwischen den Fonts.<br />
* In IE8 nicht mehr nötig, soll mit den alten Versionen aussterben. Browserweiche:<br />
* http://www.dynamicsitesolutions.com/css/filters/star-html/<br />
* http://www.dynamicsitesolutions.com/css/filters/first-child-plus-html/<br />
*/<br />
* html .Unicode {<br />
font-family: Code2000, Sun-ExtA, "Arial Unicode MS", NSimSun, sans-serif;<br />
}<br />
*:first-child+html .Unicode {<br />
font-family: Code2000, Sun-ExtA, "Arial Unicode MS", NSimSun, sans-serif;<br />
}<br />
* html .Unicode1 {<br />
font-family: Code2001, Quivira, "MPH 2B Damase", sans-serif;<br />
}<br />
*:first-child+html .Unicode1 {<br />
font-family: Code2001, Quivira, "MPH 2B Damase", sans-serif;<br />
}<br />
* html .Unicode2 {<br />
font-family: Sun-ExtB, Code2002, sans-serif;<br />
}<br />
*:first-child+html .Unicode2 {<br />
font-family: Sun-ExtB, Code2002, sans-serif;<br />
}<br />
* html .IPA {<br />
font-family: Quivira, Code2000, Sun-ExtA, "DejaVu Sans", Gentium, Helvetica, "Arial Unicode MS", "Lucida Sans Unicode", sans-serif;<br />
}<br />
*:first-child+html .IPA {<br />
font-family: Quivira, Code2000, Sun-ExtA, "DejaVu Sans", Gentium, Helvetica, "Arial Unicode MS", "Lucida Sans Unicode", sans-serif;<br />
}<br />
* html .IAST {<br />
font-family: Code2000, SunExtA, "Arial Unicode MS", sans-serif;<br />
}<br />
*:first-child+html .IAST {<br />
font-family: Code2000, SunExtA, "Arial Unicode MS", sans-serif;<br />
}<br />
* html .altitalisch {<br />
font-family: Quivira, Code2001, "MPH 2B Damase", sans-serif;<br />
}<br />
*:first-child+html .altitalisch {<br />
font-family: Quivira, Code2001, "MPH 2B Damase", sans-serif;<br />
}<br />
* html .gotisch {<br />
font-family: Quivira, Code2001, "MPH 2B Damase", sans-serif;<br />
}<br />
*:first-child+html .gotisch {<br />
font-family: Quivira, Code2001, "MPH 2B Damase", sans-serif;<br />
}<br />
* html .hebrew {<br />
font-family: Quivira, Sun-ExtA, "Arial Unicode MS", "SBL Hebrew", Code2000, "MPH 2B Damase", sans-serif;<br />
}<br />
*:first-child+html .hebrew {<br />
font-family: Quivira, Sun-ExtA, "Arial Unicode MS", "SBL Hebrew", Code2000, "MPH 2B Damase", sans-serif;<br />
}<br />
* html .spanAr {<br />
font-family: "Arial Unicode MS", Scheherazade, Code2000, "DejaVu Sans", sans-serif;<br />
}<br />
*:first-child+html .spanAr {<br />
font-family: "Arial Unicode MS", Scheherazade, Code2000, "DejaVu Sans", sans-serif;<br />
}<br />
* html .music-symbol {<br />
font-family: "Musical Symbols", Euterpe, Code2001, sans-serif;<br />
}<br />
*:first-child+html .music-symbol {<br />
font-family: "Musical Symbols", Euterpe, Code2001, sans-serif;<br />
}<br />
* html .polytonic {<br />
font-family: "Arial Unicode MS", "Palatino Linotype", Code2000, "New Athena Unicode", Gentium, "Athena Unicode";<br />
}<br />
*:first-child+html .polytonic {<br />
font-family: "Arial Unicode MS", "Palatino Linotype", Code2000, "New Athena Unicode", Gentium, "Athena Unicode";<br />
}<br />
<br />
/* Standardmäßige Ausblendung der Flagged-Revisions-Backlog-Sitenotice */<br />
#mw-oldreviewed-notice {<br />
display: none;<br />
}<br />
<br />
/* Standardmäßige Ausblendung der Flagged-Revisions-Kommentarbox */<br />
#mw-commentbox {<br />
display: none;<br />
}<br />
<br />
/* Abstand zwischen Liste und Inhaltsverzeichnis erhöhen, siehe http://de.wikipedia.org/w/index.php?title=MediaWiki_Diskussion:Common.css&oldid=51639015#Abstand_vor_Inhaltsverzeichnis */<br />
ul + .toc,<br />
ol + .toc {<br />
margin-top: 0.5em;<br />
}<br />
<br />
/* höheres Uploadfeld */<br />
#wpUploadDescription {<br />
height: 20em;<br />
}<br />
<br />
/* Im Projekt WP:GEO benutzt die [[Vorlage:Coordinate]] das «geo-microformat» zur semantischen<br />
Auszeichnung des Texts. Der Inhalt dieses [[Tag (Informatik)|Tags]] ist nicht für den Leser bestimmt. */<br />
.geo {<br />
display: none;<br />
}<br />
<br />
/* Patrollink ausblenden, da die Eweiterung hier nicht aktiviert ist und<br />
deren Optik zu sehr den gesichteten Versionen ähnelt. */<br />
.fr-diff-patrollink,<br />
.patrollink {<br />
display: none;<br />
}<br />
<br />
/* Rollback-Knopf auf Beobachtungsliste ausblenden, da es dort nur von sehr beschränktem Nutzen<br />
ist und zu sehr vielen Reverts aus Versehen führt */<br />
.page-Spezial_Beobachtungsliste .mw-rollback-link {<br />
display: none;<br />
}<br />
<br />
/* </source> */<br />
<br />
/* Disable Discussion-tab */<br />
<br />
#ca-talk {<br />
display: none;<br />
}<br />
<br />
<br />
/* reset code style */<br />
<br />
code {<br />
background-color: none !important;<br />
border: none !important;<br />
border-radius: 0;<br />
padding: 0;<br />
}<br />
<br />
pre {<br />
white-space: pre;<br />
}<br />
<br />
/* highlighting */<br />
<br />
.hb1 { background-color: #C1F5C1; }<br />
.hb2 { background-color: #CDC2EF; }<br />
.hb3 { background-color: #FFF6C9; }<br />
.hb4 { background-color: #FFC9C9; }<br />
.hb5 { background-color: #BED8ED; }<br />
.hb6 { background-color: #EDBBED; }<br />
.hb7 { background-color: #F4FDC7; }<br />
.hb8 { background-color: #FFE8C9; }<br />
<br />
.hf1 { color: #66D766; }<br />
.hf2 { color: #7C67C0; }<br />
.hf3 { color: #FFE879; }<br />
.hf4 { color: #FF7979; }<br />
.hf5 { color: #5D90B7; }<br />
.hf6 { color: #B857B8; }<br />
.hf7 { color: #E2F876; }<br />
.hf8 { color: #FFC679; }<br />
<br />
.he0 { border: 1px solid grey; border-radius: 4px; }<br />
.he1 { border: 1px solid #66D766; border-radius: 4px; }<br />
.he2 { border: 1px solid #7C67C0; border-radius: 4px; }<br />
.he3 { border: 1px solid #FFE879; border-radius: 4px; }<br />
.he4 { border: 1px solid #FF7979; border-radius: 4px; }<br />
.he5 { border: 1px solid #5D90B7; border-radius: 4px; }<br />
.he6 { border: 1px solid #B857B8; border-radius: 4px; }<br />
.he7 { border: 1px solid #E2F876; border-radius: 4px; }<br />
.he8 { border: 1px solid #FFC679; border-radius: 4px; }<br />
<br />
code { line-height: normal; }</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=MediaWiki:Common.css&diff=1670MediaWiki:Common.css2021-09-06T20:58:04Z<p>Qsysopr: </p>
<hr />
<div>/* <source lang="css"> */<br />
<br />
/*-----------------------------------------------------------------------------------------------*/<br />
/* ACHTUNG! Common.css enthält die gemeinsamen Skin-Anpassungen der deutschsprachigen Wikipedia */<br />
/*---------------------------------------------------------------------------------------------*/<br />
<br />
/* Common.css ist in drei grundlegende Abschnitte gegliedert: */<br />
<br />
/* 1. Editierbare Seiteninhalte */<br />
/* 2. Sonstige Anpassungen (Spezialseiten, u.a.) */<br />
/* 3. Hauptseitenspezifisches */<br />
<br />
/* Jede Ergänzung/Änderung muss vorher jeweils für alle Skins auf Tauglichkeit getestet werden, */<br />
/* individuell per User.css! Ist hier erstmal geändert, dauert es dank Cache eine Weile, bis die */<br />
/* Änderungen bei allen Nutzern sichtbar oder, bei Fehlern, korrigiert sind. */<br />
<br />
/* +++++ 1. ANPASSUNGEN DER ANZEIGE VON EDITIERBAREN SEITENINHALTEN +++++ */<br />
<br />
/* Personennamen in Kapitälchen: class="Person" */<br />
<br />
.Person {<br />
display: inline;<br />
font-variant: small-caps;<br />
font-style: normal;<br />
}<br />
<br />
/* [[Wikipedia:Zitate|Zitate]] (siehe [[Vorlage:Zitat]]) */<br />
<br />
p.Zitat {<br />
font-style: normal;<br />
margin-bottom: 0;<br />
}<br />
p.cite {<br />
margin-top: 0;<br />
padding-left: 1em;<br />
}<br />
<br />
/* [[Wikipedia:Quellenangaben|Quellenangaben]] nicht kursiv, da sie ggf. verschiedene Bestandteile enthalten */<br />
<br />
cite {<br />
font-style: normal;<br />
}<br />
<br />
/* Stylesheet-Ergänzung zu Standard-[[Wikipedia:Navigationsleisten|Navigationsleisten]] */<br />
<br />
div.BoxenVerschmelzen,<br />
div.NavFrame {<br />
margin: 1.5em 0 0;<br />
padding: 2px;<br />
border: 1px solid #aaaaaa;<br />
text-align: center;<br />
border-collapse: collapse;<br />
font-size: 95%;<br />
clear: both;<br />
}<br />
div.BoxenVerschmelzen div.NavFrame,<br />
div.NavFrame + div.NavFrame {<br />
margin-top: 0;<br />
}<br />
div.BoxenVerschmelzen div.NavFrame {<br />
border-style: none;<br />
border-style: hidden;<br />
}<br />
div.NavFrame + div.NavFrame {<br />
border-top-style: none;<br />
border-top-style: hidden;<br />
}<br />
div.NavPic {<br />
margin: 0;<br />
padding: 2px;<br />
float: left;<br />
}<br />
div.NavFrame div.NavHead {<br />
font-weight: bold;<br />
font-size: 100%;<br />
background-color: #efefef;<br />
}<br />
div.NavFrame p,<br />
div.NavFrame div.NavContent,<br />
div.NavFrame div.NavContent p {<br />
font-size: 100%;<br />
}<br />
div.NavEnd {<br />
margin: 0;<br />
padding: 0;<br />
line-height: 1px;<br />
clear: both;<br />
}<br />
<br />
/* Stylesheet fuer den 'Ausklappen'-Button an Navileisten, der in [[MediaWiki:Common.js]] implementiert wird */<br />
.NavToggle {<br />
font-size: x-small;<br />
float: right;<br />
}<br />
<br />
/* Workaround für Internet Explorer 6 */<br />
div.NavFrame,<br />
div.NavPic,<br />
.NavToggle {<br />
position: relative;<br />
}<br />
<br />
/* Stylesheet-Ergänzung zu SideBoxen (ehedem [[Wikipedia:TownBox|TownBox]]) */<br />
<br />
div.sideBox {<br />
position: relative;<br />
float: right;<br />
background: white;<br />
margin-left: 1em;<br />
border: 1px solid gray;<br />
padding: 0.3em;<br />
width: 200px;<br />
overflow: hidden;<br />
clear: right;<br />
}<br />
div.sideBox dl {<br />
padding: 0;<br />
margin: 0 0 0.3em 0;<br />
font-size: 96%;<br />
}<br />
div.sideBox dl dt {<br />
background: none;<br />
margin: 0.4em 0 0 0;<br />
}<br />
div.sideBox dl dd {<br />
margin: 0.1em 0 0 1.1em;<br />
background-color: #f3f3f3;<br />
}<br />
<br />
/* Stylesheet-Ergänzung zu [[Wikipedia:Taxoboxen|Taxoboxen]] und [[Wikipedia:Paläoboxen|Paläoboxen]] */<br />
table.taxobox,<br />
table.palaeobox {<br />
border-collapse: collapse;<br />
border: 1px solid gray;<br />
float: right;<br />
clear: right;<br />
margin-left: 0.5em;<br />
background-color: white;<br />
}<br />
table.taxobox th {<br />
background-color: #9bcd9b;<br />
}<br />
table.palaeobox th {<br />
background-color: #e7dcc3;<br />
}<br />
table.taxobox th,<br />
table.palaeobox th {<br />
border: solid 1px gray;<br />
text-align: center;<br />
font-weight: bold;<br />
}<br />
table.taxobox td,<br />
table.palaeobox td {<br />
vertical-align: top;<br />
}<br />
table.taxobox .Person,<br />
table.palaeobox .Person {<br />
font-style: normal;<br />
}<br />
table.taxobox div.thumb,<br />
table.taxobox div.thumb * {<br />
background-color: #f9f9f9;<br />
}<br />
table.taxobox div.thumb,<br />
table.taxobox div.thumb *,<br />
table.palaeobox div.thumb,<br />
table.palaeobox div.thumb * {<br />
margin: 0 auto;<br />
padding: 0;<br />
float: none;<br />
border: none;<br />
}<br />
table.taxobox div.magnify,<br />
table.palaeobox div.magnify {<br />
display: none;<br />
}<br />
table.taxobox tr td div.thumb div div.thumbcaption {<br />
text-align: center;<br />
}<br />
table.palaeobox tr td div.thumb div div.thumbcaption {<br />
text-align: left;<br />
}<br />
table.taxobox td.Person,<br />
table.palaeobox td.Person {<br />
text-align: center;<br />
display: block;<br />
}<br />
table.taxobox td.taxo-name,<br />
table.taxobox td.taxo-bild,<br />
table.palaeobox td.taxo-name,<br />
table.palaeobox td.taxo-bild,<br />
table.palaeobox td.taxo-zeit {<br />
text-align: center;<br />
}<br />
table.palaeobox td.taxo-ort {<br />
text-align: left;<br />
}<br />
<br />
/* aus Vorlage zur Entlastung, skinabhängigen Darstellung und Kombinierbarkeit hierher ausgelagert */<br />
.wikitable,<br />
.prettytable {<br />
margin: 1em 1em 1em 0;<br />
background: #f9f9f9;<br />
border: 1px #aaa solid;<br />
border-collapse: collapse;<br />
}<br />
.prettytable th,<br />
.prettytable td {<br />
border: 1px #aaa solid;<br />
padding: 0.2em;<br />
}<br />
.prettytable th {<br />
text-align: center;<br />
}<br />
.prettytable caption {<br />
font-weight: bold;<br />
}<br />
<br />
/* Zebra-Tabellen */<br />
table.wikitable.zebra tr:nth-child(even) {<br />
background: white;<br />
}<br />
<br />
.nogrid th,<br />
.nogrid td {<br />
border: none;<br />
}<br />
div.float-left,<br />
table.float-left,<br />
.float-left {<br />
float: left;<br />
clear: left;<br />
}<br />
div.float-right,<br />
table.float-right,<br />
.float-right {<br />
float: right;<br />
clear: right;<br />
margin: 1em 0 1em 1em;<br />
}<br />
div.centered,<br />
table.centered,<br />
.centered {<br />
margin-left: auto;<br />
margin-right: auto;<br />
}<br />
.toptextcells td {<br />
vertical-align: top;<br />
}<br />
<br />
/* Bitte KEINE weiteren Definitionen dieser Art für Boxen hier, das gehört in entsprechende Vorlagen! */<br />
/* Hier 20 Mal Trivialitäten wie "text-align:center" zu definieren verlangsamt alles und ist nicht */<br />
/* Sinn der Sache. (Und wer nicht weiß warum, hat's nicht verstanden.) */<br />
<br />
/* Do not expand [[Wikipedia:WikiProjekt Georeferenzierung|kvaleberg.com-URLs]] for printing */<br />
<br />
#content span.coordinates a.external.text:after,<br />
#content span.coordinates a.external.autonumber:after,<br />
#content div.coordinates a.external.text:after,<br />
#content div.coordinates a.external.autonumber:after {<br />
content: "";<br />
}<br />
<br />
/* Do not expand URLs for printing */<br />
<br />
#content span.plainlinks-print a.external.text:after,<br />
#content span.plainlinks-print a.external.autonumber:after,<br />
#content div.plainlinks-print a.external.text:after,<br />
#content div.plainlinks-print a.external.autonumber:after {<br />
content: "";<br />
}<br />
<br />
/* Metadaten (bspw. [[Wikipedia:Personendaten|Personendaten]]) */<br />
<br />
table.metadata {<br />
border: 1px solid #aaaaaa;<br />
display: none;<br />
}<br />
.metadata-label {<br />
color: #aaaaaa;<br />
}<br />
span.metadata,<br />
span.metadata-inline {<br />
display: none;<br />
}<br />
<br />
/*<br />
* Farbdefinitionen für Rahmen und Hintergründe von [[Wikipedia:Textbausteine|Textbausteinen]].<br />
* Hier: Standardvorgaben für "dunkle Schrift auf hellem Grund".<br />
* Für Hell-auf-dunkel-Skins ([[MediaWiki:Amethyst.css|Amethyst]]) müssen dort entsprechende Definitionen<br />
* zusätzlich eingetragen werden! Anpassungen für andere Skins sind optional.<br />
* (Die Angaben der Rahmenstärke dienen der Bequemlichkeit, so dass man<br />
* für dünne Rahmen nur noch "border-style" angeben muss.)<br />
*/<br />
<br />
.rahmenfarbe1 { /* Wie Inhaltsverzeichnis */<br />
border-color: #aaaaaa;<br />
border-width: 1px;<br />
}<br />
.rahmenfarbe2 { /* Unauffällig, geringer Kontrast */<br />
border-color: #e9e9e9;<br />
border-width: 1px;<br />
}<br />
.rahmenfarbe3 { /* "Rot", auffällig */<br />
border-color: #c00000;<br />
border-width: 1px;<br />
}<br />
.rahmenfarbe4 { /* Neutrale Farbe, deutlich */<br />
border-color: #8888aa;<br />
border-width: 1px;<br />
}<br />
.rahmenfarbe5 { /* "Schwarz", hoher Kontrast */<br />
border-color: #000000;<br />
border-width: 1px;<br />
}<br />
<br />
tr.hintergrundfarbe1 th,<br />
tr th.hintergrundfarbe1,<br />
table.hintergrundfarbe1,<br />
.hintergrundfarbe1 { /* Wie Inhaltsverzeichnis */<br />
background-color: #f9f9f9;<br />
}<br />
tr.hintergrundfarbe2 th,<br />
tr th.hintergrundfarbe2,<br />
table.hintergrundfarbe2,<br />
.hintergrundfarbe2 { /* "Weiß", für Nicht-Artikel-Seiten, neutral */<br />
background-color: #ffffff;<br />
}<br />
tr.hintergrundfarbe3 th,<br />
tr th.hintergrundfarbe3,<br />
table.hintergrundfarbe3,<br />
.hintergrundfarbe3 { /* "Gelb", auffällig */<br />
background-color: #ffff40;<br />
}<br />
tr.hintergrundfarbe4 th,<br />
tr th.hintergrundfarbe4,<br />
table.hintergrundfarbe4,<br />
.hintergrundfarbe4 { /* Sehr auffällig */<br />
background-color: #ffaa00;<br />
}<br />
tr.hintergrundfarbe5 th,<br />
tr th.hintergrundfarbe5,<br />
table.hintergrundfarbe5,<br />
.hintergrundfarbe5 { /* Neutral, abgesetzt */<br />
background-color: #e0e0e0;<br />
}<br />
tr.hintergrundfarbe6 th,<br />
tr th.hintergrundfarbe6,<br />
table.hintergrundfarbe6,<br />
.hintergrundfarbe6 { /* Allgemein „bunt“, für Hervorhebungen und Unterscheidungen */<br />
background-color: #b3b7ff;<br />
}<br />
tr.hintergrundfarbe7 th,<br />
tr th.hintergrundfarbe7,<br />
table.hintergrundfarbe7,<br />
.hintergrundfarbe7 { /* Allgemein „bunt“, für Hervorhebungen und Unterscheidungen */<br />
background-color: #ffcbcb;<br />
}<br />
tr.hintergrundfarbe8 th,<br />
tr th.hintergrundfarbe8,<br />
table.hintergrundfarbe8,<br />
.hintergrundfarbe8 { /* Allgemein „bunt“, für Hervorhebungen und Unterscheidungen */<br />
background-color: #ffebad;<br />
}<br />
tr.hintergrundfarbe9 th,<br />
tr th.hintergrundfarbe9,<br />
table.hintergrundfarbe9,<br />
.hintergrundfarbe9 { /* Allgemein „bunt“, für Hervorhebungen und Unterscheidungen */<br />
background-color: #b9ffc5;<br />
}<br />
<br />
/* Keine Vergrößerung der Zeilenhöhe durch hochgestellte Zahlen der Fußnoten */<br />
<br />
sup.reference {<br />
font-weight: 400;<br />
font-style: normal;<br />
}<br />
sup,<br />
sub {<br />
line-height: 1em;<br />
}<br />
<br />
/* Hervorhebung der angeklickten Fußnoten und der Rückverweise in blau */<br />
<br />
ol.references > li:target,<br />
sup.reference:target {<br />
background-color: #def;<br />
}<br />
<br />
/* Hochgestellte Buchstaben in der Einzelnachweiseliste kursiv setzen */<br />
<br />
ol.references li a[href|="#cite_ref"] {<br />
font-style: italic;<br />
}<br />
<br />
/* Inline-Verwendung der [[:Kategorie:Vorlage:Schwesterprojektverweis|Schwesterprojektverweise]] */<br />
<br />
ol.references li div.sisterproject {<br />
display: inline !important;<br />
}<br />
<br />
/* Für <nowiki><hiero>…</hiero></nowiki> */<br />
<br />
.mw-hierotable,<br />
.mw-hierotable th,<br />
.mw-hierotable td {<br />
border: 0;<br />
padding: 0;<br />
}<br />
<br />
/* Für [[MediaWiki:Anoneditwarning]] und weitere Hinweise, die alle untereinander stehen */<br />
<br />
#mw-anon-edit-warning,<br />
#mw-missingsummary,<br />
#wp_talkpagetext {<br />
width: 80%;<br />
background: #d3e1f2;<br />
border: 1px solid #1a47ff;<br />
margin: 1em auto;<br />
padding: 1em;<br />
}<br />
<br />
/* Bei URLs, die auf unser Projekt und verwandte Projekte verweisen, den Pfeil ausblenden<br />
* Dieser Pfeil dient nur dazu, auf externe Ziele hinzuweisen<br />
* Auf den Einsatz der Klasse "plainlinks" kann dadurch verzichtet werden<br />
*/<br />
#content a[href^="http://de.wikipedia.org"],<br />
#content a[href^="http://toolserver.org"] {<br />
background: none !important;<br />
padding-right: 0 !important;<br />
}<br />
#content .mw-search-formheader div.search-types ul li a[href^="http://de.wikipedia.org"],<br />
#content .mw-search-formheader div.search-types ul li a[href^="http://toolserver.org"] {<br />
padding-right: 0.5em !important; <br />
}<br />
<br />
/* Falls bei der Seitenbearbeitung vergessen wurde, die Zusammenfassung auszufüllen */<br />
.mw-summarymissed {<br />
border: 5px solid red;<br />
padding: 2px;<br />
}<br />
<br />
/* Copyrightwarnung */<br />
<br />
#editpage-copywarn {<br />
border: solid 1px #c00000;<br />
font-size: 90%;<br />
background-color: #ffffff;<br />
}<br />
<br />
.mw-tos-summary {<br />
border: solid 1px #c00000;<br />
background-color: #ffffff;<br />
padding-left: 1em;<br />
}<br />
<br />
/* +++++ 2. SONSTIGE ANPASSUNGEN (Spezialseiten u. a.) +++++ */<br />
<br />
/* Markierung von Redirects in [[Special:Allpages]], [[Special:Watchlist]], Kategorien */<br />
<br />
.allpagesredirect,<br />
.watchlistredir,<br />
.redirect-in-category {<br />
font-style: italic;<br />
}<br />
<br />
/* Fettformatierung von Admin-Spezialseiten in [[Special:Specialpages]] abschalten */<br />
.mw-specialpagerestricted strong {<br />
font-weight: normal;<br />
}<br />
/* Legende auf [[Special:Specialpages]] ebenfalls abschalten */<br />
div.mw-specialpages-notes {<br />
display: none;<br />
}<br />
<br />
/* Größerer Abstand zwischen TOC-Nummerierung und TOC-Eintrag */<br />
span.tocnumber {<br />
margin-right: 0.3em;<br />
}<br />
<br />
/* Skinabhängige absolute Positionierungen ausblenden */<br />
/* Bitte [[MediaWiki Diskussion:Common.css#Absolute_Positionierungen]] beachten */<br />
<br />
#coordinates,<br />
#coordinates_3_ObenRechts,<br />
#issnlink,<br />
#editcount,<br />
#shortcut,<br />
#artikelstadium,<br />
.topicon,<br />
#spoken-icon,<br />
#commons-icon {<br />
display: none;<br />
}<br />
<br />
/* Anpassungen für [[:Template:Link_FA]] */<br />
<br />
/* hide the template */<br />
#bodyContent span.FA {<br />
display: none;<br />
}<br />
<br />
/* change the bullets for links to special articles */<br />
#p-lang li.FA {<br />
/* hier immer auch linkFA_bullet in Common.js mit anpassen für die älteren skins! */<br />
list-style-image: url("http://upload.wikimedia.org/wikipedia/commons/d/d0/Monobook-bullet-star-transparent.png");<br />
}<br />
<br />
/* change the bullets for links to special articles */<br />
#p-lang li.GA {<br />
/* hier immer auch linkGA_bullet in Common.js mit anpassen für die älteren skins! */<br />
list-style-image: url("http://upload.wikimedia.org/wikipedia/commons/a/a1/Monobook-bullet-star-gray.png");<br />
}<br />
<br />
/* Verhindere, dass Infoboxen etc. in den Inhalt von Kategorien hineinragen.<br />
Das betrifft nur Kategorieseiten. */<br />
#mw-subcategories,<br />
#mw-pages {<br />
clear: both;<br />
}<br />
<br />
/* DIVs in ImageMaps inlinen (Vorschlag von Revolus) */<br />
.imagemap-inline div {<br />
display: inline;<br />
}<br />
<br />
/* [[Special:Hochladen]]: Warnmeldung auf bestehende Dateien, unerwünschte Prefixe usw. deutlicher hervorheben. */<br />
<br />
#wpDestFile-warning ul {<br />
border: solid red 1px;<br />
padding: 1.5em;<br />
}<br />
<br />
/* Warnmeldung für gesperrte Titel */<br />
.mw-titleprotectedwarning {<br />
background-color: #eee;<br />
border: 2px solid red;<br />
padding: 1em;<br />
}<br />
<br />
/* Warnmeldung bei der Bearbeitung von Seiten im MediaWiki-Namensraum */<br />
.mw-editinginterface {<br />
background-color: #f9f9f9;<br />
border-color: #c00000;<br />
border-width: 1px;<br />
border-style: solid;<br />
padding: 2px;<br />
}<br />
<br />
/* Überschrift 5. und 6. Ordnung proportionaler zu Fließtext */<br />
#content h5 {<br />
font-size: 108%; /* Original: 116% */<br />
}<br />
#content h6 {<br />
font-size: 100%; /* Original: 80% = kleiner als Bodytext, unschön */<br />
}<br />
#content h6 .editsection {<br />
font-size: 120%;<br />
font-weight: normal;<br />
}<br />
<br />
/* Anleitung auf Special:Search */<br />
.mw-searchresult {<br />
font-size: 84%;<br />
margin: 5px;<br />
}<br />
<br />
/* Gestaltung der Edittools-Leiste */<br />
#specialchars {<br />
margin-top: 3px;<br />
border: solid 1px #aaaaaa;<br />
padding: 1px;<br />
text-align: left;<br />
background-color: white;<br />
}<br />
<br />
/* Legende für Versionsgeschichte */<br />
.mw-history-legend {<br />
font-size: 90%;<br />
margin-top: 2px;<br />
margin-bottom: 2px;<br />
border: solid 1px #e9e9e9;<br />
padding: 0 5px 5px 5px;<br />
background-color: #f9f9f9;<br />
clear: both;<br />
}<br />
<br />
/* +++++ 3. NEUE [[Wikipedia:Hauptseite|HAUPTSEITE]] (ab 2006) +++++ */<br />
<br />
/* Kategorie verbergen */<br />
/* Überschrift verbergen */<br />
/* Redirhinweis verbergen - ACHTUNG: Je nach Skin muss jetzt der Abstand zum oberen Rand korrigiert werden */<br />
body.page-Wikipedia_Hauptseite #catlinks,<br />
body.page-Wikipedia_Hauptseite h1.firstHeading,<br />
body.page-Wikipedia_Hauptseite #contentSub {<br />
display: none;<br />
}<br />
<br />
#hauptseite h2 {<br />
background-color: #d8e8ff;<br />
border: 1px solid #8898bf;<br />
font-size: 1em;<br />
font-weight: bold;<br />
margin-top: 0;<br />
margin-bottom: 0;<br />
padding-top: 0.1em;<br />
padding-bottom: 0.1em;<br />
}<br />
#hauptseite .inhalt {<br />
background-color: #ffffff;<br />
border: 1px solid #8898bf;<br />
border-top: 0 solid white;<br />
padding: 0.3em 0.8em 0.4em 0.8em;<br />
}<br />
#hauptseite .inhalt hr {<br />
background-color: #8898bf;<br />
color: #8898bf;<br />
height: 1px;<br />
margin: 0.5em 0;<br />
padding: 0;<br />
}<br />
#hauptseite .inhalt .mehr {<br />
clear: both;<br />
font-size: 95%;<br />
margin-top: 0.8em;<br />
text-align: right;<br />
}<br />
#hauptseite table {<br />
background-color: transparent;<br />
}<br />
.hauptseite-oben,<br />
.hauptseite-links,<br />
.hauptseite-rechts {<br />
margin-bottom: 1em;<br />
}<br />
.hauptseite-links {<br />
margin-right: 0.5em;<br />
}<br />
.hauptseite-rechts {<br />
margin-left: 0.5em;<br />
}<br />
.hauptseite-oben h2,<br />
.hauptseite-unten h2 {<br />
text-align: center;<br />
}<br />
.hauptseite-oben .inhalt .portale {<br />
font-weight: bold;<br />
margin-top: 0.2em;<br />
margin-bottom: 0.2em;<br />
}<br />
.hauptseite-oben .inhalt .intern {<br />
font-size: 90%;<br />
text-align: center;<br />
}<br />
.hauptseite-links h2,<br />
.hauptseite-rechts h2 {<br />
text-indent: 0.8em;<br />
}<br />
#hauptseite-schwesterprojekte .inhalt a {<br />
font-weight: bold;<br />
}<br />
<br />
/* IPA links nicht unterstreichen */<br />
.IPA a:link,<br />
.IPA a:visited {<br />
text-decoration: none;<br />
}<br />
<br />
/* CSS-Klassen für Schriftarten als Workaround für Defizite in alten IE-Versionen.<br />
* Achtung: IE6 mag keine Zeilenumbrüche zwischen den Fonts.<br />
* In IE8 nicht mehr nötig, soll mit den alten Versionen aussterben. Browserweiche:<br />
* http://www.dynamicsitesolutions.com/css/filters/star-html/<br />
* http://www.dynamicsitesolutions.com/css/filters/first-child-plus-html/<br />
*/<br />
* html .Unicode {<br />
font-family: Code2000, Sun-ExtA, "Arial Unicode MS", NSimSun, sans-serif;<br />
}<br />
*:first-child+html .Unicode {<br />
font-family: Code2000, Sun-ExtA, "Arial Unicode MS", NSimSun, sans-serif;<br />
}<br />
* html .Unicode1 {<br />
font-family: Code2001, Quivira, "MPH 2B Damase", sans-serif;<br />
}<br />
*:first-child+html .Unicode1 {<br />
font-family: Code2001, Quivira, "MPH 2B Damase", sans-serif;<br />
}<br />
* html .Unicode2 {<br />
font-family: Sun-ExtB, Code2002, sans-serif;<br />
}<br />
*:first-child+html .Unicode2 {<br />
font-family: Sun-ExtB, Code2002, sans-serif;<br />
}<br />
* html .IPA {<br />
font-family: Quivira, Code2000, Sun-ExtA, "DejaVu Sans", Gentium, Helvetica, "Arial Unicode MS", "Lucida Sans Unicode", sans-serif;<br />
}<br />
*:first-child+html .IPA {<br />
font-family: Quivira, Code2000, Sun-ExtA, "DejaVu Sans", Gentium, Helvetica, "Arial Unicode MS", "Lucida Sans Unicode", sans-serif;<br />
}<br />
* html .IAST {<br />
font-family: Code2000, SunExtA, "Arial Unicode MS", sans-serif;<br />
}<br />
*:first-child+html .IAST {<br />
font-family: Code2000, SunExtA, "Arial Unicode MS", sans-serif;<br />
}<br />
* html .altitalisch {<br />
font-family: Quivira, Code2001, "MPH 2B Damase", sans-serif;<br />
}<br />
*:first-child+html .altitalisch {<br />
font-family: Quivira, Code2001, "MPH 2B Damase", sans-serif;<br />
}<br />
* html .gotisch {<br />
font-family: Quivira, Code2001, "MPH 2B Damase", sans-serif;<br />
}<br />
*:first-child+html .gotisch {<br />
font-family: Quivira, Code2001, "MPH 2B Damase", sans-serif;<br />
}<br />
* html .hebrew {<br />
font-family: Quivira, Sun-ExtA, "Arial Unicode MS", "SBL Hebrew", Code2000, "MPH 2B Damase", sans-serif;<br />
}<br />
*:first-child+html .hebrew {<br />
font-family: Quivira, Sun-ExtA, "Arial Unicode MS", "SBL Hebrew", Code2000, "MPH 2B Damase", sans-serif;<br />
}<br />
* html .spanAr {<br />
font-family: "Arial Unicode MS", Scheherazade, Code2000, "DejaVu Sans", sans-serif;<br />
}<br />
*:first-child+html .spanAr {<br />
font-family: "Arial Unicode MS", Scheherazade, Code2000, "DejaVu Sans", sans-serif;<br />
}<br />
* html .music-symbol {<br />
font-family: "Musical Symbols", Euterpe, Code2001, sans-serif;<br />
}<br />
*:first-child+html .music-symbol {<br />
font-family: "Musical Symbols", Euterpe, Code2001, sans-serif;<br />
}<br />
* html .polytonic {<br />
font-family: "Arial Unicode MS", "Palatino Linotype", Code2000, "New Athena Unicode", Gentium, "Athena Unicode";<br />
}<br />
*:first-child+html .polytonic {<br />
font-family: "Arial Unicode MS", "Palatino Linotype", Code2000, "New Athena Unicode", Gentium, "Athena Unicode";<br />
}<br />
<br />
/* Standardmäßige Ausblendung der Flagged-Revisions-Backlog-Sitenotice */<br />
#mw-oldreviewed-notice {<br />
display: none;<br />
}<br />
<br />
/* Standardmäßige Ausblendung der Flagged-Revisions-Kommentarbox */<br />
#mw-commentbox {<br />
display: none;<br />
}<br />
<br />
/* Abstand zwischen Liste und Inhaltsverzeichnis erhöhen, siehe http://de.wikipedia.org/w/index.php?title=MediaWiki_Diskussion:Common.css&oldid=51639015#Abstand_vor_Inhaltsverzeichnis */<br />
ul + .toc,<br />
ol + .toc {<br />
margin-top: 0.5em;<br />
}<br />
<br />
/* höheres Uploadfeld */<br />
#wpUploadDescription {<br />
height: 20em;<br />
}<br />
<br />
/* Im Projekt WP:GEO benutzt die [[Vorlage:Coordinate]] das «geo-microformat» zur semantischen<br />
Auszeichnung des Texts. Der Inhalt dieses [[Tag (Informatik)|Tags]] ist nicht für den Leser bestimmt. */<br />
.geo {<br />
display: none;<br />
}<br />
<br />
/* Patrollink ausblenden, da die Eweiterung hier nicht aktiviert ist und<br />
deren Optik zu sehr den gesichteten Versionen ähnelt. */<br />
.fr-diff-patrollink,<br />
.patrollink {<br />
display: none;<br />
}<br />
<br />
/* Rollback-Knopf auf Beobachtungsliste ausblenden, da es dort nur von sehr beschränktem Nutzen<br />
ist und zu sehr vielen Reverts aus Versehen führt */<br />
.page-Spezial_Beobachtungsliste .mw-rollback-link {<br />
display: none;<br />
}<br />
<br />
/* </source> */<br />
<br />
/* Disable Discussion-tab */<br />
<br />
#ca-talk {<br />
display: none;<br />
}<br />
<br />
<br />
/* reset code style */<br />
<br />
code {<br />
background-color: none !important;<br />
border: none !important;<br />
border-radius: 0;<br />
padding: 0;<br />
}<br />
<br />
pre {<br />
white-space: pre;<br />
}<br />
<br />
/* highlighting */<br />
<br />
.hb1 { background-color: #C1F5C1; }<br />
.hb2 { background-color: #CDC2EF; }<br />
.hb3 { background-color: #FFF6C9; }<br />
.hb4 { background-color: #FFC9C9; }<br />
.hb5 { background-color: #BED8ED; }<br />
.hb6 { background-color: #EDBBED; }<br />
.hb7 { background-color: #F4FDC7; }<br />
.hb8 { background-color: #FFE8C9; }<br />
<br />
.hf1 { color: #66D766; }<br />
.hf2 { color: #7C67C0; }<br />
.hf3 { color: #FFE879; }<br />
.hf4 { color: #FF7979; }<br />
.hf5 { color: #5D90B7; }<br />
.hf6 { color: #B857B8; }<br />
.hf7 { color: #E2F876; }<br />
.hf8 { color: #FFC679; }<br />
<br />
.he0 { border: 1px solid grey; border-radius: 4px; }<br />
.he1 { border: 1px solid #66D766; border-radius: 4px; }<br />
.he2 { border: 1px solid #7C67C0; border-radius: 4px; }<br />
.he3 { border: 1px solid #FFE879; border-radius: 4px; }<br />
.he4 { border: 1px solid #FF7979; border-radius: 4px; }<br />
.he5 { border: 1px solid #5D90B7; border-radius: 4px; }<br />
.he6 { border: 1px solid #B857B8; border-radius: 4px; }<br />
.he7 { border: 1px solid #E2F876; border-radius: 4px; }<br />
.he8 { border: 1px solid #FFC679; border-radius: 4px; }<br />
<br />
code {<br />
line-height: 1em;<br />
}</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=MediaWiki:Common.css&diff=1599MediaWiki:Common.css2021-02-01T21:38:01Z<p>Qsysopr: Rand braucht das Land ;)</p>
<hr />
<div>/* <source lang="css"> */<br />
<br />
/*-----------------------------------------------------------------------------------------------*/<br />
/* ACHTUNG! Common.css enthält die gemeinsamen Skin-Anpassungen der deutschsprachigen Wikipedia */<br />
/*---------------------------------------------------------------------------------------------*/<br />
<br />
/* Common.css ist in drei grundlegende Abschnitte gegliedert: */<br />
<br />
/* 1. Editierbare Seiteninhalte */<br />
/* 2. Sonstige Anpassungen (Spezialseiten, u.a.) */<br />
/* 3. Hauptseitenspezifisches */<br />
<br />
/* Jede Ergänzung/Änderung muss vorher jeweils für alle Skins auf Tauglichkeit getestet werden, */<br />
/* individuell per User.css! Ist hier erstmal geändert, dauert es dank Cache eine Weile, bis die */<br />
/* Änderungen bei allen Nutzern sichtbar oder, bei Fehlern, korrigiert sind. */<br />
<br />
/* +++++ 1. ANPASSUNGEN DER ANZEIGE VON EDITIERBAREN SEITENINHALTEN +++++ */<br />
<br />
/* Personennamen in Kapitälchen: class="Person" */<br />
<br />
.Person {<br />
display: inline;<br />
font-variant: small-caps;<br />
font-style: normal;<br />
}<br />
<br />
/* [[Wikipedia:Zitate|Zitate]] (siehe [[Vorlage:Zitat]]) */<br />
<br />
p.Zitat {<br />
font-style: normal;<br />
margin-bottom: 0;<br />
}<br />
p.cite {<br />
margin-top: 0;<br />
padding-left: 1em;<br />
}<br />
<br />
/* [[Wikipedia:Quellenangaben|Quellenangaben]] nicht kursiv, da sie ggf. verschiedene Bestandteile enthalten */<br />
<br />
cite {<br />
font-style: normal;<br />
}<br />
<br />
/* Stylesheet-Ergänzung zu Standard-[[Wikipedia:Navigationsleisten|Navigationsleisten]] */<br />
<br />
div.BoxenVerschmelzen,<br />
div.NavFrame {<br />
margin: 1.5em 0 0;<br />
padding: 2px;<br />
border: 1px solid #aaaaaa;<br />
text-align: center;<br />
border-collapse: collapse;<br />
font-size: 95%;<br />
clear: both;<br />
}<br />
div.BoxenVerschmelzen div.NavFrame,<br />
div.NavFrame + div.NavFrame {<br />
margin-top: 0;<br />
}<br />
div.BoxenVerschmelzen div.NavFrame {<br />
border-style: none;<br />
border-style: hidden;<br />
}<br />
div.NavFrame + div.NavFrame {<br />
border-top-style: none;<br />
border-top-style: hidden;<br />
}<br />
div.NavPic {<br />
margin: 0;<br />
padding: 2px;<br />
float: left;<br />
}<br />
div.NavFrame div.NavHead {<br />
font-weight: bold;<br />
font-size: 100%;<br />
background-color: #efefef;<br />
}<br />
div.NavFrame p,<br />
div.NavFrame div.NavContent,<br />
div.NavFrame div.NavContent p {<br />
font-size: 100%;<br />
}<br />
div.NavEnd {<br />
margin: 0;<br />
padding: 0;<br />
line-height: 1px;<br />
clear: both;<br />
}<br />
<br />
/* Stylesheet fuer den 'Ausklappen'-Button an Navileisten, der in [[MediaWiki:Common.js]] implementiert wird */<br />
.NavToggle {<br />
font-size: x-small;<br />
float: right;<br />
}<br />
<br />
/* Workaround für Internet Explorer 6 */<br />
div.NavFrame,<br />
div.NavPic,<br />
.NavToggle {<br />
position: relative;<br />
}<br />
<br />
/* Stylesheet-Ergänzung zu SideBoxen (ehedem [[Wikipedia:TownBox|TownBox]]) */<br />
<br />
div.sideBox {<br />
position: relative;<br />
float: right;<br />
background: white;<br />
margin-left: 1em;<br />
border: 1px solid gray;<br />
padding: 0.3em;<br />
width: 200px;<br />
overflow: hidden;<br />
clear: right;<br />
}<br />
div.sideBox dl {<br />
padding: 0;<br />
margin: 0 0 0.3em 0;<br />
font-size: 96%;<br />
}<br />
div.sideBox dl dt {<br />
background: none;<br />
margin: 0.4em 0 0 0;<br />
}<br />
div.sideBox dl dd {<br />
margin: 0.1em 0 0 1.1em;<br />
background-color: #f3f3f3;<br />
}<br />
<br />
/* Stylesheet-Ergänzung zu [[Wikipedia:Taxoboxen|Taxoboxen]] und [[Wikipedia:Paläoboxen|Paläoboxen]] */<br />
table.taxobox,<br />
table.palaeobox {<br />
border-collapse: collapse;<br />
border: 1px solid gray;<br />
float: right;<br />
clear: right;<br />
margin-left: 0.5em;<br />
background-color: white;<br />
}<br />
table.taxobox th {<br />
background-color: #9bcd9b;<br />
}<br />
table.palaeobox th {<br />
background-color: #e7dcc3;<br />
}<br />
table.taxobox th,<br />
table.palaeobox th {<br />
border: solid 1px gray;<br />
text-align: center;<br />
font-weight: bold;<br />
}<br />
table.taxobox td,<br />
table.palaeobox td {<br />
vertical-align: top;<br />
}<br />
table.taxobox .Person,<br />
table.palaeobox .Person {<br />
font-style: normal;<br />
}<br />
table.taxobox div.thumb,<br />
table.taxobox div.thumb * {<br />
background-color: #f9f9f9;<br />
}<br />
table.taxobox div.thumb,<br />
table.taxobox div.thumb *,<br />
table.palaeobox div.thumb,<br />
table.palaeobox div.thumb * {<br />
margin: 0 auto;<br />
padding: 0;<br />
float: none;<br />
border: none;<br />
}<br />
table.taxobox div.magnify,<br />
table.palaeobox div.magnify {<br />
display: none;<br />
}<br />
table.taxobox tr td div.thumb div div.thumbcaption {<br />
text-align: center;<br />
}<br />
table.palaeobox tr td div.thumb div div.thumbcaption {<br />
text-align: left;<br />
}<br />
table.taxobox td.Person,<br />
table.palaeobox td.Person {<br />
text-align: center;<br />
display: block;<br />
}<br />
table.taxobox td.taxo-name,<br />
table.taxobox td.taxo-bild,<br />
table.palaeobox td.taxo-name,<br />
table.palaeobox td.taxo-bild,<br />
table.palaeobox td.taxo-zeit {<br />
text-align: center;<br />
}<br />
table.palaeobox td.taxo-ort {<br />
text-align: left;<br />
}<br />
<br />
/* aus Vorlage zur Entlastung, skinabhängigen Darstellung und Kombinierbarkeit hierher ausgelagert */<br />
.wikitable,<br />
.prettytable {<br />
margin: 1em 1em 1em 0;<br />
background: #f9f9f9;<br />
border: 1px #aaa solid;<br />
border-collapse: collapse;<br />
}<br />
.prettytable th,<br />
.prettytable td {<br />
border: 1px #aaa solid;<br />
padding: 0.2em;<br />
}<br />
.prettytable th {<br />
text-align: center;<br />
}<br />
.prettytable caption {<br />
font-weight: bold;<br />
}<br />
<br />
/* Zebra-Tabellen */<br />
table.wikitable.zebra tr:nth-child(even) {<br />
background: white;<br />
}<br />
<br />
.nogrid th,<br />
.nogrid td {<br />
border: none;<br />
}<br />
div.float-left,<br />
table.float-left,<br />
.float-left {<br />
float: left;<br />
clear: left;<br />
}<br />
div.float-right,<br />
table.float-right,<br />
.float-right {<br />
float: right;<br />
clear: right;<br />
margin: 1em 0 1em 1em;<br />
}<br />
div.centered,<br />
table.centered,<br />
.centered {<br />
margin-left: auto;<br />
margin-right: auto;<br />
}<br />
.toptextcells td {<br />
vertical-align: top;<br />
}<br />
<br />
/* Bitte KEINE weiteren Definitionen dieser Art für Boxen hier, das gehört in entsprechende Vorlagen! */<br />
/* Hier 20 Mal Trivialitäten wie "text-align:center" zu definieren verlangsamt alles und ist nicht */<br />
/* Sinn der Sache. (Und wer nicht weiß warum, hat's nicht verstanden.) */<br />
<br />
/* Do not expand [[Wikipedia:WikiProjekt Georeferenzierung|kvaleberg.com-URLs]] for printing */<br />
<br />
#content span.coordinates a.external.text:after,<br />
#content span.coordinates a.external.autonumber:after,<br />
#content div.coordinates a.external.text:after,<br />
#content div.coordinates a.external.autonumber:after {<br />
content: "";<br />
}<br />
<br />
/* Do not expand URLs for printing */<br />
<br />
#content span.plainlinks-print a.external.text:after,<br />
#content span.plainlinks-print a.external.autonumber:after,<br />
#content div.plainlinks-print a.external.text:after,<br />
#content div.plainlinks-print a.external.autonumber:after {<br />
content: "";<br />
}<br />
<br />
/* Metadaten (bspw. [[Wikipedia:Personendaten|Personendaten]]) */<br />
<br />
table.metadata {<br />
border: 1px solid #aaaaaa;<br />
display: none;<br />
}<br />
.metadata-label {<br />
color: #aaaaaa;<br />
}<br />
span.metadata,<br />
span.metadata-inline {<br />
display: none;<br />
}<br />
<br />
/*<br />
* Farbdefinitionen für Rahmen und Hintergründe von [[Wikipedia:Textbausteine|Textbausteinen]].<br />
* Hier: Standardvorgaben für "dunkle Schrift auf hellem Grund".<br />
* Für Hell-auf-dunkel-Skins ([[MediaWiki:Amethyst.css|Amethyst]]) müssen dort entsprechende Definitionen<br />
* zusätzlich eingetragen werden! Anpassungen für andere Skins sind optional.<br />
* (Die Angaben der Rahmenstärke dienen der Bequemlichkeit, so dass man<br />
* für dünne Rahmen nur noch "border-style" angeben muss.)<br />
*/<br />
<br />
.rahmenfarbe1 { /* Wie Inhaltsverzeichnis */<br />
border-color: #aaaaaa;<br />
border-width: 1px;<br />
}<br />
.rahmenfarbe2 { /* Unauffällig, geringer Kontrast */<br />
border-color: #e9e9e9;<br />
border-width: 1px;<br />
}<br />
.rahmenfarbe3 { /* "Rot", auffällig */<br />
border-color: #c00000;<br />
border-width: 1px;<br />
}<br />
.rahmenfarbe4 { /* Neutrale Farbe, deutlich */<br />
border-color: #8888aa;<br />
border-width: 1px;<br />
}<br />
.rahmenfarbe5 { /* "Schwarz", hoher Kontrast */<br />
border-color: #000000;<br />
border-width: 1px;<br />
}<br />
<br />
tr.hintergrundfarbe1 th,<br />
tr th.hintergrundfarbe1,<br />
table.hintergrundfarbe1,<br />
.hintergrundfarbe1 { /* Wie Inhaltsverzeichnis */<br />
background-color: #f9f9f9;<br />
}<br />
tr.hintergrundfarbe2 th,<br />
tr th.hintergrundfarbe2,<br />
table.hintergrundfarbe2,<br />
.hintergrundfarbe2 { /* "Weiß", für Nicht-Artikel-Seiten, neutral */<br />
background-color: #ffffff;<br />
}<br />
tr.hintergrundfarbe3 th,<br />
tr th.hintergrundfarbe3,<br />
table.hintergrundfarbe3,<br />
.hintergrundfarbe3 { /* "Gelb", auffällig */<br />
background-color: #ffff40;<br />
}<br />
tr.hintergrundfarbe4 th,<br />
tr th.hintergrundfarbe4,<br />
table.hintergrundfarbe4,<br />
.hintergrundfarbe4 { /* Sehr auffällig */<br />
background-color: #ffaa00;<br />
}<br />
tr.hintergrundfarbe5 th,<br />
tr th.hintergrundfarbe5,<br />
table.hintergrundfarbe5,<br />
.hintergrundfarbe5 { /* Neutral, abgesetzt */<br />
background-color: #e0e0e0;<br />
}<br />
tr.hintergrundfarbe6 th,<br />
tr th.hintergrundfarbe6,<br />
table.hintergrundfarbe6,<br />
.hintergrundfarbe6 { /* Allgemein „bunt“, für Hervorhebungen und Unterscheidungen */<br />
background-color: #b3b7ff;<br />
}<br />
tr.hintergrundfarbe7 th,<br />
tr th.hintergrundfarbe7,<br />
table.hintergrundfarbe7,<br />
.hintergrundfarbe7 { /* Allgemein „bunt“, für Hervorhebungen und Unterscheidungen */<br />
background-color: #ffcbcb;<br />
}<br />
tr.hintergrundfarbe8 th,<br />
tr th.hintergrundfarbe8,<br />
table.hintergrundfarbe8,<br />
.hintergrundfarbe8 { /* Allgemein „bunt“, für Hervorhebungen und Unterscheidungen */<br />
background-color: #ffebad;<br />
}<br />
tr.hintergrundfarbe9 th,<br />
tr th.hintergrundfarbe9,<br />
table.hintergrundfarbe9,<br />
.hintergrundfarbe9 { /* Allgemein „bunt“, für Hervorhebungen und Unterscheidungen */<br />
background-color: #b9ffc5;<br />
}<br />
<br />
/* Keine Vergrößerung der Zeilenhöhe durch hochgestellte Zahlen der Fußnoten */<br />
<br />
sup.reference {<br />
font-weight: 400;<br />
font-style: normal;<br />
}<br />
sup,<br />
sub {<br />
line-height: 1em;<br />
}<br />
<br />
/* Hervorhebung der angeklickten Fußnoten und der Rückverweise in blau */<br />
<br />
ol.references > li:target,<br />
sup.reference:target {<br />
background-color: #def;<br />
}<br />
<br />
/* Hochgestellte Buchstaben in der Einzelnachweiseliste kursiv setzen */<br />
<br />
ol.references li a[href|="#cite_ref"] {<br />
font-style: italic;<br />
}<br />
<br />
/* Inline-Verwendung der [[:Kategorie:Vorlage:Schwesterprojektverweis|Schwesterprojektverweise]] */<br />
<br />
ol.references li div.sisterproject {<br />
display: inline !important;<br />
}<br />
<br />
/* Für <nowiki><hiero>…</hiero></nowiki> */<br />
<br />
.mw-hierotable,<br />
.mw-hierotable th,<br />
.mw-hierotable td {<br />
border: 0;<br />
padding: 0;<br />
}<br />
<br />
/* Für [[MediaWiki:Anoneditwarning]] und weitere Hinweise, die alle untereinander stehen */<br />
<br />
#mw-anon-edit-warning,<br />
#mw-missingsummary,<br />
#wp_talkpagetext {<br />
width: 80%;<br />
background: #d3e1f2;<br />
border: 1px solid #1a47ff;<br />
margin: 1em auto;<br />
padding: 1em;<br />
}<br />
<br />
/* Bei URLs, die auf unser Projekt und verwandte Projekte verweisen, den Pfeil ausblenden<br />
* Dieser Pfeil dient nur dazu, auf externe Ziele hinzuweisen<br />
* Auf den Einsatz der Klasse "plainlinks" kann dadurch verzichtet werden<br />
*/<br />
#content a[href^="http://de.wikipedia.org"],<br />
#content a[href^="http://toolserver.org"] {<br />
background: none !important;<br />
padding-right: 0 !important;<br />
}<br />
#content .mw-search-formheader div.search-types ul li a[href^="http://de.wikipedia.org"],<br />
#content .mw-search-formheader div.search-types ul li a[href^="http://toolserver.org"] {<br />
padding-right: 0.5em !important; <br />
}<br />
<br />
/* Falls bei der Seitenbearbeitung vergessen wurde, die Zusammenfassung auszufüllen */<br />
.mw-summarymissed {<br />
border: 5px solid red;<br />
padding: 2px;<br />
}<br />
<br />
/* Copyrightwarnung */<br />
<br />
#editpage-copywarn {<br />
border: solid 1px #c00000;<br />
font-size: 90%;<br />
background-color: #ffffff;<br />
}<br />
<br />
.mw-tos-summary {<br />
border: solid 1px #c00000;<br />
background-color: #ffffff;<br />
padding-left: 1em;<br />
}<br />
<br />
/* +++++ 2. SONSTIGE ANPASSUNGEN (Spezialseiten u. a.) +++++ */<br />
<br />
/* Markierung von Redirects in [[Special:Allpages]], [[Special:Watchlist]], Kategorien */<br />
<br />
.allpagesredirect,<br />
.watchlistredir,<br />
.redirect-in-category {<br />
font-style: italic;<br />
}<br />
<br />
/* Fettformatierung von Admin-Spezialseiten in [[Special:Specialpages]] abschalten */<br />
.mw-specialpagerestricted strong {<br />
font-weight: normal;<br />
}<br />
/* Legende auf [[Special:Specialpages]] ebenfalls abschalten */<br />
div.mw-specialpages-notes {<br />
display: none;<br />
}<br />
<br />
/* Größerer Abstand zwischen TOC-Nummerierung und TOC-Eintrag */<br />
span.tocnumber {<br />
margin-right: 0.3em;<br />
}<br />
<br />
/* Skinabhängige absolute Positionierungen ausblenden */<br />
/* Bitte [[MediaWiki Diskussion:Common.css#Absolute_Positionierungen]] beachten */<br />
<br />
#coordinates,<br />
#coordinates_3_ObenRechts,<br />
#issnlink,<br />
#editcount,<br />
#shortcut,<br />
#artikelstadium,<br />
.topicon,<br />
#spoken-icon,<br />
#commons-icon {<br />
display: none;<br />
}<br />
<br />
/* Anpassungen für [[:Template:Link_FA]] */<br />
<br />
/* hide the template */<br />
#bodyContent span.FA {<br />
display: none;<br />
}<br />
<br />
/* change the bullets for links to special articles */<br />
#p-lang li.FA {<br />
/* hier immer auch linkFA_bullet in Common.js mit anpassen für die älteren skins! */<br />
list-style-image: url("http://upload.wikimedia.org/wikipedia/commons/d/d0/Monobook-bullet-star-transparent.png");<br />
}<br />
<br />
/* change the bullets for links to special articles */<br />
#p-lang li.GA {<br />
/* hier immer auch linkGA_bullet in Common.js mit anpassen für die älteren skins! */<br />
list-style-image: url("http://upload.wikimedia.org/wikipedia/commons/a/a1/Monobook-bullet-star-gray.png");<br />
}<br />
<br />
/* Verhindere, dass Infoboxen etc. in den Inhalt von Kategorien hineinragen.<br />
Das betrifft nur Kategorieseiten. */<br />
#mw-subcategories,<br />
#mw-pages {<br />
clear: both;<br />
}<br />
<br />
/* DIVs in ImageMaps inlinen (Vorschlag von Revolus) */<br />
.imagemap-inline div {<br />
display: inline;<br />
}<br />
<br />
/* [[Special:Hochladen]]: Warnmeldung auf bestehende Dateien, unerwünschte Prefixe usw. deutlicher hervorheben. */<br />
<br />
#wpDestFile-warning ul {<br />
border: solid red 1px;<br />
padding: 1.5em;<br />
}<br />
<br />
/* Warnmeldung für gesperrte Titel */<br />
.mw-titleprotectedwarning {<br />
background-color: #eee;<br />
border: 2px solid red;<br />
padding: 1em;<br />
}<br />
<br />
/* Warnmeldung bei der Bearbeitung von Seiten im MediaWiki-Namensraum */<br />
.mw-editinginterface {<br />
background-color: #f9f9f9;<br />
border-color: #c00000;<br />
border-width: 1px;<br />
border-style: solid;<br />
padding: 2px;<br />
}<br />
<br />
/* Überschrift 5. und 6. Ordnung proportionaler zu Fließtext */<br />
#content h5 {<br />
font-size: 108%; /* Original: 116% */<br />
}<br />
#content h6 {<br />
font-size: 100%; /* Original: 80% = kleiner als Bodytext, unschön */<br />
}<br />
#content h6 .editsection {<br />
font-size: 120%;<br />
font-weight: normal;<br />
}<br />
<br />
/* Anleitung auf Special:Search */<br />
.mw-searchresult {<br />
font-size: 84%;<br />
margin: 5px;<br />
}<br />
<br />
/* Gestaltung der Edittools-Leiste */<br />
#specialchars {<br />
margin-top: 3px;<br />
border: solid 1px #aaaaaa;<br />
padding: 1px;<br />
text-align: left;<br />
background-color: white;<br />
}<br />
<br />
/* Legende für Versionsgeschichte */<br />
.mw-history-legend {<br />
font-size: 90%;<br />
margin-top: 2px;<br />
margin-bottom: 2px;<br />
border: solid 1px #e9e9e9;<br />
padding: 0 5px 5px 5px;<br />
background-color: #f9f9f9;<br />
clear: both;<br />
}<br />
<br />
/* +++++ 3. NEUE [[Wikipedia:Hauptseite|HAUPTSEITE]] (ab 2006) +++++ */<br />
<br />
/* Kategorie verbergen */<br />
/* Überschrift verbergen */<br />
/* Redirhinweis verbergen - ACHTUNG: Je nach Skin muss jetzt der Abstand zum oberen Rand korrigiert werden */<br />
body.page-Wikipedia_Hauptseite #catlinks,<br />
body.page-Wikipedia_Hauptseite h1.firstHeading,<br />
body.page-Wikipedia_Hauptseite #contentSub {<br />
display: none;<br />
}<br />
<br />
#hauptseite h2 {<br />
background-color: #d8e8ff;<br />
border: 1px solid #8898bf;<br />
font-size: 1em;<br />
font-weight: bold;<br />
margin-top: 0;<br />
margin-bottom: 0;<br />
padding-top: 0.1em;<br />
padding-bottom: 0.1em;<br />
}<br />
#hauptseite .inhalt {<br />
background-color: #ffffff;<br />
border: 1px solid #8898bf;<br />
border-top: 0 solid white;<br />
padding: 0.3em 0.8em 0.4em 0.8em;<br />
}<br />
#hauptseite .inhalt hr {<br />
background-color: #8898bf;<br />
color: #8898bf;<br />
height: 1px;<br />
margin: 0.5em 0;<br />
padding: 0;<br />
}<br />
#hauptseite .inhalt .mehr {<br />
clear: both;<br />
font-size: 95%;<br />
margin-top: 0.8em;<br />
text-align: right;<br />
}<br />
#hauptseite table {<br />
background-color: transparent;<br />
}<br />
.hauptseite-oben,<br />
.hauptseite-links,<br />
.hauptseite-rechts {<br />
margin-bottom: 1em;<br />
}<br />
.hauptseite-links {<br />
margin-right: 0.5em;<br />
}<br />
.hauptseite-rechts {<br />
margin-left: 0.5em;<br />
}<br />
.hauptseite-oben h2,<br />
.hauptseite-unten h2 {<br />
text-align: center;<br />
}<br />
.hauptseite-oben .inhalt .portale {<br />
font-weight: bold;<br />
margin-top: 0.2em;<br />
margin-bottom: 0.2em;<br />
}<br />
.hauptseite-oben .inhalt .intern {<br />
font-size: 90%;<br />
text-align: center;<br />
}<br />
.hauptseite-links h2,<br />
.hauptseite-rechts h2 {<br />
text-indent: 0.8em;<br />
}<br />
#hauptseite-schwesterprojekte .inhalt a {<br />
font-weight: bold;<br />
}<br />
<br />
/* IPA links nicht unterstreichen */<br />
.IPA a:link,<br />
.IPA a:visited {<br />
text-decoration: none;<br />
}<br />
<br />
/* CSS-Klassen für Schriftarten als Workaround für Defizite in alten IE-Versionen.<br />
* Achtung: IE6 mag keine Zeilenumbrüche zwischen den Fonts.<br />
* In IE8 nicht mehr nötig, soll mit den alten Versionen aussterben. Browserweiche:<br />
* http://www.dynamicsitesolutions.com/css/filters/star-html/<br />
* http://www.dynamicsitesolutions.com/css/filters/first-child-plus-html/<br />
*/<br />
* html .Unicode {<br />
font-family: Code2000, Sun-ExtA, "Arial Unicode MS", NSimSun, sans-serif;<br />
}<br />
*:first-child+html .Unicode {<br />
font-family: Code2000, Sun-ExtA, "Arial Unicode MS", NSimSun, sans-serif;<br />
}<br />
* html .Unicode1 {<br />
font-family: Code2001, Quivira, "MPH 2B Damase", sans-serif;<br />
}<br />
*:first-child+html .Unicode1 {<br />
font-family: Code2001, Quivira, "MPH 2B Damase", sans-serif;<br />
}<br />
* html .Unicode2 {<br />
font-family: Sun-ExtB, Code2002, sans-serif;<br />
}<br />
*:first-child+html .Unicode2 {<br />
font-family: Sun-ExtB, Code2002, sans-serif;<br />
}<br />
* html .IPA {<br />
font-family: Quivira, Code2000, Sun-ExtA, "DejaVu Sans", Gentium, Helvetica, "Arial Unicode MS", "Lucida Sans Unicode", sans-serif;<br />
}<br />
*:first-child+html .IPA {<br />
font-family: Quivira, Code2000, Sun-ExtA, "DejaVu Sans", Gentium, Helvetica, "Arial Unicode MS", "Lucida Sans Unicode", sans-serif;<br />
}<br />
* html .IAST {<br />
font-family: Code2000, SunExtA, "Arial Unicode MS", sans-serif;<br />
}<br />
*:first-child+html .IAST {<br />
font-family: Code2000, SunExtA, "Arial Unicode MS", sans-serif;<br />
}<br />
* html .altitalisch {<br />
font-family: Quivira, Code2001, "MPH 2B Damase", sans-serif;<br />
}<br />
*:first-child+html .altitalisch {<br />
font-family: Quivira, Code2001, "MPH 2B Damase", sans-serif;<br />
}<br />
* html .gotisch {<br />
font-family: Quivira, Code2001, "MPH 2B Damase", sans-serif;<br />
}<br />
*:first-child+html .gotisch {<br />
font-family: Quivira, Code2001, "MPH 2B Damase", sans-serif;<br />
}<br />
* html .hebrew {<br />
font-family: Quivira, Sun-ExtA, "Arial Unicode MS", "SBL Hebrew", Code2000, "MPH 2B Damase", sans-serif;<br />
}<br />
*:first-child+html .hebrew {<br />
font-family: Quivira, Sun-ExtA, "Arial Unicode MS", "SBL Hebrew", Code2000, "MPH 2B Damase", sans-serif;<br />
}<br />
* html .spanAr {<br />
font-family: "Arial Unicode MS", Scheherazade, Code2000, "DejaVu Sans", sans-serif;<br />
}<br />
*:first-child+html .spanAr {<br />
font-family: "Arial Unicode MS", Scheherazade, Code2000, "DejaVu Sans", sans-serif;<br />
}<br />
* html .music-symbol {<br />
font-family: "Musical Symbols", Euterpe, Code2001, sans-serif;<br />
}<br />
*:first-child+html .music-symbol {<br />
font-family: "Musical Symbols", Euterpe, Code2001, sans-serif;<br />
}<br />
* html .polytonic {<br />
font-family: "Arial Unicode MS", "Palatino Linotype", Code2000, "New Athena Unicode", Gentium, "Athena Unicode";<br />
}<br />
*:first-child+html .polytonic {<br />
font-family: "Arial Unicode MS", "Palatino Linotype", Code2000, "New Athena Unicode", Gentium, "Athena Unicode";<br />
}<br />
<br />
/* Standardmäßige Ausblendung der Flagged-Revisions-Backlog-Sitenotice */<br />
#mw-oldreviewed-notice {<br />
display: none;<br />
}<br />
<br />
/* Standardmäßige Ausblendung der Flagged-Revisions-Kommentarbox */<br />
#mw-commentbox {<br />
display: none;<br />
}<br />
<br />
/* Abstand zwischen Liste und Inhaltsverzeichnis erhöhen, siehe http://de.wikipedia.org/w/index.php?title=MediaWiki_Diskussion:Common.css&oldid=51639015#Abstand_vor_Inhaltsverzeichnis */<br />
ul + .toc,<br />
ol + .toc {<br />
margin-top: 0.5em;<br />
}<br />
<br />
/* höheres Uploadfeld */<br />
#wpUploadDescription {<br />
height: 20em;<br />
}<br />
<br />
/* Im Projekt WP:GEO benutzt die [[Vorlage:Coordinate]] das «geo-microformat» zur semantischen<br />
Auszeichnung des Texts. Der Inhalt dieses [[Tag (Informatik)|Tags]] ist nicht für den Leser bestimmt. */<br />
.geo {<br />
display: none;<br />
}<br />
<br />
/* Patrollink ausblenden, da die Eweiterung hier nicht aktiviert ist und<br />
deren Optik zu sehr den gesichteten Versionen ähnelt. */<br />
.fr-diff-patrollink,<br />
.patrollink {<br />
display: none;<br />
}<br />
<br />
/* Rollback-Knopf auf Beobachtungsliste ausblenden, da es dort nur von sehr beschränktem Nutzen<br />
ist und zu sehr vielen Reverts aus Versehen führt */<br />
.page-Spezial_Beobachtungsliste .mw-rollback-link {<br />
display: none;<br />
}<br />
<br />
/* </source> */<br />
<br />
/* Disable Discussion-tab */<br />
<br />
#ca-talk {<br />
display: none;<br />
}<br />
<br />
<br />
/* reset code style */<br />
<br />
code {<br />
background-color: none !important;<br />
border: none !important;<br />
border-radius: 0;<br />
padding: 0;<br />
}<br />
<br />
pre {<br />
white-space: pre;<br />
}<br />
<br />
/* highlighting */<br />
<br />
.hb1 { background-color: #C1F5C1; }<br />
.hb2 { background-color: #CDC2EF; }<br />
.hb3 { background-color: #FFF6C9; }<br />
.hb4 { background-color: #FFC9C9; }<br />
.hb5 { background-color: #BED8ED; }<br />
.hb6 { background-color: #EDBBED; }<br />
.hb7 { background-color: #F4FDC7; }<br />
.hb8 { background-color: #FFE8C9; }<br />
<br />
.hf1 { color: #66D766; }<br />
.hf2 { color: #7C67C0; }<br />
.hf3 { color: #FFE879; }<br />
.hf4 { color: #FF7979; }<br />
.hf5 { color: #5D90B7; }<br />
.hf6 { color: #B857B8; }<br />
.hf7 { color: #E2F876; }<br />
.hf8 { color: #FFC679; }<br />
<br />
.he0 { border: 1px solid grey; border-radius: 4px; }<br />
.he1 { border: 1px solid #66D766; border-radius: 4px; }<br />
.he2 { border: 1px solid #7C67C0; border-radius: 4px; }<br />
.he3 { border: 1px solid #FFE879; border-radius: 4px; }<br />
.he4 { border: 1px solid #FF7979; border-radius: 4px; }<br />
.he5 { border: 1px solid #5D90B7; border-radius: 4px; }<br />
.he6 { border: 1px solid #B857B8; border-radius: 4px; }<br />
.he7 { border: 1px solid #E2F876; border-radius: 4px; }<br />
.he8 { border: 1px solid #FFC679; border-radius: 4px; }</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=Datei:Cmu200_vreg3.png&diff=1487Datei:Cmu200 vreg3.png2020-04-04T18:34:50Z<p>Qsysopr: </p>
<hr />
<div></div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=Datei:Cmu200_vreg2.png&diff=1486Datei:Cmu200 vreg2.png2020-04-04T18:34:36Z<p>Qsysopr: </p>
<hr />
<div></div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=USB-Fu%C3%9Ftaster&diff=1431USB-Fußtaster2020-03-01T17:45:05Z<p>Qsysopr: Tippfehler korrigiert</p>
<hr />
<div>[[Datei:Footswitch.jpg|thumb|Fertig aufgebauter Fußtaster]]<br />
"Schau Mama, freihändig!"<br />
<br />
Wer kennt das nicht? Man muss auf mehreren Leiterkarten verschiedene Spannungen messen.<br />
<br />
Üblicherweise läuft es dann wie folgt ab:<br />
<br />
# Messspitzen platzieren<br />
# Wert vom Messgerät ablesen<br />
# Messspitzen ablegen und zum PC umdrehen<br />
# Messwert eintippen<br />
# Zurückdrehen, Messspitzen wieder in die Hände nehmen<br />
# Nochmal nachschauen, welcher Messpunkt jetzt dran ist<br />
# Wiederholen<br />
<br />
Ab und zu mischt sich dann das erneute Messen ein, weil ein Wert unplausibel ist und man entweder einen Zahlendreher drin oder schneller getippt als gedacht hat.<br />
<br />
Unterm Strich ist es auf jeden Fall sehr zeitraubend und nervig.<br />
<br />
Gleichzeitig baumeln die Füße unbeteiligt am Stuhl herunter.<br />
<br />
Die meisten Messgeräte (und anderes Laborequipment) lassen sich über den PC kontrollieren, warum also nicht gleich die richtigen Werte z. B. nach Excel transferieren? Nur irgendwie muss man den Prozess anstoßen...<br />
<br />
=Die schnelle Lösung=<br />
<br />
Tastatur ist blöd, also muss eine andere Eingabemöglichkeit her. Ein Taster und eine Projektbox ist schnell gefunden, Loch in die Box und ein paar große Schrauben dazu (damit sie nicht gleich abhaut) und fertig ist der improvisierte Fußtaster. Nur wie kommt die Info in den PC?<br />
<br />
Die serielle Schnittstelle hat neben Rx und Tx oft auch Steuerleitungen – aus den alten Tagen, in denen Modems noch so richtig langsam waren. Diese lassen sich in so ziemlich jeder Programmiersprache kontrollieren und abfragen. Ein FT232 liegt auch noch herum, also Taster angelötet und los geht’s!<br />
<br />
Das Programm ist in Python geschrieben, pollt die CTS-Leitung und sobald diese low wird, wird per pyVisa den Multimeter der aktuelle Messwert entlockt, passend formatiert und mit dem Keyboard-Modul "ausgetippt". Damit die Augen am Mikroskop bleiben können, wird zudem ein kurzer Piepton ausgegeben.<br />
<br />
Sehr viel Spaß für wenig Geld.<br />
<br />
Leider muss man bei jeder Benutzung schauen, welcher COM-Port dem Adapter zugeordnet wurde und ob dieser auch wirklich im Script steht.<br />
<br />
=Die schöne Lösung=<br />
<br />
Eines Tages brachte mein Kollege einen kleinen Pappkarton vom [https://www.pollin.de Ramschmax] mit, Inhalt: [https://www.pollin.de/p/fusstaster-pfs-135a-10-a-250-v-420705 420705]. Ein Gusseiserner Fußtaster mit schönem Klick-Klack-Mikroschalter.<br />
<br />
Der hat etwas Besseres als den schnöden UART-Adapter mit Zwillingslitze verdient – endlich wieder eine schöne Anwendung für [https://www.obdev.at/vusb/ V-USB]!<br />
<br />
Was soll das Teil können? Am besten natürlich so viel wie möglich, damit es vielleicht sogar als "Adaptive Controller" dienen kann. Deshalb habe ich mich dafür entschieden, einen Multidevice-Ansatz zu fahren. Das umfasst aktuell:<br />
<br />
* Generisches USB-HID<br />
* Einzeltasten-Tastatur<br />
* Makro-Tastatur<br />
* Joystick<br />
<br />
=Hardware=<br />
<br />
Die Hardware könnte nicht einfacher sein - sie entspricht größtenteils dem [https://www.obdev.at/products/vusb/easylogger.html Easylogger]-Beispielprojekt, nur dass anstelle der automatischen Oszillator-Kalibrierung ein externer Quarz verwendet wird. Hintergrund hierfür ist, dass das [[SNES-Joypad]], das sich selbst kalibriert (oder zumindest sollte), am RetroPie beim Booten oft nicht erkannt wird. Kann aber auch gut sein, dass es sich um einen Bug in meiner Firmware handelt.<br />
<br />
Die Bauteile sind - abgesehen vom Quarz und Mikrocontroller in SMD-Bauform. Als MCU werkelt fürs Erste ein ATtiny85, der später noch herunterskaliert werden kann. Die Wahl auf das DIP-Gehäuse fiel, um ohne Löten die Firmware herunterzuladen.<br />
<br />
Mit Quarz als Taktquelle bleibt noch ein "richtiger" IO übrig (sofern man den Reset-Pin nicht deaktiviert) - mehr braucht man nicht.<br />
<br />
Eine eigens designte Leiterkarte ist aufgrund der Einfachheit der Schaltung völlig unnötig, aber es war noch Platz auf dem Panel...<br />
<br />
<gallery><br />
footswitch 1.0 sch.png|Schaltplan<br />
footswitch 1.0 top.png|Bestückungsplan Oberseite<br />
footswitch 1.0 bot.png|Bestückungsplan Unterseite<br />
footswitch 1.0 assy.jpg|Aufgebaute Leiterkarte<br />
</gallery><br />
<br />
{| class="wikitable"<br />
! Menge || Referenz || Wert || Package || Reichelt Bestellcode<br />
|-<br />
| 1 || SV3 || || MA03-1 ||<br />
|-<br />
| 1 || SV1 || || MA04-1 || GC 2212-EU030<br />
|-<br />
| 1 || C1 || 100n || C0603 || X7R-G0603 100N<br />
|-<br />
| 1 || C4 || 10u || C0805 || KEM X7R0805 10U<br />
|-<br />
| 1 || Q1 || 12M || HC49U-V || 12,0000-HC49U-S<br />
|-<br />
| 1 || R11 || 150 || R0603 || RND 0603 1 150<br />
|-<br />
| 1 || C5 || 150n || C0603 || X7R 0603FCE 150N<br />
|-<br />
| 2 || C2, C3 || 22p || C0603 || RND 150MT18N2202<br />
|-<br />
| 1 || R3 || 2k2 || R0603 || RND 0603 1 2,2K<br />
|-<br />
| 1 || R10 || 4k7 || R0603 || RND 0603 1 4,7k<br />
|-<br />
| 2 || R1, R2 || 68 || R0603 || RND 0603 1 68<br />
|-<br />
| 1 || IC1 || ATTINY 85-20 PU || DIL08 || ATTINY 85-20 PU<br />
|-<br />
| 2 || D1, D2 || BZX84C3V6 || SOT23 || SMD ZD 3,6<br />
|}<br />
<br />
Leider stellte sich erst zu spät heraus, dass die Leiterkarte ein bisschen zu groß ist, um sie an der eigentlich vorgesehenen Stelle zu montieren. Man kann sie zwar ein bisschen schräg anschrauben und von der Ecke noch etwas Material wegnehmen, aber dann ist die USB-Leitung auch wieder im Weg. Das Design ist also nicht so richtig geglückt...<br />
<br />
Aber kein Problem, dass man nicht mit ein bisschen Schrumpfschlauch lösen könnte:<br />
<br />
<gallery><br />
footswitch 1.0 designflaw 1.jpg|Dort sollte die Leiterkarte hin<br />
footswitch 1.0 designflaw 2.jpg|...und hier ist sie<br />
footswitch 1.0 designflaw 3.jpg|weitere Perspektive<br />
</gallery><br />
<br />
Der Schirm ist übrigens auf ein Stück Leitung gecrimpt, das wiederum an die Halterung des Tasters gelötet ist.<br />
<br />
=Firmware=<br />
==Firmware==<br />
{{Infobox AVR<br />
| Typ = ATtiny85<br />
| Takt = 12<br />
| FuseH = D7<br />
| FuseL = DE<br />
| FuseE = FF<br />
}}<br />
Die Firmware ist mehr oder weniger viergeteilt, entsprechend den verschiedenen Modi.<br />
<br />
Hierfür gibt es mehrere Gründe:<br />
<br />
* die freien VID/PID-Paare sind auf die verschiedenen Funktionen beschränkt und es lässt sich nicht zweifelsfrei sagen, ob Multi-Endpoint-Konfigurationen erlaubt sind<br />
* Die Fragmentierung macht den Code (teilweise) einfacher und übersichtlicher<br />
* Keinerlei Treiberprobleme (es gibt wohl Betriebssysteme, die sich an Multi-Endpoint verschlucken)<br />
* Es ist nicht ganz so üblich und in der Implementierung interessanter<br />
<br />
Nach dem Reset liest die Firmware den zu verwendenden Modus aus dem EEPROM. Ist diese ungültig oder der IO des Tasters auf Masse gezogen, wird der auf Generisches HID gesetzt. Gegenüber des USB-Treibers wird nun auch der Pointer für die USB-Deskriptoren gesetzt (die sich wiederum im Flash befinden).<br />
<br />
Anschließend läuft die Initialisierung der unterschiedlichen Modi und es wird in die entsprechende Endlosschleife gesprungen.<br />
<br />
Als USB VID/PID-Paare werden von obdev frei zur Verfügung gestellten verwendet:<br />
<br />
* HID: 0x16C0/0x27D9<br />
* Tastatur: 0x16C0/0x27DB<br />
* Gamepad: 0x16C0/0x27DC<br />
<br />
Im Grunde ist das alles kein Hexenwerk, allerdings haben die "Dynamisierung" der USB-Deskriptoren einiges an (auf dem Attiny schwierige) Fehlersuche gekostet. Über Manche Dinge, wie z. B. wie man die verschiedenen Deskriptoren den Anfragen zuordnet, ist die Dokumentation leider etwas vage (oder ich habe sie nicht richtig gelesen/falsch gesucht).<br />
<br />
Auch lässt sich die Firmware noch ziemlich optimieren, das gesteckte Ziel wäre, dass sie auf den ATtiny45 passt. Aktuell ist hauptsächlich die RAM-Belegung ein Problem (und noch nicht optimal).<br />
<br />
=Konfiguration=<br />
Um die Konfiguration des Fußtasters ändern zu können, muss er sich in Modus 2 (Generisches HID) befinden. Sollte dieser Modus nicht aktiv sein, kann er erreicht werden indem der Taster gedrückt wird, während der USB-Stecker verbunden wird.<br />
<br />
In den Report-Beispielen werden stets hexadezimale Zahlen verwendet. Angaben mit <code>xx</code> sind beliebig bzw. müssen ignoriert werden.<br />
<br />
==Keycodes==<br />
Bevor auf die verschiedenen Funktionen im Detail eingegangen wird, ein paar Worte zu den Keycodes:<br />
<br />
Tastaturen sind seit jeher ziemlich einfach gestrickt. So "weiß" der Controller der Tastatur zwar an welcher Position eine Taste gedrückt wird, aber nicht welches Layout sie vertritt - dies wird erst durch das Betriebssystem umgesetzt. Das hat zum Beispiel den Effekt, dass mit einer deutschen Tastatur an einem auf Englisch eingestellten PC u. a. Y und Z vertauscht sind (und man beim Raspberrz Pi das Passwort mindestens einmal falsch eingibt).<br />
<br />
Diese Eigenschaft betrifft natürlich auch den Fußtaster.<br />
<br />
Die Keycodes für englische Tastaturen können in der Spezifikation [https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf#page=53 "Universal Serial Bus HID Usage Tables"] in der aktuellen Version ab Seite 53 (Kapitel 10 Keyboard/Keypad Page (0x07)]) nachgeschlagen werden.<br />
<br />
Für das deutsche Layout befindet sich eine Tabelle im Download-Bereich (keine Garantie auf Vollständigkeit und Korrektheit).<br />
<br />
==Modus 0: Generisches HID==<br />
Die Kommunikation findet über Report ID 0 mit 8 Datenbytes statt.<br />
Beim Senden von Reports definiert das erste Byte den Befehl, in den weiteren befinden sich die Parameter dessen:<br />
<br />
{| class="wikitable"<br />
! Nummer || Befehl || Beschreibung<br />
|-<br />
| 0 || NOP || Keine Operation, dieser Code wird bei den Antworten für den Status des Tasters verwendet<br />
|-<br />
| 1 || Restart || Neustart des Mikrocontrollers (ersetzt das Aus- und Einstecken nachdem der Modus umgestellt wurde)<br />
|-<br />
| 2 || Lesen Modus || Gibt den Interface-Modus zurück<br />
|-<br />
| 3 || Setzen Modus || Setzt den Interface-Modus<br />
|-<br />
| 4 || Lesen Einzeltaste || Gibt den Keycode der Einzeltasten-Tastatur zurück<br />
|-<br />
| 5 || Setzen Einzeltaste || Setzt den Keycode der Einzeltasten-Tastatur<br />
|-<br />
| 6 || Lesen Tastensequenz || Gibt 6 Byte der Sequenz des angegebenen Blocks (in Byte 1) zurück<br />
|-<br />
| 7 || Setzen Tastensequenz || Setzt die 6 Bytes der Sequenz des angegebenen Blocks (in Byte 1)<br />
|}<br />
<br />
Jeder Befehl wird beantwortet, wobei dem ersten Byte eine Statusinformation mit bitweise Oder hinzugefügt wird:<br />
<br />
{| class="wikitable"<br />
! Nummer || Status || Beschreibung<br />
|-<br />
| 0x00 || None || Wird nicht verwendet<br />
|-<br />
| 0x40 || Busy || Der Befehl wurde nicht ausgeführt, weil der Controller beschäftigt ist<br />
|-<br />
| 0x80 || Ok || Der Befehl wurde erfolgreich ausgeführt, die optionale Antwort befindet sich in den restlichen Bytes<br />
|-<br />
| 0xC0 || Error || Beim Ausführen des Befehls ist ein Fehler aufgetreten<br />
|}<br />
<br />
===Tastenstatus===<br />
Für jede Änderung des Tastenstatus wird ein Report übertragen:<br />
<br />
<code>&lt; <span class="hb1">00</span> <span class="hb2">BB</span> xx xx xx xx xx xx</code><br />
<br />
* <span class="hb1">"Befehl": Status der Taste</span><br />
* <span class="hb2">Status der Taste - 0: nicht gedrückt, 1: gedrückt</span><br />
<br />
==Modus 1: Einzeltasten-Tastatur==<br />
In diesem Modus verhält sich der Fußtaster wie die Taste einer Tastatur.<br />
<br />
Die zu drückende Taste kann über Modus 2 festgelegt werden.<br />
<br />
Leider ist es aktuell noch nicht möglich, Multimedia-Tasten (Wiedergabesteuerung, Lautstärke, Anwendungssteuerung) zu verwenden.<br />
<br />
===Lesen===<br />
Zum Zurücklesen der verwendeten Taste muss folgender Report gesendet werden:<br />
<br />
<code>&gt; <span class="hb1">04</span> xx xx xx xx xx xx xx</code><br />
<br />
* <span class="hb1">Befehl: Lesen Einzeltaste</span><br />
<br />
Die Antwort entspricht folgendem Muster:<br />
<br />
<code>&lt; <span class="hb1">84</span> <span class="hb2">MM</span> <span class="hb3">KK</span> xx xx xx xx xx</code><br />
<br />
* <span class="hb1">Befehl: Lesen Einzeltaste (OK)</span><br />
* <span class="hb2">Bitmaske Modifier</span> (siehe oben)<br />
** 0x01: Steuerung links<br />
** 0x02: Umschalttaste links<br />
** 0x04: Alt links<br />
** 0x08: GUI links (u. a. Windows-Taste)<br />
** 0x10: Steuerung rechts<br />
** 0x20: Umschalttaste rechts<br />
** 0x40: Alt rechts (müsste Alt+Gr sein)<br />
** 0x80: GUI rechts (müsste Kontextmenü sein)<br />
* <span class="hb3">Keycode Taste</span><br />
<br />
===Schreiben===<br />
Zum Setzen einer Taste folgender Report gesendet werden:<br />
<br />
<code>&gt; <span class="hb1">05</span> <span class="hb2">MM</span> <span class="hb3">KK</span> xx xx xx xx xx</code><br />
<br />
* <span class="hb1">Befehl: Setzen Einzeltaste</span><br />
* <span class="hb2">Bitmaske Modifier</span> (siehe oben)<br />
* <span class="hb3">Keycode Taste</span><br />
<br />
Die restlichen Bytes im Report werden ignoriert.<br />
<br />
Die Bestätigung wird wie unter "Modus 2" beschrieben gesendet. Da keine Readback stattfindet, wird immer mit "OK" geantwortet:<br />
<br />
<code>&lt; <span class="hb1">85</span> xx xx xx xx xx xx xx</code><br />
<br />
==Modus 2: Makro-Tastatur==<br />
Über die Makro-Tastatur können längere Tastenfolgen ausgegeben werden. Für diesen Zweck sind 128 Byte im EEPROM vorgesehen, was einer maximalen Folge von etwa 63 Anschlägen entspricht.<br />
<br />
Aktuell kann nur eine Taste gleichzeitig gedrückt werden kann - ein Rollover ist dementsprechend nicht möglich.<br />
<br />
Die Ausgabe erfolgt mit maximaler Geschwindigkeit, also mit etwa 100 Anschlägen pro Sekunde, wobei zwischen gleichlautenden Anschlägen sowie nach dem letzten Zeichen automatisch ein Loslassen der Taste eingefügt wird, was zu einer kleinen Verzögerung führt und damit das Timing verändert<br />
<br />
Beispiel: Bei der Ausgabe des Wortes <code>Hallo</code> folgende Reports übertragen:<br />
<br />
* Umschalttaste drücken, Taste "H" drücken<br />
* Umschalttaste loslassen, Taste "A" drücken<br />
* Taste "L" drücken<br />
* Taste "L" loslassen<br />
* Taste "L" drücken<br />
* Taste "O" drücken<br />
* Taste "O" loslassen<br />
<br />
So dauert die Übertragung des Wortes - bei einem Report-Intervall von 10 ms - etwa 70 ms statt den zunächst anzunehmenden 50 ms.<br />
<br />
===Datenformat===<br />
Die Daten werden im Muster <code>Befehl + Daten</code> gespeichert, wobei die Datenlänge dynamisch (aber anhand des Befehls ersichtlich) ist.<br />
<br />
Dementsprechend sind die Befehle teilweise als Flags aufgebaut, zum besseren Verständnis hier im Binärformat:<br />
<br />
* <code>0b<b>11111111</b></code>: Ende der Sequenz (entspricht nicht beschriebenen Speicherzellen), keine Daten<br />
* <code>0b<b>1</b><span class="hb1">ppppppp</span></code>: Pause in 5 ms-Schritten, p = 0 ... 126, t = (p + 1) * 5 ms, maximal 635 ms, keine Daten<br />
* <code>0b<b>0</b><span class="hb2">mm</span><span class="hb3">xx</span>xxx</code>: Verhalten der Modifier<br />
** <code><span class="hb2">0b00</span></code>: Modifier beibehalten, keine Daten<br />
** <code><span class="hb2">0b01</span></code>: Modifier für nachfolgende Taste drücken (anschließend loslassen), +1 Byte Daten<br />
** <code><span class="hb2">0b10</span></code>: Modifier dauerhaft halten, +1 Byte Daten<br />
** <code><span class="hb2">0b11</span></code>: Modifier loslassen, keine Daten<br />
* <code>0b<b>0</b><span class="hb2">xx</span><span class="hb3">kk</span>xxx</code>: Verhalten der Taste<br />
** <code><span class="hb3">0b00</span></code>: Taste beibehalten, keine Daten<br />
** <code><span class="hb3">0b01</span></code>: Taste einmal drücken (anschließend loslassen), +1 Byte Daten<br />
** <code><span class="hb3">0b10</span></code>: Taste dauerhaft halten (bis eine andere Taste gedrückt wird), +1 Byte Daten<br />
** <code><span class="hb3">0b11</span></code>: Taste loslassen, keine Daten<br />
<br />
Sollen Modifier und Taste mit einem Befehl verändert werden, wird zuerst der Modifier erwartet, dann die Taste:<br />
<br />
<code>0b0<span class="hb2">10</span><span class="hb3">01</span>000 <span class="hb4">0b00000010</span> <span class="hb5">0b00001011</span><br />
<br />
<span class="hb2">Drückt und hält</span> die <span class="hb4">linke Umschalttaste</span> und drückt die <span class="hb5">Taste H (0x0B)</span> <span class="hb3">einmal</span>.<br />
<br />
Beispiel: Es soll die Zeichenfolge <code>Hallo WELT</code> mit anschließendem Zeilenumbruch ausgegeben werden, mit einer Pause von 500 ms nach "Hallo".<br />
<br />
Die Sequenz sieht nun wie folgt aus (Binär und Hex gemischt, Hex für Keycodes):<br />
<br />
{| class="wikitable"<br />
! Code || Befehl || Parameter<br />
|-<br />
| <code>0b0<span class="hb1">01</span><span class="hb2">01</span>000 <span class="hb3">0b00000010</span> <span class="hb4">0x0B</span></code> <br />
|| <span class="hb1">Modifier einmal drücken</span>, <span class="hb2">Taste einmal drücken</span> <br />
|| <span class="hb3">Linke Umschalttaste</span>, <span class="hb4">Taste H</span><br />
|-<br />
| <code>0b0<span class="hb1">00</span><span class="hb2">01</span>000 <span class="hb4">0x04</span></code><br />
|| <span class="hb1">Modifier beibehalten</span>, <span class="hb2">Taste einmal drücken</span> <br />
|| <span class="hb4">Taste A</span><br />
|-<br />
| <code>0b0<span class="hb1">00</span><span class="hb2">01</span>000 <span class="hb4">0x0F</span></code><br />
|| <span class="hb1">Modifier beibehalten</span>, <span class="hb2">Taste einmal drücken</span> <br />
|| <span class="hb4">Taste L</span><br />
|-<br />
| <code>0b0<span class="hb1">00</span><span class="hb2">01</span>000 <span class="hb4">0x0F</span></code><br />
|| <span class="hb1">Modifier beibehalten</span>, <span class="hb2">Taste einmal drücken</span> <br />
|| <span class="hb4">Taste L</span><br />
|-<br />
| <code>0b0<span class="hb1">00</span><span class="hb2">01</span>000 <span class="hb4">0x12</span></code><br />
|| <span class="hb1">Modifier beibehalten</span>, <span class="hb2">Taste einmal drücken</span> <br />
|| <span class="hb4">Taste O</span><br />
|-<br />
| <code>0b<span class="hb1">1</span><span class="hb3">1100011</span></code><br />
|| <span class="hb1">Pause oder Ende der Sequenz</span><br />
|| <span class="hb3">Pause mit 99 Zeiteinheiten</span>: t = (99 + 1) * 5 ms = 500 ms<br />
|-<br />
| <code>0b0<span class="hb1">00</span><span class="hb2">01</span>000 <span class="hb3">0x2C</span></code><br />
|| <span class="hb1">Modifier beibehalten</span>, <span class="hb2">Taste einmal drücken</span> <br />
|| <span class="hb4">Leertaste</span><br />
|-<br />
| <code>0b0<span class="hb1">11</span><span class="hb2">01</span>000 <span class="hb3">0b00000010</span> <span class="hb4">0x1A</span></code> <br />
|| <span class="hb1">Modifier drücken und halten</span>, <span class="hb2">Taste einmal drücken</span> <br />
|| <span class="hb3">Rechte Umschalttaste</span>, <span class="hb4">Taste W</span><br />
|-<br />
| <code>0b0<span class="hb1">00</span><span class="hb2">01</span>000 <span class="hb4">0x08</span></code><br />
|| <span class="hb1">Modifier beibehalten</span>, <span class="hb2">Taste einmal drücken</span> <br />
|| <span class="hb4">Taste E</span><br />
|-<br />
| <code>0b0<span class="hb1">00</span><span class="hb2">01</span>000 <span class="hb4">0x0F</span></code><br />
|| <span class="hb1">Modifier beibehalten</span>, <span class="hb2">Taste einmal drücken</span> <br />
|| <span class="hb4">Taste L</span><br />
|-<br />
| <code>0b0<span class="hb1">00</span><span class="hb2">01</span>000 <span class="hb4">0x17</span></code><br />
|| <span class="hb1">Modifier beibehalten</span>, <span class="hb2">Taste einmal drücken</span> <br />
|| <span class="hb4">Taste T</span><br />
|-<br />
| <code>0b0<span class="hb1">10</span><span class="hb2">00</span>000</code><br />
|| <span class="hb1">Modifier loslassen</span>, <span class="hb2">Kein Tastendruck</span> <br />
|| -<br />
|-<br />
| <code>0b0<span class="hb1">00</span><span class="hb2">01</span>000 <span class="hb4">0x28</span></code><br />
|| <span class="hb1">Modifier beibehalten</span>, <span class="hb2">Taste einmal drücken</span> <br />
|| <span class="hb4">Return-Taste</span><br />
|-<br />
| <code>0b<span class="hb1">1</span><span class="hb3">1111111</span></code><br />
|| <span class="hb1">Pause oder Ende der Sequenz</span><br />
|| <span class="hb3">Ende der der Sequenz</span><br />
|}<br />
<br />
===Lesen===<br />
Wie bereits in der Befehlsübersicht erwähnt, erfolgt das Lesen und Schreiben der Sequenzdaten in Blöcken:<br />
<br />
<code>&gt; <span class="hb1">06</span> <span class="hb2">CC</span> xx xx xx xx xx xx</code><br />
<br />
* <span class="hb1">Befehl: Lesen Sequenz</span><br />
* <span class="hb2">Blocknummer: 0 ... 21 (bei 128 Byte Speicher)</span><br />
<br />
Als Antwort bekommt man dann die Daten des jeweiligen Blocks:<br />
<br />
<code>&lt; <span class="hb1">86</span> <span class="hb2">CC</span> <span class="hb3">DD DD DD DD DD DD</span></code><br />
<br />
* <span class="hb1">Befehl: Lesen Sequenz (OK)</span><br />
* <span class="hb2">Blocknummer: 0 ... 21 </span><br />
* <span class="hb2">6 Datenbytes des Blocks</span><br />
<br />
Ist der letzte Block nicht "füllend", sind die restlichen Bytes zufällig, ebenso kann über das "End of Sequence" hinaus gelesen werden.<br />
<br />
===Schreiben===<br />
Das Schreiben von Blöcken ist der Antwort vom Lesen sehr ähnlich:<br />
<br />
<code>&gt; <span class="hb1">07</span> <span class="hb2">CC</span> <span class="hb3">DD DD DD DD DD DD</span></code><br />
<br />
* <span class="hb1">Befehl: Schreiben Sequenz</span><br />
* <span class="hb2">Blocknummer: 0 ... 21 (bei 128 Byte Speicher)</span><br />
* <span class="hb2">6 Datenbytes des Blocks</span><br />
<br />
Sobald die Daten geschrieben wurden, antwortet der Mikrocontroller mit:<br />
<br />
<code>&lt; <span class="hb1">06</span> xx xx xx xx xx xx xx</code><br />
<br />
* <span class="hb1">Befehl: Schreiben Sequenz (OK)</span><br />
<br />
==Modus 3: Gamepad==<br />
Es ist keine Konfiguration notwendig, das Gamepad meldet sich mit einer Taste und kann in Anwendungen wie gewohnt zugeordnet werden.<br />
<br />
<gallery><br />
footswitch_gamepad.png|Eigenschaftenseite in Windows<br />
</gallery><br />
<br />
Leider erkennt weder Firefox 73 noch Chromium 82 das Pad im html5gamepad-Tester.<br />
<br />
Anzumerken ist, dass wie bei der Einzeltasten-Tastatur Reports nur bei Zustandsänderung der Taste gesendet werden.<br />
Bis jetzt konnte ich dadurch keine Einschränkungen feststellen.<br />
<br />
=PC-Software=<br />
Aktuell gibt es eine kleine Python-Lib und ein paar Beispiele dazu.<br />
<br />
Siehe Downloads.<br />
<br />
=Anmerkungen=<br />
<br />
* Die Firmware auf dem Tiny85 zu entwickeln war grauenvoll, da man nur sehr schlecht debuggen kann. Das nächste Mal lieber auf einem Mikrocontroller mit deutlich mehr IOs und Hardware-UART entwickeln und anschließend auf ein kleineres Geschwister portieren<br />
* [https://github.com/micronucleus/micronucleus/ micronucleus] ist ein USB-Bootloader basierend auf V-USB, den ich bis jetzt noch nicht verwendet habe, in Zukunft aber sollte<br />
* Der Quellcode steht, wie von objective development gefordert, unter GPLv2<br />
<br />
=Leiterkarten=<br />
Es gibt noch unbestückte Leiterkarten. Wer eine will, kann sich gerne bei mir melden.<br />
<br />
=Download=<br />
* [[Datei:Footswitch.zip]] Schaltplan & Layout in EAGLE 7.7.0, Firmware & Sourcen in Atmel Studio 7, Beispielanwendung in Python 3.7<br />
<br />
=Weblinks=<br />
* [https://www.uwe-sieber.de/usbtreeview.html USB Device Tree Viewer] zeigt sehr detaillierte Infos zu angeschlossenen USB-Geräten an<br />
* [http://wireshark.org/ Wireshark] kann auch USB tracen<br />
* [https://eleccelerator.com/usbdescreqparser/ USB Descriptor and Request Parser]<br />
* [https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf#page=53 Universal Serial Bus HID Usage Tables, Seite 53: 10 Keyboard/Keypad Page (0x07)]<br />
<br />
[[Kategorie:AVR]]<br />
[[Kategorie:USB]]<br />
[[Kategorie:Kleine Helferlein]]</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=Hauptseite&diff=1430Hauptseite2020-03-01T17:42:37Z<p>Qsysopr: /* Neues & Änderungen */</p>
<hr />
<div>'''Willkommen auf hobbyelektronik.org!'''<br />
<br />
Auf diesen Seiten findest du [[Hobbyelektronik.org:Impressum|unsere]] Projekte rund um Elektronik und allem möglichen, was uns interessiert.<br />
<br />
Neben dem Wiki hier gibt es auch ein '''[//hobbyelektronik.org/b/ Blog]''', das sich nicht nur mit Elektronik und der Homepage beschäftigt. Dort kann - im Gegensatz zum Wiki hier - auch fleißig kommentiert werden, was an dieser Stelle aufgrund von massivem Spam deaktiviert werden musste.<br />
<br />
Aber nun wünsche ich viel Spaß beim stöbern auf den Seiten hier!<br />
<br />
Bitte benutze die Navigation links, um zu den [[Spezial:Alle Seiten|Artikeln]] zu kommen.<br />
=[//hobbyelektronik.org/b/ Blog]=<br />
<WPPlatest /><br />
<br />
=Neues & Änderungen=<br />
*10.03.2020 Wer braucht es nicht: einen [[USB-Fußtaster]]<br />
*15.02.2020 Ein bisschen Modellpflege: [[MCP-USB-Bridge#USB-I.C2.B2C-Bridge_v1.1|MCP USB-I²C-Bridge v1.1]], ein [[VBus-Decoder#VBus-Adapter_f.C3.BCr_den_Raspberry_Pi|VBus-Adapter für den Raspberry Pi]] und die VBus-Boards Nano-Boards sind wieder da :)<br />
*19.01.2020 [[Pirozeda]] Version 0.4 hat wohl Stabilitätsprobleme<br />
*19.01.2020 Update für die [[MCP-USB-Bridge|MCP2221-Python-Lib]] und Anmerkungen zu Datenblattfehlern<br />
*13.01.2020 Backplates für den [[3D-Druck-Sammelsurium#Diamex_AVR-Prog_Bodenplatte|Diamex AVR-Prog]] und die [[3D-Druck-Sammelsurium#USB-I.C2.B2C-Bridge_Bodenplatte|MCP USB-I²C-Bridge]] im [[3D-Druck-Sammelsurium]]<br />
*25.12.2019 [[3D-Druck-Sammelsurium]]<br />
*16.12.2019 Ein paar [[Softwaretools|Tools]] um die [[Softwaretools#SerialPlayer|serielle Schnittstelle zu bespaßen]] und [[Softwaretools#SaleaeTools|Daten aus Saleae Logic komfortabler verarbeiten zu können]]<br />
*10.11.2019 Für den VBus-Adapter Nano gibt es nun einen [[VBus-Decoder#Troubleshooting|Troubleshooting-Guide]] und eine [[VBus-Decoder#Python-Implementierung|Python-Implementierung]]<br />
*17.09.2019 Für den MCP2221 und MCP2210 (USB I²C- & SPI-Interface) gibt es nun eine [[MCP-USB-Bridge#C.23-Lib|C#-Lib]]<br />
*07.05.2019 Ein Adapter für den Adapter: Der [[Atmel-ICE-Adapter]]</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=USB-Fu%C3%9Ftaster&diff=1429USB-Fußtaster2020-03-01T17:41:46Z<p>Qsysopr: Qsysopr verschob die Seite Fußtaster nach USB-Fußtaster, ohne dabei eine Weiterleitung anzulegen: Blöder Titel</p>
<hr />
<div>[[Datei:Footswitch.jpg|thumb|Fertig aufgebauter Fußtaster]]<br />
"Schau Mama, freihändig!"<br />
<br />
Wer kennt das nicht? Man muss auf mehreren Leiterkarten verschiedene Spannungen messen.<br />
<br />
Üblicherweise läuft es dann wie folgt ab:<br />
<br />
# Messspitzen platzieren<br />
# Wert vom Messgerät ablesen<br />
# Messspitzen ablegen und zum PC umdrehen<br />
# Messwert eintippen<br />
# Zurückdrehen, Messspitzen wieder in die Hände nehmen<br />
# Nochmal nachschauen, welcher Messpunkt jetzt dran ist<br />
# Wiederholen<br />
<br />
Ab und zu mischt sich dann das erneute Messen ein, weil ein Wert unplausibel ist und man entweder einen Zahlendreher drin oder schneller getippt als gedacht hat.<br />
<br />
Unterm Strich ist es auf jeden Fall sehr zeitraubend und nervig.<br />
<br />
Gleichzeitig baumeln die Füße unbeteiligt am Stuhl herunter.<br />
<br />
Die meisten Messgeräte (und anderes Laborequipment) lassen sich über den PC kontrollieren, warum also nicht gleich die richtigen Werte z. B. nach Excel transferieren? Nur irgendwie muss man den Prozess anstoßen...<br />
<br />
=Die schnelle Lösung=<br />
<br />
Tastatur ist blöd, also muss eine andere Eingabemöglichkeit her. Ein Taster und eine Projektbox ist schnell gefunden, Loch in die Box und ein paar große Schrauben dazu (damit sie nicht gleich abhaut) und fertig ist der improvisierte Fußtaster. Nur wie kommt die Info in den PC?<br />
<br />
Die serielle Schnittstelle hat neben Rx und Tx oft auch Steuerleitungen – aus den alten Tagen, in denen Modems noch so richtig langsam waren. Diese lassen sich in so ziemlich jeder Programmiersprache kontrollieren und abfragen. Ein FT232 liegt auch noch herum, also Taster angelötet und los geht’s!<br />
<br />
Das Programm ist in Python geschrieben, pollt die CTS-Leitung und sobald diese low wird, wird per pyVisa den Multimeter der aktuelle Messwert entlockt, passend formatiert und mit dem Keyboard-Modul "ausgetippt". Damit die Augen am Mikroskop bleiben können, wird zudem ein kurzer Piepton ausgegeben.<br />
<br />
Sehr viel Spaß für wenig Geld.<br />
<br />
Leider muss man bei jeder Benutzung schauen, welcher COM-Port dem Adapter zugeordnet wurde und ob dieser auch wirklich im Script steht.<br />
<br />
=Die schöne Lösung=<br />
<br />
Eines Tages brachte mein Kollege einen kleinen Pappkarton vom [https://www.pollin.de Ramschmax] mit, Inhalt: [https://www.pollin.de/p/fusstaster-pfs-135a-10-a-250-v-420705 420705]. Ein Gusseiserner Fußtaster mit schönem Klick-Klack-Mikroschalter.<br />
<br />
Der hat etwas besseres als den schnöden UART-Adapter mit Zwillingslitze verdient – endlich wieder eine schöne Anwendung für [https://www.obdev.at/vusb/ V-USB]!<br />
<br />
Was soll das Teil können? Am besten natürlich so viel wie möglich, damit es vielleicht sogar als "Adaptive Controller" dienen kann. Deshalb habe ich mich dafür entschieden, einen Multidevice-Ansatz zu fahren. Das umfasst aktuell:<br />
<br />
* Generisches USB-HID<br />
* Einzeltasten-Tastatur<br />
* Makro-Tastatur<br />
* Joystick<br />
<br />
=Hardware=<br />
<br />
Die Hardware könnte nicht einfacher sein - sie entspricht größtenteils dem [https://www.obdev.at/products/vusb/easylogger.html Easylogger]-Beispielprojekt, nur dass anstelle der automatischen Oszillator-Kalibrierung ein externer Quarz verwendet wird. Hintergrund hierfür ist, dass das [[SNES-Joypad]], das sich selbst kalibriert (oder zumindest sollte), am RetroPie beim Booten oft nicht erkannt wird. Kann aber auch gut sein, dass es sich um einen Bug in meiner Firmware handelt.<br />
<br />
Die Bauteile sind - abgesehen vom Quarz und Mikrocontroller in SMD-Bauform. Als MCU werkelt fürs Erste ein ATtiny85, der später noch herunterskaliert werden kann. Die Wahl auf das DIP-Gehäuse fiel, um ohne Löten die Firmware herunterzuladen.<br />
<br />
Mit Quarz als Taktquelle bleibt noch ein "richtiger" IO übrig (sofern man den Reset-Pin nicht deaktiviert) - mehr braucht man nicht.<br />
<br />
Eine eigens designte Leiterkarte ist aufgrund der Einfachheit der Schaltung völlig unnötig, aber es war noch Platz auf dem Panel...<br />
<br />
<gallery><br />
footswitch 1.0 sch.png|Schaltplan<br />
footswitch 1.0 top.png|Bestückungsplan Oberseite<br />
footswitch 1.0 bot.png|Bestückungsplan Unterseite<br />
footswitch 1.0 assy.jpg|Aufgebaute Leiterkarte<br />
</gallery><br />
<br />
{| class="wikitable"<br />
! Menge || Referenz || Wert || Package || Reichelt Bestellcode<br />
|-<br />
| 1 || SV3 || || MA03-1 ||<br />
|-<br />
| 1 || SV1 || || MA04-1 || GC 2212-EU030<br />
|-<br />
| 1 || C1 || 100n || C0603 || X7R-G0603 100N<br />
|-<br />
| 1 || C4 || 10u || C0805 || KEM X7R0805 10U<br />
|-<br />
| 1 || Q1 || 12M || HC49U-V || 12,0000-HC49U-S<br />
|-<br />
| 1 || R11 || 150 || R0603 || RND 0603 1 150<br />
|-<br />
| 1 || C5 || 150n || C0603 || X7R 0603FCE 150N<br />
|-<br />
| 2 || C2, C3 || 22p || C0603 || RND 150MT18N2202<br />
|-<br />
| 1 || R3 || 2k2 || R0603 || RND 0603 1 2,2K<br />
|-<br />
| 1 || R10 || 4k7 || R0603 || RND 0603 1 4,7k<br />
|-<br />
| 2 || R1, R2 || 68 || R0603 || RND 0603 1 68<br />
|-<br />
| 1 || IC1 || ATTINY 85-20 PU || DIL08 || ATTINY 85-20 PU<br />
|-<br />
| 2 || D1, D2 || BZX84C3V6 || SOT23 || SMD ZD 3,6<br />
|}<br />
<br />
Leider stellte sich erst zu spät heraus, dass die Leiterkarte ein bisschen zu groß ist, um sie an der eigentlich vorgesehenen Stelle zu montieren. Man kann sie zwar ein bisschen schräg anschrauben und von der Ecke noch etwas Material wegnehmen, aber dann ist die USB-Leitung auch wieder im Weg. Das Design ist also nicht so richtig geglückt...<br />
<br />
Aber kein Problem, dass man nicht mit ein bisschen Schrumpfschlauch lösen könnte:<br />
<br />
<gallery><br />
footswitch 1.0 designflaw 1.jpg|Dort sollte die Leiterkarte hin<br />
footswitch 1.0 designflaw 2.jpg|...und hier ist sie<br />
footswitch 1.0 designflaw 3.jpg|weitere Perspektive<br />
</gallery><br />
<br />
Der Schirm ist übrigens auf ein Stück Leitung gecrimpt, das wiederum an die Halterung des Tasters gelötet ist.<br />
<br />
=Firmware=<br />
==Firmware==<br />
{{Infobox AVR<br />
| Typ = ATtiny85<br />
| Takt = 12<br />
| FuseH = D7<br />
| FuseL = DE<br />
| FuseE = FF<br />
}}<br />
Die Firmware ist mehr oder weniger viergeteilt, entsprechend den verschiedenen Modi.<br />
<br />
Hierfür gibt es mehrere Gründe:<br />
<br />
* die freien VID/PID-Paare sind auf die verschiedenen Funktionen beschränkt und es lässt sich nicht zweifelsfrei sagen, ob Multi-Endpoint-Konfigurationen erlaubt sind<br />
* Die Fragmentierung macht den Code (teilweise) einfacher und übersichtlicher<br />
* Keinerlei Treiberprobleme (es gibt wohl Betriebssysteme, die sich an Multi-Endpoint verschlucken)<br />
* Es ist nicht ganz so üblich und in der Implementierung interessanter<br />
<br />
Nach dem Reset liest die Firmware den zu verwendenden Modus aus dem EEPROM. Ist diese ungültig oder der IO des Tasters auf Masse gezogen, wird der auf Generisches HID gesetzt. Gegenüber des USB-Treibers wird nun auch der Pointer für die USB-Deskriptoren gesetzt (die sich wiederum im Flash befinden).<br />
<br />
Anschließend läuft die Initialisierung der unterschiedlichen Modi und es wird in die entsprechende Endlosschleife gesprungen.<br />
<br />
Als USB VID/PID-Paare werden von obdev frei zur Verfügung gestellten verwendet:<br />
<br />
* HID: 0x16C0/0x27D9<br />
* Tastatur: 0x16C0/0x27DB<br />
* Gamepad: 0x16C0/0x27DC<br />
<br />
Im Grunde ist das alles kein Hexenwerk, allerdings haben die "Dynamisierung" der USB-Deskriptoren einiges an (auf dem Attiny schwierige) Fehlersuche gekostet. Über Manche Dinge, wie z. B. wie man die verschiedenen Deskriptoren den Anfragen zuordnet, ist die Dokumentation leider etwas vage (oder ich habe sie nicht richtig gelesen/falsch gesucht).<br />
<br />
Auch lässt sich die Firmware noch ziemlich optimieren, das gesteckte Ziel wäre, dass sie auf den ATtiny45 passt. Aktuell ist hauptsächlich die RAM-Belegung ein Problem (und noch nicht optimal).<br />
<br />
=Konfiguration=<br />
Um die Konfiguration des Fußtasters ändern zu können, muss er sich in Modus 2 (Generisches HID) befinden. Sollte dieser Modus nicht aktiv sein, kann er erreicht werden indem der Taster gedrückt wird, während der USB-Stecker verbunden wird.<br />
<br />
In den Report-Besispielen werden stats hexadezimale Zahlen verwendet. Angaben mit <code>xx</code> sind beliebig bzw. müssen ignoriert werden.<br />
<br />
==Keycodes==<br />
Bevor auf die verschiedenen Funktionen im Detail eingegangen wird, ein paar Worte zu den Keycodes:<br />
<br />
Tastaturen sind seit jeher ziemlich einfach gestrickt. So "weiß" der Controller der Tastatur zwar an welcher Position eine Taste gedrückt wird, aber nicht welches Layout sie vertritt - dies wird erst durch das Betriebssystem umgestzt. Das hat zum Beispiel den Effekt, dass mit einer deutschen Tastatur an einem auf englisch eingestellten PC u. a. Y und Z vertauscht sind (und man beim Raspberrz Pi das Passwort mindestens einmal falsch eingibt).<br />
<br />
Diese Eigenschaft betrifft natürlich auch den Fußtaster.<br />
<br />
Die Keycodes für englische Tastaturen können in der Spezifikation [https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf#page=53 "Universal Serial Bus HID Usage Tables"] in der aktuellen Version ab Seite 53 (Kapitel 10 Keyboard/Keypad Page (0x07)]) nachgeschlagen werden.<br />
<br />
Für das deutsche Layout befindet sich eine Tabelle im Download-Bereich (keine Garantie auf Vollständigkeit und Korrektheit).<br />
<br />
==Modus 0: Generisches HID==<br />
Die Kommunikation findet über Report ID 0 mit 8 Datenbytes statt.<br />
Beim Senden von Reports definiert das erste Byte den Befehl, in den weiteren befinden sich die Parameter dessen:<br />
<br />
{| class="wikitable"<br />
! Nummer || Befehl || Beschreibung<br />
|-<br />
| 0 || NOP || Keine Operation, dieser Code wird bei den Antworten für den Status des Tasters verwendet<br />
|-<br />
| 1 || Restart || Neustart des Mikrocontrollers (ersetzt das Aus- und Einstecken nachdem der Modus umgestellt wurde)<br />
|-<br />
| 2 || Lesen Modus || Gibt den Interface-Modus zurück<br />
|-<br />
| 3 || Setzen Modus || Setzt den Interface-Modus<br />
|-<br />
| 4 || Lesen Einzeltaste || Gibt den Keycode der Einzeltasten-Tastatur zurück<br />
|-<br />
| 5 || Setzen Einzeltaste || Setzt den Keycode der Einzeltasten-Tastatur<br />
|-<br />
| 6 || Lesen Tastensequenz || Gibt 6 Byte der Sequenz des angegebenen Blocks (in Byte 1) zurück<br />
|-<br />
| 7 || Setzen Tastensequenz || Setzt die 6 Bytes der Sequenz des angegebenen Blocks (in Byte 1)<br />
|}<br />
<br />
Jeder Befehl wird beantwortet, wobei dem ersten Byte eine Statusinformation mit bitweise Oder hinzugefügt wird:<br />
<br />
{| class="wikitable"<br />
! Nummer || Status || Beschreibung<br />
|-<br />
| 0x00 || None || Wird nicht verwendet<br />
|-<br />
| 0x40 || Busy || Der Befehl wurde nicht ausgeführt, weil der Controller beschäftigt ist<br />
|-<br />
| 0x80 || Ok || Der Befehl wurde erfolgreich ausgeführt, die optionale Antwort befindet sich in den restlichen Bytes<br />
|-<br />
| 0xC0 || Error || Beim Ausführen des Befehls ist ein Fehler aufgetreten<br />
|}<br />
<br />
===Tastenstatus===<br />
Für jede Änderung des Tastenstatus wird ein Report übertragen:<br />
<br />
<code>&lt; <span class="hb1">00</span> <span class="hb2">BB</span> xx xx xx xx xx xx</code><br />
<br />
* <span class="hb1">"Befehl": Status der Taste</span><br />
* <span class="hb2">Status der Taste - 0: nicht gedrückt, 1: gedrückt</span><br />
<br />
==Modus 1: Einzeltasten-Tastatur==<br />
In diesem Modus verhält sich der Fußtaster wie die Taste einer Tastatur.<br />
<br />
Die zu drückende Taste kann über Modus 2 festgelegt werden.<br />
<br />
Leider ist es aktuell noch nicht möglich, Multimedia-Tasten (Wiedergabesteuerung, Lautstärke, Anwendungssteuerung) zu verwenden.<br />
<br />
===Lesen===<br />
Zum Zurücklesen der verwendeten Taste muss folgender Report gesendet werden:<br />
<br />
<code>&gt; <span class="hb1">04</span> xx xx xx xx xx xx xx</code><br />
<br />
* <span class="hb1">Befehl: Lesen Einzeltaste</span><br />
<br />
Die Antwort entspricht folgendem Muster:<br />
<br />
<code>&lt; <span class="hb1">84</span> <span class="hb2">MM</span> <span class="hb3">KK</span> xx xx xx xx xx</code><br />
<br />
* <span class="hb1">Befehl: Lesen Einzeltaste (OK)</span><br />
* <span class="hb2">Bitmaske Modifier</span> (siehe oben)<br />
** 0x01: Steuerung links<br />
** 0x02: Umschalttaste links<br />
** 0x04: Alt links<br />
** 0x08: GUI links (u. a. Windows-Taste)<br />
** 0x10: Steuerung rechts<br />
** 0x20: Umschalttaste rechts<br />
** 0x40: Alt rechts (müsste Alt+Gr sein)<br />
** 0x80: GUI rechts (müsste Kontextmenü sein)<br />
* <span class="hb3">Keycode Taste</span><br />
<br />
===Schreiben===<br />
Zum Setzen einer Taste folgender Report gesendet werden:<br />
<br />
<code>&gt; <span class="hb1">05</span> <span class="hb2">MM</span> <span class="hb3">KK</span> xx xx xx xx xx</code><br />
<br />
* <span class="hb1">Befehl: Setzen Einzeltaste</span><br />
* <span class="hb2">Bitmaske Modifier</span> (siehe oben)<br />
* <span class="hb3">Keycode Taste</span><br />
<br />
Die restlichen Bytes im Report werden ignoriert.<br />
<br />
Die Bestätigung wird wie unter "Modus 2" beschrieben gesendet. Da keine Readback stattfindet, wird immer mit "OK" geantwortet:<br />
<br />
<code>&lt; <span class="hb1">85</span> xx xx xx xx xx xx xx</code><br />
<br />
==Modus 2: Makro-Tastatur==<br />
Über die Makro-Tastatur können längere Tastenfolgen ausgegeben werden. Für diesen Zweck sind 128 Byte im EEPROM vorgesehen, was einer maximalen Folge von etwa 63 Anschlägen entspricht.<br />
<br />
Aktuell kann nur eine Taste gleichzeitig gedrückt werden kann - ein Rollover ist dementsprechend nicht möglich.<br />
<br />
Die Ausgabe erfolgt mit maximaler Geschwindigkeit, also mit etwa 100 Anschlägen pro Sekunde, wobei zwischen gleichlautenden Anschlägen sowie nach dem letzten Zeichen automatisch ein Loslassen der Taste eingefügt wird, was zu einer kleinen Verzögerung führt und damit das Timing verändert<br />
<br />
Beispiel: Bei der Ausgabe des Wortes <code>Hallo</code> folgende Reports übertragen:<br />
<br />
* Umschalttaste drücken, Taste "H" drücken<br />
* Umschalttaste loslassen, Taste "A" drücken<br />
* Taste "L" drücken<br />
* Taste "L" loslassen<br />
* Taste "L" drücken<br />
* Taste "O" drücken<br />
* Taste "O" loslassen<br />
<br />
So dauert die Übertragung des Wortes - bei einem Report-Intervall von 10 ms - etwa 70 ms statt den zunächst anzunehmenden 50 ms.<br />
<br />
===Datenformat===<br />
Die Daten werden im Muster <code>Befehl + Daten</code> gespeichert, wobei die Datenlänge dynamisch (aber anhand des Befehls ersichtlich) ist.<br />
<br />
Dementsprechend sind die Befehle teilweise als Flags aufgebaut, zum besseren Verständnis hier im Binärformat:<br />
<br />
* <code>0b<b>11111111</b></code>: Ende der Sequenz (entspricht nicht beschriebenen Speicherzellen), keine Daten<br />
* <code>0b<b>1</b><span class="hb1">ppppppp</span></code>: Pause in 5 ms-Schritten, p = 0 ... 126, t = (p + 1) * 5 ms, maximal 635 ms, keine Daten<br />
* <code>0b<b>0</b><span class="hb2">mm</span><span class="hb3">xx</span>xxx</code>: Verhalten der Modifier<br />
** <code><span class="hb2">0b00</span></code>: Modifier beibehalten, keine Daten<br />
** <code><span class="hb2">0b01</span></code>: Modifier für nachfolgende Taste drücken (anschließend loslassen), +1 Byte Daten<br />
** <code><span class="hb2">0b10</span></code>: Modifier dauerhaft halten, +1 Byte Daten<br />
** <code><span class="hb2">0b11</span></code>: Modifier loslassen, keine Daten<br />
* <code>0b<b>0</b><span class="hb2">xx</span><span class="hb3">kk</span>xxx</code>: Verhalten der Taste<br />
** <code><span class="hb3">0b00</span></code>: Taste beibehalten, keine Daten<br />
** <code><span class="hb3">0b01</span></code>: Taste einmal drücken (anschließend loslassen), +1 Byte Daten<br />
** <code><span class="hb3">0b10</span></code>: Taste dauerhaft halten (bis eine andere Taste gedrückt wird), +1 Byte Daten<br />
** <code><span class="hb3">0b11</span></code>: Taste loslassen, keine Daten<br />
<br />
Sollen Modifier und Taste mit einem Befehl verändert werden, wird zuerst der Modifier erwartet, dann die Taste:<br />
<br />
<code>0b0<span class="hb2">10</span><span class="hb3">01</span>000 <span class="hb4">0b00000010</span> <span class="hb5">0b00001011</span><br />
<br />
<span class="hb2">Drückt und hält</span> die <span class="hb4">linke Umschalttaste</span> und drückt die <span class="hb5">Taste H (0x0B)</span> <span class="hb3">einmal</span>.<br />
<br />
Beispiel: Es soll die Zeichenfolge <code>Hallo WELT</code> mit anschließendem Zeilenumbruch ausgegeben werden, mit einer Pause von 500 ms nach "Hallo".<br />
<br />
Die Sequenz sieht nun wie folgt aus (Binär und Hex gemischt, Hex für Keycodes):<br />
<br />
{| class="wikitable"<br />
! Code || Befehl || Parameter<br />
|-<br />
| <code>0b0<span class="hb1">01</span><span class="hb2">01</span>000 <span class="hb3">0b00000010</span> <span class="hb4">0x0B</span></code> <br />
|| <span class="hb1">Modifier einmal drücken</span>, <span class="hb2">Taste einmal drücken</span> <br />
|| <span class="hb3">Linke Umschalttaste</span>, <span class="hb4">Taste H</span><br />
|-<br />
| <code>0b0<span class="hb1">00</span><span class="hb2">01</span>000 <span class="hb4">0x04</span></code><br />
|| <span class="hb1">Modifier beibehalten</span>, <span class="hb2">Taste einmal drücken</span> <br />
|| <span class="hb4">Taste A</span><br />
|-<br />
| <code>0b0<span class="hb1">00</span><span class="hb2">01</span>000 <span class="hb4">0x0F</span></code><br />
|| <span class="hb1">Modifier beibehalten</span>, <span class="hb2">Taste einmal drücken</span> <br />
|| <span class="hb4">Taste L</span><br />
|-<br />
| <code>0b0<span class="hb1">00</span><span class="hb2">01</span>000 <span class="hb4">0x0F</span></code><br />
|| <span class="hb1">Modifier beibehalten</span>, <span class="hb2">Taste einmal drücken</span> <br />
|| <span class="hb4">Taste L</span><br />
|-<br />
| <code>0b0<span class="hb1">00</span><span class="hb2">01</span>000 <span class="hb4">0x12</span></code><br />
|| <span class="hb1">Modifier beibehalten</span>, <span class="hb2">Taste einmal drücken</span> <br />
|| <span class="hb4">Taste O</span><br />
|-<br />
| <code>0b<span class="hb1">1</span><span class="hb3">1100011</span></code><br />
|| <span class="hb1">Pause oder Ende der Sequenz</span><br />
|| <span class="hb3">Pause mit 99 Zeiteinheiten</span>: t = (99 + 1) * 5 ms = 500 ms<br />
|-<br />
| <code>0b0<span class="hb1">00</span><span class="hb2">01</span>000 <span class="hb3">0x2C</span></code><br />
|| <span class="hb1">Modifier beibehalten</span>, <span class="hb2">Taste einmal drücken</span> <br />
|| <span class="hb4">Leertaste</span><br />
|-<br />
| <code>0b0<span class="hb1">11</span><span class="hb2">01</span>000 <span class="hb3">0b00000010</span> <span class="hb4">0x1A</span></code> <br />
|| <span class="hb1">Modifier drücken und halten</span>, <span class="hb2">Taste einmal drücken</span> <br />
|| <span class="hb3">Rechte Umschalttaste</span>, <span class="hb4">Taste W</span><br />
|-<br />
| <code>0b0<span class="hb1">00</span><span class="hb2">01</span>000 <span class="hb4">0x08</span></code><br />
|| <span class="hb1">Modifier beibehalten</span>, <span class="hb2">Taste einmal drücken</span> <br />
|| <span class="hb4">Taste E</span><br />
|-<br />
| <code>0b0<span class="hb1">00</span><span class="hb2">01</span>000 <span class="hb4">0x0F</span></code><br />
|| <span class="hb1">Modifier beibehalten</span>, <span class="hb2">Taste einmal drücken</span> <br />
|| <span class="hb4">Taste L</span><br />
|-<br />
| <code>0b0<span class="hb1">00</span><span class="hb2">01</span>000 <span class="hb4">0x17</span></code><br />
|| <span class="hb1">Modifier beibehalten</span>, <span class="hb2">Taste einmal drücken</span> <br />
|| <span class="hb4">Taste T</span><br />
|-<br />
| <code>0b0<span class="hb1">10</span><span class="hb2">00</span>000</code><br />
|| <span class="hb1">Modifier loslassen</span>, <span class="hb2">Kein Tastendruck</span> <br />
|| -<br />
|-<br />
| <code>0b0<span class="hb1">00</span><span class="hb2">01</span>000 <span class="hb4">0x28</span></code><br />
|| <span class="hb1">Modifier beibehalten</span>, <span class="hb2">Taste einmal drücken</span> <br />
|| <span class="hb4">Return-Taste</span><br />
|-<br />
| <code>0b<span class="hb1">1</span><span class="hb3">1111111</span></code><br />
|| <span class="hb1">Pause oder Ende der Sequenz</span><br />
|| <span class="hb3">Ende der der Sequenz</span><br />
|}<br />
<br />
===Lesen===<br />
Wie bereits in der Befehlsübersicht erwähnt, erfolgt das Lesen und Schreiben der Sequenzdaten in Blöcken:<br />
<br />
<code>&gt; <span class="hb1">06</span> <span class="hb2">CC</span> xx xx xx xx xx xx</code><br />
<br />
* <span class="hb1">Befehl: Lesen Sequenz</span><br />
* <span class="hb2">Blocknummer: 0 ... 21 (bei 128 Byte Speicher)</span><br />
<br />
Als Antwort bekommt man dann die Daten des jeweiligen Blocks:<br />
<br />
<code>&lt; <span class="hb1">86</span> <span class="hb2">CC</span> <span class="hb3">DD DD DD DD DD DD</span></code><br />
<br />
* <span class="hb1">Befehl: Lesen Sequenz (OK)</span><br />
* <span class="hb2">Blocknummer: 0 ... 21 </span><br />
* <span class="hb2">6 Datenbytes des Blocks</span><br />
<br />
Ist der letzte Block nicht "füllend", sind die restlichen Bytes zufällig, ebenso kann über das "End of Sequence" hinaus gelesen werden.<br />
<br />
===Schreiben===<br />
Das Schreiben von Blöcken ist der Antwort vom Lesen sehr ähnlich:<br />
<br />
<code>&gt; <span class="hb1">07</span> <span class="hb2">CC</span> <span class="hb3">DD DD DD DD DD DD</span></code><br />
<br />
* <span class="hb1">Befehl: Schreiben Sequenz</span><br />
* <span class="hb2">Blocknummer: 0 ... 21 (bei 128 Byte Speicher)</span><br />
* <span class="hb2">6 Datenbytes des Blocks</span><br />
<br />
Sobald die Daten geschrieben wurden, antwortet der Mikrocontroller mit:<br />
<br />
<code>&lt; <span class="hb1">06</span> xx xx xx xx xx xx xx</code><br />
<br />
* <span class="hb1">Befehl: Schreiben Sequenz (OK)</span><br />
<br />
==Modus 3: Gamepad==<br />
Es ist keine Konfiguration notwendig, das Gamepad meldet sich mit einer Taste und kann in Anwendungen wie gewohnt zugeordnet werden.<br />
<br />
<gallery><br />
footswitch_gamepad.png|Eigenschaftenseite in Windows<br />
</gallery><br />
<br />
Leider erkennt weder Firefox 73 noch Chromium 82 das Pad im html5gamepad-Tester.<br />
<br />
Anzumerken ist, dass wie bei der Einzeltasten-Tastatur Reports nur bei Zustandsänderung der Taste gesendet werden.<br />
Bis jetzt konnte ich dadurch keine Einschränkungen feststellen.<br />
<br />
=PC-Software=<br />
Aktuell gibt es eine kleine Python-Lib und ein paar Beispiele dazu.<br />
<br />
Siehe Downloads.<br />
<br />
=Anmerkungen=<br />
<br />
* Die Firmware auf dem Tiny85 zu entwickeln war grauenvoll, da man nur sehr schlecht debuggen kann. Das nächste Mal lieber auf einem Mikrocontroller mit deutlich mehr IOs und Hardware-UART entwickeln und anschließend auf ein kleineres Geschwister portieren<br />
* [https://github.com/micronucleus/micronucleus/ micronucleus] ist ein USB-Bootloader basierend auf V-USB, den ich bis jetzt noch nicht verwendet habe, in Zukunft aber sollte<br />
* Der Quellcode steht, wie von objective development gefordert, unter GPLv2<br />
<br />
=Leiterkarten=<br />
Es gibt noch unbestückte Leiterkarten. Wer eine will, kann sich gerne bei mir melden.<br />
<br />
=Download=<br />
* [[Datei:Footswitch.zip]] Schaltplan & Layout in EAGLE 7.7.0, Firmware & Sourcen in Atmel Studio 7, Beispielanwendung in Python 3.7<br />
<br />
=Weblinks=<br />
* [https://www.uwe-sieber.de/usbtreeview.html USB Device Tree Viewer] zeigt sehr detaillierte Infos zu angeschlossenen USB-Geräten an<br />
* [http://wireshark.org/ Wireshark] kann auch USB tracen<br />
* [https://eleccelerator.com/usbdescreqparser/ USB Descriptor and Request Parser]<br />
* [https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf#page=53 Universal Serial Bus HID Usage Tables, Seite 53: 10 Keyboard/Keypad Page (0x07)]<br />
<br />
[[Kategorie:AVR]]<br />
[[Kategorie:USB]]<br />
[[Kategorie:Kleine Helferlein]]</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=Pirozeda-HAT&diff=1409Pirozeda-HAT2020-02-15T20:22:59Z<p>Qsysopr: /* Verbesserungsmöglichkeiten */</p>
<hr />
<div>[[Datei:Pirozeda_hat_rpizerow.jpg|300px|thumb|Pirozeda-HAT mit ADuM-Isolator auf Raspberry Pi Zero W]]<br />
Wie bereits im [[Pirozeda|Hauptartikel]] und im Blog erwähnt, sind bei der ersten Leiterkarte ein paar Dinge unschön.<br />
<br />
Deshalb habe ich mich noch einmal hingesetzt und ein Design mit anderen Kompromissen erstellt:<br />
<br />
* Entspricht (größtenteils) den Raspberry Pi HAT-Spezifikationen (inkl. EEProm)<br />
* Neben dem Optokoppler kann man nun auch einen ADUM1301 verwenden<br />
* ...oder einfach Widerstände, wenn man sich der Sache sicher ist<br />
* Mit ADUM1301 oder Direktverbindung können nun hardwareseitig einfach Firmware-Updates aufgespielt und der µC resettet werden<br />
* Am Mikrocontroller gibt es nun die Option für zwei, vom Raspi für eine Status-LED<br />
* Es gibt nun eine RTC (DS1307Z), um direkt nach einem Neustart oder bei fehlendem Netzwerk loggen zu können<br />
* Der I2C des Raspberry ist auf eine Stiftleiste herausgeführt, ideal für eines dieser kleinen OLED-Displays.<br />
* Ein GPIO des Raspberry ist auf einen Taster herausgeführt<br />
<br />
Ein großer Kompromiss ist, dass das Layout (wieder) nicht so richtig für den Raspberry Pi B passt. Die Buchse für den Bus kann bei "normalem" Boardabstand (in der Höhe) nicht bestückt werden. Zwar kann ein Flachbandkabel direkt an die Kontaktflächen gelötet werden, so richtig schön ist das allerdings auch nicht.<br />
<br />
Ich habe die verschiedenen Platzierungsmöglichkeiten durchprobiert aber mit dem Featureset ist es mir nicht gelungen, die Buchse an eine andere Stelle zu packen.<br />
<br />
Die Mini-DIN-Buchse ist übrigens rausgeflogen, weil sie - neben dem großen Platzbedarf - keinen wirklichen Mehrwert hat. Konfektionierte Kabel konnte ich bis jetzt nicht finden und selber bauen ist eher fummelig. Da reicht es schon, einen Mini-DIN-Stecker zu löten. die Stiftwanne seitlich an die Leiterkarte zu Löten ist zwar Geschmackssache aber in Hinblick auf Platz das Beste, was mir eingefallen ist. Es steht natürlich jedem frei, das Design zu verbessern.<br />
<br />
=Bestückungsvarianten=<br />
<br />
Durch die verschiedenen Möglichkeiten für das Interface gibt es einige Bestückungsoptionen. Drei für das eigentliche Interface und je nachdem, wie viele Zusatzfeatures aktiviert werden sollen, noch ein paar mehr:<br />
<br />
==Variante 1: Direkt==<br />
'''Noch nicht aufgebaut und getestet.'''<br />
<br />
Mit der Bestückungsvariante "direkt" kann ich nur abraten, habe sie aber der Vollständigkeit halber erstellt.<br />
Problem an ihr ist, dass neben der gemeinsamen Masse mit der Solaranlage Backfeed entstehen kann, wenn der Raspberry Pi keine Stromversorgung hat. Der Strom wird zwar über Widerstände begrenzt, Fehlfunktion kann aber nicht ausgeschlossen werden.<br />
<br />
Diese Variante ist eher für diejenigen, die sich der Sache sicher sind.<br />
<br />
Einen Vorteil gibt es natürlich auch: es ist die günstigste Variante und wenn ein UART-Bootloader geflasht wurde lässt sich der AVR darüber updaten.<br />
<br />
<gallery><br />
pirozeda_hat_0.1_direct_sch.png|Schaltplan mit Direktverbindung<br />
pirozeda_hat_0.1_direct_assy.png|Bestückungsplan mit Direktverbindung<br />
</gallery><br />
<br />
{| class="wikitable"<br />
! Menge || Referenz || Wert || Package || Reichelt Bestellcode<br />
|-<br />
| 1 || SV2 || || MA03-2 || SL 2X40G 2,54<br />
|-<br />
| 1 || SV1 || || ML6S || WSL 6G<br />
|-<br />
| 3 || R22, R26, R27 || 0 || R0805 || RND 0805 1 0<br />
|-<br />
| 3 || R18, R19, R20 || 100 || R0805 || RND 0805 1 100<br />
|-<br />
| 2 || C1, C5 || 100n || C0603 || X7R-G0603 100N<br />
|-<br />
| 1 || R1 || 10k || R0603 || RND 0603 1 10K<br />
|-<br />
| 2 || C3, C4 || 10p || C0603 || X7R-G0603 10p<br />
|-<br />
| 1 || Q2 || 12M || HC49UP || 12,0000-HC49-SMD<br />
|-<br />
| 3 || R14, R15, R16 || 1k || R0603 || RND 0603 1 1,0K<br />
|-<br />
| 1 || C2 || 2u2 || C0805 || KEM X5R0805 2,2U<br />
|-<br />
| 1 || Q1 || BSS138 || SOT23 || BSS 138 SMD<br />
|-<br />
| 1 || CL1 || Datacable || DUMMY || LIYY 614-5,0<br />
|-<br />
| 1 || SV5 || IDC-Conn 6 0.1in || DUMMY || PFL 6<br />
|-<br />
| 1 || IC3 || MEGA48/88/168-AU || TQFP32-08 || ATMEGA 88PA-AU<br />
|-<br />
| 1 || SV4 || Mini-DIN 8 plug || DUMMY || SE-DIO M08<br />
|-<br />
| 1 || X1 || RPI_CONDENSEDZERO || RPI_ZERO_THT || BL 2X25G8 2,54<br />
|}<br />
<br />
==Variante 2: Optokoppler==<br />
'''Aufgebaut und erfolgreich getestet.'''<br />
<br />
Dies entspricht weitestgehend dem Originaldesign.<br />
<br />
Heißt: optische Isolation, Firmware-Updates gehen nur über SPI oder drei bzw. 4 Jumper (R18, R19, R27 und ggf. R22).<br />
<br />
<gallery><br />
pirozeda_hat_0.1_opto_sch.png|Schaltplan mit Optokoppler<br />
pirozeda_hat_0.1_opto_assy.png|Bestückungsplan mit Optokoppler<br />
pirozeda_hat_0.1_opto.jpg|Aufgebauter HAT - es passt sogar ein MJ-Quarz<br />
</gallery><br />
<br />
<br />
{| class="wikitable"<br />
! Menge || Referenz || Wert || Package || Reichelt Bestellcode<br />
|-<br />
| 1 || SV2 || || MA03-2 || SL 2X40G 2,54<br />
|-<br />
| 1 || SV1 || || ML6S || WSL 6G<br />
|-<br />
| 1 || R21 || 0 || R0805 || RND 0805 1 0<br />
|-<br />
| 2 || C1, C5 || 100n || C0603 || X7R-G0603 100N<br />
|-<br />
| 1 || R1 || 10k || R0603 || RND 0603 1 10K<br />
|-<br />
| 2 || C3, C4 || 10p || C0603 || X7R-G0603 10p<br />
|-<br />
| 1 || Q2 || 12M || HC49UP || 12,0000-HC49-SMD<br />
|-<br />
| 4 || R13, R14, R15, R16 || 1k || R0603 || RND 0603 1 1,0K<br />
|-<br />
| 1 || C15 || 1n || C0603 || X7R-G0603 1,0N<br />
|-<br />
| 1 || R17 || 2k2 || R0603 || RND 0603 1 2,2K<br />
|-<br />
| 1 || C2 || 2u2 || C0805 || KEM X5R0805 2,2U<br />
|-<br />
| 1 || OK2 || 6N137 || DIL08 || 6N 137<br />
|-<br />
| 1 || Q1 || BSS138 || SOT23 || BSS 138 SMD<br />
|-<br />
| 1 || CL1 || Datacable || DUMMY || LIYY 614-5,0<br />
|-<br />
| 1 || SV5 || IDC-Conn 6 0.1in || DUMMY || PFL 6<br />
|-<br />
| 1 || IC3 || MEGA48/88/168-AU || TQFP32-08 || ATMEGA 88PA-AU<br />
|-<br />
| 1 || SV4 || Mini-DIN 8 plug || DUMMY || SE-DIO M08<br />
|-<br />
| 1 || X1 || RPI_CONDENSEDZERO || RPI_ZERO_THT || BL 2X25G8 2,54<br />
|}<br />
<br />
==Variante 3: ADUM-Isolator==<br />
'''Aufgebaut und weitestgehend erfolgreich getestet.'''<br />
<br />
Die "zukunftssichere" aber gleichzeitig auch die teuerste Variante.<br />
<br />
Unterstützt Bootloader und gewährleistet die Isolation zwischen Solaranlage und Raspberry Pi.<br />
<br />
<gallery><br />
pirozeda_hat_0.1_adum_sch.png|Schaltplan mit ADUM-Isolator<br />
pirozeda_hat_0.1_adum_assy.png|Bestückungsplan mit ADUM-Isolator<br />
pirozeda_hat_0.1_adum.jpg|Aufgebauter HAT mit Hotfix<br />
</gallery><br />
<br />
{| class="wikitable"<br />
! Menge || Referenz || Wert || Package || Reichelt Bestellcode<br />
|-<br />
| 1 || SV2 || || MA03-2 || SL 2X40G 2,54<br />
|-<br />
| 1 || SV1 || || ML6S || WSL 6G<br />
|-<br />
| 1 || R21 || 0 || R0805 || RND 0805 1 0<br />
|-<br />
| 1 || R9 || 100 || R0603 || RND 0603 1 100<br />
|-<br />
| 4 || C1, C5, C9, C10 || 100n || C0603 || X7R-G0603 100N<br />
|-<br />
| 1 || R1 || 10k || R0603 || RND 0603 1 10K<br />
|-<br />
| 2 || C3, C4 || 10p || C0603 || X7R-G0603 10p<br />
|-<br />
| 1 || Q2 || 12M || HC49UP || 12,0000-HC49-SMD<br />
|-<br />
| 3 || R14, R15, R16 || 1k || R0603 || RND 0603 1 1,0K<br />
|-<br />
| 1 || C2 || 2u2 || C0805 || KEM X5R0805 2,2U<br />
|-<br />
| 1 || IC4 || ADUM1301ARW || SO-16W || ADUM 1301 ARW<br />
|-<br />
| 1 || Q1 || BSS138 || SOT23 || BSS 138 SMD<br />
|-<br />
| 1 || CL1 || Datacable || DUMMY || LIYY 614-5,0<br />
|-<br />
| 1 || SV5 || IDC-Conn 6 0.1in || DUMMY || PFL 6<br />
|-<br />
| 1 || IC3 || MEGA48/88/168-AU || TQFP32-08 || ATMEGA 88PA-AU<br />
|-<br />
| 1 || SV4 || Mini-DIN 8 plug || DUMMY || SE-DIO M08<br />
|-<br />
| 1 || X1 || RPI_CONDENSEDZERO || RPI_ZERO_THT || BL 2X25G8 2,54<br />
|}<br />
<br />
Bei der Schaltungsentwicklung hat sich leider ein dummer Fehler eingeschlichen. Ich dachte nicht daran, dass der ADuM !RES treiben wird - und das v.a. nach GND. Kann man zwar halbwegs in Software umgehen, ist aber Mist.<br />
<br />
'''Die einfachste Fehlerbeseitigung ist, R10 einfach nicht zu bestücken.'''<br />
<br />
Der ADuM1301 ist trotz des fehlenden Features die günstigste Lösung.<br />
<br />
Der Reset des Mikrocontrollers (und damit das Wechseln in den Bootloader) kann auch per Kommando ausgelöst werden.<br />
<br />
Wer will, kann jedoch auch einen Hotfix implementieren:<br />
Dazu muss das obere Pad von R10 von der Leiterbahn getrennt werden (rot). Auf den Pads von R18 (rechts) und R10 kann nun ein BSS138 verdreht aufgesetzt werden. Das obere Pad muss dabei noch mit Masse verbunden werden (orange).<br />
<br />
<gallery><br />
Pirozeda_hat_0.1_adum_hotfix.png<br />
Pirozeda_hat_0.1_adum_hotfix.jpg<br />
</gallery><br />
<br />
Achtung: Auch mit diesem Hotfix gibt es einen Fallstrick: Ist die "Raspberry Pi"-Seite Stromlos, geht der Ausgangspin des ADuM auf high, folglich hängt Reset bei low (aktiv). Kann seine Vorteile haben, zum Flashen des Mikrocontrollers aber eher unpraktisch.<br />
<br />
=Bestückungsoptionen=<br />
Da nicht jeder alle Funktionen braucht, hier noch die zusätzlichen Bestückungsoptionen:<br />
<br />
<gallery><br />
pirozeda_hat_0.1_assy_optional.png|Zusätzliche Bestückungsoptionen<br />
</gallery><br />
<br />
* HAT-ID (violett)<br />
* Real-Time-Clock (orange)<br />
* I²C(-OLED) (grün)<br />
* Taster (cyan)<br />
* Status-LEDs (blau)<br />
<br />
==HAT-ID==<br />
'''Aufgebaut und erfolgreich getestet.'''<br />
<br />
Die [https://github.com/raspberrypi/hats Raspberry Pi HAT Specification] schließt einen I²C-EEProm ein. Dieser kann bei Bedarf bestückt werden:<br />
<br />
{| class="wikitable"<br />
! Menge || Referenz || Wert || Package || Reichelt Bestellcode<br />
|-<br />
| 1 || SJ1 || || SJ ||<br />
|-<br />
| 1 || C6 || 100n || C0603 || X7R-G0603 100N<br />
|-<br />
| 1 || R2 || 1k || R0603 || RND 0603 1 1,0K<br />
|-<br />
| 1 || IC2 || 24C32ASN || SO-08 || ST 24C32 MN6<br />
|-<br />
| 2 || R3, R4 || 3k3 || R0603 || RND 0603 1 3,3K<br />
|}<br />
<br />
Aktuell gibt es noch keine weitere Unterstützung hierfür. Es handelt sich also eher um ein Gimmick.<br />
<br />
Den EEProm kann man sich recht günstig von eBay-Modulen "abernten" - einfach im nächsten Abschnitt weiterlesen.<br />
<br />
==Real-Time-Clock==<br />
'''Aufgebaut und erfolgreich getestet.'''<br />
<br />
Da die Pirozeda-Software für das Logging eine gültige Uhrzeit benötigt, und es nach einem Stromausfall nicht sichergestellt ist, dass sich der Pi sofort nach dessen Start synchronisieren kann, kann eine RTC bestückt werden:<br />
<br />
{| class="wikitable"<br />
! Menge || Referenz || Wert || Package || Reichelt Bestellcode<br />
|-<br />
| 2 || R11, R12 || 0 || R0603 || RND 0603 1 0<br />
|-<br />
| 1 || C8 || 100n || C0603 || X7R-G0603 100N<br />
|-<br />
| 1 || B1 || 3003 || 3003 || KZH 20P<br />
|-<br />
| 2 || R6, R8 || 3k3 || R0603 || RND 0603 1 3,3K<br />
|-<br />
| 1 || IC1 || DS1307Z || SO08 || DS 1307Z<br />
|-<br />
| 1 || Q5 || TC38_SMD || TC38H_SMD || AUR Q-32.768000K<br />
|}<br />
<br />
Es ist noch anzumerken, dass der DS1307Z laut Datenblatt auch 3,3 V als IO-Spannung unterstützt. Zur Sicherheit habe ich für jedoch einen Levelshifter eingebaut (R5, R6, R7, R8, Q3, Q4), der jedoch durch die 0R-Widerstände R11 und R12 ersetzt werden kann.<br />
<br />
Der Levelshifter kann nach ersten Testes getrost weggelassen werden.<br />
<br />
Wem der DS1307 bei Reichelt zu teuer ist, kann sich bei eBay ein Modul mit dem Chip, passendem Quarz (der zufällig dem verwendeten entspricht) und einem ebenfalls passenden EEProm besorgen. Der Batteriehalter passt im aktuellen Design leider nicht.<br />
<br />
<gallery><br />
EBay-RTC-Module.jpg|RTC-Modul als Bauteilspender<br />
</gallery><br />
<br />
==Option: I²C(-OLED) + Taster==<br />
'''Noch nicht aufgebaut und getestet.'''<br />
<br />
Um noch weitere I²C-Devices anzuschließen, ist der Port auf eine Buchsenleiste herausgeführt. Diese ist so ausgerichtet, dass z. B. eines dieser 0,96" 128x64 Pixel OLEDs direkt angeschlossen werden kann. Da wohl teilweise VCC und GND vertauscht sind, kann durch Drehen von R29 und R30 die Polarität geändert werden:<br />
<br />
<gallery><br />
pirozeda_hat_0.1_i2c_polarity.png|Bestückungsvarianten für unterschiedliche Polarität der Versorgung<br />
</gallery><br />
<br />
{| class="wikitable"<br />
! Menge || Referenz || Wert || Package || Reichelt Bestellcode<br />
|-<br />
| 2 || R29, R30 || 0 || R0603 || RND 0603 1 0<br />
|-<br />
| 1 || SV3 || FE04-1R || FE04-1R || MPE 094-1-004<br />
|}<br />
<br />
Ferner gibt es Platz für einen Taster, der GPIO22 mit Masse verbinden kann. Damit es im Falle einer Fehlkonfiguration nicht zu einem harten Kurzschluss kommt, ist ein 100 Ohm-Widerstand vorgesehen:<br />
<br />
{| class="wikitable"<br />
! Menge || Referenz || Wert || Package || Reichelt Bestellcode<br />
|-<br />
| 1 || R31 || 100 || R0603 || RND 0603 1 100<br />
|-<br />
| 1 || S1 || KMR2 || KMR231GLFS || KMR 231 G LFS<br />
|}<br />
<br />
==Status-LEDs==<br />
'''Aufgebaut und erfolgreich getestet.'''<br />
<br />
Macht einfach drauf was ihr wollt, solange es LEDs im 0603-Package sind und der Vorwiderstand (im 0603-Package) dazu passt.<br />
<br />
{| class="wikitable"<br />
! Menge || Referenz || Wert || Package || Reichelt Bestellcode<br />
|-<br />
| 3 || R24, R25, R28 || 1k || R0603 || RND 0603 1 1,0K<br />
|-<br />
| 1 || LED1 || gn || CHIP-LED0603 ||<br />
|-<br />
| 2 || LED2, LED3 || or || CHIP-LED0603 ||<br />
|}<br />
<br />
LED1 (mitte) zeigt Aktivität an, LED2 (unten) ist mehr oder weniger die Power-LED. Mehr oder weniger, da sie beim Start der Firmware aktiviert wird (nicht aber im Bootloader). Dadurch kann man sehr schnell erkennen, ob sich die Hardware in einem Bootloop befindet.<br />
<br />
LED3 (oben) kann vom Raspberry Pi angesteuert werden.<br />
<br />
Standardmäßig sind in der <code>config.h</code> folgende Zeiten für LED1 eingestellt:<br />
<br />
* Start der Anwendung: 250 ms<br />
* Korrekt empfangene Nachrichten: 10 ms<br />
* Fehlerhaft empfangene Nachrichten: 200 ms<br />
<br />
Damit kann man auf den einen Blick erkennen, ob Daten vernünftig ankommen und verarbeitet werden können.<br />
<br />
=Aufbau der Hardware=<br />
==Bestücken der Leiterkarte==<br />
Die Hardware kann im Prinzip in beliebiger Reihenfolge aufgebaut werden. Trotzdem ist es ratsam, die großen/hohen Bauteile zuletzt aufzulöten.<br />
<br />
Die Steckkräfte einer 2x20 Buchsenleiste sind vergleichsweise groß. Diese können reduziert werden, indem nicht verwendete Pins aus der Buchsenleiste entfernt werden. Um diese nicht wieder (fragt nicht) zurückstecken zu müssen, hier eine Auflistung der benötigten Pins: 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 14, 15, 17, 20, 25, 27, 28, 30, 34, 37, 39.<br />
<br />
Oder einfach als Bild:<br />
<br />
<gallery><br />
Pirozeda_hat_0.1_buchsenleiste_pins.png|benötigte Pins (blau markiert)<br />
</gallery><br />
<br />
Der Wannenstecker lässt sich am einfachsten auflöten, wenn man die Pads auf einer Seite (egal welche) der Leiterkarte bisschen stärker verzinnt. Dadurch kann man den Konnektor ein wenig verklemmen und vor dem Verlöten besser ausrichten.<br />
<br />
==Zuleitung==<br />
<br />
Als Zuleitung habe ich für die ersten Muster den Artikel LIYY 614 (Steuerleitung 6x0,14mm², ungeschirmt) von Reichelt verwendet. Beim Bestellen habe ich leider mehr auf den Preis als die Schirmung geachtet. In Hinblick darauf, dass der Schirm der Buchse im Regler eh nicht mit Masse verbunden ist, ist es eine ziemliche Fummelarbeit, diese mit dem Massepin zu verbinden.<br />
<br />
Erkenntnisse über die maximale Leitungslänge gibt es noch nicht.<br />
<br />
Der Vorteil dieser Leitung ist: die Adern können direkt im Pfostenverbinder verpresst werden:<br />
<br />
<gallery><br />
Pirozeda_hat_0.1_pfosten.jpg<br />
</gallery><br />
<br />
Ich habe mich für folgende Farbgebung entschieden, beim Pinmapping selbst gibt es keine Wahl:<br />
<br />
{| class="wikitable"<br />
! Mini-DIN || Signal || Farbe || Wannenstecker<br />
|-<br />
| 3 || MISO || grau || 1<br />
|-<br />
| 4 || GND || braun || 3<br />
|-<br />
| 5 || 3V3 || rosa || 5<br />
|-<br />
| 6 || MOSI || grün || 2<br />
|-<br />
| 7 || SCK || gelb || 4<br />
|-<br />
| 8 || !CS || weiß || 6<br />
|}<br />
<br />
Beim Mini-DIN-Stecker sollte darauf geachtet werden, die äußere Hülle nicht komplett über den Rest zu stülpen, da die Buchse beim Regler ziemlich weit nach innen versetzt ist:<br />
<br />
<gallery><br />
Pirozeda_hat_0.1_minidin.jpg<br />
</gallery><br />
<br />
=Firmware=<br />
<br />
Grundsätzlich läuft die Firmware des Originaldesign auch mit der HAT-Hardware. Allerdings bleiben die LEDs dunkel und viele neue Features fehlen:<br />
<br />
Ab 0.2:<br />
<br />
* Status-LEDs<br />
* Uptime-Counter<br />
* Messung der Versorgungsspannung<br />
* Anzeigen von Bootinformationen<br />
** Resetgrund<br />
** Anzahl der vorherigen Reboots<br />
** Dauer der vorherigen Uptime<br />
** Fusecheck<br />
** Watchdog-Info<br />
** Aktivierte Nachrichten<br />
* Neustart + Wechsel in den Bootloader per Kommando<br />
* Statistik über empfangene Nachrichten (optional)<br />
* Timestamps (optional, aktuell nicht kompatibel mit der Backend-Software)<br />
* Erneutes übertragen der Headerinformationen<br />
* Kann die Firmware bei einem "Katzen-Paket" miauen. Einfach nur weil.<br />
<br />
==Konfiguration==<br />
<br />
Einige der Features müssen vor dem Kompilieren aktiviert bzw. eingestellt werden.<br />
Die Schalter und Defines hierfür befinden sich in zwei Header-Dateien:<br />
<br />
<code>config.h</code><br />
* <code>PIROZEDA_KITTY_DEBUG</code>: Anzeigen der "Katzen-Pakete" (Vorgabe: inaktiv)<br />
* <code>PIROZEDA_TIMESTAMPS</code>: Anzeigen der Timestamps (Vorgabe: inaktiv)<br />
* <code>PIROZEDA_WDT_TIMEOUT</code>: Timeout des Watchdogs (Vorgabe: 4 s)<br />
* <code>PIROZEDA_UPTIME</code>: Führen der Uptime, abrufbar über den Befehl (Vorgabe: aktiv)<br />
* <code>PIROZEDA_SUPPLY_AVGCNT</code>: Anzahl der Messwerte für die Mittelwertbildung der Systemspannung (Vorgabe: 10, maximal: 32)<br />
* <code>PIROZEDA_HEADERCNT</code>: Anzahl der Kopfzeilen-Datensätze, die nach dem Start oder Befehl <code>header</code> angezeigt werden (Vorgabe: 200, maximal: 255)<br />
* <code>PIROZEDA_STATUS_LED_BOOT</code>: Leuchtdauer der Status-LED nach dem Start (Vorgabe: 100 -> 250 ms, maximal: 255)<br />
* <code>PIROZEDA_STATUS_LED_RXOK</code>: Leuchtdauer der Status-LED bei empfangenem Paket (Vorgabe: 4 -> 10 ms, maximal: 255)<br />
* <code>PIROZEDA_STATUS_LED_RXERR</code>: Leuchtdauer der Status-LED bei einem Fehler (Vorgabe: 80 -> 200 ms, maximal: 255)<br />
* <code>BOOTLOADER_PASSWORD</code>: "Passwort" zum Wechsel in den Bootloader (Vorgabe: "FwUp", maximal 4 Zeichen, darf keine Teilstrings von Befehlen enthalten)<br />
<br />
<code>prozeda_cfg.h</code><br />
* <code>PROZEDA_USE_COLUMN_NAMES</code>: Verwenden der Spaltennamen (irrelevant für Pirozeda)<br />
* <code>PROZEDA_SUPPORT_DISPLAY</code>: Aktiviert den Empfang von Displaydaten (Vorgabe: aktiv)<br />
* <code>PROZEDA_SUPPORT_HEADER</code>: Aktiviert den Empfang von Kopfzeilen-Datensätzen (Vorgabe: aktiv)<br />
* <code>PROZEDA_IGNORE_KITTY</code>: Ignorieren von Katzen-Paketen, andernfalls werden Fehler ausgegeben (Vorgabe: aktiv)<br />
* <code>PROZEDA_MSG_MAXTICKS</code>: Ticks, nach denen ein Paket als abgeschlossen erkannt wird, sollte nur bei Anpassung der CPU-Frequenz angepasst werden (Vorgabe: 3)<br />
<br />
==Befehle==<br />
<br />
Neu ist ab v0.2, dass Befehle an den Mikrocontroller gesendet werden können. Je nach Konfiguration sind dies:<br />
<br />
* <code>reset</code>: Neustart <br />
* <code>uptime</code>: Anzeige der Laufzeit<br />
* <code>bootinfo</code>: Anzeigen der Infos, die auch beim (Neu-)Start angezeigt werden<br />
* <code>header</code>: Header werden gemäß <code>PIROZEDA_HEADERCNT</code> erneut ausgegeben<br />
* <code>stats</code>: Anzeigen der Statistik über empfangene Nachrichten und Empfangsfehler<br />
<br />
Alle Befehle sind Case-sensitive.<br />
<br />
==Flashen der Firmware==<br />
Mit den Möglichkeiten steigt die Komplexität. <br />
<br />
Dadurch dass der die Hardware für die Verwendung mit und ohne Bootloader ausgelegt ist, gibt es mehrere "Pfade" für das Flashen.<br />
Wer auf Nummer sicher gehen will, lädt einfach Bootloader und Firmware auf den Mikrocontroller herunter.<br />
Selbst wenn man "nur" die Variante mit unidirektionalem UART hat - die Brücken Versorgung und für den UART zum Mikrocontroller ist schneller gelötet als die Stiftleiste für den ISP-Port.<br />
<br />
Das Einlöten einer wahnsinnig hohen Stiftleiste kann übrigens umgangen werden, indem eine Stiftleiste in das Programmierkabel gesteckt und im Footprint der Buchse "verkeilt" wird. Wirklich keine Dauerlösung aber im Idealfall muss man es nur einmal machen.<br />
<br />
===Über Raspberry Pi===<br />
<br />
Zunächst muss, wenn nicht schon geschehen, über <code>sudo raspi-config</code> das SPI-Interface aktiviert (reboot nicht vergessen) und [https://www.mikrocontroller.net/articles/Raspberry_Pi_als_Universalprogrammer#Installation_der_Compiler AVRDUDE installiert] werden.<br />
<br />
Den Regler vom HAT trennen, nicht vergessen, dass R10 oder der Hotfix entfernt werden muss, falls der ADuM-Isolator verwendet und einseitig versorgt (also nicht auf dem Raspi steckt) wird und anschließend den SPI-Port mit SV2 verbinden.<br />
<br />
{| class="wikitable"<br />
! Signalname || Adapter SV2 Pin || Raspberry GPIO || Raspberry Pin <br />
|-<br />
| MISO || 1 || BCM 9 || 21<br />
|-<br />
| 3V3 || 2 || 3V3 || 17<br />
|-<br />
| SCK || 3 || BCM 11 || 23<br />
|-<br />
| MOSI || 4 || BCM 10 || 19<br />
|-<br />
| !RES || 5 || BCM 25 || 22<br />
|-<br />
| GND || 6 || GND || 20<br />
|}<br />
<br />
====Mit Bootloader====<br />
{{Infobox AVR<br />
| Typ = ATmega88PA<br />
| Takt = 12<br />
| FuseH = C5<br />
| FuseL = DE<br />
| FuseE = FC<br />
}}<br />
<br />
Die empfohlene Variante (auch wenn man nicht beabsichtigt, den Bootloader zu nutzen).<br />
<br />
Mit Bootloader sind das folgende Befehle:<br />
<br />
<source lang="shell"><br />
sudo /usr/local/bin/avrdude -c linuxspi -p m88p -P /dev/spidev0.0 -U lfuse:w:0xDE:m -U hfuse:w:0xC5:m -U efuse:w:0xFC:m<br />
sudo /usr/local/bin/avrdude -c linuxspi -p m88p -P /dev/spidev0.0 -U flash:w:"pirozeda_fboot_0.2.hex"<br />
</source><br />
<br />
====Ohne Bootloader====<br />
{{Infobox AVR<br />
| Typ = ATmega88PA<br />
| Takt = 12<br />
| FuseH = C5<br />
| FuseL = DE<br />
| FuseE = 07<br />
}}<br />
'cause I ain't gonna judge you<br />
<br />
<source lang="shell"><br />
sudo /usr/local/bin/avrdude -c linuxspi -p m88p -P /dev/spidev0.0 -U lfuse:w:0xDE:m -U hfuse:w:0xC5:m -U efuse:w:0x07:m<br />
sudo /usr/local/bin/avrdude -c linuxspi -p m88p -P /dev/spidev0.0 -U flash:w:"pirozeda_0.2.hex"<br />
</source><br />
<br />
==Update der Firmware==<br />
In Sachen Bootloader bin ich ein großer Fan von [https://www.mikrocontroller.net/articles/AVR_Bootloader_FastBoot_von_Peter_Dannegger Peter Danneggers Fastboot]. Er ist klein, schnell und zuverlässig.<br />
<br />
Um einen kleinen Unterschied zu machen, lautet das Passwort zum Starten nicht "Peda" sondern "FwUp", was ein kleines Problem mit sich bringt. "Peda" ist nicht nur der Spitzname vom Autor, das "a" wird zur automatischen Baudratenerkennung verwendet. Das von mir gewählte Passwort hat das nicht zu bieten. Was mir bei der Verwendung von [https://luani.de/projekte/updateloader/ UpdateLoader] aufgefallen ist: es funktioniert trotzdem. Ganz einfach, weil der Autor ein "a" voranstellt. Das funktioniert dann auch mit so gut wie allen anderen Download-Tools.<br />
<br />
===Mit Bootloader===<br />
<br />
Das Firmware-Update funktioniert nur bei bidirektionaler UART-Kommunikation mit dem Mikrocontroller, also bei der Variante Direkt und ADuM-Isolator. Wenn man mutig ist, kann man bei der Optokoppler-Variante R19 und R27 bestückt werden.<br />
<br />
In jedem Fall muss die Mikrocontroller-Seite mit Strom versorgt werden, also am einfachsten am Solarregler angeschlossen lassen.<br />
<br />
Berhard M. (boregard) hat das Programm [https://www.mikrocontroller.net/topic/73196#1067153 lboot] (auch im Download-Paket) geschrieben, das unter Linux mit dem schönen Fastboot von Peter Danegger spricht.<br />
<br />
Damit der Download funktioniert, muss das Pirozeda-Backend (und andere Software, die auf das UART-Interface zugreift) beendet werden.<br />
<br />
<source lang="shell"><br />
./bootloader -d /dev/serial0 -b 115200 -t 1024 -p pirozeda_0.2.hex -P aFwUp<br />
</source><br />
<br />
===Ohne Bootloader===<br />
siehe [[#Flashen_der_Firmware]]<br />
<br />
=Einrichten der Optionen=<br />
<br />
==HAT-ID==<br />
Wie bereits weiter oben geschrieben, ist der HAT-EEProm momentan eher ein Gimmick als wirklich genutztes Feature.<br />
<br />
Die Anwendung zur Generierung der Daten kann im [https://github.com/raspberrypi/hats/tree/master/eepromutils GitHub-Repo] vom Raspberry Pi heruntergeladen werden.<br />
<br />
Da der EEProm im normalen Betrieb schreibgeschützt ist, muss SJ1 gebrückt werden - am besten mit einem guten Klecks Lötzinn.<br />
<br />
Anschließend kann mit dem Script eepflash.sh (liegt dem Download-Paket bei) das EEProm-Image geschrieben werden:<br />
<br />
<source lang="bash"><br />
sudo ./eepflash.sh -w -f=pirozeda-hat_id.eep -t=24c32 -a=50<br />
</source><br />
<br />
Aktuell sind weder Product-ID noch Version-ID vergeben, ansonsten ist die Konfiguration wie folgt:<br />
<pre><br />
# Start of atom #0 of type 0x0001 and length 60<br />
# Vendor info<br />
product_uuid 9edc3aef-683c-4007-b2f2-3ea4969b1737<br />
product_id 0x0000<br />
product_ver 0x0000<br />
vendor "hobbyelektronik.org" # length=19<br />
product "Pirozeda HAT v0.1" # length=17<br />
# End of atom. CRC16=0x9a75<br />
<br />
<br />
# Start of atom #1 of type 0x0002 and length 32<br />
# GPIO map info<br />
gpio_drive 0<br />
gpio_slew 0<br />
gpio_hysteresis 0<br />
back_power 0<br />
# GPIO FUNCTION PULL<br />
# ---- -------- ----<br />
setgpio 22 INPUT UP<br />
setgpio 26 OUTPUT NONE<br />
</pre><br />
<br />
==RTC==<br />
<br />
Die [http://www.netzmafia.de/skripten/hardware/RasPi/Projekt-RTC/index.html Netzmafia] hat einen recht guten Artikel, wie man die hwclock bedient.<br />
<br />
Wer sich nicht einlesen will, hier im Schnelldurchlauf:<br />
<br />
Testen der RTC:<br />
<br />
<source lang="shell"><br />
#call bash as superuser, this is needed to get the echo working properly<br />
sudo bash<br />
modprobe rtc-ds1307<br />
echo "ds1307 0x68" > /sys/class/i2c-adapter/i2c-1/new_device<br />
#Auslesen der Uhr<br />
hwclock --debug -r<br />
exit<br />
</source><br />
<br />
Dauerhaftes aktivieren der RTC:<br />
<br />
<source lang="shell"><br />
sudo bash<br />
<br />
# enable module<br />
echo "# enable DS1307-RTC" >> /etc/modules<br />
echo "rtc-ds1307" >> /etc/modules<br />
<br />
# remove fake-hwclock<br />
update-rc.d -f fake-hwclock disable<br />
update-rc.d -f fake-hwclock remove<br />
apt-get remove fake-hwclock<br />
<br />
<br />
# overwrite prepared configuration of hwclock<br />
cp /etc/init.d/hwclock.sh ./hwclock.old<br />
cat ./hwclock.new > /etc/init.d/hwclock.sh<br />
<br />
# enable start/stop script<br />
update-rc.d hwclock.sh enable<br />
exit<br />
</source><br />
<br />
Laut Anleitung von Netzmafia muss die Datei <code>/etc/init.d/hwclock.sh</code> noch wie folgt angepasst werden:<br />
<br />
<source lang="text"><br />
Nun muss noch das Start/Stopp-Script für die RTC angepasst werden. <br />
Dazu wird (als root-User) die Datei /etc/init.d/hwclock.sh mit dem Editor bearbeitet. <br />
Zunächst tragen Sie am Anfang des Scripts die Default-Wert ein bzw. überprüfen diese:<br />
<br />
# These defaults are user-overridable in /etc/default/hwclock<br />
BADYEAR=no<br />
HWCLOCKACCESS=yes<br />
HWCLOCKPARS=' --noadjfile --utc'<br />
HCTOSYS_DEVICE=rtc0<br />
<br />
Nach der Zeile 'case "$1" in start)' werden die folgenden drei Zeilen auskommentieren ('#' davorsetzen):<br />
<br />
#if [ -d /run/udev ] || [ -d /dev/.udev ]; then<br />
# return 0<br />
#fi<br />
</source><br />
<br />
Um das zu vereinfachen, habe ich eine SH-Datei vorbereitet, natürlich muss sich diese (<code>hwclock.new</code>) im gleichen Verzeichnis liegen, damit es funktioniert.<br />
<br />
Im Ordner <code>options/rtc</code> befindet sich sowohl die <code>rtc-test.sh</code> als auch <code>rtc-enable.sh</code>.<br />
Da diese über meinen Windows-PC gewandert sind und dadurch ihre Dateieigenschaften verloren haben, müssen sie entweder als ausführbar markiert werden oder mit <code>/bin/bash</code> gestartet werden:<br />
<br />
<source lang="shell"><br />
sudo /bin/bash rtc-test.sh<br />
</source><br />
<br />
==I²C + Taster==<br />
Für die Verwendung des I²C muss eigentlich nur in <code>raspi-config</code> das I²C-Interface aktiviert werden.<br />
<br />
Mit der Konfiguration im ID-EEPRom wird der Taster in den Device-Tree eingebunden, allerdings kann er prinzipiell auch ohne angesprochen werden.<br />
<br />
=Backend=<br />
Das Back- und Frontend aus [[Pirozeda]] kann prinzipiell weiterverwendet werden.<br />
<br />
Es gibt allerdings noch keinen Support der neuen Features.<br />
<br />
=Leiterkarten=<br />
Es gibt noch unbestückte Leiterkarten. Wer eine will, kann sich gerne bei mir melden.<br />
<br />
=Mechanik=<br />
Im [[3D-Druck-Sammelsurium]] gibt es einen Spacer zwischen Raspberry Pi Zero und dem Hat.<br />
<br />
=Verbesserungsmöglichkeiten=<br />
* Korrektur der Reset-Beschaltung<br />
* ESD-Schutz hinzufügen. Aktuell können auf den Footprints von C7, C11 und C14 ESD-Schutzdioden wie B72500D50A60 von Reichelt bestückt werden. Allerdings ist die Positionierung nicht ideal<br />
* Stiftwanne für den SPI-Schnittstelle oben auf der Leiterkarte platzieren<br />
* Die Widerstände für die Direktverbindung so platzieren, dass sie für das Bootloader-Update einfacher bestückt werden können (oder gleich Jumper)<br />
* Hinzufügen der Batteriehalter der billigen RTC-Module (Recycling FTW!)<br />
* Entfernen des nicht benötigten I²C-Levelshifters<br />
* Vermeiden von Backfeed in der Direkt-Variante<br />
* Korrektur des fehlerhaften Footprints für den Raspberry Pi Zero (untere Löcher um 0,5 mm nach unten versetzt)<br />
<br />
=Download=<br />
[[Datei:Pirozeda_hat.zip]] enthält:<br />
* Designdaten im EAGLE-Format<br />
* Quellen des Bootloaders von Peter Dannegger<br />
* Quellen der Firmware + flashbare Images<br />
* Scripts für die Einrichtung der Optionen<br />
<br />
[[Kategorie:AVR]]<br />
[[Kategorie:Protokoll]]<br />
[[Kategorie:Reverse Engineering]]<br />
[[Kategorie:Raspberry Pi]]<br />
[[Kategorie:Solar-Anlage]]<br />
[[Kategorie:Pirozeda]]</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=VBus-Decoder&diff=1408VBus-Decoder2020-02-15T20:16:40Z<p>Qsysopr: /* Vbus-Adapter für den Raspberry Pi */</p>
<hr />
<div>[[Bild:Vbus regler.jpg|thumb|Das Corpus Delicti]]<br />
{{Infobox AVR<br />
| Typ = ATmega32<br />
| Takt = 12<br />
| FuseH = CF<br />
| FuseL = FF<br />
}}<br />
In unserer Solaranlage arbeitet ein Viessmann Vitosolic 200, der die Regelung der Anlage übernimmt.<br />
Nach kurzer Recherche stellte sich heraus, dass es sich um eine etwas angepasste Version des [http://www.resol.de/index/produktdetail/kategorie/1/id/9/sprache/de RESOL DeltaSol® M] handelt.<br />
<br />
Statt der RS232-Schnittstelle hat das Teil einen Anschluss für den Viessmann-eigenen KM-Bus, zu dem keinerlei Informationen verfügbar sind.<br />
<br />
Beim VBus sieht es schon ein wenig anders aus. In der [http://www.mikrocontroller.net/topic/96431 Diskussion] auf Mikrocontroller.net bin ich auf den Beitrag von [http://www.mikrocontroller.net/topic/96431#1231974 Daniel Wippermann] gestoßen, woraufhin ich an die angegebene Adresse eine E-Mail geschickt habe. <br />
<br />
Keine zweieinhalb Stunden später habe ich die Dokumentation (inklusive der Erlaubnis zur Veröffentlichung, siehe Download) zum Protokolls erhalten.<br />
<br />
=Hardwareschnittstelle=<br />
[[Bild:Resol sch.png|thumb|Wo Rx und Tx ist, muss erraten werden ;)]]<br />
Bei dem VBus handelt es sich um eine bidirektionale halbduplex Zweidrahtschnittstelle, die - entgegen diverser Meinungen - überhaupt keine Ähnlichkeiten zu RS485 hat.<br />
<br />
Der Master (Regel-Einheit) versorgt den Bus mit etwa 8,2V und 35mA (S. 4 in der Doku). Die Daten werden durch Spannungsabsenkung auf dem Bus übertragen.<br />
Mit der Schaltung auf Seite 5 des PDFs kann auf dem Bus sowohl gelesen, als auch geschrieben werden. Im Bild rechts meine Interpretation der Schaltung (in der noch die Abblockkondensatoren fehlen).<br />
<br />
Über die Buchse links kann man sich mit UART (nicht RS232!) mit 9600 Baud, 8 Datenbits, 1 Stoppbit ohne Parität mit dem Master unterhalten.<br />
<br />
Der in meiner Schaltung verwendete FET für die bidirektionale Kommunikation ist übrigens ein BS170<br />
<br />
=Protokoll=<br />
Das Protokoll des VBus ist in seiner Version 1.0 ziemlich gut handzuhaben.<br />
<br />
Folgendes Daten habe ich zum Testen verwendet:<br />
<pre><br />
0xAA, 0x10, 0x00, 0x21, 0x73, 0x10, 0x00, 0x01, 0x12, 0x38, <br />
0x5E, 0x04, 0x5E, 0x01, 0x05, 0x39 <br />
0x45, 0x01, 0x38, 0x22, 0x04, 0x5B <br />
0x38, 0x22, 0x38, 0x22, 0x05, 0x46 <br />
0x6C, 0x01, 0x38, 0x22, 0x05, 0x33 <br />
0x38, 0x22, 0x38, 0x22, 0x05, 0x46 <br />
0x38, 0x22, 0x38, 0x22, 0x05, 0x46 <br />
0x00, 0x00, 0x00, 0x00, 0x00, 0x7F <br />
0x00, 0x00, 0x00, 0x00, 0x00, 0x7F <br />
0x00, 0x00, 0x00, 0x00, 0x00, 0x7F<br />
0x38, 0x0F, 0x00, 0x00, 0x01, 0x37 <br />
0x47, 0x00, 0x00, 0x00, 0x00, 0x38 <br />
0x64, 0x64, 0x00, 0x00, 0x00, 0x37 <br />
0x00, 0x00, 0x00, 0x00, 0x00, 0x7F <br />
0x00, 0x00, 0x00, 0x00, 0x00, 0x7F <br />
0x00, 0x00, 0x43, 0x00, 0x00, 0x3C <br />
0x00, 0x00, 0x02, 0x00, 0x00, 0x7D <br />
0x01, 0x03, 0x60, 0x02, 0x04, 0x15 <br />
0x02, 0x00, 0x00, 0x00, 0x00, 0x7D<br />
</pre><br />
<br />
Zu allererst wird ein 10 Byte langer Kopf gesendet, der mit einem eindeutigen Sync-Wort (0xAA) beginnt. Eindeutig heißt: An keiner anderen Stelle im Protokoll wird das MSB belegt. Man kann sich also zu jedem beliebigen Zeitpunkt in den Bus einklinken!<br />
<br />
Gefolgt vom Sync-Wort kommen Ziel- und Quelladresse (0x0010 <= 0x7321), die Protokollversion (0x10), der ausgeführte Befehl (0x0100) und die Anzahl der danach folgenden Nutzpakete (0x12). Abschließend wird eine Prüfsumme (0x38) der zuvor gesendeten Daten übertragen.<br />
<br />
Im Anschluss des Headers werden n Datenframes mit je 6 Byte Länge geschickt. Die ersten 4 enthalten Nutzdaten, im 5. wird ein Septett geschickt und abschließend erfolgt wieder eine Checksum.<br />
<br />
Das Septett ist eine Ergänzung der zuvor gesendeten Nutzdaten. Da, wie oben erwähnt, das MSB nur im Sync-Wort vorkommen kann, dürfen folgende Daten kein höchstwertiges Bit enthalten. Dieses findet sich jeweils im Septett.<br />
<br />
Das ist auch schon das gröbste.<br />
Mit Protokollversion 2.0 und 3.0 habe ich mich noch nicht auseinandergesetzt, da diese zum Erfassen der Messwerte nicht benötigt werden.<br />
<br />
==Hintergrund==<br />
Noch eine kleine Hintergrundinformation, worum es sich bei der Ziel- und Quell-Adresse handelt.<br />
<br />
Die Quelladresse ist selbstverständlich der Regler (0x7321 = Vitosolic 200 [Regler]), die Zieladresse (0x0010) wird in der kompletten Dokumentation nur als DFA beschrieben. Dabei handelt es sich nicht um eine komische Umschreibung für einen Broadcast, sondern um die Daten für ein zusätzliches Gerät, der '''D'''aten'''f'''ern'''a'''nzeige.<br />
<br />
An diese sendet der Regler alle von ihm gemessenen Werte. Neben der Regler-Identität hat der Vitosolic 200 noch die Identitäten WMZ1 und WM2 (Wärmemengenzähler).<br />
<br />
=Software=<br />
Die Software ist, wie immer, in C geschrieben.<br />
Über den Befehl Vbus_ProcessChar() kann ein Zeichen von der seriellen Schnittstelle übergeben werden. Im einfachsten Fall kann die ISR-Routine wie folgt aussehen:<br />
<br />
<source lang="c"><br />
ISR (USART_RXC_vect) {<br />
Vbus_ProcessChar(UDR);<br />
}<br />
</source><br />
<br />
Vorher muss noch der UART initialisiert werden (9600 8N1, sei() nicht vergessen!).<br />
<br />
Die empfangenen und dekodierten Daten werden in der Variable vbus_outdata gespeichert.<br />
In dieser Variable muss auch angegeben werden, ob ein Paket gelesen werden soll:<br />
<pre><br />
vbus_outdata.update = 1;<br />
</pre><br />
<br />
Ist ein Paket vollständig angekommen, wird die valid-Eigenschaft auf 1 gesetzt. Im Demo-Code wird nach erfolgreichem Empfang das komplette Datenpaket am UART ausgegeben (bitte nicht an den Regler zurückschicken, sondern möglichst an den PC!):<br />
<br />
<source lang="c"><br />
int main() {<br />
<br />
...<br />
<br />
while(1) {<br />
if(vbus_outdata.valid == 1) {<br />
vbus_outdata.valid = 0;<br />
VBus_Show_Values();<br />
vbus_outdata.update = 1;<br />
}<br />
}<br />
}<br />
</source><br />
<br />
==Debug-Ausgabe==<br />
[[Bild:Vbus debug.jpg|thumb|Anzeige auf dem Display. die ICs unten und rechts gehören nicht zur Schaltung]]<br />
Der Debug in der Software gibt einige Informationen zur Dekodierung auf einem LC-Display aus.<br />
<br />
Dieser Modus kann in der Datei vbus.h Zeile 35 aktiviert werden (standardmäßig deaktiviert).<br />
<br />
Über UART würde eine Ausgabe kaum sinn machen, da man durch das langsame Senden den Empfang der Daten verpasst.<br />
<br />
Zugegebenermaßen: ich habe einen Exoten mit LC7980-Controller und einer Auflösung von 240x40 Pixel verwendet. Die Routinen lassen sich aber halbwegs einfach auf einen anderen Displaycontroller anpassen.<br />
Die Ausgabe auf dem Display sieht wie folgt aus:<br />
<br />
Bei jedem Erhalt eines Sync-Wortes wird "Sync" angezeigt.<br />
<br />
Wurde der Head empfangen, wird der Displayinhalt gelöscht und folgendes ausgegeben:<br />
<br />
<pre><br />
D:<Ziel-Adresse> S:<Quell-Adresse> V:<Protokoll-Version> C:<Befehl> F:<Anzahl Frames> X:<Prüfsumme ok|nok><br />
</pre><br />
<br />
Danach wird, wenn die Prüfsumme ok ist jedoch das falsche Protokoll angegeben wurde, die Meldung "!V1.0->dropped " ausgegeben.<br />
Hat das Paket das "falsche" Adress-Pärchen, wird "Wrong addr->dropped " angezeigt.<br />
<br />
Kommen diese beiden Meldungen nicht, werden Informationen über die dekodierten Frames ausgegeben:<br />
<br />
<pre><br />
F<Frame-Index><Prüfsumme ok|nok><br />
</pre><br />
<br />
Nachdem alle Frames empfangen wurden, wird ein "AFR" (all frames received) ausgegeben<br />
<br />
Im Ganzen kann solch eine Ausgabe wie folgt aussehen:<br />
<pre><br />
Sync [Display wird geleert]<br />
D:0x0010 S:0x7321 V:1 C:0x0100 F:18 X:ok F0ok F1ok F2ok F3ok F4ok F5ok F6ok F7ok F8ok F9nok F10ok F11ok F12ok F13ok F14nok F15ok F16ok F17ok AFR<br />
</pre><br />
<br />
Gleiches Beispiel mit meinen Testdaten, nur dass hier (im Gegensatz zu den Daten!!) Frame 9 und 14 ungültig sind.<br />
<br />
==Zuordnung der Datenfelder==<br />
Die Zuordnung der empfangenen Daten kann man relativ einfach zu den entsprechenden Feldern zuordnen.<br />
<br />
Im der Datei %ProgramFiles%\RESOL\ServiceCenterFull\eclipse\plugins\de.resol.servicecenter.vbus.<Device>\VBusSpecification<Device>.xml<br />
<br />
findet man alle Zuordnungen der Felder. Achtung: es kann Lücken geben - dadurch sind in meinem Code die "unknown"-Felder entstanden.<br />
<br />
==Bekannte Fehler/Macken==<br />
[[Bild:Vbus_putty_vs_rss.png|thumb|Daten meiner Auswertung (links) und die des Resol ServiceCenters]]<br />
Folgendes wurde noch nicht getestet/ist unbekannt:<br />
*Einstrahlung<br />
*Werte hinter der Fehler- & Warnungsmaske (muss ich noch in den XML-Dateien nachlesen)<br />
*Unbekannt-Felder<br />
** anscheinend immer 0x00<br />
*Woher kommt der Wochentag bei der Systemzeit<br />
<br />
Verbesserungswürdig an der Software:<br />
*RAM-Belegung<br />
*Unterstützung der weiteren Protokolle (Parametrisierung - werde ich aber vermutlich nicht in absehbarer Zeit implementieren)<br />
*Es ist nicht ersichtlich, welche Daten durch Prüfsummenfehler ungültig sind<br />
<br />
=Hardware für den PC=<br />
Vor geraumer Zeit habe ich ein kleines Design zum Mitlesen auf dem VBus am PC gemacht. In leicht abweichender Form wurde es auch aufgebaut und hat funktioniert. <br />
Das Leiterkärtchen ist etwa 27,5 x 23,2 mm groß und lässt sich direkt an einen D-Sub-Stecker anflanschen. Der MAX3232 erzeugt RS232-kompatible Pegel und die Versorgung wird vom VBus übernommen.<br />
<gallery><br />
Bild:Vbus_rxo_brd.png|thumb|Layout der PC-Hardware<br />
</gallery><br />
<br />
Die Daten für EAGLE befinden sich im Download-Bereich.<br />
<br />
=VBus-Adapter Nano=<br />
Die Hardware für den Empfang geht auch deutlich einfacher als in der Protokollbeschreibung und weiter oben auf der Seite gezeigt.<br />
<br />
Mit einer geschickten Beschaltung eines Komparators braucht man für die Hysterese genau einen Komparator und keinen einzigen Schmitt-Trigger.<br />
<br />
Das macht die Schaltung kompakt, billig und einfach aufzubauen. Ich hab einfach mal geschaut, wie klein man es machen kann, das Ergebnis lautet: 13x32,5 mm²:<br />
<br />
<gallery><br />
resol_nano_0.1_sch.png|Schaltplan<br />
resol_nano_0.1_assy_top.png|Bestückungsplan Oberseite<br />
resol_nano_0.1_assy_bot.png|Bestückungsplan Unterseite<br />
resol_nano_0.1_assy.jpg|Bestückte Leiterkarte<br />
</gallery><br />
<br />
Statt des Optokopplers OK1 und R1 sowie C1 können auch die 0-Ohm-Widerstände R10 und R11 bestückt werden, allerdings fällt dann die galvanische Trennung weg und es kann aufgrund der Vorwärtsspannung der Dioden zu einem GND-Offset kommen. Die Bestückungsoption ist allerdings nur der Vollständigkeit halber vorhanden, generell rate ich dazu, die nicht einmal 60 Cent zu investieren.<br />
<br />
Die drei Halblöcher dienen zum Platzsparenden fixieren mit M2,5-Schrauben.<br />
<br />
{| class="wikitable"<br />
! Menge || Referenz || Wert || Package || Reichelt Bestellcode <br />
|-<br />
| 1 || SV1 || || MA04-1 || <br />
|-<br />
| 2 || C2, C3 || 100n || C0603 || X7R-G0603 100N <br />
|-<br />
| 3 || R5, R7, R8 || 10k || R0603 || RND 0603 1 10K <br />
|-<br />
| 1 || C5 || 10u/16V || C1206 || KEM X7R1206 10U <br />
|-<br />
| 1 || R4 || 15k || R0603 || RND 0603 1 15K <br />
|-<br />
| 1 || X1 || 1751248 || 1751248 || AKL 059-02 <br />
|-<br />
| 2 || R3, R6 || 18k || R0603 || RND 0603 1 18K <br />
|-<br />
| 1 || R9 || 1k || R0603 || RND 0603 1 1K <br />
|-<br />
| 2 || C1*, C4 || 1n || C0603 || X7R-G0603 1,0N <br />
|-<br />
| 1 || R1* || 3k3 || R0603 || RND 0603 1 3,3K <br />
|-<br />
| 1 || R2 || 68k || R0603 || RND 0603 1 68K <br />
|-<br />
| 1 || OK1 || 6N136 || DIL08 || 6N 136 <br />
|-<br />
| 3 || D1, D2, D5 || BAV99 || SOT23 || BAV 99 NXP <br />
|-<br />
| 1 || IC4 || LM393D || SO08 || LM 393 D SMD <br />
|-<br />
| 1 || IC1 || LP2985IM5-5.0 || SOT23-DBV || LP 2985 IM5-5.0 <br />
|-<br />
| 1 || D3 || P6SMB 15A || SMBJ || P6SMB 15A SMD <br />
|}<br />
<br />
Zu den mit * markierten Bauteilen erhielt ich von Micha folgenden Hinweis:<br />
<pre><br />
Ich musste am Ausgang den C entfernen und den PullUp auf 4.7k erhöhen - sonst hat der Raspi das Low nicht erkannt.<br />
</pre><br />
<br />
'''Nachtrag vom 10.11.2019:''' Nach erneuten Messungen mit 3,3 V auf der Augangsseite stellte sich heraus, dass die Pegel deutlich besser werden, wenn für '''R1 ein 6,8 kOhm-Widerstand und für C1 ein 680 pF-Kondensator''' eingesetzt wird. Wie von Micha beschrieben, kann C1 auch einfach weggelassen werden. Mit dem Weglassen steigt allerdings die Gefahr von Glitches.<br />
<br />
Ich sollte die untenstehenden [[#Messung|Messungen]] also nochmal mit 3,3 Volt wiederholen. Ebenso möchte ich IC1 durch "TS 5205 CX533" ersetzen, der ein gutes Stück günstiger ist.<br />
<br />
==Aufbau==<br />
Der Aufbau kann nach dem üblichen Vorgehen erfolgen, hier ein paar Hinweise, die es vereinfachen<br />
* D3 vor D5 bestücken, da die Pads von D3 sehr klein ausfallen<br />
* Die Oberseite kann komplett vor der Unterseite bestückt werden. Die Stiftleiste und Anschlussklemmen sind so gut wie gleich hoch<br />
<br />
==Messung==<br />
Kommt auch das raus, was rauskommen soll?<br />
<br />
Die Spezifikation gibt ein paar Vorgaben:<br />
<br />
* Maximale Strombelastbarkeit: 35 mA<br />
* Schaltschwellen am Slave: 2,25 V Space, 2,00 V Mark<br />
<br />
So die Theorie. In der Praxis hat die Schaltung eine Stromaufnahme von etwa 3 mA.<br />
<br />
Den Rest musste ich an der echten Anlage messen, da in der Bastelecke weder ein Resol-Regler noch ein Protokollsimulator (der in diesem Fall relativ einfach ausfallen könnte) herumsteht.<br />
Also das Oszi eingepackt und die Schaltung bei meinen Eltern fliegend angeklemmt.<br />
<br />
Bei den Schaltschwellen sieht es wie folgt aus:<br />
<br />
<gallery><br />
resol_nano_0.1_meas_threshold.png|Ch1 hinter R8, Ch2 an ICE4A.1<br />
</gallery><br />
<br />
Die Schaltschwelle für die steigende Flanke liegt bei etwa 1,96 V, die für die fallende bei 2,44 V. In Hinblick auf die Messgenauigkeit des Oszilloskops und Toleranzen der Widerstände ein mehr als zufriedenstellendes Ergebnis.<br />
<br />
Der Optokoppler bringt leichte und vor allem asymmetrische Verzögerungen mit sich.<br />
<br />
Gemessen wird hier das Signal vor (Ch1 an OK1.3) und nach (Ch2 an OK1.6) dem Optokoppler. Als Stromversorgung auf der "rechten Seite" wurde eine Powerbank mit 5,1 V Ausgangsspannung verwendet. Als Schwellenwerte wurden jeweils 0,25 * Vcc und 0,75 * Vcc verwendet.<br />
<br />
<gallery><br />
resol_nano_0.1_meas_rising.png|Verzögerung steigende Flanke<br />
resol_nano_0.1_meas_falling.png|verzögerung fallende Flanke<br />
</gallery><br />
<br />
Bei steigender Flanke hängt der Ausgang 6,12 µs, bei fallender 8,68 µs hinterher.<br />
Die Verzögerung selbst ist hier nicht das Problem, sondern der Verzögerungsunterschied, da dieser die UART-Interfaces der Empfänger durcheinanderbringen kann.<br />
<br />
Bei den verwendeten 9600 Baud entspricht eine Bitzeit ca. 104 µs. Die Verzögerungsdifferenz der Flanken beträgt mit 2,56 µs lediglich 2,5 % einer Bitzeit. Vernachlässigbar.<br />
<br />
Wichtig ist ebenfalls, dass die Versorgungsspannung stabil bleibt, da sich sonst die Schaltschwellen verschieben und somit Unsinn übertragen wird. Besonders die Tatsache, dass der Optokoppler bei niedriger Busspannung aktiv ist, kann problematisch werden.<br />
<br />
Das Oszi-Bild mit Probe am 5V-Ausgang des Reglers und DC-Kopplung war so unspektakulär, dass ich gar keine Bildschirmaufnahme gemacht hab. Interessanter ist da die Betrachtung der Versorgung mit AC-Kopplung:<br />
<br />
<gallery><br />
resol_nano_0.1_noise.png|Überblick<br />
resol_nano_0.1_noise_zoom.png|Nahansicht<br />
</gallery><br />
<br />
Bisschen hohe Spikes, wobei diese auch mit dem Probing selbst zusammenhängen können (2x 20 cm Dupont-Drähte und EZ-Hooks), ansonsten nur knapp 10 mV Ripple. Passt soweit.<br />
<br />
==Troubleshooting==<br />
<br />
Nachdem ich schon ein paar Hilferufe erhalten habe, hier ein kleiner Troubleshooting-Guide - dazu am besten die beiden Bilder (oder zumindest das des Layouts) parallel öffnen:<br />
<br />
<gallery><br />
Resol_nano_0.1_ts_sch.png|Schaltplan mit Messpunkten<br />
Resol_nano_0.1_ts_brd.png|Layout mit Messpunkten<br />
</gallery><br />
<br />
Für die Messungen ist ein einfaches Multimeter und eine 9 V-Batterie ausreichend. Besser ist jedoch ein Labornetzteil.<br />
<br />
Um eine Ferndiagnose zu vereinfachen, bitte alle gemessenen Spannungen und Ströme notieren<br />
<br />
# Leiterkarte nochmal genau ansehen, irgendwelche Lötbrücken, wo keine sein sollten? (Ich weiß, sie ist verdammt eng)<br />
# Spannungsquelle auf 9 V einstellen, nachmessen und Spannung notieren. Sofern vorhanden sollte die Strombegrenzung auf etwa 20 mA eingestellt werden.<br />
# Spannungsquelle über das Multimeter für eine Strommessung an X1 anschließen (die Polarität ist egal)<br />
## Die Schaltung sollte im Ruhezustand nicht mehr als 3 mA aufnehmen. Ist es mehr oder riecht es "warm": sofort abstecken und nochmal alle Lötstellen prüfen und schauen, ob die richtigen Bauteile bestückt wurden<br />
## Mit Pinzette R5 (<code>S3-G1</code>) kurzschließen, der Strom sollte auf etwa 6 mA ansteigen. Wenn ja: die Wahrscheinlichkeit ist groß, dass alles ok ist :) - wenn nein: Weitermachen<br />
# Multimeter auf Spannungsmessung umstellen (umstecken nicht vergessen...)<br />
# Spannung über D3 (<code>S1-G1</code>) messen, diese sollte um die Durchflussspannung zweiter Dioden (ca. 1,3 V) geringer als die Eingangsspannung sein. Bei 9 V am Eingang sind das etwa 7,7 Volt. Wenn die Spannung deutlich niedriger ist, sind es ggf. die falschen Dioden verbaut. <br />
# Spannung über C5 (<code>S2-G1</code>) messen, sollte um die Durchflussspannung dreier Dioden (ca. 1,95 V) geringer sein als die Eingangsspannung. Bei 9 V am Eingang also um die 7 V. Wenn nicht, siehe letzter Punkt.<br />
# Ausgangsspannung des Reglers über C3 (Marker vergessen) messen, sollte ziemlich genau 5,0 V sein. Wenn nicht: Regler checken.<br />
# Spannung über C4 (<code>S3-G1</code>) messen, dieser sollte etwa der Hälfte der Sapnnung über D3 entsprechen. Ist der Wert grob daneben, die Widerstände R5 und R8 kontrollieren (2:1-Spannungsteiler) und prüfen, ob der Komparator (IC4) richtig eingelötet ist.<br />
# Spannung über R4 (<code>S4-G1</code>) messen, diese sollte ca. 2,03 V betragen. Wenn nicht, R2, R3 und R4 sowie IC4 prüfen.<br />
# Spannung über R7 (<code>S5-G1</code>) messen. Diese sollte ca. 1,79 V betragen. Wenn nicht: R6 und R7 sowie IC4 prüfen.<br />
# Nun können zusätzlich an SV1.1 3,3 V (oder 5V) und an SV1.4 GND angelegt werden (z. B. vom Raspberry Pi).<br />
## Im Ruhezustand sollte über C1 (<code>S6-G2</code>) 3,3 V anliegen, wenn nicht: R1 prüfen, C1 probehalber entfernen.<br />
## Wird R5 (<code>S3-G1</code>) kurzgeschlossen, sollte die Spannung über über C1 (<code>S6-G2</code>) auf "nahe 0 V" abfallen. Wenn sie nur leicht abfällt, R1 prüfen oder OK1 prüfen/tauschen.<br />
<br />
Sollte die Schaltung dennoch nicht funktionieren, bitte die notierten Spannungen sowie aussagekräftige Fotos (gut ausgeleuchtet, scharf, zugeschnitten) per E-Mail an mich senden.<br />
<br />
==Leiterkarten==<br />
Es gibt wieder Leiterkarten. Wer eine haben möchte, kann sich gerne bei mir melden.<br />
<br />
=VBus-Adapter für den Raspberry Pi=<br />
<br />
Die meisten werden ihre Solaranlage vermutlich über den Raspberry Pi (oder kompatbile) ins Netz bringen wollen. Deshalb gibt es nun auch eine Variante für den Kleincomputer.<br />
<br />
Damit sie sowohl am B-Modell als auch auf den Zero montiert werden können, ist sie trennbar. Damit der untere Teil im Fall der Verwendung am Zero nicht im Müll landen muss, befindet sich auf der Unterseite ein Punktraster im Abstand von 1,27 mm. Dort lässt sich gut mit SMD-Bauteilen (z. B. im 0603- oder SO-Gehäuse) basteln oder zumindest das Löten üben.<br />
<br />
Es war angedacht, die Leiterkarte abreißbar zu machen, was zumindest bei Version 1.0 nicht wirklich gut klappte. Bei Version 1.1 sind die Löcher etwas näher beieinander, daher sollte es hier besser funktionieren. Wer eine 1.0 bekommt und sie am Zero betreiben will, sollte sie auf jeden Fall mit der Säge kürzen.<br />
<br />
<gallery><br />
Vbuspi 1.1 assy sch.png|Schaltplan<br />
Vbuspi 1.1 assy top.png|Bestückungsplan Oberseite<br />
Vbuspi 1.1 assy bot.png|Bestückungsplan Unterseite<br />
Vbuspi 1.0 bare.jpg|Unbestückte Leiterkarte (v1.0)<br />
<br />
</gallery><br />
<br />
{| class="wikitable"<br />
! Menge || Referenz || Wert || Package || Reichelt Bestellcode<br />
|-<br />
| 2 || R10, R11 || 0 || R1206 || RND 0805 1 0<br />
|-<br />
| 2 || C2, C3 || 100n || C0603 || X7R-G0603 100N<br />
|-<br />
| 3 || R5, R7, R8 || 10k || R0603 || RND 0603 1 10K<br />
|-<br />
| 1 || C5 || 10u/16V || C1206 || KEM X7R1206 10U<br />
|-<br />
| 1 || R4 || 15k || R0603 || RND 0603 1 15K<br />
|-<br />
| 2 || X1, X4 || 1751248 || 1751248 || AKL 059-02<br />
|-<br />
| 2 || R3, R6 || 18k || R0603 || RND 0603 1 18K<br />
|-<br />
| 3 || R9, R24, R28 || 1k || R0603 || RND 0603 1 1,0K<br />
|-<br />
| 1 || C1 || 680p || C0603 || X7R 0603 CG 680P<br />
|-<br />
| 1 || C4 || 1n || C0603 || X7R-G0603 1,0N<br />
|-<br />
| 1 || R1 || 6k8 || R0603 || RND 0603 1 6,8K<br />
|-<br />
| 1 || R2 || 68k || R0603 || RND 0603 1 68K<br />
|-<br />
| 1 || OK1 || 6N136 || DIL08 || 6N 136<br />
|-<br />
| 3 || D1, D2, D5 || BAV99 || SOT23 || BAV 99 NXP<br />
|-<br />
| 1 || IC4 || LM393D || SO08 || LM 393 D SMD<br />
|-<br />
| 1 || IC1 || LP2985IM5-5.0 || SOT23-DBV || LP 2985 IM5-5.0<br />
|-<br />
| 1 || D3 || P6SMB 15A || SMBJ || P6SMB 15A SMD<br />
|-<br />
| 1 || X2 || || RPI_UNIV_UART || RND 205-00654<br />
|-<br />
| 1 || LED1 || gn || CHIP-LED0603 || LED EL 0603 GR1<br />
|-<br />
| 1 || LED3 || or || CHIP-LED0603 || LED EL 0603 OR<br />
|}<br />
<br />
Achtung: Die Vorwiderstände für die LEDs sind nicht getestet, die Bauteile in der BOM sind nur exemplarisch.<br />
<br />
==Fehler & Verbesserungen==<br />
<br />
Diese betreffen nur Leiterkarten der Version 1.0, in der noch nicht physisch vorhandenen 1.1 sollten sie behoben sein, eine Überprüfung steht aber noch aus.<br />
<br />
* Leiterkarte ist nicht durch abbrechen teilbar<br />
* Das mittlere Montageloch ist um 0,5 mm nach unten versetzt<br />
* Links oben ist die Leiterkarte nicht abgerundet (in den Gerber-Daten korrekt, in der Fertigung schief gegangen)<br />
* Die Schaltung selbst ist größtenteils durch den Nano erfolgreich getestet, der Einfluss der LEDs jedoch nicht<br />
<br />
==Leiterkarten==<br />
<br />
Es gibt noch Leiterkarten. Wer eine haben möchte, kann sich gerne bei mir melden.<br />
<br />
==Weiteres==<br />
<br />
Die [[3D-Druck-Sammelsurium#Raspberry_Pi_Zero_Spacer|Raspberry Pi Zero Spacer]] passen auch hier.<br />
<br />
=[[VBus-Decoder/FAQ|FAQ]]=<br />
(bitte auf die Überschrift klicken)<br />
<br />
=Python-Implementierung=<br />
Nicki hat sich die Arbeit gemacht und einen Code zum Auswerten der Nachrichten in Python portiert. Ich hatte selbst noch keine gute Gelegenheit, ihn zu testen - daher ohne Garantie und Gewährleistung:<br />
<br />
* [[Datei:VBus-Python.zip]]<br />
<br />
=Download=<br />
<br />
*[[Datei:VBus-Protokollspezifikation.pdf]] Stand: 20.04.2009<br />
*[[Datei:VbusDecode.zip]] Version 0.2beta vom 09.03.2010 ATmega32 @ 12MHz<br />
*[[Datei:Vbus_rxo.zip]] Design-Daten für die PC-Hardware. Erstellt mit EAGLE 7.5.0<br />
*[[Datei:Vbus_nano.zip]] EAGLE-Dateien und LTspice-Simulationsdaten für den VBus-Nano<br />
*[[Datei:Vbus_pi.zip]] EAGLE-Dateien Adapter für den Raspberry Pi<br />
<br />
'''An dieser Stelle noch einmal vielen Dank an Resol für die Bereitstellung der Informationen und die Erlaubnis, diese hier weiter zu verteilen!'''<br />
<br />
=Weblinks=<br />
* [http://www.mikrocontroller.net/topic/96431 Diskussion auf Mikrocontroller.net] (gleicher Link wie in der Einleitung)<br />
* [http://www.resol.de RESOL - Elektronische Regelungen GmbH]<br />
* [http://www.resol.de/index/produktdetail/kategorie/1/id/9/sprache/de DeltaSol® M] Regler, der dem Viessmann Vitosolic 200 "alt" in ziemlich genau entspricht<br />
<br />
[[Kategorie:AVR]]<br />
[[Kategorie:Energieerfassung]]<br />
[[Kategorie:Solar-Anlage]]</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=Datei:Vbuspi_1.0_bare.jpg&diff=1407Datei:Vbuspi 1.0 bare.jpg2020-02-15T20:15:32Z<p>Qsysopr: Qsysopr verschob die Seite Datei:Vbuspi nano 1.0 bare.jpg nach Datei:Vbuspi 1.0 bare.jpg, ohne dabei eine Weiterleitung anzulegen</p>
<hr />
<div></div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=Datei:EBay-RTC-Module.jpg&diff=1320Datei:EBay-RTC-Module.jpg2019-03-21T21:03:17Z<p>Qsysopr: Qsysopr verschob die Seite Datei:Rtc.jpg nach Datei:EBay-RTC-Module.jpg, ohne dabei eine Weiterleitung anzulegen: dummer Name</p>
<hr />
<div></div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=EAGLE-BOM&diff=1233EAGLE-BOM2019-02-10T21:18:24Z<p>Qsysopr: Qsysopr verschob die Seite EAGLE-BOM für MediaWiki nach EAGLE-BOM: wird bisschen universeller ;)</p>
<hr />
<div>Ein von Bastlern viel zu selten benutztes Feature in vermutlich egal welcher EDA-Software ist die BOM.<br />
<br />
Da ich in der Hinsicht über die Zeit besser geworden bin und diese in den meisten meiner EAGLE-Projekte pflege, kommt sie in aller Regel auch auf die entsprechende Artikel-Seite hier im Wiki.<br />
<br />
Bis jetzt war es allerdings so, dass ich sie nach Excel exportiert habe und die Formatierung für MediaWiki manuell vorgenommen habe.<br />
<br />
Warum nicht einfach das ULP anpassen, damit es direkt Tabellen für MediaWiki ausspucken kann?<br />
<br />
Gesagt, getan:<br />
<br />
<gallery><br />
eagle_bom.png|Screenshot des angepassten BOM-ULP<br />
</gallery><br />
<br />
Als Basis diente die in EAGLE 7.3.0 mitgelieferte ULP.<br />
<br />
=Installation=<br />
Den Inhalt der ZIP-Datei einfach in den ULP-Ordner von EAGLE kopieren, dann mit "run bom" ausführen oder übers Menü Datei -> Exportieren -> BOM.<br />
<br />
=Download=<br />
[[Datei:eagle_bom_mw.zip]]<br />
<br />
[[Kategorie:Sonstiges]]<br />
[[Kategorie:Software]]<br />
[[Kategorie:Kleine Helferlein]]<br />
[[Kategorie:EAGLE]]</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=EAGLE-BOM_f%C3%BCr_MediaWiki&diff=1234EAGLE-BOM für MediaWiki2019-02-10T21:18:24Z<p>Qsysopr: Qsysopr verschob die Seite EAGLE-BOM für MediaWiki nach EAGLE-BOM: wird bisschen universeller ;)</p>
<hr />
<div>#WEITERLEITUNG [[EAGLE-BOM]]</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=Hobbyelektronik.org:Impressum&diff=1105Hobbyelektronik.org:Impressum2017-05-11T20:23:34Z<p>Qsysopr: Abschnitt zu Werbung nach oben verschoben.</p>
<hr />
<div>=Angaben gemäß § 5 TMG=<br />
<br />
Diese Homepage wird betrieben durch:<br />
<br />
Christof Rueß<br /><br />
St.-Wendelin-Str. 9<br /><br />
89264 Weißenhorn<br /><br />
<br />
==Kontakt==<br />
Bei Fragen bitte per E-Mail an mich wenden:<br />
<br />
E-Mail: chris at hobbyelektronik punkt org<br /><br />
E-Mail via GPG: chris-crypt at hobbyelektronik punkt org [//hobbyelektronik.org/chris-crypt.asc Public Key] (oder einfach auf sks-keyservers.net suchen)<br />
<br />
Kein Facebook, kein WhatsApp und auch keine anderen Plattformen.<br />
<br />
Sollte E-Mail zur Kommunikation nicht ausreichen, kann auch eine Telefonnummer angefragt werden. Sollte dies nicht zwingend erforderlich sein, bitte ich jedoch Abstand davon zu nehmen.<br />
<br />
=Werbung=<br />
Was vielen auf dieser Homepage dank Werbeblocker wahrscheinlich gar nicht auffällt: Es gibt keine Werbung.<br />
<br />
Ich hab zwar schon ein-/zweimal mit dem Gedanken gespielt, welche zu schalten aber komme dann immer wieder auf einen Punkt zurück: ich/wir machen das aus Spaß und Werbung hat (zumindest bei mir) einen kommerziellen Charakter oder zumindest schalen Beigeschmack – das möchte ich nicht.<br />
<br />
Auch habe ich mittlerweile schon ein paar Mailanfragen für Kooperationen und „Sponsored Posts“ bekommen, auf die ich – obwohl es natürlich verlockend ist – nicht eingehe. Zum Einen aus den oben genannten Gründen, zum Anderen möchte ich das Ganze hier möglichst ehrlich und authentisch (mit allen Vor- und Nachteilen) halten.<br />
<br />
Heißt: ich vertrete meine Meinung und nicht die anderer. Wenn hier im Blog, im Wiki oder sonstwo steht, dass etwas toll oder bescheiden ist, handelt es sich um eine persönliche Meinung. Die muss zwar nicht unbedingt richtig sein, aber es wurde zumindest nicht durch externe Einflussnahme geschrieben.<br />
<br />
'''Nachtrag 15.04.2016: Nachdem in letzter Zeit immer mehr Mails von irgendwelchen Agenturen kommen: Ich möchte diese Angebote ausdrücklich nicht! Jede Person, die diesen Wunsch missachtet, ist aufgefordert, die Hosting-Kosten für einen Monat zu übernehmen.'''<br />
<br />
=Haftungsausschluss=<br />
<br />
==Haftung für Inhalte==<br />
<br />
Als Diensteanbieter sind wir gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen. Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werden wir diese Inhalte umgehend entfernen.<br />
<br />
Die auf dieser Homepage bereitgestellten Inhalte wurden nach bestem Wissen und Gewissen erarbeitet und recherchiert. Trotzdem können Fehler nicht ausgeschlossen werden und daher keine Garantie auf Vollständigkeit und Korrektheit der bereitgestellten Informationen gegeben.<br />
<br />
Ferner wird keine Haftung für direkte und indirekte Schäden übernommen, die durch das Lesen oder das Auf- bzw. Nachbauen von Schaltungen und Aufbauten oder deren Inbetriebnahme bzw. das Nachstellen von beschriebenen Vorgehensweisen oder Techniken entstehen können.<br />
<br />
Dies gilt insbesondere für Schaltungen oder Anordnungen, die für den Menschen gefährliche Einflussgrößen wie zum Beispiel elektrischen Strom, Spannungen, Chemikalien oder Strahlungen erfordern oder hervorbringen.<br />
<br />
==Haftung für Links==<br />
<br />
Unser Angebot enthält Links zu externen Webseiten Dritter, auf deren Inhalte wir keinen Einfluss haben. Deshalb können wir für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Die verlinkten Seiten wurden zum Zeitpunkt der Verlinkung auf mögliche Rechtsverstöße überprüft. Rechtswidrige Inhalte waren zum Zeitpunkt der Verlinkung nicht erkennbar. Eine permanente inhaltliche Kontrolle der verlinkten Seiten ist jedoch ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumutbar. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Links umgehend entfernen.<br />
<br />
==Urheberrecht==<br />
<br />
Die durch die Seitenbetreiber erstellten Inhalte und Werke auf diesen Seiten unterliegen dem deutschen Urheberrecht. Die Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung außerhalb der Grenzen des Urheberrechtes bedürfen der schriftlichen Zustimmung des jeweiligen Autors bzw. Erstellers. Downloads und Kopien dieser Seite sind nur für den privaten, nicht kommerziellen Gebrauch gestattet. Soweit die Inhalte auf dieser Seite nicht vom Betreiber erstellt wurden, werden die Urheberrechte Dritter beachtet. Insbesondere werden Inhalte Dritter als solche gekennzeichnet. Sollten Sie trotzdem auf eine Urheberrechtsverletzung aufmerksam werden, bitten wir um einen entsprechenden Hinweis. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Inhalte umgehend entfernen.<br />
<br />
==Lizenz==<br />
<br />
Alle vom Seitenbetreiber erstellten Inhalte unterliegen, soweit nicht anders gekennzeichnet, der Lizenz Creative Commons - Attribution-NonCommerial-ShareAlike 3.0 (kurz: CC BY-NC-SA 3.0). <br />
<br />
=Datenschutzerklärung=<br />
<br />
==Datenschutz==<br />
<br />
Die Betreiber dieser Seiten nehmen den Schutz Ihrer persönlichen Daten sehr ernst. Wir behandeln Ihre personenbezogenen Daten vertraulich und entsprechend der gesetzlichen Datenschutzvorschriften sowie dieser Datenschutzerklärung.<br />
<br />
Die Nutzung unserer Webseite ist in der Regel ohne Angabe personenbezogener Daten möglich. Soweit auf unseren Seiten personenbezogene Daten (beispielsweise Name, Anschrift oder E-Mail-Adressen) erhoben werden, erfolgt dies, soweit möglich, stets auf freiwilliger Basis. Diese Daten werden ohne Ihre ausdrückliche Zustimmung nicht an Dritte weitergegeben.<br />
<br />
Wir weisen darauf hin, dass die Datenübertragung im Internet (z.B. bei der Kommunikation per E-Mail) Sicherheitslücken aufweisen kann. Ein lückenloser Schutz der Daten vor dem Zugriff durch Dritte ist nicht möglich.<br />
<br />
==Cookies==<br />
<br />
Die Internetseiten verwenden teilweise so genannte Cookies. Cookies richten auf Ihrem Rechner keinen Schaden an und enthalten keine Viren. Cookies dienen dazu, unser Angebot nutzerfreundlicher, effektiver und sicherer zu machen. Cookies sind kleine Textdateien, die auf Ihrem Rechner abgelegt werden und die Ihr Browser speichert.<br />
<br />
Die meisten der von uns verwendeten Cookies sind so genannte „Session-Cookies“. Sie werden nach Ende Ihres Besuchs automatisch gelöscht. Andere Cookies bleiben auf Ihrem Endgerät gespeichert, bis Sie diese löschen. Diese Cookies ermöglichen es uns, Ihren Browser beim nächsten Besuch wiederzuerkennen.<br />
<br />
Sie können Ihren Browser so einstellen, dass Sie über das Setzen von Cookies informiert werden und Cookies nur im Einzelfall erlauben, die Annahme von Cookies für bestimmte Fälle oder generell ausschließen sowie das automatische Löschen der Cookies beim Schließen des Browser aktivieren. Bei der Deaktivierung von Cookies kann die Funktionalität dieser Website eingeschränkt sein.<br />
<br />
==Server-Log-Files==<br />
<br />
Der Provider der Seiten erhebt und speichert automatisch Informationen in so genannten Server-Log Files, die Ihr Browser automatisch an uns übermittelt. Dies sind:<br />
<br />
* Browsertyp/ Browserversion<br />
* verwendetes Betriebssystem<br />
* Referrer URL<br />
* Hostname des zugreifenden Rechners, IP in gekürzter Form<br />
* Uhrzeit der Serveranfrage<br />
<br />
Diese Daten sind nicht bestimmten Personen zuordenbar. Eine Zusammenführung dieser Daten mit anderen Datenquellen wird nicht vorgenommen. Wir behalten uns vor, diese Daten nachträglich zu prüfen, wenn uns konkrete Anhaltspunkte für eine rechtswidrige Nutzung bekannt werden.<br />
<br />
<br />
Quelle e-recht24.de (angepasst)</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=Prozeda-Decoder&diff=1097Prozeda-Decoder2017-04-15T16:46:16Z<p>Qsysopr: Farben für manuelles Highlighting sind nun in den Common styles</p>
<hr />
<div>[[Datei:Prozeda_regler.jpg|thumb|RATIOfresh 200 von Wagner Solar]]<br />
"Funktioniert das auch mit meiner Solaranlage?" ist eine immer wiederkehrende Frage, nachdem ich den Artikel zum [[VBus-Decoder]] veröffentlicht habe. "Vielleicht, aber wahrscheinlich eher nein", war die häufigste Antwort. <br />
<br />
So in etwa auch bei der E-Mail von Frank und seiner RATIOfresh 200 von Wagner & Co Solartechnik, die er an den PC bzw. einen Single Board Computer (wie den Raspberry Pi) anbinden möchte um sich das ewige Gerenne in den Keller und das Auslesen des Datenloggers zu sparen.<br />
<br />
Die anfängliche Vermutung, dass der Regler von Resol kommt verflog relativ schnell (Es gab wohl einen Wechsel der Plattform), tatsächlich handelt es sich um ein Gerät von Prozeda.<br />
<br />
Ein paar Mails später gab es einen Link auf ein [http://www.forum-raspberrypi.de/Thread-projekt-solar-data-logger Raspberry Pi-Forum] - bis auf einen toten Link waren die Informationen relativ karg, außer dass in dem Datastick, der zum Loggen der Betriebsdaten verwendet wird, ein AT45DB081D steckt und am PC ein FTDI2232 im GPIO-Mode verwendet wird und wie die Pinbelegung am Datastick (oder der Buchse am Regler?) ist. Leider ist die Diskussion versandet und es gab keine weiteren Informationen.<br />
<br />
Aber ich war am Haken ;-)<br />
<br />
=Der Datenstick=<br />
Wie bereits erwähnt verbirgt sich im Stick nichts mehr als ein Atmel [http://www.atmel.com/images/doc2225.pdf AT45DB081D] - ein 8 MBit großer Flash-Speicher mit SPI als Interface.<br />
<br />
Dieser wird über einen 8-poligen Mini-DIN-Stecker mit dem Regler bzw. dem Adapter zum Auslesen am PC verbunden.<br />
<br />
<gallery><br />
Prozeda_stick.jpg|Der zerlegte Stick<br />
Prozeda_buchse.jpg|Buchse am Regler<br />
</gallery><br />
{| class="wikitable"<br />
! Pin || Bezeichnung<br />
|-<br />
| 1 || 17 V<br />
|-<br />
| 2 || unbekannt<br />
|-<br />
| 3 || MISO<br />
|-<br />
| 4 || GND<br />
|-<br />
| 5 || 3,3 V<br />
|-<br />
| 6 || MOSI<br />
|-<br />
| 7 || SCK<br />
|-<br />
| 8 || !CS<br />
|}<br />
<br />
==Datenformat==<br />
Mit der PC-Software lassen sich die Daten vom Logger sowohl als Rohdaten als auch im CSV-Format auf dem PC speichern. Beide Datensätze habe ich bekommen:<br />
<br />
<pre><br />
aa5540052401ffffffffffffffffff0020205761676e6572202620436f2000000000000000000000000020536f6c617220536f6c6172746563686e696b20...<br />
</pre><br />
<br />
<pre style="overflow: auto"><br />
;Datalogging<br />
; Wagner & Co <br />
;<br />
; Solartechnik <br />
XXXXXXXXXXXXXXXX<br />
; System-Nr. XXXX<br />
; System-Ver. XXX<br />
Datum Uhrzeit Kollektor Speicher unten Speicher oben Rücklaufanh. Rücklaufanh. T T Primär Vorlauf Kaltwasser T Frischwasser Ausgang 1 Ausgang 2 Ausgang 3 Ausgang 4 Ausgang 5 Ausgang 6 Ausgang 7 unused Speicher Speicher Funktion aktiv Funktion aktiv Funktion aktiv Funktion aktiv Durchfluss Zapfung<br />
8 9 1 1 1 1 1 1 1 1 1 1 1 10 10 10 10 10 10 10 10 7 15 11 11 11 11 19 27<br />
<br />
09.11.16 18:44:00 -2.100 45.800 48.000 225.100 225.100 225.100 225.100 63.200 46.800 150.700 54.300 0.000 0.000 0.000 0.000 100.000 8.000 0.000 0.000 0 2249 0.100 0.200 0.100 0.200 0.000 -0.400<br />
09.11.16 18:44:00 -2.100 45.700 48.000 228.300 228.300 228.300 228.300 63.300 46.200 200.400 54.400 0.000 0.000 0.000 0.000 100.000 9.000 0.000 0.000 0 2249 0.100 0.200 0.100 0.200 0.000 -0.200<br />
09.11.16 18:44:00 -2.000 45.600 47.900 228.300 228.300 228.300 228.300 63.300 45.800 200.400 54.300 0.000 0.000 0.000 0.000 100.000 7.000 0.000 0.000 0 2249 0.100 0.200 0.100 0.200 0.000 -0.500<br />
09.11.16 18:44:00 -2.000 45.600 47.900 231.000 231.000 231.000 231.000 63.300 45.700 225.200 54.300 0.000 0.000 0.000 0.000 100.000 6.000 0.000 0.000 0 2249 0.100 0.200 0.100 0.200 0.000 -0.600<br />
09.11.16 18:44:00 -2.100 45.500 47.900 231.000 231.000 231.000 231.000 63.300 45.500 225.200 54.500 0.000 0.000 0.000 0.000 100.000 7.000 0.000 0.000 0 2249 0.100 0.200 0.100 0.200 0.000 -0.500<br />
09.11.16 18:44:00 -2.000 45.500 47.800 233.300 233.300 233.300 233.300 63.300 45.500 237.600 54.500 0.000 0.000 0.000 0.000 100.000 8.000 0.000 0.000 0 2249 0.100 0.200 0.100 0.200 0.000 -0.400<br />
</pre><br />
Die Systemkennziffern (Seriennummer, System-Nr. und -Version) habe ich durch "X" ersetzt.<br />
<br />
Die Binärdatei gehört eindeutig zur CSV, nur wie ist der Zusammenhang?<br />
Einen Schritt zurück - erstere ist genau 2048 KiB groß, der verwendete Flash-Speicher aber nur 1 MiB. Beim Blick in die Datei: das sieht alles ziemlich hexadezimal aus.<br />
<br />
Um schnell zum Ziel zu kommen und die Codeeffizient erst einmal egal ist, habe ich PHP verwendet um die Daten umzuwandeln:<br />
<br />
<source lang="php"><br />
function convert($infile, $outfile)<br />
{<br />
$if = fopen($infile, "rb");<br />
$of = fopen($outfile, "wb");<br />
<br />
while(!feof($if))<br />
{<br />
$str = fread($if, 2);<br />
fwrite($of, hex2bin($str));<br />
}<br />
<br />
fclose($if);<br />
fclose($of);<br />
}<br />
</source><br />
<br />
Nach ein paar Sekunden konnte ich das Ergebnis in HxD bewundern:<br />
<br />
<pre><br />
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F<br />
<br />
00000000 AA 55 40 05 24 01 FF FF FF FF FF FF FF FF FF 00 ªU@.$.ÿÿÿÿÿÿÿÿÿ.<br />
00000010 20 20 57 61 67 6E 65 72 20 26 20 43 6F 20 00 00 Wagner & Co ..<br />
00000020 00 00 00 00 00 00 00 00 00 00 20 53 6F 6C 61 72 .......... Solar<br />
00000030 20 53 6F 6C 61 72 74 65 63 68 6E 69 6B 20 XX XX Solartechnik XX<br />
00000040 XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX<br />
00000050 20 20 53 79 73 74 65 6D 2D 4E 72 2E 20 20 XX XX System-Nr. XX<br />
00000060 20 53 79 73 74 65 6D 2D 56 65 72 2E 20 20 XX XX System-Ver. XX<br />
...<br />
</pre><br />
[[Prozeda-Decoder/Flashimage16|mehr Daten]]<br />
<br />
Das sieht doch gut aus!<br />
<br />
===Speichersegmente===<br />
<br />
Die nun sichtbaren Daten erzeugen den Eindruck von 3 Datenbereichen:<br />
<br />
{| class="wikitable"<br />
! Start-Adresse || Ende-Adresse || Länge || Inhalt<br />
|-<br />
| 0x00000 || 0x0006F || 0x0006F || Systeminfo<br />
|-<br />
| 0x00200 || 0x0043F || 0x00240 || Spaltenbeschreibung<br />
|-<br />
| 0x00500 || 0xFFFFF || 0xFFB00 || Loggingdaten<br />
|}<br />
<br />
===Systeminfo===<br />
<br />
Die ersten beiden Byte auf dem Flash lauten 0xAA 0x55, die schon beim Initialisieren des Sticks geschrieben werden. Gleiches gilt für das dritte Byte (Adresse 0x00002), das vermutlich das Logging-Intervall repräsentiert. Leider konnte ich das bis jetzt noch nicht so richtig nachvollziehen.<br />
<br />
Ab Offset 0x00010 befindet sich der Herstellername der Solaranlage. Am Anschluss - ab Offset 0x0003E steht die 18-stellige Seriennummer und ab 0x00050 die Systemnummer, wobei der eigentliche Wert bei 0x0005E mit Länge 2 liegt. Gleiches gilt für die Systemversion, die ab Offset 0x00060 beschrieben und der eigentliche Wert bei 0x0006E - ebenfalls mit Länge 2 liegt.<br />
<br />
Die beiden letzteren Werte für letztere Bezeichner sind binär Little-Endian abgespeichert, aus 0x12 0x34 würde also 0x3412 bzw. 13330 werden.<br />
<br />
===Spaltenbeschreibung===<br />
<br />
Die Spaltenbeschreibungen sind wie folgt aufgebaut: 16 Zeichen lang, 15 davon sind NULL-terminierte ASCII-Strings gefolgt von einem weiteren Zeichen:<br />
<br />
<pre><br />
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F<br />
...<br />
00000200 20 20 20 20 44 61 74 75 6D 20 20 20 20 20 00 08 Datum ..<br />
00000210 20 20 20 55 68 72 7A 65 69 74 20 20 20 20 00 09 Uhrzeit ..<br />
00000220 20 53 65 6B 75 6E 64 65 6E 20 00 00 00 00 00 10 Sekunden ......<br />
00000230 20 20 4B 6F 6C 6C 65 6B 74 6F 72 20 20 20 00 01 Kollektor ..<br />
00000240 20 20 53 70 65 69 63 68 65 72 20 B9 20 20 00 01 Speicher ¹ ..<br />
...<br />
</pre><br />
<br />
Eine Besonderheit stellen offenbar die ASCII-Zeichen 0xB9 und 0xB3 dar - diese werden beim Auslesen nach "unten" und "oben" übersetzt.<br />
<br />
Dieses letzte Zeichen spiegelt sich in der Zeile nach den Spaltenköpfen in der CSV-Datei wider. Nach genauerer Betrachtung ergibt sich folgende (mutmaßliche) Zuordnung:<br />
<br />
{| class="wikitable"<br />
! Wert (Hex) || Datentyp || Länge<br />
|-<br />
| 00 || Dummy || 2?<br />
|-<br />
| 01 || Temperatur || 2<br />
|-<br />
| 07 || Speicher || 4?<br />
|-<br />
| 08 || Datum || 2<br />
|-<br />
| 09 || Uhrzeit || 2<br />
|-<br />
| 0A || Ausgang || 1<br />
|-<br />
| 0D || Fehler || 1?<br />
|-<br />
| 0E || Fehler || 2?<br />
|-<br />
| 0F || Speicher || 2?<br />
|-<br />
| 10 || Sekunden || 2<br />
|-<br />
| 13 || Durchfluss || 2<br />
|-<br />
| 1B || Zapfung || 2<br />
|}<br />
<br />
Zur Länge später mehr.<br />
<br />
===Loggingdaten===<br />
Ab Adresse 0x00500 wird es interessant, hier befindet sich die Payload. Als "Trick" um die Datenlänge besser ermitteln zu können hat sich bewährt, die Anzeigebreite des Hex-Editors auf Fenstergröße anpassen zu lassen und dann die Breite des Fensters zu variieren. Dadurch lassen sich Wiederholungen besser erkennen. So bei 64 Byte Breite:<br />
<br />
<pre style="overflow: auto"><br />
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C <br />
...<br />
00000500 55 04 64 04 2F 00 EB FF CA 01 E0 01 CB 08 CB 08 CB 08 CB 08 78 02 D4 01 E3 05 1F 02 00 00 00 00 64 08 00 00 00 55 55 00 00 00 00 00 00 00 C9 08 00 00 01 00 02 00 01 00 02 00 00 00 FC FF 00 00 U.d./.ëÿÊ.à.Ë.Ë.Ë.Ë.x.Ô.ã.......d....UU.......É.............üÿ..<br />
00000540 55 04 64 04 30 00 EB FF C9 01 E0 01 EB 08 EB 08 EB 08 EB 08 79 02 CE 01 D4 07 20 02 00 00 00 00 64 09 00 00 00 55 55 00 00 00 00 00 00 00 C9 08 00 00 01 00 02 00 01 00 02 00 00 00 FE FF 00 00 U.d.0.ëÿÉ.à.ë.ë.ë.ë.y.Î.Ô. .....d....UU.......É.............þÿ..<br />
00000580 55 04 64 04 31 00 EC FF C8 01 DF 01 EB 08 EB 08 EB 08 EB 08 79 02 CA 01 D4 07 1F 02 00 00 00 00 64 07 00 00 00 55 55 00 00 00 00 00 00 00 C9 08 00 00 01 00 02 00 01 00 02 00 00 00 FB FF 00 00 U.d.1.ìÿÈ.ß.ë.ë.ë.ë.y.Ê.Ô.......d....UU.......É.............ûÿ..<br />
000005C0 55 04 64 04 32 00 EC FF C8 01 DF 01 06 09 06 09 06 09 06 09 79 02 C9 01 CC 08 1F 02 00 00 00 00 64 06 00 00 00 55 55 10 00 00 00 00 00 00 C9 08 00 00 01 00 02 00 01 00 02 00 00 00 FA FF 00 00 U.d.2.ìÿÈ.ß.........y.É.Ì.......d....UU.......É.............úÿ..<br />
00000600 55 04 64 04 33 00 EB FF C7 01 DF 01 06 09 06 09 06 09 06 09 79 02 C7 01 CC 08 21 02 00 00 00 00 64 07 00 00 00 55 55 10 00 00 00 00 00 00 C9 08 00 00 01 00 02 00 01 00 02 00 00 00 FB FF 00 00 U.d.3.ëÿÇ.ß.........y.Ç.Ì.!.....d....UU.......É.............ûÿ..<br />
00000640 55 04 64 04 34 00 EC FF C7 01 DE 01 1D 09 1D 09 1D 09 1D 09 79 02 C7 01 48 09 21 02 00 00 00 00 64 08 00 00 00 55 55 10 00 00 00 00 00 00 C9 08 00 00 01 00 02 00 01 00 02 00 00 00 FC FF 00 00 U.d.4.ìÿÇ.Þ.........y.Ç.H.!.....d....UU.......É.............üÿ..<br />
00000680 55 04 64 04 35 00 EC FF C6 01 DE 01 1D 09 1D 09 1D 09 1D 09 79 02 C8 01 48 09 20 02 00 00 00 00 64 07 00 00 00 55 55 10 00 00 00 00 00 00 C9 08 00 00 01 00 02 00 01 00 02 00 00 00 FB FF 00 00 U.d.5.ìÿÆ.Þ.........y.È.H. .....d....UU.......É.............ûÿ..<br />
000006C0 55 04 64 04 36 00 EC FF C6 01 DE 01 32 09 32 09 32 09 32 09 79 02 C8 01 86 09 20 02 00 00 00 00 64 07 00 00 00 55 55 10 00 00 00 00 00 00 C9 08 00 00 01 00 02 00 01 00 02 00 00 00 FB FF 00 00 U.d.6.ìÿÆ.Þ.2.2.2.2.y.È.?. .....d....UU.......É.............ûÿ..<br />
00000700 55 04 64 04 37 00 EB FF C6 01 DE 01 32 09 32 09 32 09 32 09 79 02 C7 01 A5 09 21 02 00 00 00 00 64 06 00 00 00 55 55 10 00 00 00 00 00 00 C9 08 00 00 01 00 02 00 01 00 02 00 00 00 FA FF 00 00 U.d.7.ëÿÆ.Þ.2.2.2.2.y.Ç.¥.!.....d....UU.......É.............úÿ..<br />
00000740 55 04 64 04 38 00 EB FF C5 01 DE 01 45 09 45 09 45 09 45 09 79 02 C7 01 B4 09 21 02 00 00 00 00 64 07 00 00 00 55 55 10 00 00 00 00 00 00 C9 08 00 00 01 00 02 00 01 00 02 00 00 00 FB FF 00 00 U.d.8.ëÿÅ.Þ.E.E.E.E.y.Ç.´.!.....d....UU.......É.............ûÿ..<br />
00000780 55 04 64 04 39 00 EB FF C5 01 DD 01 45 09 45 09 45 09 45 09 79 02 C6 01 BC 09 22 02 00 00 00 00 64 08 00 00 00 55 55 10 00 00 00 00 00 00 C9 08 00 00 01 00 02 00 01 00 02 00 00 00 FC FF 00 00 U.d.9.ëÿÅ.Ý.E.E.E.E.y.Æ.¼.".....d....UU.......É.............üÿ..<br />
000007C0 55 04 64 04 3A 00 EB FF C5 01 DD 01 54 09 54 09 54 09 54 09 78 02 C6 01 C0 09 23 02 00 00 00 00 64 07 00 00 00 55 55 10 00 00 00 00 00 00 C9 08 00 00 01 00 02 00 01 00 02 00 00 00 FB FF 00 00 U.d.:.ëÿÅ.Ý.T.T.T.T.x.Æ.À.#.....d....UU.......É.............ûÿ..<br />
00000800 55 04 65 04 00 00 EB FF C5 01 DD 01 54 09 54 09 54 09 54 09 7A 02 C7 01 C2 09 23 02 00 00 00 00 64 06 00 00 00 55 55 10 00 00 00 00 00 00 C9 08 00 00 01 00 02 00 01 00 02 00 00 00 FA FF 00 00 U.e...ëÿÅ.Ý.T.T.T.T.z.Ç.Â.#.....d....UU.......É.............úÿ..<br />
00000840 55 04 65 04 01 00 EB FF C4 01 DD 01 62 09 62 09 62 09 62 09 79 02 C7 01 C3 09 21 02 00 00 00 00 64 07 00 00 00 55 55 10 00 00 00 00 00 00 C9 08 00 00 01 00 02 00 01 00 02 00 00 00 FB FF 00 00 U.e...ëÿÄ.Ý.b.b.b.b.y.Ç.Ã.!.....d....UU.......É.............ûÿ..<br />
...<br />
</pre><br />
<br />
Zieht man die Spaltenbeschreibungen zu Rate, müssen die ersten Bytes das Datum und die Uhrzeit sein. Und tatsächlich, bei Offset 0x04 sieht man, dass der Wert hochzählt. Angekommen bei 0x3A nullt der Wert und an Offset 0x02 wird hochgezählt. 0x3A ist allerdings nicht 59, sondern 58. Vielleicht eine leichte Asynchronität zwischen Uhr und Aufzeichnung?<br />
<br />
Scrollt man weiter nach unten, ändern sich auch die Bytes davor. Interessant ist hierbei, dass sich die geraden Bytes öfter ändern als die ungeraden. Oder: die "ersteren" scheinen das kleine Ende der entsprechenden Zahl zu repräsentieren. Unser System scheint Little Endian zu verwenden.<br />
Interessant ist auch, dass bei Offset 0x05 konsequent eine Null steht. Wenn es sich tatsächlich um Sekunden handelt, warum haben die Entwickler hier sinnlos Platz verschwendet?<br />
<br />
Ungeduldig wie ich bin (das da vorne _muss_ ein Timestamp sein), habe ich mir die nächsten Bytes angesehen. Offset 0x06 eiert um 0xEB herum, Offset 0x07 ist für länger konstant 0xFF, "schnappt" aber irgendwann auf 0x00 um. Da es unwahrscheinlich ist, dass sich ein Wert sehr stark ändert, tippe ich 0xFFEB in den Taschenrechner ein, stelle ihn auf Word-Breite ein und bekomme direkt -21 ausgespuckt (der Windows-Taschenrechner verwendet signed Datentypen). Ein Blick nach oben in die Daten der CSV-Datei verrät -2,1 °C. <br />
Die nächsten zwei Byte (bei Offset 0x08 und 0x09) lauten 0xCA 0x01, der Taschenrechner macht aus 0x01CA die dezimale Entsprechung 458. Die CSV-Tabelle sagt in der Spalte der ersten Zeile 45,8 °C. Das war einfach!<br />
<br />
Um die Daten besser untersuchen zu können, habe ich das Swiss-Army-Knife aller BWLer und das Hacking-Tool schlechthin verwendet: Excel.<br />
<br />
Mit Den Spaltenköpfen und der ersten Logzeile aus der CSV-Datei und der ersten Zeile (Hex-Codiert) aus der Binärdatei mache ich mich ans Werk.<br />
<br />
Spalte F dient dazu den Offset für einen Wert vorzugeben, Spalte G bestimmt die Länge der in Spalte H separierten Hex-Werte. In Spalte I werden die ersten beiden Teile getauscht (ok, das funktioniert nur für maximal 2 Byte lange Werte) und von Hexadezimal nach Dezimal umgerechnet.<br />
<br />
In Spalte J wird von Unsigned nach Signed umgewandelt (was allerdings nur für 2 Byte lange Datensätze funktioniert).<br />
Nach etwas Schätzen, Daten vorwärts und rückwärts durchgehen, ergab sich die Tabelle für die Spaltenbeschreibung von oben. Bei der Länge der Datenfelder für Fehler bin ich mir nicht 100 % sicher aber es sieht sehr plausibel aus.<br />
<br />
Zurück zum Datum und der Uhrzeit. Da steht bei dem Satz 1109 und 1124, was dem 09.11.2016 und 18:44 entsprechen soll.<br />
Jetzt kann man lang überlegen, mit dem Tag seit Datum X rechnen oder einfach einen Strich zwischen 11 und 09 packen. Eine Jahresangabe sucht man vergebens. Bei der Uhrzeit ist es naheliegend, die Sekunden oder Minuten seit Mitternacht zu zählen - also einfach mal geteilt durch 60, ergibt: 18,73 - 18 Uhr passt, 0,73 entspricht den 44 Minuten. Haken dran. Die Sekunden werden von der PC-Software interessanterweise nicht ausgegeben, durch die Spaltenbeschreibung im Flash muss die dritte Spalte aber den Sekunden-Anteil repräsentieren.<br />
<br />
Ein Datensatz aufgedröselt sieht dann wie folgt aus:<br />
<br />
<gallery><br />
Datei:Prozeda_Datenformat.png<br />
</gallery><br />
<br />
=Kommunikation mit dem Datastick=<br />
Wie die Daten im Speicher aussehen ist nun bekannt, aber wie kommen sie drauf?<br />
<br />
Frank war so freundlich und hat mir Traces geschickt. Leider zunächst nur Exports, in denen ich das genaue Timing und "alles andere" nicht sehen konnte. <br />
<br />
Wie André Lampe in seinem 33C3-Vortrag "[https://media.ccc.de/v/33c3-8237-es_sind_die_kleinen_dinge_im_leben Es sind die kleinen Dinge im Leben]" sagte: Rohdaten sind geil.<br />
<br />
Später habe ich noch vollständige Datensätze bzw. die Rohdaten bekommen. Leider kann/möchte ich diese an dieser Stelle zum aktuellen Zeitpunkt nicht veröffentlichen, da es momentan keinen Weg gibt, die Dateistruktur von Saleae Logic zu verändern und ich somit die im Trace vorkommenden Seriennummern nicht entfernen kann.<br />
<br />
Die Konfiguration für den SPI kann man größtenteils aus dem Datenblatt des Flashs ermitteln:<br />
<br />
* MSB first<br />
* 8 Bit je Datenwort<br />
* SPI-Mode 0 oder 3<br />
* CS low-aktiv<br />
<br />
Im vorliegenden Fall wird Mode 0 verwendet.<br />
<br />
Der Export des SPI-Analyzers aus Logic sieht wie folgt aus:<br />
<br />
<pre><br />
Time [s],Packet ID,MOSI,MISO<br />
0.941889000000000,0,0xE8,0x00<br />
0.941953000000000,0,0x00,0x00<br />
0.942017416666667,0,0x00,0x00<br />
0.942081583333333,0,0x00,0x00<br />
0.942149166666667,0,0xAA,0x00<br />
0.942213333333333,0,0xAA,0x00<br />
0.942277583333333,0,0xAA,0x00<br />
0.942341750000000,0,0xAA,0x00<br />
0.942409833333333,0,0xAA,0x00<br />
0.943974750000000,1,0xE8,0x00<br />
0.944038833333333,1,0x00,0x00<br />
0.944103083333333,1,0x00,0x00<br />
0.944169166666667,1,0x00,0x00<br />
</pre><br />
<br />
...und ist damit ziemlich unleserlich. Neben den übertragenen Daten lässt sich auch die Bitrate grob abschätzen - jede Zeile entspricht einem übertragenen Byte und dauert im ersten Paket im Schnitt 65,1 µs. Mit 8 Bit je Datenwort kann ein Bit höchstens 8,138 µs dauern. Die Bitrate muss also etwas höher als 123 kHz sein, abhängig davon wie groß die Pausen zwischen den Bytes sind.<br />
<br />
Die Wahrheit sieht natürlich etwas anders aus<br />
<br />
<gallery><br />
Datei:Prozeda_bitrate.png|<br />
</gallery><br />
<br />
233 kHz Clock-Frequenz und etwas um 32 µs zwischen den Bytes.<br />
<br />
==Traces lesbarer machen==<br />
Die Exporte von Logic sind gut, aber nicht für jede Anwendung. Um die übertragenen Daten zu verstehen ist mir das Timing nicht ganz so wichtig, aber der Inhalt der Nachrichten muss gut lesbar sein.<br />
<br />
Also habe ich ein kleines Programm geschrieben (siehe unten), um die Pakete zu komprimieren, was dann wie folgt aussieht:<br />
<br />
{| class="wikitable"<br />
! Time || Packet || Sent data || Received data<br />
|-<br />
| 0,941889000000000 || 0 || E8 00 00 00 AA AA AA AA AA || 00 00 00 00 00 00 00 00 00<br />
|-<br />
| 0,943974750000000 || 1 || E8 00 00 00 AA AA AA AA AA || 00 00 00 00 00 00 00 00 00<br />
|-<br />
| colspan="4" | ...<br />
|-<br />
| 7,979580416666670 || 14 || E8 00 00 00 AA AA AA AA AA || 00 00 00 00 00 00 00 00 AA<br />
|-<br />
| 7,981663083333330 || 15 || E8 00 00 01 AA AA AA AA AA || 00 00 00 00 00 00 00 00 55<br />
|-<br />
| 7,983659916666670 || 16 || E8 00 00 02 AA AA AA AA AA || 00 00 00 00 00 00 00 00 01<br />
|-<br />
| 8,011756000000000 || 17 || E8 00 0A 00 AA AA AA AA AA || 00 00 00 00 00 00 00 00 FF<br />
|-<br />
| 8,014754250000000 || 18 || E8 00 00 00 AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA ... || ...<br />
|-<br />
| 8,051748750000000 || 19 || 82 00 00 00 AA 55 01 05 24 01 FF FF FF FF FF FF FF FF FF 00 20 20 57 61 67 6E 65 72 20 26 20 43 6F 20 00 ... || ...<br />
|}<br />
<br />
Zugleich wird der Timestamp angepasst, damit die Datei direkt von Excel eingelesen werden kann. Die Spalten sind zudem per Tab getrennt, was beim Import etwas angenehmer sein kann<br />
<br />
Schaut man im Datenblatt nach den verschiedenen Befehlen, findet man unter 0xE8 "Continuous Array Read" und unter 0x82 "Main Memory Page Program through Buffer 1". Tabelle 4 im Dokument den Aufbau der zu den Befehlen gehörenden Sequenzen.<br />
<br />
Demnach wird in Paket 0 der Zeiger auf Page 0 und Buffer Address Bit 0 gesetzt und ein Byte gelesen, welches mit 0x00 beantwortet wird. Ignoriert man Paket 1 geschieht dies im Sekundentakt (nicht oben gezeigt), bis in Paket 14 0xAA zurückgegeben wird.<br />
<br />
Jetzt kann man die Kommunikation schon ziemlich gut verfolgen, allerdings: warum sollte man es sich unnötig schwer machen, wenn man den PC für sich arbeiten lassen kann?<br />
Also habe ich das Programm zum Komprimieren der Daten erweitert - es kann auch die im Protokoll verwendeten Befehle interpretieren:<br />
<br />
{| class="wikitable"<br />
! Time || Packet || Opcode || Page || Address from/to || Data length || Data<br />
|-<br />
| 0,941889000000000 || 0 || E8H Cont Array Read || 0x0000 || 0x000000 ... 0x000000 || 1 || 00<br />
|-<br />
| 0,943974750000000 || 1 || E8H Cont Array Read || 0x0000 || 0x000000 ... 0x000000 || 1 || 00<br />
|-<br />
| colspan="7" | ...<br />
|-<br />
| 7,979580416666670 || 14 || E8H Cont Array Read || 0x0000 || 0x000000 ... 0x000000 || 1 || AA<br />
|-<br />
| 7,981663083333330 || 15 || E8H Cont Array Read || 0x0000 || 0x000001 ... 0x000001 || 1 || 55<br />
|-<br />
| 7,983659916666670 || 16 || E8H Cont Array Read || 0x0000 || 0x000002 ... 0x000002 || 1 || 01<br />
|-<br />
| 8,011756000000000 || 17 || E8H Cont Array Read || 0x0005 || 0x000500 ... 0x000500 || 1 || FF<br />
|-<br />
| 8,014754250000000 || 18 || E8H Cont Array Read || 0x0000 || 0x000000 ... 0x0000FF || 256 || AA 55 01 00 FF FF FF FF FF FF FF FF FF FF FF FF FF ...<br />
|-<br />
| 8,051748750000000 || 19 || 82H Write through Buff1 || 0x0000 || 0x000000 ... 0x0000FF || 256 || AA 55 01 05 24 01 FF FF FF FF FF FF FF FF FF 00 20 ...<br />
|}<br />
==Kommunikation zum Speicher==<br />
<br />
===Erkennung===<br />
Um den Datastick zu erkennen, wird im Sekundentakt versucht die Adresse 0x00000 zu lesen. Beinhaltet diese den Wert 0x00 wird davon ausgegangen, dass kein Stick gesteckt ist (keine Antwort). Wird das "Magic Byte" 0xAA erkannt, wird anschließend Adresse 0x00001 gelesen, die bei einem korrekt initialisierten Stick 0x55 beinhaltet:<br />
<br />
{| class="wikitable"<br />
! Time || Packet || Opcode || Page || Address from/to || Data length || Data<br />
|-<br />
| 5,970892583333330 || 11 || E8H Cont Array Read || 0x0000 || 0x000000 ... 0x000000 || 1 || 00 <br />
|-<br />
| 6,974197916666670 || 12 || E8H Cont Array Read || 0x0000 || 0x000000 ... 0x000000 || 1 || 00 <br />
|-<br />
| 6,976281000000000 || 13 || E8H Cont Array Read || 0x0000 || 0x000000 ... 0x000000 || 1 || 00 <br />
|-<br />
| 7,979580416666670 || 14 || E8H Cont Array Read || 0x0000 || 0x000000 ... 0x000000 || 1 || AA <br />
|-<br />
| 7,981663083333330 || 15 || E8H Cont Array Read || 0x0000 || 0x000001 ... 0x000001 || 1 || 55<br />
|}<br />
<br />
Diese Erkennung läuft auch nachdem ein Stick erfolgreich erkannt wurde. Es ist der einfachste Weg, ein Entfernen des Loggers festzustellen, auch wenn es über die anderen Kommunikationsinhalte ebenfalls möglich wäre.<br />
<br />
Anschließend gibt es eine Fallunterscheidung: Entweder der Stick kommt frisch initialisiert vom PC oder er war schon einmal an der Anlage.<br />
<br />
Dazu wird an Adresse 0x000500 geprüft, ob 0xFF (mutmaßlich unbeschrieben) oder ein anderer Wert steht. Handelt es sich um ersteren, wird von einem frisch initialisierten Stick ausgegangen.<br />
<br />
====Frisch initialisierter Stick====<br />
<br />
{| class="wikitable"<br />
! Time || Packet || Opcode || Page || Address from/to || Data length || Data<br />
|-<br />
| 5,970892583333330 || 11 || E8H Cont Array Read || 0x0000 || 0x000000 ... 0x000000 || 1 || 00<br />
|-<br />
| 6,974197916666670 || 12 || E8H Cont Array Read || 0x0000 || 0x000000 ... 0x000000 || 1 || 00<br />
|-<br />
| 6,976281000000000 || 13 || E8H Cont Array Read || 0x0000 || 0x000000 ... 0x000000 || 1 || 00<br />
|-<br />
| 7,979580416666670 || 14 || E8H Cont Array Read || 0x0000 || 0x000000 ... 0x000000 || 1 || AA<br />
|-<br />
| 7,981663083333330 || 15 || E8H Cont Array Read || 0x0000 || 0x000001 ... 0x000001 || 1 || 55<br />
|-<br />
| 7,983659916666670 || 16 || E8H Cont Array Read || 0x0000 || 0x000002 ... 0x000002 || 1 || 01<br />
|-<br />
| 8,011756000000000 || 17 || E8H Cont Array Read || 0x0005 || 0x000500 ... 0x000500 || 1 || FF<br />
|-<br />
| 8,014754250000000 || 18 || E8H Cont Array Read || 0x0000 || 0x000000 ... 0x0000FF || 256 || AA 55 01 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ...<br />
|-<br />
| 8,051748750000000 || 19 || 82H Write through Buff1 || 0x0000 || 0x000000 ... 0x0000FF || 256 || AA 55 01 05 24 01 FF FF FF FF FF FF FF FF FF 00 20 20 57 ...<br />
|-<br />
| 8,095399500000000 || 20 || 82H Write through Buff1 || 0x0002 || 0x000200 ... 0x0002FF || 256 || 20 20 20 20 44 61 74 75 6D 20 20 20 20 20 00 08 20 20 20 ...<br />
|-<br />
| 8,139579833333330 || 21 || 82H Write through Buff1 || 0x0003 || 0x000300 ... 0x0003FF || 256 || 20 20 41 75 73 67 61 6E 67 20 33 20 20 20 00 0A 20 20 41 ...<br />
|-<br />
| 8,182810250000000 || 22 || 82H Write through Buff1 || 0x0004 || 0x000400 ... 0x0004FF || 256 || 46 75 6E 6B 74 69 6F 6E 20 61 6B 74 69 76 00 0B 20 20 44 ...<br />
|-<br />
| 8,224643666666670 || 23 || E8H Cont Array Read || 0x0000 || 0x000003 ... 0x000003 || 1 || 05<br />
|-<br />
| 8,226721500000000 || 24 || E8H Cont Array Read || 0x0000 || 0x000003 ... 0x000003 || 1 || 05<br />
|-<br />
| 8,229152833333330 || 25 || 81H Erase Page || 0x0005 || 0x000500 ... 0x0005FF || 0<br />
|-<br />
| 8,239133916666670 || 26 || E8H Cont Array Read || 0x0000 || 0x000000 ... 0x000000 || 1 || AA<br />
|-<br />
| 8,980954250000000 || 27 || E8H Cont Array Read || 0x0005 || 0x000500 ... 0x0005FF || 256 || FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ...<br />
|-<br />
| 9,018144083333330 || 28 || 82H Write through Buff1 || 0x0005 || 0x000500 ... 0x0005FF || 256 || 6F 00 45 04 29 00 23 00 AD 01 D8 01 C4 09 C4 09 C4 09 C4 ...<br />
|-<br />
| 9,156107750000000 || 29 || E8H Cont Array Read || 0x0000 || 0x000000 ... 0x000000 || 1 || AA<br />
|-<br />
| 9,158207083333330 || 30 || E8H Cont Array Read || 0x0000 || 0x000001 ... 0x000001 || 1 || 55<br />
|-<br />
| 9,160199750000000 || 31 || E8H Cont Array Read || 0x0000 || 0x000000 ... 0x000000 || 1 || AA<br />
|-<br />
| 9,991345666666670 || 32 || E8H Cont Array Read || 0x0005 || 0x000500 ... 0x0005FF || 256 || 6F 00 45 04 29 00 23 00 AD 01 D8 01 C4 09 C4 09 C4 09 C4 ...<br />
|-<br />
| 10,028507166666700 || 33 || 82H Write through Buff1 || 0x0005 || 0x000500 ... 0x0005FF || 256 || 6F 00 45 04 29 00 23 00 AD 01 D8 01 C4 09 C4 09 C4 09 C4 ...<br />
|}<br />
<br />
In diesem Fall steht an Adresse 0x000500 der Wert 0xFF (Paket 17), was auf noch nicht vorhandene Loggingdaten deutet.<br />
<br />
In Paket 18 wird augenscheinlich geprüft, ob Kopfdaten vorhanden sind, anschließend werden die Systeminfo (Paket 19) und die Spaltenbeschreibungen (Paket 20, 21 und 22) geschrieben.<br />
<br />
Die Bedeutung der zusätzlich geschriebenen Bytes (0x05 0x24 0x01) hat sich mir leider noch nicht erschlossen.<br />
<br />
Warum Byte 0x000003 hier noch einmal und vor allem zweimal (Paket 23 und 24) abgefragt wird, ist mir ebenfalls etwas rätselhaft.<br />
<br />
Ab Paket 25 beginnt der normale Schreibzyklus (siehe weiter unten).<br />
<br />
====Bereits verwendeter Stick====<br />
<br />
{| class="wikitable"<br />
! Time || Packet || Opcode || Page || Address from/to || Data length || Data<br />
|-<br />
| 8,586632916666670 || 17 || E8H Cont Array Read || 0x0000 || 0x000000 ... 0x000000 || 1 || 00 <br />
|-<br />
| 9,592280083333330 || 18 || E8H Cont Array Read || 0x0000 || 0x000000 ... 0x000000 || 1 || 00 <br />
|-<br />
| 9,594365416666670 || 19 || E8H Cont Array Read || 0x0000 || 0x000000 ... 0x000000 || 1 || 00 <br />
|-<br />
| 10,597658333333300 || 20 || E8H Cont Array Read || 0x0000 || 0x000000 ... 0x000000 || 1 || AA <br />
|-<br />
| 10,599741083333300 || 21 || E8H Cont Array Read || 0x0000 || 0x000001 ... 0x000001 || 1 || 55 <br />
|-<br />
| 10,601737750000000 || 22 || E8H Cont Array Read || 0x0000 || 0x000002 ... 0x000002 || 1 || 0F <br />
|-<br />
| 10,629873166666700 || 23 || E8H Cont Array Read || 0x0005 || 0x000500 ... 0x000500 || 1 || 6F <br />
|-<br />
| colspan="7" | Gleicher Lesevorgang und Antwort in Paket 24 ... 50 für die Adressen<br />
0x000540, 0x000580, 0x0005C0, 0x000600, 0x000640, 0x000680, 0x0006C0, 0x000700, 0x000740, <br />
<br />
0x000780, 0x0007C0, 0x000800, 0x000840, 0x000880, 0x0008C0, 0x000900, 0x000940, 0x000980, <br />
<br />
0x0009C0, 0x000A00, 0x000A40, 0x000A80, 0x000AC0, 0x000B00, 0x000B40, 0x000B80, 0x000BC0<br />
|-<br />
| 10,692716666666700 || 51 || E8H Cont Array Read || 0x000C || 0x000C00 ... 0x000C00 || 1 || 6F <br />
|-<br />
| 10,694810333333300 || 52 || E8H Cont Array Read || 0x000C || 0x000C40 ... 0x000C40 || 1 || FF <br />
|-<br />
| 10,696810750000000 || 53 || E8H Cont Array Read || 0x0000 || 0x000000 ... 0x000000 || 1 || AA <br />
|-<br />
| 11,599035166666700 || 54 || E8H Cont Array Read || 0x000C || 0x000C00 ... 0x000CFF || 256 || 6F 00 46 04 33 00 24 00 B0 01 D3 01 C4 09 C4 09 C4 09 C4 ...<br />
|}<br />
<br />
Nach dem Lesen der Kopfdaten wird Adresse 0x000500, also der Beginn der Loggingdaten angesprungen und ein Byte gelesen (Paket 23). Ist dieses nicht 0xFF, wird so lange um 64 Byte weitergesprungen (Paket 24 ... 51), bis der erste nicht vorhandene Datensatz mit 0xFF am Anfang gefunden wird (Paket 53). An dieser Stelle kann der Schreibzyklus begonnen werden.<br />
<br />
===Schreibzyklus===<br />
<br />
Das Schreiben der Daten hätte ich mir eigenwilliger nicht ausmalen können.<br />
Aufgrund der Gegebenheiten ging ich von zwei Möglichkeiten aus:<br />
<br />
* Im Regler werden 4 Einträge gecached und anschließend als komplette Page geschrieben<br />
* Jeder Eintrag wird einzeln geschrieben und dabei der Pointer auf die jeweilige Adresse gesetzt<br />
<br />
Stattdessen ist die Vorgehensweise wie folgt:<br />
<br />
# Prüfen ob es der nächste zu schreibende Satz der letzte innerhalb der aktuellen Page ist und wenn ja: nächste Page löschen<br />
# Aktuelle Page auslesen<br />
# Aktuelle Page mit angehängten Daten wieder schreiben<br />
<br />
Die folgende Tabelle ist leider etwas groß, aber hier benötigt man zum Verständnis die gelesenen/geschriebenen Daten. Zum besseren Übersicht habe ich die zyklischen Abfragen zur Erkennung des Sticks entfernt.<br />
<br />
{| class="wikitable"<br />
! Time || Packet || Opcode || Page || Address from/to || Data length || Data<br />
|-<br />
| 8,980954250000000 || 27 || E8H Cont Array Read || 0x0005 || 0x000500 ... 0x0005FF || 256 || FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF <br />
|-<br />
| 9,018144083333330 || 28 || 82H Write through Buff1 || 0x0005 || 0x000500 ... 0x0005FF || 256 || 6F 00 45 04 29 00 23 00 AD 01 D8 01 C4 09 C4 09 C4 09 C4 09 42 02 3D 01 C4 09 C4 01 00 00 00 00 00 00 00 00 00 55 55 10 00 00 00 00 00 00 F8 08 00 00 01 00 01 00 01 00 02 00 00 00 F0 FF 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF <br />
|-<br />
| 9,991345666666670 || 32 || E8H Cont Array Read || 0x0005 || 0x000500 ... 0x0005FF || 256 || 6F 00 45 04 29 00 23 00 AD 01 D8 01 C4 09 C4 09 C4 09 C4 09 42 02 3D 01 C4 09 C4 01 00 00 00 00 00 00 00 00 00 55 55 10 00 00 00 00 00 00 F8 08 00 00 01 00 01 00 01 00 02 00 00 00 F0 FF 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF <br />
|-<br />
| 10,028507166666700 || 33 || 82H Write through Buff1 || 0x0005 || 0x000500 ... 0x0005FF || 256 || 6F 00 45 04 29 00 23 00 AD 01 D8 01 C4 09 C4 09 C4 09 C4 09 42 02 3D 01 C4 09 C4 01 00 00 00 00 00 00 00 00 00 55 55 10 00 00 00 00 00 00 F8 08 00 00 01 00 01 00 01 00 02 00 00 00 F0 FF 00 00 6F 00 45 04 2A 00 57 00 B6 01 DC 01 CB 08 CB 08 CB 08 CB 08 31 02 A0 01 E3 05 C3 01 00 00 00 00 00 00 00 00 00 55 55 00 00 00 00 00 00 00 F8 08 00 00 01 00 01 00 01 00 02 00 00 00 F0 FF 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF <br />
|-<br />
| 10,994477083333300 || 37 || E8H Cont Array Read || 0x0005 || 0x000500 ... 0x0005FF || 256 || 6F 00 45 04 29 00 23 00 AD 01 D8 01 C4 09 C4 09 C4 09 C4 09 42 02 3D 01 C4 09 C4 01 00 00 00 00 00 00 00 00 00 55 55 10 00 00 00 00 00 00 F8 08 00 00 01 00 01 00 01 00 02 00 00 00 F0 FF 00 00 6F 00 45 04 2A 00 57 00 B6 01 DC 01 CB 08 CB 08 CB 08 CB 08 31 02 A0 01 E3 05 C3 01 00 00 00 00 00 00 00 00 00 55 55 00 00 00 00 00 00 00 F8 08 00 00 01 00 01 00 01 00 02 00 00 00 F0 FF 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF <br />
|-<br />
| 11,031559916666700 || 38 || 82H Write through Buff1 || 0x0005 || 0x000500 ... 0x0005FF || 256 || 6F 00 45 04 29 00 23 00 AD 01 D8 01 C4 09 C4 09 C4 09 C4 09 42 02 3D 01 C4 09 C4 01 00 00 00 00 00 00 00 00 00 55 55 10 00 00 00 00 00 00 F8 08 00 00 01 00 01 00 01 00 02 00 00 00 F0 FF 00 00 6F 00 45 04 2A 00 57 00 B6 01 DC 01 CB 08 CB 08 CB 08 CB 08 31 02 A0 01 E3 05 C3 01 00 00 00 00 00 00 00 00 00 55 55 00 00 00 00 00 00 00 F8 08 00 00 01 00 01 00 01 00 02 00 00 00 F0 FF 00 00 6F 00 45 04 2B 00 51 00 B5 01 DC 01 EB 08 EB 08 EB 08 EB 08 38 02 6D 01 D4 07 C3 01 00 00 00 00 00 00 00 00 00 55 55 00 00 00 00 00 00 00 F8 08 00 00 01 00 01 00 01 00 02 00 00 00 F0 FF 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF <br />
|-<br />
| 12,001553583333300 || 42 || 81H Erase Page || 0x0006 || 0x000C00 ... 0x000CFF || 0 ||<br />
|-<br />
| 12,012532583333300 || 43 || E8H Cont Array Read || 0x0005 || 0x000500 ... 0x0005FF || 256 || 6F 00 45 04 29 00 23 00 AD 01 D8 01 C4 09 C4 09 C4 09 C4 09 42 02 3D 01 C4 09 C4 01 00 00 00 00 00 00 00 00 00 55 55 10 00 00 00 00 00 00 F8 08 00 00 01 00 01 00 01 00 02 00 00 00 F0 FF 00 00 6F 00 45 04 2A 00 57 00 B6 01 DC 01 CB 08 CB 08 CB 08 CB 08 31 02 A0 01 E3 05 C3 01 00 00 00 00 00 00 00 00 00 55 55 00 00 00 00 00 00 00 F8 08 00 00 01 00 01 00 01 00 02 00 00 00 F0 FF 00 00 6F 00 45 04 2B 00 51 00 B5 01 DC 01 EB 08 EB 08 EB 08 EB 08 38 02 6D 01 D4 07 C3 01 00 00 00 00 00 00 00 00 00 55 55 00 00 00 00 00 00 00 F8 08 00 00 01 00 01 00 01 00 02 00 00 00 F0 FF 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF <br />
|-<br />
| 12,049725916666700 || 44 || 82H Write through Buff1 || 0x0005 || 0x000500 ... 0x0005FF || 256 || 6F 00 45 04 29 00 23 00 AD 01 D8 01 C4 09 C4 09 C4 09 C4 09 42 02 3D 01 C4 09 C4 01 00 00 00 00 00 00 00 00 00 55 55 10 00 00 00 00 00 00 F8 08 00 00 01 00 01 00 01 00 02 00 00 00 F0 FF 00 00 6F 00 45 04 2A 00 57 00 B6 01 DC 01 CB 08 CB 08 CB 08 CB 08 31 02 A0 01 E3 05 C3 01 00 00 00 00 00 00 00 00 00 55 55 00 00 00 00 00 00 00 F8 08 00 00 01 00 01 00 01 00 02 00 00 00 F0 FF 00 00 6F 00 45 04 2B 00 51 00 B5 01 DC 01 EB 08 EB 08 EB 08 EB 08 38 02 6D 01 D4 07 C3 01 00 00 00 00 00 00 00 00 00 55 55 00 00 00 00 00 00 00 F8 08 00 00 01 00 01 00 01 00 02 00 00 00 F0 FF 00 00 6F 00 45 04 2C 00 4C 00 B4 01 DB 01 EB 08 EB 08 EB 08 EB 08 3D 02 55 01 D4 07 C2 01 00 00 00 00 00 00 00 00 00 55 55 00 00 00 00 00 00 00 F8 08 00 00 01 00 01 00 01 00 02 00 00 00 F0 FF 00 00 <br />
|-<br />
| 13,007502916666700 || 48 || E8H Cont Array Read || 0x0006 || 0x000600 ... 0x0006FF || 256 || FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF <br />
|-<br />
| 13,044694416666700 || 49 || 82H Write through Buff1 || 0x0006 || 0x000600 ... 0x0006FF || 256 || 6F 00 45 04 2D 00 47 00 B3 01 DB 01 06 09 06 09 06 09 06 09 3F 02 47 01 CC 08 C2 01 00 00 00 00 00 00 00 00 00 55 55 10 00 00 00 00 00 00 F8 08 00 00 01 00 01 00 01 00 02 00 00 00 F0 FF 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF<br />
|}<br />
<br />
Das ist auch schon so ziemlich alles.<br />
<br />
Erwähnenswert ist an dieser Stelle noch, dass das Logging-Intervall am Regler während der Laufzeit verändert werden kann. In diesem Fall wird die erste Page neu geschrieben.<br />
<br />
=Flash-Emulator=<br />
Nun könnte man einfach dauerhaft mit eingestecktem Stick mitschnüffeln und die Daten so extrahieren. Leider hört der Solarregler (wahrscheinlich) mit dem Logging auf, wenn der Speicher voll ist. Besser ist da eine Lösung, die man anstecken und vergessen kann.<br />
<br />
Eine Möglichkeit wäre, den SPI-Flash über Multiplexer an einen Mikrocontroller (oder direkt den SBC) zu hängen und immer wieder auszulesen. Geht, ist aber unnötig viel Aufwand und irgendwann, in 100 Jahren ist der Speicher totgeschrieben.<br />
<br />
Die meisten Mikrocontroller besitzen einen SPI-Controller, der auch Slave kann. Mit ein bisschen Software lässt sich doch sicher der Speicher emulieren. Der komplette Befehlssatz ist nicht nötig, genauso wenig muss man den kompletten Speicherplatz des Originalbausteins vorhalten.<br />
<br />
Also habe ich mir also einen ATmega328P (anfänglich ein ATmega8, der aufgrund der 3,3 V allerdings nicht stabil lief) auf ein Breadboard gesteckt und losgelegt - bzw. erst einmal blöd aus der Wäsche geschaut. <br />
<br />
Zwar wird der Slave-Select-Pin zum aktivieren des SPI-Moduls verwendet, aber es gibt (zumindest beim ATmega8) keinen direkt assoziierten Interrupt auf Kommunikationsstart. Der wird aber zwingend benötigt, da man zur Synchronisation des Protokolls wissen muss, wann ein Paket angefangen hat (zurücksetzen des Byte-Zählers). Ungläubig und sehr irritiert habe ich beim ATmega8 Slave Select mit INT0 verbunden. Beim ATmega328P ist dies nicht notwendig, da dieser über Pin Change Interrupts verfügt, die auf nahezu allen Port-Pins verfügbar sind.<br />
<br />
Für die Flash-Emulation werden also zwei Interrupts benötigt: SPI_STC (Serial Transfer Complete) und PCINT0 (dem der Slave-Select-Pin zugeordnet ist).<br />
<br />
Der Programmablauf ist grob wie folgt:<br />
<br />
Bei fallender Flanke am Slave Select wird, neben dem völlig autark ablaufenden Aktivieren des SPI-Moduls, der Byte-Zähler und der Op-Code zurückgesetzt und das SPDR-Datenregister mit 0x00 vorgeladen. Zusätzlich wird ein Busy-Flag gesetzt um - wenn die Firmware weiter wächst - Aufgaben niedrigerer Prioritäten zurückzustellen. <br />
<br />
Bei steigender Flanke am Slave Select wird geprüft, welche Aktion im letzten Paket angefordert wurde, was vor allem beim Löschen der Page oder nach dem Schreiben der Loggingdaten - auf die wir es schließlich abgesehen haben - wichtig ist.<br />
<br />
Im Serial SPI_STC-Interrupt passiert die eigentliche Arbeit: Wird ein Byte über SPI empfangen, schlägt es hier auf. Dank der Variable spi_bytenum weiß das Programm, wo es sich innerhalb des Pakets befindet.<br />
<br />
Folglich wird das erste Byte in die Variable für den Op-Code geladen, die nächsten drei Byte landen im Adresszähler.<br />
<br />
Um nicht unnötig Laufzeit zu verschwenden (Interrupt-Zeit ist als "teuer" zu betrachten), habe ich für die Behandlung der Adresse einen Trick (wenn man es so nennen will) angewandt: Der Wert ist 20 bzw. 21 Bit breit. Der nächsthöhere Standardtyp wäre uint32_t, der bei Rechenoperationen jedoch relativ viel Speicher frisst - schließlich handelt es sich um eine 8-Bit-CPU. Da größtenteils eh nur die unteren 16 Bit der Adresse wichtig sind, habe ich eine Union (also eine Verschmelzung mehrerer Datentypen) erstellt, die die Adresse etwas angenehmer speichern lässt:<br />
<br />
<source lang="c"><br />
volatile union<br />
{<br />
struct<br />
{<br />
uint16_t lower;<br />
uint8_t upper;<br />
} val24;<br />
uint8_t val8[3];<br />
} flash_address;<br />
</source><br />
<br />
Das Schreiben der Werte sieht zwar etwas ungewöhnlich aus, orientiert die Bytes allerdings gleich richtig herum an und berücksichtigt auch den Offset von spi_bytenum (die Adresse kommt für spi_bytenum > 0 und < 4):<br />
<br />
<source lang="c"><br />
flash_address.val8[sizeof(flash_address) - spi_bytenum] = d;<br />
</source><br />
<br />
Im Anschluss sind wir schon eine Ebene höher: Für den Op-Code 0xE8 (Read Continuous Array) wird es nach dem 7. Byte interessant, bei Write through Buffer 1 ab dem 4. Byte, was dann in etwa wie folgt aussieht:<br />
<br />
<source lang="c"><br />
ISR(SPI_STC_vect)<br />
{<br />
IOPIN_H(DBGO);<br />
uint8_t d = SPDR;<br />
if(spi_bytenum == 0)<br />
{<br />
// byte 0 in transfer is the opcode<br />
SPDR = 0x00;<br />
flash_opcode = (Flash_Opcode_t)d;<br />
}<br />
else if(spi_bytenum < 4)<br />
{<br />
SPDR = 0x00;<br />
// byte 1 ... 3 are address bytes<br />
flash_address.val8[sizeof(flash_address) - spi_bytenum] = d;<br />
if(spi_bytenum == 3)<br />
{<br />
// command completely received, now do what needs to be done<br />
//uart_debug_write("%2x:%4x", flash_opcode, flash_address.val24.lower);<br />
}<br />
}<br />
else if(flash_opcode == Flash_Opcode_ReadContArray && spi_bytenum >= 7)<br />
{<br />
// when reading from the flash, we have to start to transmit<br />
// the data already one byte earlier due to delay of MISO<br />
if(flash_address.val24.lower <= 0x0003)<br />
{<br />
// hello bytes<br />
SPDR = flash_data_hello[flash_address.val24.lower & 0x03];<br />
}<br />
else if(flash_address.val24.lower >= 0x0500)<br />
{<br />
// logging data section<br />
SPDR = flash_data_log[flash_address.val24.lower & 0xFF];<br />
}<br />
flash_address.val24.lower++;<br />
}<br />
else if(flash_opcode == Flash_Opcode_WriteBuff1 && spi_bytenum >= 4)<br />
{<br />
if(flash_address.val24.lower >= 0x0500)<br />
{<br />
flash_data_log[flash_address.val24.lower & 0xFF] = d;<br />
}<br />
flash_address.val24.lower++;<br />
}<br />
else<br />
{<br />
// when there's no specific handler for the transmission, reply 0x00<br />
SPDR = 0x00;<br />
}<br />
<br />
// byte number is only important for the first n bytes, after that<br />
// there are anyway only data bytes (which are handled separately)<br />
if(spi_bytenum < 0xFF)<br />
spi_bytenum++;<br />
IOPIN_L(DBGO);<br />
}<br />
<br />
ISR(PCINT0_vect)<br />
{<br />
if(IOPIN_V(SPI_SS) == 0)<br />
{<br />
spi_bytenum = 0;<br />
flash_opcode = 0;<br />
// preload SPI data register<br />
SPDR = 0x00;<br />
trx_flags |= TrxFlags_SpiBusy;<br />
}<br />
//...<br />
}<br />
</source><br />
<br />
Um die Laufzeit im Blick zu haben, wird zusätzlich ein Debug-Pin zu Beginn des Interrupts auf High und am Ende auf Low gesetzt. Wenn ich mich richtig erinnere, waren es bei 8 MHz CPU-Takt um die 8 µs, also reichlich Luft zu den knapp 30 µs, die zur Verfügung stehen. Allerdings muss dazu gesagt werden, dass in dem Codeschnipsel das Schreiben der Daten in den RAM noch nicht implementiert ist.<br />
<br />
=Livedaten=<br />
<br />
Denn in etwa an der Stelle, hatte ich das Geräusch vom [http://freesound.org/people/kwahmah_02/sounds/269476/ Kratzen eines Plattenspielers im Kopf]. Eine Mail von Frank mit neuen Loggingdaten. Ich hab zwar schon zuvor welche im Saleae-Format bekommen, nun aber mit etwas höherer zeitlicher Auflösung und so schaute ich sie mir noch einmal etwas genauer an:<br />
<br />
<gallery><br />
Datei:Prozeda_verdaechtig.png<br />
</gallery><br />
<br />
Der Stick wurde etwa bei Sekunde 8 gesteckt. Abgesehen vom "Ping" an den (teilweise nicht vorhandenen) Stick ist da verdammt viel Gewackel auf SCK und MOSI, bei dem noch nicht einmal CS aktiv ist... Da wird doch wohl nicht...<br />
<br />
In Logic kann man den Enable (also CS) auch auf active high einstellen. So kommt zu Tage, was in der Zeit über den Bus geht, das nicht den Flash betrifft.<br />
<br />
Hier ein kleiner Auszug aus dem Block, der von ziemlich vielen 0xAA gefolgt wird (deswegen habe ich es mir vorher auch nicht genauer angesehen):<br />
<br />
<pre><br />
Time [s],Packet ID,MOSI,MISO<br />
1.013882583333333,0,0xAA,0x00<br />
1.013947000000000,0,0x55,0x00<br />
1.014011416666667,0,0x55,0x00<br />
1.014075666666667,0,0xAA,0x00<br />
1.014139750000000,0,0x02,0x00<br />
1.014203916666667,0,0x00,0x00<br />
1.015365916666667,0,0xAA,0x00<br />
1.015494333333333,0,0xAA,0x00<br />
...<br />
</pre><br />
<br />
Irgendwann geht die Umsetzung vollkommen in die Hose, nachdem - warum weiß vermutlich nur der Hersteller - ein 11-bit langes Datenwort gesendet ist:<br />
<br />
<gallery><br />
Datei:Prozeda_11bit_wtf.png<br />
</gallery><br />
<br />
Nach dem nächsten Zugriff auf den Flash funktioniert die Analyse zwar wieder (da die State Machine zurückgesetzt wird) aber bis dahin hat man Datenschrott.<br />
<br />
Nachdem man sich in Logic auch die Rohdaten exportieren lassen kann, gibt es keine Ausrede es nicht selbst besser zu machen.<br />
<br />
Also einen sehr einfachen SPI-Analyzer in C# geschrieben, der das Timing sowohl für die Byte-Trennung als auch Pakettrennung verwendet. Kommt eine steigende Flanke am Clock später als 8 µs nach der letzten Veränderung, wird ein neuer Datensatz begonnen. Ist die Zeitdifferenz größer als 150 µs, wird ein neues Paket begonnen. Dabei sind die zeitlichen Abstände sehr konservativ.<br />
<br />
Folgende Daten purzeln aus dem Programm:<br />
<br />
{| class="wikitable"<br />
! Time || CS || Data<br />
|-<br />
| 0,00850 || 1 || AA 55 55 AA 02 00 <br />
|-<br />
| 0,00998 || 1 || AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA <br />
|-<br />
| 0,05851 || 1 || AA 55 55 AA 01 00 <br />
|-<br />
| 0,05939 || 1 || 20 20 4B 6F 6C 6C 65 6B 74 6F 72 20 20 20 20 20 20 20 20 20 20 20 20 20 2D 31 34 20 05 2D 54 20 20 33 20 32 37 20 01 01 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 05 <br />
|-<br />
| 0,20858 || 1 || AA 55 55 AA 02 00 <br />
|-<br />
| 0,21006 || 1 || AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA <br />
|-<br />
| 0,25859 || 1 || AA 55 55 AA 01 00 <br />
|-<br />
| 0,25946 || 1 || 20 20 4B 6F 6C 6C 65 6B 74 6F 72 20 20 20 20 20 20 20 20 20 20 20 20 20 2D 31 34 20 05 2D 54 20 20 33 20 32 37 20 01 01 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 05 <br />
|-<br />
| 0,40867 || 1 || AA 55 55 AA 02 00 <br />
|-<br />
| 0,41015 || 1 || AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA <br />
|-<br />
| 0,41492 || 1 || 09<br />
|}<br />
<br />
==Nachrichtentypen==<br />
Nach genauerem Durchsehen der Daten lassen sich 6 verschiedene Nachrichtentypen erkennen:<br />
<br />
{| class="wikitable"<br />
! Länge || Zyklus [ms] || Meldungstyp || Bezeichnung || Anmerkung<br />
|-<br />
| 1 || 474/531 || - || unbekannt || immer 0x09, immer 11 bit lang<br />
|-<br />
| 6 || n/a || - || Meldungstyp || Gibt an, welche Nachrichtentypen folgen<br />
|-<br />
| 33 || 201 || <code>02 00</code> || Remote Request (?) || alle Bytes 0xAA, vermutlich Lesen eines abgesetzten Bedienteils<br />
|-<br />
| 64 || 201 || <code>01 00</code> || Displayanzeige || ASCII, synchron zum Displayinhalt am Regler<br />
|-<br />
| 68 || 1005 || <code>03 00</code> || Messwerte || Gleiches Datenformat wie auf dem Datastick<br />
|-<br />
| 70 || 1005 || <code>03 01</code> || Kopfdaten || Spalteninformationen zu den Messwerten und Systeminfos<br />
|-<br />
| 260 || - || - || unbekannt || vermutlich Systemparameter<br />
|}<br />
<br />
Die Länge ist die Länge der verschiedenen Nachrichten. Der Meldungstyp der unterschiedlichen Nachrichten leitet sich aus der Nachricht Meldungstyp ab, die diese speziellen Nachrichten ankündigt.<br />
<br />
===0x09===<br />
Das 0x09 ist - wie bereits geschrieben - die Katze im Protokoll: Ist da, holt sich Aufmerksamkeit und wirft mutwillig Zeug auf den Boden, nur um die Welt brennen zu sehen. Oder bringt mit ihrer abweichenden Länge zumindest die State-Machine vom Hardware-SPI durcheinander.<br />
<br />
Sinn und Zweck hat sich mir noch nicht erschlossen. Selbst wenn man das Timing betrachtet, taugt sie relativ wenig. Sie kommt abwechselnd in Abständen von etwa 474 und 531 ms, zwei dieser Nachrichten haben also einen Zyklus von 1,005 Sekunden. Könnte also der Synchronisation dienen. <br />
<br />
Aber warum die komische Länge von 11 bit?<br />
<br />
===Meldungstyp===<br />
Diese Nachricht kündigt andere Nachrichten an. Die <span class="hb1">letzten beiden Byte</span> geben - wie in der Tabelle oben vermerkt - den nächsten Meldungstyp an:<br />
<br />
<code><br />
Offset(h) 00 01 02 03 04 05<br />
<br /><br />
00000000&nbsp;&nbsp;AA 55 55 AA <span class="hb1">01 00</span>&nbsp;&nbsp;ªUUª<span class="hb1">..</span><br />
</code><br />
<br />
Das Timing ist bedingt durch die Natur der Nachricht nicht so richtig zyklisch, wobei sich natürlich eine Regelmäßigkeit erkennen lässt.<br />
<br />
===Remote Request===<br />
Auch wenn ich es nicht mit sicher sagen kann, handelt es sich hierbei mit großer Wahrscheinlichkeit um eine Abfrage eines abgesetzten Bedienteils. Auf eine andere Weise kann ich mir nicht erklären, warum nur 0xAA gesendet wird (was übrigens auch bei Lesevorgängen im Flash gesendet wird).<br />
<br />
Ein weiterer Fürsprecher ist, dass die Nachricht durchschnittlich nur 50 ms vor der Übertragung der Displayanzeige gesendet wird, was sehr für die Optimierung Aktion <> Reaktion spricht.<br />
<br />
Leider sind mir über die Inhalte keine näheren Informationen bekannt.<br />
<br />
===Displayanzeige===<br />
Bei dieser Nachricht handelt es sich mit sehr großer Wahrscheinlichkeit um den Inhalt eines zusätzlichen Displays.<br />
Nach den zwei Byte Kopfdaten kommen 36 ASCII-Zeichen. Da das Display am Regler 3 Zeilen mit 14 + 10 + 14 Zeichen hat, ist die Auftrennung der Daten vermutlich (!) dementsprechend.<br />
<br />
<!-- use colors they said, it will look great they said --><br />
<code><br />
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F<br />
<br /><br />
00000000&nbsp;&nbsp;<span class="hb1">20 20 57 61 67 6E 65 72 20 26 20 43 6F 20</span> <span class="hb2">20 20</span>&nbsp;&nbsp;<span class="hb1">&nbsp;&nbsp;Wagner & Co </span><span class="hb2">&nbsp;&nbsp;</span><br />
<br /><br />
00000010&nbsp;&nbsp;<span class="hb2">20 20 20 20 20 20 20 20</span> <span class="hb3">20 53 6F 6C 61 72 74 65</span>&nbsp;&nbsp;<span class="hb2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="hb3"> Solarte</span><br />
<br /><br />
00000020&nbsp;&nbsp;<span class="hb3">63 68 6E 69 6B 20</span> <span class="hb4">01 00 00 00 01 00 00 00 10 00</span>&nbsp;&nbsp;<span class="hb3">chnik </span><span class="hb4">..........</span><br />
<br /><br />
00000030&nbsp;&nbsp;<span class="hb4">00 00 10 00 00 00 00 00 00 00 00 00 00 00 00</span> 65&nbsp;&nbsp;<span class="hb4">...............</span>e<br />
</code><br />
<br />
* <span class="hb1">Zeile 1 auf dem Display</span><br />
* <span class="hb2">Zeile 2 auf dem Display</span><br />
* <span class="hb3">Zeile 3 auf dem Display</span><br />
* <span class="hb4">Weitere Daten</span><br />
<br />
Die weiteren Daten haben sich mir leider nicht erschlossen, scheinen aber Parameter für die Anzeige zu sein. Zum Beispiel anzuzeigende Symbole oder das Mapping von Informationen wie der Uhrzeit (wie hier gezeigt), die nicht in der Nachricht übertragen wurde, aber auf dem Display zu sehen ist.<br />
<br />
Das letzte Zeichen: siehe Prüfsumme<br />
<br />
===Messwerte===<br />
Die Messdaten sind nahezu identisch zu dem, was auf dem Datastick landet:<br />
<br />
<code><br />
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F<br />
<br /><br />
00000000&nbsp;&nbsp;<span class="hb1">20 00</span> <span class="hb2">6F 00 45 04 21 00 24 00 AD 01 D8 01 C4 09</span>&nbsp;&nbsp;<span class="hb1"> .</span><span class="hb2">o.E.!.$...Ø.Ä.</span><br />
<br /><br />
00000010&nbsp;&nbsp;<span class="hb2">C4 09 C4 09 C4 09 45 02 40 01 C4 09 CD 01 00 00</span>&nbsp;&nbsp;<span class="hb2">Ä.Ä.Ä.E.@.Ä.Í...</span><br />
<br /><br />
00000020&nbsp;&nbsp;<span class="hb2">00 00 00 00 00 00 00 55 55 10 00 00 00 00 00 00</span>&nbsp;&nbsp;<span class="hb2">.......UU.......</span><br />
<br /><br />
00000030&nbsp;&nbsp;<span class="hb2">F8 08 00 00 01 00 01 00 01 00 02 00 00 00 F0 FF</span>&nbsp;&nbsp;<span class="hb2">ø.............ðÿ</span><br />
<br /><br />
00000040&nbsp;&nbsp;<span class="hb2">00 00</span> <span class="hb3">20</span> C9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hb2">..</span><span class="hb3"> </span>É<br />
</code><br />
<br />
Die Daten werden durch die grün und gelb markierten Bytes eingeschlossen, die konstant zu sein scheinen. Das letzte Zeichen ist wieder die Prüfsumme.<br />
<br />
===Kopfdaten===<br />
Wie beim Logging auch werden Kopfdaten ausgegeben. Aufgrund der Gesamtlänge werden sie in kleinere Blöcke unterteilt und in diesen übertragen.<br />
<br />
<code><br />
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F<br />
<br /><br />
00000000&nbsp;&nbsp;<span class="hb1">0D 11 04</span> <span class="hb2">00</span> <span class="hb3">20 20 20 20 44 61 74 75 6D 20 20 20</span>&nbsp;&nbsp;<span class="hb1">...</span><span class="hb2">.</span><span class="hb3">&nbsp;&nbsp;&nbsp;&nbsp;Datum&nbsp;&nbsp;&nbsp;</span><br />
<br /><br />
00000010&nbsp;&nbsp;<span class="hb3">20 20 08 01 20 20 20 55 68 72 7A 65 69 74 20 20</span>&nbsp;&nbsp;<span class="hb3">&nbsp;&nbsp;..&nbsp;&nbsp;&nbsp;Uhrzeit&nbsp;&nbsp;</span><br />
<br /><br />
00000020&nbsp;&nbsp;<span class="hb3">20 20 09 02 20 53 65 6B 75 6E 64 65 6E 20 00 00</span>&nbsp;&nbsp;<span class="hb3">&nbsp;&nbsp;.. Sekunden ..</span><br />
<br /><br />
00000030&nbsp;&nbsp;<span class="hb3">00 00 10 03 20 20 4B 6F 6C 6C 65 6B 74 6F 72 20</span>&nbsp;&nbsp;<span class="hb3">....&nbsp;&nbsp;Kollektor&nbsp;</span><br />
<br /><br />
00000040&nbsp;&nbsp;<span class="hb3">20 20 01 00</span> <span class="hb4">24</span> <span class="hb5">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hb3">&nbsp;&nbsp;..</span><span class="hb4">&#36;</span><span class="hb5">(</span><br />
</code><br />
<br />
* <span class="hb1">Konstant</span><br />
* <span class="hb2">Adresse</span><br />
* <span class="hb3">Daten</span><br />
* <span class="hb4">Trennzeichen</span><br />
* <span class="hb5">Prüfsumme</span><br />
<br />
Ich bin mir nicht ganz sicher, ob die Aufteilung Konstant/Adresse so korrekt ist, es wäre schon fast naheliegender, wenn die Aufteilung 2/2 Byte wäre. Allerdings habe ich keinen Anhaltspunkt dafür entdeckt.<br />
<br />
Die Adressen nach dem angegebenen Muster schlüsseln sich wie folgt auf:<br />
<br />
{| class="wikitable"<br />
! Adresse || Bezeichnung<br />
|-<br />
| <code>0x00</code> || Spaltenbeschreibung 0<br />
|-<br />
| <code>0x04</code> || Spaltenbeschreibung 1<br />
|-<br />
| <code>0x04 * n</code> || Spaltenbeschreibung n<br />
|-<br />
| <code>0x20</code> || Spaltenbeschreibung 8<br />
|-<br />
| <code>0xFA</code> || Systemdaten<br />
|}<br />
<br />
====Spaltenbeschreibungen====<br />
<br />
Fügt man die Daten aus den Nachrichten zusammen (hier: Adresse 0x00 und 0x04), erkennt man einen Unterschied zur Struktur im Flash:<br />
<br />
<code><br />
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F<br />
<br /><br />
00000000&nbsp;&nbsp;20 20 20 20 44 61 74 75 6D 20 20 20 20 20 <span class="hb1">08</span> <span class="hb2">01</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Datum&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hb1">.</span><span class="hb2">.</span><br />
<br /><br />
00000010&nbsp;&nbsp;20 20 20 55 68 72 7A 65 69 74 20 20 20 20 <span class="hb1">09</span> <span class="hb2">02</span>&nbsp;&nbsp;&nbsp;&nbsp; Uhrzeit&nbsp;&nbsp;&nbsp;&nbsp;<span class="hb1">.</span><span class="hb2">.</span><br />
<br /><br />
00000020&nbsp;&nbsp;20 53 65 6B 75 6E 64 65 6E 20 00 00 00 00 <span class="hb1">10</span> <span class="hb2">03</span>&nbsp;&nbsp;&nbsp;Sekunden&nbsp;....<span class="hb1">.</span><span class="hb2">.</span><br />
<br /><br />
00000030&nbsp;&nbsp;20 20 4B 6F 6C 6C 65 6B 74 6F 72 20 20 20 <span class="hb1">01</span> <span class="hb2 hf2">00</span>&nbsp;&nbsp;&nbsp;&nbsp;Kollektor&nbsp;&nbsp; <span class="hb1">.</span><span class="hb2 hf2">.</span><br />
<br /><br />
00000040&nbsp;&nbsp;20 20 53 70 65 69 63 68 65 72 20 B9 20 20 <span class="hb1">01</span> <span class="hb2">05</span>&nbsp;&nbsp;&nbsp;&nbsp;Speicher ¹&nbsp;&nbsp;<span class="hb1">.</span><span class="hb2">.</span><br />
<br /><br />
00000050&nbsp;&nbsp;20 20 53 70 65 69 63 68 65 72 20 B3 20 20 <span class="hb1">01</span> <span class="hb2">06</span>&nbsp;&nbsp;&nbsp;&nbsp;Speicher ³&nbsp;&nbsp;<span class="hb1">.</span><span class="hb2">.</span><br />
<br /><br />
00000060&nbsp;&nbsp;20 52 FC 63 6B 6C 61 75 66 61 6E 68 2E 20 <span class="hb1">01</span> <span class="hb2">07</span>&nbsp;&nbsp;&nbsp;Rücklaufanh. <span class="hb1">.</span><span class="hb2">.</span><br />
<br /><br />
00000070&nbsp;&nbsp;20 52 FC 63 6B 6C 61 75 66 61 6E 68 2E 20 <span class="hb1">01</span> <span class="hb2 hf2">00</span>&nbsp;&nbsp;&nbsp;Rücklaufanh. <span class="hb1">.</span><span class="hb2 hf2">.</span><br />
</code><br />
<br />
Wo das vorletzte Byte jeder Spaltenbeschreibung <code>0x00</code> war, steht hier der <span class="hb1">Spaltentyp</span>. Dafür wird hier das <span class="hb2">letzte Byte</span> hochgezählt, wobei das letzte einer Nachricht immer <code class="hb2 hf2">0x00</code> ist. Trotzdem wird die Zählung in der nächsten Nachricht korrekt fortgesetzt. Bug oder Feature?<br />
<br />
====Systemdaten====<br />
<br />
Auch die Systemdaten sind etwas anders aufgebaut als im Datastick:<br />
<br />
<code><br />
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F<br />
<br /><br />
00000000&nbsp;&nbsp;<span class="hb1">20 20 57 61 67 6E 65 72 20 26 20 43 6F 20</span> 00 FB&nbsp;&nbsp;<span class="hb1">&nbsp;&nbsp;Wagner & Co </span>.û<br />
<br /><br />
00000010&nbsp;&nbsp;<span class="hb1">20 53 6F 6C 61 72 74 65 63 68 6E 69 6B 20</span> 00 FC&nbsp;&nbsp;<span class="hb1"> Solartechnik </span>.ü<br />
<br /><br />
00000020&nbsp;&nbsp;<span class="hb2">XX XX XX XX XX XX XX XX XX XX</span> 00 00 00 00 00 FD&nbsp;&nbsp;<span class="hb2">XXXXXXXXXX</span>.....ý<br />
<br /><br />
00000030&nbsp;&nbsp;<span class="hb2">XX XX XX XX XX XX</span> 00 <span class="hb3">XX XX</span> <span class="hb4">XX XX</span> 00 00 00 00 00&nbsp;&nbsp;<span class="hb2">XXXXXX</span>.<span class="hb3">XX</span><span class="hb4">XX</span>.....<br />
</code><br />
<br />
* <span class="hb1">Systemname</span><br />
* <span class="hb2">Seriennummer</span><br />
* <span class="hb3">System-Nummer</span><br />
* <span class="hb4">System-Version</span><br />
<br />
Achtung: Im Gegensatz zum Datenstick sind hier System-Nummer und System-Version nicht Little-Endian, sondern Big-Endian.<br />
<br />
===Systemparameter===<br />
<br />
Um ehrlich zu sein: ich habe nicht die leiseste Ahnung was der der Inhalt der Nachricht auch nur bedeuten könnte. Da ich nicht ausschließen kann, dass Informationen darin sind, die die Anlage identifizieren könnten, möchte ich an dieser Stelle nicht näher darauf eingehen.<br />
<br />
===Prüfsumme===<br />
Am Ende einer jeder Nutzdaten-Nachricht (also alle außer Meldungstyp und der verrückten 0x09) befindet sich eine Prüfsumme.<br />
<br />
Diese lässt sich gut an den Nachrichten erkennen, deren Inhalte sich nur wenig ändern - das letzte Byte ist dabei immer anders.<br />
Da es sich nur um ein Byte handelt ging ich im ersten Momentan davon aus, dass es sich am ehesten um CRC-8 handelt. Also [http://reveng.sourceforge.net/ RevEng] heruntergeladen und aufgrund der Uhrzeit dann lieber doch noch einmal geschaut, ob es sich die Entwickler nicht doch einfacher gemacht haben. Schließlich haben [[ECL-Bus-Decoder#Pr.C3.BCfsumme|so manche]] eine Vorliebe, das mit der Summe wörtlich zu nehmen.<br />
<br />
Warum nicht mal JavaScript?<br />
<br />
<source lang="javascript"><br />
var msg = "20 00 6F ... C9";<br />
var bytes = msg.split(/ /);<br />
var sum = 0;<br />
for (var i = 0; i < bytes.length; i++)<br />
{<br />
bytes[i] = parseInt(bytes[i], 16);<br />
if (i < bytes.length - 1)<br />
{<br />
sum += bytes[i];<br />
}<br />
}<br />
var csok = (sum & 255) == bytes[bytes.length - 1];<br />
console.log('checksum is %sok', csok ? '' : 'not ');<br />
</source><br />
<br />
Gleich beim ersten Schuss getroffen. Schön. Oder auch nicht - die Bytewerte zu summieren ist alles andere als sicher. Allerdings muss man auch eingestehen, dass CRC-8 und CRC-16 bei den Datenlängen auch nicht mehr zur zuverlässigen Fehlererkennung taugt.<br />
<br />
==Angezapft==<br />
Ok, jetzt wissen wir, wie die Daten aufgebaut sind. Jetzt müssen sie nur noch extrahiert und umgesetzt werden.<br />
<br />
Um überhaupt Daten empfangen zu können, muss Slave Select auf Masse liegen (zumindest wenn die Daten kommen) - sonst ist das SPI-Modul inaktiv. Leider stellte sich heraus, dass der Regler für den "zweiten Kanal" keinen Chip select herausführt. Das hätte die Sache etwas vereinfacht.<br />
<br />
Nun kann man einfach den Pin mit GND verbinden und bekommt die komplette Buskommunikation mit oder man invertiert das Signal - im einfachsten Fall mit einem Transistor - und hat schon mal die komplette Kommunikation zum Datenstick gefiltert (sofern man ihn überhaupt noch verwenden will).<br />
<br />
Aufgrund des verrückten 0x09 muss das SPI-Modul im laufenden Betrieb zurückgesetzt werden. Am besten funktioniert das über das Timing der Nachrichten. Der kleinste Abstand den ich in den Traces zwischen ihnen gesehen habe, war um die 600 µs. Der zeitliche Abstand zwischen den Bytes immer unter 100 µs, Ticks um die 100 bis 250 µs würden also vollkommen reichen, um Nachrichten sauber unterscheiden zu können.<br />
<br />
Zuerst habe ich mir überlegt, eine Statemachine zu verwenden, aber das ist gar nicht nötig, da es im Endeffekt nur zwei Zustände gibt: Es werden Daten empfangen und der Empfang ist abgeschlossen.<br />
<br />
Als Schnittstelle zum restlichen Programm dienen drei Methoden:<br />
* prozeda_rxData<br />
* prozeda_tick<br />
* prozeda_task<br />
<br />
<code>prozeda_rxData</code> muss durch den SPI-Received-Interrupt mit den empfangenen Daten als Parameter aufgerufen werden. In der Methode wird das empfangene Byte in den Puffer geschrieben und der Ticks-Zähler zurückgesetzt.<br />
<br />
<code>prozeda_tick</code> erwartet einen Aufruf alle ca. 100 µs. Ein bisschen mehr oder weniger ist nicht schlimm, evtl. muss <code>PROZEDA_MSG_MAXTICKS</code> angepasst werden. Die Konstante sollte nicht kleiner als 3 werden und die dadurch eingefasste Zeit nicht zu nah am die knapp 600 µs kommen, da sonst die empfangenen Daten überschrieben werden.<br />
Im Kern überprüft die Methode, wie lange das letzte empfangene Byte her ist. Wurde etwas empfangen und die zeitliche Bedingung erfüllt, wird das Flag <code>prozeda_process</code> gesetzt und damit <code>prozeda_task</code> zur Ausführung freigegeben.<br />
<br />
<code>prozeda_task<code> ist relativ unkritisch, sollte aber so regelmäßig ausgeführt werden dass es zwischen dem letzten <code>prozeda_tick<code> und dem nächsten <code>prozeda_rxData</code> noch vollständig durchläuft. Falls es in der Anwendung nicht reicht, kann ein doppelter Puffer helfen, der die Daten in prozeda_tick wegkopiert bevor sie von <code>prozeda_rxData</code> überschrieben werden können.<br />
<br />
===Hardware===<br />
{{Infobox AVR<br />
| Typ = AtMega328P<br />
| Takt = 12<br />
| FuseH = 0xD9<br />
| FuseL = 0xCE<br />
| FuseE = 0xFF<br />
}}<br />
Die Hardware ist relativ einfach: Der Atmega, sein Oszillator und der FET zum Invertieren des Chip Select. Dazu noch ein Angstwiderstände und fertig ist der Lack. Etwas schöner wäre natürlich nur noch eine passende Mini-DIN-Buchse.<br />
<br />
<gallery><br />
Prozeda_sch.png|Minimalschaltung zum Empfang der Daten<br />
</gallery><br />
<br />
===Timing===<br />
Um herauszufinden, wie viel CPU-Last der Empfang und das Auswerten des Protokolls benötigt und was man sonst noch machen kann, ist es unabdingbar, das Timing zu messen. Nun kann man anhand des Listings und der Befehlstabelle Zyklen zählen oder messen.<br />
<br />
Das geht mit einem Oszilloskop oder Logic Analyzer relativ einfach, indem man im Mikrocontroller am Anfang und Ende eines Funktionsaufrufs einen IO-Pin ein- bzw. ausschaltet.<br />
<br />
Über den Duty-Cycle kann man dann die CPU-Last messen, sollte den Wert aber trotzdem mit etwas Vorsicht genießen, denn: Schaltet man den IO innerhalb einer Funktion, misst man nicht den Overhead für den Sprung in und aus derselben.<br />
Zum Beispiel fallen beim <code>TIMER0_COMOA_vect</code> beim Eintritt 4 push-Befehle, ein in- und ein eor-Befehl an. Plus dem Setzen des Pins: 12 Zyklen. Beim Austritt 4x pop, je einmal out und reti und cbi: 15 Zyklen. Bei 12 MHz CPU-Takt bleiben also ca. 2,25 µs "ungesehen". An ungeeigneter Stelle kann das unangenehm werden.<br />
<br />
Folgende Zeiten habe ich mit dem Logic Analyzer gemessen - die Zeiten sind Mittelwerte aus 10 Messungen, der LA lief mit 32 MHz, also ist die zeitliche Auflösung 0,03125 µs<br />
<br />
{| class="wikitable"<br />
! Methode || Bezeichnung || Dauer [µs]<br />
|-<br />
| prozeda_tick || keine Kommunikation || 0,588<br />
|-<br />
| prozeda_tick || während Kommunikation || 1,338<br />
|-<br />
| prozeda_tick || 4 Zyklen nach Kommunikation || 1,844<br />
|-<br />
| prozeda_rxData || - || 1,419<br />
|-<br />
| prozeda_process || nach MsgType-Nachricht || 8,918<br />
|-<br />
| prozeda_process || nach Paket != Logdata || 2,339<br />
|-<br />
| prozeda_process || nach 0x09 || 2,339<br />
|-<br />
| prozeda_process || nach Logdata || 110,75<br />
|}<br />
<br />
Die ganzen Werte sind ohne die oben erwähnten Ein- und Aussprungsszeiten.<br />
<br />
Über Duty-Cycle-Messungen kann man prinzipiell auch die CPU-Load für die einzelnen Aufgaben ermitteln. Hier im Durchschnitt über ca. 20 Sekunden und wieder ohne den Overhead:<br />
<br />
{| class="wikitable"<br />
! Methode || CPU-Zeit [%]<br />
|-<br />
| prozeda_tick || 0,968<br />
|-<br />
| prozeda_rxData || 0,025<br />
|-<br />
| prozeda_process || 0,101<br />
|}<br />
<br />
Erstaunlicherweise erzeugt der Tick am meisten Auslastung und wäre damit der erste Kandidat für Optimierung.<br />
<br />
===Implementierungsstatus===<br />
Aktuell Werden lediglich die MsgType-Nachrichten und die Logdaten ausgewertet. Aufgrund mangelnder Erkenntnis werden die Displaydaten nicht verarbeitet. Bei den Spaltendaten ist der Aufbau zwar bekannt, da sie für den aktuellen Regler aber keine zusätzliche Verwendung finden, habe ich es ausgelassen (die Definition - enum und typedef struct - existieren allerdings schon). Auch die 260-Byte lange Nachricht wird nicht untersucht, was aber noch interessant wäre.<br />
<br />
Ein weiterer Punkt wäre die Untersuchung des Rückkanals, um den Regler fernsteuern zu können. Besonders in Hinblick auf Fernwartung hätte dies einen größeren Reiz. Im Vordergrund stand in diesem Artikel allerdings das Auslesen der Messwerte.<br />
<br />
===Programmbeispiel===<br />
Im Download befindet sich ein Programmbeispiel, das gegen die Kommunikation des RATIOfresh 200 getestet wurde. Nach dem Empfang werden die Logdaten (Datum/Uhrzeit, Temperaturen, Ausgänge, Funktionen und Zapfung) als Text mit 115200 Baud 8N1 am UART ausgegeben.<br />
<br />
Neben der Ausgabe als "normalem" Text können die Daten auch im JSON-Format ausgegeben werden.<br />
<br />
Für die Anbindung an den Raspberry Pi, oder andere Embedded Systems wäre auch ein I²C-Slave sehr praktisch (Vielleicht, wenn ich lustig bin...). Ebenso eine Portierung auf einen physisch kleineren Mikrocontroller. <br />
<br />
=Anmerkungen=<br />
* Vielen Dank an Frank für die vielen Infos, Daten, Fotos und Geduld!<br />
* Vielen Dank an das Forum von mikrocontroller.net und im speziellen Rainer B.<br />
* Für die Stimulation des Mikrocontrollers wurde sowohl ein anderer Mikrocontroller als auch ein zweiter Logic(-Nachbau) missbraucht. Besonders letzteres funktioniert erstaunlich gut.<br />
<br />
=Downloads=<br />
[[Datei:Prozeda-Decoder.zip]] enthält:<br />
* Hexdump eines Flashimages<br />
* Excel-Datei zur Auswertung eines Logging-Eintrags + Datenbeschreibung<br />
* Atmel Studio-Projekt zur Emulation des Datasticks<br />
* Atmel Studio-Projekt mit dem Reader der Livedaten<br />
<br />
[[Kategorie:AVR]]<br />
[[Kategorie:Protokoll]]<br />
[[Kategorie:Reverse Engineering]]</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=MediaWiki:Common.css&diff=1096MediaWiki:Common.css2017-04-15T16:45:46Z<p>Qsysopr: Farben für manuelles Highlighting hinzufgefügt</p>
<hr />
<div>/* <source lang="css"> */<br />
<br />
/*-----------------------------------------------------------------------------------------------*/<br />
/* ACHTUNG! Common.css enthält die gemeinsamen Skin-Anpassungen der deutschsprachigen Wikipedia */<br />
/*---------------------------------------------------------------------------------------------*/<br />
<br />
/* Common.css ist in drei grundlegende Abschnitte gegliedert: */<br />
<br />
/* 1. Editierbare Seiteninhalte */<br />
/* 2. Sonstige Anpassungen (Spezialseiten, u.a.) */<br />
/* 3. Hauptseitenspezifisches */<br />
<br />
/* Jede Ergänzung/Änderung muss vorher jeweils für alle Skins auf Tauglichkeit getestet werden, */<br />
/* individuell per User.css! Ist hier erstmal geändert, dauert es dank Cache eine Weile, bis die */<br />
/* Änderungen bei allen Nutzern sichtbar oder, bei Fehlern, korrigiert sind. */<br />
<br />
/* +++++ 1. ANPASSUNGEN DER ANZEIGE VON EDITIERBAREN SEITENINHALTEN +++++ */<br />
<br />
/* Personennamen in Kapitälchen: class="Person" */<br />
<br />
.Person {<br />
display: inline;<br />
font-variant: small-caps;<br />
font-style: normal;<br />
}<br />
<br />
/* [[Wikipedia:Zitate|Zitate]] (siehe [[Vorlage:Zitat]]) */<br />
<br />
p.Zitat {<br />
font-style: normal;<br />
margin-bottom: 0;<br />
}<br />
p.cite {<br />
margin-top: 0;<br />
padding-left: 1em;<br />
}<br />
<br />
/* [[Wikipedia:Quellenangaben|Quellenangaben]] nicht kursiv, da sie ggf. verschiedene Bestandteile enthalten */<br />
<br />
cite {<br />
font-style: normal;<br />
}<br />
<br />
/* Stylesheet-Ergänzung zu Standard-[[Wikipedia:Navigationsleisten|Navigationsleisten]] */<br />
<br />
div.BoxenVerschmelzen,<br />
div.NavFrame {<br />
margin: 1.5em 0 0;<br />
padding: 2px;<br />
border: 1px solid #aaaaaa;<br />
text-align: center;<br />
border-collapse: collapse;<br />
font-size: 95%;<br />
clear: both;<br />
}<br />
div.BoxenVerschmelzen div.NavFrame,<br />
div.NavFrame + div.NavFrame {<br />
margin-top: 0;<br />
}<br />
div.BoxenVerschmelzen div.NavFrame {<br />
border-style: none;<br />
border-style: hidden;<br />
}<br />
div.NavFrame + div.NavFrame {<br />
border-top-style: none;<br />
border-top-style: hidden;<br />
}<br />
div.NavPic {<br />
margin: 0;<br />
padding: 2px;<br />
float: left;<br />
}<br />
div.NavFrame div.NavHead {<br />
font-weight: bold;<br />
font-size: 100%;<br />
background-color: #efefef;<br />
}<br />
div.NavFrame p,<br />
div.NavFrame div.NavContent,<br />
div.NavFrame div.NavContent p {<br />
font-size: 100%;<br />
}<br />
div.NavEnd {<br />
margin: 0;<br />
padding: 0;<br />
line-height: 1px;<br />
clear: both;<br />
}<br />
<br />
/* Stylesheet fuer den 'Ausklappen'-Button an Navileisten, der in [[MediaWiki:Common.js]] implementiert wird */<br />
.NavToggle {<br />
font-size: x-small;<br />
float: right;<br />
}<br />
<br />
/* Workaround für Internet Explorer 6 */<br />
div.NavFrame,<br />
div.NavPic,<br />
.NavToggle {<br />
position: relative;<br />
}<br />
<br />
/* Stylesheet-Ergänzung zu SideBoxen (ehedem [[Wikipedia:TownBox|TownBox]]) */<br />
<br />
div.sideBox {<br />
position: relative;<br />
float: right;<br />
background: white;<br />
margin-left: 1em;<br />
border: 1px solid gray;<br />
padding: 0.3em;<br />
width: 200px;<br />
overflow: hidden;<br />
clear: right;<br />
}<br />
div.sideBox dl {<br />
padding: 0;<br />
margin: 0 0 0.3em 0;<br />
font-size: 96%;<br />
}<br />
div.sideBox dl dt {<br />
background: none;<br />
margin: 0.4em 0 0 0;<br />
}<br />
div.sideBox dl dd {<br />
margin: 0.1em 0 0 1.1em;<br />
background-color: #f3f3f3;<br />
}<br />
<br />
/* Stylesheet-Ergänzung zu [[Wikipedia:Taxoboxen|Taxoboxen]] und [[Wikipedia:Paläoboxen|Paläoboxen]] */<br />
table.taxobox,<br />
table.palaeobox {<br />
border-collapse: collapse;<br />
border: 1px solid gray;<br />
float: right;<br />
clear: right;<br />
margin-left: 0.5em;<br />
background-color: white;<br />
}<br />
table.taxobox th {<br />
background-color: #9bcd9b;<br />
}<br />
table.palaeobox th {<br />
background-color: #e7dcc3;<br />
}<br />
table.taxobox th,<br />
table.palaeobox th {<br />
border: solid 1px gray;<br />
text-align: center;<br />
font-weight: bold;<br />
}<br />
table.taxobox td,<br />
table.palaeobox td {<br />
vertical-align: top;<br />
}<br />
table.taxobox .Person,<br />
table.palaeobox .Person {<br />
font-style: normal;<br />
}<br />
table.taxobox div.thumb,<br />
table.taxobox div.thumb * {<br />
background-color: #f9f9f9;<br />
}<br />
table.taxobox div.thumb,<br />
table.taxobox div.thumb *,<br />
table.palaeobox div.thumb,<br />
table.palaeobox div.thumb * {<br />
margin: 0 auto;<br />
padding: 0;<br />
float: none;<br />
border: none;<br />
}<br />
table.taxobox div.magnify,<br />
table.palaeobox div.magnify {<br />
display: none;<br />
}<br />
table.taxobox tr td div.thumb div div.thumbcaption {<br />
text-align: center;<br />
}<br />
table.palaeobox tr td div.thumb div div.thumbcaption {<br />
text-align: left;<br />
}<br />
table.taxobox td.Person,<br />
table.palaeobox td.Person {<br />
text-align: center;<br />
display: block;<br />
}<br />
table.taxobox td.taxo-name,<br />
table.taxobox td.taxo-bild,<br />
table.palaeobox td.taxo-name,<br />
table.palaeobox td.taxo-bild,<br />
table.palaeobox td.taxo-zeit {<br />
text-align: center;<br />
}<br />
table.palaeobox td.taxo-ort {<br />
text-align: left;<br />
}<br />
<br />
/* aus Vorlage zur Entlastung, skinabhängigen Darstellung und Kombinierbarkeit hierher ausgelagert */<br />
.wikitable,<br />
.prettytable {<br />
margin: 1em 1em 1em 0;<br />
background: #f9f9f9;<br />
border: 1px #aaa solid;<br />
border-collapse: collapse;<br />
}<br />
.prettytable th,<br />
.prettytable td {<br />
border: 1px #aaa solid;<br />
padding: 0.2em;<br />
}<br />
.prettytable th {<br />
text-align: center;<br />
}<br />
.prettytable caption {<br />
font-weight: bold;<br />
}<br />
<br />
/* Zebra-Tabellen */<br />
table.wikitable.zebra tr:nth-child(even) {<br />
background: white;<br />
}<br />
<br />
.nogrid th,<br />
.nogrid td {<br />
border: none;<br />
}<br />
div.float-left,<br />
table.float-left,<br />
.float-left {<br />
float: left;<br />
clear: left;<br />
}<br />
div.float-right,<br />
table.float-right,<br />
.float-right {<br />
float: right;<br />
clear: right;<br />
margin: 1em 0 1em 1em;<br />
}<br />
div.centered,<br />
table.centered,<br />
.centered {<br />
margin-left: auto;<br />
margin-right: auto;<br />
}<br />
.toptextcells td {<br />
vertical-align: top;<br />
}<br />
<br />
/* Bitte KEINE weiteren Definitionen dieser Art für Boxen hier, das gehört in entsprechende Vorlagen! */<br />
/* Hier 20 Mal Trivialitäten wie "text-align:center" zu definieren verlangsamt alles und ist nicht */<br />
/* Sinn der Sache. (Und wer nicht weiß warum, hat's nicht verstanden.) */<br />
<br />
/* Do not expand [[Wikipedia:WikiProjekt Georeferenzierung|kvaleberg.com-URLs]] for printing */<br />
<br />
#content span.coordinates a.external.text:after,<br />
#content span.coordinates a.external.autonumber:after,<br />
#content div.coordinates a.external.text:after,<br />
#content div.coordinates a.external.autonumber:after {<br />
content: "";<br />
}<br />
<br />
/* Do not expand URLs for printing */<br />
<br />
#content span.plainlinks-print a.external.text:after,<br />
#content span.plainlinks-print a.external.autonumber:after,<br />
#content div.plainlinks-print a.external.text:after,<br />
#content div.plainlinks-print a.external.autonumber:after {<br />
content: "";<br />
}<br />
<br />
/* Metadaten (bspw. [[Wikipedia:Personendaten|Personendaten]]) */<br />
<br />
table.metadata {<br />
border: 1px solid #aaaaaa;<br />
display: none;<br />
}<br />
.metadata-label {<br />
color: #aaaaaa;<br />
}<br />
span.metadata,<br />
span.metadata-inline {<br />
display: none;<br />
}<br />
<br />
/*<br />
* Farbdefinitionen für Rahmen und Hintergründe von [[Wikipedia:Textbausteine|Textbausteinen]].<br />
* Hier: Standardvorgaben für "dunkle Schrift auf hellem Grund".<br />
* Für Hell-auf-dunkel-Skins ([[MediaWiki:Amethyst.css|Amethyst]]) müssen dort entsprechende Definitionen<br />
* zusätzlich eingetragen werden! Anpassungen für andere Skins sind optional.<br />
* (Die Angaben der Rahmenstärke dienen der Bequemlichkeit, so dass man<br />
* für dünne Rahmen nur noch "border-style" angeben muss.)<br />
*/<br />
<br />
.rahmenfarbe1 { /* Wie Inhaltsverzeichnis */<br />
border-color: #aaaaaa;<br />
border-width: 1px;<br />
}<br />
.rahmenfarbe2 { /* Unauffällig, geringer Kontrast */<br />
border-color: #e9e9e9;<br />
border-width: 1px;<br />
}<br />
.rahmenfarbe3 { /* "Rot", auffällig */<br />
border-color: #c00000;<br />
border-width: 1px;<br />
}<br />
.rahmenfarbe4 { /* Neutrale Farbe, deutlich */<br />
border-color: #8888aa;<br />
border-width: 1px;<br />
}<br />
.rahmenfarbe5 { /* "Schwarz", hoher Kontrast */<br />
border-color: #000000;<br />
border-width: 1px;<br />
}<br />
<br />
tr.hintergrundfarbe1 th,<br />
tr th.hintergrundfarbe1,<br />
table.hintergrundfarbe1,<br />
.hintergrundfarbe1 { /* Wie Inhaltsverzeichnis */<br />
background-color: #f9f9f9;<br />
}<br />
tr.hintergrundfarbe2 th,<br />
tr th.hintergrundfarbe2,<br />
table.hintergrundfarbe2,<br />
.hintergrundfarbe2 { /* "Weiß", für Nicht-Artikel-Seiten, neutral */<br />
background-color: #ffffff;<br />
}<br />
tr.hintergrundfarbe3 th,<br />
tr th.hintergrundfarbe3,<br />
table.hintergrundfarbe3,<br />
.hintergrundfarbe3 { /* "Gelb", auffällig */<br />
background-color: #ffff40;<br />
}<br />
tr.hintergrundfarbe4 th,<br />
tr th.hintergrundfarbe4,<br />
table.hintergrundfarbe4,<br />
.hintergrundfarbe4 { /* Sehr auffällig */<br />
background-color: #ffaa00;<br />
}<br />
tr.hintergrundfarbe5 th,<br />
tr th.hintergrundfarbe5,<br />
table.hintergrundfarbe5,<br />
.hintergrundfarbe5 { /* Neutral, abgesetzt */<br />
background-color: #e0e0e0;<br />
}<br />
tr.hintergrundfarbe6 th,<br />
tr th.hintergrundfarbe6,<br />
table.hintergrundfarbe6,<br />
.hintergrundfarbe6 { /* Allgemein „bunt“, für Hervorhebungen und Unterscheidungen */<br />
background-color: #b3b7ff;<br />
}<br />
tr.hintergrundfarbe7 th,<br />
tr th.hintergrundfarbe7,<br />
table.hintergrundfarbe7,<br />
.hintergrundfarbe7 { /* Allgemein „bunt“, für Hervorhebungen und Unterscheidungen */<br />
background-color: #ffcbcb;<br />
}<br />
tr.hintergrundfarbe8 th,<br />
tr th.hintergrundfarbe8,<br />
table.hintergrundfarbe8,<br />
.hintergrundfarbe8 { /* Allgemein „bunt“, für Hervorhebungen und Unterscheidungen */<br />
background-color: #ffebad;<br />
}<br />
tr.hintergrundfarbe9 th,<br />
tr th.hintergrundfarbe9,<br />
table.hintergrundfarbe9,<br />
.hintergrundfarbe9 { /* Allgemein „bunt“, für Hervorhebungen und Unterscheidungen */<br />
background-color: #b9ffc5;<br />
}<br />
<br />
/* Keine Vergrößerung der Zeilenhöhe durch hochgestellte Zahlen der Fußnoten */<br />
<br />
sup.reference {<br />
font-weight: 400;<br />
font-style: normal;<br />
}<br />
sup,<br />
sub {<br />
line-height: 1em;<br />
}<br />
<br />
/* Hervorhebung der angeklickten Fußnoten und der Rückverweise in blau */<br />
<br />
ol.references > li:target,<br />
sup.reference:target {<br />
background-color: #def;<br />
}<br />
<br />
/* Hochgestellte Buchstaben in der Einzelnachweiseliste kursiv setzen */<br />
<br />
ol.references li a[href|="#cite_ref"] {<br />
font-style: italic;<br />
}<br />
<br />
/* Inline-Verwendung der [[:Kategorie:Vorlage:Schwesterprojektverweis|Schwesterprojektverweise]] */<br />
<br />
ol.references li div.sisterproject {<br />
display: inline !important;<br />
}<br />
<br />
/* Für <nowiki><hiero>…</hiero></nowiki> */<br />
<br />
.mw-hierotable,<br />
.mw-hierotable th,<br />
.mw-hierotable td {<br />
border: 0;<br />
padding: 0;<br />
}<br />
<br />
/* Für [[MediaWiki:Anoneditwarning]] und weitere Hinweise, die alle untereinander stehen */<br />
<br />
#mw-anon-edit-warning,<br />
#mw-missingsummary,<br />
#wp_talkpagetext {<br />
width: 80%;<br />
background: #d3e1f2;<br />
border: 1px solid #1a47ff;<br />
margin: 1em auto;<br />
padding: 1em;<br />
}<br />
<br />
/* Bei URLs, die auf unser Projekt und verwandte Projekte verweisen, den Pfeil ausblenden<br />
* Dieser Pfeil dient nur dazu, auf externe Ziele hinzuweisen<br />
* Auf den Einsatz der Klasse "plainlinks" kann dadurch verzichtet werden<br />
*/<br />
#content a[href^="http://de.wikipedia.org"],<br />
#content a[href^="http://toolserver.org"] {<br />
background: none !important;<br />
padding-right: 0 !important;<br />
}<br />
#content .mw-search-formheader div.search-types ul li a[href^="http://de.wikipedia.org"],<br />
#content .mw-search-formheader div.search-types ul li a[href^="http://toolserver.org"] {<br />
padding-right: 0.5em !important; <br />
}<br />
<br />
/* Falls bei der Seitenbearbeitung vergessen wurde, die Zusammenfassung auszufüllen */<br />
.mw-summarymissed {<br />
border: 5px solid red;<br />
padding: 2px;<br />
}<br />
<br />
/* Copyrightwarnung */<br />
<br />
#editpage-copywarn {<br />
border: solid 1px #c00000;<br />
font-size: 90%;<br />
background-color: #ffffff;<br />
}<br />
<br />
.mw-tos-summary {<br />
border: solid 1px #c00000;<br />
background-color: #ffffff;<br />
padding-left: 1em;<br />
}<br />
<br />
/* +++++ 2. SONSTIGE ANPASSUNGEN (Spezialseiten u. a.) +++++ */<br />
<br />
/* Markierung von Redirects in [[Special:Allpages]], [[Special:Watchlist]], Kategorien */<br />
<br />
.allpagesredirect,<br />
.watchlistredir,<br />
.redirect-in-category {<br />
font-style: italic;<br />
}<br />
<br />
/* Fettformatierung von Admin-Spezialseiten in [[Special:Specialpages]] abschalten */<br />
.mw-specialpagerestricted strong {<br />
font-weight: normal;<br />
}<br />
/* Legende auf [[Special:Specialpages]] ebenfalls abschalten */<br />
div.mw-specialpages-notes {<br />
display: none;<br />
}<br />
<br />
/* Größerer Abstand zwischen TOC-Nummerierung und TOC-Eintrag */<br />
span.tocnumber {<br />
margin-right: 0.3em;<br />
}<br />
<br />
/* Skinabhängige absolute Positionierungen ausblenden */<br />
/* Bitte [[MediaWiki Diskussion:Common.css#Absolute_Positionierungen]] beachten */<br />
<br />
#coordinates,<br />
#coordinates_3_ObenRechts,<br />
#issnlink,<br />
#editcount,<br />
#shortcut,<br />
#artikelstadium,<br />
.topicon,<br />
#spoken-icon,<br />
#commons-icon {<br />
display: none;<br />
}<br />
<br />
/* Anpassungen für [[:Template:Link_FA]] */<br />
<br />
/* hide the template */<br />
#bodyContent span.FA {<br />
display: none;<br />
}<br />
<br />
/* change the bullets for links to special articles */<br />
#p-lang li.FA {<br />
/* hier immer auch linkFA_bullet in Common.js mit anpassen für die älteren skins! */<br />
list-style-image: url("http://upload.wikimedia.org/wikipedia/commons/d/d0/Monobook-bullet-star-transparent.png");<br />
}<br />
<br />
/* change the bullets for links to special articles */<br />
#p-lang li.GA {<br />
/* hier immer auch linkGA_bullet in Common.js mit anpassen für die älteren skins! */<br />
list-style-image: url("http://upload.wikimedia.org/wikipedia/commons/a/a1/Monobook-bullet-star-gray.png");<br />
}<br />
<br />
/* Verhindere, dass Infoboxen etc. in den Inhalt von Kategorien hineinragen.<br />
Das betrifft nur Kategorieseiten. */<br />
#mw-subcategories,<br />
#mw-pages {<br />
clear: both;<br />
}<br />
<br />
/* DIVs in ImageMaps inlinen (Vorschlag von Revolus) */<br />
.imagemap-inline div {<br />
display: inline;<br />
}<br />
<br />
/* [[Special:Hochladen]]: Warnmeldung auf bestehende Dateien, unerwünschte Prefixe usw. deutlicher hervorheben. */<br />
<br />
#wpDestFile-warning ul {<br />
border: solid red 1px;<br />
padding: 1.5em;<br />
}<br />
<br />
/* Warnmeldung für gesperrte Titel */<br />
.mw-titleprotectedwarning {<br />
background-color: #eee;<br />
border: 2px solid red;<br />
padding: 1em;<br />
}<br />
<br />
/* Warnmeldung bei der Bearbeitung von Seiten im MediaWiki-Namensraum */<br />
.mw-editinginterface {<br />
background-color: #f9f9f9;<br />
border-color: #c00000;<br />
border-width: 1px;<br />
border-style: solid;<br />
padding: 2px;<br />
}<br />
<br />
/* Überschrift 5. und 6. Ordnung proportionaler zu Fließtext */<br />
#content h5 {<br />
font-size: 108%; /* Original: 116% */<br />
}<br />
#content h6 {<br />
font-size: 100%; /* Original: 80% = kleiner als Bodytext, unschön */<br />
}<br />
#content h6 .editsection {<br />
font-size: 120%;<br />
font-weight: normal;<br />
}<br />
<br />
/* Anleitung auf Special:Search */<br />
.mw-searchresult {<br />
font-size: 84%;<br />
margin: 5px;<br />
}<br />
<br />
/* Gestaltung der Edittools-Leiste */<br />
#specialchars {<br />
margin-top: 3px;<br />
border: solid 1px #aaaaaa;<br />
padding: 1px;<br />
text-align: left;<br />
background-color: white;<br />
}<br />
<br />
/* Legende für Versionsgeschichte */<br />
.mw-history-legend {<br />
font-size: 90%;<br />
margin-top: 2px;<br />
margin-bottom: 2px;<br />
border: solid 1px #e9e9e9;<br />
padding: 0 5px 5px 5px;<br />
background-color: #f9f9f9;<br />
clear: both;<br />
}<br />
<br />
/* +++++ 3. NEUE [[Wikipedia:Hauptseite|HAUPTSEITE]] (ab 2006) +++++ */<br />
<br />
/* Kategorie verbergen */<br />
/* Überschrift verbergen */<br />
/* Redirhinweis verbergen - ACHTUNG: Je nach Skin muss jetzt der Abstand zum oberen Rand korrigiert werden */<br />
body.page-Wikipedia_Hauptseite #catlinks,<br />
body.page-Wikipedia_Hauptseite h1.firstHeading,<br />
body.page-Wikipedia_Hauptseite #contentSub {<br />
display: none;<br />
}<br />
<br />
#hauptseite h2 {<br />
background-color: #d8e8ff;<br />
border: 1px solid #8898bf;<br />
font-size: 1em;<br />
font-weight: bold;<br />
margin-top: 0;<br />
margin-bottom: 0;<br />
padding-top: 0.1em;<br />
padding-bottom: 0.1em;<br />
}<br />
#hauptseite .inhalt {<br />
background-color: #ffffff;<br />
border: 1px solid #8898bf;<br />
border-top: 0 solid white;<br />
padding: 0.3em 0.8em 0.4em 0.8em;<br />
}<br />
#hauptseite .inhalt hr {<br />
background-color: #8898bf;<br />
color: #8898bf;<br />
height: 1px;<br />
margin: 0.5em 0;<br />
padding: 0;<br />
}<br />
#hauptseite .inhalt .mehr {<br />
clear: both;<br />
font-size: 95%;<br />
margin-top: 0.8em;<br />
text-align: right;<br />
}<br />
#hauptseite table {<br />
background-color: transparent;<br />
}<br />
.hauptseite-oben,<br />
.hauptseite-links,<br />
.hauptseite-rechts {<br />
margin-bottom: 1em;<br />
}<br />
.hauptseite-links {<br />
margin-right: 0.5em;<br />
}<br />
.hauptseite-rechts {<br />
margin-left: 0.5em;<br />
}<br />
.hauptseite-oben h2,<br />
.hauptseite-unten h2 {<br />
text-align: center;<br />
}<br />
.hauptseite-oben .inhalt .portale {<br />
font-weight: bold;<br />
margin-top: 0.2em;<br />
margin-bottom: 0.2em;<br />
}<br />
.hauptseite-oben .inhalt .intern {<br />
font-size: 90%;<br />
text-align: center;<br />
}<br />
.hauptseite-links h2,<br />
.hauptseite-rechts h2 {<br />
text-indent: 0.8em;<br />
}<br />
#hauptseite-schwesterprojekte .inhalt a {<br />
font-weight: bold;<br />
}<br />
<br />
/* IPA links nicht unterstreichen */<br />
.IPA a:link,<br />
.IPA a:visited {<br />
text-decoration: none;<br />
}<br />
<br />
/* CSS-Klassen für Schriftarten als Workaround für Defizite in alten IE-Versionen.<br />
* Achtung: IE6 mag keine Zeilenumbrüche zwischen den Fonts.<br />
* In IE8 nicht mehr nötig, soll mit den alten Versionen aussterben. Browserweiche:<br />
* http://www.dynamicsitesolutions.com/css/filters/star-html/<br />
* http://www.dynamicsitesolutions.com/css/filters/first-child-plus-html/<br />
*/<br />
* html .Unicode {<br />
font-family: Code2000, Sun-ExtA, "Arial Unicode MS", NSimSun, sans-serif;<br />
}<br />
*:first-child+html .Unicode {<br />
font-family: Code2000, Sun-ExtA, "Arial Unicode MS", NSimSun, sans-serif;<br />
}<br />
* html .Unicode1 {<br />
font-family: Code2001, Quivira, "MPH 2B Damase", sans-serif;<br />
}<br />
*:first-child+html .Unicode1 {<br />
font-family: Code2001, Quivira, "MPH 2B Damase", sans-serif;<br />
}<br />
* html .Unicode2 {<br />
font-family: Sun-ExtB, Code2002, sans-serif;<br />
}<br />
*:first-child+html .Unicode2 {<br />
font-family: Sun-ExtB, Code2002, sans-serif;<br />
}<br />
* html .IPA {<br />
font-family: Quivira, Code2000, Sun-ExtA, "DejaVu Sans", Gentium, Helvetica, "Arial Unicode MS", "Lucida Sans Unicode", sans-serif;<br />
}<br />
*:first-child+html .IPA {<br />
font-family: Quivira, Code2000, Sun-ExtA, "DejaVu Sans", Gentium, Helvetica, "Arial Unicode MS", "Lucida Sans Unicode", sans-serif;<br />
}<br />
* html .IAST {<br />
font-family: Code2000, SunExtA, "Arial Unicode MS", sans-serif;<br />
}<br />
*:first-child+html .IAST {<br />
font-family: Code2000, SunExtA, "Arial Unicode MS", sans-serif;<br />
}<br />
* html .altitalisch {<br />
font-family: Quivira, Code2001, "MPH 2B Damase", sans-serif;<br />
}<br />
*:first-child+html .altitalisch {<br />
font-family: Quivira, Code2001, "MPH 2B Damase", sans-serif;<br />
}<br />
* html .gotisch {<br />
font-family: Quivira, Code2001, "MPH 2B Damase", sans-serif;<br />
}<br />
*:first-child+html .gotisch {<br />
font-family: Quivira, Code2001, "MPH 2B Damase", sans-serif;<br />
}<br />
* html .hebrew {<br />
font-family: Quivira, Sun-ExtA, "Arial Unicode MS", "SBL Hebrew", Code2000, "MPH 2B Damase", sans-serif;<br />
}<br />
*:first-child+html .hebrew {<br />
font-family: Quivira, Sun-ExtA, "Arial Unicode MS", "SBL Hebrew", Code2000, "MPH 2B Damase", sans-serif;<br />
}<br />
* html .spanAr {<br />
font-family: "Arial Unicode MS", Scheherazade, Code2000, "DejaVu Sans", sans-serif;<br />
}<br />
*:first-child+html .spanAr {<br />
font-family: "Arial Unicode MS", Scheherazade, Code2000, "DejaVu Sans", sans-serif;<br />
}<br />
* html .music-symbol {<br />
font-family: "Musical Symbols", Euterpe, Code2001, sans-serif;<br />
}<br />
*:first-child+html .music-symbol {<br />
font-family: "Musical Symbols", Euterpe, Code2001, sans-serif;<br />
}<br />
* html .polytonic {<br />
font-family: "Arial Unicode MS", "Palatino Linotype", Code2000, "New Athena Unicode", Gentium, "Athena Unicode";<br />
}<br />
*:first-child+html .polytonic {<br />
font-family: "Arial Unicode MS", "Palatino Linotype", Code2000, "New Athena Unicode", Gentium, "Athena Unicode";<br />
}<br />
<br />
/* Standardmäßige Ausblendung der Flagged-Revisions-Backlog-Sitenotice */<br />
#mw-oldreviewed-notice {<br />
display: none;<br />
}<br />
<br />
/* Standardmäßige Ausblendung der Flagged-Revisions-Kommentarbox */<br />
#mw-commentbox {<br />
display: none;<br />
}<br />
<br />
/* Abstand zwischen Liste und Inhaltsverzeichnis erhöhen, siehe http://de.wikipedia.org/w/index.php?title=MediaWiki_Diskussion:Common.css&oldid=51639015#Abstand_vor_Inhaltsverzeichnis */<br />
ul + .toc,<br />
ol + .toc {<br />
margin-top: 0.5em;<br />
}<br />
<br />
/* höheres Uploadfeld */<br />
#wpUploadDescription {<br />
height: 20em;<br />
}<br />
<br />
/* Im Projekt WP:GEO benutzt die [[Vorlage:Coordinate]] das «geo-microformat» zur semantischen<br />
Auszeichnung des Texts. Der Inhalt dieses [[Tag (Informatik)|Tags]] ist nicht für den Leser bestimmt. */<br />
.geo {<br />
display: none;<br />
}<br />
<br />
/* Patrollink ausblenden, da die Eweiterung hier nicht aktiviert ist und<br />
deren Optik zu sehr den gesichteten Versionen ähnelt. */<br />
.fr-diff-patrollink,<br />
.patrollink {<br />
display: none;<br />
}<br />
<br />
/* Rollback-Knopf auf Beobachtungsliste ausblenden, da es dort nur von sehr beschränktem Nutzen<br />
ist und zu sehr vielen Reverts aus Versehen führt */<br />
.page-Spezial_Beobachtungsliste .mw-rollback-link {<br />
display: none;<br />
}<br />
<br />
/* </source> */<br />
<br />
/* Disable Discussion-tab */<br />
<br />
#ca-talk {<br />
display: none;<br />
}<br />
<br />
<br />
/* reset code style */<br />
<br />
code {<br />
background-color: none !important;<br />
border: none !important;<br />
border-radius: 0;<br />
padding: 0;<br />
}<br />
<br />
pre {<br />
white-space: pre;<br />
}<br />
<br />
/* highlighting */<br />
<br />
.hb1 { background-color: #C1F5C1; }<br />
.hb2 { background-color: #CDC2EF; }<br />
.hb3 { background-color: #FFF6C9; }<br />
.hb4 { background-color: #FFC9C9; }<br />
.hb5 { background-color: #BED8ED; }<br />
.hb6 { background-color: #EDBBED; }<br />
.hb7 { background-color: #F4FDC7; }<br />
.hb8 { background-color: #FFE8C9; }<br />
<br />
.hf1 { color: #66D766; }<br />
.hf2 { color: #7C67C0; }<br />
.hf3 { color: #FFE879; }<br />
.hf4 { color: #FF7979; }<br />
.hf5 { color: #5D90B7; }<br />
.hf6 { color: #B857B8; }<br />
.hf7 { color: #E2F876; }<br />
.hf8 { color: #FFC679; }</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=MediaWiki:Common.css&diff=1095MediaWiki:Common.css2017-04-15T16:43:51Z<p>Qsysopr: Keine Zeilenumbrüche in pre-Tags</p>
<hr />
<div>/* <source lang="css"> */<br />
<br />
/*-----------------------------------------------------------------------------------------------*/<br />
/* ACHTUNG! Common.css enthält die gemeinsamen Skin-Anpassungen der deutschsprachigen Wikipedia */<br />
/*---------------------------------------------------------------------------------------------*/<br />
<br />
/* Common.css ist in drei grundlegende Abschnitte gegliedert: */<br />
<br />
/* 1. Editierbare Seiteninhalte */<br />
/* 2. Sonstige Anpassungen (Spezialseiten, u.a.) */<br />
/* 3. Hauptseitenspezifisches */<br />
<br />
/* Jede Ergänzung/Änderung muss vorher jeweils für alle Skins auf Tauglichkeit getestet werden, */<br />
/* individuell per User.css! Ist hier erstmal geändert, dauert es dank Cache eine Weile, bis die */<br />
/* Änderungen bei allen Nutzern sichtbar oder, bei Fehlern, korrigiert sind. */<br />
<br />
/* +++++ 1. ANPASSUNGEN DER ANZEIGE VON EDITIERBAREN SEITENINHALTEN +++++ */<br />
<br />
/* Personennamen in Kapitälchen: class="Person" */<br />
<br />
.Person {<br />
display: inline;<br />
font-variant: small-caps;<br />
font-style: normal;<br />
}<br />
<br />
/* [[Wikipedia:Zitate|Zitate]] (siehe [[Vorlage:Zitat]]) */<br />
<br />
p.Zitat {<br />
font-style: normal;<br />
margin-bottom: 0;<br />
}<br />
p.cite {<br />
margin-top: 0;<br />
padding-left: 1em;<br />
}<br />
<br />
/* [[Wikipedia:Quellenangaben|Quellenangaben]] nicht kursiv, da sie ggf. verschiedene Bestandteile enthalten */<br />
<br />
cite {<br />
font-style: normal;<br />
}<br />
<br />
/* Stylesheet-Ergänzung zu Standard-[[Wikipedia:Navigationsleisten|Navigationsleisten]] */<br />
<br />
div.BoxenVerschmelzen,<br />
div.NavFrame {<br />
margin: 1.5em 0 0;<br />
padding: 2px;<br />
border: 1px solid #aaaaaa;<br />
text-align: center;<br />
border-collapse: collapse;<br />
font-size: 95%;<br />
clear: both;<br />
}<br />
div.BoxenVerschmelzen div.NavFrame,<br />
div.NavFrame + div.NavFrame {<br />
margin-top: 0;<br />
}<br />
div.BoxenVerschmelzen div.NavFrame {<br />
border-style: none;<br />
border-style: hidden;<br />
}<br />
div.NavFrame + div.NavFrame {<br />
border-top-style: none;<br />
border-top-style: hidden;<br />
}<br />
div.NavPic {<br />
margin: 0;<br />
padding: 2px;<br />
float: left;<br />
}<br />
div.NavFrame div.NavHead {<br />
font-weight: bold;<br />
font-size: 100%;<br />
background-color: #efefef;<br />
}<br />
div.NavFrame p,<br />
div.NavFrame div.NavContent,<br />
div.NavFrame div.NavContent p {<br />
font-size: 100%;<br />
}<br />
div.NavEnd {<br />
margin: 0;<br />
padding: 0;<br />
line-height: 1px;<br />
clear: both;<br />
}<br />
<br />
/* Stylesheet fuer den 'Ausklappen'-Button an Navileisten, der in [[MediaWiki:Common.js]] implementiert wird */<br />
.NavToggle {<br />
font-size: x-small;<br />
float: right;<br />
}<br />
<br />
/* Workaround für Internet Explorer 6 */<br />
div.NavFrame,<br />
div.NavPic,<br />
.NavToggle {<br />
position: relative;<br />
}<br />
<br />
/* Stylesheet-Ergänzung zu SideBoxen (ehedem [[Wikipedia:TownBox|TownBox]]) */<br />
<br />
div.sideBox {<br />
position: relative;<br />
float: right;<br />
background: white;<br />
margin-left: 1em;<br />
border: 1px solid gray;<br />
padding: 0.3em;<br />
width: 200px;<br />
overflow: hidden;<br />
clear: right;<br />
}<br />
div.sideBox dl {<br />
padding: 0;<br />
margin: 0 0 0.3em 0;<br />
font-size: 96%;<br />
}<br />
div.sideBox dl dt {<br />
background: none;<br />
margin: 0.4em 0 0 0;<br />
}<br />
div.sideBox dl dd {<br />
margin: 0.1em 0 0 1.1em;<br />
background-color: #f3f3f3;<br />
}<br />
<br />
/* Stylesheet-Ergänzung zu [[Wikipedia:Taxoboxen|Taxoboxen]] und [[Wikipedia:Paläoboxen|Paläoboxen]] */<br />
table.taxobox,<br />
table.palaeobox {<br />
border-collapse: collapse;<br />
border: 1px solid gray;<br />
float: right;<br />
clear: right;<br />
margin-left: 0.5em;<br />
background-color: white;<br />
}<br />
table.taxobox th {<br />
background-color: #9bcd9b;<br />
}<br />
table.palaeobox th {<br />
background-color: #e7dcc3;<br />
}<br />
table.taxobox th,<br />
table.palaeobox th {<br />
border: solid 1px gray;<br />
text-align: center;<br />
font-weight: bold;<br />
}<br />
table.taxobox td,<br />
table.palaeobox td {<br />
vertical-align: top;<br />
}<br />
table.taxobox .Person,<br />
table.palaeobox .Person {<br />
font-style: normal;<br />
}<br />
table.taxobox div.thumb,<br />
table.taxobox div.thumb * {<br />
background-color: #f9f9f9;<br />
}<br />
table.taxobox div.thumb,<br />
table.taxobox div.thumb *,<br />
table.palaeobox div.thumb,<br />
table.palaeobox div.thumb * {<br />
margin: 0 auto;<br />
padding: 0;<br />
float: none;<br />
border: none;<br />
}<br />
table.taxobox div.magnify,<br />
table.palaeobox div.magnify {<br />
display: none;<br />
}<br />
table.taxobox tr td div.thumb div div.thumbcaption {<br />
text-align: center;<br />
}<br />
table.palaeobox tr td div.thumb div div.thumbcaption {<br />
text-align: left;<br />
}<br />
table.taxobox td.Person,<br />
table.palaeobox td.Person {<br />
text-align: center;<br />
display: block;<br />
}<br />
table.taxobox td.taxo-name,<br />
table.taxobox td.taxo-bild,<br />
table.palaeobox td.taxo-name,<br />
table.palaeobox td.taxo-bild,<br />
table.palaeobox td.taxo-zeit {<br />
text-align: center;<br />
}<br />
table.palaeobox td.taxo-ort {<br />
text-align: left;<br />
}<br />
<br />
/* aus Vorlage zur Entlastung, skinabhängigen Darstellung und Kombinierbarkeit hierher ausgelagert */<br />
.wikitable,<br />
.prettytable {<br />
margin: 1em 1em 1em 0;<br />
background: #f9f9f9;<br />
border: 1px #aaa solid;<br />
border-collapse: collapse;<br />
}<br />
.prettytable th,<br />
.prettytable td {<br />
border: 1px #aaa solid;<br />
padding: 0.2em;<br />
}<br />
.prettytable th {<br />
text-align: center;<br />
}<br />
.prettytable caption {<br />
font-weight: bold;<br />
}<br />
<br />
/* Zebra-Tabellen */<br />
table.wikitable.zebra tr:nth-child(even) {<br />
background: white;<br />
}<br />
<br />
.nogrid th,<br />
.nogrid td {<br />
border: none;<br />
}<br />
div.float-left,<br />
table.float-left,<br />
.float-left {<br />
float: left;<br />
clear: left;<br />
}<br />
div.float-right,<br />
table.float-right,<br />
.float-right {<br />
float: right;<br />
clear: right;<br />
margin: 1em 0 1em 1em;<br />
}<br />
div.centered,<br />
table.centered,<br />
.centered {<br />
margin-left: auto;<br />
margin-right: auto;<br />
}<br />
.toptextcells td {<br />
vertical-align: top;<br />
}<br />
<br />
/* Bitte KEINE weiteren Definitionen dieser Art für Boxen hier, das gehört in entsprechende Vorlagen! */<br />
/* Hier 20 Mal Trivialitäten wie "text-align:center" zu definieren verlangsamt alles und ist nicht */<br />
/* Sinn der Sache. (Und wer nicht weiß warum, hat's nicht verstanden.) */<br />
<br />
/* Do not expand [[Wikipedia:WikiProjekt Georeferenzierung|kvaleberg.com-URLs]] for printing */<br />
<br />
#content span.coordinates a.external.text:after,<br />
#content span.coordinates a.external.autonumber:after,<br />
#content div.coordinates a.external.text:after,<br />
#content div.coordinates a.external.autonumber:after {<br />
content: "";<br />
}<br />
<br />
/* Do not expand URLs for printing */<br />
<br />
#content span.plainlinks-print a.external.text:after,<br />
#content span.plainlinks-print a.external.autonumber:after,<br />
#content div.plainlinks-print a.external.text:after,<br />
#content div.plainlinks-print a.external.autonumber:after {<br />
content: "";<br />
}<br />
<br />
/* Metadaten (bspw. [[Wikipedia:Personendaten|Personendaten]]) */<br />
<br />
table.metadata {<br />
border: 1px solid #aaaaaa;<br />
display: none;<br />
}<br />
.metadata-label {<br />
color: #aaaaaa;<br />
}<br />
span.metadata,<br />
span.metadata-inline {<br />
display: none;<br />
}<br />
<br />
/*<br />
* Farbdefinitionen für Rahmen und Hintergründe von [[Wikipedia:Textbausteine|Textbausteinen]].<br />
* Hier: Standardvorgaben für "dunkle Schrift auf hellem Grund".<br />
* Für Hell-auf-dunkel-Skins ([[MediaWiki:Amethyst.css|Amethyst]]) müssen dort entsprechende Definitionen<br />
* zusätzlich eingetragen werden! Anpassungen für andere Skins sind optional.<br />
* (Die Angaben der Rahmenstärke dienen der Bequemlichkeit, so dass man<br />
* für dünne Rahmen nur noch "border-style" angeben muss.)<br />
*/<br />
<br />
.rahmenfarbe1 { /* Wie Inhaltsverzeichnis */<br />
border-color: #aaaaaa;<br />
border-width: 1px;<br />
}<br />
.rahmenfarbe2 { /* Unauffällig, geringer Kontrast */<br />
border-color: #e9e9e9;<br />
border-width: 1px;<br />
}<br />
.rahmenfarbe3 { /* "Rot", auffällig */<br />
border-color: #c00000;<br />
border-width: 1px;<br />
}<br />
.rahmenfarbe4 { /* Neutrale Farbe, deutlich */<br />
border-color: #8888aa;<br />
border-width: 1px;<br />
}<br />
.rahmenfarbe5 { /* "Schwarz", hoher Kontrast */<br />
border-color: #000000;<br />
border-width: 1px;<br />
}<br />
<br />
tr.hintergrundfarbe1 th,<br />
tr th.hintergrundfarbe1,<br />
table.hintergrundfarbe1,<br />
.hintergrundfarbe1 { /* Wie Inhaltsverzeichnis */<br />
background-color: #f9f9f9;<br />
}<br />
tr.hintergrundfarbe2 th,<br />
tr th.hintergrundfarbe2,<br />
table.hintergrundfarbe2,<br />
.hintergrundfarbe2 { /* "Weiß", für Nicht-Artikel-Seiten, neutral */<br />
background-color: #ffffff;<br />
}<br />
tr.hintergrundfarbe3 th,<br />
tr th.hintergrundfarbe3,<br />
table.hintergrundfarbe3,<br />
.hintergrundfarbe3 { /* "Gelb", auffällig */<br />
background-color: #ffff40;<br />
}<br />
tr.hintergrundfarbe4 th,<br />
tr th.hintergrundfarbe4,<br />
table.hintergrundfarbe4,<br />
.hintergrundfarbe4 { /* Sehr auffällig */<br />
background-color: #ffaa00;<br />
}<br />
tr.hintergrundfarbe5 th,<br />
tr th.hintergrundfarbe5,<br />
table.hintergrundfarbe5,<br />
.hintergrundfarbe5 { /* Neutral, abgesetzt */<br />
background-color: #e0e0e0;<br />
}<br />
tr.hintergrundfarbe6 th,<br />
tr th.hintergrundfarbe6,<br />
table.hintergrundfarbe6,<br />
.hintergrundfarbe6 { /* Allgemein „bunt“, für Hervorhebungen und Unterscheidungen */<br />
background-color: #b3b7ff;<br />
}<br />
tr.hintergrundfarbe7 th,<br />
tr th.hintergrundfarbe7,<br />
table.hintergrundfarbe7,<br />
.hintergrundfarbe7 { /* Allgemein „bunt“, für Hervorhebungen und Unterscheidungen */<br />
background-color: #ffcbcb;<br />
}<br />
tr.hintergrundfarbe8 th,<br />
tr th.hintergrundfarbe8,<br />
table.hintergrundfarbe8,<br />
.hintergrundfarbe8 { /* Allgemein „bunt“, für Hervorhebungen und Unterscheidungen */<br />
background-color: #ffebad;<br />
}<br />
tr.hintergrundfarbe9 th,<br />
tr th.hintergrundfarbe9,<br />
table.hintergrundfarbe9,<br />
.hintergrundfarbe9 { /* Allgemein „bunt“, für Hervorhebungen und Unterscheidungen */<br />
background-color: #b9ffc5;<br />
}<br />
<br />
/* Keine Vergrößerung der Zeilenhöhe durch hochgestellte Zahlen der Fußnoten */<br />
<br />
sup.reference {<br />
font-weight: 400;<br />
font-style: normal;<br />
}<br />
sup,<br />
sub {<br />
line-height: 1em;<br />
}<br />
<br />
/* Hervorhebung der angeklickten Fußnoten und der Rückverweise in blau */<br />
<br />
ol.references > li:target,<br />
sup.reference:target {<br />
background-color: #def;<br />
}<br />
<br />
/* Hochgestellte Buchstaben in der Einzelnachweiseliste kursiv setzen */<br />
<br />
ol.references li a[href|="#cite_ref"] {<br />
font-style: italic;<br />
}<br />
<br />
/* Inline-Verwendung der [[:Kategorie:Vorlage:Schwesterprojektverweis|Schwesterprojektverweise]] */<br />
<br />
ol.references li div.sisterproject {<br />
display: inline !important;<br />
}<br />
<br />
/* Für <nowiki><hiero>…</hiero></nowiki> */<br />
<br />
.mw-hierotable,<br />
.mw-hierotable th,<br />
.mw-hierotable td {<br />
border: 0;<br />
padding: 0;<br />
}<br />
<br />
/* Für [[MediaWiki:Anoneditwarning]] und weitere Hinweise, die alle untereinander stehen */<br />
<br />
#mw-anon-edit-warning,<br />
#mw-missingsummary,<br />
#wp_talkpagetext {<br />
width: 80%;<br />
background: #d3e1f2;<br />
border: 1px solid #1a47ff;<br />
margin: 1em auto;<br />
padding: 1em;<br />
}<br />
<br />
/* Bei URLs, die auf unser Projekt und verwandte Projekte verweisen, den Pfeil ausblenden<br />
* Dieser Pfeil dient nur dazu, auf externe Ziele hinzuweisen<br />
* Auf den Einsatz der Klasse "plainlinks" kann dadurch verzichtet werden<br />
*/<br />
#content a[href^="http://de.wikipedia.org"],<br />
#content a[href^="http://toolserver.org"] {<br />
background: none !important;<br />
padding-right: 0 !important;<br />
}<br />
#content .mw-search-formheader div.search-types ul li a[href^="http://de.wikipedia.org"],<br />
#content .mw-search-formheader div.search-types ul li a[href^="http://toolserver.org"] {<br />
padding-right: 0.5em !important; <br />
}<br />
<br />
/* Falls bei der Seitenbearbeitung vergessen wurde, die Zusammenfassung auszufüllen */<br />
.mw-summarymissed {<br />
border: 5px solid red;<br />
padding: 2px;<br />
}<br />
<br />
/* Copyrightwarnung */<br />
<br />
#editpage-copywarn {<br />
border: solid 1px #c00000;<br />
font-size: 90%;<br />
background-color: #ffffff;<br />
}<br />
<br />
.mw-tos-summary {<br />
border: solid 1px #c00000;<br />
background-color: #ffffff;<br />
padding-left: 1em;<br />
}<br />
<br />
/* +++++ 2. SONSTIGE ANPASSUNGEN (Spezialseiten u. a.) +++++ */<br />
<br />
/* Markierung von Redirects in [[Special:Allpages]], [[Special:Watchlist]], Kategorien */<br />
<br />
.allpagesredirect,<br />
.watchlistredir,<br />
.redirect-in-category {<br />
font-style: italic;<br />
}<br />
<br />
/* Fettformatierung von Admin-Spezialseiten in [[Special:Specialpages]] abschalten */<br />
.mw-specialpagerestricted strong {<br />
font-weight: normal;<br />
}<br />
/* Legende auf [[Special:Specialpages]] ebenfalls abschalten */<br />
div.mw-specialpages-notes {<br />
display: none;<br />
}<br />
<br />
/* Größerer Abstand zwischen TOC-Nummerierung und TOC-Eintrag */<br />
span.tocnumber {<br />
margin-right: 0.3em;<br />
}<br />
<br />
/* Skinabhängige absolute Positionierungen ausblenden */<br />
/* Bitte [[MediaWiki Diskussion:Common.css#Absolute_Positionierungen]] beachten */<br />
<br />
#coordinates,<br />
#coordinates_3_ObenRechts,<br />
#issnlink,<br />
#editcount,<br />
#shortcut,<br />
#artikelstadium,<br />
.topicon,<br />
#spoken-icon,<br />
#commons-icon {<br />
display: none;<br />
}<br />
<br />
/* Anpassungen für [[:Template:Link_FA]] */<br />
<br />
/* hide the template */<br />
#bodyContent span.FA {<br />
display: none;<br />
}<br />
<br />
/* change the bullets for links to special articles */<br />
#p-lang li.FA {<br />
/* hier immer auch linkFA_bullet in Common.js mit anpassen für die älteren skins! */<br />
list-style-image: url("http://upload.wikimedia.org/wikipedia/commons/d/d0/Monobook-bullet-star-transparent.png");<br />
}<br />
<br />
/* change the bullets for links to special articles */<br />
#p-lang li.GA {<br />
/* hier immer auch linkGA_bullet in Common.js mit anpassen für die älteren skins! */<br />
list-style-image: url("http://upload.wikimedia.org/wikipedia/commons/a/a1/Monobook-bullet-star-gray.png");<br />
}<br />
<br />
/* Verhindere, dass Infoboxen etc. in den Inhalt von Kategorien hineinragen.<br />
Das betrifft nur Kategorieseiten. */<br />
#mw-subcategories,<br />
#mw-pages {<br />
clear: both;<br />
}<br />
<br />
/* DIVs in ImageMaps inlinen (Vorschlag von Revolus) */<br />
.imagemap-inline div {<br />
display: inline;<br />
}<br />
<br />
/* [[Special:Hochladen]]: Warnmeldung auf bestehende Dateien, unerwünschte Prefixe usw. deutlicher hervorheben. */<br />
<br />
#wpDestFile-warning ul {<br />
border: solid red 1px;<br />
padding: 1.5em;<br />
}<br />
<br />
/* Warnmeldung für gesperrte Titel */<br />
.mw-titleprotectedwarning {<br />
background-color: #eee;<br />
border: 2px solid red;<br />
padding: 1em;<br />
}<br />
<br />
/* Warnmeldung bei der Bearbeitung von Seiten im MediaWiki-Namensraum */<br />
.mw-editinginterface {<br />
background-color: #f9f9f9;<br />
border-color: #c00000;<br />
border-width: 1px;<br />
border-style: solid;<br />
padding: 2px;<br />
}<br />
<br />
/* Überschrift 5. und 6. Ordnung proportionaler zu Fließtext */<br />
#content h5 {<br />
font-size: 108%; /* Original: 116% */<br />
}<br />
#content h6 {<br />
font-size: 100%; /* Original: 80% = kleiner als Bodytext, unschön */<br />
}<br />
#content h6 .editsection {<br />
font-size: 120%;<br />
font-weight: normal;<br />
}<br />
<br />
/* Anleitung auf Special:Search */<br />
.mw-searchresult {<br />
font-size: 84%;<br />
margin: 5px;<br />
}<br />
<br />
/* Gestaltung der Edittools-Leiste */<br />
#specialchars {<br />
margin-top: 3px;<br />
border: solid 1px #aaaaaa;<br />
padding: 1px;<br />
text-align: left;<br />
background-color: white;<br />
}<br />
<br />
/* Legende für Versionsgeschichte */<br />
.mw-history-legend {<br />
font-size: 90%;<br />
margin-top: 2px;<br />
margin-bottom: 2px;<br />
border: solid 1px #e9e9e9;<br />
padding: 0 5px 5px 5px;<br />
background-color: #f9f9f9;<br />
clear: both;<br />
}<br />
<br />
/* +++++ 3. NEUE [[Wikipedia:Hauptseite|HAUPTSEITE]] (ab 2006) +++++ */<br />
<br />
/* Kategorie verbergen */<br />
/* Überschrift verbergen */<br />
/* Redirhinweis verbergen - ACHTUNG: Je nach Skin muss jetzt der Abstand zum oberen Rand korrigiert werden */<br />
body.page-Wikipedia_Hauptseite #catlinks,<br />
body.page-Wikipedia_Hauptseite h1.firstHeading,<br />
body.page-Wikipedia_Hauptseite #contentSub {<br />
display: none;<br />
}<br />
<br />
#hauptseite h2 {<br />
background-color: #d8e8ff;<br />
border: 1px solid #8898bf;<br />
font-size: 1em;<br />
font-weight: bold;<br />
margin-top: 0;<br />
margin-bottom: 0;<br />
padding-top: 0.1em;<br />
padding-bottom: 0.1em;<br />
}<br />
#hauptseite .inhalt {<br />
background-color: #ffffff;<br />
border: 1px solid #8898bf;<br />
border-top: 0 solid white;<br />
padding: 0.3em 0.8em 0.4em 0.8em;<br />
}<br />
#hauptseite .inhalt hr {<br />
background-color: #8898bf;<br />
color: #8898bf;<br />
height: 1px;<br />
margin: 0.5em 0;<br />
padding: 0;<br />
}<br />
#hauptseite .inhalt .mehr {<br />
clear: both;<br />
font-size: 95%;<br />
margin-top: 0.8em;<br />
text-align: right;<br />
}<br />
#hauptseite table {<br />
background-color: transparent;<br />
}<br />
.hauptseite-oben,<br />
.hauptseite-links,<br />
.hauptseite-rechts {<br />
margin-bottom: 1em;<br />
}<br />
.hauptseite-links {<br />
margin-right: 0.5em;<br />
}<br />
.hauptseite-rechts {<br />
margin-left: 0.5em;<br />
}<br />
.hauptseite-oben h2,<br />
.hauptseite-unten h2 {<br />
text-align: center;<br />
}<br />
.hauptseite-oben .inhalt .portale {<br />
font-weight: bold;<br />
margin-top: 0.2em;<br />
margin-bottom: 0.2em;<br />
}<br />
.hauptseite-oben .inhalt .intern {<br />
font-size: 90%;<br />
text-align: center;<br />
}<br />
.hauptseite-links h2,<br />
.hauptseite-rechts h2 {<br />
text-indent: 0.8em;<br />
}<br />
#hauptseite-schwesterprojekte .inhalt a {<br />
font-weight: bold;<br />
}<br />
<br />
/* IPA links nicht unterstreichen */<br />
.IPA a:link,<br />
.IPA a:visited {<br />
text-decoration: none;<br />
}<br />
<br />
/* CSS-Klassen für Schriftarten als Workaround für Defizite in alten IE-Versionen.<br />
* Achtung: IE6 mag keine Zeilenumbrüche zwischen den Fonts.<br />
* In IE8 nicht mehr nötig, soll mit den alten Versionen aussterben. Browserweiche:<br />
* http://www.dynamicsitesolutions.com/css/filters/star-html/<br />
* http://www.dynamicsitesolutions.com/css/filters/first-child-plus-html/<br />
*/<br />
* html .Unicode {<br />
font-family: Code2000, Sun-ExtA, "Arial Unicode MS", NSimSun, sans-serif;<br />
}<br />
*:first-child+html .Unicode {<br />
font-family: Code2000, Sun-ExtA, "Arial Unicode MS", NSimSun, sans-serif;<br />
}<br />
* html .Unicode1 {<br />
font-family: Code2001, Quivira, "MPH 2B Damase", sans-serif;<br />
}<br />
*:first-child+html .Unicode1 {<br />
font-family: Code2001, Quivira, "MPH 2B Damase", sans-serif;<br />
}<br />
* html .Unicode2 {<br />
font-family: Sun-ExtB, Code2002, sans-serif;<br />
}<br />
*:first-child+html .Unicode2 {<br />
font-family: Sun-ExtB, Code2002, sans-serif;<br />
}<br />
* html .IPA {<br />
font-family: Quivira, Code2000, Sun-ExtA, "DejaVu Sans", Gentium, Helvetica, "Arial Unicode MS", "Lucida Sans Unicode", sans-serif;<br />
}<br />
*:first-child+html .IPA {<br />
font-family: Quivira, Code2000, Sun-ExtA, "DejaVu Sans", Gentium, Helvetica, "Arial Unicode MS", "Lucida Sans Unicode", sans-serif;<br />
}<br />
* html .IAST {<br />
font-family: Code2000, SunExtA, "Arial Unicode MS", sans-serif;<br />
}<br />
*:first-child+html .IAST {<br />
font-family: Code2000, SunExtA, "Arial Unicode MS", sans-serif;<br />
}<br />
* html .altitalisch {<br />
font-family: Quivira, Code2001, "MPH 2B Damase", sans-serif;<br />
}<br />
*:first-child+html .altitalisch {<br />
font-family: Quivira, Code2001, "MPH 2B Damase", sans-serif;<br />
}<br />
* html .gotisch {<br />
font-family: Quivira, Code2001, "MPH 2B Damase", sans-serif;<br />
}<br />
*:first-child+html .gotisch {<br />
font-family: Quivira, Code2001, "MPH 2B Damase", sans-serif;<br />
}<br />
* html .hebrew {<br />
font-family: Quivira, Sun-ExtA, "Arial Unicode MS", "SBL Hebrew", Code2000, "MPH 2B Damase", sans-serif;<br />
}<br />
*:first-child+html .hebrew {<br />
font-family: Quivira, Sun-ExtA, "Arial Unicode MS", "SBL Hebrew", Code2000, "MPH 2B Damase", sans-serif;<br />
}<br />
* html .spanAr {<br />
font-family: "Arial Unicode MS", Scheherazade, Code2000, "DejaVu Sans", sans-serif;<br />
}<br />
*:first-child+html .spanAr {<br />
font-family: "Arial Unicode MS", Scheherazade, Code2000, "DejaVu Sans", sans-serif;<br />
}<br />
* html .music-symbol {<br />
font-family: "Musical Symbols", Euterpe, Code2001, sans-serif;<br />
}<br />
*:first-child+html .music-symbol {<br />
font-family: "Musical Symbols", Euterpe, Code2001, sans-serif;<br />
}<br />
* html .polytonic {<br />
font-family: "Arial Unicode MS", "Palatino Linotype", Code2000, "New Athena Unicode", Gentium, "Athena Unicode";<br />
}<br />
*:first-child+html .polytonic {<br />
font-family: "Arial Unicode MS", "Palatino Linotype", Code2000, "New Athena Unicode", Gentium, "Athena Unicode";<br />
}<br />
<br />
/* Standardmäßige Ausblendung der Flagged-Revisions-Backlog-Sitenotice */<br />
#mw-oldreviewed-notice {<br />
display: none;<br />
}<br />
<br />
/* Standardmäßige Ausblendung der Flagged-Revisions-Kommentarbox */<br />
#mw-commentbox {<br />
display: none;<br />
}<br />
<br />
/* Abstand zwischen Liste und Inhaltsverzeichnis erhöhen, siehe http://de.wikipedia.org/w/index.php?title=MediaWiki_Diskussion:Common.css&oldid=51639015#Abstand_vor_Inhaltsverzeichnis */<br />
ul + .toc,<br />
ol + .toc {<br />
margin-top: 0.5em;<br />
}<br />
<br />
/* höheres Uploadfeld */<br />
#wpUploadDescription {<br />
height: 20em;<br />
}<br />
<br />
/* Im Projekt WP:GEO benutzt die [[Vorlage:Coordinate]] das «geo-microformat» zur semantischen<br />
Auszeichnung des Texts. Der Inhalt dieses [[Tag (Informatik)|Tags]] ist nicht für den Leser bestimmt. */<br />
.geo {<br />
display: none;<br />
}<br />
<br />
/* Patrollink ausblenden, da die Eweiterung hier nicht aktiviert ist und<br />
deren Optik zu sehr den gesichteten Versionen ähnelt. */<br />
.fr-diff-patrollink,<br />
.patrollink {<br />
display: none;<br />
}<br />
<br />
/* Rollback-Knopf auf Beobachtungsliste ausblenden, da es dort nur von sehr beschränktem Nutzen<br />
ist und zu sehr vielen Reverts aus Versehen führt */<br />
.page-Spezial_Beobachtungsliste .mw-rollback-link {<br />
display: none;<br />
}<br />
<br />
/* </source> */<br />
<br />
/* Disable Discussion-tab */<br />
<br />
#ca-talk {<br />
display: none;<br />
}<br />
<br />
<br />
/* reset code style */<br />
<br />
code {<br />
background-color: none !important;<br />
border: none !important;<br />
border-radius: 0;<br />
padding: 0;<br />
}<br />
<br />
pre {<br />
white-space: pre;<br />
}</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=MediaWiki:Common.css&diff=1092MediaWiki:Common.css2017-04-11T18:50:33Z<p>Qsysopr: reset code style</p>
<hr />
<div>/* <source lang="css"> */<br />
<br />
/*-----------------------------------------------------------------------------------------------*/<br />
/* ACHTUNG! Common.css enthält die gemeinsamen Skin-Anpassungen der deutschsprachigen Wikipedia */<br />
/*---------------------------------------------------------------------------------------------*/<br />
<br />
/* Common.css ist in drei grundlegende Abschnitte gegliedert: */<br />
<br />
/* 1. Editierbare Seiteninhalte */<br />
/* 2. Sonstige Anpassungen (Spezialseiten, u.a.) */<br />
/* 3. Hauptseitenspezifisches */<br />
<br />
/* Jede Ergänzung/Änderung muss vorher jeweils für alle Skins auf Tauglichkeit getestet werden, */<br />
/* individuell per User.css! Ist hier erstmal geändert, dauert es dank Cache eine Weile, bis die */<br />
/* Änderungen bei allen Nutzern sichtbar oder, bei Fehlern, korrigiert sind. */<br />
<br />
/* +++++ 1. ANPASSUNGEN DER ANZEIGE VON EDITIERBAREN SEITENINHALTEN +++++ */<br />
<br />
/* Personennamen in Kapitälchen: class="Person" */<br />
<br />
.Person {<br />
display: inline;<br />
font-variant: small-caps;<br />
font-style: normal;<br />
}<br />
<br />
/* [[Wikipedia:Zitate|Zitate]] (siehe [[Vorlage:Zitat]]) */<br />
<br />
p.Zitat {<br />
font-style: normal;<br />
margin-bottom: 0;<br />
}<br />
p.cite {<br />
margin-top: 0;<br />
padding-left: 1em;<br />
}<br />
<br />
/* [[Wikipedia:Quellenangaben|Quellenangaben]] nicht kursiv, da sie ggf. verschiedene Bestandteile enthalten */<br />
<br />
cite {<br />
font-style: normal;<br />
}<br />
<br />
/* Stylesheet-Ergänzung zu Standard-[[Wikipedia:Navigationsleisten|Navigationsleisten]] */<br />
<br />
div.BoxenVerschmelzen,<br />
div.NavFrame {<br />
margin: 1.5em 0 0;<br />
padding: 2px;<br />
border: 1px solid #aaaaaa;<br />
text-align: center;<br />
border-collapse: collapse;<br />
font-size: 95%;<br />
clear: both;<br />
}<br />
div.BoxenVerschmelzen div.NavFrame,<br />
div.NavFrame + div.NavFrame {<br />
margin-top: 0;<br />
}<br />
div.BoxenVerschmelzen div.NavFrame {<br />
border-style: none;<br />
border-style: hidden;<br />
}<br />
div.NavFrame + div.NavFrame {<br />
border-top-style: none;<br />
border-top-style: hidden;<br />
}<br />
div.NavPic {<br />
margin: 0;<br />
padding: 2px;<br />
float: left;<br />
}<br />
div.NavFrame div.NavHead {<br />
font-weight: bold;<br />
font-size: 100%;<br />
background-color: #efefef;<br />
}<br />
div.NavFrame p,<br />
div.NavFrame div.NavContent,<br />
div.NavFrame div.NavContent p {<br />
font-size: 100%;<br />
}<br />
div.NavEnd {<br />
margin: 0;<br />
padding: 0;<br />
line-height: 1px;<br />
clear: both;<br />
}<br />
<br />
/* Stylesheet fuer den 'Ausklappen'-Button an Navileisten, der in [[MediaWiki:Common.js]] implementiert wird */<br />
.NavToggle {<br />
font-size: x-small;<br />
float: right;<br />
}<br />
<br />
/* Workaround für Internet Explorer 6 */<br />
div.NavFrame,<br />
div.NavPic,<br />
.NavToggle {<br />
position: relative;<br />
}<br />
<br />
/* Stylesheet-Ergänzung zu SideBoxen (ehedem [[Wikipedia:TownBox|TownBox]]) */<br />
<br />
div.sideBox {<br />
position: relative;<br />
float: right;<br />
background: white;<br />
margin-left: 1em;<br />
border: 1px solid gray;<br />
padding: 0.3em;<br />
width: 200px;<br />
overflow: hidden;<br />
clear: right;<br />
}<br />
div.sideBox dl {<br />
padding: 0;<br />
margin: 0 0 0.3em 0;<br />
font-size: 96%;<br />
}<br />
div.sideBox dl dt {<br />
background: none;<br />
margin: 0.4em 0 0 0;<br />
}<br />
div.sideBox dl dd {<br />
margin: 0.1em 0 0 1.1em;<br />
background-color: #f3f3f3;<br />
}<br />
<br />
/* Stylesheet-Ergänzung zu [[Wikipedia:Taxoboxen|Taxoboxen]] und [[Wikipedia:Paläoboxen|Paläoboxen]] */<br />
table.taxobox,<br />
table.palaeobox {<br />
border-collapse: collapse;<br />
border: 1px solid gray;<br />
float: right;<br />
clear: right;<br />
margin-left: 0.5em;<br />
background-color: white;<br />
}<br />
table.taxobox th {<br />
background-color: #9bcd9b;<br />
}<br />
table.palaeobox th {<br />
background-color: #e7dcc3;<br />
}<br />
table.taxobox th,<br />
table.palaeobox th {<br />
border: solid 1px gray;<br />
text-align: center;<br />
font-weight: bold;<br />
}<br />
table.taxobox td,<br />
table.palaeobox td {<br />
vertical-align: top;<br />
}<br />
table.taxobox .Person,<br />
table.palaeobox .Person {<br />
font-style: normal;<br />
}<br />
table.taxobox div.thumb,<br />
table.taxobox div.thumb * {<br />
background-color: #f9f9f9;<br />
}<br />
table.taxobox div.thumb,<br />
table.taxobox div.thumb *,<br />
table.palaeobox div.thumb,<br />
table.palaeobox div.thumb * {<br />
margin: 0 auto;<br />
padding: 0;<br />
float: none;<br />
border: none;<br />
}<br />
table.taxobox div.magnify,<br />
table.palaeobox div.magnify {<br />
display: none;<br />
}<br />
table.taxobox tr td div.thumb div div.thumbcaption {<br />
text-align: center;<br />
}<br />
table.palaeobox tr td div.thumb div div.thumbcaption {<br />
text-align: left;<br />
}<br />
table.taxobox td.Person,<br />
table.palaeobox td.Person {<br />
text-align: center;<br />
display: block;<br />
}<br />
table.taxobox td.taxo-name,<br />
table.taxobox td.taxo-bild,<br />
table.palaeobox td.taxo-name,<br />
table.palaeobox td.taxo-bild,<br />
table.palaeobox td.taxo-zeit {<br />
text-align: center;<br />
}<br />
table.palaeobox td.taxo-ort {<br />
text-align: left;<br />
}<br />
<br />
/* aus Vorlage zur Entlastung, skinabhängigen Darstellung und Kombinierbarkeit hierher ausgelagert */<br />
.wikitable,<br />
.prettytable {<br />
margin: 1em 1em 1em 0;<br />
background: #f9f9f9;<br />
border: 1px #aaa solid;<br />
border-collapse: collapse;<br />
}<br />
.prettytable th,<br />
.prettytable td {<br />
border: 1px #aaa solid;<br />
padding: 0.2em;<br />
}<br />
.prettytable th {<br />
text-align: center;<br />
}<br />
.prettytable caption {<br />
font-weight: bold;<br />
}<br />
<br />
/* Zebra-Tabellen */<br />
table.wikitable.zebra tr:nth-child(even) {<br />
background: white;<br />
}<br />
<br />
.nogrid th,<br />
.nogrid td {<br />
border: none;<br />
}<br />
div.float-left,<br />
table.float-left,<br />
.float-left {<br />
float: left;<br />
clear: left;<br />
}<br />
div.float-right,<br />
table.float-right,<br />
.float-right {<br />
float: right;<br />
clear: right;<br />
margin: 1em 0 1em 1em;<br />
}<br />
div.centered,<br />
table.centered,<br />
.centered {<br />
margin-left: auto;<br />
margin-right: auto;<br />
}<br />
.toptextcells td {<br />
vertical-align: top;<br />
}<br />
<br />
/* Bitte KEINE weiteren Definitionen dieser Art für Boxen hier, das gehört in entsprechende Vorlagen! */<br />
/* Hier 20 Mal Trivialitäten wie "text-align:center" zu definieren verlangsamt alles und ist nicht */<br />
/* Sinn der Sache. (Und wer nicht weiß warum, hat's nicht verstanden.) */<br />
<br />
/* Do not expand [[Wikipedia:WikiProjekt Georeferenzierung|kvaleberg.com-URLs]] for printing */<br />
<br />
#content span.coordinates a.external.text:after,<br />
#content span.coordinates a.external.autonumber:after,<br />
#content div.coordinates a.external.text:after,<br />
#content div.coordinates a.external.autonumber:after {<br />
content: "";<br />
}<br />
<br />
/* Do not expand URLs for printing */<br />
<br />
#content span.plainlinks-print a.external.text:after,<br />
#content span.plainlinks-print a.external.autonumber:after,<br />
#content div.plainlinks-print a.external.text:after,<br />
#content div.plainlinks-print a.external.autonumber:after {<br />
content: "";<br />
}<br />
<br />
/* Metadaten (bspw. [[Wikipedia:Personendaten|Personendaten]]) */<br />
<br />
table.metadata {<br />
border: 1px solid #aaaaaa;<br />
display: none;<br />
}<br />
.metadata-label {<br />
color: #aaaaaa;<br />
}<br />
span.metadata,<br />
span.metadata-inline {<br />
display: none;<br />
}<br />
<br />
/*<br />
* Farbdefinitionen für Rahmen und Hintergründe von [[Wikipedia:Textbausteine|Textbausteinen]].<br />
* Hier: Standardvorgaben für "dunkle Schrift auf hellem Grund".<br />
* Für Hell-auf-dunkel-Skins ([[MediaWiki:Amethyst.css|Amethyst]]) müssen dort entsprechende Definitionen<br />
* zusätzlich eingetragen werden! Anpassungen für andere Skins sind optional.<br />
* (Die Angaben der Rahmenstärke dienen der Bequemlichkeit, so dass man<br />
* für dünne Rahmen nur noch "border-style" angeben muss.)<br />
*/<br />
<br />
.rahmenfarbe1 { /* Wie Inhaltsverzeichnis */<br />
border-color: #aaaaaa;<br />
border-width: 1px;<br />
}<br />
.rahmenfarbe2 { /* Unauffällig, geringer Kontrast */<br />
border-color: #e9e9e9;<br />
border-width: 1px;<br />
}<br />
.rahmenfarbe3 { /* "Rot", auffällig */<br />
border-color: #c00000;<br />
border-width: 1px;<br />
}<br />
.rahmenfarbe4 { /* Neutrale Farbe, deutlich */<br />
border-color: #8888aa;<br />
border-width: 1px;<br />
}<br />
.rahmenfarbe5 { /* "Schwarz", hoher Kontrast */<br />
border-color: #000000;<br />
border-width: 1px;<br />
}<br />
<br />
tr.hintergrundfarbe1 th,<br />
tr th.hintergrundfarbe1,<br />
table.hintergrundfarbe1,<br />
.hintergrundfarbe1 { /* Wie Inhaltsverzeichnis */<br />
background-color: #f9f9f9;<br />
}<br />
tr.hintergrundfarbe2 th,<br />
tr th.hintergrundfarbe2,<br />
table.hintergrundfarbe2,<br />
.hintergrundfarbe2 { /* "Weiß", für Nicht-Artikel-Seiten, neutral */<br />
background-color: #ffffff;<br />
}<br />
tr.hintergrundfarbe3 th,<br />
tr th.hintergrundfarbe3,<br />
table.hintergrundfarbe3,<br />
.hintergrundfarbe3 { /* "Gelb", auffällig */<br />
background-color: #ffff40;<br />
}<br />
tr.hintergrundfarbe4 th,<br />
tr th.hintergrundfarbe4,<br />
table.hintergrundfarbe4,<br />
.hintergrundfarbe4 { /* Sehr auffällig */<br />
background-color: #ffaa00;<br />
}<br />
tr.hintergrundfarbe5 th,<br />
tr th.hintergrundfarbe5,<br />
table.hintergrundfarbe5,<br />
.hintergrundfarbe5 { /* Neutral, abgesetzt */<br />
background-color: #e0e0e0;<br />
}<br />
tr.hintergrundfarbe6 th,<br />
tr th.hintergrundfarbe6,<br />
table.hintergrundfarbe6,<br />
.hintergrundfarbe6 { /* Allgemein „bunt“, für Hervorhebungen und Unterscheidungen */<br />
background-color: #b3b7ff;<br />
}<br />
tr.hintergrundfarbe7 th,<br />
tr th.hintergrundfarbe7,<br />
table.hintergrundfarbe7,<br />
.hintergrundfarbe7 { /* Allgemein „bunt“, für Hervorhebungen und Unterscheidungen */<br />
background-color: #ffcbcb;<br />
}<br />
tr.hintergrundfarbe8 th,<br />
tr th.hintergrundfarbe8,<br />
table.hintergrundfarbe8,<br />
.hintergrundfarbe8 { /* Allgemein „bunt“, für Hervorhebungen und Unterscheidungen */<br />
background-color: #ffebad;<br />
}<br />
tr.hintergrundfarbe9 th,<br />
tr th.hintergrundfarbe9,<br />
table.hintergrundfarbe9,<br />
.hintergrundfarbe9 { /* Allgemein „bunt“, für Hervorhebungen und Unterscheidungen */<br />
background-color: #b9ffc5;<br />
}<br />
<br />
/* Keine Vergrößerung der Zeilenhöhe durch hochgestellte Zahlen der Fußnoten */<br />
<br />
sup.reference {<br />
font-weight: 400;<br />
font-style: normal;<br />
}<br />
sup,<br />
sub {<br />
line-height: 1em;<br />
}<br />
<br />
/* Hervorhebung der angeklickten Fußnoten und der Rückverweise in blau */<br />
<br />
ol.references > li:target,<br />
sup.reference:target {<br />
background-color: #def;<br />
}<br />
<br />
/* Hochgestellte Buchstaben in der Einzelnachweiseliste kursiv setzen */<br />
<br />
ol.references li a[href|="#cite_ref"] {<br />
font-style: italic;<br />
}<br />
<br />
/* Inline-Verwendung der [[:Kategorie:Vorlage:Schwesterprojektverweis|Schwesterprojektverweise]] */<br />
<br />
ol.references li div.sisterproject {<br />
display: inline !important;<br />
}<br />
<br />
/* Für <nowiki><hiero>…</hiero></nowiki> */<br />
<br />
.mw-hierotable,<br />
.mw-hierotable th,<br />
.mw-hierotable td {<br />
border: 0;<br />
padding: 0;<br />
}<br />
<br />
/* Für [[MediaWiki:Anoneditwarning]] und weitere Hinweise, die alle untereinander stehen */<br />
<br />
#mw-anon-edit-warning,<br />
#mw-missingsummary,<br />
#wp_talkpagetext {<br />
width: 80%;<br />
background: #d3e1f2;<br />
border: 1px solid #1a47ff;<br />
margin: 1em auto;<br />
padding: 1em;<br />
}<br />
<br />
/* Bei URLs, die auf unser Projekt und verwandte Projekte verweisen, den Pfeil ausblenden<br />
* Dieser Pfeil dient nur dazu, auf externe Ziele hinzuweisen<br />
* Auf den Einsatz der Klasse "plainlinks" kann dadurch verzichtet werden<br />
*/<br />
#content a[href^="http://de.wikipedia.org"],<br />
#content a[href^="http://toolserver.org"] {<br />
background: none !important;<br />
padding-right: 0 !important;<br />
}<br />
#content .mw-search-formheader div.search-types ul li a[href^="http://de.wikipedia.org"],<br />
#content .mw-search-formheader div.search-types ul li a[href^="http://toolserver.org"] {<br />
padding-right: 0.5em !important; <br />
}<br />
<br />
/* Falls bei der Seitenbearbeitung vergessen wurde, die Zusammenfassung auszufüllen */<br />
.mw-summarymissed {<br />
border: 5px solid red;<br />
padding: 2px;<br />
}<br />
<br />
/* Copyrightwarnung */<br />
<br />
#editpage-copywarn {<br />
border: solid 1px #c00000;<br />
font-size: 90%;<br />
background-color: #ffffff;<br />
}<br />
<br />
.mw-tos-summary {<br />
border: solid 1px #c00000;<br />
background-color: #ffffff;<br />
padding-left: 1em;<br />
}<br />
<br />
/* +++++ 2. SONSTIGE ANPASSUNGEN (Spezialseiten u. a.) +++++ */<br />
<br />
/* Markierung von Redirects in [[Special:Allpages]], [[Special:Watchlist]], Kategorien */<br />
<br />
.allpagesredirect,<br />
.watchlistredir,<br />
.redirect-in-category {<br />
font-style: italic;<br />
}<br />
<br />
/* Fettformatierung von Admin-Spezialseiten in [[Special:Specialpages]] abschalten */<br />
.mw-specialpagerestricted strong {<br />
font-weight: normal;<br />
}<br />
/* Legende auf [[Special:Specialpages]] ebenfalls abschalten */<br />
div.mw-specialpages-notes {<br />
display: none;<br />
}<br />
<br />
/* Größerer Abstand zwischen TOC-Nummerierung und TOC-Eintrag */<br />
span.tocnumber {<br />
margin-right: 0.3em;<br />
}<br />
<br />
/* Skinabhängige absolute Positionierungen ausblenden */<br />
/* Bitte [[MediaWiki Diskussion:Common.css#Absolute_Positionierungen]] beachten */<br />
<br />
#coordinates,<br />
#coordinates_3_ObenRechts,<br />
#issnlink,<br />
#editcount,<br />
#shortcut,<br />
#artikelstadium,<br />
.topicon,<br />
#spoken-icon,<br />
#commons-icon {<br />
display: none;<br />
}<br />
<br />
/* Anpassungen für [[:Template:Link_FA]] */<br />
<br />
/* hide the template */<br />
#bodyContent span.FA {<br />
display: none;<br />
}<br />
<br />
/* change the bullets for links to special articles */<br />
#p-lang li.FA {<br />
/* hier immer auch linkFA_bullet in Common.js mit anpassen für die älteren skins! */<br />
list-style-image: url("http://upload.wikimedia.org/wikipedia/commons/d/d0/Monobook-bullet-star-transparent.png");<br />
}<br />
<br />
/* change the bullets for links to special articles */<br />
#p-lang li.GA {<br />
/* hier immer auch linkGA_bullet in Common.js mit anpassen für die älteren skins! */<br />
list-style-image: url("http://upload.wikimedia.org/wikipedia/commons/a/a1/Monobook-bullet-star-gray.png");<br />
}<br />
<br />
/* Verhindere, dass Infoboxen etc. in den Inhalt von Kategorien hineinragen.<br />
Das betrifft nur Kategorieseiten. */<br />
#mw-subcategories,<br />
#mw-pages {<br />
clear: both;<br />
}<br />
<br />
/* DIVs in ImageMaps inlinen (Vorschlag von Revolus) */<br />
.imagemap-inline div {<br />
display: inline;<br />
}<br />
<br />
/* [[Special:Hochladen]]: Warnmeldung auf bestehende Dateien, unerwünschte Prefixe usw. deutlicher hervorheben. */<br />
<br />
#wpDestFile-warning ul {<br />
border: solid red 1px;<br />
padding: 1.5em;<br />
}<br />
<br />
/* Warnmeldung für gesperrte Titel */<br />
.mw-titleprotectedwarning {<br />
background-color: #eee;<br />
border: 2px solid red;<br />
padding: 1em;<br />
}<br />
<br />
/* Warnmeldung bei der Bearbeitung von Seiten im MediaWiki-Namensraum */<br />
.mw-editinginterface {<br />
background-color: #f9f9f9;<br />
border-color: #c00000;<br />
border-width: 1px;<br />
border-style: solid;<br />
padding: 2px;<br />
}<br />
<br />
/* Überschrift 5. und 6. Ordnung proportionaler zu Fließtext */<br />
#content h5 {<br />
font-size: 108%; /* Original: 116% */<br />
}<br />
#content h6 {<br />
font-size: 100%; /* Original: 80% = kleiner als Bodytext, unschön */<br />
}<br />
#content h6 .editsection {<br />
font-size: 120%;<br />
font-weight: normal;<br />
}<br />
<br />
/* Anleitung auf Special:Search */<br />
.mw-searchresult {<br />
font-size: 84%;<br />
margin: 5px;<br />
}<br />
<br />
/* Gestaltung der Edittools-Leiste */<br />
#specialchars {<br />
margin-top: 3px;<br />
border: solid 1px #aaaaaa;<br />
padding: 1px;<br />
text-align: left;<br />
background-color: white;<br />
}<br />
<br />
/* Legende für Versionsgeschichte */<br />
.mw-history-legend {<br />
font-size: 90%;<br />
margin-top: 2px;<br />
margin-bottom: 2px;<br />
border: solid 1px #e9e9e9;<br />
padding: 0 5px 5px 5px;<br />
background-color: #f9f9f9;<br />
clear: both;<br />
}<br />
<br />
/* +++++ 3. NEUE [[Wikipedia:Hauptseite|HAUPTSEITE]] (ab 2006) +++++ */<br />
<br />
/* Kategorie verbergen */<br />
/* Überschrift verbergen */<br />
/* Redirhinweis verbergen - ACHTUNG: Je nach Skin muss jetzt der Abstand zum oberen Rand korrigiert werden */<br />
body.page-Wikipedia_Hauptseite #catlinks,<br />
body.page-Wikipedia_Hauptseite h1.firstHeading,<br />
body.page-Wikipedia_Hauptseite #contentSub {<br />
display: none;<br />
}<br />
<br />
#hauptseite h2 {<br />
background-color: #d8e8ff;<br />
border: 1px solid #8898bf;<br />
font-size: 1em;<br />
font-weight: bold;<br />
margin-top: 0;<br />
margin-bottom: 0;<br />
padding-top: 0.1em;<br />
padding-bottom: 0.1em;<br />
}<br />
#hauptseite .inhalt {<br />
background-color: #ffffff;<br />
border: 1px solid #8898bf;<br />
border-top: 0 solid white;<br />
padding: 0.3em 0.8em 0.4em 0.8em;<br />
}<br />
#hauptseite .inhalt hr {<br />
background-color: #8898bf;<br />
color: #8898bf;<br />
height: 1px;<br />
margin: 0.5em 0;<br />
padding: 0;<br />
}<br />
#hauptseite .inhalt .mehr {<br />
clear: both;<br />
font-size: 95%;<br />
margin-top: 0.8em;<br />
text-align: right;<br />
}<br />
#hauptseite table {<br />
background-color: transparent;<br />
}<br />
.hauptseite-oben,<br />
.hauptseite-links,<br />
.hauptseite-rechts {<br />
margin-bottom: 1em;<br />
}<br />
.hauptseite-links {<br />
margin-right: 0.5em;<br />
}<br />
.hauptseite-rechts {<br />
margin-left: 0.5em;<br />
}<br />
.hauptseite-oben h2,<br />
.hauptseite-unten h2 {<br />
text-align: center;<br />
}<br />
.hauptseite-oben .inhalt .portale {<br />
font-weight: bold;<br />
margin-top: 0.2em;<br />
margin-bottom: 0.2em;<br />
}<br />
.hauptseite-oben .inhalt .intern {<br />
font-size: 90%;<br />
text-align: center;<br />
}<br />
.hauptseite-links h2,<br />
.hauptseite-rechts h2 {<br />
text-indent: 0.8em;<br />
}<br />
#hauptseite-schwesterprojekte .inhalt a {<br />
font-weight: bold;<br />
}<br />
<br />
/* IPA links nicht unterstreichen */<br />
.IPA a:link,<br />
.IPA a:visited {<br />
text-decoration: none;<br />
}<br />
<br />
/* CSS-Klassen für Schriftarten als Workaround für Defizite in alten IE-Versionen.<br />
* Achtung: IE6 mag keine Zeilenumbrüche zwischen den Fonts.<br />
* In IE8 nicht mehr nötig, soll mit den alten Versionen aussterben. Browserweiche:<br />
* http://www.dynamicsitesolutions.com/css/filters/star-html/<br />
* http://www.dynamicsitesolutions.com/css/filters/first-child-plus-html/<br />
*/<br />
* html .Unicode {<br />
font-family: Code2000, Sun-ExtA, "Arial Unicode MS", NSimSun, sans-serif;<br />
}<br />
*:first-child+html .Unicode {<br />
font-family: Code2000, Sun-ExtA, "Arial Unicode MS", NSimSun, sans-serif;<br />
}<br />
* html .Unicode1 {<br />
font-family: Code2001, Quivira, "MPH 2B Damase", sans-serif;<br />
}<br />
*:first-child+html .Unicode1 {<br />
font-family: Code2001, Quivira, "MPH 2B Damase", sans-serif;<br />
}<br />
* html .Unicode2 {<br />
font-family: Sun-ExtB, Code2002, sans-serif;<br />
}<br />
*:first-child+html .Unicode2 {<br />
font-family: Sun-ExtB, Code2002, sans-serif;<br />
}<br />
* html .IPA {<br />
font-family: Quivira, Code2000, Sun-ExtA, "DejaVu Sans", Gentium, Helvetica, "Arial Unicode MS", "Lucida Sans Unicode", sans-serif;<br />
}<br />
*:first-child+html .IPA {<br />
font-family: Quivira, Code2000, Sun-ExtA, "DejaVu Sans", Gentium, Helvetica, "Arial Unicode MS", "Lucida Sans Unicode", sans-serif;<br />
}<br />
* html .IAST {<br />
font-family: Code2000, SunExtA, "Arial Unicode MS", sans-serif;<br />
}<br />
*:first-child+html .IAST {<br />
font-family: Code2000, SunExtA, "Arial Unicode MS", sans-serif;<br />
}<br />
* html .altitalisch {<br />
font-family: Quivira, Code2001, "MPH 2B Damase", sans-serif;<br />
}<br />
*:first-child+html .altitalisch {<br />
font-family: Quivira, Code2001, "MPH 2B Damase", sans-serif;<br />
}<br />
* html .gotisch {<br />
font-family: Quivira, Code2001, "MPH 2B Damase", sans-serif;<br />
}<br />
*:first-child+html .gotisch {<br />
font-family: Quivira, Code2001, "MPH 2B Damase", sans-serif;<br />
}<br />
* html .hebrew {<br />
font-family: Quivira, Sun-ExtA, "Arial Unicode MS", "SBL Hebrew", Code2000, "MPH 2B Damase", sans-serif;<br />
}<br />
*:first-child+html .hebrew {<br />
font-family: Quivira, Sun-ExtA, "Arial Unicode MS", "SBL Hebrew", Code2000, "MPH 2B Damase", sans-serif;<br />
}<br />
* html .spanAr {<br />
font-family: "Arial Unicode MS", Scheherazade, Code2000, "DejaVu Sans", sans-serif;<br />
}<br />
*:first-child+html .spanAr {<br />
font-family: "Arial Unicode MS", Scheherazade, Code2000, "DejaVu Sans", sans-serif;<br />
}<br />
* html .music-symbol {<br />
font-family: "Musical Symbols", Euterpe, Code2001, sans-serif;<br />
}<br />
*:first-child+html .music-symbol {<br />
font-family: "Musical Symbols", Euterpe, Code2001, sans-serif;<br />
}<br />
* html .polytonic {<br />
font-family: "Arial Unicode MS", "Palatino Linotype", Code2000, "New Athena Unicode", Gentium, "Athena Unicode";<br />
}<br />
*:first-child+html .polytonic {<br />
font-family: "Arial Unicode MS", "Palatino Linotype", Code2000, "New Athena Unicode", Gentium, "Athena Unicode";<br />
}<br />
<br />
/* Standardmäßige Ausblendung der Flagged-Revisions-Backlog-Sitenotice */<br />
#mw-oldreviewed-notice {<br />
display: none;<br />
}<br />
<br />
/* Standardmäßige Ausblendung der Flagged-Revisions-Kommentarbox */<br />
#mw-commentbox {<br />
display: none;<br />
}<br />
<br />
/* Abstand zwischen Liste und Inhaltsverzeichnis erhöhen, siehe http://de.wikipedia.org/w/index.php?title=MediaWiki_Diskussion:Common.css&oldid=51639015#Abstand_vor_Inhaltsverzeichnis */<br />
ul + .toc,<br />
ol + .toc {<br />
margin-top: 0.5em;<br />
}<br />
<br />
/* höheres Uploadfeld */<br />
#wpUploadDescription {<br />
height: 20em;<br />
}<br />
<br />
/* Im Projekt WP:GEO benutzt die [[Vorlage:Coordinate]] das «geo-microformat» zur semantischen<br />
Auszeichnung des Texts. Der Inhalt dieses [[Tag (Informatik)|Tags]] ist nicht für den Leser bestimmt. */<br />
.geo {<br />
display: none;<br />
}<br />
<br />
/* Patrollink ausblenden, da die Eweiterung hier nicht aktiviert ist und<br />
deren Optik zu sehr den gesichteten Versionen ähnelt. */<br />
.fr-diff-patrollink,<br />
.patrollink {<br />
display: none;<br />
}<br />
<br />
/* Rollback-Knopf auf Beobachtungsliste ausblenden, da es dort nur von sehr beschränktem Nutzen<br />
ist und zu sehr vielen Reverts aus Versehen führt */<br />
.page-Spezial_Beobachtungsliste .mw-rollback-link {<br />
display: none;<br />
}<br />
<br />
/* </source> */<br />
<br />
/* Disable Discussion-tab */<br />
<br />
#ca-talk {<br />
display: none;<br />
}<br />
<br />
<br />
/* reset code style */<br />
<br />
code {<br />
background-color: none !important;<br />
border: none !important;<br />
border-radius: 0;<br />
padding: 0;<br />
}</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=MediaWiki:Common.css&diff=1091MediaWiki:Common.css2017-02-25T15:54:46Z<p>Qsysopr: Diskussion ausblenden</p>
<hr />
<div>/* <source lang="css"> */<br />
<br />
/*-----------------------------------------------------------------------------------------------*/<br />
/* ACHTUNG! Common.css enthält die gemeinsamen Skin-Anpassungen der deutschsprachigen Wikipedia */<br />
/*---------------------------------------------------------------------------------------------*/<br />
<br />
/* Common.css ist in drei grundlegende Abschnitte gegliedert: */<br />
<br />
/* 1. Editierbare Seiteninhalte */<br />
/* 2. Sonstige Anpassungen (Spezialseiten, u.a.) */<br />
/* 3. Hauptseitenspezifisches */<br />
<br />
/* Jede Ergänzung/Änderung muss vorher jeweils für alle Skins auf Tauglichkeit getestet werden, */<br />
/* individuell per User.css! Ist hier erstmal geändert, dauert es dank Cache eine Weile, bis die */<br />
/* Änderungen bei allen Nutzern sichtbar oder, bei Fehlern, korrigiert sind. */<br />
<br />
/* +++++ 1. ANPASSUNGEN DER ANZEIGE VON EDITIERBAREN SEITENINHALTEN +++++ */<br />
<br />
/* Personennamen in Kapitälchen: class="Person" */<br />
<br />
.Person {<br />
display: inline;<br />
font-variant: small-caps;<br />
font-style: normal;<br />
}<br />
<br />
/* [[Wikipedia:Zitate|Zitate]] (siehe [[Vorlage:Zitat]]) */<br />
<br />
p.Zitat {<br />
font-style: normal;<br />
margin-bottom: 0;<br />
}<br />
p.cite {<br />
margin-top: 0;<br />
padding-left: 1em;<br />
}<br />
<br />
/* [[Wikipedia:Quellenangaben|Quellenangaben]] nicht kursiv, da sie ggf. verschiedene Bestandteile enthalten */<br />
<br />
cite {<br />
font-style: normal;<br />
}<br />
<br />
/* Stylesheet-Ergänzung zu Standard-[[Wikipedia:Navigationsleisten|Navigationsleisten]] */<br />
<br />
div.BoxenVerschmelzen,<br />
div.NavFrame {<br />
margin: 1.5em 0 0;<br />
padding: 2px;<br />
border: 1px solid #aaaaaa;<br />
text-align: center;<br />
border-collapse: collapse;<br />
font-size: 95%;<br />
clear: both;<br />
}<br />
div.BoxenVerschmelzen div.NavFrame,<br />
div.NavFrame + div.NavFrame {<br />
margin-top: 0;<br />
}<br />
div.BoxenVerschmelzen div.NavFrame {<br />
border-style: none;<br />
border-style: hidden;<br />
}<br />
div.NavFrame + div.NavFrame {<br />
border-top-style: none;<br />
border-top-style: hidden;<br />
}<br />
div.NavPic {<br />
margin: 0;<br />
padding: 2px;<br />
float: left;<br />
}<br />
div.NavFrame div.NavHead {<br />
font-weight: bold;<br />
font-size: 100%;<br />
background-color: #efefef;<br />
}<br />
div.NavFrame p,<br />
div.NavFrame div.NavContent,<br />
div.NavFrame div.NavContent p {<br />
font-size: 100%;<br />
}<br />
div.NavEnd {<br />
margin: 0;<br />
padding: 0;<br />
line-height: 1px;<br />
clear: both;<br />
}<br />
<br />
/* Stylesheet fuer den 'Ausklappen'-Button an Navileisten, der in [[MediaWiki:Common.js]] implementiert wird */<br />
.NavToggle {<br />
font-size: x-small;<br />
float: right;<br />
}<br />
<br />
/* Workaround für Internet Explorer 6 */<br />
div.NavFrame,<br />
div.NavPic,<br />
.NavToggle {<br />
position: relative;<br />
}<br />
<br />
/* Stylesheet-Ergänzung zu SideBoxen (ehedem [[Wikipedia:TownBox|TownBox]]) */<br />
<br />
div.sideBox {<br />
position: relative;<br />
float: right;<br />
background: white;<br />
margin-left: 1em;<br />
border: 1px solid gray;<br />
padding: 0.3em;<br />
width: 200px;<br />
overflow: hidden;<br />
clear: right;<br />
}<br />
div.sideBox dl {<br />
padding: 0;<br />
margin: 0 0 0.3em 0;<br />
font-size: 96%;<br />
}<br />
div.sideBox dl dt {<br />
background: none;<br />
margin: 0.4em 0 0 0;<br />
}<br />
div.sideBox dl dd {<br />
margin: 0.1em 0 0 1.1em;<br />
background-color: #f3f3f3;<br />
}<br />
<br />
/* Stylesheet-Ergänzung zu [[Wikipedia:Taxoboxen|Taxoboxen]] und [[Wikipedia:Paläoboxen|Paläoboxen]] */<br />
table.taxobox,<br />
table.palaeobox {<br />
border-collapse: collapse;<br />
border: 1px solid gray;<br />
float: right;<br />
clear: right;<br />
margin-left: 0.5em;<br />
background-color: white;<br />
}<br />
table.taxobox th {<br />
background-color: #9bcd9b;<br />
}<br />
table.palaeobox th {<br />
background-color: #e7dcc3;<br />
}<br />
table.taxobox th,<br />
table.palaeobox th {<br />
border: solid 1px gray;<br />
text-align: center;<br />
font-weight: bold;<br />
}<br />
table.taxobox td,<br />
table.palaeobox td {<br />
vertical-align: top;<br />
}<br />
table.taxobox .Person,<br />
table.palaeobox .Person {<br />
font-style: normal;<br />
}<br />
table.taxobox div.thumb,<br />
table.taxobox div.thumb * {<br />
background-color: #f9f9f9;<br />
}<br />
table.taxobox div.thumb,<br />
table.taxobox div.thumb *,<br />
table.palaeobox div.thumb,<br />
table.palaeobox div.thumb * {<br />
margin: 0 auto;<br />
padding: 0;<br />
float: none;<br />
border: none;<br />
}<br />
table.taxobox div.magnify,<br />
table.palaeobox div.magnify {<br />
display: none;<br />
}<br />
table.taxobox tr td div.thumb div div.thumbcaption {<br />
text-align: center;<br />
}<br />
table.palaeobox tr td div.thumb div div.thumbcaption {<br />
text-align: left;<br />
}<br />
table.taxobox td.Person,<br />
table.palaeobox td.Person {<br />
text-align: center;<br />
display: block;<br />
}<br />
table.taxobox td.taxo-name,<br />
table.taxobox td.taxo-bild,<br />
table.palaeobox td.taxo-name,<br />
table.palaeobox td.taxo-bild,<br />
table.palaeobox td.taxo-zeit {<br />
text-align: center;<br />
}<br />
table.palaeobox td.taxo-ort {<br />
text-align: left;<br />
}<br />
<br />
/* aus Vorlage zur Entlastung, skinabhängigen Darstellung und Kombinierbarkeit hierher ausgelagert */<br />
.wikitable,<br />
.prettytable {<br />
margin: 1em 1em 1em 0;<br />
background: #f9f9f9;<br />
border: 1px #aaa solid;<br />
border-collapse: collapse;<br />
}<br />
.prettytable th,<br />
.prettytable td {<br />
border: 1px #aaa solid;<br />
padding: 0.2em;<br />
}<br />
.prettytable th {<br />
text-align: center;<br />
}<br />
.prettytable caption {<br />
font-weight: bold;<br />
}<br />
<br />
/* Zebra-Tabellen */<br />
table.wikitable.zebra tr:nth-child(even) {<br />
background: white;<br />
}<br />
<br />
.nogrid th,<br />
.nogrid td {<br />
border: none;<br />
}<br />
div.float-left,<br />
table.float-left,<br />
.float-left {<br />
float: left;<br />
clear: left;<br />
}<br />
div.float-right,<br />
table.float-right,<br />
.float-right {<br />
float: right;<br />
clear: right;<br />
margin: 1em 0 1em 1em;<br />
}<br />
div.centered,<br />
table.centered,<br />
.centered {<br />
margin-left: auto;<br />
margin-right: auto;<br />
}<br />
.toptextcells td {<br />
vertical-align: top;<br />
}<br />
<br />
/* Bitte KEINE weiteren Definitionen dieser Art für Boxen hier, das gehört in entsprechende Vorlagen! */<br />
/* Hier 20 Mal Trivialitäten wie "text-align:center" zu definieren verlangsamt alles und ist nicht */<br />
/* Sinn der Sache. (Und wer nicht weiß warum, hat's nicht verstanden.) */<br />
<br />
/* Do not expand [[Wikipedia:WikiProjekt Georeferenzierung|kvaleberg.com-URLs]] for printing */<br />
<br />
#content span.coordinates a.external.text:after,<br />
#content span.coordinates a.external.autonumber:after,<br />
#content div.coordinates a.external.text:after,<br />
#content div.coordinates a.external.autonumber:after {<br />
content: "";<br />
}<br />
<br />
/* Do not expand URLs for printing */<br />
<br />
#content span.plainlinks-print a.external.text:after,<br />
#content span.plainlinks-print a.external.autonumber:after,<br />
#content div.plainlinks-print a.external.text:after,<br />
#content div.plainlinks-print a.external.autonumber:after {<br />
content: "";<br />
}<br />
<br />
/* Metadaten (bspw. [[Wikipedia:Personendaten|Personendaten]]) */<br />
<br />
table.metadata {<br />
border: 1px solid #aaaaaa;<br />
display: none;<br />
}<br />
.metadata-label {<br />
color: #aaaaaa;<br />
}<br />
span.metadata,<br />
span.metadata-inline {<br />
display: none;<br />
}<br />
<br />
/*<br />
* Farbdefinitionen für Rahmen und Hintergründe von [[Wikipedia:Textbausteine|Textbausteinen]].<br />
* Hier: Standardvorgaben für "dunkle Schrift auf hellem Grund".<br />
* Für Hell-auf-dunkel-Skins ([[MediaWiki:Amethyst.css|Amethyst]]) müssen dort entsprechende Definitionen<br />
* zusätzlich eingetragen werden! Anpassungen für andere Skins sind optional.<br />
* (Die Angaben der Rahmenstärke dienen der Bequemlichkeit, so dass man<br />
* für dünne Rahmen nur noch "border-style" angeben muss.)<br />
*/<br />
<br />
.rahmenfarbe1 { /* Wie Inhaltsverzeichnis */<br />
border-color: #aaaaaa;<br />
border-width: 1px;<br />
}<br />
.rahmenfarbe2 { /* Unauffällig, geringer Kontrast */<br />
border-color: #e9e9e9;<br />
border-width: 1px;<br />
}<br />
.rahmenfarbe3 { /* "Rot", auffällig */<br />
border-color: #c00000;<br />
border-width: 1px;<br />
}<br />
.rahmenfarbe4 { /* Neutrale Farbe, deutlich */<br />
border-color: #8888aa;<br />
border-width: 1px;<br />
}<br />
.rahmenfarbe5 { /* "Schwarz", hoher Kontrast */<br />
border-color: #000000;<br />
border-width: 1px;<br />
}<br />
<br />
tr.hintergrundfarbe1 th,<br />
tr th.hintergrundfarbe1,<br />
table.hintergrundfarbe1,<br />
.hintergrundfarbe1 { /* Wie Inhaltsverzeichnis */<br />
background-color: #f9f9f9;<br />
}<br />
tr.hintergrundfarbe2 th,<br />
tr th.hintergrundfarbe2,<br />
table.hintergrundfarbe2,<br />
.hintergrundfarbe2 { /* "Weiß", für Nicht-Artikel-Seiten, neutral */<br />
background-color: #ffffff;<br />
}<br />
tr.hintergrundfarbe3 th,<br />
tr th.hintergrundfarbe3,<br />
table.hintergrundfarbe3,<br />
.hintergrundfarbe3 { /* "Gelb", auffällig */<br />
background-color: #ffff40;<br />
}<br />
tr.hintergrundfarbe4 th,<br />
tr th.hintergrundfarbe4,<br />
table.hintergrundfarbe4,<br />
.hintergrundfarbe4 { /* Sehr auffällig */<br />
background-color: #ffaa00;<br />
}<br />
tr.hintergrundfarbe5 th,<br />
tr th.hintergrundfarbe5,<br />
table.hintergrundfarbe5,<br />
.hintergrundfarbe5 { /* Neutral, abgesetzt */<br />
background-color: #e0e0e0;<br />
}<br />
tr.hintergrundfarbe6 th,<br />
tr th.hintergrundfarbe6,<br />
table.hintergrundfarbe6,<br />
.hintergrundfarbe6 { /* Allgemein „bunt“, für Hervorhebungen und Unterscheidungen */<br />
background-color: #b3b7ff;<br />
}<br />
tr.hintergrundfarbe7 th,<br />
tr th.hintergrundfarbe7,<br />
table.hintergrundfarbe7,<br />
.hintergrundfarbe7 { /* Allgemein „bunt“, für Hervorhebungen und Unterscheidungen */<br />
background-color: #ffcbcb;<br />
}<br />
tr.hintergrundfarbe8 th,<br />
tr th.hintergrundfarbe8,<br />
table.hintergrundfarbe8,<br />
.hintergrundfarbe8 { /* Allgemein „bunt“, für Hervorhebungen und Unterscheidungen */<br />
background-color: #ffebad;<br />
}<br />
tr.hintergrundfarbe9 th,<br />
tr th.hintergrundfarbe9,<br />
table.hintergrundfarbe9,<br />
.hintergrundfarbe9 { /* Allgemein „bunt“, für Hervorhebungen und Unterscheidungen */<br />
background-color: #b9ffc5;<br />
}<br />
<br />
/* Keine Vergrößerung der Zeilenhöhe durch hochgestellte Zahlen der Fußnoten */<br />
<br />
sup.reference {<br />
font-weight: 400;<br />
font-style: normal;<br />
}<br />
sup,<br />
sub {<br />
line-height: 1em;<br />
}<br />
<br />
/* Hervorhebung der angeklickten Fußnoten und der Rückverweise in blau */<br />
<br />
ol.references > li:target,<br />
sup.reference:target {<br />
background-color: #def;<br />
}<br />
<br />
/* Hochgestellte Buchstaben in der Einzelnachweiseliste kursiv setzen */<br />
<br />
ol.references li a[href|="#cite_ref"] {<br />
font-style: italic;<br />
}<br />
<br />
/* Inline-Verwendung der [[:Kategorie:Vorlage:Schwesterprojektverweis|Schwesterprojektverweise]] */<br />
<br />
ol.references li div.sisterproject {<br />
display: inline !important;<br />
}<br />
<br />
/* Für <nowiki><hiero>…</hiero></nowiki> */<br />
<br />
.mw-hierotable,<br />
.mw-hierotable th,<br />
.mw-hierotable td {<br />
border: 0;<br />
padding: 0;<br />
}<br />
<br />
/* Für [[MediaWiki:Anoneditwarning]] und weitere Hinweise, die alle untereinander stehen */<br />
<br />
#mw-anon-edit-warning,<br />
#mw-missingsummary,<br />
#wp_talkpagetext {<br />
width: 80%;<br />
background: #d3e1f2;<br />
border: 1px solid #1a47ff;<br />
margin: 1em auto;<br />
padding: 1em;<br />
}<br />
<br />
/* Bei URLs, die auf unser Projekt und verwandte Projekte verweisen, den Pfeil ausblenden<br />
* Dieser Pfeil dient nur dazu, auf externe Ziele hinzuweisen<br />
* Auf den Einsatz der Klasse "plainlinks" kann dadurch verzichtet werden<br />
*/<br />
#content a[href^="http://de.wikipedia.org"],<br />
#content a[href^="http://toolserver.org"] {<br />
background: none !important;<br />
padding-right: 0 !important;<br />
}<br />
#content .mw-search-formheader div.search-types ul li a[href^="http://de.wikipedia.org"],<br />
#content .mw-search-formheader div.search-types ul li a[href^="http://toolserver.org"] {<br />
padding-right: 0.5em !important; <br />
}<br />
<br />
/* Falls bei der Seitenbearbeitung vergessen wurde, die Zusammenfassung auszufüllen */<br />
.mw-summarymissed {<br />
border: 5px solid red;<br />
padding: 2px;<br />
}<br />
<br />
/* Copyrightwarnung */<br />
<br />
#editpage-copywarn {<br />
border: solid 1px #c00000;<br />
font-size: 90%;<br />
background-color: #ffffff;<br />
}<br />
<br />
.mw-tos-summary {<br />
border: solid 1px #c00000;<br />
background-color: #ffffff;<br />
padding-left: 1em;<br />
}<br />
<br />
/* +++++ 2. SONSTIGE ANPASSUNGEN (Spezialseiten u. a.) +++++ */<br />
<br />
/* Markierung von Redirects in [[Special:Allpages]], [[Special:Watchlist]], Kategorien */<br />
<br />
.allpagesredirect,<br />
.watchlistredir,<br />
.redirect-in-category {<br />
font-style: italic;<br />
}<br />
<br />
/* Fettformatierung von Admin-Spezialseiten in [[Special:Specialpages]] abschalten */<br />
.mw-specialpagerestricted strong {<br />
font-weight: normal;<br />
}<br />
/* Legende auf [[Special:Specialpages]] ebenfalls abschalten */<br />
div.mw-specialpages-notes {<br />
display: none;<br />
}<br />
<br />
/* Größerer Abstand zwischen TOC-Nummerierung und TOC-Eintrag */<br />
span.tocnumber {<br />
margin-right: 0.3em;<br />
}<br />
<br />
/* Skinabhängige absolute Positionierungen ausblenden */<br />
/* Bitte [[MediaWiki Diskussion:Common.css#Absolute_Positionierungen]] beachten */<br />
<br />
#coordinates,<br />
#coordinates_3_ObenRechts,<br />
#issnlink,<br />
#editcount,<br />
#shortcut,<br />
#artikelstadium,<br />
.topicon,<br />
#spoken-icon,<br />
#commons-icon {<br />
display: none;<br />
}<br />
<br />
/* Anpassungen für [[:Template:Link_FA]] */<br />
<br />
/* hide the template */<br />
#bodyContent span.FA {<br />
display: none;<br />
}<br />
<br />
/* change the bullets for links to special articles */<br />
#p-lang li.FA {<br />
/* hier immer auch linkFA_bullet in Common.js mit anpassen für die älteren skins! */<br />
list-style-image: url("http://upload.wikimedia.org/wikipedia/commons/d/d0/Monobook-bullet-star-transparent.png");<br />
}<br />
<br />
/* change the bullets for links to special articles */<br />
#p-lang li.GA {<br />
/* hier immer auch linkGA_bullet in Common.js mit anpassen für die älteren skins! */<br />
list-style-image: url("http://upload.wikimedia.org/wikipedia/commons/a/a1/Monobook-bullet-star-gray.png");<br />
}<br />
<br />
/* Verhindere, dass Infoboxen etc. in den Inhalt von Kategorien hineinragen.<br />
Das betrifft nur Kategorieseiten. */<br />
#mw-subcategories,<br />
#mw-pages {<br />
clear: both;<br />
}<br />
<br />
/* DIVs in ImageMaps inlinen (Vorschlag von Revolus) */<br />
.imagemap-inline div {<br />
display: inline;<br />
}<br />
<br />
/* [[Special:Hochladen]]: Warnmeldung auf bestehende Dateien, unerwünschte Prefixe usw. deutlicher hervorheben. */<br />
<br />
#wpDestFile-warning ul {<br />
border: solid red 1px;<br />
padding: 1.5em;<br />
}<br />
<br />
/* Warnmeldung für gesperrte Titel */<br />
.mw-titleprotectedwarning {<br />
background-color: #eee;<br />
border: 2px solid red;<br />
padding: 1em;<br />
}<br />
<br />
/* Warnmeldung bei der Bearbeitung von Seiten im MediaWiki-Namensraum */<br />
.mw-editinginterface {<br />
background-color: #f9f9f9;<br />
border-color: #c00000;<br />
border-width: 1px;<br />
border-style: solid;<br />
padding: 2px;<br />
}<br />
<br />
/* Überschrift 5. und 6. Ordnung proportionaler zu Fließtext */<br />
#content h5 {<br />
font-size: 108%; /* Original: 116% */<br />
}<br />
#content h6 {<br />
font-size: 100%; /* Original: 80% = kleiner als Bodytext, unschön */<br />
}<br />
#content h6 .editsection {<br />
font-size: 120%;<br />
font-weight: normal;<br />
}<br />
<br />
/* Anleitung auf Special:Search */<br />
.mw-searchresult {<br />
font-size: 84%;<br />
margin: 5px;<br />
}<br />
<br />
/* Gestaltung der Edittools-Leiste */<br />
#specialchars {<br />
margin-top: 3px;<br />
border: solid 1px #aaaaaa;<br />
padding: 1px;<br />
text-align: left;<br />
background-color: white;<br />
}<br />
<br />
/* Legende für Versionsgeschichte */<br />
.mw-history-legend {<br />
font-size: 90%;<br />
margin-top: 2px;<br />
margin-bottom: 2px;<br />
border: solid 1px #e9e9e9;<br />
padding: 0 5px 5px 5px;<br />
background-color: #f9f9f9;<br />
clear: both;<br />
}<br />
<br />
/* +++++ 3. NEUE [[Wikipedia:Hauptseite|HAUPTSEITE]] (ab 2006) +++++ */<br />
<br />
/* Kategorie verbergen */<br />
/* Überschrift verbergen */<br />
/* Redirhinweis verbergen - ACHTUNG: Je nach Skin muss jetzt der Abstand zum oberen Rand korrigiert werden */<br />
body.page-Wikipedia_Hauptseite #catlinks,<br />
body.page-Wikipedia_Hauptseite h1.firstHeading,<br />
body.page-Wikipedia_Hauptseite #contentSub {<br />
display: none;<br />
}<br />
<br />
#hauptseite h2 {<br />
background-color: #d8e8ff;<br />
border: 1px solid #8898bf;<br />
font-size: 1em;<br />
font-weight: bold;<br />
margin-top: 0;<br />
margin-bottom: 0;<br />
padding-top: 0.1em;<br />
padding-bottom: 0.1em;<br />
}<br />
#hauptseite .inhalt {<br />
background-color: #ffffff;<br />
border: 1px solid #8898bf;<br />
border-top: 0 solid white;<br />
padding: 0.3em 0.8em 0.4em 0.8em;<br />
}<br />
#hauptseite .inhalt hr {<br />
background-color: #8898bf;<br />
color: #8898bf;<br />
height: 1px;<br />
margin: 0.5em 0;<br />
padding: 0;<br />
}<br />
#hauptseite .inhalt .mehr {<br />
clear: both;<br />
font-size: 95%;<br />
margin-top: 0.8em;<br />
text-align: right;<br />
}<br />
#hauptseite table {<br />
background-color: transparent;<br />
}<br />
.hauptseite-oben,<br />
.hauptseite-links,<br />
.hauptseite-rechts {<br />
margin-bottom: 1em;<br />
}<br />
.hauptseite-links {<br />
margin-right: 0.5em;<br />
}<br />
.hauptseite-rechts {<br />
margin-left: 0.5em;<br />
}<br />
.hauptseite-oben h2,<br />
.hauptseite-unten h2 {<br />
text-align: center;<br />
}<br />
.hauptseite-oben .inhalt .portale {<br />
font-weight: bold;<br />
margin-top: 0.2em;<br />
margin-bottom: 0.2em;<br />
}<br />
.hauptseite-oben .inhalt .intern {<br />
font-size: 90%;<br />
text-align: center;<br />
}<br />
.hauptseite-links h2,<br />
.hauptseite-rechts h2 {<br />
text-indent: 0.8em;<br />
}<br />
#hauptseite-schwesterprojekte .inhalt a {<br />
font-weight: bold;<br />
}<br />
<br />
/* IPA links nicht unterstreichen */<br />
.IPA a:link,<br />
.IPA a:visited {<br />
text-decoration: none;<br />
}<br />
<br />
/* CSS-Klassen für Schriftarten als Workaround für Defizite in alten IE-Versionen.<br />
* Achtung: IE6 mag keine Zeilenumbrüche zwischen den Fonts.<br />
* In IE8 nicht mehr nötig, soll mit den alten Versionen aussterben. Browserweiche:<br />
* http://www.dynamicsitesolutions.com/css/filters/star-html/<br />
* http://www.dynamicsitesolutions.com/css/filters/first-child-plus-html/<br />
*/<br />
* html .Unicode {<br />
font-family: Code2000, Sun-ExtA, "Arial Unicode MS", NSimSun, sans-serif;<br />
}<br />
*:first-child+html .Unicode {<br />
font-family: Code2000, Sun-ExtA, "Arial Unicode MS", NSimSun, sans-serif;<br />
}<br />
* html .Unicode1 {<br />
font-family: Code2001, Quivira, "MPH 2B Damase", sans-serif;<br />
}<br />
*:first-child+html .Unicode1 {<br />
font-family: Code2001, Quivira, "MPH 2B Damase", sans-serif;<br />
}<br />
* html .Unicode2 {<br />
font-family: Sun-ExtB, Code2002, sans-serif;<br />
}<br />
*:first-child+html .Unicode2 {<br />
font-family: Sun-ExtB, Code2002, sans-serif;<br />
}<br />
* html .IPA {<br />
font-family: Quivira, Code2000, Sun-ExtA, "DejaVu Sans", Gentium, Helvetica, "Arial Unicode MS", "Lucida Sans Unicode", sans-serif;<br />
}<br />
*:first-child+html .IPA {<br />
font-family: Quivira, Code2000, Sun-ExtA, "DejaVu Sans", Gentium, Helvetica, "Arial Unicode MS", "Lucida Sans Unicode", sans-serif;<br />
}<br />
* html .IAST {<br />
font-family: Code2000, SunExtA, "Arial Unicode MS", sans-serif;<br />
}<br />
*:first-child+html .IAST {<br />
font-family: Code2000, SunExtA, "Arial Unicode MS", sans-serif;<br />
}<br />
* html .altitalisch {<br />
font-family: Quivira, Code2001, "MPH 2B Damase", sans-serif;<br />
}<br />
*:first-child+html .altitalisch {<br />
font-family: Quivira, Code2001, "MPH 2B Damase", sans-serif;<br />
}<br />
* html .gotisch {<br />
font-family: Quivira, Code2001, "MPH 2B Damase", sans-serif;<br />
}<br />
*:first-child+html .gotisch {<br />
font-family: Quivira, Code2001, "MPH 2B Damase", sans-serif;<br />
}<br />
* html .hebrew {<br />
font-family: Quivira, Sun-ExtA, "Arial Unicode MS", "SBL Hebrew", Code2000, "MPH 2B Damase", sans-serif;<br />
}<br />
*:first-child+html .hebrew {<br />
font-family: Quivira, Sun-ExtA, "Arial Unicode MS", "SBL Hebrew", Code2000, "MPH 2B Damase", sans-serif;<br />
}<br />
* html .spanAr {<br />
font-family: "Arial Unicode MS", Scheherazade, Code2000, "DejaVu Sans", sans-serif;<br />
}<br />
*:first-child+html .spanAr {<br />
font-family: "Arial Unicode MS", Scheherazade, Code2000, "DejaVu Sans", sans-serif;<br />
}<br />
* html .music-symbol {<br />
font-family: "Musical Symbols", Euterpe, Code2001, sans-serif;<br />
}<br />
*:first-child+html .music-symbol {<br />
font-family: "Musical Symbols", Euterpe, Code2001, sans-serif;<br />
}<br />
* html .polytonic {<br />
font-family: "Arial Unicode MS", "Palatino Linotype", Code2000, "New Athena Unicode", Gentium, "Athena Unicode";<br />
}<br />
*:first-child+html .polytonic {<br />
font-family: "Arial Unicode MS", "Palatino Linotype", Code2000, "New Athena Unicode", Gentium, "Athena Unicode";<br />
}<br />
<br />
/* Standardmäßige Ausblendung der Flagged-Revisions-Backlog-Sitenotice */<br />
#mw-oldreviewed-notice {<br />
display: none;<br />
}<br />
<br />
/* Standardmäßige Ausblendung der Flagged-Revisions-Kommentarbox */<br />
#mw-commentbox {<br />
display: none;<br />
}<br />
<br />
/* Abstand zwischen Liste und Inhaltsverzeichnis erhöhen, siehe http://de.wikipedia.org/w/index.php?title=MediaWiki_Diskussion:Common.css&oldid=51639015#Abstand_vor_Inhaltsverzeichnis */<br />
ul + .toc,<br />
ol + .toc {<br />
margin-top: 0.5em;<br />
}<br />
<br />
/* höheres Uploadfeld */<br />
#wpUploadDescription {<br />
height: 20em;<br />
}<br />
<br />
/* Im Projekt WP:GEO benutzt die [[Vorlage:Coordinate]] das «geo-microformat» zur semantischen<br />
Auszeichnung des Texts. Der Inhalt dieses [[Tag (Informatik)|Tags]] ist nicht für den Leser bestimmt. */<br />
.geo {<br />
display: none;<br />
}<br />
<br />
/* Patrollink ausblenden, da die Eweiterung hier nicht aktiviert ist und<br />
deren Optik zu sehr den gesichteten Versionen ähnelt. */<br />
.fr-diff-patrollink,<br />
.patrollink {<br />
display: none;<br />
}<br />
<br />
/* Rollback-Knopf auf Beobachtungsliste ausblenden, da es dort nur von sehr beschränktem Nutzen<br />
ist und zu sehr vielen Reverts aus Versehen führt */<br />
.page-Spezial_Beobachtungsliste .mw-rollback-link {<br />
display: none;<br />
}<br />
<br />
/* </source> */<br />
<br />
/* Disable Discussion-tab */<br />
<br />
#ca-talk {<br />
display: none;<br />
}</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=Reparatur_iTP_A3_EOS&diff=1048Reparatur iTP A3 EOS2016-08-06T21:28:52Z<p>Qsysopr: /* Reparatur */ Bild hinzugefügt</p>
<hr />
<div>[[Datei:iTP_Gesamt.jpg|thumb|iTP A3 EOS im Vergleich zu einer AA-Zelle]]<br />
Vor ein paar Jahren habe ich mir eine iTP A3 EOS (upgraded) zugelegt. Wem die Bezeichnung nichts sagt: keine Sorge, muss man nicht kennen - es handelt sich dabei um eine Taschenlampe.<br />
<br />
Sie hat bis zu 96 Lumen (in 3 Stufen), obwohl sie nicht besonders größer als eine AA-Batterie ist (14 mm Durchmesser, 67 mm lang). Versorgt wird sie durch eine einzelne AAA-Zelle wobei der eingebaute Schaltwandler bis knapp 0,9 Volt läuft. Er holt also fast alles aus der Zelle, auch wenn die Taschenlampe zum Ende hin etwas dunkler wird.<br />
<br />
Das Teil ist - wie so vieles - toll, solange es funktioniert. Nachdem das Lämpchen immer am Schlüsselbund ist und dementsprechend öfter mal runter fiel, war nach knapp drei Jahren Schluss. Erst ging sie erst nach zudrehen und anschnippen an, später musste man etwas klopfen, dann blieb sie dauerhaft aus. Grmpf.<br />
<br />
Wegwerfen? Auf keinen Fall! Zumal es sie anscheinend nicht mehr zu Kaufen gibt.<br />
<br />
= Auf das Ding! =<br />
<br />
Das wahrscheinlich schwierigste Unterfangen an der Reparatur - Der Kopf der Lampe ist schnell drunten, aber wie kommt man an die Elektronik?<br />
Zwei Löcher in der Leiterkarte und das Gewinde verraten den Trick: Rausschrauben.<br />
<br />
Dazu nimmt man am besten eine ältere und sehr stabile Pinzette oder spannt zwei passende Stahlstifte (am besten mit Absatz oder konisch, damit man innen nichts aufspießt) in einen Schraubstock.<br />
<br />
<gallery><br />
Datei:iTP_Kopf.jpg|Taschenlampenkopf von hinten<br />
Datei:iTP_oeffnen.jpg|Einrasten & Drehen<br />
</gallery><br />
<br />
Erschwerend kommt dazu, dass der Innenkörper mit dem Lampenkopf verklebt wurde. Dagegen arbeitet man am besten mit Wärme und sanfter Gewalt. Es hilft auch, den Innenkörper immer wieder ein Stück hineinzudrehen.<br />
<br />
Hat man das Innenleben befreit, ist es empfehlenswert, die Klebereste vollständig zu entfernen - sowohl am Innenteil als auch am Lampenkopf. Sonst wird das Einschrauben später noch schwieriger. Dazu am Besten wieder erwärmen und vorsichtig (das Alu ist relativ weich) die Gewindegänge auskratzen.<br />
<br />
<gallery><br />
Datei:iTP_Innenkoerper_oben.jpg|Helle Seite...<br />
Datei:iTP_Innenkoerper_unten.jpg|...und dunkle Seite des Innenkörpers<br />
</gallery><br />
<br />
Um an die Elektronik zu kommen, muss zunächst die Leiterkarte runter, die zugleich den Kontakt zur Batterie darstellt. Dazu geht man am besten mit einem feinen Schraubendreher in die Nut und hebelt sie vorsichtig heraus. Wärme hilft auch hier gegen den Kleber.<br />
<br />
Oft sieht man nach diesem Schritt schon den Defekt:<br />
<br />
<gallery><br />
Datei:iTP_Leitungsbruch1.jpg<br />
Datei:iTP_Leitungsbruch2.jpg<br />
Datei:iTP_Leitungsbruch3.jpg<br />
</gallery><br />
<br />
Leitungsbruch.<br />
<br />
= Reparatur =<br />
<br />
Damit das Löten einfacher vonstatten geht (es ist verdammt eng!) habe ich bei meinen beiden Reparaturen auch die LED herausgenommen. Dazu muss man auf der anderen Seite des Innenteils zuerst die Plastikabdeckung herausnehmen und anschließend die Anschlussdrähte ablöten.<br />
<br />
<gallery><br />
Datei:iTP_LED1.jpg|Mit Deckel<br />
Datei:iTP_LED2.jpg|Ohne Deckel<br />
Datei:ITP Waermeleitpaste.jpg|Ohne LED aber mit Pampe<br />
Datei:iTP_LED3.jpg|Ohne LED und Pampe<br />
</gallery><br />
<br />
Da die Wärmeleitpaste eh eingetrocknet ist, kann man sie auch gleich entfernen/erneuern. Isopropanol und Wattestäbchen sind hier die Mittel der Wahl.<br />
<br />
Wenn man das Teil schon einmal offen hat: Am besten beide Leitungen zum Batteriekontakt tauschen!<br />
Ich habe bei der ersten Reparatur vor einem halben Jahr den Fehler gemacht, nur die gebrochene Leitung neu anzulöten und durfte das Teil jetzt noch einmal öffnen.<br />
<br />
Die beiden Litzen sind recht kurz zu halten, 1 cm ist mehr als genug. Auf jeden Fall sollte man eine feine Litze nehmen (meine ist schon fast zu dick), damit die Lötstellen nicht wieder so schnell brechen.<br />
<br />
= Zusammenbau = <br />
<br />
Und schon liegt das Teil wieder da wie eine aufgebrachte Krabbe - bis man es wieder in die Behausung steckt:<br />
<br />
<gallery><br />
Datei:iTP_Zusammenbau1.jpg|[http://www.youtube.com/results?search_query=findet+nemo+krabben+hey Hey!]<br />
Datei:iTP_Zusammenbau2.jpg|Zusammengeklappt<br />
Datei:iTP_Zusammenbau3.jpg|und wieder eingebaut<br />
</gallery><br />
<br />
Wichtig beim Zusammenbau: die Drähte für die LED durch die Löcher stecken und dann die Elektronik um 180 Grad drehen, sonst schauen die Drähte viel zu weit heraus. (Alternativ: zuerst LED anlöten und dann die Elektronik ins Alugehäuse einsetzen)<br />
<br />
Die vorher entfernte Wärmeleitpaste durch neue ersetzt (wie beim PC gilt: weniger ist manchmal mehr und bei mir ist es fast schon zu viel) und schon kann man die LED wieder anlöten.<br />
<br />
Beim Anlöten der Drähte an die LED müssen diese gegen den Uhrzeigersinn liegen (siehe oben), sonst passt die Plastikkappe nicht! Bei der LED sind übrigens sowohl Anode als auch Kathode auf der Trägerplatine markiert (+ und -)<br />
<br />
Die Kontaktplatine wieder eingedrückt (wenn sie fest hält, muss man sie nicht einmal verkleben) kann das Modul wieder ins Gehäuse.<br />
<br />
Und sie leuchtet wieder!<br />
<br />
[[Kategorie:Elektronik]]<br />
[[Kategorie:Reparatur]]</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=Datei:ITP_Zusammenbau3.jpg&diff=942Datei:ITP Zusammenbau3.jpg2014-08-24T19:22:47Z<p>Qsysopr: lud eine neue Version von „Datei:ITP Zusammenbau3.jpg“ hoch: MsUpload</p>
<hr />
<div>MsUpload</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=Datei:ITP_Zusammenbau1.jpg&diff=940Datei:ITP Zusammenbau1.jpg2014-08-24T19:22:46Z<p>Qsysopr: lud eine neue Version von „Datei:ITP Zusammenbau1.jpg“ hoch: MsUpload</p>
<hr />
<div>MsUpload</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=Datei:ITP_Zusammenbau2.jpg&diff=941Datei:ITP Zusammenbau2.jpg2014-08-24T19:22:46Z<p>Qsysopr: lud eine neue Version von „Datei:ITP Zusammenbau2.jpg“ hoch: MsUpload</p>
<hr />
<div>MsUpload</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=Datei:ITP_Waermeleitpaste.jpg&diff=939Datei:ITP Waermeleitpaste.jpg2014-08-24T19:22:45Z<p>Qsysopr: lud eine neue Version von „Datei:ITP Waermeleitpaste.jpg“ hoch: MsUpload</p>
<hr />
<div>MsUpload</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=Datei:ITP_Leitungsbruch3.jpg&diff=937Datei:ITP Leitungsbruch3.jpg2014-08-24T19:22:44Z<p>Qsysopr: lud eine neue Version von „Datei:ITP Leitungsbruch3.jpg“ hoch: MsUpload</p>
<hr />
<div>MsUpload</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=Datei:ITP_oeffnen.jpg&diff=938Datei:ITP oeffnen.jpg2014-08-24T19:22:44Z<p>Qsysopr: MsUpload</p>
<hr />
<div>MsUpload</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=Datei:ITP_Leitungsbruch2.jpg&diff=936Datei:ITP Leitungsbruch2.jpg2014-08-24T19:22:43Z<p>Qsysopr: lud eine neue Version von „Datei:ITP Leitungsbruch2.jpg“ hoch: MsUpload</p>
<hr />
<div>MsUpload</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=Datei:ITP_LED3.jpg&diff=934Datei:ITP LED3.jpg2014-08-24T19:22:42Z<p>Qsysopr: lud eine neue Version von „Datei:ITP LED3.jpg“ hoch: MsUpload</p>
<hr />
<div>MsUpload</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=Datei:ITP_Leitungsbruch1.jpg&diff=935Datei:ITP Leitungsbruch1.jpg2014-08-24T19:22:42Z<p>Qsysopr: lud eine neue Version von „Datei:ITP Leitungsbruch1.jpg“ hoch: MsUpload</p>
<hr />
<div>MsUpload</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=Datei:ITP_LED2.jpg&diff=933Datei:ITP LED2.jpg2014-08-24T19:22:41Z<p>Qsysopr: lud eine neue Version von „Datei:ITP LED2.jpg“ hoch: MsUpload</p>
<hr />
<div>MsUpload</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=Datei:ITP_LED1.jpg&diff=932Datei:ITP LED1.jpg2014-08-24T19:22:40Z<p>Qsysopr: lud eine neue Version von „Datei:ITP LED1.jpg“ hoch: MsUpload</p>
<hr />
<div>MsUpload</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=Datei:ITP_Innenkoerper_unten.jpg&diff=930Datei:ITP Innenkoerper unten.jpg2014-08-24T19:22:39Z<p>Qsysopr: lud eine neue Version von „Datei:ITP Innenkoerper unten.jpg“ hoch: MsUpload</p>
<hr />
<div>MsUpload</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=Datei:ITP_Kopf.jpg&diff=931Datei:ITP Kopf.jpg2014-08-24T19:22:39Z<p>Qsysopr: lud eine neue Version von „Datei:ITP Kopf.jpg“ hoch: MsUpload</p>
<hr />
<div>MsUpload</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=Datei:ITP_Innenkoerper_oben.jpg&diff=929Datei:ITP Innenkoerper oben.jpg2014-08-24T19:22:38Z<p>Qsysopr: lud eine neue Version von „Datei:ITP Innenkoerper oben.jpg“ hoch: MsUpload</p>
<hr />
<div>MsUpload</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=Datei:ITP_Gesamt.jpg&diff=928Datei:ITP Gesamt.jpg2014-08-24T19:22:37Z<p>Qsysopr: lud eine neue Version von „Datei:ITP Gesamt.jpg“ hoch: MsUpload</p>
<hr />
<div>MsUpload</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=Hauptseite&diff=911Hauptseite2014-06-24T19:10:18Z<p>Qsysopr: </p>
<hr />
<div>'''Willkommen auf hobbyelektronik.org!'''<br />
<br />
Auf diesen Seiten findest du [[Hobbyelektronik.org:Impressum|unsere]] Projekte rund um Elektronik und allem möglichen, was uns interessiert.<br />
<br />
Neben dem Wiki hier gibt es auch ein '''[http://hobbyelektronik.org/b/ Blog]''', das sich nicht nur mit Elektronik und der Homepage beschäftigt. Dort kann - im Gegensatz zum Wiki hier - auch fleißig kommentiert werden, was an dieser Stelle aufgrund von massivem Spam deaktiviert werden musste.<br />
<br />
Aber nun wünsche ich viel Spaß beim stöbern auf den Seiten hier!<br />
<br />
Bitte benutze die Navigation links, um zu den [[Spezial:Alle Seiten|Artikeln]] zu kommen.<br />
==[http://hobbyelektronik.org/b/ Blog]==<br />
<latestblogposts /><br />
<br />
==Neues==<br />
*10.05.2014 [[Kühlung für Zhongdi ZD-939L]]<br />
*02.02.2014 [[EAGLE-Bibliotheken]]<br />
*10.11.2013 [[Zeitraffer mit Linux]]<br />
*14.08.2013 [[Umbau Belkin Auto-USB-Lader]]<br />
*02.05.2013 [[Farnell-Assistent]]<br />
*16.01.2013 [[Halbleiterelektronik-Formelsammlung]]<br />
<br />
==Änderungen==<br />
*20.10.2013 [[EMR7370]] korrigiert. In main() war ein falscher Funktionsaufruf.<br />
*28.04.2012 [[EMR7370]] ergänzt. Der Quellcode ist nun verfügbar.<br />
*14.03.2012 Ein paar Bilder zum [[Kameratimer]] und dem [[SNES-Joypad]] hinzugefügt<br />
*19.03.2011 [[What's next?]]: Zimmerbus<br />
*21.11.2010 [[What's next?]]: Ein paar Infos zum Moodlight<br />
*21.11.2010 [[AVR-Doper]]: "Patch" für AVR-Studio</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=K%C3%BChlung_f%C3%BCr_Zhongdi_ZD-939L&diff=910Kühlung für Zhongdi ZD-939L2014-06-24T19:07:08Z<p>Qsysopr: Zahlendreher korrigiert, vielen Dank an Manfred!</p>
<hr />
<div>Vor geraumer Zeit hab ich mir eine Zhondi ZD-939L auf den Basteltisch gestellt. Diese Heißluftlötstation ist gerade beim Entlöten von SMD-Bauteilen ein sehr nützlicher Helfer.<br />
<br />
[[Datei:ZD-939L Hinweis.JPG|thumb|Aufkleber als Workaround]]<br />
<br />
Eines hat mich allerdings vom ersten Tag weg gestört: sie hat keinen Nachlauf zum Kühlen des Heizelements. Als "Workaround" hat der Importeur lediglich einen Hinweis angebracht, dass man vor dem Abschalten auf die Mindesttemperatur herunterdrehen und eine Minute warten solle. Mit dem Warten kann ich leben, allerdings ist das Einstellen der Temperatur etwas nervig: Minus-Taster drücken und halten und sich für jedes Grad einen Pieps anhören. Nur um beim Nächsten Einschalten genau das Gegenteil zu machen. selbstverständlich ebenfalls mit akustischer Untermalung.<br />
<br />
Dabei gibt es die Heißluft-Station (neben der Version mit Nachlauf) auch mit dienen Schalter fürs Heizelement. Warum hat das meine nicht? Es wird höchste Zeit, dass sich das ändert.<br />
<br />
=Analyse=<br />
[[Datei:ZD-939L_Innenleben.jpg|thumb|Blick auf die hintere Leiterkarte]]<br />
Auf das Ding und reingeschaut. Die Elektronik ist auf 3 Leiterkarten verteilt - hinten befindet sich ein teilbestücktes Board auf das die Netzleitung führt. Nachdem sich nichts darauf befindet, das auf Regelung hindeutet, dürfte es der Leistungsteil sein. Vorne im Gehäuse findet sich neben der Leiterkarte mit den Tastern vom Frontpanel auch die Platine mit dem Display. Die 3 schwarzen Vielbeiner darauf lassen erahnen: hier wird höchstwahrscheinlich geregelt.<br />
<br />
Heizung abdrehen könnte man nun sowohl auf der Leistungs- als auch der mutmaßlichen Reglerplatine. Man könnte natürlich auch direkt in die Leitung zum Heizelement eingreifen - aber warum sich die Finger an 230 V verbrennen, wenn man es auch einfacher und sicher haben kann?<br />
<br />
Ein genauerer Blick auf die Display-Platine kann also nicht schaden:<br />
<br />
<gallery><br />
Datei:ZD-939L Regler.JPG|Die Reglerplatine<br />
</gallery><br />
<br />
Der 8-beinige Chip links ist ein LM358, also ein Operationsverstärker. Beim mittleren Chip im TQFP-Gehäuse handelt es sich um einen Silabs C8051F310 - einem Mikrocontroller. Rechts im Bild befindet sich ein Holtek HT1621B. Holtek kennt man auch als Mikrocontroller-Hersteller - aber zwei Mikrocontroller für einen einfachen Regler? Nicht ganz. Der Holtek ist lediglich ein LCD-Controller, was auch die Leiterbahnen zu ihm erklärt. Die Regelung übernimmt alleinig der Silabs-Chip.<br />
<br />
Interessanter als die Regelung und das Display ist für den Umbau, über welche Anschlüsse die Heizung angesteuert wird. Drei der vier Stiftleisten sind mit der Platine hinten verbunden. Die 4-polige Stiftleiste links im Bild führt zur Taster-Platine und fällt damit schon mal weg.<br />
<br />
Die untere zweipolige Stifleiste ist ein Kandidat - nachdem sie aber verdächtig nahe am LM358, ein paar diskreten Bauteilen und einem Poti liegt, dürfte es sich um den Anschluss für den Temperaturfühler sein. Alle Leitungen außer dieser verbunden bestätigt den Verdacht: Keine Temperaturanzeige.<br />
<br />
Bleiben nur noch zwei. Die links obere sieht verdächtig nach Stromversorgung aus: etwas dickere Leiterbahnen, Dioden und Kondensatoren. Nicht zuletzt ein 78L05. Warum aber 3 Pins? Eingangsspannung, Masse und Ausgangsspannung? Nein, vermutlich handelt es sich um eine symmetrische Versorgung - entweder fürs Display oder den Operationsverstärker.<br />
<br />
Ein Blick in den hinteren Teil der Lötstation bestätigt es: Ein Trafo mit Mittelabzapfung.<br />
<br />
Die Heizung muss also von der Stiftleiste rechts oben angesteuert werden. Am Stecker hängen zwei Drähte, was die Sache leichter macht. Masse lässt sich durchpiepsen und damit ist auch der Ausgang gefunden.<br />
<br />
Muss nur noch geklärt werden, wann welche Spannung anliegt und ob man einfach so einen Schalter einbringen kann. Multimeter angehängt und den Aparillo losbrummen lassen: 5V, wenn die Heizung an ist. Um sicherzustellen, dass die 5V berührungssicher sind, schnell gegen das Gehäuse, das mit PE verbunden ist: 0V, also galvanisch getrennt.<br />
<br />
Ausgezeichnet!<br />
<br />
=Umbau=<br />
<br />
Ein Ort für den zusätzlichen Schalter ist schnell gefunden: Neben dem Hauptschalter ist noch Platz. Der Akkuschrauber leiert ein Loch in die Platte und der Schalter ist drin.<br />
<br />
Für die elektrische Verbindung habe ich die Leitung zum "Backpanel" aufgetrennt und den Schalter einfach eingefügt. Da ich die Schaltung dahinter nicht genauer ansehen wollte, habe ich mich für die sicherere Ansteuerung entschlossen - theoretisch könnte man einfach eine der Leitungen auftrennen und den Schalter einfügen. Allerdings bekommt dann die Schaltung "hinten" entweder das Signal vom Mikrocontroller oder floatet durch die Gegend. Da das nicht besonders toll ist, wechselt der Schalter zwischen dem ursprünglichen Pfad und Masse. So gibt es immer einen definierten Pegel und Probleme werden bestmöglich ausgeschlossen.<br />
<br />
<gallery><br />
Datei:ZD-939L Elektronik vorne.JPG|Umgebaute Elektronik<br />
</gallery><br />
<br />
Der erste Test im noch auseinander gebauten Zustand spricht für Erfolg: die Soll-Temperatur ist bei 160 °C, die Ist-Temperatur bleibt bei 25 °C. Nach Kippen des Schalters klettert die Anzeige wie vorher nach oben.<br />
<br />
<gallery><br />
Datei:ZD-939L Front umgebaut.JPG|Funktionstest mit ausgeschalteter Heizung<br />
</gallery><br />
<br />
=J-EXT=<br />
Auf dem Board befinden sich noch zwei Vorhalte für Stiftleisten. Eine unbeschriftete (vermutlich zum Download der Firmware) und eine namens J-EXT.<br />
<br />
Rein aus Neugierde habe ich mir letztere etwas genauer angesehen, vielleicht spricht das Board ja mit einem.<br />
<br />
Die Leiterbahnen führen schon einmal alle zum Mikrocontroller, zusammen mit dessen Datenblatt lassen sich die Pins zuordnen. P3.x haben leider keine spezielle Peripherie zugeordnet, also eher unwahrscheinlich, dass da UART rauskommt. Möglich ist aber alles.<br />
<br />
Also Spannung mit dem Scope nachgemessen und nach positivem Befund den Logic-Analyzer angeschlossen:<br />
<br />
[[Datei:ZD-939L_Logic-Analyzer.png]]<br />
<br />
Aus den Daten lässt sich folgende Zuordnung ableiten:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Pin J-EXT !! Pin µC !! Pin-Name !! Funktion<br />
|-<br />
| 1 || - || - || +5V<br />
|-<br />
| 2 || 7 || P3.1 || ?<br />
|-<br />
| 3 || 9 || P3.3 || Clock<br />
|-<br />
| 4 || 10 || P3.4 || Data<br />
|-<br />
| 5 || - || - || GND<br />
|}<br />
<br />
Ein "Datenpaket" dauert etwa 2,6 ms und wird alle 20 ms gesendet. Allem Anschein nach werden die Daten in 16-Bit-Gruppen geschickt, zumindest bleibt der Clock nach 16 Bits immer ein bisschen länger High.<br />
Die Daten habe ich nicht genauer untersucht, da für mich der Reiz einfach nicht da ist. Wer es versuchen will, kann sein Glück mit meiner Aufzeichnung versuchen:<br />
<br />
[[Datei:ZD-939L J-EXT.zip]]<br />
<br />
Die Daten wurden mit Saleae Logic 1.1.18 Beta erstellt. Wenn ich mich richtig erinnere, war die Temperatur auf 160 °C Soll eingestellt und eine Ist-Temperatur von 25 °C (weniger macht das Teil anscheinend nicht) angezeigt.<br />
<br />
=Siehe auch=<br />
* [http://hobbyelektronik.org/b/2014/05/eine-kleine-anmerkung-zu-chinesischen-namen/ Eine kleine Anmerkung zu chinesischen Namen]<br />
<br />
[[Kategorie:Sonstiges]]<br />
[[Kategorie:Elektronik]]</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=K%C3%BChlung_f%C3%BCr_Zhongdi_ZD-393L&diff=909Kühlung für Zhongdi ZD-393L2014-06-24T19:06:40Z<p>Qsysopr: -.-</p>
<hr />
<div>#WEITERLEITUNG [[Kühlung für Zhongdi ZD-939L]]</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=K%C3%BChlung_f%C3%BCr_Zhongdi_ZD-939L&diff=907Kühlung für Zhongdi ZD-939L2014-06-24T19:05:54Z<p>Qsysopr: verschob „Kühlung für Zhongdi ZD-933L“ nach „Kühlung für Zhongdi ZD-939L“</p>
<hr />
<div>Vor geraumer Zeit hab ich mir eine Zhondi ZD-393L auf den Basteltisch gestellt. Diese Heißluftlötstation ist gerade beim Entlöten von SMD-Bauteilen ein sehr nützlicher Helfer.<br />
<br />
[[Datei:ZD-939L Hinweis.JPG|thumb|Aufkleber als Workaround]]<br />
<br />
Eines hat mich allerdings vom ersten Tag weg gestört: sie hat keinen Nachlauf zum Kühlen des Heizelements. Als "Workaround" hat der Importeur lediglich einen Hinweis angebracht, dass man vor dem Abschalten auf die Mindesttemperatur herunterdrehen und eine Minute warten solle. Mit dem Warten kann ich leben, allerdings ist das Einstellen der Temperatur etwas nervig: Minus-Taster drücken und halten und sich für jedes Grad einen Pieps anhören. Nur um beim Nächsten Einschalten genau das Gegenteil zu machen. selbstverständlich ebenfalls mit akustischer Untermalung.<br />
<br />
Dabei gibt es die Heißluft-Station (neben der Version mit Nachlauf) auch mit dienen Schalter fürs Heizelement. Warum hat das meine nicht? Es wird höchste Zeit, dass sich das ändert.<br />
<br />
=Analyse=<br />
[[Datei:ZD-939L_Innenleben.jpg|thumb|Blick auf die hintere Leiterkarte]]<br />
Auf das Ding und reingeschaut. Die Elektronik ist auf 3 Leiterkarten verteilt - hinten befindet sich ein teilbestücktes Board auf das die Netzleitung führt. Nachdem sich nichts darauf befindet, das auf Regelung hindeutet, dürfte es der Leistungsteil sein. Vorne im Gehäuse findet sich neben der Leiterkarte mit den Tastern vom Frontpanel auch die Platine mit dem Display. Die 3 schwarzen Vielbeiner darauf lassen erahnen: hier wird höchstwahrscheinlich geregelt.<br />
<br />
Heizung abdrehen könnte man nun sowohl auf der Leistungs- als auch der mutmaßlichen Reglerplatine. Man könnte natürlich auch direkt in die Leitung zum Heizelement eingreifen - aber warum sich die Finger an 230 V verbrennen, wenn man es auch einfacher und sicher haben kann?<br />
<br />
Ein genauerer Blick auf die Display-Platine kann also nicht schaden:<br />
<br />
<gallery><br />
Datei:ZD-939L Regler.JPG|Die Reglerplatine<br />
</gallery><br />
<br />
Der 8-beinige Chip links ist ein LM358, also ein Operationsverstärker. Beim mittleren Chip im TQFP-Gehäuse handelt es sich um einen Silabs C8051F310 - einem Mikrocontroller. Rechts im Bild befindet sich ein Holtek HT1621B. Holtek kennt man auch als Mikrocontroller-Hersteller - aber zwei Mikrocontroller für einen einfachen Regler? Nicht ganz. Der Holtek ist lediglich ein LCD-Controller, was auch die Leiterbahnen zu ihm erklärt. Die Regelung übernimmt alleinig der Silabs-Chip.<br />
<br />
Interessanter als die Regelung und das Display ist für den Umbau, über welche Anschlüsse die Heizung angesteuert wird. Drei der vier Stiftleisten sind mit der Platine hinten verbunden. Die 4-polige Stiftleiste links im Bild führt zur Taster-Platine und fällt damit schon mal weg.<br />
<br />
Die untere zweipolige Stifleiste ist ein Kandidat - nachdem sie aber verdächtig nahe am LM358, ein paar diskreten Bauteilen und einem Poti liegt, dürfte es sich um den Anschluss für den Temperaturfühler sein. Alle Leitungen außer dieser verbunden bestätigt den Verdacht: Keine Temperaturanzeige.<br />
<br />
Bleiben nur noch zwei. Die links obere sieht verdächtig nach Stromversorgung aus: etwas dickere Leiterbahnen, Dioden und Kondensatoren. Nicht zuletzt ein 78L05. Warum aber 3 Pins? Eingangsspannung, Masse und Ausgangsspannung? Nein, vermutlich handelt es sich um eine symmetrische Versorgung - entweder fürs Display oder den Operationsverstärker.<br />
<br />
Ein Blick in den hinteren Teil der Lötstation bestätigt es: Ein Trafo mit Mittelabzapfung.<br />
<br />
Die Heizung muss also von der Stiftleiste rechts oben angesteuert werden. Am Stecker hängen zwei Drähte, was die Sache leichter macht. Masse lässt sich durchpiepsen und damit ist auch der Ausgang gefunden.<br />
<br />
Muss nur noch geklärt werden, wann welche Spannung anliegt und ob man einfach so einen Schalter einbringen kann. Multimeter angehängt und den Aparillo losbrummen lassen: 5V, wenn die Heizung an ist. Um sicherzustellen, dass die 5V berührungssicher sind, schnell gegen das Gehäuse, das mit PE verbunden ist: 0V, also galvanisch getrennt.<br />
<br />
Ausgezeichnet!<br />
<br />
=Umbau=<br />
<br />
Ein Ort für den zusätzlichen Schalter ist schnell gefunden: Neben dem Hauptschalter ist noch Platz. Der Akkuschrauber leiert ein Loch in die Platte und der Schalter ist drin.<br />
<br />
Für die elektrische Verbindung habe ich die Leitung zum "Backpanel" aufgetrennt und den Schalter einfach eingefügt. Da ich die Schaltung dahinter nicht genauer ansehen wollte, habe ich mich für die sicherere Ansteuerung entschlossen - theoretisch könnte man einfach eine der Leitungen auftrennen und den Schalter einfügen. Allerdings bekommt dann die Schaltung "hinten" entweder das Signal vom Mikrocontroller oder floatet durch die Gegend. Da das nicht besonders toll ist, wechselt der Schalter zwischen dem ursprünglichen Pfad und Masse. So gibt es immer einen definierten Pegel und Probleme werden bestmöglich ausgeschlossen.<br />
<br />
<gallery><br />
Datei:ZD-939L Elektronik vorne.JPG|Umgebaute Elektronik<br />
</gallery><br />
<br />
Der erste Test im noch auseinander gebauten Zustand spricht für Erfolg: die Soll-Temperatur ist bei 160 °C, die Ist-Temperatur bleibt bei 25 °C. Nach Kippen des Schalters klettert die Anzeige wie vorher nach oben.<br />
<br />
<gallery><br />
Datei:ZD-939L Front umgebaut.JPG|Funktionstest mit ausgeschalteter Heizung<br />
</gallery><br />
<br />
=J-EXT=<br />
Auf dem Board befinden sich noch zwei Vorhalte für Stiftleisten. Eine unbeschriftete (vermutlich zum Download der Firmware) und eine namens J-EXT.<br />
<br />
Rein aus Neugierde habe ich mir letztere etwas genauer angesehen, vielleicht spricht das Board ja mit einem.<br />
<br />
Die Leiterbahnen führen schon einmal alle zum Mikrocontroller, zusammen mit dessen Datenblatt lassen sich die Pins zuordnen. P3.x haben leider keine spezielle Peripherie zugeordnet, also eher unwahrscheinlich, dass da UART rauskommt. Möglich ist aber alles.<br />
<br />
Also Spannung mit dem Scope nachgemessen und nach positivem Befund den Logic-Analyzer angeschlossen:<br />
<br />
[[Datei:ZD-939L_Logic-Analyzer.png]]<br />
<br />
Aus den Daten lässt sich folgende Zuordnung ableiten:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Pin J-EXT !! Pin µC !! Pin-Name !! Funktion<br />
|-<br />
| 1 || - || - || +5V<br />
|-<br />
| 2 || 7 || P3.1 || ?<br />
|-<br />
| 3 || 9 || P3.3 || Clock<br />
|-<br />
| 4 || 10 || P3.4 || Data<br />
|-<br />
| 5 || - || - || GND<br />
|}<br />
<br />
Ein "Datenpaket" dauert etwa 2,6 ms und wird alle 20 ms gesendet. Allem Anschein nach werden die Daten in 16-Bit-Gruppen geschickt, zumindest bleibt der Clock nach 16 Bits immer ein bisschen länger High.<br />
Die Daten habe ich nicht genauer untersucht, da für mich der Reiz einfach nicht da ist. Wer es versuchen will, kann sein Glück mit meiner Aufzeichnung versuchen:<br />
<br />
[[Datei:ZD-939L J-EXT.zip]]<br />
<br />
Die Daten wurden mit Saleae Logic 1.1.18 Beta erstellt. Wenn ich mich richtig erinnere, war die Temperatur auf 160 °C Soll eingestellt und eine Ist-Temperatur von 25 °C (weniger macht das Teil anscheinend nicht) angezeigt.<br />
<br />
=Siehe auch=<br />
* [http://hobbyelektronik.org/b/2014/05/eine-kleine-anmerkung-zu-chinesischen-namen/ Eine kleine Anmerkung zu chinesischen Namen]<br />
<br />
[[Kategorie:Sonstiges]]<br />
[[Kategorie:Elektronik]]</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=K%C3%BChlung_f%C3%BCr_Zhongdi_ZD-939L&diff=905Kühlung für Zhongdi ZD-939L2014-06-24T19:05:30Z<p>Qsysopr: verschob „Kühlung für Zhongdi ZD-393L“ nach „Kühlung für Zhongdi ZD-933L“: Zahlendreher</p>
<hr />
<div>Vor geraumer Zeit hab ich mir eine Zhondi ZD-393L auf den Basteltisch gestellt. Diese Heißluftlötstation ist gerade beim Entlöten von SMD-Bauteilen ein sehr nützlicher Helfer.<br />
<br />
[[Datei:ZD-939L Hinweis.JPG|thumb|Aufkleber als Workaround]]<br />
<br />
Eines hat mich allerdings vom ersten Tag weg gestört: sie hat keinen Nachlauf zum Kühlen des Heizelements. Als "Workaround" hat der Importeur lediglich einen Hinweis angebracht, dass man vor dem Abschalten auf die Mindesttemperatur herunterdrehen und eine Minute warten solle. Mit dem Warten kann ich leben, allerdings ist das Einstellen der Temperatur etwas nervig: Minus-Taster drücken und halten und sich für jedes Grad einen Pieps anhören. Nur um beim Nächsten Einschalten genau das Gegenteil zu machen. selbstverständlich ebenfalls mit akustischer Untermalung.<br />
<br />
Dabei gibt es die Heißluft-Station (neben der Version mit Nachlauf) auch mit dienen Schalter fürs Heizelement. Warum hat das meine nicht? Es wird höchste Zeit, dass sich das ändert.<br />
<br />
=Analyse=<br />
[[Datei:ZD-939L_Innenleben.jpg|thumb|Blick auf die hintere Leiterkarte]]<br />
Auf das Ding und reingeschaut. Die Elektronik ist auf 3 Leiterkarten verteilt - hinten befindet sich ein teilbestücktes Board auf das die Netzleitung führt. Nachdem sich nichts darauf befindet, das auf Regelung hindeutet, dürfte es der Leistungsteil sein. Vorne im Gehäuse findet sich neben der Leiterkarte mit den Tastern vom Frontpanel auch die Platine mit dem Display. Die 3 schwarzen Vielbeiner darauf lassen erahnen: hier wird höchstwahrscheinlich geregelt.<br />
<br />
Heizung abdrehen könnte man nun sowohl auf der Leistungs- als auch der mutmaßlichen Reglerplatine. Man könnte natürlich auch direkt in die Leitung zum Heizelement eingreifen - aber warum sich die Finger an 230 V verbrennen, wenn man es auch einfacher und sicher haben kann?<br />
<br />
Ein genauerer Blick auf die Display-Platine kann also nicht schaden:<br />
<br />
<gallery><br />
Datei:ZD-939L Regler.JPG|Die Reglerplatine<br />
</gallery><br />
<br />
Der 8-beinige Chip links ist ein LM358, also ein Operationsverstärker. Beim mittleren Chip im TQFP-Gehäuse handelt es sich um einen Silabs C8051F310 - einem Mikrocontroller. Rechts im Bild befindet sich ein Holtek HT1621B. Holtek kennt man auch als Mikrocontroller-Hersteller - aber zwei Mikrocontroller für einen einfachen Regler? Nicht ganz. Der Holtek ist lediglich ein LCD-Controller, was auch die Leiterbahnen zu ihm erklärt. Die Regelung übernimmt alleinig der Silabs-Chip.<br />
<br />
Interessanter als die Regelung und das Display ist für den Umbau, über welche Anschlüsse die Heizung angesteuert wird. Drei der vier Stiftleisten sind mit der Platine hinten verbunden. Die 4-polige Stiftleiste links im Bild führt zur Taster-Platine und fällt damit schon mal weg.<br />
<br />
Die untere zweipolige Stifleiste ist ein Kandidat - nachdem sie aber verdächtig nahe am LM358, ein paar diskreten Bauteilen und einem Poti liegt, dürfte es sich um den Anschluss für den Temperaturfühler sein. Alle Leitungen außer dieser verbunden bestätigt den Verdacht: Keine Temperaturanzeige.<br />
<br />
Bleiben nur noch zwei. Die links obere sieht verdächtig nach Stromversorgung aus: etwas dickere Leiterbahnen, Dioden und Kondensatoren. Nicht zuletzt ein 78L05. Warum aber 3 Pins? Eingangsspannung, Masse und Ausgangsspannung? Nein, vermutlich handelt es sich um eine symmetrische Versorgung - entweder fürs Display oder den Operationsverstärker.<br />
<br />
Ein Blick in den hinteren Teil der Lötstation bestätigt es: Ein Trafo mit Mittelabzapfung.<br />
<br />
Die Heizung muss also von der Stiftleiste rechts oben angesteuert werden. Am Stecker hängen zwei Drähte, was die Sache leichter macht. Masse lässt sich durchpiepsen und damit ist auch der Ausgang gefunden.<br />
<br />
Muss nur noch geklärt werden, wann welche Spannung anliegt und ob man einfach so einen Schalter einbringen kann. Multimeter angehängt und den Aparillo losbrummen lassen: 5V, wenn die Heizung an ist. Um sicherzustellen, dass die 5V berührungssicher sind, schnell gegen das Gehäuse, das mit PE verbunden ist: 0V, also galvanisch getrennt.<br />
<br />
Ausgezeichnet!<br />
<br />
=Umbau=<br />
<br />
Ein Ort für den zusätzlichen Schalter ist schnell gefunden: Neben dem Hauptschalter ist noch Platz. Der Akkuschrauber leiert ein Loch in die Platte und der Schalter ist drin.<br />
<br />
Für die elektrische Verbindung habe ich die Leitung zum "Backpanel" aufgetrennt und den Schalter einfach eingefügt. Da ich die Schaltung dahinter nicht genauer ansehen wollte, habe ich mich für die sicherere Ansteuerung entschlossen - theoretisch könnte man einfach eine der Leitungen auftrennen und den Schalter einfügen. Allerdings bekommt dann die Schaltung "hinten" entweder das Signal vom Mikrocontroller oder floatet durch die Gegend. Da das nicht besonders toll ist, wechselt der Schalter zwischen dem ursprünglichen Pfad und Masse. So gibt es immer einen definierten Pegel und Probleme werden bestmöglich ausgeschlossen.<br />
<br />
<gallery><br />
Datei:ZD-939L Elektronik vorne.JPG|Umgebaute Elektronik<br />
</gallery><br />
<br />
Der erste Test im noch auseinander gebauten Zustand spricht für Erfolg: die Soll-Temperatur ist bei 160 °C, die Ist-Temperatur bleibt bei 25 °C. Nach Kippen des Schalters klettert die Anzeige wie vorher nach oben.<br />
<br />
<gallery><br />
Datei:ZD-939L Front umgebaut.JPG|Funktionstest mit ausgeschalteter Heizung<br />
</gallery><br />
<br />
=J-EXT=<br />
Auf dem Board befinden sich noch zwei Vorhalte für Stiftleisten. Eine unbeschriftete (vermutlich zum Download der Firmware) und eine namens J-EXT.<br />
<br />
Rein aus Neugierde habe ich mir letztere etwas genauer angesehen, vielleicht spricht das Board ja mit einem.<br />
<br />
Die Leiterbahnen führen schon einmal alle zum Mikrocontroller, zusammen mit dessen Datenblatt lassen sich die Pins zuordnen. P3.x haben leider keine spezielle Peripherie zugeordnet, also eher unwahrscheinlich, dass da UART rauskommt. Möglich ist aber alles.<br />
<br />
Also Spannung mit dem Scope nachgemessen und nach positivem Befund den Logic-Analyzer angeschlossen:<br />
<br />
[[Datei:ZD-939L_Logic-Analyzer.png]]<br />
<br />
Aus den Daten lässt sich folgende Zuordnung ableiten:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Pin J-EXT !! Pin µC !! Pin-Name !! Funktion<br />
|-<br />
| 1 || - || - || +5V<br />
|-<br />
| 2 || 7 || P3.1 || ?<br />
|-<br />
| 3 || 9 || P3.3 || Clock<br />
|-<br />
| 4 || 10 || P3.4 || Data<br />
|-<br />
| 5 || - || - || GND<br />
|}<br />
<br />
Ein "Datenpaket" dauert etwa 2,6 ms und wird alle 20 ms gesendet. Allem Anschein nach werden die Daten in 16-Bit-Gruppen geschickt, zumindest bleibt der Clock nach 16 Bits immer ein bisschen länger High.<br />
Die Daten habe ich nicht genauer untersucht, da für mich der Reiz einfach nicht da ist. Wer es versuchen will, kann sein Glück mit meiner Aufzeichnung versuchen:<br />
<br />
[[Datei:ZD-939L J-EXT.zip]]<br />
<br />
Die Daten wurden mit Saleae Logic 1.1.18 Beta erstellt. Wenn ich mich richtig erinnere, war die Temperatur auf 160 °C Soll eingestellt und eine Ist-Temperatur von 25 °C (weniger macht das Teil anscheinend nicht) angezeigt.<br />
<br />
=Siehe auch=<br />
* [http://hobbyelektronik.org/b/2014/05/eine-kleine-anmerkung-zu-chinesischen-namen/ Eine kleine Anmerkung zu chinesischen Namen]<br />
<br />
[[Kategorie:Sonstiges]]<br />
[[Kategorie:Elektronik]]</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=K%C3%BChlung_f%C3%BCr_Zhongdi_ZD-393L&diff=906Kühlung für Zhongdi ZD-393L2014-06-24T19:05:30Z<p>Qsysopr: verschob „Kühlung für Zhongdi ZD-393L“ nach „Kühlung für Zhongdi ZD-933L“: Zahlendreher</p>
<hr />
<div>#WEITERLEITUNG [[Kühlung für Zhongdi ZD-933L]]</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=MediaWiki:Geshi.css&diff=903MediaWiki:Geshi.css2014-06-09T11:51:39Z<p>Qsysopr: </p>
<hr />
<div>/* CSS in dieser MediaWiki-Systemnachricht wird auf die GeSHi-Syntaxhervorhebung angewendet */<br />
<br />
div.mw-geshi div,pre {<br />
font-family: Consolas, monospace !important;<br />
font-size:10pt;<br />
background-color: #F9F9F9;<br />
border: 1px dashed #2F6FAB;<br />
padding: 1em;<br />
}</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=MediaWiki:Geshi.css&diff=902MediaWiki:Geshi.css2014-06-09T11:51:11Z<p>Qsysopr: </p>
<hr />
<div>/* CSS in dieser MediaWiki-Systemnachricht wird auf die GeSHi-Syntaxhervorhebung angewendet */<br />
<br />
div.mw-geshi div,pre {<br />
font-family: Consolas, monospace !important;<br />
font-size:10pt;<br />
background-color: #F9F9F9;<br />
border: 1px dashed #2F6FAB;<br />
}</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=MediaWiki:Geshi.css&diff=901MediaWiki:Geshi.css2014-06-09T11:50:08Z<p>Qsysopr: </p>
<hr />
<div>/* CSS in dieser MediaWiki-Systemnachricht wird auf die GeSHi-Syntaxhervorhebung angewendet */<br />
<br />
div.mw-geshi div,pre {<br />
font-family: Consolas, monospace !important;<br />
font-size:10pt;<br />
}</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=MediaWiki:Geshi.css&diff=900MediaWiki:Geshi.css2014-06-09T11:49:49Z<p>Qsysopr: </p>
<hr />
<div>/* CSS in dieser MediaWiki-Systemnachricht wird auf die GeSHi-Syntaxhervorhebung angewendet */<br />
<br />
div.mw-geshi div,pre {<br />
font-family: Consolas, monospace !important;<br />
font-size:12pt;<br />
}</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=MediaWiki:Geshi.css&diff=899MediaWiki:Geshi.css2014-06-09T11:49:06Z<p>Qsysopr: </p>
<hr />
<div>/* CSS in dieser MediaWiki-Systemnachricht wird auf die GeSHi-Syntaxhervorhebung angewendet */<br />
<br />
div.mw-geshi div,pre {<br />
font-family: Consolas, monospace !important;<br />
font-size:10pt;<br />
}</div>Qsysoprhttps://hobbyelektronik.org/w/index.php?title=MediaWiki:Geshi.css&diff=898MediaWiki:Geshi.css2014-06-09T11:46:58Z<p>Qsysopr: </p>
<hr />
<div>/* CSS in dieser MediaWiki-Systemnachricht wird auf die GeSHi-Syntaxhervorhebung angewendet */<br />
<br />
.mw-geshi {<br />
font-size: 1.2 em !important;<br />
}</div>Qsysopr