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
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.
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
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).
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.
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 ;)
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
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.
@ 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
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!
Das erklärt aber nicht, wieso es mit den 100ms Delay funktioniert. Ich tippe auf ein Softwareproblem. MfG Falk
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 :)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.