Problem mit Empfang - UART Library Fleury

Gast #620772
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
Gast #620803
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
#620818
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
Gast #620839
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
#620867
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
Gast #621009
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren