Und was kommt jetzt beim Empfang raus?
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!
-
-
A8 3B 10 03 00 00 <\r><\n>
28 1B 10 02 00 00 D5 <\r><\n>
28 1B 10 02 00 00 D5 <\r><\n>
28 1B 10 02 00 00 D5 <\r><\n>
28 1B 10 02 00 00 D5 <\r><\n>
28 1B 10 02 00 00 D5 <\r><\n>
28 1B 10 02 00 00 D5 <\r><\n>
28 1B 10 02 00 00 D5 <\r><\n>
A8 3B 10 03 00 00 <\r><\n>
28 1B 10 02 00 00 D5 <\r><\n>
28 1B 10 02 00 00 D5 <\r><\n>
28 1B 10 02 00 00 D5 <\r><\n>
28 1B 10 02 00 00 D5 <\r><\n>
68 FF 10 03 86 <\r><\n>
68 88 10 83 62 <\r><\n>
C8 88 10 0E BA <\r><\n>
28 1B 10 02 00 00 D5 <\r><\n>
genau das gleiche was der STN sendet. Hab ein Y-Kabel an die ECU angeschlossen und mit 2 HTERM lese ich einmal den STN mit 9600 und einmal den Mega8 mit 38400 aus. Beide senden synchron das gleiche.
Hab mit einen Frame zusammengebastelt den ich printe.
BASCOM Source Code
- ' SOF-Inpuls
- Case 163 To 239 ' 163µs bis 239µs
- If Bus_in = 0 Then ' Pegel ist Low nach SOF-Impuls
- Bitcounter = 0
- Mybyte = 0
- Frame_da = 1 'frame empfangen
- Myframe = Dummyframe
- Dummyframe = ""
- End If
- If Bitcounter = 8 Then
- Dummyframe = Dummyframe + Hex(mybyte) + " " 'frame zusammensetzen
- Byte_da = 1 'Byte empfangen
- Bitcounter = 0
- End If
Wenn der Frame da ist übergebe ich ihn an eine Proc die ihn bearbeiten soll. Dort werde ich ihn splitten und auswerten. Momentan printe ich ihn da nur.
-
-
Nein , die case fängt ja das Ende (Frame=1) ab.
Pac-Man wrote:
einen Frame zusammengebastelt den ich printe
-
Sprechen braucht er ja nachher nicht mehr. Soll nur die Daten auswerten und was tun. Am Anfang war mir das sprechen wichtig damit ich sehen kann was er versteht.
-
Pluto25 wrote:
Nein , die case fängt ja das Ende (Frame=1) ab.
Pac-Man setzt das Frame_da = 1, wenn der Start-Puls erkannt wird (SOF = Start Of Frame).
Nicht verwechseln mit EOF (End Of Frame).
Der Timer wäre da, um das Ende des Frames zu erkennen.
Wenn der Timer nicht verwendet wird, wird das Frame_da erst beim Start des nächsten Frame gesetzt.
Ist das so gewünscht ???
Außerdem ist für eine Erkennung von EOF (END-OF-FRAME) der Timer 0 nicht korrekt konfiguriert.
OC0A hat keinen Wert zugewiesen bekommen. Es bietet sich an, hier den Overflow-Interrupt zu nehmen, das sind dann 256µs in deinem Fall.The post was edited 1 time, last by Mitch64 ().
-
Mitch64 wrote:
Falsch.
So wie das Ecu drauf los quatscht wird die Verzögerung nicht spürbar sein.
Sein Code funktioniert ja, anders geht immer, funktionierender geht nicht. -
Mitch64 wrote:
Der Timer wäre da, um das Ende des Frames zu erkennen.
Mitch64 wrote:
Ist das so gewünscht ???
Aber wie Pluto auch geschrieben hat, der Datenstrom ist ständig da und die Verzögerung zeigt sich nicht. Die Werte laufen stundenlang synchron vom STN und vom Mega8. -
Was ich noch unbedingt los werden muss... Ich habe hier eine ECU und den ganzen Hardwareaufbau liegen mit PC, Terminals, Oskar und allem und tue mich trotzdem schwer. Ihr beide, und hier besonders Mitch macht das aus dem Kopf. Ohne alles guckt ihr euch den Code an, tippt etwas zusammen und es funktioniert. Für mich unbegreiflich!
VIENEN DANK! -
Mitch64 wrote:
Der Timer wäre da, um das Ende des Frames zu erkennen.
BASCOM Source Code
Nach 250uS wird der Timer gestartet. Bis 280 kann ich nicht zählen mit Byte. Der Timer signalisiert das EOF und stoppt sich.
Hoffe das ist so richtig. Funktionieren tut es.
Dann hab ich die Sub "Frame_bearbeiten" erweitert. Hier prüfen ich die ersten 2 Headerbytes und berechne die Werte die Angezeigt/verarbeitet werden sollen. Das ganze scheint mir zu kompliziert gedacht. Ist das so richtig?
BASCOM Source Code
- Sub Frame_bearbeiten
- Local Result As Word : Result = 0 'ergebnis berechnung
- Local Anzahl_elemente As Byte
- Local Header As String * 4 'zwei ersten headerbytes zur identifikation vom frame
- Anzahl_elemente = Split(myframe , Bytewert(1) , " ")
- Header = Bytewert(1) + Bytewert(2)
- Select Case Header
- Case "281B" 'RPM
- Result = Hexval(bytewert(5)) * 256
- Result = Result + Hexval(bytewert(6))
- Result = Result / 4
- Print #pc , "RPM " ; Result ; " " ; Myframe
- Case "4829" 'Speed
- Result = Hexval(bytewert(5)) * 256
- Result = Result + Hexval(bytewert(6))
- Result = Result / 128
- Print #pc , "Speed " ; Result ; " " ; Myframe
- Case "A849" 'temp
- Result = Hexval(bytewert(5)) - 40
- Print #pc , "TEMP " ; Result ; " " ; Myframe
- End Select
- End Sub
-
Pac-Man wrote:
Nach 250uS wird der Timer gestartet. Bis 280 kann ich nicht zählen mit Byte. Der Timer signalisiert das EOF und stoppt sich.
Hoffe das ist so richtig. Funktionieren tut es.
EOF ist nichts anderes als das ausbleiben weiterer Flanken für eine Mindestzeit.
Bedeutet, dass durch EOF keine Flanke und damit kein PC-Interrupt auftritt.
Du kannst nicht in der PC-Int Routine den EOF feststellen. Dafür benötigst du den Timer-Overflow.
Ich denke dein Programm funktioniert deswegen, weil es ohne deine neue Case-Abfrage auch schon funktioniert hat.
In deinem letzten Code hattest du auch ein OC0A-Interrupt angedacht, um das Ende zu erkennen.
Da ein langer Bitpuls aber schon bis zu 239µs dauern darf, ist es bit 250µs nicht weit her. Sollte eigentlich auch 280µs und mehr sein.
Von daher solltest du deinen Code auf Timer0-Overflow umstricken.
Pac-Man wrote:
Dann hab ich die Sub "Frame_bearbeiten" erweitert. Hier prüfen ich die ersten 2 Headerbytes und berechne die Werte die Angezeigt/verarbeitet werden sollen. Das ganze scheint mir zu kompliziert gedacht. Ist das so richtig?
Damit brauchst du keine umständlichen und zeitfressenden String-Funktionen und hast die Bytes direkt verfügbar.
Für die Ausgabe wie bisher kannst du eine neue Sub Ausgabe() schreiben, die in einer Schleife die Array-Bytes mit Space dazwischen ausgibt.
Und Ob das so richtig ist?
Man kann es so machen, effektiv ist es nicht. Und ich vermute, du hast da schon wieder einen Denkfehler.
Du willst die ersten beiden Header-Bytes aus dem String extrahieren und in String Header schreiben ?
Bedenke, dass in dem Quell-String auch ein Leerzeichen zwischen den Hex-Werten ist. -
Mitch64 wrote:
Ob das richtig funktioniert wie gedacht bezweifle ich.
Clever wenn der timer (per ocxa ) bei 240 stehen bleibt. Dann kann die Case ihn beim nächsten Flankenwechsel (dem Beginn des Sof) starten. Oder er stoppt bei Ovf und behält dann einen Wert von ca 6 die mit Case is < 40 abgefangen werden kann
Die Eof länge ist irrelevant solange nicht zwei Nachrichten unmittelbar nacheinander gesendet werden. Und dann ist die minimum länge wichtig. Bei 239µs könnte schon das nächste Paket starten. Schlecht wenn er dann 280µs wartet.
Pac-Man wrote:
Sprechen braucht er ja nachher nicht
Ps Das Ecu liegt auf dem Tisch? Welche Werte für Drehzahl etc gibt es den aus? Fehlt da nicht ein Motor -
Pluto25 wrote:
Welche Werte für Drehzahl etc gibt es den aus? Fehlt da nicht ein Moto
Das mit dem Timer muss ich mir nochmal durch den Kopf gehen lassen. Dachte dass der Timer so wie er konfiguriert ist bei 256 überläuft und einen interrupt auslöst. -
Das macht er beim Ovf. Bei oc0a läuft er bis zum Wert Compare0a (in Deinem Fall 0 - also einmal rund) und führt dann den int aus. Ein Möglichkeit wäre den Compare0a mit 240 zu laden und die selbe isr wie beim Pcint zu verwenden. Dann ruft er sie bei 240 auf und hat 246 wenn das Timerbyte gesetzt wird. Dann kann die case <250 (besser 'case else') ihn Stoppen und der Main mitteilen das eine Sendung vollständig ist. (Frame_da = 1)
-
Hab es jetzt so. Ist das besser oder schon wieder falsch?
In der ISR kriege ich es irgendwie nicht hin. Muss weiter schauen. -
Pac-Man wrote:
schon wieder falsch?
Vielleicht. Bedenke das der Timer weiter läuft bis zum Stop Timer0. Daher sollte das gleich vorn stehen damit er nicht rund läuft.Das Toggle und Frame_da geht ruck Zuck aber den Frame zu kopieren dauert ein Weilchen.
Ich sehe gerade das Compare A = Disconnect damit zählt er nur bis 240 und beginnt dann mit 0 wieder. Ich würde das lassen. Das verkompliziert den Start. Natürlich funktioniert folgendes dann nicht: (vorher geschrieben)
Dann sollte klar sein wann er wieder startet. Viele Möglichkeiten. Mit dem Oc0a=240 würde ich keine seperate Timer_isr aufrufen sondern gleich die Read_bit Die kann ihn dann stoppen mit:
Case else
Stop Timer0
Timer0=0
Frame_da=1
...
und ihn starten mit
Case is <40
Start Timer0
Oder separat ohne (oc0a):
On Timer0 Timer_0 '(fast? das gleiche wie: 'On Oc0a Timer_0' mit Ocr0a = 0)
Die timer_0 selber sieht richtig aus.
Reicht es nicht wenn er nach 256µs das Eof erkennt? Kommen wirklich Nachrichten mit minimal Pausen?
So wie der schon ohne Motor drauflos Quatscht würde mich das nicht wundern wenn er mit Motor dann 'so richtig' loslegt. Besteht die Möglichkeit eines Oszillogramms vom "lebenden" Objekt?The post was edited 1 time, last by Pluto25 ().
-
Pluto25 wrote:
Ps Das Ecu liegt auf dem Tisch? Welche Werte für Drehzahl etc gibt es den aus? Fehlt da nicht ein Motor
Empfang.jpg -
Pluto25 wrote:
Dann würde ich ihm auch die Hex/String Verarbeitung ersparen.
BASCOM Source Code
- If Bitcounter = 8 Then
- 'Byte_da = 1 'Byte empfangen
- Bitcounter = 0
- Incr Bytecounter
- Myframe(bytecounter) = Mybyte
- End If
- Header = Hex(myframe(1)) + Hex(myframe(2))
- Select Case Header
- Case "281B" 'RPM
- Result = Makeint(myframe(6) , Myframe(5))
- Result = Result / 4
- Print #pc , "RPM " ; Result
- Case "4829" 'Speed
- Result = Makeint(myframe(6) , Myframe(5))
- Result = Result / 128
- Print #pc , "Speed " ; Result
- Case "A849" 'temp
- Result = Myframe(5) - 40
- Print #pc , "TEMP " ; Result
- End Select
Das mit "Case else" kriege ich irgendwie nicht auf die Reihe. Lasse es erstmal so dass der Timer bei 240 den Frame zusammensetzt.
Diagramme folgen noch. -
-
Ohne Angabe der Auflösung für x-Achse / Y-Achse kann man damit nicht wirklich was anfangen.
Hat dein Rigol denn keine USB-Buchse an der Front zum ein Stick reinstecken und Screenshots draufspeichern?
Dann könnte man deine Einstellungen sehen.
Pac-Man wrote:
Hab das jetzt so gelöst: