[SOLVED] Leonardo TX LED blinkt nicht

Hej,

ich hab mal eine Frage bezüglich dem Arduino Leonardo. Und zwar habe ich mir ein Custom Board erstellt und den Caterina Bootloader etwas umgeschrieben, sodass die BUILTIN_LED jetzt auf Port E6 und TX Led auf Port F4 ist.
Wenn der Arduino startet leuchtet die BUILTIN_LED auch wie erwartet mit dem heartbeat und wenn ich den Sketch auf der Leonardo flashe blinken auch die RX und TX Leds. Allerdings wenn ich im Loop etwas sende blinkt die TX Led nicht mehr. Soll das so sein?
Würde mich allerdings wundern, weil die RX Led auch blinkt wenn er etwas empfängt.

Testsketch:

void setup() {
  Serial.begin(115000);
  while(!Serial);

  //DDRD |= (1<<5); // set D5 as output --> default port is maybe damaged
  //DDRE |= (1<<2); // Set E2 as output

}

void loop() {
  //PORTD &= ~(1<<5);   // tx led on  --> doesn't work
  //PORTF &= ~(1<<4);   // tx led on  --> works
  //PORTB |= (1<<0);    // rx led off --> works
  //delay(1000);

  //PORTD |= (1<<5);    // tx led off --> doesn't work
  //PORTF |= (1<<4);    // tx led off --> works
  //PORTB &= ~(1<<0);   // rx led on  --> works
  //delay(1000);

  Serial.println("Hallo Welt."); // tx led doesn't blink
  delay(500);

  while (Serial.available() > 0)
  {
    Serial.read(); // rx led blinks
  }  
}

ezgif.com-gif-maker

Ich habe deinen Text jetzt mehrfach durchgelesen, aber ich verstehe nicht, was du uns mitteilen möchtest. Mal schreibst du von einem Leonardo, mal von einem eigenen Board. Dann wieder von einem Bootloader.....also was denn nun ?

Bitte versuche das doch mal so zu schreiben, das es auch andere verstehen.

Auf meinem Board ist ein Atmega32U4 verbaut auf dem ein leicht modifizierter Leonardo Bootloader läuft. Die Modifikation sieht lediglich andere Ports in der Caterina Header Datei für die BUILTIN_LED und TX Led vor. Die TX Led blinkt aber nicht wenn ich im Sketch etwas über den Seriellen Port schicke, sondern nur wenn ich den Sketch auf den Mikrocontroller flashe. Das wundert mich, denn ich hätte erwartet, dass die TX Led beim Senden auch aufleuchtet so wie die RX Led beim Empfangen. Tut sie aber nicht.
Ich hoffe das war verständlicher?

Mir ist nicht klar, wie eine Änderung des Bootloaders eine Änderung des Verhaltens der Anwendung bewirken soll.

1 Like

Hmm das ist doch aber nicht die richtige Datei für den Bootloader?
Nach meiner Recherche setzt der Leonardo Bootloader auf dem LUFA-111009 auf und wird dann kompiliert. Vielleicht könntest du mir aber erklären wofür die von dir gepostete Datei verwendet wird bzw. wo man sie beim kompilieren einfügen müsste?

Das hier wäre die Datei für den Bootloader meines Wissens:

Meine Änderung sieht dann wie folgt aus:

		#define LED_SETUP()		DDRE |= (1<<6); DDRB |= (1<<0); DDRF |= (1<<4);
		#define L_LED_OFF()		PORTE &= ~(1<<6)
		#define L_LED_ON()		PORTE |= (1<<6)
		#define L_LED_TOGGLE()	PORTE ^= (1<<6)
		#if DEVICE_PID == 0x0037	// polarity of the RX and TX LEDs is reversed on the Micro
			#define TX_LED_OFF()	PORTF &= ~(1<<4)
			#define TX_LED_ON()		PORTF |= (1<<4)
			#define RX_LED_OFF()	PORTB &= ~(1<<0)
			#define RX_LED_ON()		PORTB |= (1<<0)			
		#else 
			#define TX_LED_OFF()	PORTF |= (1<<4)
			#define TX_LED_ON()		PORTF &= ~(1<<4)
			#define RX_LED_OFF()	PORTB |= (1<<0)
			#define RX_LED_ON()		PORTB &= ~(1<<0)
		#endif

Die Antwort sollte an dich gehen. Leider ist das Forum heute oft nicht erreichbar und führt dann zu Fehlern.

Ich glaube ich habs jetzt verstanden.
Die jeweiligen Register im Bootloader gelten nur für den Bootvorgang, weshalb dort auch die Leds richtig geblinkt haben.
Die von dir geschickte Header Datei ist dann für den Sketch an sich zuständig. Richtig?
Hatte deine Datei jetzt noch mal für mich editiert und nun läufts. Danke!

#define TX_RX_LED_INIT	DDRF |= (1<<4), DDRB |= (1<<0)
#define TXLED0			PORTF |= (1<<4)
#define TXLED1			PORTF &= ~(1<<4)
#define RXLED0			PORTB |= (1<<0)
#define RXLED1			PORTB &= ~(1<<0)

Allerdings frage ich mich noch wofür die Zeilen 106 bis 108 sind?

Nachtrag: Hatte es noch gefunden und sind die Ports die gemappt werden. Steht ja auch weiter unten in der pins_arduino.h.

Äh,
Der ATmega32U4 hat ja nicht nur einen Bootloader sondern auch einen Hintergrundprozess damit die USB Schnittstelle bzw das Starten des Uploads funktioniert?

Serial beobachtet das Baudrate setzen.
Ein kurzes setzen auf 1200 Baud, initiiert das starten des Bootloaders.

Wenn Serial für dich ein "Hintergrundprozess" ist, dann ja.

Weiß nicht .

Aus Langeweile/Interesse habe ich mal die Stelle rausgesucht, wo auf die 1200 Baud geprüft wird.

Um das Thema noch abzuschließen und meine Lösung zu präsentieren. Es muss noch die von @combie verlinkte pins_arduino.h auf die Pins im Bootloader geändert werden, damit die beiden Leds auch im Sketch richtig leuchten. Danke für eure Hilfe.

Hatte die beiden Leds jetzt nochmal geändert auf B0 und B7, da es besser zum Layout passt.

#define TX_RX_LED_INIT	DDRB |= (1<<7), DDRB |= (1<<0)
#define TXLED0			PORTB |= (1<<7)
#define TXLED1			PORTB &= ~(1<<7)
#define RXLED0			PORTB |= (1<<0)
#define RXLED1			PORTB &= ~(1<<0)
...
#define LED_BUILTIN 7
#define LED_BUILTIN_RX 17
#define LED_BUILTIN_TX 11

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.