Forum: Mikrocontroller und Digitale Elektronik Einfach Binär Ausgabe am UART


von Bernd (Gast)


Lesenswert?

Hallo,

ich wollte gerne ein 8-Bit wert Binär ausgeben, habe folgenden
Code erstellt, ist der so gut oder gibt es da was besseres?
1
USART_Transmit(' ');
2
USART_Transmit(49-!(line & (1<<7)));
3
USART_Transmit(49-!(line & (1<<6)));
4
USART_Transmit(49-!(line & (1<<5)));
5
USART_Transmit(49-!(line & (1<<4)));
6
USART_Transmit(49-!(line & (1<<3)));
7
USART_Transmit(49-!(line & (1<<2)));
8
USART_Transmit(49-!(line & (1<<1)));
9
USART_Transmit(49-!(line & (1<<0)));
10
USART_Transmit(10);
11
USART_Transmit(13);

line ändert sich durch die Ports.

Gruß

Bernd

von Coder de Luxe (Gast)


Lesenswert?

Der Code ist super so. Ich würde nichts ändern.

Zumindest solange ich nicht mehr über das Problem weiss, weil das 
komplett vergebene Zeit wäre.

von Jakob (Gast)


Lesenswert?

Wenn damit von der USART das gesendet wird, was du möchtest,
ist das (wie mein Vorgänger schon schrieb) voll OK.

Wenn nicht, musst du das mit "line" und "Port" und ...
mal genauer erklären.

von Rene Z. (rzimmermann)


Lesenswert?

Vieleicht als Schleife?
1
For (uint8_t zz=0x80;zz;zz>>1){
2
if (line & zz) uart_transmit ('1');
3
else uart_transmit('0');
4
}

von Bernd (Gast)


Lesenswert?

ok, was Rechnet in dem Mikrocontroller schnell?

die Schleife oder 8 mal (49-!(line & (1<<7)))

von Jobst M. (jobstens-de)


Lesenswert?

Am schnellsten ist Dein Code, wenn Du jegliche Sprünge und Schleifen 
vermeidest.
Ob das sinnvoll ist, steht auf einem anderen Blatt.
Die UART wird dadurch nicht schneller.
Muss es schneller werden?

Erklär doch mal Dein Problem. Und zwar wirklich das Problem. 
Vollständig!


Gruß

Jobst

von Wolfgang (Gast)


Lesenswert?

Bernd schrieb:
> ok, was Rechnet in dem Mikrocontroller schnell?

Das ist ziemlich egal. Die Ausgabe kostet die Zeit.

Bernd schrieb:
> ist der so gut oder gibt es da was besseres?

Viele Empfänger könnten mit deinem eigenwilligen Zeilenabschluss 
Probleme haben. Zumindest in der Windows-Welt ist meist <CR><LF> üblich 
und nicht umgekehrt. Aber es kann natürlich sein, dass dein Empfänger 
sein eigenes Süppchen kocht.

von Thomas E. (picalic)


Lesenswert?

Bernd schrieb:
> USART_Transmit(49-!(line & (1<<7)));

Irgenwie widerstrebt mir, daß hier das Ergebnis einer logischen 
Operation als Zahl weiterverarbeitet wird.
Wie wäre es statt dessen mit dem Fragezeichen:

USART_Transmit(line & (1<<7)?'1':'0');

von Bernd (Gast)


Lesenswert?

hi, mag sein, doch der Code mit
1
USART_Transmit(line & (1<<7)?'1':'0');
2
USART_Transmit(line & (1<<6)?'1':'0');
3
USART_Transmit(line & (1<<5)?'1':'0');
4
USART_Transmit(line & (1<<4)?'1':'0');
5
USART_Transmit(line & (1<<3)?'1':'0');
6
USART_Transmit(line & (1<<2)?'1':'0');
7
USART_Transmit(line & (1<<1)?'1':'0');
8
USART_Transmit(line & (1<<0)?'1':'0');

ist Langsamer als
1
USART_Transmit(49-!(line & (1<<7)));
2
USART_Transmit(49-!(line & (1<<6)));
3
USART_Transmit(49-!(line & (1<<5)));
4
USART_Transmit(49-!(line & (1<<4)));
5
USART_Transmit(49-!(line & (1<<3)));
6
USART_Transmit(49-!(line & (1<<2)));
7
USART_Transmit(49-!(line & (1<<1)));
8
USART_Transmit(49-!(line & (1<<0)));

das ist wesentlich schnell in der Ausführung auf dem µC

Gruß

Bernd

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Bernd schrieb:
> hi, mag sein, doch der Code mit
>
> USART_Transmit(line & (1<<7)?'1':'0');
> (...)
>
> ist Langsamer als
>
> USART_Transmit(49-!(line & (1<<7)));
> (...)
>
> das ist wesentlich schnell in der Ausführung auf dem µC

Wie kommst Du zu dieser Erkenntnis?

Das mit Abstand langsamste überhaupt ist der Aufruf von 
USART_Transmit(). Das braucht nämlich so lange wie das Senden eines 
Zeichens über die serielle Schnittstelle. Bei 9600 Baud also etwa 1 
Millisekunde. Das dürfte gut das tausendfache von dem sein, was der Rest 
braucht.


Daß hingegen der Ausdruck
1
line & (1<<7)?'1':'0'

langsamer sein soll als das hier
1
49-!(line & (1<<7))

das bezweifle ich. Was soll da langsamer sein?

Und vor allem, was soll da in Relation zur Ausführungsdauer von 
USART_Transmit "langsamer" sein?

von Bernd (Gast)


Angehängte Dateien:

Lesenswert?

ja, das die Anzeige Langsam ist, ist klar. Aber wenn ist zwei µC einer 
mit den Zeile mit ? und der Andere mit - Zeile an einer 
Spannungsversorgung
start. Kann der mit - mehr Zeile in das Terminal bringen, und beim 
tausch der Programmierung ist der zweite dann schneller.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Bernd schrieb:
> Kann der mit - mehr Zeile in das Terminal bringen, und beim tausch der
> Programmierung ist der zweite dann schneller.

Das hast Du jetzt auf welche Art und Weise ermittelt?

von Bernd (Gast)


Lesenswert?

in dem ich die beiden µC an jeweils einem COM Port habe und in zwei 
Terminals die anzeige mache. Über die Pipes die Zeilen zähle.
Die Controller werden mit einem FET beide eingeschaltet.
1
+\
2
  |
3
  FET---<--- PowerON Signal
4
  |
5
  *--[CPU1]--[RS232]--PCcom1
6
  |    |
7
  |   ---
8
  |
9
  *--[CPU2]--[RS232]--PCcom2
10
       |
11
      ---
getauscht habe ich alles schon C2 an Com1 und C1 an Com2, auch die 
Stromversorgung von C1 und C2 gegenseitig. Und da die µC gesockelt sind
auch diese gegenseitig getauscht.
Es ist immer der Mega mit dem Code 49-!(line & (1<<7)) schneller.
Und es ist ja alles andere Identisch.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Und was heißt "schneller"?

Beide arbeiten mit 9600 Baud, also 960 Zeichen pro Sekunde.

Wieviele Zeichen sendet der eine, wieviele Zeichen sendet der andere?

Hast Du Dir mal den Assemblercode angesehen, den die beiden Ausdrücke

> line & (1<<7)?'1':'0'
>
> 49-!(line & (1<<7))

erzeugen?

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.