J1850 VPW Erfahrung?

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

    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!

    • Doch, eine Buchse ist da. Sehe ich jetzt erst. a_45_132ca9f5 Die Dateinamen der Bilder ist die Auflösung.

      Sorry wegen dem Code. Hier nochmal komplett:

      BASCOM Source Code

      1. ' Empfänger VPW von Pac-Man modifiziert
      2. ' Nicht vollständig (Timer-ISR)
      3. $regfile = "m328pdef.dat"
      4. $crystal = 8000000
      5. $hwstack = 60
      6. $swstack = 60
      7. $framesize = 100
      8. $baud = 38400
      9. 'Dim Myframe , Dummyframe As String * 24 'Frame und Dummy für berechnung
      10. '
      11. Dim Mybyte As Byte 'erkannte Bits als byte
      12. Dim Bitcounter As Byte 'zähler für die Bits
      13. Dim Timerwert As Byte 'wert des Zählers
      14. Dim Myframe(8) As Byte
      15. 'Dim Bytewert(8) As Byte
      16. Dim Bytecounter , Dummybytecounter As Byte
      17. Dim I As Byte 'schleifenzähler
      18. 'Flags
      19. 'Dim Byte_da As Byte
      20. Dim Frame_da As Byte
      21. Declare Sub Frame_bearbeiten
      22. Led_gruen Alias Portc.0 : Config Led_gruen = Output
      23. Led_rot Alias Portc.1 : Config Led_rot = Output
      24. '############################################# serielle
      25. Const Pc = 1
      26. Open "COM1:" For Binary As #pc
      27. '########################################################### Timer
      28. 'OCR0 = f_cpu / (1024 * f_timer)
      29. Config Timer0 = Timer , Prescale = 8 , Clear Timer = 1 , Compare A = Disconnect '1uS
      30. Ocr0a = 240
      31. Enable Oc0a
      32. On Oc0a Timer_0
      33. '########################################################### PC-Interrupt
      34. Bus_in Alias Pinb.0 : Config Bus_in = Input : Portb.0 = 1
      35. Pcmsk0 = &B00000001 'Pcmsk0=pcint(0-7) Pcmsk1=pcint(8-14) ...
      36. Enable Pcint0
      37. On Pcint0 Read_bit 'bit einlesen
      38. '####################################################################################################
      39. Led_rot = 1 : Led_gruen = 1 : Wait 2 : Led_rot = 0 : Led_gruen = 0 'reset erkennen
      40. Enable Interrupts
      41. Do
      42. If Frame_da = 1 Then
      43. Frame_da = 0
      44. Frame_bearbeiten
      45. End If
      46. Loop
      47. End
      48. '########################################################## Subs
      49. Sub Frame_bearbeiten
      50. Local Header As String * 4 'zwei ersten headerbytes zur identifikation vom frame
      51. Local Result As Word : Result = 0 'ergebnis berechnung
      52. Header = Hex(myframe(1)) + Hex(myframe(2))
      53. Select Case Header
      54. Case "281B" 'RPM
      55. Result = Makeint(myframe(6) , Myframe(5))
      56. Result = Result / 4
      57. Print #pc , "RPM " ; Result
      58. Case "4829" 'Speed
      59. Result = Makeint(myframe(6) , Myframe(5))
      60. Result = Result / 128
      61. Print #pc , "Speed " ; Result
      62. Case "A849" 'temp
      63. Result = Myframe(5) - 40
      64. Print #pc , "TEMP " ; Result
      65. End Select
      66. End Sub
      67. Read_bit:
      68. Timerwert = Timer0
      69. Timer0 = 6
      70. Start Timer0
      71. '64uS "H" oder 128uS "L" => Bit=1
      72. '64uS "L" oder 128uS "H" => Bit=0
      73. 'SOF 200uS "H"
      74. 'EOD 200uS "L"
      75. 'EOF 280uS "L"
      76. Select Case Timerwert
      77. Case Is < 40
      78. 'Start Timer0
      79. ' Kurzer Bit-Inpuls
      80. Case 34 To 96 ' 34µs bis 96µs (nominell 64µs)
      81. If Bus_in = 1 Then ' Bitwert 0
      82. Mybyte = Mybyte * 2
      83. Else ' Nitwert 1
      84. Mybyte = Mybyte * 2
      85. Incr Mybyte ' +1 rechnen
      86. End If
      87. Incr Bitcounter ' Bit zählen, wenn es hinzugefügt wird
      88. ' Langer Bit-Impuls
      89. Case 96 To 163 ' 96µs bis 163µs (nominell 128µs)
      90. If Bus_in = 1 Then ' Bitwert 1
      91. Mybyte = Mybyte * 2
      92. Incr Mybyte ' +1 rechnen
      93. Else ' Bitwert 0
      94. Mybyte = Mybyte * 2
      95. End If
      96. Incr Bitcounter ' Bit zählen, wenn es hinzugefügt wird
      97. ' SOF-Inpuls
      98. Case 163 To 239 ' 163µs bis 239µs
      99. If Bus_in = 0 Then ' Pegel ist Low nach SOF-Impuls
      100. Bitcounter = 0
      101. Mybyte = 0
      102. End If
      103. End Select
      104. If Bitcounter = 8 Then
      105. Bitcounter = 0
      106. Incr Bytecounter
      107. Myframe(bytecounter) = Mybyte
      108. End If
      109. Return
      110. Timer_0:
      111. Stop Timer0
      112. Dummybytecounter = Bytecounter
      113. Bytecounter = 0
      114. Frame_da = 1 'frame empfangen
      115. 'Toggle Led_gruen
      116. Return
      Display All
    • Pac-Man wrote:

      Denke ist weniger rechenintensiv.
      Ein bisschen, jedoch würde ich auf die String völlig verzichten:

      Source Code

      1. $lib "mcsbyteint.lib" 'dreifach schnellere Umrechnung Binär zu String
      2. Dim Myframe(8) As Byte
      3. Dim Headword As Word At Myframe Overlay
      4. Dim W As Word ' deutlich schneller als mit Local
      5. Sub Frame_bearbeiten
      6. Select Case Headword ' Low und Highbyte tauschen da Bascom Low first
      7. Case $1b28 'RPM "281B"
      8. W = Makeint(myframe(6) , Myframe(5))
      9. W = W / 4
      10. Print "RPM " ; W
      11. Case $2948 'Speed "4829"
      12. W = Makeint(myframe(6) , Myframe(5))
      13. W = W / 128
      14. Print "Speed " ; W
      15. Case $49a8
      16. Print "TEMP " ; Myframe(5) - 40 'Temp "A849"
      17. End Select
      18. End Sub
      Display All
      Zur Zeit braucht das Print die meiste Zeit dazu noch der Usart mit nur 34,8k . Da es so trotzdem läuft ist es nicht zeitkritisch.
      Da kann auch Dein String Code erhalten bleiben. Wichtiger ist das Du auch nach men Jahr noch duchblickst.

      Ein wenig Sorgen macht mir die Länge vom Myframe, bzw das kein Maximum abgefangen wird. Wenn eine Nachricht länger wird oder durch Störungen kein Ende erkannt dann schreddert die Empfangs isr den folgenden Ram. Da sollte das
      'Incr Bytecounter' vielleicht mit 'If Bytecounter < 8 then Incr Bytecounter' ergänzt werden.

      Die case werden nacheinander abgefragt solange bis eins zutrifft, danach die anderen nicht mehr. Das leere case <40 sorgt dafür das ein Puls von 39 nichts bewirkt. Das Case 34 to 96 greift so erst ab 40. Ein 'case is < 96' hätte die selbe Wirkung mit weniger Aufwand für den 328 (Er braucht dann nicht auf 34 zu prüfen)

      Ps Der spricht ja wirklich ohne Ende. Dagegen ist Sonic schweigsam :D
      PPS Vorsicht wenn es getunt wird zeigt Dein Tacho Geschwindigkeiten über 511 nicht richtig an a_38_b45e201d