Forum: Mikrocontroller und Digitale Elektronik Arduino digitalWrite - valide Values


von digitalWrite (Gast)


Lesenswert?

betrifft: digitalWrite(Pin, Value)

Ist es ok, wenn Value nicht 1, sondern ein beliebiger (byte) Wert <> 0 
ist?

Habe im internet nichts dazu gefunden, hier wird immer nur LOW oder HIGH 
als Argument genannt.

von Georg S. Ohm (Gast)


Lesenswert?

Weil das nicht Arduino-spezifisch, sondern C++ spezifisch ist.

Such nach C++ Bool

Beitrag #5734397 wurde von einem Moderator gelöscht.
von digitalWrite (Gast)


Lesenswert?

Georg S. Ohm schrieb:
> Such nach C++ Bool

sorry, das ist leider keine Definitionsfrage von Bool allgemein.

Ich weiß ja nicht, ob es Sonderlocken gibt.
so wie z.B. bei pinMode INPUT und OUTPUT (Wert 0 oder 1)
Es gibt da auch noch INPUT_PULLUP (Wert 2)

Daher die Frage, ob bei digitalWrite ein beliebiger (byte) Wert <> 0 
als TRUE (oder HIGH, ...) anerkannt wird, oder ob es auch hhier mir 
unbekannte Sonderlocken gibt.

von digitalWrite (Gast)


Lesenswert?

Habs selbst gefunden.

Protokoll für die Interessierten:
digitalWrite internal structure
1
void digitalWrite(uint8_t pin, uint8_t val)
2
{
3
        uint8_t timer = digitalPinToTimer(pin);
4
        uint8_t bit = digitalPinToBitMask(pin);
5
        uint8_t port = digitalPinToPort(pin);
6
        volatile uint8_t *out;
7
8
        if (port == NOT_A_PIN) return;
9
10
        // If the pin that support PWM output, we need to turn it off
11
        // before doing a digital write.
12
        if (timer != NOT_ON_TIMER) turnOffPWM(timer);
13
14
        out = portOutputRegister(port);
15
16
        uint8_t oldSREG = SREG;
17
        cli();
18
19
        if (val == LOW) {
20
                *out &= ~bit;
21
        } else {
22
                *out |= bit;
23
        }
24
25
        SREG = oldSREG;
26
}

von Michael U. (amiga)


Lesenswert?

Hallo,

im Zweifel wirst Du Dir die Innereien eben anschauen müssen...

Aus ..\hardware\arduino\avr\cores\arduino\Arduino.h
1
void pinMode(uint8_t, uint8_t);
2
void digitalWrite(uint8_t, uint8_t);
und für die Funktionen selbst in 
..\hardware\arduino\avr\cores\arduino\wiring_digital.c

Gruß aus Berlin
Michael

von digitalWrite (Gast)


Lesenswert?

Michael U. schrieb:
> im Zweifel wirst Du Dir die Innereien eben anschauen müssen...
:)

> Gruß aus Berlin
> Michael

Gruß zurück

von Wolfgang (Gast)


Lesenswert?

digitalWrite schrieb:
> Ist es ok, wenn Value nicht 1, sondern ein beliebiger (byte) Wert <> 0
> ist?

In der Doku ist als Wertebereich angegeben [LOW,HIGH] und (für AVR) der 
Datentyp als uint8_t festgelegt (s. Quellcode in 
.\hardware\arduino\avr\cores\arduino/wiring_digital.c)
https://www.arduino.cc/reference/en/language/functions/digital-io/digitalwrite/

val wird intern auf "== LOW" geprüft, alles andere wird folglich 
derzeit als HIGH behandelt.

von Peter D. (peda)


Lesenswert?

digitalWrite schrieb:
> Ist es ok, wenn Value nicht 1, sondern ein beliebiger (byte) Wert <> 0
> ist?

Ja. In C hat jeder Wert != 0 den boolschen Wert true.
Der besseren Lesbarkeit wegen schreib einfach:
1
  digitalWrite(Pin, (bool)Value);

von Arno (Gast)


Lesenswert?

Georg S. Ohm schrieb:
> Weil das nicht Arduino-spezifisch, sondern C++ spezifisch ist.
>
> Such nach C++ Bool

Doch, das ist Arduino-spezifisch - ein C++ bool hätte wohl kaum den Wert 
LOW oder HIGH.

Ebenso Arduino-spezifisch ist leider, dass man das im Quelltext 
nachsehen muss, weil die Dokumentation ziemlich vollständig auf 
Datentypen verzichtet.

Trotzdem würde ich mich an die Dokumentation halten, also nur die 
#defines HIGH und LOW übergeben. Denn wenn übermorgen jemand vom 
Arduino-Team meint, alles andere soll ignoriert werden, LOW soll 17 und 
HIGH 35 sein, dann darf er das (zumindest habe ich nirgendwo die 
Definition gefunden, die das verbietet).

MfG, Arno

von Michael U. (amiga)


Lesenswert?

Hallo,

Arno schrieb:
> Trotzdem würde ich mich an die Dokumentation halten, also nur die
> #defines HIGH und LOW übergeben. Denn wenn übermorgen jemand vom
> Arduino-Team meint, alles andere soll ignoriert werden, LOW soll 17 und
> HIGH 35 sein, dann darf er das (zumindest habe ich nirgendwo die
> Definition gefunden, die das verbietet).

das ist der Preis, den man für die Abstraktion zahlen muß.
Dafür setzt eben ein pinMode(0,OUTPUT) auch einen Pin am ESP32 auf 
Output. Egal, ob da die IO-Matrix und anderer Kram dazwischen liegt.
Dafür setzt eben auch ein Wire(7,3); dort die Pins von I2C, auch wenn er 
da die Pins noch auf die I2C-Hardware mappen muß oder SoftI2C nutzt, 
wenn das nicht möglich.

Gruß aus Berlin
Michael

von Arno (Gast)


Lesenswert?

Michael U. schrieb:
> Arno schrieb:
>> Trotzdem würde ich mich an die Dokumentation halten, also nur die
>> #defines HIGH und LOW übergeben. Denn wenn übermorgen jemand vom
>> Arduino-Team meint, alles andere soll ignoriert werden, LOW soll 17 und
>> HIGH 35 sein, dann darf er das (zumindest habe ich nirgendwo die
>> Definition gefunden, die das verbietet).
>
> das ist der Preis, den man für die Abstraktion zahlen muß.
> Dafür setzt eben ein pinMode(0,OUTPUT) auch einen Pin am ESP32 auf
> Output. Egal, ob da die IO-Matrix und anderer Kram dazwischen liegt.
> Dafür setzt eben auch ein Wire(7,3); dort die Pins von I2C, auch wenn er
> da die Pins noch auf die I2C-Hardware mappen muß oder SoftI2C nutzt,
> wenn das nicht möglich.

Ich glaube nicht, dass das der Preis für Abstraktion ist - die könnte 
man ja noch viel schöner mit einem enum portpinLevels umsetzen - dann 
würde sich die Frage gar nicht stellen, ob andere Werte als HIGH, LOW, 
true, false, 0, 1 übergeben werden dürfen.

Ich glaube eher, das ist der Preis für "wir machen es so einfach und 
niedrigschwellig wie möglich" - und schreiben daher in der Dokumentation 
eben nicht
1
void digitalWrite(uint8_t portPin, uint8_t value)
oder
1
enum pinNumbers = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
2
enum pinLevels = { LOW, HIGH };
3
void digitalWrite(pinNumbers portPin, pinLevels value);

sondern
1
void digitalWrite();

Das ist auch durchaus ein valides Ziel, nur muss man eben dann gewisse 
Preise dafür zahlen.

MfG, Arno

von Michael U. (amiga)


Lesenswert?

Hallo,

Arno schrieb:
> Ich glaube eher, das ist der Preis für "wir machen es so einfach und
> niedrigschwellig wie möglich" - und schreiben daher in der Dokumentation
> eben nicht
...
Arno schrieb:
> Das ist auch durchaus ein valides Ziel, nur muss man eben dann gewisse
> Preise dafür zahlen.

ich stimme Dir hier voll zu. Man sollte nicht vergessen, wie "Arduino" 
entstanden ist, ein paar Künstler sollten ihre Ausstellungseffekte 
selber basteln können...
Ich glaube, den Weg den die Philosophie "Arduino" inzwischen gegangen 
ist, hat wohl keiner damals vorausgesehen.

Gruß aus Berlin
Michael

von digitalWrite (Gast)


Lesenswert?

Michael U. schrieb:

> ich stimme Dir hier voll zu. Man sollte nicht vergessen, wie "Arduino"
> entstanden ist, ein paar Künstler sollten ihre Ausstellungseffekte
> selber basteln können...


Also dass ein Künstler die Hard- u. Software entwickelt hat, kann ich 
mir nicht vorstellen. Dann wäre der Künstler ja ein richtiger Künstler 
;-)

von Michael U. (amiga)


Lesenswert?

digitalWrite schrieb:
> Michael U. schrieb:
>
>> ich stimme Dir hier voll zu. Man sollte nicht vergessen, wie "Arduino"
>> entstanden ist, ein paar Künstler sollten ihre Ausstellungseffekte
>> selber basteln können...
>
> Also dass ein Künstler die Hard- u. Software entwickelt hat, kann ich
> mir nicht vorstellen. Dann wäre der Künstler ja ein richtiger Künstler
> ;-)

"ein paar Künstler sollten" nicht "ein paar Künstler wollten" ;-)

Ich verweise hier mal auf 
https://de.wikipedia.org/wiki/Arduino_(Plattform)

Irgendwo gab es auch mal eine Diskussion dazu, auch warum ein Arduino 
UNO so eine seltsame Anordnung bei den Anschlußleisten hat.

Gruß aus Berlin
Michael

von Wolfgang (Gast)


Lesenswert?

Peter D. schrieb:
> Ja. In C hat jeder Wert != 0 den boolschen Wert true.
> Der besseren Lesbarkeit wegen schreib einfach:  digitalWrite(Pin,
> (bool)Value);

Damit setzt du voraus, dass LOW als false oder true definiert ist.

von Einer K. (Gast)


Lesenswert?

Wolfgang schrieb:
> Damit setzt du voraus, dass LOW als false oder true definiert ist.

#define LOW 0

0 LOW und false sind hinreichend gleich genug, damit man sie bei 
digitalWrite() verwenden kann

Alles andere ist eben nicht "LOW" und damit eher dem HIGH zuordnen.

#define HIGH 1

von Christoph M. (mchris)


Lesenswert?

Michael U. (amiga)
>ich stimme Dir hier voll zu. Man sollte nicht vergessen, wie "Arduino"
>entstanden ist, ein paar Künstler sollten ihre Ausstellungseffekte
>selber basteln können...

Hallo Michael,
hast Du das hier schon mal gelesen?:
https://github.com/ArduinoHistory/arduinohistory.github.io/blob/master/index.md
Solltest Du mal machen.

von Michael U. (amiga)


Lesenswert?

Hallo,

Christoph M. schrieb:
> Solltest Du mal machen.

Danke für den Link, kannte ich noch nicht.

Gruß aus Berlin
Michael

von Manfred (Gast)


Lesenswert?

Michael U. schrieb:
> Man sollte nicht vergessen, wie "Arduino" entstanden ist,

das hat aber nun nichts mit der Fragestellung zu tun.

Arduino beschreibt zwei Varianten:
1
digitalWrite(PinNr, HIGH);
2
digitalWrite(PinNr, LOW);

Ich bin etwas verwundert, dass die IDE
1
digitalWrite(PinNr, 17);
2
digitalWrite(PinNr, 257);
klaglos übersetzt.

Was für ein Ergebnis sich daraus ergibt, habe ich nicht getestet, aber 
ich würde als zufällig / undefinert ansehen und nicht machen.

von Einer K. (Gast)


Lesenswert?

Manfred schrieb:
> Ich bin etwas verwundert, dass die IDEdigitalWrite(PinNr, 17);
> digitalWrite(PinNr, 257);klaglos übersetzt.
>
> Was für ein Ergebnis sich daraus ergibt, habe ich nicht getestet, aber
> ich würde als zufällig / undefinert ansehen und nicht machen.
Braucht dich nicht zu wundern.....
Und kannst du verwenden.
Passt alles zur Definition, oder wird impliziet richtig gecastet
1
// die eine Fraktion (macht sich low Pegel)
2
 digitalWrite(13,0);
3
 digitalWrite(13,LOW);
4
 digitalWrite(13,false);
5
6
 // und die andere  (macht sich high Pegel)
7
 digitalWrite(13,1);
8
 digitalWrite(13,HIGH);
9
 digitalWrite(13,true);
10
 digitalWrite(13,42);

auch immer wieder gerne genommen, mit Bedingung:

digitalWrite(13, haufen > 22);

von Wolfgang (Gast)


Lesenswert?

Manfred schrieb:
> Ich bin etwas verwundert, dass die IDE
>   digitalWrite(PinNr, 17);
>   digitalWrite(PinNr, 257);
> klaglos übersetzt.

Die 257 wird dir der Compiler auf 1 zusammen streichen (wg. uint8_t) und 
sollte eine Warnung schmeißen)

Ansonsten lies noch mal:

Wolfgang schrieb:
> In der Doku ...

von Wolfgang (Gast)


Lesenswert?

p.s.
So sieht die Warnung vom GCC unter der Arduino IDE aus
1
warning: large integer implicitly truncated to unsigned type [-Woverflow]
2
3
   digitalWrite(PinNr, 257);
4
                          ^

von Einer K. (Gast)


Lesenswert?

Eine berechtigte Warnung.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Wolfgang schrieb:
> Manfred schrieb:
>> Ich bin etwas verwundert, dass die IDE   digitalWrite(PinNr, 17);
>>   digitalWrite(PinNr, 257);
>> klaglos übersetzt.
> Die 257 wird dir der Compiler auf 1 zusammen streichen (wg. uint8_t) und
> sollte eine Warnung schmeißen)
Glück gehabt.
Bei digitalWrite(PinNr,512) kommt nämlich (zusätzlich zur Warnung, die 
aber keiner liest) eine 0 und damit ein FALSE raus.

Michael U. schrieb:
> Irgendwo gab es auch mal eine Diskussion dazu, auch warum ein Arduino
> UNO so eine seltsame Anordnung bei den Anschlußleisten hat.
Ich hätte die vermurksten Vorserienplatinen weggeschmissen. Oder nur für 
den "Eigengebrauch" eingesetzt...

: Bearbeitet durch Moderator
von Einer K. (Gast)


Lesenswert?

Lothar M. schrieb:
> vermurksten

Mich nervt die Anordnung auch etwas....
Es stört, wenn man sich selber "Shields" mit Lochrasterplatinen bauen 
will.
Aber da gibts ja genug Arduino Alternativen, nur mal Pro Mini, Micro 
genannt, die das "Problem" nicht haben. Wohl mit Absicht nicht haben.

Aber sonst, ist das schon eine zuverlässige "Verdrehsicherung". Ohne 
Hammer bekommt man ein Shield nicht falsch auf einem UNO drauf.
Es hilft gegen Rauch bei Trottelfehlern.

Also klar:
Für mich hätten sie das nicht so bauen müssen.
Aber ich weiß auch nicht, ob mich das schon vor Schaden beschützt hat.

Ist halt ein codiertes Stecksystem.
Vergleichbar mit Sub-D. Aber da regt sich keiner über die Unsymmetrie 
der Stecker auf. Ok, da kommt auch wohl kaum einer auf die Idee sich 
selber Stecker zu basteln.

von Michael U. (amiga)


Lesenswert?

Hallo,

Arduino Fanboy D. schrieb:
> Mich nervt die Anordnung auch etwas....
> Es stört, wenn man sich selber "Shields" mit Lochrasterplatinen bauen
> will.
ein Bekannter hat diese Version mal irgendwo im 5er Pack zum Sparpreis 
gekauft:
https://www.ebay.de/itm/DIY-Proto-Shield-Punktraster-Prototyping-Shield-fur-Arduino/181861465251?hash=item2a57c9bca3:g:~zcAAOSwgkRVUz~o:rk:2:pf:0

Entweder direkt als Lochraster oder als Adapter auf ein praktikables 
Rastermaß gut nutzbar.

> Aber da gibts ja genug Arduino Alternativen, nur mal Pro Mini, Micro
> genannt, die das "Problem" nicht haben. Wohl mit Absicht nicht haben.
Nano, mein meistgenutzer Arduino wenn es mal ein AVR sein soll.

Gruß aus Berlin
Michael

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.