Alias Port in Sub ByVal übergeben

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Alias Port in Sub ByVal übergeben

      Hallo Forum,

      die Übergabe eines Ports in einem Sub macht mir Probleme. Innerhalb des Subs kann ich den Port nicht mehr toggeln.

      Hier mein Quellcode (nur im Grundsatz):

      LEDgn Alias PortD.5 : DDRD.5=1 : PortD.5=1 ' LED grün
      Declare Sub CodeBlinker ( ByVal Port as Byte )


      Do
      Call CodeBlinker ( LEDgn )
      Loop

      Sub CodeBlinker( Port )

      Port = Not Port

      End Sub

      In dieser Ausführung müsste die LED nun blinken, was sie aber nicht macht. Was mache ich denn da falsch?
    • Versuche mal byref in deinem declare sub.
      BYREF
      Use BYREF to pass a variable by reference with its address. When using the referenced address, you work on the original variable. So a change of the variable inside the sub routine, will change the passed variable outside the routine as well.

      Port würde ich nicht als Bezeichnung verwenden, wundert mich, das es da keine Fehlermeldung gibt.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Hallo, vielen Dank für die flotte Nachricht.
      Kann ich auf alle drei antworten?
      djmsc: das mit dem Toggeln ist nur ein Testbefehl, dafür bräuchte ich natürlich kein Sub. Ich brauche aber ein Sub, weil ich daraus einen CodeBlinker machen will der verschiedene LEDs unterschiedlich blinken lassen soll.
      tschowatsch: ByRef kommt eine Fehlermeldung. Die Bezeichnung Port bringt keine Fehlermeldung- sicherheitshalber habe ich aber auch eine andere Bezeichnung verwendet.
      Dein Hinweis, dass mit ByRef eine Rückgabe erfolgt den werde ich mal ausprobieren (mit einer anderen Variable) Gut möglich, dass eine Portadresse einfach nicht erlaubt ist. Blöd ist das schon, denn so eine Portadresse ist doch auch nichts anderes als eine Byte- Variable.
      ewatv: Mit meiner Do Loop Schleife wollte ich nur andeuten, dass ich die Sub Routine auch anspreche. Aber selbst bei 8 MHz Takt würde die LED mindestens glimmen.

      Also frage ich den erlauchten Kreis, was könnte ich da machen. Der Mark Albers kriegt das doch auch hin. Ihr braucht euch doch nur mal den Befehl : Config LCDPin = Pin , Db4 = Portc.4 , Db5 = Portc.5 ,...) an zu schauen.

      Viele Grüße aus dem schönen Hunsrück
    • Dieter schrieb:

      Hier mein Quellcode (nur im Grundsatz):
      ohne compilierfähiges Programm mit header etc. wirst du nur ein Frage-Antwort-Spiel auslösen, bei dem du mit Glück eine Lösung bekommst.
      Mit Pech zieht sich das ewig hin und nur die fleißigsten machen sich die Mühe, da ständig neue Fragen zu stellen.

      Bitte poste ein compilierfähiges Programm.

      Gruß, Michael
    • Freunde, ich habe eine Erklärung:

      wie Ihr wisst kann man kein Bit /Boolean in einem Sub oder einer Function übertragen. Ein Port (z.B. PortD.5) ist aber ein Bit, auch dann noch wenn man ein Aliasing daraus macht.
      Der Aliasing- Name ist euch nur ein Bit.

      Folgender Code funktioniert:

      LEDgn Alias PortD.5 : DDRD.5=1 : PortD.5=1 ' LED grün
      Declare Sub CodeBlinker ( ByRef Port as Byte )
      Dim Test as Byte

      Do

      Test = LEDgn
      Call CodeBlinker ( Test )
      LEDgn = Test.0

      Loop

      '----------------------------------------------------------------
      Sub CodeBlinker( Port )

      Port.0 = Not Port.0

      End Sub
      '---------------------------------------------------------------

      Das ist natürlich nicht das was ich wollte, denn ich möchte ja mein Sub "CodeBlinker" für mehrere LEDs gleichzeitig verwenden. Subs und Functions müssten eben noch die Eigenschaft besitzen, dass man auch Bits übertragen kann und zwar per ByRef. Wollen wir das nicht mal anregen- oder spricht da etwas dagegen?
      Meister Hora: das mit dem ByREF habe ich getestet, nur ByRef gibt den im Sub geänderten Wert wieder zurück. Nachteil man muss deshalb grundsätzlich eine Variable verwenden.
      Vorteil: ByRef legt keine Kopie an, ist also schneller und benötigt weniger Speicher. Sollte man sich verinnerlichen.
      Viele Grüße
      Dieter
    • Was hältst du denn davon?

      BASCOM-Quellcode

      1. Declare Sub Codeblinker(byval Pin_x As Byte)
      2. Config Portd = Output
      3. Led1 Alias Portd.0
      4. Led2 Alias Portd.1
      5. Led3 Alias Portd.2
      6. Led4 Alias Portd.3
      7. Led5 Alias Portd.4
      8. Led6 Alias Portd.5
      9. Led7 Alias Portd.6
      10. Led8 Alias Portd.7
      11. Dim Led_pin As Byte
      12. Do
      13. Led_pin = 0
      14. Call Codeblinker(led_pin)
      15. Loop
      16. End
      17. Sub Codeblinker(byval Pin_x As Byte)
      18. Select Case Pin_x
      19. Case 0 : Toggle Led1
      20. Case 1 : Toggle Led2
      21. Case 2 : Toggle Led3
      22. Case 3 : Toggle Led4
      23. Case 4 : Toggle Led5
      24. Case 5 : Toggle Led6
      25. Case 6 : Toggle Led7
      26. Case 7 : Toggle Led8
      27. End Select
      28. End Sub
      Alles anzeigen
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Dieter schrieb:

      dass man auch Bits übertragen kann und zwar per ByRef
      Dann übertrage halt ein byte und verwende nur ein bit.
      dim z as bit verbraucht auch ein byte an ram, das ist/war bisher auch nicht schlimm
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Hallo Michael,

      danke für den Tipp für die bessere Vorgehensweise bei Anfragen.
      Ich möchte tatsächlich kein Frage-Antwortspiel anregen.
      Mir geht es eigentlich um grundsätzliche Eigenschaften von BASCOM und ich habe schon eine ganze Menge an Projekten mit dieser schönen Programmiersprache realisiert.

      Deshalb hier noch die Antwort an djmsc: Ich verstehe unter CodeBlinker eine Routine die einen Blinkcode ausgibt (drei mal kurz dann Pause z.B) damit kann man bei Geräten ohne weitere Anzeigen den aktuellen Betriebszustand ausgeben. Ich danke Dir für die Bereitschaft mir bei der Erstellung zu helfen- aber das ist nicht nötig- ich habe schon eine Lösung.
      Die möchte ich nur noch damit perfektionieren, dass ich auch den Port übergeben kann, was leider nicht funktioniert (derzeit)

      Also bitte keine Kommentare mehr zu dem Quellcode, sondern nur zu dem Thema weshalb man keine Bits in Subs oder Functions übergeben kann. Kennt eventuell Jemand eine Lösung wie man das dennoch hin bekommt- ohne "Glimmzüge" oder Winkelcode.

      danke
      Dieter
    • Port.X-Zugriffe werden beim kompilieren direkt an dieser Stelle im Code als Lese-/Maskier-/Schreib-Operation (in ASM LD, AND/OR, ST) umgesetzt, als Parameter für eine Sub/Function müsste dafür ein neuer Datentyp eingeführt werden, der die Portadresse + Bitposition enthält. Das wäre zwar möglich und würde manchen Code ein bisschen schöner machen, ich glaube aber nicht, dass Mark diesen Aufwand betreiben wird, nachdem das funktional ja schon umsetzbar ist.

      Lg
    • Dieter schrieb:

      damit kann man bei Geräten ohne weitere Anzeigen den aktuellen Betriebszustand ausgeben.
      Dann übergib doch einem Port ein Byte mit dem jeweiligen Bit-Muster in dem der aktuelle Zustand steht.

      BASCOM-Quellcode

      1. Dim Ausgabe As Byte
      2. Ausgabe.0 = 0
      3. Ausgabe.1 = 1
      4. ...
      5. 'usw
      6. Do
      7. Portx = Ausgabe
      8. Loop
      9. End
      Alles anzeigen
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.