Unterprogramm, 2. Mikrocontroller

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

    • Mitch64 schrieb:

      Da fehlt ein End If vor dem Debounce
      falls es überlesen wurde, hier nochmal:
      Da fehlt ein End If vor dem Debounce
      unabhängig davon, ob es noch andere Fehlermeldungen gibt.
      Das End If vor dem letzten Return ist auch falsch.

      Wenn du nicht das ganze Programm postest, dann können wir die anderen Fehler nicht sehen.
      Dein nachträglich "Line 155" ist auf jeden Fall falsch.
    • Fiede schrieb:

      Sub Keypressed
      Zeit = 30
      End Sub Line 155
      End
      Deklariere mal KEYPRESSED nicht als Sub(Declare Sub keypressed entfernen.)
      Mach aus keypressed einfach ein normales UP.
      Also Debounce Pinb.3 ,0,keypressed,Sub

      Und dann an Stelle von Sub keypressed einfach Keypressed :
      das UP dann mit Return abschließen.(nicht mit End Sub !!!!!)

      Try and error

      Detlef
      Leichtsinn ist kein Mut, Vorsicht keine Feigheit.
    • o.k. hier mal das ganze Programm. Das nachträgliche LIne habe ich zum Verständnis nachträglich eingefügt.


      BASCOM-Quellcode

      1. $regfile = "m8def.dat"
      2. $crystal = 3686400
      3. $hwstack = 32
      4. $swstack = 10
      5. $framesize = 80
      6. Declare Sub Keypressed
      7. Dim Zeit As Word
      8. Dim Hupe As Bit
      9. On Timer1 Ontimer1 'Interrupt-Routine für Timer1-Overflow
      10. Config Timer1 = Timer , Prescale = 64 'Takt ist Quarz/64
      11. Enable Timer1 'Timer1-Overflow-Interrupt ein
      12. Enable Interrupts 'Interrupts global einschalten
      13. 'Die Schalter schalten gegen Masse, alle Ports haben einen Pullup-Widerstand
      14. Config Pinb.0 = Input 'Wassertemperatur
      15. Portb.0 = 1
      16. Config Pinb.1 = Input 'Motoroeldruck
      17. Portb.1 = 1
      18. Config Pinb.2 = Input 'Getriebeoeldruck
      19. Portb.2 = 1
      20. Config Pinb.3 = Input 'Quittierschalter
      21. Portb.3 = 1
      22. Config Portd.2 = Output 'LED Wassertempe-
      23. 'ratur
      24. Config Portd.3 = Output 'LED Motoroeldruck
      25. Config Portd.4 = Output 'LED Getriebeoel-
      26. 'druck
      27. Config Portd.5 = Output 'Hupe (Relais)
      28. Config Portd.6 = Output 'Piezo-Summer
      29. Portd.2 = 1
      30. Portd.3 = 1
      31. Portd.4 = 1
      32. Waitms 1000
      33. Portd.2 = 0
      34. Portd.3 = 0
      35. Portd.4 = 0
      36. Waitms 1000
      37. Portd.2 = 1
      38. Portd.3 = 1
      39. Portd.4 = 1
      40. Waitms 1000
      41. Portd.2 = 0
      42. Portd.3 = 0
      43. Portd.4 = 0
      44. Waitms 1000
      45. Portd.2 = 1
      46. Portd.3 = 1
      47. Portd.4 = 1
      48. Waitms 1000
      49. Portd.2 = 0
      50. Portd.3 = 0
      51. Portd.4 = 0
      52. Sound Portd.6 , 500 , 100
      53. Waitms 500
      54. Portd.6 = 0
      55. Sound Portd.6 , 800 , 100
      56. Waitms 500
      57. Portd.6 = 0
      58. Portd.5 = 1
      59. Waitms 500
      60. Portd.5 = 0
      61. Waitms 500
      62. Portd.5 = 1
      63. Waitms 500
      64. Portd.5 = 0
      65. Do
      66. If Pinb.0 = 0 Then
      67. Portd.2 = 1
      68. Else
      69. Portd.2 = 0
      70. End If
      71. If Pinb.1 = 0 Then
      72. Portd.3 = 1
      73. Else
      74. Portd.3 = 0
      75. End If
      76. If Pinb.2 = 0 Then
      77. Portd.4 = 1
      78. Else
      79. Portd.4 = 0
      80. End If
      81. If Pinb.0 = 0 Or Pinb.1 = 0 Or Pinb.2 = 0 And Hupe = 0 Then
      82. Hupe = 1
      83. Else
      84. Hupe = 0
      85. End If
      86. If Zeit = 0 And Hupe = 1 Then
      87. Portd.5 = 1
      88. Else
      89. Portd.5 = 0
      90. Debounce Pinb.3 , 0 , Keypressed , Sub
      91. Loop
      92. '----------------------------------------------------------------------------
      93. Sub Keypressed
      94. Zeit = 30
      95. End Sub
      96. End
      97. '
      98. '____________________________________________________________________________
      99. Ontimer1: 'Timer1-Overflow-Interrupt-Routine
      100. Timer1 = 36733 'Timer1 voreinstellen (=65535-7936) Blinkfrequenz 1 Sek
      101. 'Timer1 voreinstellen (=65535-28801) Blinkfrequenz 0,5 Sek
      102. If Zeit > 0 Then Decr Zeit
      103. End If
      104. '
      105. Return
      Alles anzeigen
    • Michael schrieb:

      Das End If vor dem letzten Return ist auch falsch.
      Ist ein wenig verwirrend: Immer wenn nur ein Befehl durch das if ausgeführt werden soll kann er hinter dem then stehen und braucht(darf) kein End If bekommen.
      würde es so geschrieben:
      If Zeit > 0 Then
      Decr Zeit
      müsste doch eins dahinter.
      Leider übernimmt der Editor des Forums die Einrückungen nicht sonst wäre es ersichtlicher.
      Der Compiler meldet die if/loop/case Fehler am Ende des Codes weil er nicht wissen kann wo die Schleife/Abfrage zu ende sein soll.
      Der Bascom Editor kann die Schleifen farblich verbinden was recht nützlich wird wenn sie über viele Zeilen gehen:
      If Zeit = 0 And Hupe = 1 Then
      I. If Zeit = Zeit Then 'Nur zur Demo
      I. I .nop
      I. End If
      I. Portd.5 = 1
      Else
      I. Portd.5 = 0
      End If
      (Die Punkte nur weil keine leerzeichen dargestellt werden)
    • Mitch64 schrieb:

      Hallo Fiede

      Fiede schrieb:

      Beim Schalten eines oder mehrerer Schalter (Alarm) soll die jeweilige LED
      'blinken,gleichzeitig soll ein Warnton ertönen.
      Im Beitrag Nr. 5 hast du angegeben, dass die LED's im Alarmfall blinken sollen.Das fehlt in deinem Code noch.
      das mit dem Blinken hatte ich mal vor. Ist aber nicht notwendig.
      Ein anderes Problem habe ich aber doch noch.
      Das Einschalten der Hupe. Auf Portd.5 habe ich beim Einschalten kein klares high sondern 2,28 Volt mit 4400 Hz.
      Wie kann ich das umgehen und ein klares high bekommen?
    • Neu

      Fiede schrieb:

      Das hatte ich in meiner Schaltung auch so vorgesehen. Der Transistor sollte ein Relais steuern. Transistor war der BC 547B.
      Widerstand hatte ich berechnet mit 66 K Ohm Relais 2880 OHm an 24 Volt.
      Wollte aber nicht klappen.
      Ja das klappt so auch nicht.

      Du sagst ja, da kommen 4kHz raus. Das Problem muss erst gefunden werden. Da liegt wohl noch ein Software-Problem vor.

      Zum anderen ist dein Vorwiederstand zu hochohmig.
      Nach Datenblatt BC547B ist ein hfe von 200 bis 450 angegeben. Daher solltest du von der schlechtesten Verstärkung ausgehen. Also vom hfe=200.
      Dein Kollector-Strom beträgt bei 2880 Ohm und 24V = 8,33mA, damit brauchst du
      mindestens einen Basisstrom von IC / hfe = 37,9µA. Damit würde der Transistor gerade so mal durchschalten.
      Deswegen nimmt man in der Praxis einen Übersteuerungsfaktor von 5-10, damit der Trasistor sauber schaltet.
      Also bauchen wir bei Übersteuerungsfaktor 5 = 5x IB = 189µA.
      Am Vorwiderstand fallen dann 5V - 0,7V (UBE) ab. Das ergibt einen
      Vorwiderstand mit 22,7k Ohm (4,7V/198µA).
      Man liegt mit 22kOhm also recht gut

      Bei dir kommt hinzu, dass du kein permanentes Signal raus gibst.

      Also Vorwiderstand ändern und Fehler im Code finden, dann klapps.
      Kaum macht man es richtig - und schon geht's!