Forum: Mikrocontroller und Digitale Elektronik Uart Port Binär ausgeben


von Flo (Gast)


Lesenswert?

Hallo Leute

ich würde gerne den Wert von PortB beim Atmega8 einlesen und in im Binär 
Format der UART ausgeben.

Zum Beispiel so:

PORTB ==> 0b00001111

Aber ich habe keine Idee wie ich den uint8 Wert in diese Form bringen 
kann.

Könntet ihr mir eventuell einen Anstoss geben wie ich dabei Vorgehen 
muss?

MfG

Flo

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> PORTB ==> 0b00001111
Das soll also am Terminal ankommen?

Dann nimm erst mal die Holzhammermethode:
1
 uart_send('P'); 
2
 uart_send('O'); 
3
 uart_send('R');
4
 uart_send('T'); 
5
 uart_send('B'); 
6
 uart_send(' ');
7
 uart_send('='); 
8
 uart_send('='); 
9
 uart_send('>'); 
10
 uart_send(' '); 
11
 uart_send('0'); 
12
 uart_send('b'); 
13
 uart_send((PINB&0x80)?'1':'0');
14
 uart_send((PINB&0x40)?'1':'0');
15
 uart_send((PINB&0x20)?'1':'0');
16
 uart_send((PINB&0x10)?'1':'0');
17
 uart_send((PINB&0x08)?'1':'0');
18
 uart_send((PINB&0x04)?'1':'0');
19
 uart_send((PINB&0x02)?'1':'0');
20
 uart_send((PINB&0x01)?'1':'0');
21
 uart_send('\n');

Später könntest du dir einen String mit einer Schleife aufbauen und den 
komplett verschicken.

Bleibt allerdings noch die Frage nach der Sinnhaltigkeit des Ganzen :-/
Will heißen: warum verschickst du nicht einfach "nur" den Wert und lässt 
ihn dir auf dem PC so anzeigen, wie du es willst?

von Flo (Gast)


Lesenswert?

Ich bin dabei mir ein kleines Board zu bauen mit dem Ich per Commandline 
die Ports ,den ADC ,TWI etc. steuern und rum experimentieren kann da ich 
sowas brauche um andere Schaltungen zu testen (z.B. ob die Richtigen 
Signale aus der zu testenden Schaltung kommen und sowas). Da da ganze 
Später mit einem Palm oder Psion Revo gesteuert wird wo nur ein Terminal 
Programm läuft soll erstmal der Controller alles machen. Die Commandline 
ist schon fertig nur halt die Ausgabe der Ports fehlt noch.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

1
uint8_t Wert;
2
int8_t i;
3
4
Wert = PORTB;
5
6
7
uart_puts("Port B = ");
8
9
10
for (i = 7; i < -1; i--)
11
{
12
  if (Wert & (1 << i))
13
    uart_putchar('1');
14
  else
15
    uart_putchar('0');
16
}
17
18
uart_puts("\r\n");

von Stefan E. (sternst)


Lesenswert?

Ich hoffe doch, du meintest eigentlich "i > -1", oder? ;-)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ja. Aber was wäre das Leben ohne Flüchtigkeitsfehler?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Und wie war das jetzt mit dem variablen Shift?
Der ließe sich doch so unsagbar schlecht in Maschinensprache umsetzen, 
heißt es... :-/

Warum nicht gleich die Maske schieben:
1
uint8_t Wert;
2
int8_t msk;
3
4
Wert = PORTB;
5
6
uart_puts("PORTB ==> 0b");
7
8
for (msk=0x80; msk; msk>>=1)
9
{
10
  if (Wert & i) uart_putchar('1');
11
  else          uart_putchar('0');
12
}
13
14
uart_puts("\r\n");

von Peter (Gast)


Lesenswert?

@Lothar Miller

geht leide nicht, i ist unbekannt und

int8_t msk

führt zu einer endlosschleife.
1
uint8_t Wert = PORTB;
2
3
uart_puts("PORTB ==> 0b");
4
5
for ( uint8_t msk=0x80; msk; msk>>=1, uart_putchar( (Wert & msk) ? 1 : 0 ));
6
7
uart_puts("\r\n");

von holger (Gast)


Lesenswert?

for ( uint8_t msk=0x80; msk; msk>>=1, uart_putchar( (Wert & msk) ? '1' : 
'0' ));

von Stefan E. (sternst)


Lesenswert?

holger schrieb:
> for ( uint8_t msk=0x80; msk; msk>>=1, uart_putchar( (Wert & msk) ? '1' :
> '0' ));

Das funktioniert nur, wenn du die Operanden des Komma-Operators 
umdrehst.

von vlad (Gast)


Lesenswert?

Kommaoperator ist Pfui!
Was sprict dagegen, den Befehl einfach in die schleife zubringen, 
anstatt in den Kopf?

von Peter (Gast)


Lesenswert?

nein das geht - habe es getestet.

for ( uint8_t msk=0x80; msk; msk>>=1)
{
   uart_putchar( (Wert & msk) ? '1' : '0' );
}

ist aber wirklich besser lesbar.

von Stefan E. (sternst)


Lesenswert?

Peter schrieb:
> nein das geht - habe es getestet.

Dann hast du falsch getestet, denn das funktioniert so definitiv nicht. 
Beim Komma-Operator wird von links nach rechts ausgewertet.

von Peter (Gast)


Lesenswert?

es muss doch gar nicht ausgewerter werden, das msk>>=1 und das print 
sind bloss anweissungen - der return ist doch dabei egal.

von Stefan E. (sternst)


Lesenswert?

Peter schrieb:
> es muss doch gar nicht ausgewerter werden, das msk>>=1 und das print
> sind bloss anweissungen - der return ist doch dabei egal.

Ach, und du meinst es spielt keine Rolle, in welcher Reihenfolge msk>>=1 
und die Ausgabe ausgeführt werden?

Dass die Operanden von links nach rechts ausgewertet werden, bedeutet in 
diesem Fall, dass erst geschoben und dann ausgegeben wird. Das hat eine 
um 1 verschobene (nach links) Ausgabe zur Folge und das LSB ist in der 
Ausgabe immer '0'.

von Peter (Gast)


Lesenswert?

ah jetzt habe ich erstanden, ok ich gebe zu ich habe nicht die 
korrektheit des ergebnisse überprüft.

Ich dachte die Abbruchbedingung in der schleife ist falsch.

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.