Pins abfragen [gelöst]

Hallo,

ich stehe gerade 'mal wieder auf dem Schlauch. Gibt es irgendeine Möglichkeit den Zustand eines Outputpins (LOW/HIGH) direkt abzufragen? Ich konnte in der Reference leider nichts finden. Ich wollte so eine Art Umschalter programmieren, wenn ein Taster gedrückt wird, soll sich der Zustand des Pins ins Gegenteil verkehren. Etwa so:

int stat = LOW;

void setup() {
  pinMode(31, OUTPUT);      
}

void loop()
{

// Nachfolgend der Code, der ausgeführt werden soll, wenn die Taste gedrückt wird
    if (stat == LOW){
      digitalWrite(31, HIGH);
      stat = HIGH;
    }
    else{
      digitalWrite(31, LOW);
      stat = LOW;
    }
}

Da ich aber mehrere dieser "Umschalter" in einem Sketch benötige, würde ich gerne die Schalter-Variable ("stat") aus Speichergünden einsparen. Das geht aber wohl nur, wenn ich den Zustand des Pins direkt abfragen kann.

Für Ideen wäre ich dankbar.

Gruß Christoph

Hi,
wenn ich das richtig gelesen habe, kannst es mal hiermit testen:

digitalRead(<pin>).

Wenn der als output definiert ist, so liefert digitalRead() den aktuellen Zustand des Pins zurück

Hallo,

ich werde es 'mal ausprobieren. Ich hatte aber die Reference so verstanden, das digitalRead nur bei Pins funktioniert, die als Input deklariert sind.

Gruß Christoph

Aus Deiner Beschreibung werd ich nicht ganz schlau. Meinst Du sowas?

digitalWrite(31, !(digitalRead(pin_taster)));

Grüße Uwe

Um die ursprüngliche Frage zu beantworten. Ja, man kann den Wert eines als OUTPUT deklarierten Pins, das mittels digitalWrite() gesetzt wurde auch wieder mittels digitalRead() bestimmen.
Letztendlich steht ein HIGH oder LOW für ein bestimmtes Pin immer im gleichen Register, egal ob es als Input oder Output verwendet wird. Entscheidend ist nur, das bei einem Eingang der Wert am Eingang der Wert des Bits bestimmt und bei einem Ausgang der Wert des Bits den Wert am Ausgang.

Wenn das Ziel nur ist den Pinzustand zu wechseln, dann muss man den Zustand überhaupt nicht auslesen. http://arduino.cc/playground/Code/DigitalToggle. Mit Portmanipulation geht es auch. Siehe z.B. dieses Beispiel: http://blog.blinkenlight.net/experiments/counting/fast-counter/.

Hallo,

leider kann ich erst jetzt antworten, ich muß auch Sonntags arbeiten.
Besten Dank für die Antworten.

Ich habe das gerdae 'mal überflogen, scheint genau das zu sein, was ich suche. Werde ich jetzt gleich testen.

mkl0815:
Um die ursprüngliche Frage zu beantworten. Ja, man kann den Wert eines als OUTPUT deklarierten Pins, das mittels digitalWrite() gesetzt wurde auch wieder mittels digitalRead() bestimmen.

Danke, das war es, was ich ursprünglich wissen wollte. Wie bereits oben geschrieben, konnte ich keinen Hinweis in der Reference finden. Der Arduino ist zwar preisgünstig, ich hatte aber etwas Angst, die Hardware zu schädigen, wenn ich einen Befehl anwende, der an dieser Stelle vielleicht nicht angebracht ist.

uwefed:
Aus Deiner Beschreibung werd ich nicht ganz schlau.

Ok, mein schnell zusammengeschriebener Beispiel-Sketch war wohl mißverständlich. Der Sketch an dem ich arbeite, hat aber mittlerweile auch über 300 Zeilen (und wächst). Das wäre wahrscheinlich auch nicht übersichtlicher, deshalb habe ich nur das Wichtigste herausgenommen.
Hintergrund: Ich bastel immer noch an meiner “Tonbandfernbedienung”. Ein PC-Frontend (in Java), das Befehle via Ethernet an den Arduino sendet und dieser dann elektrische Befehle an die Schnittstelle des Tonbandgerätes. Es sind also keine Hardware-Taster, sondern “Software-Taster” die durch Mausklick betätigt werden. Diese Tasten (Aufnahme, Wiedergabe etc.) senden kurze Impulse (25 mS) und die Funktion wird ausgeführt. Eine Ausnahme ist die sogenannte “CUE”-Taste. Und um diese ging es hier. Mit dieser Taste kann man, mit verminderter Lautstärke, bei Vor- und Zurückspulen mithören. Das ist hilfreich, um z.b. die Pause zwischen 2 Musiktiteln zu finden. Diese Funktion wird durch Klicken auf die Taste eingeschaltet (Pin=LOW) und durch erneutes Klicken wieder ausgeschaltet (PIN=High).

Gruß
Christoph

Hallo,

digitalToggle() war die Lösung.
Zuerst erhielt ich einige Fehlermeldungen, diese Library ist wohl für Versionen < 1.0 gedacht.
Nach etwas Suche im Netz fand ich den Hinweis, das “#include <pins_arduino.h>” in der “DigitalToggle.h” auf #include <Arduino.h> geändert werden sollte.
Nun funktioniert es.

Gruß
Christoph