Vor einiger Zeit nahm er an einer Diskussion über das DIY-Projekt einer Matrix-LED-Uhr teil.
Und was mich überrascht hat - die alte monochromatische 8x8 LED-Matrix mit einem Schritt von 5 Millimetern wurde als Anzeigegerät verwendet. Darüber hinaus wurden komplexe Leiterplatten für sie gezüchtet, eine weiche dynamische Anzeige wurde gemacht. Und dies zu einer Zeit, in der fertige 64x32-Farb-LED-Panels mit einem Abstand von 3 mm seit langem zu einem Preis von 10 bis 20 US-Dollar erhältlich sind. Das allgemeine Sortiment solcher Panels ist sehr groß und hat einen Pixelabstand von 2 bis 10 mm und nahezu jede Größe.
Gleichzeitig ist die Verwendung solcher Panels in DIY-Designs ziemlich schwierig - vorgefertigte Controller kosten ziemlich viel Geld und haben keine normale API. Es ist ziemlich schwierig, das Panel auf Mikrocontrollern, die üblicherweise im Heimwerkerbereich verwendet werden, ziemlich schnell zu scannen. Darüber hinaus müssen die Zeitintervalle mit hoher Genauigkeit eingehalten werden - sonst beginnt eine merkliche Ungleichmäßigkeit der Helligkeit.
Bei
Adafruit gibt es gute Lösungen, die jedoch alle recht teuer und komplex sind.
Nach einigem Überlegen kam der Gedanke - warum nicht ein extrem preiswertes Board herstellen, das eine Brücke zwischen einem gewöhnlichen Penny Board wie einem Arduino und einem LED-Panel darstellt? Nach ein paar Monaten der Aufregung war etwas Arbeitendes geboren.
Dieser Artikel beschreibt die zweite, verbesserte Version des Controllers.
Herausforderung
Als Grundaufgabe wollte ich in der Lage sein, ein Panel mit einer Gesamtgröße von mindestens 64 x 64 zu steuern und gleichzeitig mindestens in Hochfarbe (RGB565) arbeiten zu können, während eine akzeptable Bildschirmaktualisierungsrate (mindestens 50 Hz) beibehalten wird. In der ersten Version des Controllers wurde die Grundaufgabe vollständig implementiert, aber es entstand die Idee, die Aufgabe mit einer anderen, sehr vielversprechenden Methode zu implementieren, aus der die zweite Version hervorging.
Grundlegende Erklärung des Designs eines typischen LED-Panels
Eingabe HUB75-Schnittstelle:
An jedem Farbeingang befindet sich eine Kette von Registern vom Typ HC595 (jedoch spezielle 16-Kanal-Versionen für LEDs). Es gibt so viele Register, die für die Breite des Panels ausreichen. Shred-, Parallelstart- und Ausgabeberechtigungen sind allen Registern gemeinsam. Die Eingänge ABCDE - dies ist die Wahl einer Serie - gehen an einen herkömmlichen Decoder.
Arbeitsprinzip:
- Stellen Sie die Daten auf RGB-Eingänge ein und klicken Sie auf die Schaltfläche CLK. Wiederholen, bis die gesamte Zeile geladen ist
- Schalten Sie die Ausgänge OE = 1 aus (damit keine Störungen auftreten).
- Geben Sie dem Decoder die Nummer der geladenen Zeile
- Klick parallel laden LAT - Leitungsdaten werden in Ausgangsregister übertragen
Freigabeausgänge OE = 0 - Wiederholen Sie dies für die nächste Zeile
Das ist eine klassische dynamische Anzeige. Es ist klar, dass wir mit dieser Methode in einem solchen Zyklus nur jede bestimmte LED ein- und ausschalten können.
Um Helligkeitsabstufungen mit klassischem PWM zu erhalten, muss ein solcher Zyklus N-1 Mal wiederholt werden, wobei N die Anzahl der Helligkeitsabstufungen ist (256 für RGB888). Und da es gleichzeitig immer noch flackert - das alles muss sehr, sehr schnell gehen.
Es gibt eine Problemumgehung - Bit Angle Modulation (BAM). In diesem Fall ist die Glühzeit in jedem Zyklus proportional zum Gewicht des angezeigten Bits. Das heißt, für RGB888 benötigen Sie nur 8 Anzeigezyklen. Ein bisschen detaillierter hier .
Die erste Version des Controllers verwendete klassisches PWM, wodurch die Anzahl der Scan-Zyklen streng begrenzt wurde. In der zweiten Version ist die BAM implementiert, was zu einem enormen Geschwindigkeitsgewinn führte.
Implementierung
Es war ziemlich offensichtlich, dass ein herkömmlicher Mikrocontroller nur kleine Panels zieht - große haben einfach nicht genug Geschwindigkeit. Daher ist CPLD oder FPGA hier unverzichtbar - es ist physikalisch unmöglich, auf kostengünstigen Mikrocontrollern Dutzende MB / s zu erzeugen.
Als Speicher wurde ich im IXBT-Forum vom sehr interessanten FIFO-Speicher Averlogic AL422B empfohlen, der über ca. 400 KB Speicher verfügt und mit Frequenzen bis zu 50 MHz arbeiten kann.
In Anbetracht der Tatsache, dass meine Hauptanforderung die maximal niedrigen Kosten der Komponenten war, so dass der fertige Schal für hausgemachte Hersteller zugänglich war, wurde die Altera EPM3064 - CPLD mit 64 Makrozellen ausgewählt. Gleichzeitig erlaubt eine so kleine Anzahl von Makrozellen keine dynamisch konfigurierbare Karte - die Konfiguration muss direkt in CPLD kompiliert werden.
→ Die resultierende Schaltung liegt hier
Details:
- CPLD EPM3064ATC44-10 - Der Preis für Ali liegt bei 13-15 USD für ein Dutzend
- FIFO RAM AL422B - Der Preis für Ali liegt bei 15 US-Dollar pro Dutzend
- 50MHz Quarzoszillator. Die Karte ermöglicht die Installation in DIP14 / DIP8 / 7050-Gehäusen. Der Preis für Ali liegt bei 6 bis 7 US-Dollar pro Dutzend
- 3,3-V-Stabilisator im SOT223-Gehäuse. Preis in Chip und Dip - 40r pro Stück
- IDC-10MS-Anschluss. Preis in Chip & Dip - 3 p / Stück
- IDC-16MS-Anschluss. Preis in Chip & Dip - 8 r / Stück
- IDC-14MS-Anschluss. Preis in Chip & Dip - 7 r / Stück
- Kondensatoren 1 Mikrofarad 0805 - 8 Stück von ca. 1 U / Stück
- Kondensator 0.1uF 0805 - ca. 1 U / Stück
- Widerstand 10k 0805 - ein Penny
Insgesamt im Detail erhalten Sie 1,5 + 1,5 + 0,7 = 3,7 $ und 40 + 3 + 8 + 7 + 8 * 1 + 1 = 67 p. Alles zusammen innerhalb von 5 Dollar - ein Penny.
→ Das Original-Board-Image finden Sie hier
→ Gerber- Dateien für die Bestellung vorbereitet
Das Board ist für die erste Version vorbereitet, in der es keine RE-Kontrolle gab. Um es mit der zweiten Version zu verwenden, müssen Sie die Brücke zwischen den Klemmen 23 und 24 von AL422B abschneiden und die Drähte von Klemme 28 von EPM3064 (sie wird zum Klemmenblock gebracht) zu Klemme 24 von AL422B werfen.
Vergessen Sie beim Löten der Platine nicht, die Steckbrücken auf der Rückseite der Platine zu löten.


Berechnungen
Die Berechnungen der erforderlichen Parameter sind recht kompliziert.
Tatsache ist, dass in der Steuerung zwei Prozesse parallel ausgeführt werden - Laden der Daten der nächsten Zeile / Anzeigen einer bereits geladenen Zeile.
Prozesse beginnen gleichzeitig, enden jedoch zu unterschiedlichen Zeiten, sodass ein schnellerer Prozess auf den Abschluss eines längeren Prozesses wartet.
→ Für die Berechnung wurde ein Excel-Tablet erstellt
Ausgangsdaten:
- CRYSTAL_FRQ (MHz) - Generatorfrequenz (50 MHz)
- PIXEL_COUNT - Die Anzahl der Pixel in der Download-Leiste. Weitere Details im Schaltbereich.
- RGB_INPUTS - Die Anzahl der RGB-Eingänge, die in der HUB75E-Schnittstelle des verwendeten Panels verwendet werden. 1 oder 2
- BYTES_PER_PIXEL - Bytes pro Pixel. In unserem Fall immer 3 - RGB888
- SCAN_LINES - Anzahl der Scanlinien im verwendeten Bereich. 16.08.32
Ausgewählte Parameter:
- PRE_DELAY - Verzögerung vom LAT-Signal bis zum Einschalten der OE, in Ticks gesetzt
- PRESCALER - Prescaler für den Hauptzähler. Das heißt, wenn die Preisliste 8 ist und das Gewicht des aktuellen Bits 4 ist, wird OE für 8 * 4 = 32 Zyklen eingeschaltet
- POST_DELAY - minimale Verzögerung vom Ausschalten der OE bis zum nächsten LAT-Signal, in Ticks gesetzt
Zum Beispiel haben wir ein 32x32-Panel mit 8 Scanlinien und 2 RGB-Eingängen. Ein solches Panel verfügt über zwei HUB75E-Anschlüsse, dh physisch handelt es sich um zwei 32x16-Panels. Wir verbinden diese Panels in Reihe, dh logischerweise sieht dieses Panel wie 64x16 aus.
PRE_DELAY und POST_DELAY sind Austastintervalle vor und nach der Ausgangsfreigabe (OE), damit die Multiplexer die Ausgänge schalten und die Tasten öffnen / schließen können. Ohne sie gibt es „Tricks“ vom Brennen von Pixeln in benachbarte Zeilen. Die Werte werden experimentell für ein bestimmtes Panel ausgewählt. In der Regel sind 15 Maßnahmen ausreichend (in Maßnahmen festgelegt).
Dies wirft die Frage auf, wie man Prescaler wählt - wie man es wählt.
Ein niedriger Vorteilerwert ergibt eine kurze Bildanzeigezeit, verringert jedoch die Gesamthelligkeit. Der hohe Wert des Vorteilers erhöht die Anzeigezeit des Rahmens, dh wenn er aufgezählt wird, flackert er auf dem Bildschirm.
Versuchen wir es mit PRESCALER = 1
Wir bekommen:
OE_EFFICIENCY - 8,3%, d. H. Das Panel arbeitet nur mit 8,3% der möglichen maximalen Helligkeit
FRAMES_PER_SECOND - 2034 fps - aber die Bildwiederholfrequenz des Bildes wird enorm sein - mehr als 2000 fps.
Der Helligkeitsverlust ist bereits sehr groß.
Versuchen wir es mit PRESCALER = 16
Wir bekommen:
OE_EFFICIENCY - 72,9%, dh das Panel arbeitet mit 72,9% der möglichen maximalen Helligkeit
FRAMES_PER_SECOND - 1117 - und die Bildwiederholfrequenz des Bildes ist sehr gut - mehr als 1000 fps.
Nun, es ist ganz normal - ein Wirkungsgrad von mehr als 50% ist ganz normal und die Bildrate ist sehr gut.
Die allgemeine Faustregel lautet, dass PRESCALER etwa achtmal kleiner ist als das Produkt PIXEL_COUNT * RGB_INPUTS
Nun, zähle weiter und überprüfe.
LED-Panels wechseln
Alle Panels sind in Reihe geschaltet. Anschlussplan: zuerst von rechts nach links, dann von unten nach oben. Das heißt, zuerst verbinden wir die Horizontalen in Reihe, dann den Ausgang der unteren Reihe mit dem Eingang der zweiten Reihe von unten usw. in die oberste Reihe.
Der Controller klammert sich an das untere rechte Feld.
Es gibt Panels mit zwei Eingangs- und zwei Ausgangsanschlüssen. Solche Platten sind im Wesentlichen nur eine mechanische Anordnung von zwei Platten vertikal. Kommutiert als zwei unabhängige Panels.
Nach dem Zusammenbau müssen wir die Gesamtlänge der Kette in Pixel berechnen - dazu sehen wir - wie viele Panels sich insgesamt in der Kette befanden, und diese Zahl mit der Breite des Panels in Pixel multiplizieren. Diese Nummer muss dann während der CPLD-Konfiguration in den Wert PIXEL_COUNT und in den Zeitrechner eingegeben werden.
FPGA-Firmware
Alle notwendigen Dateien befinden sich auf Github . Sie müssen direkt mit dem Ordner herunterladen.
Nach der Registrierung müssen Sie Quartus II 13.0sp1 von der Altera-Website herunterladen und installieren. Sie müssen genau diese Version herunterladen - neuere Versionen unterstützen die MAX3000-Serie nicht mehr. Es ist nicht notwendig, es zu brechen - die (kostenlose) Web Edition-Version reicht aus. Aktivieren Sie beim Herunterladen unbedingt die Kontrollkästchen für die Unterstützung von MAX3000 und Programmer. Nur für den Fall, ich warne Sie - das Paket ist groß, ungefähr zwei Gigs. Sie benötigen auch Altera USB Blaster - der übliche Preis für Ali beträgt ca. 3 US-Dollar.
Öffnen Sie das Projekt al422_bam.qpf. Öffnen Sie links die Registerkarte Datei und die Datei al422_bam.v - dies ist die Hauptprojektdatei. Darin müssen Sie die Parameter konfigurieren:
Wie viele RGB-Eingänge auf einem Panel - Auf Panels mit einem HUB75-Eingang können 1 oder 2 RGB-Eingänge vorhanden sein. Um genau herauszufinden, wie viele Eingaben auf diese Weise möglich sind, nehmen wir die Anzahl der Pixel im Bedienfeld vertikal. Teilen Sie es durch die Anzahl der Scanlinien (in der Bedienfeldbezeichnung beispielsweise 8S angegeben). Teilen Sie durch die Anzahl der Eingangsanschlüsse (1 oder 2). Zum Beispiel - Ich habe ein 32x32-Panel, einen 8S-Scan und zwei Eingangsanschlüsse - 32/8/2 = 2 - was zwei RGB-Eingänge bedeutet.
`define RGB_outs 2
Wie viele Scanlinien auf dem Bedienfeld - da der HUB75E-Standard unterstützt wird, kann er bis zu 32x betragen. Die Anzahl der Scanlinien ist normalerweise im Panel-Namen in Form von 8S / 16S / 32S angegeben.
Es darf nur eine Zeile unkommentiert sein:
`define SCAN_x8 1 //`define SCAN_x16 1 //`define SCAN_x32 1
Die Gesamtzahl der horizontalen Pixel in der Kette. Pixel werden in der gesamten Panel-Kette berücksichtigt - siehe Abschnitt „LED-Panels wechseln“
`define PIXEL_COUNT 64
Die Phasen der Ausgangssignale. Die typischste Konfiguration ist folgende: OE ist auf niedriger Ebene aktiv (Kommentare entfernt), CLK wird vorne ausgeführt (Kommentare sind aktiviert), LAT ist auf hoher Ebene aktiv (Kommentare sind aktiviert). Alle möglichen seltsamen Optionen sind möglich. Finden Sie heraus, welche Sie nur experimentell haben oder indem Sie die Schaltung entfernen und nach Datenblättern für die verwendeten Chips suchen.
//`define LED_LAT_ACTIVE_LOW 1 `define LED_OE_ACTIVE_LOW 1 //`define LED_CLK_ON_FALL 1
Vor- und Nachverzögerung des OE-Signals relativ zu LAT und Prescaler für den Hauptzähler. Siehe oben.
`define OE_PRESCALER 16 `define OE_PREDELAY 31 `define OE_POSTDELAY 31
Alles, drücken Sie Strg-L - das Projekt wird kompiliert. Wenn Sie es nirgendwo vermasselt haben, werden mehrere Warnungen angezeigt, aber es sollten keine Fehler auftreten. Als nächstes schließen wir die gelötete Platine an den USB-Blaster an und versorgen die Platine mit Strom. Gehen Sie in Quartus zu tools - programmer. Wählen Sie im Hardware-Setup USB-Blaster aus und klicken Sie auf Start. Das war's, CPLD ist programmiert.
Mikrocontroller-Teil
Die Datenausgabe an die Steuerung ist im Allgemeinen äußerst einfach: Wir setzen die Schreibadresse zurück und geben dann nacheinander Datenbytes aus, die mit dem WCLK-Signal abgetastet werden. Und es scheint, dass sogar eine banale Arduinka für die Arbeit ausreicht. Es gibt jedoch zwei Probleme:
a) Es braucht viel Speicher. Selbst ein kleines 32x32-Panel im RGB888-Modus benötigt 3 KByte Speicher für einen Bildschirmpuffer. Gewöhnliches Arduino-basiertes Atmega328 enthält nur 2 KB RAM. Sie können natürlich eine auf Atmega2560 basierende Mega-Karte verwenden, die bis zu 8 kB RAM enthält, aber selbst dies reicht für normal große Panels nicht aus - ein 128 x 64-Panel im RGB565-Modus benötigt 16 kB Speicher.
b) Bei der Arbeit mit AL422B ist ein Fehler aufgetreten, der nirgendwo dokumentiert wurde. Wenn Daten mit einer Geschwindigkeit von weniger als 2 MB / s geschrieben werden, funktioniert der Adresszähler nicht richtig und schreibt Daten "nicht vorhanden". Vielleicht ist das eine Panne meiner Partei. Vielleicht nicht. Aber diese Panne muss umgangen werden. Da der AVR8 mit 16 MHz arbeitet, ist es fast unmöglich, Daten mit den gewünschten Geschwindigkeiten von ihm zu erhalten.
Die vorgeschlagene Lösung besteht darin, billige Schals zu verwenden, die auf dem 32-Bit-Controller STM32F103C8T6 basieren. Ein solcher Schal kostet Ali etwa 2,5 US-Dollar pro Stück oder etwa 1,7 US-Dollar beim Kauf eines Dutzend, das heißt sogar billiger als ein Arduino Nano. Gleichzeitig erhalten wir einen vollwertigen 32-Bit-Mikrocontroller, der mit 72 MHz arbeitet und über 20 kB RAM und 64 kB Flash verfügt (vergleiche mit dem 2kB / 8kB Atmega328 auf Nano).
Gleichzeitig werden solche Boards in der Arduino-Umgebung recht erfolgreich programmiert. Darüber gibt es einen guten Artikel auf der Uhr , daher werde ich ihn nicht duplizieren. Machen Sie im Allgemeinen alles wie im Artikel beschrieben.
Wählen Sie in einer Arduino-Umgebung die generische Karte STM32F103C, Variante STM32F103C8. Die Daten werden über DMA übertragen, sodass Sie jede Optimierungsoption verwenden können.
Das Umschalten erfolgt wie folgt:
Fest in der Bibliothek festgenagelt:
A0..A7 → DI0..DI7 AL422B
B0 → WCLK AL422B
B1 → WRST AL422B
In einer Skizze dem Controller zugewiesen:
B10 → WIR AL422B
Gemeinsamer Draht:
G → GND
Vergessen Sie nicht, die entsprechenden Controller-Pins mit 5 V / GND vom Panel zu versorgen.
Nehmen Sie die Pinbelegung des Steckers am Controller aus dem Stromkreis .

Software-Teil
Da die Aufgabe darin bestand, alles so einfach und erschwinglich wie möglich zu gestalten, wurde die gesamte Software für die Arduino-Umgebung entwickelt und als LED_PANEL- Bibliothek konzipiert.
Die LED-PANEL-Bibliothek verwendet die Adafruit GFX -Bibliothek aktiv und muss daher installiert werden.
Ich empfehle dringend, die LED_PANEL-Bibliothek nicht im Bibliotheksverzeichnis abzulegen, sondern im Skizzenordner zu belassen. Tatsache ist, dass es viele eisengebundene Parameter gibt, und wenn Sie die Arbeit auf einen "fetteren" Mikrocontroller übertragen möchten, müssen Sie viele Dinge im Code selbst ändern.
Die Initialisierung erfolgt ungefähr in der folgenden Form:
#include "LED_PANEL.h" #define width 32 #define height 32 #define bpp 3 #define scan_lines 8 #define RGB_inputs 2 #define we_out_pin PB10 LED_PANEL led_panel = LED_PANEL(width, height, bpp, scan_lines, RGB_inputs, we_out_pin);
Das heißt, wir erstellen eine Instanz der LED_PANEL-Klasse, für die wir die Parameter angeben:
width - Die Gesamtbreite des Panels in Pixel (gesamt)
Höhe - Die Gesamthöhe des Panels in Pixel (gesamt)
bpp - Byte pro Pixel, 3 für RGB888. Die BAM-Version funktioniert nur in RGB888
scan_lines - Die Anzahl der Scanlinien beträgt 16.08.32. Es muss dem in der Steuerung blinkenden Modus entsprechen.
RGB_Eingänge - Die Anzahl der RGB-Eingänge im HUB75-Anschluss beträgt 1/2. Es muss dem in der Steuerung blinkenden Modus entsprechen.
we_out_pin - Pin, an den der WE-Ausgang angeschlossen ist
Bitte beachten Sie, dass während der Initialisierung nur der WE-Pin angegeben wird. Alle anderen Pins sind starr im Code registriert, da sie an die verwendeten Timer- und DMA-Kanäle gebunden sind und ihre Änderung erhebliche Änderungen im Code mit sich bringt.
Starten und Löschen des Bildschirms im Setup-Bereich:
led_panel.begin(); led_panel.clear();
begin initialisiert die notwendigen Pins mit dem Ausgang, verbindet einen Timer und DMA
clear löscht den Puffer
Zum Zeichnen können Sie alle Standardverfahren der Adafruit GFX-Bibliothek verwenden - vom einfachsten drawPixel bis zur Textausgabe. Zur Ausgabe der in den Puffer gezeichneten Prozeduren werden verwendet:
led_panel.show();
In diesem Formular initiiert show die Datenübertragung zum Controller über DMA und gibt die Kontrolle sofort zurück. Finden Sie mithilfe der Funktion led_panel.OutIsFree () heraus, ob die Übertragung beendet wurde. Wenn "true" angezeigt wird, wurde die Übertragung beendet. Es gibt eine Funktion - wenn Sie show aufrufen, wenn die Übertragung noch nicht abgeschlossen ist - wird sie einfach ignoriert.
led_panel.show(false);
analog zu show (), aber wenn Sie show (false) aufrufen und die Übertragung noch nicht abgeschlossen ist, wartet die Prozedur auf den Abschluss der Übertragung und startet dann eine neue Übertragungs- und Rückgabesteuerung:
led_panel.show(true);
Analog zu show (false). Wenn Sie jedoch show (true) aufrufen, gibt die Prozedur nach dem Start einer neuen Übertragung die Kontrolle erst zurück, wenn die Übertragung abgeschlossen ist.
Im Allgemeinen ist das alles.

Einige Hinweise zur Software:
a) Die Gammakorrektur wird eingeführt, wenn die Farbe aus RGB565 (das von der Bibliothek verwendet wird) mit der ExpandColor-Funktion neu berechnet wird. In allen anderen Fällen wird eine lineare Übertragungsfunktion verwendet, dh die Helligkeit ist direkt proportional zum Wert.
b) Mit der Software können Sie mehrere LED-Controller an eine Mikrocontroller-Karte anschließen. Senden Sie dazu die Datenbus-, RST- und CLK-Leitungen parallel an die Steuerungen. Der gewünschte Controller wird über die WE-Leitung ausgewählt. In der Software müssen Sie für jeden Controller eine separate Instanz der LED_PANEL-Klasse erstellen, und jede Instanz muss während der Initialisierung unterschiedliche WE-Zeilen (den letzten Parameter) haben.
ZU TUN
- Beschäftige dich mit der "Aufnahme" von Blumen in benachbarten Reihen. Es sieht aus wie eine schlechte Verkabelung des Panels selbst (Schlüssel sind verschmutzt), aber Sie müssen dies überprüfen. Gerade ist ein neues Panel angekommen - ich werde es überprüfen;
- Erstellen Sie eine neue Version der Karte - mit bereits geschiedenem RE und zusätzlichen Ausgangspegelwandlern in 5 V;
- Erstellen Sie die META_LED_PANEL-Klasse, mit der mehrere LED_PANELs zu einem virtuellen Bildschirm kombiniert werden können. Auf diese Weise können sehr große Bildschirme mit mehreren Controllern erstellt werden.
- Wechseln Sie in Zukunft zu einer leistungsstärkeren CPLD-Serie, z. B. CycloneIV. Dies würde die Möglichkeiten erheblich erweitern und gleichzeitig die Kosten niedrig halten (EP4CE6E22 kostet für die Chinesen etwa 5 $, während es 100-mal mehr Makrozellen und etwa 32 kB internen Speicher gibt). Aber ich werde das eines Tages später tun. Wenn ich will. Da solche Entwicklungen zu viel Zeit in Anspruch nehmen.