Hallo Ulrich, Hallo MobaLedLib interessierte,
Edit 8.2.20: Dieser Beitrag erklärt das Problem beim Flashen der Arduinos welches bei manchen Kollegen auftritt. Ich erkläre zunächst einmal wie die Kommunikation der Arduinos untereinander funktioniert und gehe dann auf das eigentliche Problem ein. Die Lösung des Problems ist ganz einfach. Man muss den Widerstand der TX LED des DCC Arduinos entfernen. Das wird im letzten Bild gezeigt.
Ich schreibe mal detailliert auf wie der Mechanismus mit dem A1 Pin funktioniert. Vielleicht habe ich irgendwo einen Denkfehler gemacht.
Der Pin A1 wird auf 5V gelegt, wenn der DCC Arduino still sein soll. Damit wird verhindert, dass Zeichen verloren gehen während die LEDs aktualisiert werden denn in dieser Zeit müssen alle Interrupts deaktiviert sein, weil das WS281x Protokoll sehr zeitkritisch ist.
Im Programm sieht das so aus:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#if defined USE_RS232_AS_INPUT || defined RECEIVE_LED_COLOR_PER_RS232
Proc_Received_Char(); // Process characters received from the RS232 (DCC, Selectrix, ... Arduino)
#endif
#if defined USE_RS232_AS_INPUT
digitalWrite(SEND_DISABLE_PIN, 1); // Stop the sending of the DCC-Arduino because the RS232 interrupts are not processed during the FastLED.show() command
#endif
#ifdef USE_CAN_AS_INPUT
Process_CAN(); // Read the messages from the CAN bus and write the InpStructArray[]
#endif
FastLED.show(); // Show the LEDs (send the leds[] array to the LED stripe)
#ifdef USE_RS232_AS_INPUT
digitalWrite(SEND_DISABLE_PIN, 0); // Allow the sending of the DCC commands again
#endif
Mit dem „digitalWrite(SEND_DISABLE_PIN, 1);“ Befehl wird dem DCC Arduino gesagt, dass er die Klappe halten soll (SEND_DISABLE_PIN = A1). Dann werden mit „FastLED.show();“ die LEDs aktualisiert. Anschließend darf der DCC Arduino wieder plappern: „digitalWrite(SEND_DISABLE_PIN, 0);“.
Mit einem normalen Messgerät sieht man nicht, dass der Pin manchmal kurz 0V hat weil diese Phase sehr kurz ist (120 us).
Wenn der DCC eine Spannung von 5V am A1 Pin sieht, dann sendet er keine weiteren Zeichen und deaktiviert die serielle Schnittstelle. Damit ist sein TX Pin hochohmig und sollte darum die Kommunikation nicht weiter beeinflussen.
=> Während der LED Arduino Daten zu den LEDs schickt kann der DCC Arduino nichts senden.
Bei diesem Mechanismus kann es sein, dass ein Zeichen gerade unterwegs ist bevor die A1 Leitung auf 0 geschaltet wird. Das ist aber nicht schlimm, weil der Arduino ein Zeichen in seinem Hardware Puffer speichern kann. Dieses Zeichen mit „Proc_Received_Char();“ abgeholt bevor der DCC Arduino wieder senden darf.
Beim Programmieren der Arduinos muss aber auch sichergestellt sein, dass der DCC Arduino nicht dazwischen quatscht, wenn PC und LED Arduino miteinander reden. Das wird darüber erreicht, dass der DCC Arduino selber den A1 Pin über einen Widerstand im Prozessor auf 5V zieht. Er verpasst sich also selber ein Redeverbot. Das ist wichtig, weil man während des Flashens keine Kontrolle über die Pins hat. Der LED Arduino kann dem DCC Arduino also nicht sagen, dass er ruhig sein soll. Darum diesen PullUp Widerstand.
Damit sollte immer sichergestellt sein, dass der DCC Arduino nichts sendet, wenn der LED Arduino programmiert wird.
Das funktioniert natürlich nur dann, wenn auf dem DCC Arduino auch das DCC Programm läuft. Wenn man irgendein anderes Programm auf dem DCC Adruino installiert hat, dann kann es sein das dieser trotzdem dazwischen plappert. Das kann z.B. dann passieren, wenn man die Schaltung neu aufgebaut hat und gleich zwei Arduinos einsteckt, aber zunächst nur den LED Teil testen will. Auf dem DCC Arduino ist dann evtl. noch ein altes Programm vorhanden welches auf der seriellen Schnittstelle sendet. Im Excel Programm wird man nur dann gefragt ob man das DCC Programm schicken will wenn auch DCC Befehle genutzt werden. => Der DCC Arduino sollte erst dann eingesteckt werden, wenn er auch benutzt wird. Ist er einmal Programmiert, dann kann er stecken bleiben.
Dummerweise ist der TX Pin des DCC Arduinos auch noch mit dem Eingang des USB Konverters auf dem Nano verbunden. Auf diesem Pfad werden die Daten vom DCC Arduino zum PC geschickt. Aber auch dieser Pin ist ein Eingang. Das spielt also auch keine Rolle.
ABER beide Arduinos besitzen LEDs welche flackern wenn Daten gesendet oder empfangen werden. Das sieht man sehr schön, wenn das Programm zu Arduino geschickt wird. Wenn man zwei Arduinos miteinander verbindet bedeutet das aber auch, dass die LEDs beider Nanos parallel geschaltet werden ;-(
Jetzt haben die Arduino Entwickler zwischen den USB to RS232 Konverter (CH340G) und den Pins des Prozessors 1K Schutzwiderstände eingebaut. Diese Widerstände reduzieren den Strom wenn man den RX Pin des Arduinos als Ausgang betreibt. Sie wirken aber auch als Spannungsteiler und verringern die am Prozessor ankommende Spannung. Mit einer LED ist das noch unkritisch. Aber wenn zwei Arduinos miteinander reden sollen, dann kann es anscheinend passieren, dass die Spannung nicht mehr ausreicht und manchmal fehlerhafte Daten ankommen.
Das folgende Bild verdeutlicht das noch einmal. Über den rot markierten 1K Widerstand fließt der Strom zu der RX LED auf dem LED Arduino und unglücklicherweise auch zu der TX LED auf dem DCC Arduino. An dem D0/Rx Pin des Prozessors kommt dadurch eine geringere Spannung an ;-(
Bei manchen Kollegen führt das evtl. zu den Problemen.
Diese Problematik wird hier nochmal anhand von Formeln erklärt:
https://arduino.stackexchange.com/questi...peaks-to-itself
Bei einem Arduino mit FT232 Chip tritt das Problem nicht auf. Hier sind die LEDs an separate Pins des USB to RS232 Konverters angeschlossen.
Abhilfe:
Wenn man den Widerstand der TX LED des DCC Arduinos entfernt sollte das Flashen des LED Arduinos Funktionieren. Dann muss der rote Widerstand nur noch eine LED ansteuern und der Spannungsabfall ist noch so groß wie bei einem einzelnen Nano.
Zum Entfernen des Widerstands erhitzt man mit einem Lötkolben beide Anschlüsse des Widerstands unter Zugabe von etwas Lötzinns. Dann lässt sich das Bauteil leicht abheben. Meistens bleibt es schon von alleine an der Lötspitze hängen.
@Ulrich:
Könntest Du bitte Prüfen ob diese „Amputation“ bei Dir das Programmieren des LED Arduinos mit eingestecktem DCC Arduino ermöglicht?
Ich kann es nicht richtig testen, weil der Fehler bei mir nicht auftritt, wenn ich den Arduino Programmiere.
Ich bin sehr gespannt das Problem damit behoben ist.
Edit: 8.2.20: Damit ist das Problem behoben. In der nächsten Version der Hauptplatine werde ich eine Schaltung integrieren mit der das Problem ohne „Amputation“ von Widerständen gelöst wird.
=> Wenn das Flashen bei Euch nicht zuverlässig funktioniert, dann entfernt diesen Widerstand. Ulrich zeigt im nächsten Beitrag wie das Resultat aussehen kann.
Hardi