Home > Technologie > Avr Sicherung Grundlagen: Ausführen einer AVR mit einer externen Uhr

Avr Sicherung Grundlagen: Ausführen einer AVR mit einer externen Uhr

0
Advertisement

Avr Sicherung Grundlagen: Ausführen einer AVR mit einer externen Uhr

Sicherungen gehören zu den schwierigsten Themen, die ich während des Lernens über die Programmierung von Mikrocontrollern angetroffen habe. Auch nach der Suche und Lesung ausführlich, konnte ich immer noch nicht schaffen, meine Konzepte über sie klar. Aber dann fing ich an, über sie zu lernen, eins nach dem anderen. Das half ungeheuer. In diesem instructable werde ich versuchen, genügend Informationen über dieses Thema zur Verfügung zu stellen. Dies ist meine erste instructable, bitte weisen Sie auf meine Fehler, so dass ich verbessern kann.

Schritt 1: Was sind Sicherungen?

Avr Sicherung Grundlagen: Ausführen einer AVR mit einer externen Uhr

Wenn wir anfangen, über Sicherungseinstellungen zu lernen, ist die grundlegende Frage, die in unseren Köpfen entsteht, was genau sind Sicherungen? Und warum müssen wir uns die Mühe machen, sie zu lernen?
Ich hoffe, dass diese instructable helfen, eine Antwort auf diese Frage zu finden.
Zu Beginn haben AVR-MCUs im allgemeinen drei Speicherbereiche:
1) FLASH, der Programmcode gewidmet ist.
2) SRAM, das für Laufzeitvariablen verwendet wird.
3) EEPROM, das vom Anwendercode verwendet werden kann, um Daten zu speichern, die beim Schließen der MCU aufbewahrt werden müssen.
4) Nun bilden die Sicherungen einen vierten Speicherbereich für die Programmierung. Dies enthält einige Bytes, die diese Bits enthalten.

Um es einfach auszudrücken, sind Sicherungen ein Teil des Speichers des Mikrocontrollers, der für bestimmte Funktionen reserviert ist, die entscheidet, wie der Mikrocontroller arbeitet. Um sicher zu gehen, ist die Sicherung ein reservierter Abschnitt des EEPROM-Speichers in einem Mikrocontroller. EEPROM steht für elektrisch löschbare programmierbare Nur-Lese-Speicher. Das EEPROM ist eine nichtflüchtige Speicherform. Nichtflüchtige Mittel, sobald sie gespeichert sind, wird der Speicher auch nach dem Ausschalten der Stromversorgung beibehalten. Eine Sicherung ist ein EEPROM-Bit, das die Low-Level-Funktionen und Pinbelegungen steuert. Sicherungen sind vom Programm nicht zugänglich, sie können nur durch einen Chipprogrammierer geändert werden. Ich werde später erklären, was ich meine Low-Level-Features. Wie gesagt, Sicherungseinstellungen einmal getan kann nicht von dem Programm in irgendeiner Weise verwendet werden, bedeutet es, dass ein Programm, das in dem Mikrocontroller-Chip läuft, die Sicherungseinstellungen nicht ändern kann. Selbst wenn Sie einen "selbstprogrammierenden" Mikrocontroller verwenden, dh einen Mikrocontroller, der es ermöglicht, dass Bootloader-Software darauf läuft, um das Programm in seinen Flash-Speicher zu laden, kann u die Sicherungsbits nicht ändern.
Obwohl ich bin über das gesamte Thema kurz, ich möchte vor allem zeigen, wie die Sicherungen für einen avr-Mikrocontroller, um es mit einer externen Uhr laufen.

Schritt 2: Warum sind Programmiersicherungen notwendig?

Sicherungen steuern die Funktionsweise des Mikrocontrollers, so dass die Änderung der Sicherungseinstellungen ermöglicht, den Mikrocontroller gemäß unseren Anforderungen zu ändern und zu modifizieren. Es gibt wenige Parameter im Chip, die verwendet werden, um es zu konfigurieren, bevor es für externe Umgebung verwendet werden kann. Diese Parameter werden mit Hilfe von Sicherungsbits eingestellt. Mit anderen Worten bestimmt das Sicherungsbit das Verhalten des Chips, sei es über einen Bootloader, über die Geschwindigkeit und Spannung, die er ausführt, die Watchdog-Timer-Bedingungen, die Speicherschutzmodi, die Startoptionen, die Taktquelle und die Teilerprogrammierung Optionen, Brown-out-Erkennung usw.
Der Hauptvorteil von Sicherungsbits ist somit klar, dass der Mikrocontroller je nach Bedarf konfiguriert werden kann. Es gibt keine Möglichkeit, das Taktverhalten durch den Programmcode zu ändern. Sicherungsbits unterscheiden sich stark zwischen verschiedenen AVR-Varianten.

Schritt 3: Wie programmiert man Sicherungen?

Vor dem Start müssen wir die Sicherungsbits von Atmega8 und den Anfangswert von ihnen nachschlagen. Seitdem mache ich diese animierbar vom Handy, habe ich eine Tabelle mit den erforderlichen Angaben gemacht. Ich habe es mit Google Sheet Android App. Ich finde keinen Weg, um sie zu Bildern zu konvertieren. Also hier im Beitrag der Link.

Sicherung Bits von Atmega 8 (die eine im mit in diesem Tutorial)

https://docs.google.com/spreadsheets/d/1haE2Sprdsa-NgKYsOQlwI99WHfGqCItJutG4h-MnOus/edit?usp=docslist_api

Nun gehen wir auf die Details, wie die Sicherung Bits in Ihrem AVR Programmierung je nach dem jeweiligen Programmierer Sie verwenden. Zuerst sollten wir das Handbuch des Programmierers über die Details konsultieren. Wenn Sie zum Beispiel einen STK600 mit AVR Studio verwenden, verfügt das STK600-Fenster über eine Registerkarte Sicherungen, in der Sie die verschiedenen Bits festlegen und die Sicherungsbits programmieren, überprüfen oder lesen können.

(Ich bin mit einem Atmega 8 für mein Beispiel. Ich meist Atmega 8 verwenden, wie es billig ist und enthält genug Speicher für die meisten meiner Projekte).

Die meisten Leute haben Verwirrung zu diesem Thema. Um es ganz einfach zu sagen, gibt es nur zwei Arten von Sicherungen, hohe Sicherung (hfuse) und niedrige Sicherung (lfuse), einige Mikrocontroller haben eine zusätzliche Sicherung Byte bekannt als erweiterte Sicherung (efuse).
Der verwirrendste Teil kommt hierher. Der unprogrammierte Zustand eines Sicherungsbits ist logisch hoch oder 1, das Programmieren irgendeines Sicherungsbits wird seinen Pegel auf logisch niedrig oder 0 ändern.

"Eine Ausnahme ist nur, dass die Sicherungsbits im Zusammenhang mit dem Bootloader nicht von der Software aus zugänglich sind, sondern im Programmiermodus mit dem Parallel / Seriell-Programmierwerkzeug zugänglich sind."

Wie im obigen Bild beschrieben, wird die Sicherung zusammen mit dem Bitwert und der Bitnummer angezeigt. Einige Funktionen der oben genannten Sicherungen sind: -
(Ich habe ein Atmega 8-Datenblatt für für das Diagramm, das ich gepostet).

Hohe Sicherungsbyte (hfuse)

1) Das erste Bit ist BOOTRST, das standardmäßig nicht programmiert ist (1). Wenn dieses Bit programmiert ist (0), startet es nach dem Einschalten oder Zurücksetzen des Gerätes das Programm, das aus dem Bootloader-Speicherabschnitt ausgeführt wird. Einfach, wenn ein Bootlaoder zum Blinken der MCU verwendet wird, muss dieses Bit aktiviert sein. Wenn Sie einfach laden Sie Ihre Firmware mit ISP-Programmierer, dann lassen Sie dieses Bit unberührt.

BOOTSZ0 und BOOTSZ1 sind auch wichtig, wenn Bootloader verwendet wird. Diese Bits ermöglichen die Auswahl der Größe des Bootloaderabschnitts.

2) Das nächste Bit ist EESAVE. Wenn diese Sicherung programmiert ist (durch Schreiben von 0), bleibt der EEPROM-Speicher während des Chip-Löschvorgangs unberührt. Manchmal kann diese Sicherung hilfreich sein. Zum Beispiel, wenn Sie einige wichtige Daten im EEPROM-Speicher wie Kalibrierungswerte zu halten und müssen Programm aktualisieren, ohne diese Daten zu verlieren, dann programmieren Sie dieses Bit. Aber wenn Sie immer sauberen Chip nach dem Löschen wollen, dann lassen Sie dieses Bit unberührt (auf 1 gesetzt).

3) WDTON-Bit wird verwendet, um zunächst den Watchdog-Timer einzustellen. Wenn Sie dies programmieren, wird Ihr Watchdog-Timer gezwungen sein, immer auf und halten Sie zurücksetzen Chip periodisch, wenn keine besondere Vorsicht geboten wird. Wenn keine Notwendigkeit für Watchdog, dann lassen Sie es unprogammed.

4) Das SPIEN-Bit wird verwendet, um den seriellen Programmiermodus ISP zu deaktivieren. Tatsächlich ist es nicht möglich, dieses Bit aus dem seriellen Modus zu deaktivieren. Es muss durch Hochspannungsprogrammierung erfolgen.

5) Gleiche Situation ist mit RSTDSBL Bit. Es wird verwendet, um die Reset-Funktionalität zu deaktivieren, die den RESET-Pin in I / O umwandelt. Im Allgemeinen wird dies nicht empfohlen. Und es kann nicht deaktiviert werden, wenn das Gerät im ISP-Modus programmiert ist.

6) Das CKOPT-Bit wird zur Auswahl der Oszillatoroptionen verwendet.

Niedrige Sicherungen (lfuse)

Lets sieht bei niedrigem Byte von Sicherungen.

1) Eine Gruppe von vier ähnlichen Bits, die CKSEL0 bis CKSEL3 sind, werden verwendet, um Taktoptionen auszuwählen. Standardmäßig sind die Sicherungen CKSEL0 bis CKSEL3 so eingestellt, dass der interne 8MHz RC-Oszillator ausgewählt wird. Aber wir wissen, AVRs können auf unterschiedliche Weise getaktet werden:

* Kalibrierter interner RC-Oszillator (Standard 8MHz)
* Externer RC Oszillator
* Externer Kristall oder Kristallresonator
* Externer Niederfrequenzkristall
* Externe Taktsignalquelle

Ich habe über SUT (Start-up-Zeit) im nächsten Schritt erklärt.

Ich würde darüber schreiben, wie diese Werte auf unseren eigenen, später in diesem instructable zu berechnen.

2) BODEN- oder Brown-out-Erkennungsaktivierungsbit ermöglicht die Brown-out-Detektion. Der Brownout-Detektor ist im Allgemeinen deaktiviert (1). Programmierung dieses Bit low (0) entschlüsselt die Erkennung. Der Grund für dieses Merkmal ist, daß - wenn die Versorgungsspannung niedriger als die von dem Mikrocontroller benötigte Spannung wird, sie sich unregelmäßig verhält. Es kann beginnen, seinen eigenen Speicher zu löschen oder zufällige Abschnitte von seinem Blitz laufen lassen. Um dies zu vermeiden, wurde eine Brownout-Erkennungsfunktion bereitgestellt. Sobald die Versorgungsspannung niedriger als der eingestellte BOD-Pegel wird, schaltet der Chip sicher. Wenn die Versorgungsspannung wieder normal wird, beginnt der Chip erneut.

BODLEVEL- Mit diesem Bit können wir den Brown Out Detection Level einstellen. Zum Beispiel, wenn der Mikrocontroller auf 3,3 Volt läuft, können wir den Brown Out Detection Level auf 2,7 Volt einstellen, so dass bei Unterschreitung der Versorgungsspannung der Microcontroller sicher abgeschaltet wird.

Ein interessantes Merkmal hier zu beachten ist, haben andere AVR-Mikrocontroller wie Atmega 32 einige Sicherungen anders wie in der hohen Sicherung Byte haben sie OCDEN und JTAGEN und in Atmega 328p gibt es DWEN etc.

Ich entschuldige mich für die Bilder von niedriger Qualität, weil ich diese aus meinem Android machen.

Schritt 4: Einblick in Uhren und Oszillatoren.

Avr Sicherung Grundlagen: Ausführen einer AVR mit einer externen Uhr

Ja es stimmt, dass es viele Fuse-Taschenrechner-Anwendungen im Internet zur Verfügung. Aber ich persönlich dont Gefühl wie mit es, bevor Sie gründlich über das Thema. Jetzt ist es die Zeit, um zu lernen, über die Art und Weise zu programmieren Sicherung Bits auf unsere eigenen. Ich schreibe, wie man verschiedene Taktgeberausrüstungen entsprechend unseren Notwendigkeiten vorwählt und ändert. Bevor wir mit der Programmierung beginnen, müssen wir ein paar Begriffe kennen lernen.

Was ist eine Uhr?

Eine Uhr ist einfach ein Gerät, das die Zeit verfolgt, es Art gibt Ihnen einen Beat zu bewegen. Die Uhr an der Wand zählt beispielsweise in Sekundenschritten. Ein Metronom für Ihr Instrument könnte Ihnen einen Schlag jede halbe oder volle Sekunde geben. Die Häufigkeit eines Taktes (Zyklen pro Sekunde) wird in Hertz (Hz oder Zyklen / Sekunde) gemessen. Ebenso hat der Atmega auch eine Uhr im Inneren, und seine Geschwindigkeit bezieht sich direkt auf die Anzahl der Befehle, die er pro Sekunde ausführen kann (bei jedem Tick / Zyklus der Uhr). Die Standard-Taktrate, die mit den meisten AVRs geliefert wird, beträgt 1 MHz (1 Million Zyklen pro Sekunde).

Die einzige Störung mit dem internen Oszillator besteht darin, daß seine Frequenz sich mit der angelegten Spannung und mit der Temperatur ändert, die bei anderen Taktquellen nicht der Fall ist.

Wie können wir eine Taktrate einstellen?

Wir haben zwei Möglichkeiten:
Verwenden Sie die interne oder verwenden Sie eine externe Quelle. Wenn wir einen Code schreiben, der grundlegende Dinge macht und keine Präzisionstiming erfordert, sollte die interne Uhr genügen. In jedem anderen Fall, insbesondere für die Kommunikation (zB unter Verwendung der UART), ist das Timing kritisch. In diesem Fall benötigen wir eine alternative Methode, so dass wir Dinge wie Kristalle, Resonatoren, Oszillatoren und Uhren verwenden. Sie sind alle geeignet, um den Beat, den wir suchen, in der Frequenz, die wir suchen, aber die häufigsten unter Hobbyisten sind Kristalle und Resonator zu produzieren. Wir werden mit einem Kristall für dieses Tutorial.

Zur Verwendung des Kristalls benötigen wir auch zwei keramische 18-22 pF Kondensatoren. Ein Resonator hingegen hat die Kondensatoren und den Kristall in einem Gehäuse eingebaut, wodurch es ein wenig kompakter wird. Das ist ziemlich viel nur der Unterschied, aber es kann subtile Unterschiede bei der Einstellung Sicherung Bits, wenn ein Resonator verwendet wird. Oszillatoren benötigen eine externe Stromquelle zum Betrieb und haben gewöhnlich vier Pins.

Startzeit (SUT)

Clock-Quellen benötigen in der Regel ein wenig Zeit zum Aufwärmen und geben uns ein zuverlässiges Signal, wenn der Mikrocontroller eingeschaltet ist. Dies wird Startzeit genannt.

Schritt 5: Programmimg die Taktsicherung auf unseren Selbst!

Avr Sicherung Grundlagen: Ausführen einer AVR mit einer externen Uhr

Avr Sicherung Grundlagen: Ausführen einer AVR mit einer externen Uhr

Sie haben bereits eine grobe Grundidee über Sicherungsbytes und wie sie funktionieren und welche Funktionen sie in einem Mikrocontroller (hier Atmega 8) haben. Jetzt sind wir auf der Programmierung zu bewegen. Ich verwende meistens Winavr für diesen Zweck, also werde ich nicht in der Lage sein zu erklären, wie es mit extremem Brenner und anderen getan werden kann.

Wir wissen jetzt, dass wir, weil diese die Bits, die die Zeiteinstellungen zu steuern sind, müssen CKOPT (Bit-Nummer 4) aus Hoch Sicherung Byte und ändern Werte von CKSEL0, CKSEL1, CKSEL2, CKSEL3 und SUT0, SUT1 von niedrigen Sicherung Byte ändern. Da wir nur die Uhreneinstellungen konfigurieren, werden andere Sicherungseinstellungen so belassen, wie sie sind. Werden andere Sicherungsbitwerte auch aus Versehen geändert, kann der Mikrocontroller gebräunt werden.

Diese Kalkulationstabelle enthält Optionen für die niedrigen Sicherungsbits CKSEL3, CKSEL2, CKSEL1 und CKSEL0. Dies wird uns helfen zu wählen, welche Clock-Quelle wir für unsere Mikrocontroller verwenden müssen. Ich habe dieses Google-Blatt aus dem Datenblatt von Atmega8 gemacht, bitte halten Sie es offen mit dem Tutorial
Der Link dafür ist hier -
https://docs.google.com/spreadsheets/d/11IjfDRkWHNW0dj0FEKCDzZMcXTvDuv1Q4jMPNpIYck0/edit?usp=docslist_api

Also, da ich den Mikrocontroller mit einem externen Kristall betreibe, werde ich die Werte CKSEL3-CKSEL0 verwenden, die dieser Option entsprechen. Aber wir sehen, dass die Werte zwischen dem Bereich 1111-1010 liegen. Um den exakten Wert zu wählen, müssen wir an einer anderen Tabelle nachschlagen, die die Frequenzwerte enthält, die wir für den Mikrocontroller benötigen. Hier ist eine Tabelle, die CKOPT Wert und CKSEL3-1 Werte entsprechend der frequency.Here enthält die Link- https://docs.google.com/spreadsheets/d/11rt148hgXhwvduZ4aEDTvDKYT3pGxDHP5RUNvuYWNPc/edit?usp=docslist_api

Von hier aus wähle ich den programmierten CKOPT-Wert (0). Der programmierte CKOPT-Wert wird für Hochfrequenzoperationen verwendet. Ich bin auch die Wahl CKSEL3-1 Werte als 111.

Nun brauchen wir Optionen, aus denen wir die Werte von CKSEL0 und SUT1 und SUT0 auswählen können. Hier ist die Link- https://docs.google.com/spreadsheets/d/1028hW05QgAiBQzUzOMjDfJ1VCY8tcOMtgQAsnH5xOWw/edit?usp=docslist_api

Wenn Sie die Tabelle nachschlagen, finden Sie eine Liste der Optionen für die Startzeit und ihren entsprechenden Bitwert. Ich bin die Wahl Kristalloszillator mit 65 Millisekunden Startverzögerung Zeit, weil ich bin mit einem Krya-Oszillator hier. Entsprechend der Tabelle ist der CKSEL0 Wert 1, SUT1 Wert 1 und SUT0 Wert 1.
Da wir Quarzoszillator verwenden und Zeit entsprechend dem crytal Oszillator starten, unsere CKSEL3-CKSEL0 Werte werden 1111.

Damit sind unsere Auswahlmöglichkeiten abgeschlossen.

Schritt 6: Zusammenfassen.

Der vorhergehende Schritt könnte verwirrend und außer Betrieb sein, aber dieser Schritt wird ein klares Bild des gesamten Prozesses geben.

Was wollen wir eigentlich tun?
Wir haben einen Mikrocontroller (hier Atmega 8). Es läuft auf der Standardfrequenz, mit der es ausgeliefert wurde. Wir wollen es auf 16Mhz externen Kristall laufen.
Also, was genau zu tun? Nur die Sicherungsbitwerte sehen und ändern. Wir sollten auch nicht vergessen, dass 1 unprogrammiert bedeutet und 0 bedeutet programmiert.

Jetzt sitzt der Chip mit seiner Standard-Sicherungsbyte-Konfiguration.

Zunächst müssen wir entscheiden, wie der Mikrocontroller laufen? Der Einfachheit halber nehmen wir, dass wir nur drei Optionen haben - externer Kristall, externer Resonator oder interner Oszillator.

Wir fanden heraus, dass Kristall-Oszillator eine zuverlässige Zeit halten Quelle und wir dont mind Ausgaben ein wenig für zwei 22pf Kondensatoren. Unsere Wahl ist nun klar, wir wollen den avr-Chip mit einem externen Kristall laufen lassen.

Aber wo bekommt man die Optionen für die Wahl der externen Kristall-Oszillator?

Die Optionen sind bei CKSEL3 bis CKSEL0 im Low-Sicherungsbyte verfügbar.
Wir haben uns in der Tabelle im Datenblatt des Mikrocontrollers zur Verfügung gestellt und fand heraus, dass es eine Option ist cermaic Resonator oder crytal Oszillator genannt. Wir wollen das sicher, also notieren wir die Bitwerte von CKSEL3-CKSEL0, die damit verbunden sind.

Hmm, aber es gibt eine Reihe von Werten für die, 1111-1010. Welches man speziell nehmen? Und wie die Frequenz des Kristalloszillators spezifizieren? Offensichtlich gibt es viele Frequenzen für Kristalle, wir wollen es nur auf 16Mhz laufen.

Dazu schauen wir zu einem anderen Tisch auf, der die Häufigkeit und den empfohlenen Bereich von Kondensatoren enthält, die mit ihnen verwendet werden sollen.
In dieser Tabelle finden wir, dass 16Mhz ist größer, dass 1 Mhz, so dass wir diese Option wählen. Der Bitwert, der mit CKOPT für unsere Wahl assoziiert wurde, ist 0 und zusammen mit diesem haben wir 111 für die Werte von CKSEL3-CKSEL1 gewählt.

Jetzt sind wir sicher, dass wir den avr-Chip mit einem externen Crytal von 16Mhz laufen.

Wir lesen gerade einen instructable über Fusebits und es sprach von einiger Zeit Sachen starten, die die crytal zum Aufwärmen braucht und starten relaible Signale zu geben.

Wie finden wir es?
Wir finden es wieder in einer Tabelle, die in der gleichen instrustruable zur Verfügung gestellt. Diese Tabelle enthält nun den Wert CKSEL0 und den Wert SUT1 und SUT0. Wir wählen die Möglichkeit, Startzeit von 65 Millisekunden und damit unsere entsprechenden Bit-Werte sind CKSEL0 -1, SUT1- 1, SUT0- 1.

Wir haben damit erfolgreich den Satz Low Sicherungsbyte ausgewählt.

Anfänglich wurde die hohe Sicherungs-Byte-Einstellung -

7) RSTDISBL-1
6) WDTON - 1
5) SPIEN -0
4) CKOPT -1
3) EESAVE -1
2) BOOTSZ1 -0
1) BOOTSZ0 -0
0) BOOTRST -1

Jetzt müssen wir sie ändern -

7) RSTDISBL -1
6) WDTON -1
5) SPIEN -0
4) CKOPT -0
3) EESAVE -1
2) BOOTSZ1 -0
1) BOOTSZ0 -0
0) BOOTRST -1
Das ist 11001001 in binär oder C9 in hexadezimal. Wir ändern nur den CKOPT von 1 auf 0 und lassen alle anderen unberührt.

Jetzt für das niedrige Sicherungsbyte, es war -

7) BODLEVEL -1
6) BODEN -1
5) SUT1 & ndash; 1
4) SUT0 -0
3) CKSEL 3 -0
2) CKSEL2 -0
1) CKSEL1 -0
0) CKSEL0 -1

Wir ändern es zu-

7) BODLEVEL -1
6) BODEN -1
5) SUT1 & ndash; 1
4) SUT0 -1
3) CKSEL3 -1
2) CKSEL2 -1
1) CKSEL1 & ndash; 1
0) CKSEL0 -1

Das ist 11111111 in binär oder FF in hexadezimal.
Jetzt, da wir fertig sind, alles zu tun, müssen wir nur diese neuen Einstellungen in den Mikrocontroller zu verbrennen.
Mit avrdude-Syntax sollte es

Avrdude -c usbasp -p m8 -U lfuse: w: 0b11111111: m -U hfuse: w: 0b11001001: m

Aber es ist besser, dies in hexadezimalen, wie-

Avrdude -c usbasp -p m8 -U lfuse: w: 0xff: m -U hfuse: w: 0xC9: m

Die Standardwerte für den internen 1Mhz-Oszillator Atmega8 waren -

Avrdude -p atmega8 -c usbasp -U lfuse: w: 0xE1: m -U hfuse: w: 0xD9: m

Schließlich endet das Gesamtverfahren hier. Obwohl dies nicht vollständig erklärt, über Sicherungen und wie sie zu programmieren, gibt dies definitiv eine grobe Idee für Anfänger auf, was Sicherungen und wie sie behandelt werden sollen.

Glückliches DIY-ing :)

Related Reading