Einfach Binär Ausgabe am UART

Gast #4740503
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
Gast #4740536
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.
Gast #4740918
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
Persönliche Seite #4740969
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?
Gast #4741237
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.

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