Forum: Mikrocontroller und Digitale Elektronik Aulastung AVR bei Datenübertragung?


von Mike K. (mike_kr)


Lesenswert?

Hallo,

ich wollte ein paar Daten vom AVR an den PC senden. Nun frage ich mich,
wie der Zusammenhang zwischen kbs und aufgewandte Rechenzeit vom AVR
ist.
Angenommen ein Mega32 läuft mit 4MHZ quarz. Schafft er es ca 50
Integerwerte 6mal in der Sekunde zu sende, ohne das seine anderen
Aufgaben (ADC, Display, Berechnungen) beeintächtigt werden?
Welche kbs-wert wäre da am sinnvollsten? Oder erstmal von 4MHZ gleich
auf 16MHZ hoch?
Vielen Dank.

von Der T. (Gast)


Lesenswert?

Welche Baud-Rate?

von Rahul (Gast)


Lesenswert?

Es kommt wohl eher auf das Programm (und die Baudrate) an.
Wenn du den Datenverkehr dadurch realisierst, dass du immer abfragst,
ob das Byte schon gesendet wurde, dann wartest du ziemlich viel.
Wenn du die Sache aber per Interrupt (und Ringpuffer) steuerst,
beeinflussen sich die einzelnen Aufgaben weniger.
Es kommt auf die Programm-Struktur nicht unbedingt auf die
Taktfreequenz an.

von The Daz (Gast)


Lesenswert?

Die Datenmenge ist und Baudrate ist da nicht das Problem. Eher die
Implementierung. Wenn die Daten in einen Ringpuffer gestellt werden und
per ISR die UART bedient wird merkt der uC herzlich wenig von der
Kommunikation. Jedes zu sendende Byte wird dann nur wenige cycles
benoetigen um es in den UART data buffer zu transportieren und die
Bufferverwaltung zu erledigen.

von peter dannegger (Gast)


Lesenswert?

Ich würde zu 38400 Baud raten, damit man noch etwas Luft hat.

Und da siehts bei 4MHz schon schlecht aus, Du brauchst ein 3,6864MHz
Quarz (oder 7,3728MHz, 11,0592MHz, ...).


Peter

von Roland P. (pram)


Lesenswert?

Das kommt drauf an (normal schafft er das locker):

Integer (AVR) 2 Byte  50  6 = 600 Byte/sek
das entstspricht (etwa) 6000 Baud/sek + Overhead für
Übertragungsprotokoll.

Da du mit 4 MHz vermutlich nur eine geringe Baudrate mit 9600 Baud
zusammen bringst (verwende besser einen "Baudratenquarz" mit 3,68
MHz) könnte dieser Punkt hier schon knapp werden.

Von der Rechenleistung sollte der AVR aber locker ausreichen (16 MHz
sind da schon der overkill). Die anderen Aufgaben werden aber schon
(geringfügig) beeinträchtigt. Irgendwo muss die Rechenleistung ja her
kommen. Hier mal ein Rechenbeispiel:

Wenn wir jetzt mal annehmen du hast einen Quarz von 3,68 MHz und 115200
Baud (sind ca. 12 Kb/s) und ein Integer + Overhead braucht 3 Byte dann
schaffst du ca. 4000 Integers / Sekunde. (Limit von der Schnittstelle)
für jeden Integer hast dann 920 Takte/Befehle zur verfügung, wobei
simples rüberschaufeln ca 100-200 Takte brauchen wird. Wenn du nicht
mit jedem Integer noch eine aufwändige Berechnung durchführst und das
interruptgesteuert programmierst, bleibt dir in der Mainloop selbst bei
dieser Geschw. noch genügend Rechenleistung (ca. 80%), das Display
aktualisieren.

Gruß
Roland

von David W. (Gast)


Lesenswert?

4.000.000  8  38400 - 1 = 12,02

Wenn er wirklich mit einem 4MHz Quarz läuft, dann würde diese Lösung
mit Double-Speed-Bit gehen. Es verschlechtert den Empfang vom UART,
aber er will ja nur senden.

von Mike K. (mike_kr)


Lesenswert?

puh...also ich werde jetzt auf 8MHZ und den vorgeschlagenen 38,4 gehen
und einfach mal testen. Vielen Dank für eure Anregungen

von Rahul (Gast)


Lesenswert?

Nimm lieber 7,37...MHz, die sind baudraten kompatibel.

von Mike K. (mike_kr)


Lesenswert?

habe ich aber nicht. und bei 38,4 und 8mhz soll es "nur" eine
abweichung von 0,16% gében

von The Daz (Gast)


Lesenswert?

@Roland

"wobei simples rüberschaufeln ca 100-200 Takte brauchen wird".

Erklaer bitte was du mit "Rueberschaufeln" meinst. Den Transfer
leistet die UART ohne Hilfe des cores. Der muss bei 115200 Baud nur
alle 87 usec ein paar wenige cycles (<< 30) spendieren um die UART mit
einem weiteren Datenbyte zu fuettern. Daraus ergibt sich ein Lastanteil
von 0,00082% bei 3,68MHz Taktfrequenz fuer die Bedienung der UART. Hab
ich da was falsch verstanden ?

von The Daz (Gast)


Lesenswert?

Aeh, Bloedsinn. Das waehre bei einem byte / sec. Lastet man die UART bei
115200 Baud voll aus kommt der Lastanteil auf 9,4%.

von Hannes L. (hannes)


Lesenswert?

Hmmm...

Ich "schaufle" da garnicht, ich überlasse das dem LCD-Treiber (mit
256 Bytes Ringbuffer), der schiebt das im sowiso aufgerufenen
Timer-Interrupt statt auf LCD einfach an UART. Das hat den Vorteil,
dass ich alle (für das LCD vorhandenen) Print-Routinen (Umwandlung von
Variablen oder Konstanten in ASCII-Text) für die Ausgabe nutzen kann.
Beispiel: http://www.hanneslux.de/avr/stopuhr/index.html

...

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.