Jump to content

Recommended Posts

Geschrieben (bearbeitet)

Hallo und guten Morgen...

ich bin leider hier der Stammkunde! 😀 Ich hoffe, das nimmt mir niemand übel... Durch die intensive Nutzung von Tinkerforge-Baugruppen kommen selbstverständlich viele Fragen auf...

Ich habe hier herumgelesen, dass es bei der Verwendung der Interrupte am IO-16V2 mitunter zu 'Verklemmungen' kommt. Ich habe meine Applikation nun schon mit Eurer Hilfe recht weit voranbringen können. Jetzt bin ich beim IO-16V2 und habe auch ein seltsames Problem.

Ich habe Kanal 0 bereits mit einem EdgeCounter erfolgreich in Betrieb und wollte nun parallel den Kanal 1 mit einem Interrupt nutzen. Das schlägt fehl. Erst einmal ganz ohne Fehler.

Ich habe dann den RED Brick neu gestartet und alle laufenden Programme (nodejs) beendet. 

Danach habe ich das Beispiel Download (ExampleInterrupt.js) für meine Umgebung lauffähig (Pfade/Ports etc..) gemacht. Jedoch liefert das Example auch keine Daten und keine Fehler.

Ich habe dann mein node.js Script mit denselben Parametern konfiguriert, jedoch funktioniert das nicht und wirft auch keinen Error.

Ich habe dann den Konfigurationsaufruf io.setInputValueCallbackConfiguration(1, 1000, false) so modifiziert, dass er einen ErrorCallback verwendet. Das ist zwar nicht explizit dokumentiert, aber sieht so aus...

io.setInputValueCallbackConfiguration(1, 1000, false, 
	() => {
		Logger.log('setInputValueCallbackConfiguration OK');
	},
	(err) => {
		Logger.log('setInputValueCallbackConfiguration ERROR', err);
	}
);

Dieser Aufruf wirft einen Fehler 31.

Nun steht bei diesem Callback in der Doku nichts davon, dass er einen Fehler Werfen kann und welchen. Ich gehe davon aus, dass es der allg. Fehler

IPConnection.ERROR_TIMEOUT = 31

ist. (Eine detaillierte Dokumentation wäre hier sehr hilfreich! - auch die vom RED Brick steht seit 2015 auf 'nicht vollständig' - aber das nur am Rande... 😀)

Was läuft hier falsch? Warum funktioniert dasselbe Script mit einem EdgeCounter sehr wohl und das mit dem Interrupt nicht?

Wo muss ich weiter suchen? Gibt es noch diese bounce_time? Hat es was damit zu tun? Wo sollte man die bounce_time setzen?

Beste Grüße vom
Theo!

PS: Ich hatte nicht erwähnt, dass am BrickViewer alle Pegeländerungen prima zu sehen sind. Der Interrupt wird halt nur nicht getriggert. Konfiguriert ist: io.setConfiguration(1, 'i', true);

bearbeitet von theobald
Geschrieben

Moin,

Kannst du ein vollständiges Beispiel posten bei dem das Problem auftritt? Ich habe gerade versucht das hier nachzustellen aber es funktioniert.

Hast du neben dem Aufruf der Callback-Konfigurationsfunktion das Callback auch mit z.B.

io.on(Tinkerforge.BrickletIO16V2.CALLBACK_INPUT_VALUE,
    // Callback function for input value callback
    function (channel, changed, value) {
        console.log('Channel: ' + channel);
        console.log('Changed: ' + changed);
        console.log('Value: ' + value);
        console.log();
    }
);

registriert? Sonst schickt das Bricklet zwar Callbacks, sie werden aber von den Bindings ignoriert.

Sind die Firmwares aktuell?

Der Error-Callback der setInputValueCallbackConfiguration-Funktion ist soweit ich das sehe hier:

https://www.tinkerforge.com/de/doc/Software/Bricklets/IO16V2_Bricklet_JavaScript.html#BrickletIO16V2.setInputValueCallbackConfiguration

erwähnt. Die allgemeine API-Beschreibung auf derselben Seite (die zugegebenermaßen leicht übersehen werden kann, weil die Beispiele so lang sind) listet auch den Fehlercode auf den du da bekommst.

Den debounce gibt es nur bei dem Flankenzähler soweit ich das ad-hoc sehe.

Gruß,
Erik

Geschrieben (bearbeitet)

Ja! Danke für die Antwort. Hier kommt mein Code...

<!DOCTYPE html>
<html>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <head>
        <title>Tinkerforge | JavaScript Example</title>
    </head>
    <body>
        <div style="text-align:center;">
            <h1>IO-16 Bricklet 2.0 Interrupt Example</h1>
            <p>
                <input value="192.168.5.42" id="host" type="text" size="20">:
                <input value="4280" id="port" type="text" size="5">,
                <input value="2fYVua" id="uid" type="text" size="5">
                <input value="Start Example" id="start" type="button" onclick="startExample();">
            </p>
            <p>
                <textarea readonly id="text" cols="80" rows="24" style="resize:none;"
                          >Press "Start Example" to begin ...</textarea>
            </p>
        </div>
        <script src="./js/tinkerforge/Tinkerforge.js" type='text/javascript'></script>
        <script type='text/javascript'>
            var ipcon;
            var textArea = document.getElementById("text");
            function startExample() {
                textArea.value = "";
                var HOST = document.getElementById("host").value;
                var PORT = parseInt(document.getElementById("port").value);
                var UID = document.getElementById("uid").value;
                if(ipcon !== undefined) {
                    ipcon.disconnect();
                }
                ipcon = new Tinkerforge.IPConnection(); // Create IP connection
                var io = new Tinkerforge.BrickletIO16V2(UID, ipcon); // Create device object
                ipcon.connect(HOST, PORT,
                    function(error) {
                        textArea.value += 'Error: ' + error + '\n';
                    }
                ); // Connect to brickd
                // Don't use device before ipcon is connected
                //                
                ipcon.on(Tinkerforge.IPConnection.CALLBACK_CONNECTED,
                    function (connectReason) {
                        // Set period for input value (channel 4) callback to 0.5s (500ms)
// theobald
ipcon.authenticate(
  "9Pttfnn9zh00i0uCQvNnnUedd",
  (ok) => { textArea.value += 'auth OK\n'; },
  (err) => { textArea.value +=  'auth ERR' + err + '\n'; }
);
// theobald end
                  
// geändert auf chanel 1 also A1-GND                  
                        io.setInputValueCallbackConfiguration(1, 500, false);
                    }
                );

                // Register input value callback
                io.on(Tinkerforge.BrickletIO16V2.CALLBACK_INPUT_VALUE,
                    // Callback function for input value callback
                    function (channel, changed, value) {
                        textArea.value += 'Channel: ' + channel + '\n';
                        textArea.value += 'Changed: ' + changed + '\n';
                        textArea.value += 'Value: ' + value + '\n';
                        textArea.value += '\n';
                        textArea.scrollTop = textArea.scrollHeight;
                    }
                );
            }
        </script>
    </body>
</html>

Zudem habe ich gerade bemerkt, dass über das Websocket in der Developer Konsole von FF Daten alle 500ms fließen. Nur die kommen offs im Browser nicht an?? Das sieht so aus:

grafik.thumb.png.14909499da8aadda4edb1ac550beb01f.png

Firmware ist v.2.0.2.

OK! Danke benzüglich des Fehlercodes...

Grüße
Theo

 

bearbeitet von theobald
Geschrieben

Du benutzt das Authenticate falsch, den setInputValueCallbackConfiguration-Aufruf (und alles weitere was erst passieren soll, wenn die Verbindung steht und authentisiert ist) musst du in das returnCallback des authenticate-Aufrufs packen.

Geschrieben

Danke! Das werde ich gleich testen. Ich habe jetzt ca. 3000 Zeilen code für diese Projekt geschrieben und diese Verfahrensweise bisher nirgendwo beachtet.

Steht das in der API-Beschreibung?

Asche auf mein Haupt! 😀

Grüße und Danke.
Theo

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...