BMW MFL-Adapter für Kenwood

Bonze

Neues Mitglied
16. Jan. 2010
516
0
0
Altenkirchen (Pfalz)
Sprachen
  1. BascomAVR
ich möchte mein altes Radio in meinen BMW übernehmen, dieser hat jetzt ein MFL, mit dem ich auch das Radio bedienen kann.
Mein Kenwood Kdc BT-51U hat auch ein Lenkrad interface.
Jetzt hab ich irgendwo im Internet gelesen, das FB mit dem original Kenwood Adapter (der 70 eus kostet) nur eine Datenleitung ans Radio geht.
Und genau diese Datenleitung an den selben Pin wie die Tsop1738 Datenleitung.
Jetzt bin ich auf die Idee gekommen mit nem L9638D (LIN bus Transciever) und nem Tiny mir nen Adapter zu schustern.

Protokoll des I-Bus
In BMW Fahrzeugen ist das Protokoll über das die einzelnen Steuergeräte in den Netzwerken kommunizieren nach dem folgenden Schema aufgebaut:
· Quell ID
Identifikation des Teilnehmers der eine Nachricht an einen anderen BUS-Teilnehmer senden will

· Länge
Länge der kompletten Nachricht (ohne Quell ID und Längenangabe selbst)

· Ziel ID
Identifikation des Teilnehmers an den die Nachricht gesendet werden

· Daten
Nutzdaten den Nachricht

· XOR CRC - Checksumme
Die Checksumme dient zur Verifizierung der Nachricht. Der Empfänger der Nachricht berechnet die Checksumme und vergleicht diese mit der in der Nachricht enthaltenen.


Jedes Netzwerk (K-Bus, I-Bus und D-Bus) überträgt Daten mit einer Baudrate von 9600 Bit pro Sekunde. Das Kommunikationsprotokoll hat 8 Daten-Bits, 1 Stop-Bit und gerade Parität (even).

Nachrichten zum Radio: Adresse 68 Hex
Format der Nachricht:

<50 04 68> <Tastencode> <XOR>

Taste "-" (Lautstärke +)
32 10

Taste "+" (Lautstärke +-)
32 11

Button ">" (nächster Titel)
3B 01 Druck 3B 21 Druck aus

Button "<" (vorheriger Titel)
3B 08 Druck 3B 28 Druck aus

Nachrichten zum Telefon: Adresse C8 Hex

Format der Nachricht:

<50 04 C8> <Tastencode> <XOR>

Taste ‘Wählen’
3B 80 Druck 3B 90 Druck > 1s 3B A0 Druck aus

Taste "R/T"
3B 40 Druck

Nachrichten zur Sprachsteuerung (SES / ULF): Adresse B0 Hex

Das Aktivieren der SES geschiet durch halten der Taste 'Wählen'

<50 04 B0> 3B 80 5F

Hinweis: bei MFL ab Mj.1999 wir die SES automatisch erkannt und der oben genannte Code beim Halten der Hörertaste abgegeben. Die älteren MFL können dies nicht! Somit kann mit diesen die SES nicht direkt aktiviert werden.

Meine Frage ist nun wie bekomme ich das NEc Protokoll gesendet und welchen Tiny nehm ich am besten hab den 2313 noch hier, ist jedoch recht gross im DIP gehäuse.

http://www.alextronic.de/bmw/ibus-Dateien/image_proto.gif
http://ibus.stuge.se/Main_Page
http://ibus.stuge.se/images/Pinout.jpg
 
Hi Bonze,

zum NEC-Protokoll kann ich Dir leider nichts sagen, sorry. Aber sehr viel zum IBus.

Zum eine, tue Dir selber einen Gefallen und nimm einen richtigen IBus-Transceiver und keinen LIN-Transceiver, es ist wesentlich einfacher. Auch wenn Du nichts auf den Bus sendest, nimm einen IBus-Transceiver, wie zum Beispiel einen TH3122 von Melexis oder einen E910.15 von Elmos, von beiden habe ich npaar Exemplare hier rumfliegen. Dazu noch einen kleinen Atmega und das Thema ist erledigt. Ich meine, ich habe sogar noch irgendwo eine Platine mit einem Atmega162 und zwei TH3122 drauf. Beim IBus selber kann ich Dir ebenfalls viel helfen, habe sehr viel damit gemacht. Auf der Seite "ibus.stuge.se" sind auch sehr viele Infos von mir :)

Ich habe in meinem Achter ebenfalls ein MFL drin, mit Lenkradheizung, Tempomat und Radio-Steuerung. :cool:

Grüße
Heinrich
 
ok, danke fuer den tipp,

hab schon den code zum empfangen des nec protokolls,.
bau das dann so um dasd ich senden kann,.
fang die tage damit an,. erstma den roh code,.
dann nochmal alles am radio checken und die anschluesse, dann gehts richtig los, schaltplan hab ich auch schon ,.
 
Hi,

sorry für die späte Nachricht. Also, die Transceiver (TH3122) bekommst Du hier oder hier. Musst sie halt anschreiben.

Achso, vergiss Lin-Bus, das ist was völlig anderes.

Grüße
Heinrich
 
wie kann ich denn die code am geschicktesten speichern?
dachte an sowas hier, da sich der code ja immer aus startbyte, pausebyte,(Its ja immer gleich), dann adress bytes, und dem eigentlichen kommando zusammensetzen..
Code:
$data
adresse:                                                 '
   Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,                     'adresse
   Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,                     'invertierte adresse

Neccode[1]:                                                 '&h08 nächster Titel sender/titel hoch
   Data 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 ,                     'Komando
   Data 1 , 1 , 1 , 1 , 0 , 1 , 1 , 1 ,                     'invertiertes kommando

Neccode[2]:                                                 '&h08 
   Data 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 ,                     'Komando
   Data 1 , 1 , 1 , 1 , 0 , 1 , 1 , 1 ,                     'invertiertes kommando

und was meint ihr , berechne ich den timerwert m geschicktesten, brauch einen bereich von 560µs ueber 1,69ms und 9ms
werd den tiny 2313 mit dem internen takt von 8Mhz laufen lassen..
 
Der DATA-Befehl legt die folgenden (Byte-)Konstanten ab der Stelle im Flash ab, wo er übersetzt wird (Achtung: Flash-Zugriff ist Word-basiert). Wie Bascom die Daten interpretieren soll, wird duch entsprechende Affixe festgelegt - ohne alles sind es Bytes.
" Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ," schreibt dann also 8 mal das Byte 00hex (oder 0dez, oder 00000000bin) in den Programmspeicher, von wo Du es diese Bytes laden lassen kannst (read oder so, wobei hier das Leseziel bestimmt, wie viele Bytes gelesen (und zu dem Ergebnis zusammengebastelt) werden.)
Bist Du sicher, daß das da oben Bytes sein sollen? Oder Bits? &h08 im Kommentar klingt ja stark nach dem Byte 0b00001000, oder eben 8dezimal. Als was sollen diese Daten'Fragezeichen' über welche Schnittstelle aus dem 2313 gepumpt werden (UART - USI ? )
Die Frage mit dem Timer und m hab ich nicht verstanden - ich hab mir aber auch nicht alle Links da oben durchgesehen...

Achso, zum invertieren von Bytes sollte es eigentlich befehle geben, in Assembler COM (One's Complement), in Bascom sollte eigentlich einfach ein Minus vor dem Byte gehen...
 
ok speichere jetzt die einzelnen daten
$data
xyxyz[1] &b00000000
xyxyz[2] &b00000000
...


wobei, gibt es ne speicherfreundlichere alternative?
is ja immerhin ein tiny2313..

die daten werden in pulse umgwandelt,.
und an einem beliebigen Pin ausgegeben,.
 
bin schon die ganze zeit am überlegen, wie ich das am geschicktesten im Programm anstelle, um die Impulse zu erzeugen

es sind ja 4 versch Pulslänge möglich, das macht dann bei nem Takt von 8Mhz versch Timerstartwerte:
9000µs = 58515
4500µs = 62025
1687,5µs = 64224
562,5 µs = 65096

die frage ist nun, wie soll ich am einfachsten den programmaufruf machen, mit dem Timer?

BUs Signal empfangen ->passenden NEC Code laden -> zeichen fuer zeichen durchgehen, nach 1 oder 0 den Timer passen vorladen und starten

?
 
so, das Programm und die Planungen sind jetzt schon fortgeschrittener, und auch die ganzen Codes hab ich gesammlt,.
die empfangsroutine fuer die IBus codes hab ich auch, jedoch hab ich ne frage zu der Nec Senden Funktion,

Ich bin mir nicht sicher wie ich die zeiten messen soll, da es ja 4 versch zeiten sind, und auch die kombination von 1(lang pos) und kurz 0 , und bei 0, kurz 0 und kurz 0 hab :vollkommenauf:

meine idee ist es so zu machen
Code:
Tim1_isr:
   Incr I_timer
   If I_timer = 90 And I_nec = 1 Then
      Stop Timer1
      Reset Radio_out
      Zustand.2 = 0
      I_timer = 0
   Elseif I_timer = 45 And I_nec = 2 Then
      Stop Timer1
      Reset Radio_out
      Zustand.2 = 0
      I_timer = 0
   Elseif I_timer = 16 And I_nec = 3 Then
      Stop Timer1
      Reset Radio_out
      Zustand.2 = 0
      I_timer = 0
   End If
      Stop Timer1
      Reset Radio_out
      Zustand.2 = 0
      I_timer = 0
Return

 Code = Lookup(var , Codedata)                            'zusendender Code

      Select Case I_nec                                     '9ms pulse
         Case 0:                                               'Startbit 9000µs|
              '65535-(90*78)= 58515
              Timer1 = 58515
              Start Timer1
              Set Radio_out
              Zustand.2 = 1

         Case 2:                                            '4,5ms pulse
              '65535-(45*78)= 62025
              Radio_out = 0
              Timer1 = 62025
              Start Timer1
              Reset Radio_out
              Zustand.2 = 1
         Case 3:                                            '562,5 µs pulse
              '65535-(5,625*78)= 65096
              Radio_out = 0
              Timer1 = 65096
              Start Timer1
              Reset Radio_out
              Zustand.2 = 1
         Case 3:                                            '1687,5 µs pulse
              '65535-(16,87*78)= 64224
              Radio_out = 0
              Timer1 = 65096
              Start Timer1
              Reset Radio_out
              Zustand.2 = 1

         Case 3 To 32:                                      '0 = 560µs 0+560µs 1 (1,12ms)


wobei damit noch nicht die kombinationen eingeplant sind ...
finde das nich gerade elegegat,.

oder sollte ich lieber jede stellöe einzeln prüfen und nen zaehler fuer ersten puls und zweiten puls pro 1/0 nehmen?
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)