Beiträge von Pac-Man

    So, nachdem ich mich etwas sammeln konnte möchte auch ich meinen Senf dazu geben. Da der Zug der gestern permanent pfeifend durch meinen Kopf bedonnert ist den Bahnhof erreicht hat, höre ich langsam wieder Geräusche. Eine Überlegung wäre so lange Strecken mit geschlossener Auspuffklappe zu fahren...


    Ich habe Euch sehr genossen, Leute. Noch nie habe ich mich in einer Gruppe so wohl gefühlt wie bei Euch. So unkompliziert, so herzlich, so unvoreingenommen. Es waren geniale 3 Tage mit viel Spaß, vielen Gesprächen und viel Quatsch. Besonders gefreut habe ich mich über den Besuch des Grauens aus Wolfsburg (oder war es der Graue aus Wolfsburg) der mit Hinjefallen und mir ein fettes Bisonsteak in der Westernstadt vertilgt hat.


    Eine geile Ausfahrt, bei der ich nur den 280er von Franz und den Asphalt zwischen ihm und mir gesehen hab. Ich hab eine Stunde danach noch gezittert weil ich so voll Adrenalin gepumpt war dass es mir schon zu den Ohren herausgetropft ist. Ich bin die meiste Zeit an meinem Limit (oftmals auch drüber) gefahren. Aber nicht schlimm. Zum Glück haben mir nette Menschen anschließend erzählt durch welch schöne Landschaft wir gefahren sind.


    Möchte allen danken dass sie dabei waren, vor allem denen die im Hintergrund sehr viel Arbeit mit der Orga hatten. Jungs, ihr seid top!


    Es verneigt sich hochachtungsvoll Martin, aka Pac-Man :demut:

    ... bis auf die Tatsache dass ich wie ein alter Sack aussehe aber ich glaube daran ist Kathi nicht schuld.


    Super Arbeit du verrückte Katze. Beim nächsten Treffen drück ich dich doppelt!

    Naja, der Bericht muss nicht von jedem verstanden werden. Er soll ja vordergründig als "Wissen" in einem Forum vorhanden sein in dem schon viel Wissen verfügbar ist. Wenn in einigen Jahren sich irgend jemand mit den Thema befassen muss findet er ihn hier und muss nicht nochmal von vorne anfangen.

    Kann es sein, dass es sich hierbei um einen Blindstecker handelt ?

    Nope. Das ist ein Sensor. Nur weil er nicht so aussieht wie alle anderen ? Er muss nur die Ansaugluft messen. Dafür braucht er keine Metallspitze die 200 Grad aushält, das geht in Kunststoff genau so gut. Steck ihn doch mal aus und guck was die Rod dazu sagt.

    Ich verstehe nicht genau was die Funktion ist.

    Der misst die Temperatur der angesaugten Luft. Ja, da ist ein Temperaturfühler drinnen. Wenn der nicht angeschlossen ist zeigt die ECU einen Fehler.

    Von Motogadget gibt es ja für deren Instrumente

    Für deren Instrumente und ab 150€. Hinzu kommen noch die Instrumente. Was aber wenn ich andere Instrumente möchte oder z.B. nur eine Temperaturanzeige oder Ganganzeige?


    Meine Platine ist 13x18mm groß und passt fast in den OBD Stecker. Ich wollte unabhängig sein von fremden Entwicklungen weil ich bei Erweiterungen dann immer auf die fremde Hard- und Software angewiesen bin.

    Timer0, Prescale=8, , Clear Timer = 1 , Compare A = Disconnect '1µS

    Ocr0a=240


    Timer_0:

    Stop Timer0

    Bytecounter = 0

    Frame_da = 1

    Return

    Verwendet wird Timer 0. Prescale=8 bedeutet bei 8MHz das er alle 1µS weiter zählt. Compare wird mit 240 vorgeladen. Alle 240µS ( EOD erkannt, Ganzer Frame wurde übertragen) löst er einen Interrupt aus. Timer wird gestoppt damit der die weitere Verarbeitung nicht stört, Bytecounter wird zurück gesetzt und das Flag für das Frameende gesetzt. Dieses wird in der Hauptschleife erkannt.




    Dim Frameheader As Word At Myframe Overlay

    Sub Frame_bearbeiten


    Select Case Frameheader

    ' 281B RPM

    Case $1b28

    Dataresult = Makeint(myframe(6) , Myframe(5))

    Dataresult = Dataresult / 4

    ' Mach jetzt was aus den Daten

    End Sub

    Der Frameheader sind die ersten beiden Bytes des Frames. Anhand dieser beiden Bytes erkennen wir was die Module miteinander quatschen. In diesem Fall wurde gerade die Drehzahl übertragen. In Byte 5 und 6 steckt die Information die übertragen wird. Aus diesen Bytes machen wir eine Zahl zum weiter verarbeiten. Dann kann man dann die entsprechende Aktion auslösen. Zum Beispiel ein LED-Band ansteuern, eine Displayanzeige oder eine Uhr (externen Drehzahlmesser). So kann man die gewünschten Informationen raus filtern und darauf reagieren.



    Ich habe ein paar Videos gemacht um das Ganze zu demonstrieren.



    Ich möchte mich ganz herzlich für die Hilfe welche ich in einem anderen Forum erhalten habe bedanken. Wie auch hier sind dort viele nette Leute die selbstlos helfen und Tipps geben. Ohne die hätte ich es wahrscheinlich nicht geschafft.


    Wenn jemand Fragen hat, bitte in einem anderen Thread fragen. Ich werde diesen Thread weiter nutzen und eventuelle Erkenntnisse anfügen. Wenn das Thema jemanden interessiert sollte die ganze Information nicht durch Kommentare zerstückelt sein.

    Was benötigen wir hierbei?


    Einen Pinchange Interrupt der die Flankenwechsel am Bus erkennt. Einen Timer der im Mikrosekundentackt zählt und nach 240µS einen Interrupt auslöst. Eine Routine die aus Bits Bytes und eine die aus Bytes einen Frame macht. Eine Routine die den Frame auswertet.


    Die Software habe ich in BASCOM, eine Art Basic Programmiersprache für Mikrocontroller geschrieben. Um ein Portieren in eine andere Sprache zu erleichtern stelle ich einfach den Quellcode rein und erläutere ihn so dass es nicht schwierig sein sollte es in eine andere Sprache zu portieren.


    Prozessor: ATTiny85

    Tackt: Intern, 8MHZ


    'PCINT0

    Pcmsk0 = &B00000001

    Enable Pcint0

    On Pcint0 Read_bit

    PCINT0 wird initialisiert und frei gegeben. Bei jeder Flanke an PortB.0 wird ein Interrupt ausgelöst. Dieser verzweigt in die Erkennung der Bits.




    Dim Myframe(8) As Byte

    Read_bit:

    Timerwert = Timer0


    Select Case Timerwert

    Case Is < 40

    Start Timer0

    Case Is < 96 ' 34µs bis 96µs (nominell 64µs)

    If Bus_in = 1 Then

    Mybyte = Mybyte * 2

    Else

    Mybyte = Mybyte * 2

    Incr Mybyte

    End If

    Incr Bitcounter

    Case Is < 163 ' 96µs bis 163µs (nominell 128µs)

    If Bus_in = 1 Then

    Mybyte = Mybyte * 2

    Incr Mybyte

    Else

    Mybyte = Mybyte * 2

    End If

    Incr Bitcounter

    Case Is < 239 ' 163µs bis 239µs

    If Bus_in = 0 Then

    Bitcounter = 0

    Mybyte = 0

    End If

    End Select



    If Bitcounter = 8 Then 'Byte komplett empfangen

    Bitcounter = 0

    If Bytecounter < 8 Then Incr Bytecounter

    Myframe(bytecounter) = Mybyte

    End If

    Return

    Hier wird die Zeit gemessen wie lange das Bit gedauert hat und welchen Pegel das Bit vor dem Interrupt hatte. Wir erinnern uns, ein Bit kann 64 oder 128µS dauern und „High“ und „Low“ Pegel haben. Diese Routine addiert die 8 Bits zu einem Byte. Wenn 8 Bits addiert wurden wird das erhaltene Byte zum Frame addiert. Ein Frame beinhaltet die Information (zwischen SOF und EOD) welche wir brauchen. SOF wird erkannt und das Ganze wird gestartet. Myframe ist ein Array von 8 Bytes. Bitcounter ein Zähler für die Bits. Bytecounter ein Zähler für die Bytes.



    Do

    If Frame_da = 1 Then

    Frame_da = 0

    Frame_bearbeiten

    End If

    Loop

    Hauptschleife wartet auf das Ende des Frames und springt dann zum bearbeiten. Ansonsten wir Däumchen gedreht.

    Soweit so gut, jetzt wissen wir ein bisschen wie das Ganze funktioniert, aber wie nutzen wir das jetzt?


    Indem wir einen Mikrocontroller nehmen und ihn programmieren. Auf der einen Seite soll er den Datenbus abhören und auf der anderen Seite soll er uns die Daten entsprechend anzeigen. Damit wir unseren 300KG Eisenhobel nicht noch schwerer machen, packen wir das Ganze in einen Chip mit gerade mal 5x7mm. Na gut, ein bisschen Peripherie gehört auch dazu. Als Anzeige verwenden wir alternative Instrumente oder LEDs vom Typ WS2812. Das sind RGB LEDs die ebenfalls über einen Datenbus (hoppla, bald brauchen wir noch einen Busbahnhof) gesteuert werden. Das hat den Vorteil dass man zur Ansteuerung nur eine Leitung braucht. Über diese eine Leitung können zig LEDs in ihrer Farbe und Helligkeit gesteuert werden. Anbei ein Schaltplan von der Sache.


    Schaltplan.jpg


    Links haben wir den Eingang vom Datenbus. Links oben einen Chip der die Spannung von der Rod unserem Attiny (Mitte) erträglich macht und rechts der Ausgang zur LED oder zum Treiber eines Instruments. Rechts unten ist der Programmierstecker (unwichtig). Die beiden Widerstände R1 und R2 dienen als Spannungsteiler weil die Rod am Ausgang des OBD Steckers 7V hat. Diese wären für unseren kleinen Rechenknecht schwer verdaulich. Das ist alles? Ja, in der Tat.


    Jetzt besorgt man sich einfach einen Lötkolben und lötet das zusammen und gut. Das heiße Ende erkennt man übrigens wenn man daran leckt. Dann stöpselt man es zusammen und stellt fest dass es ja gar nicht funktioniert. Kann ja auch nicht. Unser Tiny weiß ja auch gar nicht was er tun soll. Hierzu brauchen wir noch ein bisschen Software.

    Kommen wir zum nächsten Problem. Die Rod hat zwar einen OBD(?) Anschluss aber natürlich nicht so wie alle Anderen. Damit will ich sagen dass wir nicht einfach einen Wert (z.B. RPM) abfragen können. Alle Anfragen seitens des OBD Adapters laufen ins Leere und werden mit der Meldung „no Data“ beantwortet. Warum? Weil unsere ECU sich einen Scheiß drum schert wenn sie etwas gefragt wird (erinnert mich irgendwie an meine Frau). Sie labert einfach die ganze Zeit mit ihren Modulen (TSSM, IM, ABS) und gut. Aber nicht nur unser in Blech gepacktes Mysterium labert. Alle Module labern, dauernd, und das auch noch gleichzeitig. Eine Kollisionserkennung sorgt dafür das ein Modul die Klappe hält wenn gerade ein anderes labert oder aber sich durchsetzen darf. Was also tun? Na ganz einfach. Einfach mal zuhören was sie so labern. Dabei verraten sie uns natürlich auch alles das was wir wissen möchten.


    Anbei eine Übersicht der Daten die ich geprüft hab:

    RPM 28 1B 10 02 xx xx (xx xx/4)

    Speed 48 29 10 02 xx xx (xx xx/128)

    Gear A8 3B 10 03 xx (2,4,8,15,32=1,2,3,4,5)

    Motor Temp. A8 49 10 10 xx (xx-40 in Grad Celsius)

    Blinker 48 DA 40 39 xx xx (0=aus, 1=links, 2=rechts, 3=beide)

    Weg A8 69 10 06 xx xx (xx xx =0,4 Meter)

    Verbrauch A8 83 10 0A xx xx (xx xx=0,00005 Liter)


    Das sind natürlich nur ein winzig kleiner Teil der Informationen. Der Datenstrom reißt nie ab. Alles was wichtig und unwichtig ist wird praktisch im Millisekundentakt hin und her geschoben. Leider ist das Protokoll nicht dokumentiert und im Internet gibt es teilweise widersprüchliche Angaben und natürlich überträgt jede Harley die Daten die sie braucht. Das bedeutet dass man sich mühsam den Datenstrom am lebenden Objekt anschauen muss und entschlüsseln was die Information bedeutet.