mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Uart Sendeproblem


Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wenn ich ein Feld 1x sende gibt es keine Probleme beim Empfang auf dem 
Hyperterminal, versuche ich jedoch 2x direkt hintereinander zu senden 
werden in der mitte einige Zeichen weggelassen.
Abhilfe brachte ein _delay_ms(10) zwischen den beiden schleifen, aber 
warum?
Syncronisationsproblem?
(ATmega läuft mit 16Mhz Oszillator und 57600 Baud)

Code: (nur mit delay zwischen den Schleifen ohne Probleme, erste 
schleife ok, zweite mit fehlenden Zeichen)

while (1) {
 for (a=0;a<feldende;a++) {
  while (!(UCSRA & (1 << UDRE)));  // Warte bis UDR ready
  UDR = test[a];            // sende Zeichen
 }
 _delay_ms(10);

 for (a=0;a<feldende;a++) {
  while (!(UCSRA & (1 << UDRE)));  // Warte bis UDR ready
  UDR = test[a];            // sende Zeichen
 }
}
MfG Jürgen

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

Bewertung
0 lesenswert
nicht lesenswert
Stell mal deine UART um auf 2 Stoppbits.
Dadurch kriegst du ein wenig mehr Spielraum
um den Fehler den du durch die 16Mhz Taktfrequenz
hast, nach jedem Zeichen auszugleichen.

Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Tip, aber leider brachte die Einstellung keine 
Verbesserung.
"Übertragunsfehler" gibt es nicht, es fehlen nur einige Zeichen.

Ohne delay:
$GPRMC,092103,V,,,,,,,031206,,*3E
$G6,,*3E

Mit delay:
$GPRMC,092103,V,,,,,,,031206,,*3E
$GPRMC,092103,V,,,,,,,031206,,*3E

Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe die Baudrate auf 38400 gestellt(max. 0,2% Fehler), ohne Erfolg.
Übrigens sendet ein Atmega die Daten zu einen zweiten, der diese dann 
auf dem Hyperterminal ausgibt (8 Datenbit, keine Parität, 1 oder 2 
Stopbit).

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du beim ATMEGA auch den EMV-Mode über Fuses ausgeschaltet (mal im 
DB unter CLOCK-Einstellungen suchen). Ich hatte da mal nicht daran 
gedacht und dann lief der ATMEGA bei 16MHz instabil. In diesem 
sogenannten EMV-Mode wird der ATMEGA nur bis 8MHz spezifiziert.

Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Thomas,

deine Einstellung für den EMV-Mode habe ich leider nicht gefunden im DB, 
da gibts für die Verwendung einer externen CLOCK nur noch die 
Möglichkeit über CKOPT einen 36pF Kondensator zuzuschalten.
Gesetzte FUSUES:
BOOTSZ0, BOOTSZ1, CKSEL0-4, SUTO

Könnte es evtl. der ATmega16L sein?

Ich verwende einen ATmega16 und einen ATmega16L.
Die L Version ist identisch mit der ersten, aber unterschiedlich 
getestet, evtl. hab ich ein Montagsmodell erwischt ;)

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Fuses heißt CKOPT (Seite 23 auf DB).
- wenn nicht programmiert, dann fmax=8MHz
  => Verstärkung des Oszillators geringer => für EMV geeigneter Modus
- wenn programmiert, dann fmax=16MHz
  => der Verstärker des Oszillators schwingt rail-to-rail

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die 'L'-Modelle sind für niedrigere Versorgungsspannung (>2.7V) 
konzipiert und machen daher max. 8MHz (Siehe Datenblatt). Die 
Brown-Out-Fuses sind bei den 'nicht-L-Modellen' auch nur bei 4V 
Brown-out-Level wirksam, da der µC darunter nicht mehr stabil läuft.

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Jürgen

Wahrscheinlich macht dein zweiter Mega Probleme, denn der muss ja die 
Daten vom ersten empfangen und wieder ausgeben. Wenn das schlecht 
gepuffert ist, knallts.

Bedenke vor allem, dass wenn die beiden MEGAs mit individuellen Quarzen 
laufen, diese real verschiedene Frequenzen haben, auch wenn überall 16 
MHz draufsteht. Das führt bei längeren Datenübertragungen ohne Pause zu 
Overflows. Beispiel. 1. MEGA läuft real mit 16 MHz +100ppm (Toleranz der 
meisten Quarze). Der Zweite läuft mit 16 MHz-100ppm, also schon mal 
200ppm langsamer. Nach 1/200ppm = 5000 Zeichen ohne Pause verschluckt 
dein zweiter MEGA ein Zeichen, weil er nicht schneller seine Daten 
wieder los wird. Also weit mehr, als in deinem Beispiel. Das isses also 
nicht!

Wahrscheinlich ein Problem mit der Pufferung und Übertragung. Die muss 
interrupt-gesteuert sein, denn sonst (Polling) ist der zweite MEGA für 
die Dauer des Sendens des ersten Feldes blockiert.

MfG
Falk

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du eine mega16L verwendest brauchst du dich nicht wundern dass er 
mit 16MHz nicht läuft! Einen 10MHz mit 12MHz funktioniert noch aber mit 
100% übertakten wird sicher schief gehen!

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das erklärt aber nicht, wieso es mit den 100ms Delay funktioniert. Ich 
tippe auf ein Softwareproblem.

MfG
Falk

Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für eure Hilfe :)

Den zweiten Atmega läuft nun im Interruptbetrieb und somit ohne 
Probleme.
Aber ich werde später auch einen 8Mhz Oszillator für den zweiten 
ATmega16L
verwenden um ganz sicher zu gehen.
Nochmals danke für eure Tips und Denkanstöße :)

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.