Unterprogramm, 2. Mikrocontroller

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

    • ceperiga wrote:

      Macht das Lesen des Programms viel einfacher, insbesondere bei der Fehlersuche
      Sollte man für sich ausprobieren. Ich empfinde sie als störend - sie sehen aus wie Variablen aber verhalten sich anders. Dürfen während der Schleife nicht beliebig verändert werden , bergen die Gefahr des Vertippens und können nicht als Array ausgelegt werden.
      Es wäre vielleicht eine sinnvolle Erweiterung des Editors wenn er sie irgendwie besonders kennzeichnet.
      Vielleicht in Braun wie die Ports/Pins.
    • Wenn man sich vertippt, schägt der Compiler an, das merkt man schnell.
      Man kann dem Alias auch ein Prefix perpassen, dann ist es auch wieder deutlich von einer Variable zu unterscheiden.

      Prefixe wie Sense_ oder Pin_ oder LED_ kann man gut verwenden.

      Ich habe den Code von oben mal angeschaut und für mich zur besseren Lesbarkeit mit Aliassen ausgestattet.
      Dabei sind mir 2 Fehler aufgefallen.

      In Zeile 39 wird der Taster_Quit (schöner Alias) als Input konfiguriert.
      Der zugehörige Pullup wird aber in Zeile 41 nicht eingeschaltet.
      Sondern der vom Sense_MotorOeldruck (Alias für Sensor Motorödruck).

      In Zeile 163 steht If Pinb.0 = 0 Or Pinb.1 = 0 Or Pinb2. = 0 And Flag = 0 Then
      sollte das nicht so heißen: If Pinb.0 = 0 Or Pinb.1 = 0 Or Pinb.2 = 0 And Flag = 0 Then
      Kaum macht man es richtig - und schon geht's!
    • Und ist da in jedem Raum, in dem ein Pult ist auch je ein Lautsprecher bzw. Horn?

      Wie weit sind die Pulte in Meter voneinander getrennt?

      Man kann eine LED nur begrenzt entfernt steuern. Ein Pin macht nur max. 20mA. 3 LED's an einem Pin geht nicht direkt.

      Vielleicht ist es ne gute Idee, 3 Controller einzusetzen, für jedes Pult einen.
      Ein Pult fungiert als Überwacher und prüft die Sensoren, die anderen dienen nur als Terminal.
      Eine Verbindung könnte man über 485-Bus realisieren. Den Terminals wird dann lediglich mitgeteilt, welche LED blinken soll und ob das Horn Stummgeschaltet wurde. Die melden allerdings auch zurück, wenn an dem Pult etwas bedient wurde.
      Kaum macht man es richtig - und schon geht's!
    • Zuerst einmal ein frohes Neues Jahr

      Mitch64 wrote:

      @Fiede

      Sag mal, ist die Steuerung für ein Schiff gedacht?
      Die Begriffe Maschinenraum, Messe und Steuerraum deuten darauf hin.

      Wenn ja, wie weit sind die Anzeige- bzw. Steuer-Pulte auseinander.
      Die müssten da ja verbunden werden. An was für eine Verbindung hast du da gedacht?
      Die Steuerung ist für ein Schiff gedacht. Die Wege sind lang. Daher wollte ich drei separate Anzeigen erstellen. Ich komme aus dem Maschinenraum mit einer 5 adrigen Steuerleitung in die einzelnen Bereiche. Da habe ich dann jeweils : 24 Volt plus, 24 Volt minus und die drei Schalteradern. Das müßte doch eigentlich klappen. Die Schaltungen werden sich ja wohl nicht gegenseitig beeinflussen. Wenn nicht hatte ich an Optokoppler gedacht.

      Mein Programm habe ich jetzt etwas überarbeitet. Auch habe ich mir einen kurzen Programmschnipsel geschrieben, damit ich nicht immer wieder bei den timern überlegen muss.

      BASCOM Source Code

      1. 'Drei Timer
      2. '----------------------------------------------------------
      3. $regfile = "m8def.dat" 'ATmega8-Deklarationen
      4. $crystal = 3686400 'Quarz: 3,6864 MHz
      5. Ddrd = &B11000000 'Pins PD6+PD7 auf Ausgang
      6. Ddrb = &B00000011
      7. ' 1000 ms
      8. '3686400 Hz / 8 = 460800 x 1000 = 460800000 1 s / 460800000 = 0,00217 ms
      9. ' 64 = 57600 x 1000 = 57600000 1 s / 57600000 = 0,01736 ms 7935 -
      10. ' 256 = 14400 x 1000 = 14400000 1 s / 14400000 = 0,06944 ms 51134 ---Timerstartwert
      11. ' 1024 = 3600 x 1000 = 3600000 1 s / 3600000 = 0,27777 ms 61935 -
      12. '1000000 Hz / 8 = 125000 x 1000 = 125000000 1 s / 125000000 = 0,00833 ms
      13. ' 64 = 15625 x 1000 = 15626000 1 s / 15626000 = 0,06400 ms 49911
      14. ' 256 =3906,25 x 1000 = 3906250 1 s / 3906250 = 0,25600 ms 61729
      15. ' 1024 =976,562 x 1000 = 976562,5 1 s / 976562,5 = 1,02400 ms
      16. 'On Timer0 Ontimer0 'Interrupt-Routine für Timer0-Overflow
      17. 'Config Timer0 = Timer , Prescale = 1024 'Takt ist Quarz/1024
      18. 'Enable Timer0 'Timer1-Overflow-Interrupt ein
      19. 'Enable Interrupts 'Interrupts global einschalten
      20. On Timer1 Ontimer1 'Interrupt-Routine für Timer1-Overflow
      21. Config Timer1 = Timer , Prescale = 64 'Takt ist Quarz/64
      22. Enable Timer1 'Timer1-Overflow-Interrupt ein
      23. Enable Interrupts 'Interrupts global einschalten
      24. 'On Timer2 Ontimer2 'Interrupt-Routine für Timer2-Overflow
      25. 'Config Timer2 = Timer , Prescale = 1024 'Takt ist Quarz/1024
      26. 'Enable Timer2 'Timer1-Overflow-Interrupt ein
      27. 'Enable Interrupts 'Interrupts global einschalten
      28. Dim Zahl As Word
      29. '----------------------------------------------------------
      30. Do
      31. If Zahl = 10 Then
      32. Portd.7 = 1
      33. Else
      34. Portd.7 = 0 'Hauptschleife: LED blinken lassen
      35. 'Portd.7 = Not Portd.7
      36. End If 'LED an/aus
      37. 'Waitms 100
      38. Loop
      39. '------------------------------------------------------------
      40. 'Ontimer0: 'Timer0-Overflow-Interrupt-Routine
      41. '
      42. ' Portb.0 = Not Portb.0 '
      43. 'Return
      44. '----------------------------------------------------------
      45. Ontimer1: 'Timer1-Overflow-Interrupt-Routine
      46. Timer1 = 36733 'Timer1 voreinstellen (=65535-7936) Blinkfrequenz 1 Sek
      47. Portd.6 = Not Portd.6 'Timer1 voreinstellen (=65535-28801) Blinkfrequenz 0,5 Sek
      48. Incr Zahl
      49. If Zahl > 11 Then
      50. Zahl = 0
      51. End If '
      52. Return
      53. '------------------------------------------------------------
      54. 'Ontimer2: '
      55. '
      56. ' Portb.1 = Not Portb.1 '
      57. 'Return
      58. Bei dem eigentlichen Programm habe ich aber immer noch Probleme mit dem Ausschalten der Hupe.
      59. Die Hupe habe ich erst einmal simuliert durch eine LED. Während des Ausschaltens glimmt die LED immer noch leicht.
      60. Da ist doch sicher noch etwas nicht in Ordnung .
      61. hier das Programm bisher (seit nachsichtig)
      62. $regfile = "m8def.dat"
      63. $crystal = 3686400
      64. $hwstack = 32
      65. $swstack = 10
      66. $framesize = 80
      67. Declare Sub Keypressed
      68. Dim Zeit As Word
      69. Dim Hupe As Bit
      70. On Timer1 Ontimer1 'Interrupt-Routine für Timer1-Overflow
      71. Config Timer1 = Timer , Prescale = 64 'Takt ist Quarz/64
      72. Enable Timer1 'Timer1-Overflow-Interrupt ein
      73. Enable Interrupts 'Interrupts global einschalten
      74. 'Die Schalter schalten gegen Masse, alle Ports haben einen Pullup-Widerstand
      75. Config Pinb.0 = Input 'Wassertemperatur
      76. Portb.0 = 1
      77. Config Pinb.1 = Input 'Motoroeldruck
      78. Portb.1 = 1
      79. Config Pinb.2 = Input 'Getriebeoeldruck
      80. Portb.2 = 1
      81. Config Pinb.3 = Input 'Quittierschalter
      82. Portb.3 = 1
      83. Config Portd.2 = Output 'LED Wassertempe-
      84. 'ratur
      85. Config Portd.3 = Output 'LED Motoroeldruck
      86. Config Portd.4 = Output 'LED Getriebeoel-
      87. 'druck
      88. Config Portd.5 = Output 'Hupe (Relais)
      89. Config Portd.6 = Output 'Piezo-Summer
      90. Portd.2 = 1
      91. Portd.3 = 1
      92. Portd.4 = 1
      93. Waitms 1000
      94. Portd.2 = 0
      95. Portd.3 = 0
      96. Portd.4 = 0
      97. Waitms 1000
      98. Portd.2 = 1
      99. Portd.3 = 1
      100. Portd.4 = 1
      101. Waitms 1000
      102. Portd.2 = 0
      103. Portd.3 = 0
      104. Portd.4 = 0
      105. Waitms 1000
      106. Portd.2 = 1
      107. Portd.3 = 1
      108. Portd.4 = 1
      109. Waitms 1000
      110. Portd.2 = 0
      111. Portd.3 = 0
      112. Portd.4 = 0
      113. Sound Portd.6 , 500 , 100
      114. Waitms 500
      115. Portd.6 = 0
      116. Sound Portd.6 , 800 , 100
      117. Waitms 500
      118. Portd.6 = 0
      119. Portd.5 = 1
      120. Waitms 500
      121. Portd.5 = 0
      122. Waitms 500
      123. Portd.5 = 1
      124. Waitms 500
      125. Portd.5 = 0
      126. Do
      127. If Pinb.0 = 0 Then
      128. Portd.2 = 1
      129. Else
      130. Portd.2 = 0
      131. End If
      132. If Pinb.1 = 0 Then
      133. Portd.3 = 1
      134. Else
      135. Portd.3 = 0
      136. End If
      137. If Pinb.2 = 0 Then
      138. Portd.4 = 1
      139. Else
      140. Portd.4 = 0
      141. End If
      142. If Pinb.0 = 0 Or Pinb.1 = 0 Or Pinb.2 = 0 Then
      143. Portd.5 = 1
      144. Else
      145. Portd.5 = 0
      146. End If
      147. 'If Zeit < 30 Then
      148. '' Portd.5 = 0
      149. ' Else
      150. ' Portd.5 = 1
      151. ' End If
      152. Debounce Pinb.4 , 0 , Keypressed , Sub
      153. Loop
      154. '----------------------------------------------------------------------------
      155. Sub Keypressed
      156. Zeit = 0
      157. 'Portd.5 = 0
      158. End Sub
      159. End '
      160. '____________________________________________________________________________
      161. Ontimer1: 'Timer1-Overflow-Interrupt-Routine
      162. Timer1 = 36733 'Timer1 voreinstellen (=65535-7936) Blinkfrequenz 1 Sek
      163. 'Timer1 voreinstellen (=65535-28801) Blinkfrequenz 0,5 Sek
      164. Incr Zeit
      165. ' If Zeit > 11 Then
      166. ' Portd.5 = 1
      167. ' Else
      168. ' Portd.5 = 0 'And Zeit = 0
      169. ' End If '
      170. Return
      171. End
      Display All



      Wie ihr seht habe ich einige Abschnitte ausgeblendet um zu versuchen. Das Ausblenden mit REM '(.....') klappt bei mir nicht, warum weiß ich nicht.
      Gruß
    • Fiede wrote:

      Die Schaltungen werden sich ja wohl nicht gegenseitig beeinflussen
      Nicht solange alle Spannung haben. Wenn einer ausgeschaltet ist betreibt er sich mit seinen Bodydioden über die Pullups der anderen was spätestens dann Probleme verurscht wenn er irgendwas einschalten will.

      Weshalb sollten nochmal Timer eingesetzt werden ?
      Gabs da einen Grund ? Zu Übungszwecken? Damit es nicht zu einfach ist?
      Er könnte mit der Taste gestartet werden und dann nach Wunschzeit die Hupe wieder freigeben.(#2)
      Aber selbst das geht ohne einfacher.(#6)

      Sound...500? nicht besser 40000?

      The post was edited 3 times, last by Pluto25 ().

    • @Fiede

      Fiede wrote:

      Da habe ich dann jeweils : 24 Volt plus, 24 Volt minus und die drei Schalteradern. Das müßte doch eigentlich klappen. Die Schaltungen werden sich ja wohl nicht gegenseitig beeinflussen.

      Hast du dann über die Steuerleitung 48V? Oder 24V? Das ist nicht ganz klar.

      Dann sagst du, dass du die Sensoren (Wassertemperatur, Motoröldruck, Getriebeöldruck) auch über die Steuerleitung schickst.

      Ich nehme an, du willst die einzelnen Pulte über die Steuerleitung mit Spannung versorgen. Die 3 Sensorleitungen werden dann jeweils am Pult mit Controller überwacht?

      Ja das geht. Aber wenn du in einem Raum das Horn stumm schaltest, bekommt das ein anderer Raum nicht mit. So gewollt?

      Ich habe noch in deinen Code gespickelt.
      2 Dinge sind mir aufgefallen.

      1.
      In deiner Hauptschleife Zeile 150 prüfst du, ob ein Sensor Fehler meldet. Wenn also ein Pegel Low ist, schaltest du die Hupe an.

      Im Interrupt schaltest du die Hupe wieder ab (sofern die Befehle einkommentiert sind). Aber da der Fehler ja weiterhin besteht, wird in der Hauptschleife die Hupe sofort wieder eingeschaltet. Also kann deine Hupe mit aktuellem Code nicht Stummgeschaltet werden. Da ist noch ein Denkfehler.

      2. Interrupt-Routine
      In der ISR-Routine setzt du den Zähler auf einen Wert 36733. Das heißt, bis der Überläuft fehlen bis 65536 noch 28803 Takte.
      Daraus ergibt sich eine IST-Aufruf-Rate (Frequenz) von 3686400 / 64 / 28803 = 2 Hz

      Aufgrund der Kommentare ist mir aber deine Absicht nicht ganz klar. Welche Frequenz willst du genau einstellen?

      Noch was anderes.
      Du solltest dir mal den Alias-Befehl in der Bascomhilfe ansehen.

      Versuche deinen Pins Namen zu geben, das macht deinen Code viel besser lesbar.

      Kleines Beispiel: Pin für Relay Hupe

      Relay_Hupe Alias PortD.5

      Das deklarierst du am Anfang deines Programms.
      Darunter kannst du dann schreiben:

      Config Relay_Hupe = Ausgang' den Pin aus Ausgang konfigurieren

      Im Code schreibst du einfach nur

      Relay_Hupe=1 oder Set Relay_Hupe um die Hupe einzuschalten und

      Relay_Hupe=0 oder Reset Relay_Hupe um die Hupe auszuschalten.

      Das macht den Code viel leserlicher und hat noch den Vorteil,
      falls mal ein Prozessor oder die Pins gewechselt werden müssen,
      musst du das nur einmal im Programm ändern, nämlich bei dem Alias.

      Weiterhin gutes Gelingen!
      Kaum macht man es richtig - und schon geht's!
    • Pluto25 wrote:

      Fiede wrote:

      Die Schaltungen werden sich ja wohl nicht gegenseitig beeinflussen
      Weshalb sollten nochmal Timer eingesetzt werden ?
      Gabs da einen Grund ? Zu Übungszwecken? Damit es nicht zu einfach ist?
      Er könnte mit der Taste gestartet werden und dann nach Wunschzeit die Hupe wieder freigeben.(#2)
      Aber selbst das geht ohne einfacher.(#6)
      Der Grund ist folgender. Die Hupe, oder auch der Summer soll in bestimmten Bereichen abgeschaltet werden können. - Wenn ein Alarm kommt ist das fürs Steuerhaus nur ein Hinweis, die kümmern sich um den Kurs und nicht um die Maschine. Gleichzeitig müssen sie aber reagieren, zum Beispiel muss vorausschauend anderen Schiffen ausgewichen werden, oder tieferes Fahrwasser angelaufen werden. Es besteht ja die Gefahr, das die Maschine ausfällt.
      Daher soll der nervende Ton abgestellt werden können. Muss aber selbständig nach einer gewissen Zeit wieder ertönen, damit sie erinnert werden, dann kann wieder abgeschaltet werden.
      Während des ausgeschalteten Tons muss aber die optische Alarmierung bestehen bleiben und sich wenn der Fehler behoben ist auch optisch verändern (Alarm weg LED aus). Das heißt das Programm muß weiter laufen und kann nicht durch einen Wait Befehl gestoppt werden. Die Zeit der Abschaltung ist jetzt nur für Testzweck so kurz. Im Einsatz evtl. 5 Minuten oder länger.

      Mitch64 wrote:

      @Fiede

      Fiede wrote:

      Da habe ich dann jeweils : 24 Volt plus, 24 Volt minus und die drei Schalteradern. Das müßte doch eigentlich klappen. Die Schaltungen werden sich ja wohl nicht gegenseitig beeinflussen.
      Hast du dann über die Steuerleitung 48V? Oder 24V? Das ist nicht ganz klar.


      24 Volt

      Dann sagst du, dass du die Sensoren (Wassertemperatur, Motoröldruck, Getriebeöldruck) auch über die Steuerleitung schickst.

      Ich nehme an, du willst die einzelnen Pulte über die Steuerleitung mit Spannung versorgen. Die 3 Sensorleitungen werden dann jeweils am Pult mit Controller überwacht?


      so dachte ich

      Ja das geht. Aber wenn du in einem Raum das Horn stumm schaltest, bekommt das ein anderer Raum nicht mit. So gewollt?
      ja

      Ich habe noch in deinen Code gespickelt.
      2 Dinge sind mir aufgefallen.

      1.
      In deiner Hauptschleife Zeile 150 prüfst du, ob ein Sensor Fehler meldet. Wenn also ein Pegel Low ist, schaltest du die Hupe an.
      ja

      Im Interrupt schaltest du die Hupe wieder ab (sofern die Befehle einkommentiert sind). Aber da der Fehler ja weiterhin besteht, wird in der Hauptschleife die Hupe sofort wieder eingeschaltet. Also kann deine Hupe mit aktuellem Code nicht Stummgeschaltet werden. Da ist noch ein Denkfehler.


      Der "Denkfehler" ist mein Problem. Ich komme mit den Gedanken nicht auf den richtigen Code

      2. Interrupt-Routine
      In der ISR-Routine setzt du den Zähler auf einen Wert 36733. Das heißt, bis der Überläuft fehlen bis 65536 noch 28803 Takte.
      Daraus ergibt sich eine IST-Aufruf-Rate (Frequenz) von 3686400 / 64 / 28803 = 2 Hz

      Aufgrund der Kommentare ist mir aber deine Absicht nicht ganz klar. Welche Frequenz willst du genau einstellen?


      die Frequenz spiel keine Rolle, es soll ja später nur eine Zeit von
      5 bis 10 Minuten eingestellt werden.

      Noch was anderes.
      Du solltest dir mal den Alias-Befehl in der Bascomhilfe ansehen.

      Versuche deinen Pins Namen zu geben, das macht deinen Code viel besser lesbar.

      Kleines Beispiel: Pin für Relay Hupe

      Relay_Hupe Alias PortD.5

      Das deklarierst du am Anfang deines Programms.
      Darunter kannst du dann schreiben:

      Config Relay_Hupe = Ausgang' den Pin aus Ausgang konfigurieren

      Im Code schreibst du einfach nur

      Relay_Hupe=1 oder Set Relay_Hupe um die Hupe einzuschalten und

      Relay_Hupe=0 oder Reset Relay_Hupe um die Hupe auszuschalten.

      Das macht den Code viel leserlicher und hat noch den Vorteil,
      falls mal ein Prozessor oder die Pins gewechselt werden müssen,
      musst du das nur einmal im Programm ändern, nämlich bei dem Alias.


      Das habe ich früher schon versucht. Ich habe damit aber meine Probleme weil ich dann immer doch doppelt
      denken muss. Für einen Fremden, der in meinem Programm arbeiten soll mag das hilfreich sein, ich komme aber besser mit den einfachen Port Bezeichnungen zurecht. Am liebsten DDRB=&00110010.



      Weiterhin gutes Gelingen!
      Mit Euren Tipps wird das wohl klappen. Vielen Dank für die Antworten. a_475_f10f3094
    • Fiede wrote:

      die kümmern sich um den Kurs und nicht um die Maschine
      Sollte dann nicht noch unbedingt ein Relais rein "Maschine Stop" Ein PKW macht ohne Öldruck so ca 1km
      dann steigen die Pleuls quer durch den Motorblock aus. =Totalschaden. Wie lange macht das ein Schiffsmotor?

      Mit dem Timer meinte ich den im AVR
      Wie wärs mit :
      151 Hupe=1
      153 Hupe=0
      155 if zeit=0 and hupe=1 then
      156 Portd5.=1
      158 Portd.5=0
      167 zeit=30
      175 if zeit>0 then decr zeit

      Es würde auch ohne den Umweg über das Flag Hupe gehen aber dann bekommt sie immer einen klein Puls bevor sie stillgeschaltet wird.
    • Pluto25 wrote:

      Fiede wrote:

      die kümmern sich um den Kurs und nicht um die Maschine
      Sollte dann nicht noch unbedingt ein Relais rein "Maschine Stop" Ein PKW macht ohne Öldruck so ca 1kmdann steigen die Pleuls quer durch den Motorblock aus. =Totalschaden. Wie lange macht das ein Schiffsmotor?

      Mit dem Timer meinte ich den im AVR
      Wie wärs mit :
      151 Hupe=1
      153 Hupe=0
      155 if zeit=0 and hupe=1 then
      156 Portd5.=1
      158 Portd.5=0
      167 zeit=30
      175 if zeit>0 then decr zeit

      Es würde auch ohne den Umweg über das Flag Hupe gehen aber dann bekommt sie immer einen klein Puls bevor sie stillgeschaltet wird.
      Ausgezeichnet!! Danke Pluto.
      Es ist natürlich richtig, dass wenn der Oeldruck abfällt die Maschine stark gefährdet ist. Wir haben aber 220 Ltr. Oel in der Wanne und der Schalter spricht auch bei einem leichten Druckabfall an. Maschine stopp ist nur dann wenn der Oeldruck ganz weg ist. Also Leitung geplatzt.
      -Das Programm habe ich wie vorgeschlagen verstanden und geändert.
      Kann aber nicht Kompilieren . Ich bekomme immer eine Fehlermeldung. Er will das "End Sub" nicht akzeptieren.
      Fehlermeldung ist: Error: 123 Line: 155 End if exepcted. Wieso "End if" ist doch "End sub". Ich habe ein Brett vorm Kopf??

      If Pinb.0 = 0 Or Pinb.1 = 0 Or Pinb.2 = 0 And Hupe = 0 Then
      Hupe = 1
      Else
      Hupe = 0
      End If

      If Zeit = 0 And Hupe = 1 Then
      Portd.5 = 1
      Else
      Portd.5 = 0

      Debounce Pinb.3 , 0 , Keypressed , Sub

      Loop

      '----------------------------------------------------------------------------
      Sub Keypressed
      Zeit = 30
      End Sub Line 155
      End
      '
      '____________________________________________________________________________

      Ontimer1: 'Timer1-Overflow-Interrupt-Routine
      Timer1 = 36733 'Timer1 voreinstellen (=65535-7936) Blinkfrequenz 1 Sek
      'Timer1 voreinstellen (=65535-28801) Blinkfrequenz 0,5 Sek
      If Zeit > 0 Then Decr Zeit
      End If
      '
      Return
    • Fiede wrote:

      Wieso "End if" ist doch "End sub". Ich habe ein Brett vorm Kopf??
      If .. Then .... Else...End IF. Das ist die Schleife, die kompiliert werden soll. Wenn jetzt innerhalb dieser Schleife ein Fehler auftritt,
      kann End If nicht ausgeführt werden. Drum diese Fehlermeldung mit "EndIF".
      ?( nennt man auf einem Schiff "Brett" nicht Planke ? a_56_df238249 :D :D

      Detlef
      Leichtsinn ist kein Mut, Vorsicht keine Feigheit.
    • Es stimmt auf den Schiff heißt es "Planke" Es ist aber egal ob Planke oder Brett. Es klappt trotzdem nicht.
      Das mit if Then ist es nicht.
      Es ist tatsächlich so, dass es mit dem "End Sub" zu tun hat. Darum habe ich hinter "End Sub" nachträglich "Line 155" geschrieben.

      Fiede wrote:

      Fehlermeldung ist: Error: 123 Line: 155 End if exepcted. Wieso "End if" ist doch "End sub".
      Wenn ich auf die Fehlermeldung drücke, springt der Curser auf diese(Line 155) Zeile. Wenn ich die ganze "Sub-Sache" auskommentiere läuft die Kompilierung ohne Fehler durch.
      Da ist das Problem mit der Planke a_475_f10f3094