Portpinzugriff über Array

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Portpinzugriff über Array

      Liebe Bascom-Jünger,
      das ist für euch wahrscheinlich eine ganz einfache Sache: ich möchte per Variable in einem Array auf spezielle Pins zweier Ports zugreifen. In etwa so:

      Dim Relais_ch(4) As Byte ' ... as Bit geht ja leider nicht, oder?
      Config Porth.6 = Output : Relais_ch(1) Alias Porth.6
      Config Porth.5 = Output : Relais_ch(2) Alias Porth.5
      Config Porta.0 = Output : Relais_ch(3) Alias Porta.0
      Config Porta.2 = Output : Relais_ch(4) Alias Porta.2

      Ziel ist jedenfalls, später in Schleifen so etwas machen zu können:

      For Kanal = 1 to 4
      if Spannung >= 1000 then Relais_ch(kanal) = 1
      next Kanal

      Oder löst man das eleganter mit "Overlay" in der Form
      Dim Relais_ch(4).0 as? at Porth.6 overlay
      Dim Relais_ch(4).1 as? at Porth.5 overlay usw?

      Aber das funktioniert nicht, da ich ein Array ja nur 1x dimensionieren kann und es dann eben doch wieder "Dim Relais_ch(4) As Byte " heißen müßte ...


      Welche Möglichkeit gäbe es ggf noch, um eine solche "schleifenkonforme" Schaltmöglichkeit der Relais einzuführen, ohne immer noch weitere if-then's oder "select-case-Kanal" bemühen zu müssen?


      Oder ist die Sache eben doch nicht so einfach, weil es kreuz und quer durch die Ports geht?
    • Ein Array gibt es bei Bytes/Words/Longs usw. aber nicht bei Bits.
      Du kannst auf die Bits eines Bytes oder Words etc. mit der Zahl nach dem Punkt zugreifen

      Dim X as Byte

      X.1 = ...
      X.2 = ...

      Oder
      For I = 0 to 7
      X.i = ...
      Next

      Wenn Rechenvariable und Ausgabe nicht passen, dann hilft nur umswitchen.

      Do

      Rechnen mit X

      Gosub Ausgabe

      Loop


      Ausgabe:
      PortA.0 = X.3
      PortA.1 = X.0

      usw.
      Return
    • Hi Michael,
      alles klar, danke! Ein "(bitweises) Overlay von Arrayelementen auf Portregister(pins)" geht also nicht.

      In meinem Fall werde ich es dann so machen ("händisch umswitchen"):

      Config Porth.6 = Output : Relais_ch1 Alias Porth.6
      Config Porth.5 = Output : Relais_ch2 Alias Porth.5
      Config Porta.0 = Output : Relais_ch3 Alias Porta.0
      Config Porta.2 = Output : Relais_ch4 Alias Porta.2
      ...
      For Kanal = 1 to 4
      if Spannung(Kanal) >= 1000 then
      Select Case Kanal
      Case 1 : Relais_ch1 = 1
      Case 2 : Relais_ch2 = 1
      Case 3 : Relais_ch3 = 1
      Case 4 : Relais_ch4 = 1
      End Select
      end if
      next Kanal
    • Hallo @six1,


      ok, Byte in einzelne Bits aufgelöst, insoweit verstanden.
      Aber wie kriege ich es hin, daß diese Einzelbits des Bytes "Relais" dann auch stets die oben genannten Portpins H.6, H.5, A.0 und A.2 ansprechen? Geht es auch OHNE eine "Dekodierung", also beispielsweise ohne das "Umswitchen" von Michael und ohne das "Select", das ich jetzt gerade verwende?


      Geht irgendein "Relais.0 at Porth.6 overlay : Relais.1 at Porth.5 overlay : usw." ?


      Am liebsten würde ich halt mit "Relais(kanal); wobei Kanal = 1 to 4" auf die Portpins zugreifen. Es ginge natürlich auch Relais.kanal
    • ok, seufz, dann ist das eben so.
      Bei mir geht es jetzt nämlich nicht nur um die vier Relais, sondern auch noch um 4x4 Portpins, die ich für die Ansteuerung von Multiplexern brauche. Und dann noch 8 ADC-Eingänge für Ströme und Spannungen, die auch noch munter durcheinander verteilt sind - es wird langsam unübersichtlich ... :(