Probleme mit Pulsein

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

    • Hallo,
      nun will ich das Thema mal zum Abschluß bringen.
      Pulsein arbeitet bei mir nicht ansatzweise, auch habe ich im Internet keine weiterreichenden Informationen bekommen. Habe mit MCS Kontakt aufgenommen, ein Marc hat mir 2 x nichts mitgeteilt was nicht auch in der Hilfe steht, dann hat er überhaupt nicht mehr geantwortet???? Ganz toll.
      Nun löse ich mein Problem mit - do, waituS 10, incr Zeit, if Zeit then loop - Ist vielleicht nicht so genau wie Pulsein sein könnte, aber den Fehler kann ich dann im Programm korregieren.
      Also danke an alle
      Gruß
      Dieter
    • Möglicherweise erwartest Du was was es nicht kann? Es soll die Low Zeit in 10µs Schritten messen. Der Timeout bei 40ms liegen. Aber wie genau? Was soll er tun wenn der Pin schon Low ist beim Aufruf? Sofort loszählen oder erst auf High und erneutes Low warten. Das Timeout ab wann? Auch wenn er noch High ist? Über die gesamte Zeit oder beim Wechsel neu beginnen?
      In dem Fall ist die Hilfe wirklich etwas knapp gehalten.
      Wie sieht Deine Lösung aus? Sie arbeitet zur Zufriedenheit?
    • Hallo
      Habe das Problem wie folgt gelöst, Timer0 mit Prescale 1, in der Interrupt Routine incr ich eine Varible, lade den Timer0 neu. Dann vergleiche ich in meiner Programmschleife auf einen Zählerstand, wann Timeout ist. - D0, Vergliche auf Timout, loop until Eingang - Wenn der Eingang zur Messung geht, dann starte ich Timer0 anschließend stoppe ich diesen wieder. In der isr Routine lade ich den Timer0 mit einem Wert, der es zuläst das zwischen zwei Sprüngen das Programm noch vergleichen kann, Ich erhalte so eine für mich gute Auflösung der zu messenden Impulsbreite. Die Wiederholgenauikeit ist meinen Anforderungen entsprechend sehr gut, es funktioniert alles gut.
      Die Impulslänge gebe ich mit einem Impulsgenerator vor, das Ergebniss messe ich mit einem Frequenzmesser nach. (Ich wandle eine Impulsbreite von 1mS bis 120mS in eine Frequenz von 400Hz bis 1Hz um. Die Ausgabe muß stetig laufen, eine Aktualisierung erfolgt ca 1mS nach Messung oder Timeout.
    • Hallo,
      warum sollte ich, habe den Bereich meines Programm mal isoliert, hier der Code

      BASCOM Source Code: Impulslänge zu Frequenz

      1. $regfile = "m328pdef.dat"
      2. $crystal = 16000000
      3. $hwstack = 30
      4. $swstack = 30
      5. $framesize = 50
      6. ' $loadersize = &H800
      7. ' Hier wenn nötig, das Ergebniß der Zeitmessung anpassen
      8. ' Multiplikations Faktor
      9. const Anpassung = 1
      10. ' Teiler Faktor
      11. const FaktorAnpassung = 1
      12. ' Jetzt den Messzeittimer mit der benötigten Schrittzahl laden
      13. ' 1 Schritt sind 0,0625uS
      14. const Schritte = 86
      15. ' Wie oft die Zeit der Wellensignale gemessen wird, bis das Ergebniss weiterverarbeitet wird.
      16. Dim Integrator_B as Byte
      17. Integrator_B = 11
      18. ' Hier für die Impulslängen Messung
      19. Dim KardanZeit_dW as dword
      20. ' Für die Berechnung
      21. Dim KardanBer_dW as dword
      22. ' Ab hier die Zeit für die Frequenzausgabe
      23. Dim FrequenzZeit_W as word
      24. ' Hier nun die Zählvariable für den Integrator
      25. Dim IntKardan_B as byte
      26. ' Hier den Ladewert für Timer0
      27. Dim LadeTimer0_B as byte
      28. ' Ein Hilfs Bit
      29. Dim WB_1 as bit
      30. Dim WB_2 as bit
      31. ' Timeout, wenn die Welle zu langsam dreht oder steht
      32. const timeout = 300000
      33. ' Eingangssignal von der Kardanwelle kommend
      34. config Pinb.0 = Input
      35. ' Hier den Ladewert für Timer0 berechnen
      36. LadeTimer0_B = 255 - Schritte
      37. ' Timer0 8 B it nun für die Zeitmessung
      38. Config Timer0 = Timer , Prescale = 1
      39. enable timer0
      40. On Timer0 aufzaehlen
      41. ' Timer erst mal stoppen
      42. stop timer0
      43. timer0 = Ladetimer0_B
      44. ' Timer1 16Bit ist für die Ausgangsfrequenz zuständig
      45. ' Je kürzer desto schneller für die Frequenzausgabe Drehzahlmesser/Tacho
      46. ' Jetzt fängt der Ausgang mit langsamer Frequenz an
      47. Ocr1a = 65500
      48. Config Timer1 = Timer , Prescale = 256 , Clear Timer = 1 , Compare A = Toggle
      49. enable Interrupts
      50. ' Hauptprogramm
      51. ' Zeitmessung der Impulslänge kommend von der Kardanwelle
      52. ' Es wird von Schraube zu Schraube gemessen, Signal von Schraubenkopf geht bis Schraubenkopf kommt ist das längere .
      53. Haupt:
      54. kardanZeit_dW = 0
      55. ' Hier wird auf die fallende Flanke gewartet und erkannt ob die Welle zu langsam ist oder steht
      56. Do
      57. incr KardanZeit_dW
      58. ' Hier wird auf Timeout geachtet
      59. if KardanZeit_dW > timeout then goto steht
      60. ' Wenn Signal wieer auf 0 geht dann weiter zur Messung der Signallänge
      61. loop until pinb.0 = 0
      62. ' +++++++++++ Impulslänge messen ++++++++++++
      63. KardanZeit_dW = 0
      64. ' Timer0 für die Zeitmessung starten
      65. Start timer0
      66. Do
      67. if KardanZeit_dW > timeout then goto steht
      68. ' Wenn Signal auf 1 geht, dann weiter
      69. loop until pinb.0 = 1
      70. ' Timer0 wieder stopp
      71. stop timer0
      72. ' +++++++++++++++++++++++++++++++++++++++++++++
      73. ' Da die Abstände der Schraubben während einer Umdrehung nicht gleich sind, das ganze mal rund machen.
      74. ' Die Signallänge zwischen den Schraubenköpfen ist nun erfasst
      75. ' Aber erst X mal messen und dann wieder durch X mal teilen
      76. incr IntKardan_B
      77. KardanBer_dW = KardanBer_dW + KardanZeit_dW
      78. if IntKardan_B = Integrator_B then
      79. KardanZeit_dW = KardanBer_dW / Integrator_B
      80. IntKardan_B = 0
      81. ' Weil es bei kleiner Drehzahl lange dauert, Durchläufe ändern
      82. If KardanZeit_dW > 4000 then Integrator_B = 5
      83. If KardanZeit_dW < 3000 then integrator_B = 11
      84. ' Rechenvariable auf 0
      85. KardanBer_dW = 0
      86. else
      87. goto haupt
      88. end if
      89. ' Ab hier steht in KardanZeit_dW die Impulslänge in ca uS
      90. '********* Anpassung Zeit zu Frequenz ***************
      91. ' Hier kann wenn nötig, die Signallänge fein angepaßt werden
      92. Kardanzeit_dW = kardanzeit_dw * Anpassung
      93. Kardanzeit_dW = KardanZeit_dw / FaktorAnpassung
      94. '****************************************************
      95. ' Kommt der Zähler über 65536 dann den nächsten prescale von Timer1 schalten 2=/8 3=/64 4=/256
      96. if KardanZeit_dw > 65536 then
      97. KardanZeit_dW = KardanZeit_dW / 4
      98. IF WB_1 = 0 then Config Timer1 = Timer , Prescale = 256 , Clear timer = 1 , Compare A = Toggle
      99. WB_1 = 1
      100. WB_2 = 0
      101. else
      102. ' Der Timertakt durch 64
      103. IF WB_2 = 0 then Config Timer1 = Timer , Prescale = 64 , Clear timer = 1 , Compare A = Toggle
      104. WB_2 = 1
      105. WB_1 = 0
      106. end if
      107. FrequenzZeit_W = KardanZeit_dW
      108. ' Nun die Ausgabefrequenz einstellen
      109. Ocr1a = FrequenzZeit_W
      110. goto Haupt
      111. '***********
      112. ' Hier nun über Timer0 die Zeit messen
      113. aufzaehlen:
      114. incr KardanZeit_dW
      115. Timer0 = LadeTimer0_B
      116. return
      117. ' Hier Timeout
      118. Steht:
      119. IntKardan_B = 0
      120. KardanBer_dW = 0
      121. goto Haupt
      Display All