Beiträge von Knisterbein

    Träume weiter, Pius


    Wie so oft verstecken sich die Probleme in den Details. Nachdem nun die ADC Messung korrekt arbeitet, versuchte ich mir eine Vorstellung über Verbesserungen des Voltmeters zu machen. Da mein Gerät später einmal ein Labornetzgerät steuern soll, vieles digital gelöst sein soll und damit den Verdrahtungsaufwand und den Komfort der Anwendung optimieren soll, meinte ich, eine Erhöhung der Genauigkeit mit der Software alleine zu erreichen.


    Gehe ich von einem Labor Netzgerät mit einem einstellbaren Ausgangsspannungsbereich von 0-30V aus, dann erreiche ich eine Auflösung von (30V/1000) = 30mV.


    (10Bit AD entspricht 210 Schritten 0-1023, benutzen möchte ich den Bereich aber nur bis 1000, da auch Spannungen knapp darüber noch messbar bleiben. Vorsicht, dies ist lediglich die Auflösung und hat nichts mit der Genauigkeit zu tun)


    Stelle ich nun eine Spannung von 5V ein, dann müsste der ADC Wert bei runden 167 (167 * 30mV= 5.1V) liegen. Da kam mir die Überlegung, dass wenn ich für Messungen unter 10V anstelle der 2.56V Referenz die 1.1V Referenz benütze, dann könnte ich für den Bereich 0-10V eine höhere Anzeigeauflösung erreichen. Die Software müsste dann lediglich den ADC Wert mit dem entsprechenden Faktor korrigieren. Die Kalibrierung müsste dann z.B: bei 20V mit der 2.56V Referenz erfolgen (20V ist 2/3 des Bereiches), wozu ich ein Poti für die Korrektur im Eingangsspannungsteiler vorgesehen habe. In der Annahme, dass die beiden Referenzen (2.56V und 1.1V) eine gleiche oder zumindest ähnliche Genauigkeit aufweisen würden, müsste dies funktionieren.

    Pustekuchen, ein Blick ins Datenblatt der ATmega644 (Seite 325) zeigt die folgenden Daten:


    ATmega644_Reference.png
    Da kann sich bereits die 2.56V Referenz im Bereich von 2.4V – 2.8V bewegen. Dies lässt sich mit der Kalibrierung locker korrigieren, aber die Annahme, dass sich dann die 1.1V Referenz gleich verhält ist wohl zu optimistisch. Einzige Hoffnung wäre, die Kalibrierung mit der 2.56V Referenz und dem Trimmer vorzunehmen und die Kalibrierung der 1.1V Referenz anschliessend per Software zu erledigen. In Anbetracht der Fehler bei der AD Wandlung von bis zu 2 Bit LSB (bei 200kHz) erscheint mir der Aufwand für die Software viel zu hoch und der resultierende Nutzen minimal.


    Tja, da habe ich wieder einige Stunden mit Ausprobieren und der Suche nach Lösungen investiert, mit der logischen Konsequenz es mir zu sparen.


    und weil es Andere auch schon bemerkt haben hier zwei Links:

    Genauigkeit der Referenz

    Spannungsmessung mit dem Arduino

    Endlich wagte ich mich wieder an diese Idee zurück. Nachdem ich den "Flick" mit dem Spannungsfolger wieder rückgängig machte und den Serie R im Input Spannungsteiler nochmals prüfte, passte die Anzeige. Hmm, vermutlich war beim Spannungsteiler irgendwo eine kleine Lötbrücke, die ich unbewusst mit dem Entlöten des R entfernte. Ist zwar ärgerlich, aber es wäre die einzige plausible Erklärung. Nun geht es an die Implementierung aller AD Eingänge.
    schönes Wochenende
    Pius

    Ericsson DRU 18-01 Handy Transmitter 1.842 GHz



    Übersicht


    Heutige elektronische Geräte sind alt wenn sie die Fabrikation verlassen. Dieser Handy Sender war auf einem Gebäude installiert und damit er sich nicht ganz alleine fühlte waren 3 Stück davon in einem Schaltschrank mit der Strom- und Notstromversorgung versehen. Jeder Block benutze seine eigene Antenne, die auf dem Gebäude möglichst weit voneinander getrennt aufgestellt waren. Die Antennen waren Gebilde aus gestockten Dipolen (jeweils 2), die, so meine ich mich zu erinnern, jede in eine andere Himmelsrichtung zeigten. Von den Antennen führte jeweils ein Koax zu einer Alu Box (aus einem Stück gefräst), die Überspannungsschutz, Blitzschutz und vermutlich je ein Bandpass Filter enthielten. Die Versorgung der Elektronik erfolgte dabei über das Koax Kabel vom Sender her. Die Verbindungskabel vom Sender zur Antenne waren je nach Entfernung unterschiedlich stark. Die kürzeren Distanzen benutzten ein 2“ (30mm) Koaxkabel und für die lange Strecke war das Kabel noch stärker. Eines dieser 3“ Kabel (ca 40m) benutze ich heute als Zuleitung zu meiner VHF/UHF Antenne. Leider war beim Abbau die Zeit zu knapp, so musste ich das lange Kabel dort liegen lassen. Die restlichen Kabel verschenkte ich an eine Amateurgruppe.


    Rx/Tx


    Der Aufbau erfolgte auf einer Platine, die nur einseitig bestückt wurde. Rückseitig ist die Platine mit der Grösse 414mm x 275mm auf eine 10mm massive Aluplatte mit Kühlrippen verschraubt.


    Ericcson_Tx_FrontView_klein.jpgTx_Bloecke.jpg


    rot markiert: ein Ausgangsverstärker, gelb markiert die Stromversorgung


    Unterschiedliche Funktionsblöcke sind auf der Platine deutlich getrennt. Leider habe ich kaum Unterlagen dazu gefunden und viele der aufgelöteten Halbleiter tragen zwar Bezeichner, aber Datenblätter dazu findet man zu den wenigsten der Bauteile. Spannend war für mich natürlich der LDMOS FET, der in der Endstufe benutzt wurde: infinion PTFA181001E, der für eine enge Bandbreite (1805-1880 MHz) spezifiziert wurde und knappe 51dBm (@28V) bei einem Gain von ca 16dB liefern vermochte.


    Sehr eindrücklich (für mich) ist das Ein-/Ausgangsfilter des Tx. Dies wurde für beide Tx aus einem einzigen Alublock gefrässt (?)und die einzelnen Kreise wurden mittels Stellschrauben mit Kontermutter von der Oberseite des Blocks abgestimmt.


    Ericcson_Tx_Filter_klein.jpg


    Beim geöffneten Filter Block sind die einzelnen Kreise, die Kopplungen etc. deutlich zu erkennen. Bei den Anschlüssen zur Antenne ist nochmals ein Überspannungsschutz (die 2 kleinen Platinen) zu erkennen.


    Gruss
    Pius

    Spannend Kai


    wenn es aus dem W II stammt dann gab es für das Gerät verschiedene Hersteller, da man ja versuchen musste, sich von den Herstellern unabhängig Ersatz beschaffen zu können.
    Es ist ein schönes Beispiel für die Langlebigkeit der früheren Produkte, was heute längst nicht mehr der Fall ist.
    Ich war letzte Woche am Zerlegen eines Handy Senders, den ich vor ein paar Jahren abbauen durfte. Die ganze Anlage hätte noch funktioniert, wäre der Betreiber nicht Konkurs gegangen. Bei Interesse kann ich gerne Bilder davon liefern.

    Gruss
    Pius

    Da hast Du ein sehr schönes Gerät und mich verwundert es nicht, dass es nach so vielen Jahren noch recht genau misst.
    Aber ich bezweifle, ob das Instrument ein Multavi V oder aus dieser Serie stammt. Wenn es von H&B stammt, dann vielleicht ein verwandtes Gerät der Monavi. Die grösseren Hersteller markierten die Instrumente meist auf der Skala, entweder mit einem Schriftzug oder dann mit dem Herstellersymbol. Eine Innansicht des Gerätes würde vielleicht zusätzliche Hinweise geben. Auffällig bei deinem Gerät ist das Messwerk selbst mit seinem "Bauch". Solche Bauformen kenne ich eher von US oder englischen Herstellern. Dass das Instrument mit einer Spiegelskala versehen ist, deutet auf einen Hersteller mit Qualitätsansprüchen hin.

    Link zur Multavi Übersicht


    hier ein Bild eines Montavi V aus meiner Sammlung:

    D_HartmanBraun_Multavi5_front1.jpg


    Meine ältesten Instrumente von H&B sind diese zwei Schulinstrumente, gebaut um 1899. Auch diese Geräte messen nach wie vor korrekt.


    H_B_Beide.jpg

    Diese Woche rief mich ein guter Freund an und erklärte mir, er hätte einen Anruf eines Kunden erhalten. Dieser betreibe im Keller einen Luftentfeuchter der von einer elektronischen Steuerung kontrolliert würde und einen Fehler „F4“ zeigt und nun wolle er wissen, was diese Fehlermeldung beuten würde.

    ?

    Natürlich wusste mein Freund, dass ich das Gerät ende der 80er Jahre gebaut hatte und hoffte nun, dass ich die Frage noch beantworten könne. Pustekuchen, die Unterlagen dazu habe ich vor gefühlten 3 Jahren der Altpapiersammlung übergeben und konnte deshalb nur raten, dass es sich bei der Meldung vermutlich um einen Fehler am Eimer-Sensor handeln könnte. Da ich noch ein Mustergerät in einer Vitrine habe, versprach ich ihm, dies am Gerät zu verifizieren.

    Und heute tat ich das und lobte ein bisschen mein Erinnerungsvermögen. F4 bedeutet tatsächlich einen Unterbruch des Niveau Sensor, der lose in einem Eimer mit Wasser hängt und den Zeitpunkt meldet (und die Maschine stoppt) wenn sich der Eimer mit Kondenswasser gefüllt hat. Da bei diesem Kunden kein Eimer mehr dort steht, sondern ein Schlauch das kondensierte Wasser direkt ableitet, wollte ich den Sensor (ein PTC) mit einem Festwiderstand ersetzen. Leider klappte dies nicht weil …

    ich beim Erstellen der Software (alles in ASM) auch prüfte, ob sich der Spannungsabfall am PTC beim Einschalten des Gerätes auch tatsächlich verändert. Damit muss ein identischer PTC angeschlossen sein, ansonsten startet das Gerät nicht.


    Ich erinnere mich, dass ein Schwimmersensor für die Anwendung viel zu kostspielig gewesen wäre und ich deshalb einen definierten Strom durch einen PTC zwang, der den PTC auf ca. 50 Grad erwärmte, solange er nur von Luft umgeben ist. Sobald der PTC mit dem Wasser in Berührung kam, wurde die Wärme ans Wasser abgeführt und der Strom im PTC stieg wieder an. Dies benutzte ich, um den Zustand „Eimer Voll“ zu detektieren.


    Die Geräte (es waren um die 450 Stück) lieferte ich ca 1987 an den Auftraggeber aus. Und 1990 verkaufte Dieser die ganze Sparte an eine andere Firma. Kurz darauf kam ab und an ein Gerät zur Reparatur zurück, bis ich dann nie mehr etwas darüber vernahm. Ein kritisches Bauteil damals war der Feuchtesensor, der an einer AC Versorgung von ca. 1V bei 1kHz betrieben werden musste. Die restliche HW stellte nie ein Problem dar, ausser dass einmal ein Trafo abrauchte, weil das Gerät in einem überschwemmten Keller stand.


    Um den Fehler zu beheben, liefere ich nun meinem Freund einen PTC aus und dieser wird diesen dann, mit einem Schraubenzieher bewaffnet, am Gerät einbauen. Nach 34 Jahren selbstverständlich in Garantie.


    Als uP benutzte ich damals einen 8051, das RAM mit 256 Byte sass im Peripherie Baustein 8155, für den Programmspeicher war ein 2764 EPROM zuständig und die analogen Werte erfasste ein ADC0808. Äusserst zeitintensiv war das Erstellen der Feuchte Tabelle. Mit einem angeschafften Feuchtemessgerät, gesättigten Salzlösungen und wiederkehrenden Vergleichsmessungen tastete ich dann auf die annähern richtigen Feuchtewerte heran.


    Tja, die ganze Aufgabe würde man heute wohl mit einem einzigen Chip erledigen. Das Schreiben der Software erledigte ich auf einem CP/M80 System (DEC Rainbow 100, der unterstützte auch gleichzeitig CP/M86) und über eine RS232 Schnittstelle bediente man den EPROM Programmer.


    Lange ist es her und ich bin mit ganz sicher, so will ich heute nicht mehr arbeiten. Da ging mit dem „Brennen“ der EPROMS immer viel Zeit verloren und die Programmierung in Assembler war dementsprechend fehleranfällig (natürlich war der Schuldige immer mein Kopf).


    schönes Wochenende

    Pius


    HM5000_Front.jpg


    HM5000_Oben1.jpg

    Ich habe mal kurz in die EEPROM Sourcen geschaut. Ja ich weiss, es gibt vermutlich unterschiedliche Sourcen dazu.

    Dabei sehe ich nichts, das auf eine zeitliche Sicherstellung der Funktionen hindeutet. Vor allem die write Funktion scheint mir da kritisch, wenn man nach dem Schreiben nicht 3.3 mS (diese Zeit wird zumindest beschrieben) abwartet, bevor man erneut auf das EEPROM zugreift.

    Daher ist der Vorschlag von Reiner mit dem delay(100) nach der Schreiboperation zielführend. Wie René beschrieben hat, ist beim Schreiben von Typen mit einer Grösse über ein Byte vermutlich eine Wartezeit nach jedem Byte notwendig.

    Code
    1. byte Mode =1; // Mode soll 1 sein
    2. EEPROM.put(0,2); // writes data on EEPROM using also the EEPROM.update() that writes data only if it is different from the          // previous content of the locations to be written.
    3. // hier wird an der Adresse 0 der Wert 2 geschrieben
    4. Mode = EEPROM.read(0); // lesen von der Adresse 0 ??
    5. // =====================================================================
    6. // Du meintest wohl:
    7. EEPROM.put(0, Mode); // den Inhalt von Mode auf Adresse 0 updaden
    8. Mode = EEPROM.read(0); // lesen von der Adresse 0, da ist Mode abgelegt

    Ich denke das reicht Dir so und natürlich, Zeit lassen, die Zugriffe aufs EEPROM sind langsam,

    Gruss

    Pius

    Danke Reiner


    Nein, ausser man hat im Progamm etwas dazu vorgesehen. Was immer geht, Reset aktivieren. Dies zwingt den Prozessor dazu, das Programm wiedre bei 0 zu starten. Würde man den Takt der CPU stoppen, dann würde das aktuell abarbeitende Programm anhalten. Soviel ich weiss sind die ATxx Prozessoren rein statisch. Leider habe ich erst kürzlich eine Schaltung gesehen, die einen Atmel Prozessor stoppte, indem der Quartz am Schwingen gehindert wurde (ist sehr unschön, da man keine Ahnung hat, in welchem zeitlichen Augenblick abgewürgt wird).

    schönen Abend

    Pius

    Super nische


    vielen Dank für deine simple Lösung. Wenn wir schon bei Spulen sind ... sie sind spannend und ich entdecke deren Geheimnisse in kleinen Schritten.

    Aber bevor weiter experimentiert, hier ein Link zum Hall Sensor. Vielleicht hast du ja diesen Link bereits geteilt.


    Vor einiger Zeit hatte ich das Gespräch mit einem jungen Ing. und da frage ich jeweils (ich bin immer neugierig), was er als Diplomarbeit erarbeitet hat. Sein Stichwort Fluxgate triggerte bei mir nichts und so musste ich mein Unwissen an den Tag legen. Er schickte mir dann seine Arbeit und ich machte mich auf die Suche nach den Details. Da ich mich vor drei Wochen nochmals mit dem Pendel von Lajos beschäftigte und mir der Einfluss des Erdmagnetfeldes in seinem Aufbau unklar bleibt, muss ich mich zumindest durch Lesen mehr damit beschäftigen. Meine heutige Meinung (Achtung, die kann sich ja wieder ändern) dass sein Pendel sich immer irgendwie nach dem Erdmagnetfeld ausrichten wird.


    zurück zum Fluxgate:

    und deshalb hier, sollte ich mit meiner Unkenntnis nicht alleine sein, ein paar Links.


    Herr Kainka hat gezeigt, dass man sich den Einstieg einfach machen kann.

    DeniSense mit Video

    und dann noch zur Strommessung.


    Ich weiss, es kribbelt gleich und am liebsten würde ich es ausprobieren.


    en schöne Obig wobei wir ja eher Abgig haben^^

    Pius

    Danke nische


    ich habe die genauen Vorgänge nie detailliert angeschaut, weil es mir reichte zu wissen, dass es funktioniert. Alle neueren Versuche die ich mit den Detektoren machte, benutzten Bleiglanz als "Halbleiter" und die Spitzen (nehme ich an) sind aus Kupfer.

    Für Lehrlinge zeichnete ich vor einiger Zeit die Durchlasskurve auf einem Tek 576 auf, habe aber die Bilder wieder gelöscht, resp. ich finde sie nach der Umstellung beines PC's nicht mehr. Der Curvetracer erlaubt es viel genauer, den optimalen Kontakt zu finden und ich war erstaunt, wie stark die Kurve einer Diode ähnelt. So viel ich mich erinnern kann, war die Durchbruchspannung relativ tief, aber die Steilheit der Kurve wesentlich flacher als die einer Diode.

    Detektoren.jpg

    hier noch zwei Beispiele der von dir angesprochenen Detektoren in Glasröhrchen. Der Untere ist nicht mit Bleiglanz bestückt, der Obere hat noch etwas drin.


    Falls es Dich wirklich interessiert, kann ich versuchen nochmals eine Kurve dazu aufnehmen und hier einstellen.


    Spannend finde ich, was Leute mit der Verfeinerung der Technik beim Detektor Radio erreicht haben und dies nur aus Spass am Optimieren.


    Selber muss ich mich sputen, habe ich doch jemandem versprochen, den Versuch für einen Detektor (mit Dioden) für den UKW Rundfunk zu probieren, bevor dann die Sender alle abgeschaltet sind. Meine Behauptung geht dahin, dass ich ziemlich sicher bin, dass es bei Sichtverbindung zu einem starken Sender machbar sein müsste. Mein Entwurf funktionierte auf dem Labortisch, mit Leistungen im Bereich von -35dBm. Ja ich weiss, das ist sehr viel, aber wenn ich Sichtkontakt auf die Rigi habe, dann erreiche ich Pegel im Bereich von -38dBm relativ locker. Mangels eines effizienten Kopfhörers (die Amerikaner bauten für die Armee sehr empfindliche Hörer) konnte ich es noch nicht real ausprobieren.

    Man überlege sich doch mal, wie man ohne zusätzliche Energie oder Halbleitern FM in AM umwandeln könnte?


    Gruss
    Pius


    Nachtrag: hier findet man eine Kennlinie und die unterschiedlichen Materialien die man benutzte

    Kleiner Nachtrag zum Detektorempfänger

    Detektor_Empfaenger.jpg

    Ein Beipiel eines Detektorempfängers. Im Inneren befindet sich lediglich eine Spule und ein Drehko. Der Detektor selbst ist oben aufgesteckt.




    Detektor.jpg


    und noch ein Bild eines Eigenbau 27MHz Senders mit 2 Transistoren. Für den Oszillator wurde ein AF118 benutzt, der zweite Tr diente zur Verstärkung. Die Sendefrequenz konnte man nur durch Wechseln des Quartzes (ist keiner gesteckt) erreichen. Über die Bananenbuchsen wurde die NF für die AM zugeführt.

    Tja, Leiterplatten waren damals noch nicht so üblich und typisch für den Spardrang war das Gehäuse.


    Zigarrenschachtel.jpg

    Das vergessene Bauelement


    Der Detektor Empfänger war auch in meiner Jugend das Experimentierfeld, das dann selbst mein Berufsleben prägte. Wenn man sich im Netz umschaut, gibt es viele, sehr viele Beiträge dazu.


    Röhrenbude

    Röhrenbude 2


    Berthold Bosch

    Teil 1 (pdf)

    Teil2 (pdf)


    In meinem Fall war aber auch immer eine Germaniumdiode im Einsatz und nicht die fummeligen Detektoren der Anfangszeit. Irgendwoher konnte man sich eine Germaniumdiode beschaffen, auch ohne Taschengeld. Meine Lösung war so, dass ich in meiner Umgebung in allen RTV Geschäften nachging und nach Ausschlachtteilen (Platinen, Geräte) fragte. Das klappte, manchmal so gut, dass sich viel zu viel zum Ausschlachten ansammelte und da ich der Überzeugung war die Dinge gebrauchen zu können, möglichst viele Bauelemente auslötete und für den späteren Gebrauch beiseitelegte. Mit den Jahren dann stellte sich logischerweise heraus, dass ich die wenigsten dieser Bauelemente brauchen konnte. Ja, ab und an Widerstände oder ein Kondensator. Ganz selten fand ich Transistoren, denen ich dann auch Daten zuordnen konnte. Meist waren es Japanische Germanium Transistoren, die mangels eines Datenbuchs dann doch in die Entsorgung wanderten.


    Damit ein Detektor-Empfänger aber gut arbeitet, ist man auf eine «gute» Antenne angewiesen und gut war damals der Rat meines Vaters, einen möglichst langen Draht, der möglichst hoch über dem Grund gespannt war, die beste Antenne sei. Er meinte, es hätte früher mal Licht-Antennen gegeben (gab es tatsächlich), diese seien aber nicht so gut und vor allem verbot er mir Versuche mit einer solchen Antenne. Und weil ich immer Löcher fragte, erklärte er mich auch wie eine solche Lichtantennen funktionieren sollte. Zu dieser Zeit waren die meisten Netzversorgungen der Häuser über Freileitungen gelöst. Wenn man diese Leitungen als Antenne missbrauchen wollte, dann schloss man einen Kondensator in Serie zum Leiter und fertig war die Antenne. Unschwer lässt sich erraten, dass ich dem Rat meines Vaters folgte und deshalb noch unter den Lebenden weile.

    Die «lange Antenne» wurde dann mit der Hilfe meines Vaters gebaut, weil dieser den Draht und eine lange Leiter organisieren konnte. Ich nehme an, dass er so sich auch wohler fühlte, ansonsten ich wohl selber aufs Dach gestiegen wäre.


    Unter dem Giebel meins Zimmers hielt ein Weidezaunisolator das eine Ende des Drahtes und ein Birnbaum in ca. 70m Entfernung stellte den zweiten Befestigungspunkt dar. Der Antennendraht führte anfänglich aber nicht in mein Zimmer, sondern musste im Estrich landen, da mein Vater kein Loch aus meinem Zimmer heraus dulden wollte. So musste ich jeweils in den Estrich, um zu experimentieren oder Radio zu hören. Auch in meinem Fall war Beromünster so stark, dass ich mit der empfangenen Energie ein 6V Glühlämpchen zum glimmen brachte und einen abgestimmten Kreis brauchte ich auch nicht, um Radio zu hören. Ein kleiner Lautsprecher (ich glaube der hatte 600 Ohm Impedanz) und eine parallel angeschlossene Germaniumdiode (OA81) Antenne und Erde brachte Beromünster gut hörbar in unseren Estrich.

    Aber ich wollte doch in meinem Zimmer Radio hören können! Das Fenster, von dem ich auf den Isolator blicken konnte war aus Holz und da schaffte ich es mit dem Handbohrer ein kleines Loch durch den Rahmen zu bohren, Fertig. Von da an war vor dem Einschlafen Radio angesagt, zum Leidwesen meines Bruders, mit dem ich das Zimmer teilte. Wir einigten uns, dass ich nur mit dem Kopfhörer die abendlichen Sendungen geniesse.


    Dann kam irgendeinmal wieder Weihnachten und unter dem Baum lag ein einfacher Radiobaukasten. Ich weiss heute nicht mehr, ob der Ursprung bei Philips oder bei Kosmos war. Eine gelochte Hartpapierplatte stellte die Grundlage dar. Mit Drahtschlaufen, über die eine Feder gespannt war, kontaktierte man die Bauelemente. Im Set lag ein AF116, ein NF-Transistor, eine Ferritantenne, Quetschdrehkondensator, Ohrhörer und ein paar Widerstände und Kondensatoren. Meine ersten Versuche nach der Anleitung klappten perfekt (z.B: Morsetrainer).


    Nur beim simplen Audion wollte es nicht so richtig funktionieren und ich wollte schon genervt aufgeben (mein Detektor funktioniert ja) als mein Vater zu Hilfe kam. Alles war richtig zusammengebaut, aber über einen nervigen Pfeifton aus dem Ohrhörer. Er holte sich sein Küchenradio (Graetz transistorisiert), stellte es daneben und stellte zufrieden fest, dass mein Radio schwingt. Dies war der Grundstein seiner und meiner Faszination der elektromagnetischen Wellen. So gut wie er Bescheid wusste, klärte er mich auf und von da an war Senden viel spannender als das Empfangen. Aus dem Audion wurde dann ein Oszillator, ein Grundig Tonbandgerät musste als NF Quelle herhalten und da sah man mich oder ihn immer wieder im Freien mit dem Radio herumlaufen, am Ausprobieren, wie weit der Sender arbeitete. Schnell wurde dann die Betriebsspannung von 9V auf 18V erhöht (4 Taschenlampen Batterien, weil ein Netzteil brummte zu stark). Und der AF116 segnete das Zeitliche. Er kaufte dann einen AF118 (waren teuer) und ein dünnes Alublech versuchte die Wärme vom Transistor abzuführen.


    Irgendeinmal erinnerte ich mich, dass die beste Antenne möglichst lang sein soll und beim Blick aus meinem Zimmerfenster sah ich die vorbeiführende Telefonfreileitung, die zum Hof meines Onkels führte. Selber hatten wir noch kein Telefon, aber jetzt eine gratis Antenne, die wirklich sehr lange war. Im ersten Schritt spannte ich einen Draht von meinem Zimmer zum Telefon Holzpfahl (ich will mit einer kürzeren Antenne probieren). Wieder war es mein Vater, der den Isolator oben ins Holz drehte und die Leiter anschliessend wieder beim Haus ablegte. Am kommenden Mittwoch dann schnappte ich mir die Leiter, stieg hoch und verband meine kurze Antenne mit einem 0.1uF Wickelkondensator direkt mit dem Telefondraht. Anfänglich erwähnte ich es nicht und probierte erneut, wie weit mein Sender zu hören war. Ich konnte gehen soweit ich wollte, immer wenn ich wieder in die Nähe einer Telefonleitung kam, hörte ich meinen Sender laut und deutlich. Der Vater hat ein Auto …. so musste ich es ihm erzählen, andernfalls hätte ich ihn wohl nicht dazu bewegen können, mit mir herumzufahren um die Reichweite zu testen. Er schmunzelte lediglich und meinte, gefährlich aber es könnte wirklich eine Verbesserung bringen. Die weiteste Distanz war die Fahrt in ein anderes Dorf hinter einem Hügel, das ca 10km Luftlinie von zu Hause entfernt lag. Das Signal in der Nähe von Telefonleitungen wurde immer schwächer war aber immer noch gut zu vernehmen. Meist war es nicht so einfach, eine «ruhige» Frequenz im Mittelwellenband zu finden, weil man ja sein Signal deutlich hören wollte. Er riet mir darauf, diese Versuche nicht mehr fortzusetzen, da es verboten sei und die Gefahr bestünde, dass ich einen anderen Sender stören würde.

    Dann, wieder an einem Mittwoch Nachmittag versuchte ich es nochmals und der Umstand wollte es, dass meine Tante telefonierte (damals war der Bedarf selten). Ja, wen wunderts, mein 1 Transistor AM Sender war auf einer Seite mit der Antenne (Telefonfreileitung) und auf der Anderen mit Erde verbunden. Die langsame NF auf der Leitung veränderte meinen Tx und schwups telefonierte meine Tante in diesem Moment drahtlos. Meine Reaktion war schnell. Mit viel Kraft riss ich von meinem Zimmerfenster den Anschluss an die Leitung runter und beendete diese Versuche für immer. Meinem Vater getraute ich nicht davon zu berichten, weil er mich ja gewarnt hatte.


    Wie ging es weiter, wenn kein MW Funk mehr erlaubt war? Zusehen wie mein Vater sich einen Tx mit einer EL84 Röhre aufbaute. Nun aber für den KW Bereich gedacht. Er war nicht der einzige der solche Dinge probierte. Irgendeinmal landeten wir im 27 Mhz Bereich, was auch schon damals verboten war. Bauanleitungen für RC Sender gab es genug und mit etwas Zusatz, bekam man auch die AM hin. Mein Vater kaufte sich dann einen Nordmende Globetrotter Amateur …, schliesslich musste man mit einem guten Empfänger seine Bauresultate prüfen können. Wir stellten dann fest, dass wir auf 27 MHz nicht die einzigen waren und so musste es kommen, dass wir Kontakt zu anderen HF faszinierten Leuten bekamen. Es war jeweils wie in einem Agentenfilm, wenn man zum ersten mal eine Person treffen wollte, mit der man sich schon einige Male «schwarz» unterhalten hatte. Man ging anfänglich immer auf Distanz, stellte das Auto nie in der Nähe des vereinbarten Treffpunktes ab und bevor man sich auf den Treffpunkt zubewegte suchte man die Umgebung intensiv nach vermeintlichen PTT Männern ab. Wenn soweit die Luft rein war, dann musterte man das Gegenüber misstrauisch aus Distanz und das Gegenüber tat dasselbe. Weil ich meist mit war und man davon ausging, dass ein PTT Beamter kaum mit einem Kind (ich denke ich war um die 13) zusammen auftauchen würde, klappte es immer. Ein paar Jahre später wurde der CB-Funk mit Einschränkungen freigegeben. Man durfte mit gekauften Geräten in AM und einer max. Leistung von 0.5W (ohne externe Antenne) auf 6 Frequenzen funken. Später wurden die Frequenzen und die Leistungen erhöht. Das mit den externen Antennen änderte sich mit der Verfügbarkeit von Geräten für’s Auto, da mittlerweile sich eh kaum einer an die Vorgaben gehalten hatte. Aber meist war es nur der Selbstbauer, der eine höhere Leistung mit einem Linearverstärker erreichte, bis dann aus Italien fertige Produkte auch in der Schweiz zu haben waren.


    Dies war mein Anfang mich für die Elektronik und die Technik zu interessieren. Heute ist mir die Faszination daran, ein Grundig Tonbandgerät und dieser Nordmende «Amateur» geblieben. Von meinem Vater ist noch ein Selbstbaugerät mit Transistorisiertem Oszillator und anschliessender Röhrenstufe geblieben.



    Wer meine Rechtschreibfehler gefunden hat, der darf sie behalten

    Wenn man sich mit Elektronik beschäftigt. Wer hat schon mal nicht …über einen Piratensender nachgedacht?

    Und ich dachte, das sei längt vorbei, jetzt wo das Abschalten des UKW Rundfunk‘s bereits geplant ist.

    Es funktionierte früher auch auf anderen, tieferen Frequenzen und ich staune, dass es dies heute noch immer gibt. Per Zufall stiess ich auf 5140 kHz auf das „Charleston Radio“.


    Wer noch einen Kurzwellenempfänger rumstehen hat, der kann es ausprobieren.

    Und wer glaubt, das Signal käme, wie früher oft der Fall aus Holland ,wird staunen. Vermutungen gehen dahin, dass der Sender irgendwo in der Schweiz stehen soll. Spannend finde ich es noch heute.


    hier noch ein Link auf Wumpus.


    viel Spass und tanzt nicht zu lange!

    Pius

    Richtig

    die Deklaration char* const schützt den Zeiger vor einer Veränderung innerhalb der Funktion, nicht aber deren Inhalt.

    ABER, da die Parameterübergabe auf dem Stack (oder in den Registern) als Kopie erfolgt ist nach einem Aufruf ohne char* const der beim Aufruf übergebene Zeiger nach wie vor unverändert, auch wenn der Zeiger in der Funktion verändert wurde.


    Ich vermute, du wolltest const char * benutzen, weil dies schützt den Inhalt. Die Quelle lsbString willst du vermutlich vor dem irrtümlichen reinschreiben schützen.Das Ziel, da wo das Programm das Resultat hinein schreibt, darf dann logischerweise nicht als

    const char * definiert sein.

     


    Da der Zeiger asl Kopie übergeben wird,darf man das Veränderndes Zeigers innerhalb der Funktion locker zulassen.


    hier noch mein Testbeispiel zum probieren. Du kannst einfach durch Entfernen oder Einsetzen der // die Sitation durchspielen und schnell sehenwann der Compiler Fehler meldet.

    schönen Abend

    Pius

    Kai, es sind einfache Beispiele, ja, aber es fehlt der Kommentar, der für weniger Geübte wichtig wäre. Vielleicht hoffte ich, dass jemand Murphy's Spruch über das Kürzen eines Programmes ernst nimmt und mir zeigt wie man weiter kürzen könnte.

    Diesen Code kann man sicher noch um eine Zeile kürzen. Der Parameter lsbString ist ja bereits ein Zeiger und weshalb sollte ich einen neuen Zeiger anlegen um pLeft zu bekommen?

    Gut, eine Zeile weniger mit dem Resutat, dass der Code nicht mehr so schön zu lesen ist (nur die Namensgebung).

    Dieses Beispiel zeigt recht gut die Fähigkeiten des Compilers Code zu optimieren, denn die Grösse blieb identisch. Daraus schliesse ich, dass der Compiler die Unnötigkeit von pLeft selber erkannte und ihn ersetzte. Als Kontrolle für meine Behauptung verglich ich die Code Grösse im Debug Modus. Ohne Optimierer zeigen sich deutliche Unterschiede der Grösse.


    Die Grösse eines Programmes ist ein Teil, die Ausführgeschwindigkeit ein Anderer. Da die ATmega Serie viele Register zur Verfügung hat, wollte ich im folgenden Code den Effekt ausprobieren, dem Compiler den Tipp zu geben, möglichst viele Variablen in den Registern zu behalten.



    Das Schlüsselwort register teilt dem Compiler mit, dass er versuchen soll die mit register markierten Variablen in Registern zu halten. Dies würde zu einem verkleinerten Code und zu einer höheren Ausführgeschwindigkeit führen.


    Auch hier hat der Optimierer vom Compiler ganze Arbeit geleistet und hat den Umstand längst vor mir erkannt und optimiert.

    Eben weil die CPU viele Register besitzt, werden die Übergabeparameter an Funktionen in Registern an die Funktion übergeben und erst wenn es nicht mehr reicht, wird der Stack als Zwischenablage benutzt. Dies erspart nicht nur Code sondern vor allem Ausführzeit.

    Bei der Parameterübergabe via Stack muss ein

    • Register mit dem Wert geladen werden
    • das Register auf den Stack gepush't werden
      Funktion aufrufen
    • und nach dem Aufruf der Funktion
    • wird Wert vom Stack in ein Register gepop't

    Kai hat sich in seinem Beispiel überlegt, dass der übergebene Quell-Parameter an die Funktion nur lesend behandelt wird und deshalb mit:

    char* const lsbString

    dem Compiler dies mitgeteilt.


    Nur, das const, direkt vor dem Bezeichner, schützt den Zeiger und nicht den Inhalt worauf der Zeiger verweist und reagiert mit dem Fehler: Error increment of read-only parameter 'lsbString'


    Ein Zeiger, der als Parameter an eine Funktion übergeben wird ist immer eine Kopie des Zeigers. Deshalb ist es meistens sinnvoll, den Zeiger selbst nicht mit const zu schützen, sondern die Daten auf die der Zeiger zeigt
    const char* lsbString Angewendet auf mein Funktionsbeispiel meldet der Compiler: Error assignment of read-only location '*lsbString'

    Das war das was du vermutlich erreichen wolltest. In meinem Fall, wo kein separater Speicher für die Manipulation vorhanden ist, darf weder der Zeiger, noch der Inhalt mit const ausgezeichnet sein, da ich sowohl den Zeiger selbst wie auch den Inhalt verändere.


    So, bis dahin habe ich alles gesagt was man nicht erzählen muss und habe eine Lösung gezeigt, wie man ein Spiegeln eines Stringinhalts auch erreicht. Wie sieht es aus, wenn man irgend welche Werte (nicht nur ASCII Zeichen) spiegeln möchte, resp. wenn man beide Lösungen benötigt?


    Damit beende ich meine Versuche zu diesem Thema.

    Super Kai


    das ist beinahe die fertige Lösung. Damit es dir aber nicht langweilig wird, habe ich einen anderen Lösungsansatz

    für deine Funktion benutzt: void reverseCode(char* const lsbString, char* const msbString) ;


    Man braucht ja nicht immer eine Kopie der gespiegelten Zeichenkette, deshalb übergebe ich nur einen Parameter, der natürlich nicht const sein darf.

    Ich finde es immer wieder spannend, dass auch auf einemATmega der Compiler den Umgang mit Zeigern recht effizient umsetzen kann.

    Bei jedem der fünf Beispiele habe ich oben die Code Grösse meines gesamtenTestprogramms markiert. Dies ist immer im Release mit Optimierung übersetzt.

    Den RAM Bedarf kann man sich selbst ausrechnen.

    Grüsse

    Pius


    Hallo Kai


    ich habe mir erlaubt dein Programm etwas genauer anzusehen und die Zeilen hier auf das was für meine Gedanken nötig ist zu reduzieren.
    Das ist dein Code, der so auch funktioniert, wobei ich das Resultat nicht nachgerechnet habe (du hast das sicher gemacht).

    Was mir aufgefallen ist, dass in jedem Schlaufendurchgang 2x die Länge des Strings bestimmt wird, die sich ja in der Schlaufe nicht verändert.

    Beim for() Konstrukt musste ich zuerst überlegen ... aber das geht so tatsächlich ist aber sicher für einen Anfänger etwas schwer lesbar.

    Das Fragment belegt 906 Byte Flash und 30 byte Ram.

    Nun ein Beispiel, das zwar für einen Anfänger auch nicht leicht zu lesen ist, aber zumindest das for() Konstrukt ist simpel.


    Den Schleifenblock kann man natürlich auch verständlicher schreiben und wieder temp. Variablen benutzen, aber damit wurde der RAM Bedarf auch etwas kleiner.


    In deinem Beispiel würde ich lediglich strlen() vor der Schleife, einmal erledigen.

    WIe sagte Murphy: " Jedes Programm lässt sich um eine Zeile kürzen, selbst wenn es nur aus einer Zeile besteht"

    Gruss

    Pius

    Der Preprocessor ist ein Werkzeug, das jeweils vor dem eigentlichen Compiliervorgang gestartet wird.

    Er hat die Hauptaufgabe, Makros aufzulösen und im Quelltext (da wo ein Makro dann benutzt wird) einzusetzen.

    Code
    1. #define hex2int(C) \
    2. (((C) >= '0' && (C) <= '9' ) ? C-'0' : ((C) >= 'A' && (C) <= 'F') ? C -'A' + 10 : -1)

    Das von Kai gezeigte Makro hat den Namen "hex2int()" und die darauffolgende Zeile wird im Code,überall da wo der Name hex2int() auftaucht

    eingesetzt.

    Wenn ich:

    #define MyName "Pius" // definiere


    und dann irgendwo im Code MyName benutze, wird das Stringliteral "Pius" eingesetzt.

    Gruss MyName