digitalRead funktioniert nicht korrekt

Ich möchte mit einem „Einzeiler“ den Wert eines digitialen Pins an- bzw ausschalten - je nachdem ob schon an bzw aus ist (1|0). Das funktioniert im Simulator auch tadellos.
Wenn ich das aber auf dem Calliope (Ver1.3) ausprobiere kann man nicht ausschalten. Es sieht so aus als ob das Lesen des Wertes den Wert verändert.

Ist das Problem bekannt - oder kennt jemand sogar eine Abhilfe?

input.onButtonEvent(Button.A, input.buttonEventClick(), function () {
pins.digitalWritePin(DigitalPin.P1, 1 - pins.digitalReadPin(DigitalPin.P1))
})

Hallo,

Deine Erwartung ist, dass ein Pin (ein GPIO) einen mit Schreiben ausgegebenen Wert bis zum nächsten Lesen behält und Du diesen in Deinem Programm mit dem nächsten Tastendruck lesen kannst? Das wird so mE. nach nicht funktionieren. Ein Pin ist keine Programm-Variable. Wenn ich über einen Pin einen analogen oder digitalen Wert lese, erhalte ich genau das was zB. ein externes Modul oder eine Spannungsquelle liefert, nicht das was ich vorher ausgegeben habe.

So mein Verständnis zu den Pins des Calliope mini und GPIO’s überhaupt.

Vorschlag: Eine Zeile mehr für eine Variable, die invertiert wird und diese ausgeben.

Oder das hier:
Hätte gar nicht gedacht, dass das hier funktioniert. Tut es aber.

input.onButtonEvent(Button.A, input.buttonEventClick(), function () {
pins.digitalWritePin(DigitalPin.P1, pin = 1 - pin)
})
let pin = 0

Gruß Raik

Mein Kenntnisstand ist, dass ein Pin in einem Programm immer nur eine Funktion haben kann: Eingabe oder Ausgabe, digital oder analog. Den Wert lesen, auf dem ein Ausgang gerade steht, scheint nicht möglich zu sein, obwohl das logisch wäre.

Du musst den ausgegebenen Wert in einer Variablen speichern. Bei digitalen Ausgaben wäre eine Variable vom Typ Boolean angemessen. Geht aber nicht. Digitale Pin Ausgaben funktionieren nur mit Zahlen, die alle möglichen Werte haben können, aber nur 0 oder 1 haben sollen.

Du kannst ja mal mit dem Pull experimentieren.
grafik

Mist - keiner versteht micht :wink:

Mein Problem ist: „digitalRead funktioniert nicht korrekt“. In der Hilfe zu Lies digitalen Wert digitalRead steht:
Lese ein digitales (0 oder 1) Signal von einem Pin auf dem Calliope mini Board.

Das funktioniert im Simulator auch tadellos - aber wenn man diesen Befehl auf einem Calliope min (Ver1.3) ausführt wird der Wert nicht nur gelesen sondern auch auf 0 gesetzt.
Ich brauche keinen Workaround (da gibt es einige)!

Du kannst nicht von einem Pin lesen, der als digitalWritePin konfiguriert ist. Die Festlegung passiert, wenn du einmal was geschrieben hast und kann im selben Programm nicht mehr geändert werden.

Was in der Hilfe steht gilt nur für Pins, die nur zum Lesen konfiguriert sind.

Hallo asp.net - und vielen Dank für die Erklärung. Kannst Du mir verraten noch woher Du das weisst? Und vielleicht noch erklären, wieso Simulator und Calliope sich hier unterschiedlich verhalten?

Hallo @JuergenB

ich finde solche Informationen auch nicht. Vielleicht gehört das in der Mikrocontroller Arduino Familie zum Allgemeinwissen. Ich finde es gut, dass mal jemand über die selben Fragen stolpert wie ich. In Open Roberta wird ein Konfigurationsfehler gemeldet, wenn du pin P0 als Sensor und Aktor gleichzeitig nehmen willst. Bei MakeCode muss man das eben wissen…

Das ist ein Hardware-Problem. Der Simulator weiß auch nichts davon.

Falls du mal einen analogen Ausgang benutzen willst, wirst du dich auch wundern. Es funktioniert nicht wie erwartet. Eine Erklärung, wie es funktioniert, habe ich nicht gefunden.

Lutz