Forum: Mikrocontroller und Digitale Elektronik Problem mit Empfang - UART Library Fleury


von Heiko (Gast)


Lesenswert?

Hallo zusammen,

ich nutze einen ATmega1281 und möchte über USART1 mit dem PC
kommunizieren. Dazu nutze ich die UART Library von Peter Fleury.
Damit ich sie compilieren konnte, musste ich lediglich die 
Interruptvektoren
anpassen. Das Beispeilprogramm läuft auch soweit. Ich kann einzelne 
Zeichen
senden und als Echo empfangen.
Jetzt zu meinem Problem:
Sobald ich einen kompletten String an den UART sende, kommt als Echo nur 
die
ersten 1-3 Zeichen korrekt zurück. Es ist aber auch schon vorgekommen, 
dass ich über längere Zeit den String korrekt empfangen habe. Der Fehler 
liegt auch definitiv auf Controller-Seite. Habe mir die zurückgesendeten 
Zeichen mit dem Oszi angeschaut und er sendet wirklich diesen Mist.
Woran könnte das liegen? Wie gesagt, der Empfang von einzelnen Zeichen 
ist korrekt. Hatte jemand schon ein ähnliches Problem?
Könnte es sein, dass die Empfangsroutine, die empfangenen Zeichen nicht 
schnell genug verarbeiten kann? Ich weiß mittlerweile nicht mehr so 
richtig wonach ich suchen soll, darum wär ich für Hilfe sehr dankbar!

Grüße

Heiko

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> Könnte es sein, dass die Empfangsroutine, die empfangenen Zeichen nicht
> schnell genug verarbeiten kann?

Das könntest du selbst testen, wenn du mit der Baudrate runter gehst. Es 
müsste weniger Fehler geben, wenn deine Vermutung stimmt.

von MNR (Gast)


Lesenswert?

Außerdem kannst du den Buffer in Peters Routinen in 2er Potenzen 
erhöhen.

von Heiko (Gast)


Lesenswert?

Hab den Fehler gefunden. Mit einem delay von ein paar ms zwischen den 
einzelnen Bytes funzt alles. Die ISR ist also einfach zu langsam.
Kann man das irgendwie optimieren.
Danke euch für die Antworten.

Grüße Heiko

von Falk B. (falk)


Lesenswert?

@ Heiko (Gast)

>Hab den Fehler gefunden. Mit einem delay von ein paar ms zwischen den
>einzelnen Bytes funzt alles. Die ISR ist also einfach zu langsam.

Dann hast du was falsch programmiert. Ein AVR kann bei richtiger 
Programmierung 115k2 lückenlos verarbeiten.

MfG
Falk

von Heiko (Gast)


Lesenswert?

Na ja,
ich hab ja eigentlich gar nix programmiert, hab den Code 1:1 übernommen. 
Aber es ist doch definitiv so, dass man zum leeren des UDR eine gewisse 
Zeit benötigt. Wenn in der Zeit schon ein neues Byte kommt, geht es 
verloren, oder seh ich das falsch. Der PC sendet alles hintereinander 
ohne Pause zwischen Stop und Startbit.
Aber irgendwie versteh ich das noch nicht ganz, weil die uC Taktrate ja 
wesentlich höer ist als die Baudrate. Der uC sollte das doch eigentlich 
verarbeiten können. Ich les jetzt noch mal im Datenblatt nach...

Grüße

von Falk B. (falk)


Lesenswert?

@ Heiko (Gast)

>Aber es ist doch definitiv so, dass man zum leeren des UDR eine gewisse
>Zeit benötigt. Wenn in der Zeit schon ein neues Byte kommt, geht es
>verloren, oder seh ich das falsch. Der PC sendet alles hintereinander

Ja, das siehst du falsch. Das Lesen von UDR dauert 1 Takt. Im Interrupt 
mit allem drum und dran vielleicht 20 Takte. Selbst bei 115k2 dauert die 
Übertragung von 1 Byte mindesten 160 Takte, eher mehr, je nach 
verwendeter Quarzfreqenz.

>ohne Pause zwischen Stop und Startbit.

Kein Thema. Das Problem ist dein mangelndes Verständniss soei 
Programierung.

>Aber irgendwie versteh ich das noch nicht ganz, weil die uC Taktrate ja
>wesentlich höer ist als die Baudrate. Der uC sollte das doch eigentlich

EBEN!

>verarbeiten können. Ich les jetzt noch mal im Datenblatt nach...

Gute Idee.

MFG
Falk

von Heiko (Gast)


Lesenswert?

Ich versteh leider nicht so ganz warum manche Leute in diesem Forum 
immer so einen agressiven Ton anschlagen. Wenn ihr eure Agressionen 
rauslassen wollt, geht in die Boxbude.

von Heiko (Gast)


Lesenswert?

@Falk

Du hattest Recht. Es funktioniert tatsächlich.
Aber der Fehler lag weder an der UART-Library noch an meinen 
unzureichenden
Programmierkenntnissen :-)
Habe jetzt den Controller getauscht und alles funktioniert tadellos.
Ich nehme an das der Takt beim alten Controller eine starke Abweichung
hatte. Werde jetzt mal versuchen den internen RC-Oszillator zu 
kalibrieren.

Grüße

von Falk B. (falk)


Lesenswert?

@ Heiko (Gast)

>Habe jetzt den Controller getauscht und alles funktioniert tadellos.
>Ich nehme an das der Takt beim alten Controller eine starke Abweichung
>hatte. Werde jetzt mal versuchen den internen RC-Oszillator zu
>kalibrieren.

NEIIIIIIN!

http://www.mikrocontroller.net/articles/AVR_Tutorial_UART#Senden

MfG
Falk

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.