Forum: Mikrocontroller und Digitale Elektronik Programm läuft nur sporadisch


von Rene U. (ulmi)


Angehängte Dateien:

Lesenswert?

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

von Rene U. (ulmi)


Lesenswert?

Kann mir den niemand helfen?
Ich weiß einfach nicht mehr weiter...

mfg ulmi

von Juergen G. (jup)


Lesenswert?

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

von Rene U. (ulmi)


Lesenswert?

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

von Juergen G. (jup)


Lesenswert?

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.

von Wilhelm F. (Gast)


Lesenswert?

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.

von Juergen G. (jup)


Lesenswert?

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.

von Rene U. (ulmi)


Lesenswert?

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

von Wilhelm F. (Gast)


Lesenswert?

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.

von Rene U. (ulmi)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

Dein Programm ist ja auch noch lange nicht fertig.

von Uwe (de0508)


Lesenswert?

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.

_

von Rene U. (ulmi)


Lesenswert?

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?

von Rene U. (ulmi)


Lesenswert?

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

von Juergen G. (jup)


Lesenswert?

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

von Rene U. (ulmi)


Angehängte Dateien:

Lesenswert?

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

von holger (Gast)


Lesenswert?

>Wäre es besser wenn ich die zwei gelben Kabel so kurz wie möglich halte?

Die müssen exakt 55,789mm lang sein. Sonst geht das nicht.

von Wilhelm F. (Gast)


Lesenswert?

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.

von Juergen G. (jup)


Lesenswert?

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

von Juergen G. (jup)


Lesenswert?

Andere Frage, kommt die Ladungspumpe des MAX mit diesen Elkos auf min. 
9V besser waere so um die 11V-12V

Ju
PS:
Negativ natuerlich.

von Rene U. (ulmi)


Lesenswert?

@ 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

von Mikel M. (mikelm)


Lesenswert?

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?

von Rene U. (ulmi)


Lesenswert?

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

von Bernhard S. (b_spitzer)


Lesenswert?

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...

von Juergen G. (jup)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.