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
> 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.
Außerdem kannst du den Buffer in Peters Routinen in 2er Potenzen erhöhen.
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
@ 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
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
@ 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
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.
@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
@ 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.