Quellcode digitalWrite

Hallo zusammen,
da die Funktion digitalWrite sehr langsam ist, wollte ich mir einmal den Quellcode dazu ansehen. Leider finde ich ihn nirgends beziehungsweise weiß ich nicht wie ich mir die Arduniobibiliothek ansehen kann. Kann mir jemand sagen wie das funktioniert?

Vielen Dank
Viele Grüße

Du suchst sicher

... \hardware\arduino\cores\arduino\wiring_digital.c

Schon der Aufruf einer Funktion mit Parametern an sich ist "langsam".
An die Zeiten von direkter Port-Manipulation wirst du auch mit einer eigenen Funktion nicht drankommen.

24Karo:
da die Funktion digitalWrite sehr langsam ist, wollte ich mir einmal den Quellcode dazu ansehen. Leider finde ich ihn nirgends beziehungsweise weiß ich nicht wie ich mir die Arduniobibiliothek ansehen kann. Kann mir jemand sagen wie das funktioniert?

Quellcode digitalWrite aus Arduino 1.0.5:

void digitalWrite(uint8_t pin, uint8_t val)
{
	uint8_t timer = digitalPinToTimer(pin);
	uint8_t bit = digitalPinToBitMask(pin);
	uint8_t port = digitalPinToPort(pin);
	volatile uint8_t *out;

	if (port == NOT_A_PIN) return;

	// If the pin that support PWM output, we need to turn it off
	// before doing a digital write.
	if (timer != NOT_ON_TIMER) turnOffPWM(timer);

	out = portOutputRegister(port);

	uint8_t oldSREG = SREG;
	cli();

	if (val == LOW) {
		*out &= ~bit;
	} else {
		*out |= bit;
	}

	SREG = oldSREG;
}

Zu finden unter in der Datei wiring_digital.c im Pfad:
[Installationspfad]\arduino-1.0.5\hardware\arduino\cores\arduino

Hat Dein Betriebssystem keine Suchfunktion?

super danke hab es gefunden

digitalWrite dauert ~4µS, warum ist das langsam? SIcher das die Probleme nicht an deinem Sketch liegen?

@sschultewolter: Langsam oder schnell ist relativ.
Im Vergleich zum direkten Portzugriff (2..4 Takte) ist digitalwrite mit ~53 Takten schon langsam.

Wenn sowas dann in einer Schleife oft ausgeführt wird kann das schnell zu einem Kriterium werden
Das es komfortabel auch schneller geht als digitalWrite zeigt die Lib digitalWritefast.

Bei mechanischen Tastern wird das meist doch kaum ins Gewicht fallen, da dort ganz andere Probleme sind (Prellen). Ich schreibe und lese die Ports direkt aus. Nicht über digitalWrite. Zumal ich das togglen deutich einfacher finde :wink:

Bei mechanischen Tastern wird das meist doch kaum ins Gewicht fallen, da dort ganz andere Probleme sind

Mal abgesehen davon, dass man bei Tastern selten digitalWrite verwendet :wink: :
Wenn man in Arduino Pin-Nummern denkt, ist digitalWrite sicher einfacher,
wenn man hardwarenah (PB0 etc.) denkt, sind die Vorteile eher gering.
Um einzelne LED blinken zu lassen oder einen Schrittmotor zu bewegen, sind die Arduino - Funktionen bei weitem schnell genug.

Da die Funktion digitalWrite sehr langsam ist...

klar hat dieser Eingangssatz mir auch erstmal die Nackenhaare gesträubt, aber rauskriegen was digitalWrite macht sollte man in jedem Fall erstmal, wenn man sich damit beschäftigt.

Generell ist es richtig, Funktionen zu verwenden, um den Code sauber zu strukturieren. Und Funktionen sollten möglichst sauber sein, damit man sie sicher verwenden kann (Eingangsparameter prüfen etc.) Dass das Rechenzeit und Speicher (Flash + RAM) kostet, kann gelegentlich interessant sein.