www.mikrocontroller.net

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


Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Dann nimm erst mal die Holzhammermethode:
 uart_send('P'); 
 uart_send('O'); 
 uart_send('R');
 uart_send('T'); 
 uart_send('B'); 
 uart_send(' ');
 uart_send('='); 
 uart_send('='); 
 uart_send('>'); 
 uart_send(' '); 
 uart_send('0'); 
 uart_send('b'); 
 uart_send((PINB&0x80)?'1':'0');
 uart_send((PINB&0x40)?'1':'0');
 uart_send((PINB&0x20)?'1':'0');
 uart_send((PINB&0x10)?'1':'0');
 uart_send((PINB&0x08)?'1':'0');
 uart_send((PINB&0x04)?'1':'0');
 uart_send((PINB&0x02)?'1':'0');
 uart_send((PINB&0x01)?'1':'0');
 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?

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uint8_t Wert;
int8_t i;

Wert = PORTB;


uart_puts("Port B = ");


for (i = 7; i < -1; i--)
{
  if (Wert & (1 << i))
    uart_putchar('1');
  else
    uart_putchar('0');
}

uart_puts("\r\n");

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja. Aber was wäre das Leben ohne Flüchtigkeitsfehler?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
uint8_t Wert;
int8_t msk;

Wert = PORTB;

uart_puts("PORTB ==> 0b");

for (msk=0x80; msk; msk>>=1)
{
  if (Wert & i) uart_putchar('1');
  else          uart_putchar('0');
}

uart_puts("\r\n");

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Lothar Miller

geht leide nicht, i ist unbekannt und

int8_t msk

führt zu einer endlosschleife.
uint8_t Wert = PORTB;

uart_puts("PORTB ==> 0b");

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

uart_puts("\r\n");

Autor: holger (Gast)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: vlad (Gast)
Datum:

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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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'.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.