www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Serieller Ausgabesalat


Autor: André B. (whitespring)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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' :-)

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Taktrate (Quarz+Fuses)?

Autor: jhonny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Baudrate richtig eingestellt ?

Autor: André B. (whitespring)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: Stefan P. (form)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: André B. (whitespring)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: André B. (whitespring)
Datum:

Bewertung
0 lesenswert
nicht 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:
 <\0><\0>000000001;9;    0000;<\r><\n>000402;000000000;
         000018;000237;0;000000008;000000038;   
      00035;                   <\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>00003;000000002;0;                   <\0><\0><\0><\0><\0><\0>
<\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:

static void serialChar(uint8_t c)
{
  while((UCSR0A & (1 << UDRE0)) == 0){;}
  UDR0 = c;
}

static void serialString_P(char* s)
{
  while(pgm_read_byte(s))
  {
    serialChar(pgm_read_byte(s));
    ++s;
  }
} 

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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
serialString_P liest aus dem Flash.
Vermutung: Du übergibst einen String aus dem RAM.

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: André B. (whitespring)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein einfacher Aufruf zur Ausgabe von einem String mit Variablen sieht 
bei mir so aus:
serialString_P(PSTR("Steurungswert:  "));
serialNumberDigits(parameter.a, 1);
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?

Autor: Da Dieter (dieter)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Apropo Optimierung: Übersetze doch einmal mit und einmal ohne
Optimierung.

Autor: Aahh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: André B. (whitespring)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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)
 ... 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.

Autor: André B. (whitespring)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Da Dieter (dieter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> wahrlosen

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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder verwahrloste? Oder wehrlose (in der Schlaufe gefangen)?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.