Ultrasonic Level Meter Display Page in English
Ultrasonic Level Meter Display Page in English

Anzeige

Display

Die Anzeigeeinheit ver­wen­det einen AT­mega­128 mit, wie auch der Sensor, ebenfalls 3,6864 MHz. Die­ser wurde gewählt weil er zwei se­ri­el­le Schnitt­stel­len hat, ei­ne zur Mess­ein­heit und eine zu einem PC (RS232) oder zu einem even­tuel­len Home-Bus (RS485). Ab Re­vi­si­on 2.0 ist auch ein Blue­tooth-Mo­dul vor­ge­se­hen. Als Baud­ra­te wur­de 9600 Baud ge­wählt. Die­se ist zwei­fel­los aus­rei­chend für die Mes­sung des Was­ser­stan­des ein­mal pro Mi­nu­te aber auch für wei­tere denk­bare Auf­gaben, etwa der Ab­fra­ge von Strom- oder Was­ser­zählern oder dem Schal­ten von be­lie­bi­gen Ver­brau­chern, aber dies ist eine an­de­re Ge­schich­te...

Das Bluetooth-Modul nutzt ab Werk eben­falls 9600 Baud. Wenn Sie über Blue­tooth eine an­de­re Baud­ra­te ver­wenden wol­len reicht es nicht, die­se am PC und im Dis­play einzu­stel­len. Sie müs­sen dann auch das Blue­tooth-Mo­dul ent­spre­chend pro­gram­mie­ren! Ich ha­be das bis jetzt nicht ge­tan und kann Sie nur auf das Da­ten­blatt des ARF32 ver­wei­sen!

Die An­zei­ge fragt also ein­mal pro Mi­nu­te den Was­ser­stand der Zis­ter­ne ab, er­rech­net da­raus die ent­hal­te­ne Was­ser­men­ge und zeigt sie an. Ne­ben­bei er­rech­net sie auch die Dif­fe­renz zum Vor­tag und zur ver­gan­ge­nen Stun­de. Die Uhr­zeit, die da­bei an­ge­zeigt wird, be­zieht sich auf den letz­ten Ein­schalt­zeit­punkt, sie kann je­doch über die se­ri­el­le Schnitt­stel­le (oder über Blue­tooth oder dem Home­bus) auf die tat­säch­li­che Ta­ges­zeit ein­ge­stellt wer­den. Al­ter­na­tiv kann ein DCF77-Emp­fän­ger an­ge­schlos­sen wer­den.

Zur Er­mitt­lung des Was­ser­standes wer­den 10 Mess­werte des Sen­sors ge­mit­telt. Da­nach wird die Ver­sor­gungs­span­nung des Sen­sors ab­ge­schal­tet. Dies spart nicht nur Strom, es ver­rin­gert auch die Eigen­erwär­mung was wie­de­rum der Ge­nau­ig­keit der Tem­pe­ra­tur­mes­sung zu­gu­te kommt. Außer­dem wird der Sen­sor so zu­rück­ge­setzt falls er sich ein­mal "auf­hän­gen" soll­te.

Die Praxis hat ge­zeigt, dass die Ent­fernungs­messung sehr ge­nau und wie­der­hol­bar ar­bei­tet. Tats­äch­lich kann man bei lau­fenden Mes­sun­gen wäh­rend der Was­ser­entnahme die Liter di­rekt mit­ver­fol­gen. Wäh­rend es reg­net ist die Was­ser­ober­flä­che je­doch ziem­lich in Be­we­gung und auch Sprit­zer kön­nen Fehl­mes­sun­gen ver­ur­sa­chen so­fern man nicht über ei­nen be­ruhig­ten Zu­lauf ver­fügt, des­halb die Mit­telung.

Die An­zeige­ein­heit ist für al­ways on ge­dacht und ent­hält des­halb auch ei­ni­ge Maß­nah­men zur Ener­gie­einsparung. Der Strom­ver­brauch liegt laut ei­nes Energi­emess­geräts von Con­rad Electronic bei 0.0 W (al­so unter­halb der Mess­auf­lö­sung von ca. 2 W).

Als Gehäuse habe ich mich für ein Heidenreich ZA16 ent­schie­den, das zu­fäl­lig greif­bar war. Es eig­net sich zur Wand­mon­ta­ge, ist ein­fach zer­leg­bar und die Front passt per­fekt für das ge­wähl­te Dis­play. Es ist nicht ge­ra­de stylish aber ne­ben den an­de­ren Ge­rä­ten im Hei­zungs­raum macht es sich doch ganz gut...

Anschluss der Mess­ein­heit

Für den An­schluss der Mess­einheit wur­de ein Stan­dard-Netzwerk­ka­bel vor­ge­se­hen. Es ist bil­lig, leicht er­hält­lich und für die Da­ten­übertragung von ho­her Qua­li­tät. Auf­grund der ge­rin­gen Baud­ra­te soll­ten auch ver­drill­te Zwei­draht­lei­tun­gen (Klin­gel­dräh­te) funk­tio­nie­ren. Von pa­ral­lel­lau­fen­den Steu­er­ka­beln soll­te man aber bes­ser ab­se­hen (Wenn sie nun schon mal drin sind, nun ja, pro­bie­ren Sie es. Wenn sie 80 cm unter der Er­de lie­gen soll­te es wohl auch we­nig EMV-Pro­ble­me ge­ben). Der Schirm (so­fern vor­han­den) soll­te ein­sei­tig (an der An­zei­ge­ein­heit, die­se stellt ja die Ver­sorgung) an Masse ge­legt und an der an­de­ren Sei­te iso­liert wer­den. Be­nö­tigt wird nur ein Ader­paar für die Da­ten­lei­tung und ei­nes für die Ver­sor­gung. Bei Ver­wen­dung eines Netz­werk­ka­bels kann es nicht scha­den, die un­be­nutz­ten Paare für die Ver­sor­gungs­span­nung pa­ral­lel zu schal­ten (je­weils eine Lei­tung des Paares an +, die an­de­re an GND).

Die An­zei­ge schal­tet die 15 V (Unreg) über eine ein­fa­che Kon­stant­strom­quel­le be­ste­hend aus T1, D1 und R3 an. Da­mit wird ein Span­nungs­ein­bruch in der An­zei­ge­ein­heit und/oder Über­las­tung von T1 ver­hin­dert. Die Kon­stant­stromquelle 'kos­tet' im Ver­gleich zu ei­nem simp­len Schalt­tran­sis­tor ge­ra­de ein­mal zwei Di­oden (als SMD in ei­nem Ge­häu­se er­hält­lich und wirk­lich bil­lig) und ei­nen Wi­der­stand.
Die Strom­quel­le ist den­noch nicht kurz­schluss­fest. Wenn die Sen­sor­ver­sor­gung kurzge­schlos­sen ist lie­fert T1 et­wa 40 mA aus der Ver­sor­gung was ei­ner Ver­lust­leis­tung von ca. 0.6 W ent­spricht. Dies wür­de eine Über­hitzung und den Aus­fall von T1 in­ner­halb we­niger Se­kun­den be­wir­ken.
Der 15 Ω-Wi­der­stand R112 in der Sen­sor­einheit dämpft Schwin­gun­gen, die über die Lei­tungs­in­duk­ti­vi­tät und den Ein­gangs­kondensator ent­stehen könn­ten. Lan­ge Zulei­tun­gen und hoch­wer­ti­ge ke­ra­mi­sche Kon­den­sa­to­ren an ei­ner nie­der­ohmigen Ver­sor­gung bil­den Schwing­kreise von er­staun­li­cher Güte, die durch­aus stö­ren­de, wenn nicht so­gar zer­stö­ren­de Span­nun­gen pro­du­zie­ren kön­nen wenn sie plötz­lich ge­schal­tet wer­den. Wenn Sie da­mit he­rum­spie­len möch­ten, hier eine ein­fa­che Si­mu­la­tion der Strom­quel­le für LTSpice.

Terminierung

Laut Lehr­buch müs­sen die Lei­tun­gen ei­ner RS485-Schnitt­stel­le an bei­den En­den mit je­weils 120 Ω ter­mi­niert wer­den um Re­flex­io­nen zu mi­ni­mie­ren. Dies ist si­cher­lich kein Feh­ler was die Si­gnal­in­te­gri­tät be­trifft aber es er­höht die Strom­auf­nah­me be­träch­tlich.

Die 120 Ω sind lei­der auch kei­ne Na­tur­kon­stan­te son­dern der Wel­len­wi­der­stand der ty­pi­scher­wei­se ver­wen­de­ten Lei­tung. Wenn Sie an­dere Lei­tun­gen ver­wen­den müs­sen sie den Ter­mi­nie­rungs­wi­der­stand an­pas­sen um op­ti­ma­le Er­geb­nis­se zu er­zie­len.

Was ist Wellenwiderstand?

Einstein sagt, es gibt nichts schnel­le­res als das Licht. Wenn nun die Strom­quel­le am Dis­play ein­schal­tet, wo­her weiß sie was am En­de der Lei­tung für ei­ne Last an­liegt? Ob­wohl die Lei­tung viel­leicht nur 10 m lang ist (Licht braucht da­für im Va­kuum etwa 30 ns). Nun, sie weiß es nicht. Zu­nächst fließt der Strom der dem Wel­len­wi­der­stand der Lei­tung ent­spricht. Am En­de ange­kom­men wird geht ein Teil des Stro­mes in die an­lie­gen­de Last, der Rest wird re­flek­tiert und kommt 30 ns spä­ter wie­der an der Strom­quel­le an. Dort äus­sert er sich als ne­ga­ti­ve (oder auch po­si­ti­ve, je nach Last) Span­nung, die in Rei­he mit der Ver­sorgung nun ei­nen hö­he­ren (oder nied­ri­ge­ren) Strom in die Lei­tung treibt. So über­la­gert er sich mit dem Strom der bis­her ge­flos­sen ist und der Strom pe­gelt sich letzt­lich auf den tat­säch­lich be­nö­tig­ten Wert ein. Da­bei kön­nen an der Last Über­schwin­ger ein­tre­ten die im Ex­trem­fall das dop­pelte der an­lie­gen­den Span­nung aus­m­achen.

Eine Ter­mi­nie­rung ist nö­tig, wenn die An­stiegs­zei­ten des Sig­nals in die Nä­he der Lauf­zeit auf der Lei­tung kom­men. Wir ver­wen­den Slew Rate limited Trei­ber, also Trei­ber mit be­wusst ver­rin­ger­ter An­stiegs­zeit, was Re­fle­xio­nen re­du­ziert. Zu­dem re­a­giert der Emp­fän­ger nicht auf Flan­ken son­dern tas­tet das Sig­nal je­weils in der Mit­te ei­nes Bits (al­so nach et­wa 50 µs) ab. Bis da­hin sind Re­fle­xi­onen längst ab­ge­klun­gen. Des­halb ha­be ich auf die Ter­mi­nie­rung der Sen­sor­lei­tung ver­zich­tet. Bei mir funk­tio­niert dies mit et­wa 10 m Sen­sor­kabel ab­so­lut pro­blem­los. Auch auf dem Os­zil­los­kop ist nichts von Re­flex­i­onen zu se­hen.

Tat­säch­lich wä­ren et­wa­ige Re­flex­ionen in 50 µs etwa 500 mal durch die Lei­tung ge­lau­fen. Bis da­hin sind sie al­lein durch den ohm­schen Wi­der­stand der Lei­tung völ­lig auf­ge­zehrt, sie sind ein­fach weg.

Bei hö­he­ren Baud­ra­ten wä­re die ma­xi­ma­le Ka­bel­län­ge ohne Ter­mi­nie­rung kür­zer. Die Re­flex­io­nen müs­sen bis zur Ab­tast­ung un­ter die Schalt­schwel­le des Emp­fän­gers abge­klun­gen sein um den kor­rek­ten Si­gnal­pe­gel si­cher zu er­ken­nen.

Ich emp­feh­le, die Lei­tun­gen nicht zu ter­mi­nie­ren. Es ist schlicht un­nö­tig weil al­le Re­fle­xi­on­en bis zum Ab­tast­zeit­punkt ab­ge­klun­gen sind.

Wenn Sie es trotz­dem tun wollen, müs­sen Sie den Kon­stant­strom er­höh­en, also R3 ver­rin­gern und kon­se­quen­ter­wei­se auch R8 um den nö­ti­gen Ba­sis­strom zu trei­ben, weil sonst die Ver­sor­gungs­span­nung am Sen­sor wäh­rend des Sen­dens ein­bre­chen wür­de.

Meine Wahl für diesen Fall: R3=6,8 Ω, R8=4,7 kΩ aber dies ist nur eine Pro­gnose, ich habe nicht ter­mi­niert und habe das auch nicht ge­tes­tet.

Damit er­hö­hen Sie zwangs­läufig die Be­las­tung der Dis­play-Ver­sor­gung und da­mit de­ren Ripple wäh­rend des Da­ten­trans­fers. Das sind Kom­pli­ka­tio­nen die Sie ver­mei­den kön­nen.

Wenn Ihr Sen­sor­ka­bel al­ler­dings sehr lang ist (ei­nige zig oder hun­der­te von Me­tern) soll­ten Sie mit dem Os­zil­los­kop noch­mal nach­mes­sen bevor Sie den Sen­sor ver­gießen.

Schnittstellen

Die Anzeige­einheit verfügt über zwei USARTs. USART0 wird ver­wendet zur Kommunikation mit der Mess­einheit über einen RS485 physical Layer, USART1 kann als Bestückungs­variante oder auch durch Jumpern entweder über Bluetooth, RS232 oder RS485 mit einem Host-PC kom­munizieren. Die Sende­richtung geht dabei immer über alle Schnitt­stellen, nur der Empfang wird umgejumpert.

Das zugehörige Jumper­feld ist riesig (zumal laut Daten­blatt das Bluetooth-Modul auch noch RTS und CTS benötigt) und ich bin damit nicht richtig glücklich aber es ist die bil­ligste Variante, wir haben genug Platz dafür und es muss normaler­weise nur ein einziges Mal gesteckt werden.

Die Unterstützung für RTS/CTS-Handshake kann per Define in den Sourcen erfolgen oder per Konfiguration. In meinen Sourcen ist das Hand­shake aktiviert, sie können es jedoch durch ein Kommando deaktivieren.
Dies ist nötig, wenn an der Host-Schnittstelle kein dauerhaft betriebenes Gerät angeschlossen ist, da sonst kein Senden möglich ist und das Display blockiert wird sobald der Sendepuffer voll ist.

Der USART unterstützt über Interrupt-Flags das für RS485 als Halbduplex-Medium nötige Ein- und Aus­schalten des Sende­treibers, was der Software­seite sehr ent­gegen kommt.

Kommunikation mit dem Host

Die Anzeigeeinheit kommuniziert mit 9600 Baud, 8N1 mit dem Host (PC oder Laptop). Da im Zusammenhang mit PCs das 9. Bit eher proble­matisch ist wurde hier auf die Verwendung desselben verzichtet und die gesamte Kommunikation erfolgt in les­baren ASCII-Zeichen. Die Schnitt­stelle ist immer aktiv. Auf ein Select Device, wie es im Bus mit mehreren Geräten nötig wäre, wurde vorerst verzichtet.

Das vorgesehene Bluetooth-Modul hat per Default die gleichen Vorgaben so dass es ohne besondere Pro­gram­mierung einfach ver­wendet werden kann.

Die Sende- und Empfangs­routine ist interrupt­gesteuert. Senden erfolgt klassisch über einen FIFO im SRAM. Beim Emp­fang werden die Daten gesammelt bis ein <LF> eintrifft. Dann wird die gesamte Zeile auf einmal aus­gewertet. CRs werden igno­riert. Ein Kom­mando beginnt immer mit einem Kommando­wort gefolgt von even­tuellen Para­metern, jeweils durch Leer­zeichen getrennt.

Und wenn kein <LF> kommt? Jeder drückt doch <Return> nach einem Kommando!

NEIN! Das ist der klassische Buffer Overflow Attack! Zeichen kommen auch noch wenn sie nicht mehr erwartet werden wenn der Host nicht gutartig ist oder es auch nur EMV-Probleme gibt. Und sie werden dann in einem Speicherbereich gespeichert, der eigentlich gar nicht dafür vorgesehen war. Die Folgen können vermurkste Variablen und damit falsche Anzeigen, ein schlichter Absturz oder auch die Ausführung von unbeabsichtigtem oder fremdem Code sein!
Ich habe mich hier für einen Buffer Wrap entschieden, d.h. Zeichen, die nicht mehr in den Puffer passen überschreiben ihn von vorne wieder. Man könnte auch Zeichen ignorieren sobald der Puffer voll ist, das ist Geschmacksache. Hauptsache, nicht über den Puffer hinaus schreiben!

Ein solcher Angriff kann in beide Richtungen gehen: Er sendet mehr Zeichen als Sie erwarten oder er provoziert mehr Antworten als Ihr Sendepuffer verkraften kann. Seien Sie auf beides vorbereitet!

Glücklicherweise gestatten es die unter­schied­lichen Formate von Host-Kommandos und Telegrammen des Bluetooth-Moduls diese zu unter­scheiden. So kann die Empfangs­routine separate Flags für jedes dieser Ereig­nisse setzen.
Ein Bluetooth-Tele­gramm zu erkennen ist den­noch nicht trivial, da das Ende-Kennbyte (ETX, 0x03) auch innerhalb der Daten vor­kom­men kann. Wir müssen deshalb das Telegramm parsen. Normalerweise kommen nur wenige Blue­tooth-Telegramme vor da wir den trans­parenten Modus be­nutzen. Das erste ist das LMX9830_READY, welches das Bluetooth-Modul beim Power-Up oder nach einem Reset sendet. Darauf folgt ein SPP_INCOMING_LINK_ESTABLISHED und, falls die Ver­bin­dung ab­bricht, möglicher­weise ab­wech­selnd ein SPP_LINK_RELEASED. Durch diese Tele­gramme können wir er­kennen ob über­haupt ein Bluetooth-Modul vorhanden ist und ob ak­tuell eine Ver­bin­dung mit dem Host besteht.

RTC

Timer0 erzeugt einhundert mal pro Se­kunde einen Inter­rupt als univer­seller Timer. Nebenbei wird daraus eine HH:MM:SS-Uhr, die bei 24:00:00 zurück­gesetzt wird (Tage werden nicht gezählt). Dabei setzt sie Flags für jede Sekunde, Minute und Stunde sowie einmal pro Tag, mit deren Hilfe die Haupt­schleife sekündliche, minütliche, stündliche oder täg­liche Ak­tionen durch­führen kann.

Am Ende der Haupt­schleife wird ein Sleep ausgeführt, der einer­seits nichts kostet, den Strom­verbrauch des Controllers anderer­seits aber er­heb­lich senkt da bis zur nächsten 1/100 Sekunde deut­lich weniger ver­braucht wird.

DCF77

Zur Synchronisation mit der offiziellen Normal­zeit kann ein externer DCF77-Empfänger angeschlossen werden. Der korrekte Emp­fang wird durch Mes­sung der Impuls­zeiten und der Über­prüfung des korrekten Telegramm­aufbaus geprüft. Gültige Tele­gramme setzen die RTC sekunden­genau auf den emp­fangenen Wert. Die Pola­rität des Empfangs­signals kann per Kom­mando eingestellt werden.

Ein spezieller Typ ist nicht erforderlich, er muss jedoch mit 5 V Versorgungs­spannung arbeiten können und ein TTL-kompatibles Ausgangs­signal liefern. Falls Sie hart­näckig keinen Empfang bekommen, versuchen Sie, das DCF-Signal zu invertieren (siehe Kommando dcfinv). Ich empfehle den Meinberg RU226, da ich mit diesem gute Er­fahrung gemacht habe.

Ein sehr simpler Algorithmus sorgt für ein 'sanftes' Nach­führen der RTC. Wenn die empfangene Zeit­infor­mation um mehr als 60 s von der RTC abweicht wird die Zeit 'hart' gestellt. Dazu müs­sen zwei aufeinander­folgende Tele­gramme empfangen werden, die bis auf 60 s die gleiche Abweichung zur RTC aufweisen. (Tat­sächlich habe ich auch schon Tele­gramme mit fehler­hafter Zeit empfangen, die trotzdem als Fehler­frei erkannt wurden. Mehrfache Bit­fehler die zu­fällig die kor­rekte Prüf­summe ergeben machen dies möglich.) Dabei können Minuten- oder Stunden­ereignisse verloren­gehen da sie nur vom Timer Inter­rupt aus­gelöst werden.

Bei kleineren Abwei­chungen läuft die RTC 1 % schneller oder lang­samer bis die Abwei­chung weniger als 1 s beträgt, d.h. ein Timer Interrupt wird ausge­lassen oder ein fiktiver zusätzlicher Inter­rupt wird eingefügt.

Auf diese Weise gehen im Gegen­satz zum harten Stellen der Uhrzeit keine Sekunden- oder Minuten­ereignisse verloren.

Sie können das stat-Kommando benutzen um zu sehen ob die DCF-Synchroni­sierung funk­tioniert. Beachten Sie, dass es selbst bei störungs­freiem Empfang bis zu drei Minuten dauern kann bis die Synchron­isierung gelingt. Es müssen mindestens zwei Tele­gramme störungsfrei empfangen werden und die Abwei­chung muss bis auf eine Minute genau überein­stimmen bevor eine harte Verstellung der Systemuhr vor­genom­men wird. Bei einem gestörten Tele­gramm beginnt diese Zeit von vorne...

Auf dem Display erscheint ein Antennen­symbol wenn ein Tele­gramm störungs­frei empfangen wurde. Die System­zeit muss dann jedoch noch nicht stimmen da sie erst beim zweiten Tele­gramm gesetzt wird. Umge­kehrt kann bei korrekter System­zeit das Antennen­symbol erlöschen wenn der Empfang gestört ist. Die Zeit läuft dann quarz­genau weiter.

DCF77-Empfänger

Es rentiert sich nicht, hier in paar Euro zu sparen um einen bil­ligeren Empfänger einzusetzen. Er würde Ihnen mehr Ärger und Zeit kosten als die paar Krö­ten wert sind! Wenn sie es bil­lig haben wol­len, schlach­ten Sie ei­ne chi­ne­si­sche 5€-Funk­uhr aus, wenn Sie sich nicht är­gern wol­len, neh­men Sie einen gu­ten Emp­fänger. Alles da­zwi­schen macht nur Är­ger. Ver­wen­den Sie ei­nen hoch­wer­ti­gen Emp­fän­ger wie den Meinberg RU226 und achten Sie auf die Montage­anlei­tung! Der Emp­fäng­er muss mit der Quer­seite der Fer­rit­antenne mög­lichst ge­nau nach Frank­furt zei­gen (da be­fin­det sich der Sen­der) und darf nicht auf Me­tall oder in der Nä­he metal­li­scher Ober­flä­chen oder Leiter­schlei­fen mon­tiert wer­den. Auch 'Stör­sen­der' wie das Dis­play selbst und ins­be­son­de­re sein Blue­tooth-Mo­dul soll­ten so weit wie mög­lich ent­fernt sein. Der größte Feh­ler wä­re, den Emp­fän­ger in den Klem­men­boden zu mon­tie­ren, nur weil da noch Platz ist. Nur so er­hal­ten Sie stö­rungs­freien Emp­fang!

Die DCF77-Sendefrequenz von 77.5 kHz ist fast genau die 5. Ober­wel­le der Zeilenfrequenz des PAL-Fernsehens von 15.625 kHz. Falls sie (so wie ich) tat­sächlich noch ei­nen 'al­ten' Fern­se­her in der Nä­he be­trei­ben könn­te auch die­ser einen störungs­freien Emp­fang verhindern.

Bei mir im Labor hatte ich über­all Stö­run­gen (viele Com­pu­ter und an­de­re Stör­quellen) bis auf ei­ne klei­ne Stel­le auf mei­nem Schreib­tisch. Wenn Sie Empfangs­pro­ble­me ha­ben, verschieben Sie den Emp­fän­ger um ei­nen hal­ben Me­ter und pro­bieren Sie es erneut. Ir­gend­wann muss es klap­pen...

Signal-Ausgänge

Da noch Klem­men des Ge­häu­ses un­be­nutzt wa­ren, ha­be ich noch zwei po­ten­tial­freie Si­gnal­aus­gän­ge hin­zu­ge­fügt. Es han­delt sich da­bei um die Foto­tran­sis­to­ren ei­nes Opto­kopplers, die für ex­ter­ne Schalt­ak­tio­nen zur Ver­fü­gung ste­hen. Für je­den von die­sen kann ei­ne Schwel­le fest­ge­legt wer­den ober­halb und/oder unter­halb derer der Aus­gang ak­tiv ist.

Die Foto­tran­sis­to­ren ha­ben ei­nen ge­mein­sa­men Emit­ter, sie sind al­so ge­eig­net, zwei Ein­gänge ei­ner ex­ter­nen Schal­tung gegen de­ren Masse zu zie­hen.

Jeder Aus­gang hat zwei Pa­ra­me­ter, Aktiv un­ter­halb und Aktiv ober­halb. Die Werte sind in Litern, der Werte­bereich ist von 0 bis 65535.

Ein Aktiv ober­halb von 65535 wird also nie­mals schal­ten, eben­so we­nig wie ein Aktiv unter­halb von 0 l.
Durch intelli­gente Wahl der­sel­ben sind meh­re­re Kon­fi­gu­ra­tio­nen mö­glich, z.B.

Wenn Sie einen Ausgang nicht be­nutzen wol­len und die Leis­tung des Opto­kopp­lers spa­ren wol­len, setzen die Aktiv unter­halb auf 0 und Aktiv oberhalb auf 65535. Dann ist der Opto­koppler niemals aktiv. Dies ist auch der Default wenn Sie nichts anderes para­me­trie­ren.

Elektrische Sicher­heit der Aus­gänge

Die Ausgänge sind durch Opto­koppler von der Schaltung getrennt, aller­dings nur mit etwa 5 mm Isolations­abstand. Die Schal­tung die sie daran an­schließen darf die Lei­tun­gen des­halb nicht mit der Netz­span­nung ver­bin­den sonst ver­lie­ren Sie den Isolations­ab­stand zum Dis­play und dem Sen­sor! Manche Leute meinen, 3 mm sind genug, na ja, no risk no fun, ich bevorzuge in solchen Fällen allerdings better safe than sorry!

Sie dür­fen damit also z.B. nicht di­rekt einen Thy­ris­tor schal­ten, der mit dem Netz ver­bun­den ist. Sie kön­nen je­doch den Ein­gang einer SPS oder ei­ner an­de­ren, vom Netz ge­trenn­ten Schal­tung (z.B. den Pa­ral­lel­port eines PCs) steu­ern.

Eine Klem­me neben der Netz­ver­sorgung bleibt frei um 8 mm Sicherheits­abstand zum Netz ein­halten zu kön­nen.

Anzeige

Hinweis: Die Low-Cost 2x16-An­zeige wird in Zu­kunft nicht wei­ter unter­stützt und ist in der ak­tu­el­len Firm­ware mö­gli­cher­wei­se ver­nach­läs­sigt. Lesen Sie bit­te trotz­dem die fol­gen­den Zei­len da sie auch für die 4x20-An­zei­ge re­le­vant sind.

Die Anzeige (zwei Zei­len à 16 Zei­chen) ist wie folgt auf­ge­baut:

1234L<PChh:mm:ss
±1234 l/h ±1234*

Die erste Zei­le zeigt da­bei per­ma­nent die Füll­men­ge in Li­tern und die Zeit seit der letz­ten Sys­tem-Mit­ter­nacht. Die Füll­men­ge wird über 10 Mes­sun­gen ge­mit­telt. Wäh­rend die­ser Mes­sun­gen wird das je­wei­li­ge Mess­er­geb­nis an­ge­zeigt, da­nach bis zur nächs­ten Mess­reihe der Mittel­wert. Zur Un­ter­schei­dung wird bei den Ein­zel­mes­sun­gen ein klei­nes l an­ge­zeigt und beim Mit­tel­wert ein großes L.

Die Zei­chen ab Po­si­ti­on 5 (<PC) sind Er­ror-Flags und sol­lten nie er­schei­nen. An Po­sition 5 kann dabei ein "<" er­schei­nen falls weniger als 10 Mess­werte für die Ent­fer­nung emp­fan­gen wur­den (sehr wahr­scheinlich über­haupt keines, was auf eine unter­brochene Sensor­lei­tung oder Sen­sor­defekt hin­weist) oder ein > falls mehr als 10 Werte empfangen wurden. Eigentlich sollte das Display den Sensor nach dem 10. Wert ab­schal­ten. Das > weist auf einen De­fekt im Be­reich der Kon­stant­strom­quel­le um T1 hin, d.h. das Dis­play kann die Sen­sor­ver­sor­gung nicht ab­schal­ten.

Das P bedeutet Parity-Error und das C Check­sum-Error bei der Kom­mu­ni­ka­tion mit dem Sen­sor. Dies kann auf ein zu lan­ges oder un­ge­eig­ne­tes Sen­sor­ka­bel oder ein­ge­kop­pelte Stö­run­gen hin­wei­sen. Es kann auch durch einen zu niedrigen Strom der Konstant­strom­quelle ent­ste­hen so dass die Sen­sor­ver­sor­gung durch den hohen Sen­de­strom (insbes. bei Ter­mi­nie­rung mit je­weils 120 Ω an den Lei­tungs­en­den) ein­bricht und so ein Sen­sor-Re­set aus­ge­löst wird.

Die an­ge­zeig­te Was­ser­men­ge ist bei Er­schei­nen von min­destens ei­nem die­ser Flags un­zu­ver­läs­sig und mö­gli­cher­weise ver­al­tet oder völ­lig falsch.

Die Error-Flags blei­ben im Dis­play auch wenn der Feh­ler nicht mehr vor­liegt und wer­den erst zur nächs­ten vol­len Stun­de (oder bei ei­nem Re­set) ge­löscht.

Die zweite Zeile wech­selt zyk­lisch zwi­schen fol­gen­den An­zei­gen:

Erweiterte Anzeige

Für den Autor hat sich die Low-Cost-Version mit einem zwei­zei­li­gen Dis­play als un­zu­rei­chend er­wie­sen. So gibt es die Mö­glich­keit, im Source­code auch ein vier­zei­li­ges Dis­play mit 20 Zei­chen pro Zei­le aus­zu­wäh­len wenn man be­reit ist, sich die­sen Luxus auch in Hard­ware zu gön­nen (tat­säch­lich re­den wir hier nur von ein paar Euro!).

Dann wer­den fol­gende Wer­te auf ei­nem vier­zei­li­gen Dis­play wie z.B. auf ei­nem Win­star WH2004A an­ge­zeigt:

1234L<PChh:mm:ss ¡
01234.1 l/h 01234.1*
01234.1 l/d 01234.1*
12.3 °C 340.1m/s

Die erste Zeile ist identisch mit der 2x16-Version. In der zweiten und dritten Zeile werden per­ma­nent die Ver­bräu­che für die lau­fen­de und ver­gan­ge­ne Stun­de so­wie für heu­te und ges­tern an­ge­zeigt.

Die vierte Zeile wech­selt zyk­lisch zwi­schen fol­genden An­zei­gen:

Nur in der erweiterten Anzeige ist auch ein Antennen­symbol für den DCF77-Empfang zu sehen!

Ganz rechts wird ein vertikales Balken­diagramm für den Füllstand angezeigt. So können sie optisch den Füll­stand mit einem Blick erfassen.

Die 4x20-Anzeige wurde aufgrund der geringen Mehrkosten zum Standard definiert und ich unterstütze das 2x16-Display nicht mehr aktiv. Wenn Sie in Ihren Sourcen die 2x16-Anzeige wählen kann es sein, dass sie nicht wie erwartet funktioniert. Ich bemühe mich auch weiterhin, das 2x16-Display zu unterstützen aber ich teste dies nicht weiter. Verwenden Sie das 4x20-Display und Sie haben keine Probleme.

Hinterleuchtung

Das gewählte LC-Display besitzt eine LED-Hinter­leuchtung, die wir nicht ungenutzt lassen wollen. Da wir bereits einen hocheffizienten Schalt­regler einsetzen um die 5 V zu erzeugen können wir uns auf­wändigere Schaltungen ersparen und das Back­light einfach über einen 4,7 Ω-Widerstand an 5 V legen. Ich habe noch einen Tran­sistor als Schal­ter eingefügt mit dem der Con­troller das Back­light schalten und per PWM auch dimmen kann. Als Strom habe ich bei meinem Prototyp 183 mA (bei 100%) gemessen.

Sound

Da wir noch Portpins und Timer frei haben entschloss ich mich, einen Piezo-Tongeber an Timer 3 anzu­schließen. Die Sound­routinen erlauben es, beliebige Töne, Musik­noten oder komplette Musik­sequenzen mit minimalem Over­head im Inter­rupt abzuspielen. Die Musik ist dabei monoton, ich wollte eigentlich keinen Synthesizer program­mieren...

Sequenzen können program­miert werden für

Allerdings sind die Sequenzen selbst derzeit nur im Source­code änderbar und nicht konfi­gurierbar.

Die Sequenz für den System­start ertönt nach jedem Reset und ist nicht de­aktivier­bar.

Die Sequenz für Signal­ausgang 1 wird in jeder Minute zur 10. Sekunde wieder­holt und klingt etwas aggressiver. Ausgang 1 ist deshalb besser für dringliche Mel­dungen geeignet.

Die Sequenz für Ausgang 2 ist dezenter und wird nur zu jeder vollen Stunde in der 20. Sekunde wieder­holt.

Da dies möglicher­weise nervig sein könnte ist eine Zeit­spanne program­mierbar, außerhalb derer keine akustischen Meldungen erfolgen.

Zusätzlich gibt es eine soundmask mit der folgende Meldungen aktiviert werden können:

Um die soundmask zu berechnen, addieren sie die oben genannten Werte die Sie benötigen. Wenn Sie z.B. Signal­ausgang 1 immer hören wollen und den Stunden­schlag wün­schen ist die soundmask folglich 5.
Der Stunden­schlag ist eigent­lich nichts, was wirklich in ein Gerät wie dieses gehört aber ich habe mir lange überlegt, was man aus dieser Hard­ware noch machen könnte und aus Lange­weile und purem Über­mut habe ich ihn implemen­tiert.

Ein Besucher meiner Web­site hat mir letzt­lich doch noch eine Idee gegeben (zu Zeiten als Google noch die Suchbegriffe übe­rmittelte): Ab der ersten Serien­version gib es den

Analogausgang

Für Nostalgie-Versionen kann auch auf das LCD verzichtet und ein 100 µA Drehspul­messwerk einge­setzt werden, dass dann den Füll­stand in % anzeigt.

Ich habe die Mittel­wert­bildung des PWM-Signals von Timer 1 C einem RC-Glied über­lassen und für die Umwandlung in einen Analogwert den zweiten, bisher unge­nutzten OpAmp als spannungs­gesteuerte Strom­quelle benutzt, der somit ein weit­gehend AC-freies Signal erzeugt. Das Signal ist nicht GND-bezogen aber für ein Drehspul­messwerk ist das ja egal.

Über X12 wird das Mess­werk ange­schlossen. Zusätzlich zum analogen Signal steht auch noch das dimmbare Beleuchtungs­signal sowie +5 V zur Verfügung, falls ihr Messwerk eine Be­leuchtung besitzt. Verwenden Sie für die Zulei­tung zum Mess­werk eine ver­drillte Zweidraht­leitung, ebenso wie für die Zuleitung zur Beleuchtung um Über­sprechen zwischen dem Analog­signal und dem steilflankigen Beleuchtungs­signal zu minimieren.
Die Pin-Reihenfolge von X12 ist verpolungs­tolerant d.h. bei verkehrt herum gestecktem X12 schlägt das Instrument ins Negative aus und die Beleuchtung ist verpolt, was für Skalen­lämpchen egal ist und selbst LEDs tolerieren sollten.

Der Strom ergibt rechnerisch bei 2,7 V am RC-Glied 100 µA so dass Bauteil­toleranzen gut per Software ausge­glichen werden können. Eine entsprechende Kalibrierungs-Prozedur für den Vollaus­schlag des Instru­ments wurde imple­mentiert.

Der gewählte OpAmp ist kein echter Rail-To-Rail Typ des­halb können wir nicht den gesamten 5 V Spannungs­hub ausnutzen. Er kann 0 V recht gut dar­stellen aber Ausgangs­spannungen nahe VCC werden nicht erreicht.

Da der Timer 8 Bit Auf­lösung hat kann der Anzeige­wert nur auf etwa 1% genau einge­stellt werden aber genauer kann man ein analoges Mess­werk ohnehin kaum ablesen. Messungen mit einem genauen Digital-Ampere­meter bestätigen eine Genauig­keit besser als 1% des Vollaus­schlages.

Wenn Sie auf das LCD verzichten, setzen Sie unbedingt den Display-Typ auf Analog. Die meisten Funktionen würden zwar auch mit LCD-Typen funk­tionieren da die LCD-Routinen ein Timeout verwenden falls das Display nicht antwortet. In einigen Fällen kann das Timeout jedoch lang genug sein um einen Watchdog-Reset auszulösen.

Nun, das war wohl die letzte Inspiration die ich von einem Besucher bekommen sollte denn seit September 2013 scheint Google keine Keywords mehr zu über­mitteln. Deshalb kann ich nur empfehlen, benutzen Sie nicht Google für die Suche. Nur Google weiss noch, wonach sie gesucht haben. Ich kann meine Seite und mein Projekt nicht mehr verbes­sern denn ich erfahre nicht, wonach sie gesucht haben (wer sie sind erfahre ich sowieso nicht, auch wenn Google es wahr­scheinlich weiss). Benutzen sie nicht Google!
Natürlich können Sie trotzdem Google benutzen wenn Ihnen danach ist und Sie können mir einfach eine Email schreiben, was ihnen an meiner Seite fehlt. Aber dieser Daten­schutz-Aktionismus nervt.

Stackchk

Ein Modul namens Stackchk wurde hinzugefügt um die Reserve an freiem Speicher (also zwischen Heap und Stack) zu schätzen. Dies ist nur aktiv wenn Sie die Variable WITH_STACKCHK per #define erzeugen. Sie können das in den Project-Properties unter Compiler-Symbols erledigen. Andernfalls reduzieren sich alle Calls auf die Funktionen auf ein simples Return. Ein guter Optimizer sollte Calls auf ein Return eliminieren. Leider ist dies in der aktuellen Version nicht der Fall aber wir verlieren dadurch lediglich drei Bytes an Programmspeicher, was normalerweise kein Problem darstellt.

In der aktuellen Version zeigt dies knapp 400 Bytes Reserve so dass wir uns keine Gedanken über eine Stack-Kollision machen müssen.

Kommandos

Folgende Kommandos sind bisher implementiert:

Abkürzen von Kommandos

Kommandos sind Case-In­sen­si­tive, d.h. Groß-Klein­schre­ibung spielt kei­ne Rol­le. Außer­dem wird das Kom­man­do nur bis zu sei­ner an­ge­ge­be­nen Län­ge aus­ge­wertet, d.h. cal ist Äqui­va­lent zu Ca­li­bra­te oder im Ex­trem­fall d ist äqui­va­lent zu DCFInf. Wenn Sie sol­che Abkür­zun­gen ver­wen­den soll­ten Sie sich an­ge­wöh­nen, ein­deu­ti­ge Ab­kür­zun­gen zu ver­wen­den. Mö­gli­cher­wei­se kom­men Kom­man­dos hinzu, die sich mit Ihren Abkür­zungen über­schneiden und möglicher­weise stimmt die Sor­tie­rung im Source­code nicht mit der von Ihnen erwarteten überein... Ins­be­son­dere in Skrip­ten oder an­de­ren pro­gramm­ge­steu­er­ten Ak­tionen soll­ten Sie die Kommandos stets ausschreiben.

Beachten Sie: alle Än­de­run­gen der Kon­fi­gu­ra­tion (ein­schließ­lich der Ka­li­brie­rung) wer­den zu­nächst nur im tem­po­rä­ren Spei­cher ab­ge­legt und erst durch ein Write-Kommando permanent!

Parameter kön­nen nicht ab­ge­kürzt wer­den. Sie kön­nen z.B. deb dfc schrei­ben an­statt debug dcf aber deb d wird nicht funk­tio­nie­ren!

Kommandos mit Neustart

Einige Kom­man­dos en­den mit ei­nem Neu­start des Ge­räts. Dies wird durch ei­nen Watch­dog-Re­set be­wirkt da es kei­ne an­de­re Mög­lich­keit gibt auch die Hard­ware des Con­trol­lers zu­rück zu set­zen. Es ist nor­mal, dass nach diesen Kom­man­dos eine Feh­ler­sei­te ein­ge­blen­det wird, die das an­zeigt.
Nach einem echten Power-Down-Reset (aus- und wieder ein­schalten) sollte diese jedoch ver­schwinden.

Debug-LEDs

Zum Debugging habe ich dem Display noch vier verschieden­farbige LEDs spendiert. Solange die Schaltung nicht in 1000-er Stück­zahlen läuft ist der finan­zielle Aufwand vernach­lässigbar, später kann man sie weg­lassen. In der aktuellen Firm­ware zeigen sie folgendes an:

Die blaue LED wird auch für den Fertigungs­test benötigt und sollte daher nur mit sehr guten Gründen geändert werden!

Helligkeit

Damit kann man es wohl niemandem recht machen. Die einen sagen, es ver­brennt ihnen die Netz­haut, andere meinen aus 5m Ent­fernung kann man sie kaum noch er­kennen. Ich habe einen Mittel­weg gewählt und sie mit jeweils 10 mA bestromt. Damit sind moderne LEDs, sagen wir, hell. Ein vier­poliger Jumper ermöglicht den Anschluss des Tastkopfes eines Oszilloskops um die Zeiten exakt zu messen. Überrascht hat mich die Hellig­keit der grünen Vishay-LED. Im ersten Proto­typen funzelte noch eine Osram-LED vor sich hin aber die Vishay sieht aus als ob in ihrer Umgebung Schweiß­arbeiten vor sich gingen. Ihr Vorwider­stand muss dringend erhöht werden.

Natürlich können Sie die LEDs auch für andere Zwecke gebrauchen. Die Sourcen haben Sie ja...

Factory Test

Ich habe einen einfachen Factory Test implemen­tiert, der in der Lage ist Kurz­schlüsse zwischen zwei Ausgängen oder einem Ausgang und der Ver­sorgung zu erkennen.

Eingänge können damit nicht überprüft werden da die Soft­ware den Zustand der Eingangs­leitungen nicht beein­flussen kann.

Dazu wird ein walking zero und ein walking one durchgeführt, d.H. alle Aus­gänge werden gesetzt und ein einzelnes 0-Bit wandert durch alle Pins. Solange nur dieses Bit 0 ist und alle anderen 1 bleiben ist alles OK. An­schließend werden alle Pins auf 0 gesetzt und eine 1 wandert durch alle Bits. Damit können viele (aber nicht alle) Kurz­schlüsse erkannt werden.

Alle Versorgungs­spannungen werden gemes­sen und mit vor­definierten Grenz­werten ver­glichen. Die Kalibrierungs­prozedur muss vorher durch­gefühert werden um die Grenz­werte sicher zu erkennen.

Außerdem kann er den SWUnreg-Switch überprüfen da er die anliegende Spannung messen kann. Er zeigt die Anstiegs­zeit der SWUnreg (bis auf 90 % von Unreg) und deren Abfall­zeit (auf 10 % von Unreg) die, bei gegebenen Prüf­bedingungen (ange­schlossener Sensor, 10m Kabel), vorher­sagbar sind. Damit kann die Funktion der Konstant­stromquelle über­prüft werden. Typische Werte für die Anstiegs­zeit in diesem Fall sind eine knappe Mikro­sekunde und für die Abfall­zeit etwa 20 µs.

Er kann jederzeit mit dem Kommando FTest aufge­rufen werden. Beachten Sie dabei, dass kurze Spikes z.B. auf den Signal­aus­gängen oder den seriel­len Schnitt­stellen auftreten, die evtl. unerwartete Neben­wirkungen zeigen.

Der Factory Test endet stets mit einem Reset des Displays

LITERS_T

LITERS_T ist ein typedef für alle Volumen­einheiten im System und in meinen Sourcen als double definiert.

Manche Leute mögen sagen, ein Integer wäre genug. Ich benutze jedoch für die meisten Berech­nungen Fließkomma-Arithmetik aus folgenden Gründen:

Wenn Sie komplexe Berechnungen durch­führen müssen, tun Sie dies in Fließkomma-Arithmetik! Bedenken Sie jedoch, dass der '='-Operator dann prinzipiell nicht verwendbar ist. 2 ist eben nicht gleich 1.9999973!

Für mich gibt es nur wenig Gründe, von diesem Prinzip abzuweichen:

Beide Listen erheben keinen Anspruch auf Voll­ständigkeit. Wenn Sie zu dem Schluss kommen, int_16 reicht für LITERS_T, defi­nieren Sie es um. Ich kann ihnen jedoch nicht garantieren dass es einfach so funk­tioniert obwohl ich mich bemüht habe, die Schnitt­stellen kompatibel zu halten. Ver­wenden Sie auf keinen Fall vorzeichenlose Typen! Ihr Volumen kann negativ werden wenn die Zisterne 1cm tiefer ist als Sie ge­messen haben. Die Aus­wirkungen könnten Sie sonst über­raschen!

Layout

Hier ein paar Hinweise zum Layout.

Allgemein müssen in Strom­kreisen mit hohem di/dt induktive Anteile der Leiter­bahnen minimiert werden. Hohes di/dt treten in unserer Schal­tung natürlich im DC/DC-Konverter auf, aber auch in der PWM-Schaltung zum Dimmen des Backlights.

Die Induktivität sinkt mit der Breite der Leiter­bahnen und wächst mit der Länge und der umschlos­senen Fläche.

Verwenden sie breite Leiter­bahnen. 0.3 mm sind nicht genug, auch wenn sie den Strom theo­retisch tragen können. 1 mm ist immer noch zu schmal. Ver­wenden Sie Flächen, so breit und kurz wie nur irgend möglich! Machen Sie sich klar, welchen Rückweg der Strom nehmen muss und verlegen Sie Hin- und Rückweg so eng wie möglich neben­einander um die umschlos­sene Fläche zu minimieren. Jeder Milli­meter den Sie sparen können ver­bessert das Ergebnis.

Da der Rück­weg regelmäßig über GND führt muss die Ground­plane die erste unter der Bestückungs­seite sein!

DC/DC-Konverter

Für den DC/DC-Konverter bedeutet dies:
U8 schaltet, somit ergibt sich das höchste di/dt in den Kreisen um U8. Minimieren Sie die Fläche um C10, U8, L2, C12 sowie D2, L2 und C12.

PWM Dimming

Für den Dimmer-Schaltkreis bedeutet dies:
Minimieren Sie die Fläche um C5, Backlight, R12 und T3