theobald Geschrieben September 29, 2020 at 06:46 Geschrieben September 29, 2020 at 06:46 (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 September 29, 2020 at 06:49 von theobald Zitieren
rtrbt Geschrieben September 29, 2020 at 07:54 Geschrieben September 29, 2020 at 07:54 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 Zitieren
theobald Geschrieben September 29, 2020 at 15:11 Autor Geschrieben September 29, 2020 at 15:11 (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: Firmware ist v.2.0.2. OK! Danke benzüglich des Fehlercodes... Grüße Theo bearbeitet September 29, 2020 at 16:18 von theobald Zitieren
rtrbt Geschrieben September 30, 2020 at 11:30 Geschrieben September 30, 2020 at 11:30 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. 1 Zitieren
theobald Geschrieben September 30, 2020 at 12:56 Autor Geschrieben September 30, 2020 at 12:56 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 Zitieren
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.