die 16 IO's sind an einer Hardware mit 16 Adressleitungen angeschlossen und sind rein digital.
Die Adressen können sich ständig ändern.
Ganz einfach gesagt:
Ich möchte von einem 8Bit Computer den Adressbus auswerten.
Im Prinzip müssen diese IO's ständig gelesen werden und sollen in einer Variablen "adr" als 16Bit Adresse abfragbar sein
Nimm einen Atmega 2560, dann kannst Du Deine 16 Leitungen an die Ports F und K (A0 bis A15) legen und diese mit 2 Lesebefehlen einlesen und mit <<8 kombinieren.
Ich vermute aber mal, dass sie die Adressleitungen schneller ändern, als Du sie mit einem MC auslesen kannst.
Wie stellst Du sicher, dass Du die Adressleitungen nur ausliest, wenn die Adresse stabil anliegt? Und wie häufig ist 'ständig'? Wenn Du die INPUT-Pins nacheinander einliest, wird sich die Adresse mit hoher Wahrscheilichkeit während des Einlesens ändern und du liest Zufallswerte. Du wirst vermutlich ein 'capture-Register' für die Adressleitungen brauchen.
deine 16 Leitungen ändern sich nicht. Sonst hättest du keine defines für die Pins.
Der Wert, die Zustände, die Pegel, der 16 Leitungen ändern sich. Logisch.
Diese 0 und 1 möchtest du in einer 16 Bit Variablen speichern. Soweit klar.
Diese 16 Bits in einer Variablen sind völlig unabhängig an welchen Port Pins du die 16 Leitungen, die du überwachen möchtest, angeschlossen hast.
Wenn du anfängst alle 16 Leitungen einzeln nacheinander einzulesen, passiert das was MicroBahner beschreibt. Problem dabei ist, alle 16 Signale stammen nicht vom gleichen Zeitpunkt des Einlesens, du hast keine Zuordnung. Damit kann man sich das gesamte Vorhaben sparen. Man liest irgendwelchen Müll ein der nichts mit den Bitzuständen auf dem Bus zu tun hat. Wenn das ein Datenbus ist den ich mir im Moment vorstelle.
Man kann sich externe I/O Expander holen zum Zeitgleichen einlesen. Dann hat man aber noch einen Bus dazwischen. I2C oder SPI. Die Abfrage kostet Zeit. Kommt darauf an wie hoch die Abtastrate sein soll. Oder man wählt einen ausreichend großen Controller, Arduino Mega2560, woran man zwei 8-Bit Ports frei hat. Hier liest man 8-Bit auf einmal ein und das 2x hintereinander. Wenn diese 16 Bit zusammengehören, hat man auch einen Zeitversatz, selbst wenn es nur paar wenige Takte sind. Dann bräuchte man einen 16Bit oder 32Bit Controller der größere Portbreiten hat. Oder entsprechendes I/O Expander.
Jetzt musst du dir überlegen wir kritisch die Signale sind.
Was ist das für ein Bus?
Welchen Takt hat der Bus?
Muss jede Änderung erfasst werden oder darf es Lücken geben?
Müssen alle Bits zeitlich syncron erfasst werden?
usw. …
wenn du meinst das es nicht so Zeitkritisch ist, dann probiere es aus. Du wirst testen müssen ob der Pico schnell genug ist. Bevor du ChatGPT fragst, solltest du den Code von noiasca verstehen. Kann man noch zeitlich optimieren, die Basis ist da.
Nochmal kurz überschlagen. 150MHz / 1,77MHz = 84,7 Takte Luft
Das wird dennoch sportlich.
digitalRead befürchte ich, wird zu langsam ein.
Du wirst wohl direkt die Register auslesen müssen.
Ich würde ausgerollten Code schreiben. Keine Schleife. Ich würde versuchen die 16 Leitungen dennoch sortiert an die freien Pins zu klemmen. Dann sollte der Code zeitlich zu optimieren sein. Weniger einzelne Bitschubserei. Bit zusammenfassen usw.
Probiere es aus.