Hallo,
Ich bin neu hier. Mit dem Arduino UNO beschäftige ich mich schon eine Weile auf etwas fortgeschrittener Anfängerebene. Bisher hauptsächlich so Kleinigkeiten wie irgendwelche Signale oder Messwerte abfragen und weiter leiten und/oder Schaltfunktionen ausführen. Also nichts Besonderes. Bin kein Programmieranfänger. Allerdings fehlt mit bezüglich C/C++ und Arduino die Erfahrung in tieferer Ebene. Mein Schwerpunkt liegt in VB/VBA/Assembler.
Meine Aufgabe: Mein bestehendes funktionierendes Dartboard bezüglich der Matrix abfragen und Ausgabe der Trefferpunkte des jeweiligen Wurfes in deutscher Sprache. Ohne Auswertungen der Treffer und Summen und resultierender anderer Situation. Das soll weiter das Dartboard selbst machen. Nur der Zahlenwert des Treffers und ob "double", "triple" oder "Bullseye".
Wie man mit dem Arduino so eine Matrix komplett selbst abfragen kann habe ich schon in Dartselbstbauanleitungen gefunden und wollte Teile davon für mein Projekt verwenden. Aber das ist grausig zu langsam. ![]()
Ich habe also weiter gestöbert und bin dann auf Portmanipulation gekommen. Das sei x-fach schneller als "digitalread". Und interruptgesteuert wäre es noch besser. Allerdings bräuchte ich 8 interruptfähige Eingangsbits.
Falls ich das "Pollen" mit einem "UNO" nicht hinbekomme kaufe ich eben einen "DUE". Der hat ja genug interruptfähige Bits.
Nun mal konkret: Das Board hat eine Matxis aus 8x8 Leitungen. Auf den ersten 8 Leitungen (Spalten der Matrix) "zirkuliert" von der Boardelektronik gesteuert ein aktives Bit (Low). Also nacheinander immer alle 8 Leitungen kurz low. Umlauffrequenz ca. 3 bis 5 Kilohertz.
Sobald ein Dart trifft, wird eine der 8 Matrixreihenleitungen (9 bis 16) kurz low. Je nachdem wie lange der Dart den Kontakt auslöst, wiederholt sich der Low-Impuls zyklisch. Aber das spielt keine Rolle, weil beim ersten Erkennen schon eine Auswertung beginnen soll und dann eine winzige Wartepause eingelegt wird.
Nach dem Start des Programm, Einbinden von Bibliotheken (welche?) und Durchlauf des Setups folgt die Mainloop.
In dieser Mainloop möchte ich zyklisch alle 8 Bits der Reihen-Leitungen 9 bis 16 gleichzeitig lesen. Solange das gelesene Byte Binär = 11111111 ist passiert nichts und die Loop rennt weiter im Kreis.
Wenn das gelesene Byte <> 11111111 ist, wird es der Variablen Y zugewiesen und umgehend die ersten 8 Bits der Spalten-Leitungen 1 bis 8 dazu in eine Variable (X) gelesen werden.
Damit habe ich also Spalte und Reihe der Dartmatrix, die getroffen wurde. Damit rufe ich dann die Tonausgabe auf. Z.B. call maketon(x,y). Hier werden die binären Matrixwerte in Spalten und Reihennummern umgewandelt aus einem entsprechend aufgebauten Dateiverzeichnis die passenden Textdateien abgespielt.
Dann wieder die Loop von vorne.
Wie gesagt, mich interessiert hauptsächlich wie ich es in einer Loop schaffe 8 Digitalports gleichzeitig in eine Byte-Variable zu bekommen.
So ein Matrixbit liegt nur ca. 10µS lang an! Dann folgt das nächste. Und das zweite Byte der Auswertung, also die Spaltennummer muss innerhalb dieser Pulsdauer kommen sonst ist der Spaltenimpuls schon bei der nächsten Spalte. Also so schnell wie möglich.
Für ein paar Ideen und vielleicht ein paar Codeschnipsel zu der schnellsten parallelen Abfrage wäre ich dankbar. Gerne stelle ich dann mein Bastelergebnis, wenn es klappt, auch hier zur Verfügung.