Unterprogramme aufrufen mit case

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

    • BASCOM Source Code

      1. dim Eingang as byte
      2. Eingang.0 alias Pinc.0
      3. Eingang.1 alias Pinc.1
      4. Eingang.2 alias Pinc.2
      Da sollte der Compiler eigentlich einen Fehler auswerfen, um es wie Mitch64 sagt, zu sagen.

      Eingang wird normal dimensioniert und ist damit eine Speicherstelle im Ram (wird vom Compiler vergeben), Pinc ist ein im Regfile vordefiniertes Symbol, das zu einer bestimmten Speicherzelle verweist, nämlich dem Pinc-Register.
      Was soll der Alias hier genau bewirken? In der Schleife wird nirgends der Inhalt vom Pinc-Register in Eingang geschrieben.

      So herum könnte es funktionieren:

      Source Code

      1. Eingang_0 Alias Pinc.0
      2. Eingang_1 Alias Pinc.1
      3. Eingang_2 Alias Pinc.2
      4. If Eingang_0 = 1 And Eingang_1 = 1 And Eingang_2 = 1 Then
      5. ...
      6. Elseif ... Then
      7. ...
      8. Endif
    • PinC.0 ist ein Port der als Eingang definiert ist. Dessen Wert setzt das Bit0 in der Variable Eingang. Nix mit Register.

      Und die Kontrolle ob sich die Eingänge geändert haben hast Du ignoriert.
      Wem ich nicht ausdrücklich widerspreche, der darf das bis auf Widerruf als "Gefällt mir" verstehen.
    • Also den Code wirklich 1:1 eingegeben, der Compiler muckt auch nicht, aber es funktioniert nicht.
      Egal welche Eingang ich auf 1 setzte.

      Source Code

      1. '****************************
      2. ' RGB MB
      3. '****************************
      4. $regfile = "m88def.dat"
      5. $hwstack = 40
      6. $swstack = 16
      7. $framesize = 32
      8. $crystal =1000000
      9. Config PortD = Output
      10. Config PortB = Output
      11. Config PINC.0 = Input
      12. Config PINc.1 = Input
      13. Config Pinc.2 = Input
      14. RMOD1 Alias Portd.0
      15. BMOD1 Alias Portd.1
      16. GMOD1 Alias Portd.2
      17. RMOD2 Alias Portd.3
      18. BMOD2 Alias Portd.4
      19. GMOD2 Alias Portd.5
      20. RMOD3 Alias Portd.7
      21. BMOD3 Alias Portd.6
      22. GMOD3 Alias Portb.0
      23. Dim Eingang_alt as Byte
      24. Dim Eingang as Byte
      25. Eingang.0 Alias Pinc.0
      26. Eingang.1 Alias Pinc.1
      27. Eingang.2 Alias Pinc.2
      28. Eingang_alt = 0
      29. Do
      30. if Eingang_alt <> Eingang then
      31. Eingang_alt = Eingang
      32. If Eingang.0 = 1 and Eingang.1 = 0 and Eingang.2 = 0 then
      33. gosub LED1
      34. elseIf Eingang.0 = 0 and Eingang.1 = 1 and Eingang.2 = 0 then
      35. gosub LED2
      36. elseIf Eingang.0 = 1 and Eingang.1 = 1 and Eingang.2 = 0 then
      37. gosub LED3
      38. elseIf Eingang.0 = 1 and Eingang.1 = 0 and Eingang.2 = 1 then
      39. gosub LED4
      40. elseIf Eingang.0 = 0 and Eingang.1 = 1 and Eingang.2 = 1 then
      41. gosub LED5
      42. elseIf Eingang.0 = 1 and Eingang.1 = 1 and Eingang.2 = 1 then
      43. gosub LED6
      44. elseIf Eingang.0 = 0 and Eingang.1 = 0 and Eingang.2 = 0 then
      45. gosub LED7
      46. end if
      47. end if
      48. loop
      49. end
      50. LED1:
      51. RMOD3 = 1
      52. RMOD1 = 1
      53. RMOD2 = 1
      54. GMOD1 = 0
      55. GMOD2 = 0
      56. GMOD3 = 0
      57. BMOD1 = 0
      58. BMOD2 = 0
      59. BMOD3 = 0
      60. Return
      61. LED2:
      62. GMOD2 = 1
      63. RMOD1 = 1
      64. RMOD2 = 1
      65. RMOD3 = 1
      66. GMOD1 = 1
      67. GMOD3 = 1
      68. BMOD1 = 0
      69. BMOD2 = 0
      70. BMOD3 = 0
      71. Return
      72. LED3:
      73. GMOD3 = 0
      74. RMOD1 = 0
      75. RMOD2 = 0
      76. RMOD3 = 0
      77. GMOD1 = 1
      78. GMOD2 = 1
      79. GMOD3 = 1
      80. BMOD1 = 0
      81. BMOD2 = 0
      82. BMOD3 = 0
      83. Return
      84. LED4:
      85. RMOD1 = 1
      86. RMOD2 = 1
      87. RMOD3 = 1
      88. GMOD1 = 0
      89. GMOD2 = 0
      90. GMOD3 = 0
      91. BMOD1 = 0
      92. BMOD2 = 0
      93. BMOD3 = 0
      94. waitms 500
      95. RMOD1 = 0
      96. RMOD2 = 0
      97. RMOD3 = 0
      98. GMOD1 = 0
      99. GMOD2 = 0
      100. GMOD3 = 0
      101. BMOD1 = 0
      102. BMOD2 = 0
      103. BMOD3 = 0
      104. waitms 300
      105. Return
      106. LED5:
      107. GMOD2 = 1
      108. RMOD1 = 1
      109. RMOD2 = 1
      110. RMOD3 = 1
      111. GMOD1 = 1
      112. GMOD3 = 1
      113. BMOD1 = 0
      114. BMOD2 = 0
      115. BMOD3 = 0
      116. waitms 500
      117. GMOD2 = 0
      118. RMOD1 = 0
      119. RMOD2 = 0
      120. RMOD3 = 0
      121. GMOD1 = 0
      122. GMOD3 = 0
      123. BMOD1 = 0
      124. BMOD2 = 0
      125. BMOD3 = 0
      126. waitms 300
      127. Return
      128. LED6:
      129. GMOD2 = 1
      130. RMOD1 = 0
      131. RMOD2 = 0
      132. RMOD3 = 0
      133. GMOD1 = 1
      134. GMOD3 = 1
      135. BMOD1 = 0
      136. BMOD2 = 0
      137. BMOD3 = 0
      138. waitms 500
      139. GMOD2 = 0
      140. RMOD1 = 0
      141. RMOD2 = 0
      142. RMOD3 = 0
      143. GMOD1 = 0
      144. GMOD3 = 0
      145. BMOD1 = 0
      146. BMOD2 = 0
      147. BMOD3 = 0
      148. waitms 300
      149. Return
      150. LED7:
      151. GMOD2 = 0
      152. RMOD1 = 0
      153. RMOD2 = 0
      154. RMOD3 = 0
      155. GMOD1 = 0
      156. GMOD3 = 0
      157. BMOD1 = 0
      158. BMOD2 = 0
      159. BMOD3 = 0
      160. Return
      Display All
    • Hallo Thomas,

      eine Frage: wenn ich das richtig verstehe, ziehst du einen Eingang mit einem Taster gegen "0". Welcher Pegel liegt an den Eingängen, wenn der Taster nicht betätigt ist? Möglicherweise fehlt der Pull-Up Widerstand an den Eingängen.

      Im AVR kann man dazu interne Pull-Ups aktivieren, mit "PortC.0=1". Vielleicht kannst du nach den "Config PinC.0= Input" das Kommando "PortC.0=1" auch für alle Eingänge entsprechend einfügen.

      Viel Spaß
      Ulrich
    • Hallo Ulrich,

      anbei der Code der funktioniert.


      Source Code

      1. '****************************
      2. ' RGB MB
      3. '****************************
      4. $regfile = "m88def.dat"
      5. $hwstack = 40
      6. $swstack = 16
      7. $framesize = 32
      8. $crystal =1000000
      9. Config PortD = Output
      10. Config PortB = Output
      11. Config PINC.0 = Input
      12. Config PINc.1 = Input
      13. Config Pinc.2 = Input
      14. RMOD1 Alias Portd.0
      15. BMOD1 Alias Portd.1
      16. GMOD1 Alias Portd.2
      17. RMOD2 Alias Portd.3
      18. BMOD2 Alias Portd.4
      19. GMOD2 Alias Portd.5
      20. RMOD3 Alias Portd.7
      21. BMOD3 Alias Portd.6
      22. GMOD3 Alias Portb.0
      23. Eingang1 Alias PINC.0
      24. Eingang2 Alias PINC.1
      25. Eingang3 Alias PINC.2
      26. RMOD1 = 0
      27. RMOD2 = 0
      28. RMOD3 = 0
      29. GMOD1 = 0
      30. GMOD2 = 0
      31. GMOD3 = 0
      32. BMOD1 = 0
      33. BMOD2 = 0
      34. BMOD3 = 0
      35. Do
      36. If Eingang1 = 1 and Eingang2 = 0 and Eingang3 = 0 then:gosub LED1
      37. elseIf Eingang1 = 0 and Eingang2 = 1 and Eingang3 = 0 then:gosub LED2
      38. elseIf Eingang1 = 1 and Eingang2 = 1 and Eingang3 = 0 then:gosub LED3
      39. elseIf Eingang1 = 1 and Eingang2 = 0 and Eingang3 = 1 then:gosub LED4
      40. elseIf Eingang1 = 0 and Eingang2 = 1 and Eingang3 = 1 then:gosub LED5
      41. elseIf Eingang1 = 1 and Eingang2 = 1 and Eingang3 = 1 then:gosub LED6
      42. elseIf Eingang1 = 0 and Eingang2 = 0 and Eingang3 = 0 then:gosub LED7
      43. end if
      44. loop
      45. end
      46. LED1:
      47. RMOD3 = 1
      48. RMOD1 = 1
      49. RMOD2 = 1
      50. GMOD1 = 0
      51. GMOD2 = 0
      52. GMOD3 = 0
      53. BMOD1 = 0
      54. BMOD2 = 0
      55. BMOD3 = 0
      56. Return
      57. LED2:
      58. GMOD2 = 1
      59. RMOD1 = 1
      60. RMOD2 = 1
      61. RMOD3 = 1
      62. GMOD1 = 1
      63. GMOD3 = 1
      64. BMOD1 = 0
      65. BMOD2 = 0
      66. BMOD3 = 0
      67. Return
      68. LED3:
      69. GMOD3 = 0
      70. RMOD1 = 0
      71. RMOD2 = 0
      72. RMOD3 = 0
      73. GMOD1 = 1
      74. GMOD2 = 1
      75. GMOD3 = 1
      76. BMOD1 = 0
      77. BMOD2 = 0
      78. BMOD3 = 0
      79. Return
      80. LED4:
      81. RMOD1 = 1
      82. RMOD2 = 1
      83. RMOD3 = 1
      84. GMOD1 = 0
      85. GMOD2 = 0
      86. GMOD3 = 0
      87. BMOD1 = 0
      88. BMOD2 = 0
      89. BMOD3 = 0
      90. waitms 500
      91. RMOD1 = 0
      92. RMOD2 = 0
      93. RMOD3 = 0
      94. GMOD1 = 0
      95. GMOD2 = 0
      96. GMOD3 = 0
      97. BMOD1 = 0
      98. BMOD2 = 0
      99. BMOD3 = 0
      100. waitms 300
      101. Return
      102. LED5:
      103. GMOD2 = 1
      104. RMOD1 = 1
      105. RMOD2 = 1
      106. RMOD3 = 1
      107. GMOD1 = 1
      108. GMOD3 = 1
      109. BMOD1 = 0
      110. BMOD2 = 0
      111. BMOD3 = 0
      112. waitms 500
      113. GMOD2 = 0
      114. RMOD1 = 0
      115. RMOD2 = 0
      116. RMOD3 = 0
      117. GMOD1 = 0
      118. GMOD3 = 0
      119. BMOD1 = 0
      120. BMOD2 = 0
      121. BMOD3 = 0
      122. waitms 300
      123. Return
      124. LED6:
      125. GMOD2 = 1
      126. RMOD1 = 0
      127. RMOD2 = 0
      128. RMOD3 = 0
      129. GMOD1 = 1
      130. GMOD3 = 1
      131. BMOD1 = 0
      132. BMOD2 = 0
      133. BMOD3 = 0
      134. waitms 500
      135. GMOD2 = 0
      136. RMOD1 = 0
      137. RMOD2 = 0
      138. RMOD3 = 0
      139. GMOD1 = 0
      140. GMOD3 = 0
      141. BMOD1 = 0
      142. BMOD2 = 0
      143. BMOD3 = 0
      144. waitms 300
      145. Return
      146. LED7:
      147. GMOD2 = 0
      148. RMOD1 = 0
      149. RMOD2 = 0
      150. RMOD3 = 0
      151. GMOD1 = 0
      152. GMOD3 = 0
      153. BMOD1 = 0
      154. BMOD2 = 0
      155. BMOD3 = 0
      156. Return
      Display All
      wie gesagt , die Eingänge liegen unbetätigt auf 0V und werden mit 24V eingeschaltet.
    • hasta wrote:

      PinC.0 ist ein Port der als Eingang definiert ist. Dessen Wert setzt das Bit0 in der Variable Eingang. Nix mit Register.

      Und die Kontrolle ob sich die Eingänge geändert haben hast Du ignoriert.
      Im Datenblatt auf S. 291 sehe ich aber ein Register PINC mit der Adresse 0x06. Wenn ich aus dem Bascom-Ordner das "m88def.dat"-File aufmache, finde ich darin eine Definition für PINC=$06 (Zeile 337).
      Wie soll die CPU sonst zu dem Wert kommen?
      Dass eine Änderung des Werts von Register PINC (zb. Bit 0) automatisch auch das Bit 0 im Ram, wo die Variable Eingang steht, ändert, ist mal eine von dir getroffene Annahme.
      In der Bascom - Hilfe zu Alias steht, dass man damit z.b. Port/Pin-Zugriff einen sinnvolleren Namen geben kann, zb. Relais1 Alias Portb.1

      Dass magisch Code erzeugt wird, der das Bit aus dem Pin-Register in eine Variable kopiert, steht dort nicht.


      Nachdem sich Eingang nicht ändert, hat die Kontrolle auch keinen Effekt.
    • Zum Verständis für Thomas:

      Ein Alias zu vergeben bedeutet nur, dass der Kompiler (wann immer er auf dieses Alias trifft) dieses durch die vorgegebene Angabe ersetzt. Wenn Du z.B. schreibst

      BASCOM Source Code

      1. Eingang1 Alias PINC.0
      2. Do
      3. If Eingang1 = 1 then gosub LED1
      4. Loop

      dann macht der Kompiler das daraus:

      BASCOM Source Code

      1. Do
      2. If PINC.0 = 1 then gosub LED1
      3. Loop
      Nicht mehr und auch nicht weniger. Anstelle von "Eingang1" könnte dort auch "Venus17", "Jupiter8" oder sonst ein alphanumerischer Begriff stehen, solange es sich nicht um reservierte Begriffe handelt. Was der Kompiler allerdings macht, wenn man "Eingang.1" verwendet (was in Deinem Programm ganz klar ein Bit der Variable "Eingang" benennt), weiss ich leider auch nicht.


      Wenn bei dem Code mit Bit-Abfragen gearbeitet werden soll, dann streich die ganze Alias-Geschichte raus und setz vor die ganze If-Abfrage folgendes ein:

      BASCOM Source Code

      1. Do
      2. Eingang.0 = Pinc.0
      3. Eingang.1 = Pinc.1
      4. Eingang.2 = Pinc.2
      5. .
      6. hier die If-Abfragen
      7. .
      8. Loop
      9. End
      Denn nur so werden die Zustände Deiner Eingangspins auch regelmäßig in den entsprechenden Bits der Variable "Eingang" gesetzt.

      Nette Grüße
      Robert