Forum: Mikrocontroller und Digitale Elektronik 8 bit auslesen


von Darth V. (darth-vader)


Lesenswert?

Hallo zusammen,

Bei mir ist das Problem dass ich übe einen Uart 8bit zugeschickt 
bekomme,
sprich zum Beispiel: 0b01010111
Meine Frage dazu ist wie ich es schaffe bei Uart jede einzelne 0 oder 1 
auslesen kann -> keine lange if schleife(die Werte VARIIEREN!!)

SG DV

: Bearbeitet durch User
von Rüdiger B. (rbruns)


Lesenswert?

???

von Dirk B. (dirkb2)


Lesenswert?

Der UART macht die Arbeit für dich.

Sonst helfen Bitoperationen weiter.

http://www.if-schleife.de/

von Gerald K. (geku)


Lesenswert?

Darth V. schrieb:
> Hallo zusammen,
> Bei mir ist das Problem dass ich übe einen Uart 8bit zugeschickt
> bekomme,
> sprich zum Beispiel: 0b01010111
> Meine Frage dazu ist wie ich es schaffe bei Uart jede einzelne 0 oder 1
> auslesen kann -> keine lange if schleife(die Werte VARIIEREN!!)
> SG DV

Hängt vom MC ab, ob auf jedes Bit einzeln zugegriffen werden kann.

von Peter D. (peda)


Lesenswert?

Über die UART kommt typisch eine Folge von Bytes rein. Damit man weiß, 
welches Byte in der Folge welche Bedeutung hat, implementiert man ein 
Datenprotokoll.
Der Empfänger muß dieses Protokoll dann wieder dekodieren. Danach kann 
man die Bytes oder auch Bits entsprechend auswerten. Man kann sie z.B. 
binär anzeigen, wenn man Lust dazu hat.

von Patrick L. (Firma: S-C-I DATA GbR) (pali64)


Lesenswert?

Wie wäre es mit [Rotate]
(RRC.b in Assembler)?
Alternativ auch mit dem Bittest befehl?
(BIT.b      #nn,&ADCM in Assembler)

Was aber willst du den genau Einzelne Bits testen?
Oder Umrechnen?

Je nach dem wenn du die XV2 Cpu hast kann sogar ein Befehl grad mehrere 
Bit bearbeiten..... Je nach dem was du machen willst.
Beispiel:
 (RRAM.b  #4,Rn) um ein 4 Bit Nibble zu verschieben, eignet sich 
hervorragend zum Umwandeln vin Hex-> in Asci codes :-)
Ganz ohne Loops oder IF usw.

Link: https://en.m.wikipedia.org/wiki/TI_MSP430#MSP430X_20-bit_extension

: Bearbeitet durch User
von Darth V. (darth-vader)


Lesenswert?

> man die Bytes oder auch Bits entsprechend auswerten. Man kann sie z.B.
> binär anzeigen, wenn man Lust dazu hat.

Ja genau, nur ich würde gerne die Bites wo binär angezeigt werden so 
auslesen dass ich die 0er und 1er einzeln auslesen kann

von Darth V. (darth-vader)


Lesenswert?

Patrick L. schrieb:
> Wie wäre es mit [Rotate]
> (RRC.b in Assembler)?
> Alternativ auch mit dem Bittest befehl?
> (BIT.b      #nn,&ADCM in Assembler)
>
> Was aber willst du den genau Einzelne Bits testen?
> Oder Umrechnen?
>
> Je nach dem wenn du die XV2 Cpu hast kann sogar ein Befehl grad alle 8
> Bit bearbeiten..... Je nach dem was du machen willst.
> Beispiel:
>  (RRAM.b  #4,Rn) um ein 4 Bit Nibble zu verschieben, eignet sich
> hervorragend zum Umwandeln in Hex->Asci codes :-)
>
> Link: https://en.m.wikipedia.org/wiki/TI_MSP430#MSP430X_20-bit_extension

Cch brauche die einzelne bits um je nach Stellung Musik abzuspielen. :)
Und es wäre zu viel Arbeit von 8 bit jede Stellung zu erfassen und als 
if Abfrage abzufragen...

Ich hoffe Ihr versteht etwas darunter xD

von PittyJ (Gast)


Lesenswert?

Der Uart schickt dir (also Darth Vader, nicht einem Rechner) Bits?

Dann würde ich dem Uart sagen, er soll mal langsam machen. dann kannst 
du mit Papier und Bleistift die Nullen und Einsen aufschreiben.
Du solltest vielleicht bitten, dass dich dabei keiner stört! Denn sonst 
verpasst du noch ein Bit.

von Peter D. (peda)


Lesenswert?

Darth V. schrieb:
> Ja genau, nur ich würde gerne die Bites wo binär angezeigt werden so
> auslesen dass ich die 0er und 1er einzeln auslesen kann

Bau in die Ausgabe eine Tastenabfrage ein, dann kannst Du bei jedem 
Tastendruck genau ein Bit anzeigen lassen.
Nur mußt Du Dich bei 115200Baud aber ganz schön sputen mit dem Drücken.

von Gerald K. (geku)


Lesenswert?

1
boolean b[8];
2
unsigned char uart;
3
4
b[0] = ((uart & 0x01)!=0);
5
b[1] = ((uart & 0x02)!=0);
6
b[2] = ((uart & 0x04)!=0);
7
b[3] = ((uart & 0x08)!=0);
8
b[4] = ((uart & 0x10)!=0);
9
b[5] = ((uart & 0x20)!=0);
10
b[6] = ((uart & 0x40)!=0);
11
b[7] = ((uart & 0x80)!=0);

Keine IF Abfragen und Schleifen.

: Bearbeitet durch User
von Teo D. (teoderix)


Lesenswert?

Darth V. schrieb:
> Cch brauche die einzelne bits um je nach Stellung Musik abzuspielen. :)
> Und es wäre zu viel Arbeit von 8 bit jede Stellung zu erfassen und als
> if Abfrage abzufragen...

???-{

....

Sieht scheiße aus, wa?
Probiers mal mit Switch und denk dran, das jeder Zweig erst durch ein 
break beendet wird und nicht durch das nächste case.

von Patrick L. (Firma: S-C-I DATA GbR) (pali64)


Lesenswert?

Das musst du jetzt erklären?

Als Beispiel:
1
BIC.b      &U0RXBUF,&R12      ;Löscht dir alle Bits die "1" waren im R12
2
BIS.b      &U0RXBUF,&R12      ;Setzt dir alle Bits die "1" waren im R12
3
AND.b      &U0RXBUF,&R12      ;Löscht dir alle Bits die "0" waren im R12
usw meinst du das?

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


Lesenswert?

Darth V. schrieb:
> Ja genau, nur ich würde gerne die Bites wo binär angezeigt werden so
> auslesen dass ich die 0er und 1er einzeln auslesen kann
Zum Glück ist auch dir klar, dass dir da in vielfältiger Weise 
grundlegende Grundlagen fehlen.

Aber sag doch mal, warum du das so machen willst. Was ist das 
eigentliche Problem? Warum willst du da einzelne Bits "auslesen"?

Darth V. schrieb:
> keine lange if schleife(die Werte VARIIEREN!!)
Abgesehen davon, dass es keine if-schleife gibt: was ist so schlimm an 
sich ändernden Werten? Und warum dauert bei dir eine Schleife lange?

> Und es wäre zu viel Arbeit von 8 bit jede Stellung zu erfassen und als
> if Abfrage abzufragen...
Was machst du dir da Gedanken? Die Arbeit muss doch der Controller 
machen...

Darth V. schrieb:
> Und es wäre zu viel Arbeit von 8 bit jede Stellung zu erfassen
Das sind
1. schlimmstenfalls 256 unterschiedliche "Stellungen" und
2. musst du nach ein wenig Nachdenken keine Schleife programmieren, 
sondern kannst einfach mit dem empfangenen Wert über eine Tabelle 
irgendwas direkt auswählen.

: Bearbeitet durch Moderator
von Darth V. (darth-vader)


Lesenswert?

> Aber sag doch mal, warum du das so machen willst. Was ist das
> eigentliche Problem? Warum willst du da einzelne Bits "auslesen"?
>

Ich bekomme 128 verschiedene Zustände reingeschickt die per Expander 
über den I2c auf den uC(ATMega328P) geschickt werden. Dass wird per Uart 
auf den RPI geschickt. Jetzt will ich je nach Zustand der 128 Eingänge 
das einzeln auslesen( ich bekomme das in 8 bit sprich einem Byte 
gschickt).

von Patrick L. (Firma: S-C-I DATA GbR) (pali64)


Lesenswert?

OK die Handyträgheit hat die Folgeposts (noch nicht) gezeigt.
Aber dan wäre die Empfehlung von
Lothar M. schrieb:
> sondern kannst einfach mit dem empfangenen Wert über eine Tabelle
> irgendwas direkt auswählen.
Die Ideale Lösung.
Anhand der Tabelle kannst du dann entweder CALL's aufrufen oder Werte 
abhohlen usw.

von Prometheus (Gast)


Lesenswert?

Ähh, wenn du letztlich aus 128 Musiktiteln auswählen willst, so musst du 
auch alle 128 Möglichkeiten ins Programm reinschreiben.
Ob du das jetzt als if / else Reihe, switchcase  oder als Arrayzugriff 
machst ist völlig egal. Du brauchst ja auch die 128 "Ausgangswerte". 
Woher soll der Controller wissen das Nr. 9 eben gerade Beethoven ist?

Ich, als ziemlicher Anfänger, würde das mit einen switch machen. Das 
finde ich recht übersichtlich. Und, ähh, ja, das sind dann mehr als 260 
Zeilen Code.

Beitrag #7261270 wurde vom Autor gelöscht.
von Patrick L. (Firma: S-C-I DATA GbR) (pali64)


Lesenswert?

Darth V. schrieb:
> Meine Frage dazu ist wie ich es schaffe bei Uart jede einzelne 0 oder 1
> auslesen kann -> keine lange if schleife(die Werte VARIIEREN!!)

Verstehe ich nun als:
wie kann ich verschiedene Bitzustände uder Bitkombinationen
... und nicht einzelne Bits.... auslesen

und das geht definitiv über eine Tabelle am einfachsten.

von Martin S. (sirnails)


Angehängte Dateien:

Lesenswert?

Darth V. schrieb:
> keine lange if schleife

Der berühmt berüchtigte If loop...

von Flip B. (frickelfreak)


Lesenswert?

oder du lagerst die zuordnungsinformation extern, ein extra header mit 
zuordnungsarray nummer zu dateiname, und der code hohlt sich von dort 
die information anhand des empfangenen index. so wird der code lesbarer 
und hat kein 260 zeilen switch case.

von PittyJ (Gast)


Lesenswert?

Flip B. schrieb:
> oder du lagerst die zuordnungsinformation extern, ein extra header mit
> zuordnungsarray nummer zu dateiname, und der code hohlt sich von dort
> die information anhand des empfangenen index. so wird der code lesbarer
> und hat kein 260 zeilen switch case.

Wenn man es richtig gut machen will, dann packt man eine SQL-Datenbank 
dahinter. Dann werden die Titel und die Nummern in der Datenbank 
verwaltet, und man muß nicht bei jedem neuen Lied den Sourcecode ändern.

von Klaus S. (kseege)


Lesenswert?

Darth V. schrieb:
> Meine Frage dazu ist wie ich es schaffe bei Uart jede einzelne 0 oder 1
> auslesen kann -> keine lange if schleife(die Werte VARIIEREN!!)

Am Besten einen 8051 verwenden. Da kann man mit dem Assemblerbefehl JNB 
durch das Byte hüpfen ;-))

Just my 2 cents

Sorry, could not resist

von Anselm (Gast)


Lesenswert?

Welche Programmiersprache?
Wenn er 256 Musiktitel abspielen will, sind ihm die einzelnen Bit doch 
wurscht, der Zahlenwert reicht vollkommen. Wenn er jetzt eine 
Datentabelle besitzt, dann braucht er genau 1 Abfrage die dann den Wert 
aus dieser Tabelle holt.

Anselm

von Darth V. (darth-vader)


Lesenswert?

Anselm schrieb:
> Welche Programmiersprache?
Python

von M.A. S. (mse2)


Lesenswert?


von Martin (Gast)


Lesenswert?

Ich verstehe das so, du hast ein Soundboard mit 128 Tasten und per 
Tastendruck soll einer von 128 Sound abgespielt werden? Aber was bringen 
dir dann die einzelnen Bits?

Beitrag #7261495 wurde vom Autor gelöscht.
Beitrag #7261497 wurde vom Autor gelöscht.
Beitrag #7261504 wurde von einem Moderator gelöscht.
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.