Da meine andere Frage zum K-Line Anpassung wohl zu speziell war, Frage
ich hier mal allgemeiner.
HINTERGRUND:
Ich möchte mit einem Atmega-Mikrocontroller mit meinem KFZ über die
OBD2-Buchse kommunizieren. Mein KFZ nutzt das K-Line Protokoll (was
quasi eine UART-Schnittstelle ist, wo RX/TX zusammen über eine Leitung
im Halbduplexbetrieb reden mit 10400baud und 12V Pegeln). Zur Anbindung
gibt es auch spezielle Schnittstellen-ICs, z.B. den MC33230.
Leider ist dieser schwierig zu kriegen, bzw. ich möchte nicht extra 5EUR
Versandkosten für einen SMD-IC zahlen (zudem löte ich nicht gerne
SMD-ICs).
Deshalb möchte ich das lieber mit einfachen Transistoren anpassen. Es
gibt einen fertigen OBD2 Interpreter-IC namens "ELM323", welcher auch
nur ein (PIC-)Mikrocontroller ist. Dieser wird wie folgt angebunden:
Siehe angehängtes Bild, was ein Auszug aus der Beispielschaltung aus dem
ELM323 Datenblatt ist (rote Schrift stammt von mir, Rest original).
Der 510 Ohm 12V-Pullup-Widerstand ist wohl so in der Norm
vorgeschrieben. Aber die Eingangs-Transistorschaltung unten kapier ich
nicht so ganz (der obere 10K Widerstand ist irgendwie seltsam
geschaltet).
Ich habe die Schaltung einfach mal aufgebaut. Problem: Sowohl der
Ausgang, als auch der Eingang sind invertiert. Da ich die Hardware-UART
des Atmega nutze, kann ich die Pegel auch nicht im uC zurückinvertieren
(lasse mich aber gerne eines besseren belehren!). Eine funktionierende
Software-UART für den Atmega, habe ich auch nicht gefunden, bzw.
empfangsmäßig zum Laufen bringen können.
FRAGE:
Zurück zur Schaltung und meiner eigentlichen Frage: Ich habe sowohl
Eingang als auch Ausgang einfach mal über einen simplen
NPN-Emitter-Folger invertiert. So funktioniert das auch prinzipiell.
Doch ich möchte ungern soviel externe Beschaltung (und damit
Signalverfälschung) haben. Kriegt man das nicht auch mit jeweils nur
einem Transistor hin?
Kann ich den NPN-Transistor am Ausgang durch einen PNP tauschen und am
Eingang den PNP durch einen NPN und habe dann invertierte Pegel? Doch
wie schalte ich die Transistoren dann richtig, insbesondere der
Eingangstransistor mit der seltsamen Widerstandsbeschaltung macht mir
Kopf zerbrechen. Ich möchte auch nicht gleich die OBD2-Schnittstelle des
KFZ schrotten! Darum meine Frage an die Transistorexperten hier ;)
Danke im voraus,
Kermit
So, mal noch einfacher:
Im Anhang der Ausgang. Kann man den so invertieren? Oder hau ich mir so
über die Emitter-Basis-Strecke die 12V-Spannung in den TTL-Eingang?
Beim Bild ausgang.png von 22:10 ist ein Emitterfolger verwendet. Du
erhälst am Data nur rund 5V als High-Pegel und keine 12V. Geht so also
nicht. Deinem TTL-Ausgang würde nichts passieren.
Beim eingang.png von 22:12 gibt es auch ein Problem: der LOW-Pegel für
dein TTL-Signal wird die 1.4V nicht unterschreiten können - das ist kein
LOW!
Kleiner Tipp: mit dem kostenlosen LTSpice kann man das in wenigen
Minuten prima simulieren und sieht die Probleme ...
Danke für die Antwort! Dann muss ich wohl zum Invertieren doch zwingend
jeweils einen 2. Transistor als Emitterfolger nachschalten um den Bus
nichtinvertiert ansteuern und auslesen zu können.
Auf Grund der Menge der Bauteile (aufwendige Platinenherstellung!) werde
ich es erst mal lassen und das Projekt jetzt erst mal auf Eis legen und
mich dann lieber mit Software-UARTS beschäftigen, die ich im Atmega dann
selbst invertieren kann.
Die Handvoll Bauteile lötet man doch in ner Stunde auf Lochraster!
Wenn nicht schneller.
Aber das Invertieren würde ich in jedem Fall eh in Software machen!
Dann bleibt die UART auch frei um die empfangenen Daten weiter zusenden.
Grad beim Softwaredebuggen sehr hilfreich.
Das Löten ist nicht das Problem. Aber das Platinenentwickeln (ich
zeichne sowas meist per Hand). Umso mehr Bautteile, um so komplizierter
wird es und um so eher schleichen sich Fehler ein.
Und mit einer Platinensoftware wie Eagle, wo man erst eine Woche
Einarbeitung für braucht um halbwegs brauchbare Platinen zu erstellen,
möchte ich gar nicht erst anfangen. Selbst dann muss man das Layout von
Rechner auch noch irgendwie auf die Platine kriegen, was wieder
aufwendig Belichten, Entwickeln, usw. bedeutet und entsprechende
Belichtugnsgeräte erfordern. Ein Laserdrucker, um den Toner
"aufzubügeln" besitze ich auch nicht.
Das lohnt sich nur bei aufwendigen Projekten. Da halte ich es lieber
einfach.
Und bei Lochrasterplatinen habe ich ja keine Verbindungen zwischen den
Bauteilen. Das alles per Brücken (auf der Unterseite oder wie macht man
das?) zu machen, etc. ist doch alles nur Pfusch. Aber selbst dann gilt:
Umso mehr Bauteile, umso komplizierter die Verdrahtung.
Lötzinn ergibt eine Brücke zwischen benachbarten Punkten...
zwei Beinchen ins gleiche Loch...
Beinchen in die passende Richtung biegen...
Wenn du keine Löcher magst, nimm Streifen...
SO kompliziert ist die schaltung ja auch net....
Es gibt auch Fädeldraht. Damit hab ich auch schon digitalschaltungen mit
8bit Bus an mehrere Bauteile gebastelt.
Also so bis 20 - 30 Bauteile auf ner Lochraster ist doch noch Pipifax!
Das lohnt es sich doch garnet drüber nachzudenken für einen Prototypen
ne LP zu machen. Wenn das Projekt dann komplett ist mit allem was man
zur EMV Filterung braucht. Dann LP machen. Vergissnicht, wenn das im
Autolaufen soll, das Bordnetz ist nicht 12 Gleichspanung, sondern nur
sowas ähnliches sehr stark versautes.
> Aber das Platinenentwickeln (ich zeichne sowas meist per Hand).
Du machst wohl Witze oder? Schau mal hier:
http://www.criseis.ruhr.de/lancia/lancia.html
So mache ich das fuer den Anschluss an meinem Palmpiloten.
Komm aber jetzt nicht auf die Idee die Schaltung einfach hirnlos
abzumalen. Der Palmpilot hat eine Schnittstelle wie ein PC, die
Signale sind also aus der Sicht eines Microcontroller nochmal
invertiert. Aber das laesst sich natuerlich einfach mit einem
Transistor oder einem Einzelgatter loesen.
Ausserdem noch zwei Punkte fuer den wackeren Nachwuchsprogrammierer...
1. Die 500 Ohm pullup sind fuer die korrekte Funktion zwar notwendig,
bei meinem Wagen waren die aber schon im Auto eingebaut.
2. Software-Uart ist voll Banane. Hast du dir schonmal Gedanken gemacht
warum es ueberhaubt soetwas wie ein ELM323 gibt? Man koennte die
Schnittstelle doch einfach direkt an einen PC anschliessen, so wie
ich es mit dem Palmpiloten gemacht habe. Das Problem ist bloss das
du sehr wenig Zeit hast um auf Kommandos oder Daten auf der
Datenleitung zu reagieren. Wenn dein Auto da eine gewisse
Zeitverzoegerung bemerkt dann stellt es einfach die Kommunikation
ein.
Vor dem Hintergrund will man sich einen SoftwareUart gewiss nicht
antun. Selbst dann nicht wenn man sich dabei einen Transistor und
zwei Widerstaende sparen kann.
Olaf
@Olaf: Danke für den Link!
Jetzt weiß ich wenigstens, wie ich den Eingang schalten kann! Habe das
mal angepasst (siehe Anhang). Im Grunde ist es nur ein Spannungsteiler
von 10:1, der an die Basis geht. Bei Highpegel auf dem Bus (1/11*12V an
der Basis) sperrt dann der PNP-Transistor und bei Lowpegel schaltet er
durch.
Dein TX-Ausgang ist aber immer noch invertiert. Ich denke das liegt an
der RS232-ähnlichen Schnittstelle Deines Palms, welche schon ein
invertiertes Signal ausgibt. Das macht die UART eines Atmegas leider
nicht.
Was die UART angeht, so reden wir wohl irgendwie aneinander vorbei. Mit
Software UART meine ich eine Software UART im Mikrocontroller. Diese
steht doch, wenn man sie vernünftig realisiert, der Hardware-UART in
nichts nach! Es geht hier ja auch um eine relativ lahme
Schrittgeschwindigkeit von "nur" 10400baud.
Zur Klarstellung: Ich habe nicht vor den Mikrocontroller an einen PC
anzuschließen. Er soll nur auf einem LCD Fahrzeugdaten ausgeben.
Aber auch für den PC gibt es durchaus Software, die über die
RS232-Schnittstelle direkt mit dem Fahrzeug sprechen kann (ohne ELM323).
Das ist dann ein sogenannten KL oder KKL Interface, welche auch nur eine
Pegelanpassung machen.
Nichtdestotrotz. In dem Thread geht es mir nur um die Invertierungen und
ich habe versucht mich so auszudrücken, dass hier jeder
Transistorexperte
anworten kann, auch wenn er keine Ahnung vom K-Line Protokoll hat!
> Was die UART angeht, so reden wir wohl irgendwie aneinander vorbei.
Aeh..nein. Ich weiss schon was ein SoftwareUART ist.
> Diese steht doch, wenn man sie vernünftig realisiert, der> Hardware-UART in nichts nach!
Noe. Bei einem Hardware UART uebergibst du ein Datenbyte
an den UART und hast danach eine Menge Zeit andere Dinge zutun.
Und noch wichtiger, wenn ein Byte reinkommt so hast du ebenfalls
etwas Zeit bis du dich darum kuemmern musst.
> Zur Klarstellung: Ich habe nicht vor den Mikrocontroller an einen PC> anzuschließen. Er soll nur auf einem LCD Fahrzeugdaten ausgeben.
Das kannst du ja auch tun. Aber wenn die Schnittstelle zu deinem
Auto einmal steht so musst du dauernd Daten austauschen. So war
es zumindest bei mir. Hast du einmal nicht genug Zeit dich darum
zu kuemmern bricht sofort die Verbindung zusammen.
Das ist vermutlich auch noch in Software machbar wenn du nur noch ein
Display am Controller hast. Aber die Arbeit laesst sich VIEL entspannter
loesen wenn man den UART benutzt.
> In dem Thread geht es mir nur um die Invertierungen und> ich habe versucht mich so auszudrücken, dass hier jeder> Transistorexperte
Um einen Inverter zu bauen muss man nicht wirklich ein
Transistorexperte sein. Jede einfache Emitterschaltung sollte
es da tun. Und fallst du unbedingt noch einen Widerstand
einsparen willst dann kannst du auch einen Digitaltransistor
nehmen. (z.B DTC114)
Du kannst aber natuerlich auch ein IC mit sechs Inverter nehmen.
(74HC14) Und falls du angesichts dieser nackten Verschwendung
nicht schlafen kannst, es gibt auch Einzelgatter. Toshiba TC7S14.
Die sind aber in Deutschland etwas schlechter zu bekommen. Ich
finde aber davon gehoeren einfach immer ein paar Dutzend in die
Bastelkiste. :)
Olaf
p.s: Achte darauf das im Fehlerfalle, also wenn dein Controller
nicht laeuft und seine Ausgaenge hochohmig sind, dein Bus nicht
runtergezogen wird.