Hallo
Ich habe folgendes Problem:
Ich möchte mit einem ELM327 die OBD Daten meines Autos auslesen.
Diese sollen mit einem ATmega8 eingelesen und verarbeitet werden.
Wenn ich nun die Befehle wie sie vom ELM327 kommen per Terminal händisch
eintippe, funktioniert mein geschriebenes Programm wunderbar.
Doch sobald ich das ganze wie folgt anschließe, kommen die ersten
Probleme.
Auto ---- ELM327 --- PC (mit Serial Sniffer) ---- ATmega8
Wenn ich es so anschließe, dann führt er nur einen Teil richtig aus und
ich kann aber nicht herausfinden warum.
Hier einmal die gesnifften Daten der Kommunikation zwischen ELM327 und
ATmega8:
1
ATmega8: ELM327:
2
3
AT ZAT Z?>
4
AT ZAT Z AT ZELM327 v1.4>
5
AT SP0 AT SP0OK>
6
¿Cåv”té¿
7
Cåv”té
Nach dem SP0 OK sollte vom ATmega "01 0C" zum ELM327 gesendet werden,
doch der sendet irgendwas. Wie kann das sein wenn alles perfekt
funtioniert wenn ich es in ein Terminal-Programm eingebe?
Wenn ich das ganze OHNE meinem PC dazwischen anschließe, dann macht das
Programm gar nichts richtig. Fehlt dann eventuell die richtige
Masseverbindung?
Ich hoffe ihr könnt mir weiterhelfen und stampft mich wegen meinem
Programm nicht in Grund und Boden weil ihr das sicher besser hinkriegt,
aber ich fange gerade erst wieder an mit dem ATmega zu programmieren.
mfg ulmi
Wenn Du
Auto ---- ELM327 --- PC (mit Serial Sniffer) ---- ATmega8
verbindest fehlt irgendwas mehr als nur eine Masseverbindung.
Lass Dich da mal etwas genauer ueber die Verkabelung, Laengen,
Kabeltypen, Geschwindigkeiten aus.
Hier hat keiner Lust zum Raten.
Ju
An der OBD Schnittstelle vom Auto hängt der ELMScan5 (da ist der ELM327
drin), dieser hat einen Seriellen Ausgang (= ca 1m langes Kabel mit nem
dsub Stecker). Das ganze habe ich jetzt über meinem Laptop, also einem
USB zu RS232 Konverter angeschlossen. Darauf läuft die Software
SerialSniffer.Über einen zweiten USB zu RS232 Konverter wird das ganze
dann mit meiner Schaltung Verbunden (direkt´mit der Platine).
Baudrate ist 115200.
Wenn ich das ganze so wie oben beschrieben anschließe läuft ca die
Hälfte des Programms korrekt (RS232 Verbindung funktioniert, usw).
Wenn ich das ganze ohne meinen Laptop anschließe funktioniert gar nichts
richtig.
Masseverbindung sollte doch an der OBD Schnittstelle vorhanden sein
oder?
mfg ulmi
ich kenne den ELMScan5 mit dem ELM327 nicht. Denke aber nicht das das
Problem dort liegt.
Ich glaube das Dein Problem in den Kabeln oder der Atmega Platine ist.
Wo ist der 2. USB-RS232 angeschlossen der zum Atmega PCB geht.
Ich vermute mal am PC der das Signal dann auf einem anderen USB wieder
ausgibt was auf dem einen reinkommt.
Bei 115200 Baud auf RX und TX ist nicht viel Spielraum fuer
Verzoegerungen.
Das Ergebnis sieht man in Deinem ersten Post. Da kommen immer ein paar
falsch interpretierten Bytes an.
Wenn der PC das Signal durchschleift hast Du durch den PC eine
Verstaerkung des Signals.
Damit laesst sich erklaeren warum es mit dem PC zumindest Ansatzweise
funktioniert.
Wenn es ohne PC gar nicht geht ist es das Atmega PCB.
Wenn Sich die Baudrate nicht verkleinern laesst, musst Du an Deinem
Atmega Takt was machen, damit der UART Error kleiner wird.
Wie sieht Die Schaltung um den Atmega aus?
Steckbrett? Lochraster? Kabel mit Krokos?
Das kannst Du bei 115200 Baud vergessen. Da muss was ordentlich
geloetetes her.
Juergen G. schrieb:> Bei 115200 Baud auf RX und TX ist nicht viel Spielraum fuer> Verzoegerungen.> Das Ergebnis sieht man in Deinem ersten Post. Da kommen immer ein paar> falsch interpretierten Bytes an.
Ich kenne den ATmega8 nicht, wie schnell er ist, aber genau mit hohen
Baudraten und den in C geschriebenen FIFOs hatte ich Probleme mit einem
8051-er. Der kam mit dem Empfang nicht mehr nach, nach ein paar Bytes
läuft dann nichts mehr.
Am Ende schrieb ich optimierte Assembler-Routinen für die FIFOs, die
vorwiegend auch nur deswegen schnell wurden, weil das 8051-Derivat
80C517 multiple Datapointer hat.
Die Atmega8 laufen bis 16MHz der Atmega88 bis 20MHz.
115200 Baud gehen mit den Atmega's problemlos auch mit ISR und FIFO, nur
muss da der passende Quarz dran.
Ich habe eine modifizierte Lib auf Basis der UART Lib von Peter Fleury.
Also ich benutze keine ISR.
Quarz sollte es nicht liegen. Habe hier im Forum nach nen passenden
Beitrag gesucht und eine Liste mit Quarz und Fehler in Prozent gefunden.
Den genauen Wert weiß ich jetzt nicht auswendig, muss ich erst zu Hause
nachschauen (irgendwas mit 7,...MHz).
Meine Schaltung ist auf einer Lochrasterplatine gelötet, und die RX, TX
Leitung ist ein ganz normaler Litzendraht. Kann die Verdrahtung auch bei
einer niedrigeren Baudrate zum Problem werden?
Wenn die Baudrate das Problem sein sollte, dann Versuch ich das heute am
Abend mit einer niedrigeren. Welche würdet ihr mir empfehlen?
mfg ulmi
Juergen G. schrieb:> Die Atmega8 laufen bis 16MHz der Atmega88 bis 20MHz.
OK. Bei mir war es so, daß ich einen Baudratenquarz 7,3728MHz nehmen
mußte. Die werden durch den Baudratenvorteiler auch noch durch 32
dividiert, womit man dann die höchste Baudrate 230400 erhält. Die
schaffte er aber nur mit Pausen zwischen den einzelnen Empfangsbytes.
> 115200 Baud gehen mit den Atmega's problemlos auch mit ISR und FIFO, nur> muss da der passende Quarz dran.
Es ist halt die Frage, was die anderen Prozesse noch so machen.
> Ich habe eine modifizierte Lib auf Basis der UART Lib von Peter Fleury.
Ich schaute mir die C-Library aus dem SDCC-Compiler an, portierte sie
nach Assembler, und optimierte dann. Am C-Code selbst aus dem
SDCC-Compiler gab es schon nichts mehr zu optimieren. Das ist wohl schon
ein viel verwendeter Standard. Die Anpassungen auf die multiplen
Datapointer und verschiedene 8051-Derivate sind dort leider nicht
drinne. Da gibt es noch reichlich Arbeit, auch für weitere 8051-Features
in den Derivaten.
Rene U. schrieb:> irgendwas mit 7,...MHz
Das wird der Baudratenquarz 7,3728MHz sein, wie bei mir. Einer mit
14,7456MHz wäre besser gewesen, den hätte ich aber erst bestellen
müssen.
Einen UART in der ISR zu betreiben, ist in der Regel schon angebracht.
Warum muss man den UART unbedingt in einer ISR betreiben?
Bei meinem Programm (siehe erster Post)wartet einfach der Atmega bis das
Schlusszeichen kommt und dann erst läuft das Programm weiter.
Funktioniert das so nicht? Ich hab mir gedacht da das Programm ohne die
RS232 Daten sowieso nichts machen kann, kann auch gleich der Atmega auf
die Daten warten ohne dazwischen etwas abzuarbeiten.
mfg ulmi
Hallo Rene,
wie Karl Heinz schrieb, stelle Dir vor Du willst ein einem zweiten
Zeiteinheit eine LED Anzeige anteuern.
Die Aufgaben wären
- LED multiplexen
- Taster abfragen und entprellen
- einen Drehencoder abfragen und entprellen
- eine I2C Datenstrom verarbeiten
- ein userMenü, gesteuert über den Drehencoder, darstellen.
- usw.
Ein Teil der Jobs liegen in der main-Loop und der andere in ISR
Routinen, seien die Timer oder die Uart Schnittstelle.
So wird dann dein Programm zu einem 'Multitasking' System, bezogen auf
bsp. einem Zeitschlitz von 1ms.
Innerhalb dieses Zeitschlitzes von 1ms laufen die Programme natürlich im
sequentiell ab.
Von außen betrachtet sieht man das aber nicht, man beobachtet immer nur
die 1ms Zeitschlitze.
_
Ja das ist nur ein Testprogramm, aber das ganze hat bis auf ein paar
IF-Verzweigungen und UART-Befehlen auch nicht mehr.
Oder wie darf ich das verstehen?
Hallo Uwe
Was du geschrieben hast hört sich für Erweiterungen (falls es solche
geben sollte) ganz nett an.
Aber momentan möchte ich mit dem UART einen Befehl senden die Daten
Empfangen und je nach Daten eine LED mit einem Schieberegister
ansteuern.
Für soetwas brauche ich nicht zwingend ISR? Oder empfehlt ihr mir diese
bei so einer Anwendung?
mfg ulmi
Zwingend ist gar nichts, aber manches ist empfehlenswerter als anderes.
Um das Schiftregister zu schreiben brauchst Du auch Zeit. Normalerweise
geht das sehr schnell, auf alle Faeller schneller als ein Byte ueber den
UART.
Da die MCU den Datenempfang eines Bytes am UART in Hardware alleine
macht, kannst Du in der selben Zeit das Schiftregister schreiben.
Die Frage ist wie wird das Timing gesteuert? Dafuer nimmt man dann die
Interrupts her.
Wie man sein Programm schreibt, ist schlechthin die Entscheidung jedes
einzelnen. Ich finde ISR's nicht kompliziert und eine sehr elegante
Loesung fuer eine Menge Aufgaben.
Wie schon gesagt, zwingend sind sie nicht, ich verwende sie wo immer
moeglich.
Doch ich glaube nicht das ISR oder nicht Dein Problem loest.
Ich vermute das Problem in Deinen Kabeln oder der Lochrasterplatine.
Zeig doch mal ein Foto her.
Ju
Die KAbel im Hintergrund einfach nicht beachten.
Wäre es besser wenn ich die zwei gelben Kabel so kurz wie möglich halte?
Oder funktioniert das so überhaupt nicht? Sollte ich eine Platine ätzen?
Habe das ganze jetzt mit 19200 Baud ausprobiert, funktioniert etwas
besser aber immer noch nicht gut genug.
Wenn der gleiche Befehl schnell hintereinander gesendet wird, kommt der
UART irgendwann durcheinander und sendet irgendwelche Zeichen.
mfg ulmi
Rene U. schrieb:> Warum muss man den UART unbedingt in einer ISR betreiben?
Na, weil er dann asynchron unabhängig zum Programm schon mal Daten
sendet oder empfängt.
So was hatte ich mir schon gedacht.
Loete die 4 gelben Kabel vom Atmega zum MAX und vom MAX zum DB9 ohne
Isolierung unter die Platine auf die Loetpunkte. So Kurz wie moeglich.
Betonung liegt auf loeten, dann kommst Du nicht in die Vesuchung sie
ueber Kreuz zu legen.
Ju
@ Juergen
Danke für den Tipp, werde ich heute am Abend gleich einmal versuchen.
Leider habe ich gestern beim Probieren mit einer niedrigeren Baudrate
irgend ein Bauteil beleidigt. Irgendetwas hat komisch verkohlt gerochen.
Dachte zuerst das es nur die Sicherung vom Auto war, aber als ich das
ganze an meinem Netzgerät angeschlossen hatte wollte die Schaltung nicht
mehr so richtig.
Jetzt kommen nur noch ein bis 2 komische Zeichen von der RS232 raus.
Welches Bauteil könnte ich eurer Meinung nach zerstört haben? Den MAX???
mfg ulmi
Rene U. schrieb:>> Jetzt kommen nur noch ein bis 2 komische Zeichen von der RS232 raus.> Welches Bauteil könnte ich eurer Meinung nach zerstört haben? Den MAX???>
Welches hat denn gerochen? Kann alles mögliche sein, z.B. auch ne kalte
Lötstelle, oder nen Kurzschluß weil irgend welche Drähte zusammenkommen,
... usw
Welche Spannungen liegen am Max?
So habe jetzt mal den (die) Fehler in der Schaltung gesucht.
Ein Schieberegister war defekt, doch es müssen noch mehr Fehler in der
Schaltung versteckt sein die ich noch nicht gefunden habe. WErde das
ganze morgen noch einmal durchmessen, da ich heute und gestern nicht
viel Zeit hatte.
Am MAX liegen (mit einem Multimeter gemessen) folgende Werte an:
Pin 1(C1+) = +7,10V Pin 16(Vcc) = 5,50V
Pin 2(Vs+) = +9,20V Pin 15(GND) = 0V
Pin 3(C1-) = +2,50V Pin 14(T1Out) = -8,80V
Pin 4(C2+) = -4,75V Pin 13(R1In) = 0V
Pin 5(C2-) = -4,53V Pin 12(R1Out) = 5V
Pin 6(Vs-) = -8,83V Pin 11(T1In) = 3,10V
Pin 7(T2Out) = -8,84V Pin 10(T2In) = 3,05V
Pin 8(R2In) = 0V Pin 9(R2Out) = 5V
Das schaut doch eigentlich nicht schlecht aus oder?
Warum bekomm ich dann auf einmal trotzdem nur mehr irgendwelche Zeichen
aus der RS232 raus?
Ich habe mir überlegt die Schaltung zu Layouten und die PCB zu ätzen.
Ich glaube das es schneller geht und vor allem dann mit den richtigen
Leiterbahnlängen für RX und TX! Wie lange sollte denn die Leiterbahn
sein? ODer wielange darf sie maximal sein?
Stimmt ihr mir zu, dass es besser ist die Platine zu ätzen oder soll ich
auf der Lochraster weiter den (die) Fehler suchen und dann diese Platte
lassen?
mfg ulmi
Juergen G. schrieb:> Andere Frage, kommt die Ladungspumpe des MAX mit diesen Elkos auf min.> 9V besser waere so um die 11V-12V
Die Spannungsverdopplerschaltung des MAX232 kann nie über 2x Versorgung
- Verlust kommen. Danach die Invertierung, so dass bei 5V
Versorgungsspannung typisch +9V und -8V übrig bleiben. Das ist für
normale Anwendungen mehr als ausreichend.
Wer mehr will, nimmt zwei Uralt MC1488/1489 mit 12V-Versorgung...
Die Spannungen am MAX sind OK so.
Pin 16(Vcc) = 5,50V
Fuer den MAX is das OK, aber ich nehme an, das das auch der Atmega
bekommt. 5.5V ist aber ziehmlich grenzwertig fuer den Atmega.
Eine Platine zu ätzen ist immer eine gute Idee wenn man Frequenzen in
der Schaltung hat die sensibel im Timing sind.
Ich steck mir auch manchmal was eben schnell auf dem Ptotoboard
zusammen, mein Osci belehrt mich dann aber meist eines besseren.
Ju