Forum: Mikrocontroller und Digitale Elektronik Serieller Ausgabesalat


von André B. (whitespring)


Lesenswert?

Hi,
ich bin ratlos und mein Latein ist am Ende, ich arbeite mit einem 
ATmega88 und erstelle meine hex-Files zu flashen mit AVR Studio. Soweit 
gab es keinerlei Problemm, bis ich ich letztlich ein altes Projekt ab 
änder wollte.

Ich nutze für das Projelkt noch immer den selben Source Code, selbe 
Version von AVR, als auch Compiler zur Erstellung des Hex-Files, die 
Hardware ist ohne Fehler (auch das Serial to UBS Kabel getestet).
Spiele ich das alte Hex-File des Programms auf läuft alles einwandfrei, 
spiele ich das letzlich erstelle Hex-File auf gibt es Murks bei der 
Ausgabe über die Serielle Schnittstelle. Ich gebe dort lediglich einige 
Zahlen aus. Der Murks besteht in zahlreichen Störzeichen, hier ein 
Beispiel:

???<\0>??<\0>?<\0><\0>?????<\0><\0>??<\0><\0>??<\0>???????<\0>??<\0>??
<\0><\0><\0><\0><\0><\0><\0><\0><\0><\0><\0><\0><\0><\0><\0><\0><\0><\0>

Dies tritt nicht auf wenn ich das damals erstellte Hex-File verwende, am 
Quellcode wurde nichts verändert. Kann mir da jemand bitte weiterhelfen, 
es auf einen Bug oder sonstiges zurückführen? Sicher fehlen noch Info's 
um mir zu helfen also bitte fragt nach, danke.

von Karl H. (kbuchegg)


Lesenswert?

André Xxx schrieb:

> Dies tritt nicht auf wenn ich das damals erstellte Hex-File verwende, am
> Quellcode wurde nichts verändert.

Das sagen sie alle.
Und trotzdem stellt sich dann immer wieder heraus, dass am Quellcode 
doch irgendetwas gemacht wurde. Vor Monaten, nur zu Testzwecken, was 
dann nicht am Controller gelandet ist und Murks war. Aber nie rückgängig 
gemacht wurde. Und so kommt es, dass dieser Murks dann Monate später in 
einem Programm wieder auftaucht, in dem 'nie irgendetwas verändert 
wurde' :-)

von Klaus W. (mfgkw)


Lesenswert?

Taktrate (Quarz+Fuses)?

von jhonny (Gast)


Lesenswert?

Baudrate richtig eingestellt ?

von André B. (whitespring)


Lesenswert?

Bin zwar nen Bastler aber den Quellcode hab ich auf Cd gesichert, sollte 
sich nichts verändert haben. Ich überprüfe aber nochmals die 
Projekteinstellungen.

Durch aufspielen des alten Hex-Files ändert sich nichts an den Fuses, 
das das alte geht und das neu erstellte nicht, also würde ich die Fuses 
ausschließen.

Werde mal den Quarz durch messen, mal sehen was das Oszillo sagt.

Mit der Bautrate habe ich auch schon gespielt leider ohne Erfolg. bin 
runter bis auf 9600. Normal läuft es ohne nennenswerte Fehler mit 
115200.

Danke schonmal für die Anregungen, da geht nichts vergessen.

von Klaus W. (mfgkw)


Lesenswert?

Bei der Gelegenheit kann man vielleicht gleich mit dem Oszi mal das
RS232-Signal anschauen und die tatsächliche Baudrate ausrechnen.

von Stefan P. (form)


Lesenswert?

Ist/war die Controller Taktfrequenz evtl. nur in den Projectsettings 
eingestellt und nicht im Quellcode?
Wenn dann für die Baudratenberechnung ein falscher Wert hergenommen 
wird, ists klar das nur Käse rauskommt.

von André B. (whitespring)


Lesenswert?

Die Bautrate ist im Quellcode drin, allerdings hab ich mal die Hex-files 
verglichen. Aufällig ist das das neu compilte File länger ist und sich 
nur am Anfang und ende unterscheidet. Jetzt frag ich mich was sich da 
dazu geschummelt haben kann.
Werde das RS232- Signal mal prüfen, wobei ich mal schauen muss wie die 
Rechnung nochmal genau war, hoffe es ist nur ein so kleines Übel, wenn 
es das ist beiß ich auch freiwillig in den Tisch.

Nochmals danke für die schnellen Antworten.

von André B. (whitespring)


Lesenswert?

Einen Fehler ausmerzen können, mein eigentliches Problem löst es 
allerdings nicht. Scheint wohl doch noch Markel an der Hardware zu 
haben. Meine Ausgabe schaut jetzt wie folgt aus:
1
 <\0><\0>000000001;9;    0000;<\r><\n>000402;000000000;
2
         000018;000237;0;000000008;000000038;   
3
      00035;                   <\0><\0><\0><\0><\0><\0><\0><\0><\0><\0>
4
<\0><\0><\0><\0><\0><\0><\0><\0><\0><\0><\0><\0><\0><\0>
5
<\0><\0>00003;000000002;0;                   <\0><\0><\0><\0><\0><\0>
6
<\0><\0><\0>

Da sind jetzt die Werte drin welche ich Ausgebe, nur wo kommt der ganze 
andere Zeichensalat her? Habe TXD mit RXD mal kurzgeschlossen und 
Terminal zeigt mir das es an dem Kabel nicht liegen kann. Habe auch ein 
anderes Hex-File ausprobiert was die serielle Leitung nutzt und es 
tauchten keine Störzeichen auf. Hier ein Auszug aus meinem Code:

1
static void serialChar(uint8_t c)
2
{
3
  while((UCSR0A & (1 << UDRE0)) == 0){;}
4
  UDR0 = c;
5
}
6
7
static void serialString_P(char* s)
8
{
9
  while(pgm_read_byte(s))
10
  {
11
    serialChar(pgm_read_byte(s));
12
    ++s;
13
  }
14
}

Vielleicht sieht jemand wo es sich überschlägt oder mist baut. Werde 
selber weiter daran grübeln.

von holger (Gast)


Lesenswert?

serialString_P liest aus dem Flash.
Vermutung: Du übergibst einen String aus dem RAM.

von Klaus W. (mfgkw)


Lesenswert?

das wäre dann natürlich in der Tat ein HW-Problem...

von André B. (whitespring)


Lesenswert?

Ein einfacher Aufruf zur Ausgabe von einem String mit Variablen sieht 
bei mir so aus:
1
serialString_P(PSTR("Steurungswert:  "));
2
serialNumberDigits(parameter.a, 1);
3
serialString_P(PSTR(";"));

wie kann ich das den Prüfen und worin besteht das das Problem, sprich wo 
kommen die falsch ausgegebenen Zeichen für den Fall her?

von Da D. (dieter)


Lesenswert?

Übrigens, wenn es verschiedene Compilerversionen sind, mit denen das 
alte und neue Hexfile erstellt wurde, dann ist es ganz normal dass sich 
die Hexfiles etwas unterscheiden. Das hat also nicht viel zu sagen.

Um wirklich was an den Hexfiles erkennen zu können, müsstest du es durch 
nen Dissasembler schicken. Und und dann die Funktion des Asm Codes 
vergleichen, was zusätzlich durch die Optimierung erschwert ist. Das ist 
so aufwändig, das solltest du gar nicht erst versuchen ;)

von holger (Gast)


Lesenswert?

Apropo Optimierung: Übersetze doch einmal mit und einmal ohne
Optimierung.

von Aahh (Gast)


Lesenswert?

Leider sind die Fuses, die die Clocksource bezeichnen nicht Teil eines 
Projektsource codes, sodern werden extern zum code gesetzt. Falls man 
nun ploetzlich anstelle eine6MHz externen Quarzes den internen 8MHz 
Oszillator gewaehlt hat...

von André B. (whitespring)


Angehängte Dateien:

Lesenswert?

@ Da Dieter : Danke für den Hinweis mit dem Hex-file, es durch einen 
Dissasembler zu hauen liegt mir auch fern.

@holger : hat leider keinen Unterschied gemacht ob mit oder ohne 
Optimierung, die Ausgabe bleibt gleich falsch.

Ich habe jetzt Fragmente übernommen von meinem Programm und nur eine 
kleine Ausgabe gemacht von Strings. Läuft ohne Auffälligkeiten bis ich 
die Ausgabe von Zahlen als String mit reingebracht habe. Erster 
Durchlauf geht ohne Porbleme doch dann hängt sich das ganze auf bei 
serialChar(uint8_t chr)
1
 ... while((UCSR0A & (1 << UDRE0)) == 0)  ...

die Ausgabe welche im Terminal erscheint ist:

Stringausgabetest->1234567890;  0;
Stringausgabetest->1234567890;

Hoffentlich komme ich so dem eigentlichen Fehler auf die Sprünge. 
Arbeite auf einem ATmega88 mit 20MHz externem Quarz. Danke für Eure 
Ausdauer mir weiter zu helfen.

von André B. (whitespring)


Lesenswert?

so danke für die Hilfe, habe mich mal ganz tief bis in den Ass-code 
gewühlt. Dort gab es eine Schlaufe die den Buffer mit wahrlosen Zeichen 
füllt, und es lag doch an der Optimierung -Os und an dem gnu89 nutz jetz 
gnu 99 und alles will ^^ thx

von Da D. (dieter)


Lesenswert?

> wahrlosen

hm...  grübel   Also unwahre Zeichen? Zeichen ohne Wahrheit? Imaginäre 
Zeichen?

von Klaus W. (mfgkw)


Lesenswert?

oder verwahrloste? Oder wehrlose (in der Schlaufe gefangen)?

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.