-         

Ergebnis 1 bis 5 von 5

Thema: Operatoren frage

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    05.10.2005
    Beiträge
    5

    Operatoren frage

    Anzeige

    Die Bit und Schiebe Operatoren sind mir nicht ganz klar.
    Aus einem TWI Programm:
    TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);

    Zuerst sind die Bitweise oder Operatoren, welche ein 1er bit weitergeben, wenn einer der dreien an der stelle 1 hat.
    Was machen jedoch die << schiebe Operatoren?
    Scheinbar (zb) TWINT in 1 hineinschieben? Würde mich über eine Erklärung freuen.

    Die 2te Operation:
    while(!(TWCR & (1<<TWINT)));
    Das Bitweise & würde doch jedes einzelne bit verunden.
    Also wenn ein bit an der selben Position bei beiden 1 ist, wäre die innere Sache bereits true mit dem ! vorne würde die schleife dann doch sofort verlassen werden?
    Das kann doch so nicht stimmen, oder?

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
    Das geht in Schichten

    das bedeutet erstens:
    TWCR = (daseine) | (wasanderes) | (nochwas);
    TWCR = (daseine) OR (wasanderes) OR (nochwas);
    d.h. in TWCR sammeln sich alle Einser der drei Werte
    zweitens:
    (daseine) ---> (1<<TWINT)
    (TWINT ist in irgendeiner .h-file definiert als eine Zahl 0-7)
    das bedeutet: nimm einen EINSER ( 1 ) und schiebe ihn nach links ( << ), und zwar "TWINT"-mal
    Also
    (1 << 0 ) = 1 = B"00000001"
    (1 << 1 ) = 2 = B"00000010"
    (1 << 2 ) = 4 = B"00000100"
    (1 << 3 ) = 8 = B"00001000"
    ......
    (1 << 7 ) = 128 = B"10000000"

    Und nun zu etwas völlig anderem:

    while(!(TWCR & (1<<TWINT)));

    auch das mußt du aufdröseln

    ganz innen steht (1<<TWINT) ---> siehe oben

    Dann:
    TWCR & (1<<TWINT)
    das in Klammer ist also EIN Bit von 8
    & = AND
    das ganze ergibt also einen Wert <> 0 , wenn in beiden an derselben Stelle ein Einser ist, sonst 0
    ! (TWCR & (1<<TWINT));
    ! = NOT
    das ganze ergibt also einen Werte <> 0 , wenn vorher ein Nuller rausgekommen ist ( Also einfach das Gegenteil)

    While ( nnn) = Solange nnnn nicht Null ist, mach die Befehle bis zum nächsten Strichpunkt.

    Da steht aber nix

    Also rotiert er.

    Auf deutsch, komplett

    while(!(TWCR & (1<<TWINT)));

    warte, solange das bit (1<<TWINT) in TWCR auf 0 steht

    Seltsame Sprache , gelle ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    05.10.2005
    Beiträge
    5
    Zitat Zitat von PicNick
    TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
    [...]
    (1 << 0 ) = 1 = B"00000001"
    (1 << 1 ) = 2 = B"00000010"
    (1 << 2 ) = 4 = B"00000100"
    (1 << 3 ) = 8 = B"00001000"
    ......
    (1 << 7 ) = 128 = B"10000000"
    Also wenn:
    TWINT=7
    TWSTA=5
    TWEN=2
    so würde die (1<<TWINT) | (1<<TWSTA) | (1<<TWEN) Operation ja B"10100100" ergeben.
    Somit wäre die Zuweisung ansich gleichbedeutend zu
    TWCR = 0xA4;
    ?

    Wird das schieben immer auf einen Leeren Datenwert ausgeführt?
    Also kann ich zb in 00001000 nochmals einen 1er hineinschieben, wenn ja wie? Und bewegt sich der Vorhandene dann mit?

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    Hallo,
    Der Picknick hat Dir das schöner erklärt, als jedes Buch oder Tutorial, toll...

    so würde die (1<<TWINT) | (1<<TWSTA) | (1<<TWEN) Operation ja B"10100100" ergeben.
    Somit wäre die Zuweisung ansich gleichbedeutend zu
    TWCR = 0xA4;
    ?
    Das ist richtig, wobei ich sagen muß daß TWCR = 0xA4; zwar kürzer ist, aber nicht unbedingt verständlicher, oder?
    Versuch mal nach einem halbem Jahr zu verstehen, was Du da gemacht hast...
    mit (1<<TWINT)..... sieht jeder sofort, welche Bits gesetzt worden sind...

    Also kann ich zb in 00001000 nochmals einen 1er hineinschieben, wenn ja wie? Und bewegt sich der Vorhandene dann mit?
    klar geht das z.B
    TWCR |=(1<<TWEA);
    verodert den alten Zustand von TWCR mit (1<<TWEA)

    Gruß Sebastian

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    05.10.2005
    Beiträge
    5
    Ok, danke euch zweien für die Antworten.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •