- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 8 von 8

Thema: Verständnisfrage: LDI TEMP, (1<<INT1)|(0<<INT0)

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.07.2008
    Ort
    Villingen-Schwenningen
    Beiträge
    143

    Verständnisfrage: LDI TEMP, (1<<INT1)|(0<<INT0)

    Anzeige

    Praxistest und DIY Projekte
    Hallo an alle Programmierer.

    Ich habe eine Verständnisfrage:

    In einem Assembler-Programm habe ich den folgenden Ausdruck gefunden:

    Code:
    LDI TEMP, (1<<INT1)|(0<<INT0)
    Was passiert hier genau?

    in der Variablen TEMP (was als Register definiert ist) wird das Bit INT1 (Bit7) gesetzt und BIT INT0 (Bit6) gelöscht?


    Und was passiert mit den übrigen Bits, die in Temp bereits gesetzt sind? Bleiben die erhalten oder werden die gelöscht?

    Und was bewirkt sowas:

    Code:
    LDI Temp,(1<<URSEL)|(3<<UCSZ0)
    Wird hier Bit URSEL (Bit7) und UCSZ1 + UCSZ0 (Bit2+Bit1) gesetzt?

    Es handelt sich hierbei um ein Assemblerschnipsel für einen ATmega8.

    Danke vorab für eure Info!

    Mitch.

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.03.2006
    Beiträge
    200
    Klingt jetzt vielleicht blöd, aber probiere es doch einfach im Simulator mal aus. Per Einzelschritt ist super zu sehen was passiert.

    Als Tipp, eigenes Programm in dem nur die besagten Zeilen eingebaut sind.
    Um herauszufinden, ob das Register komplett überschrieben wird, kannst du das Register auch mit einem anderen Wert vorladen.

    Bei dem senkrechten Strich handelt es sich um eine logisches ODER
    man könnte auch dem Wert direkt laden, ist aber nicht so tranparent.

    URSEL und UCSZ0 sind Bit die zu Funktionalität der UART benötigt werden, das heißt, dass du dort suchen musst.

    Wenn du mit dem Simulator nicht klar kommst, kannst du immer noch nachfragen

    Gruß, pacer

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.07.2008
    Ort
    Villingen-Schwenningen
    Beiträge
    143
    Ich habe keinen Simulator für Assembler. Deshalb frage ich ja.

    Ich will den Part in Bascom (Inline-Assembler) zum laufen bringen.

    Die Frage ist ob das:
    LDI TEMP, (1<<INT1)|(0<<INT0)

    das gleiche ist wie das:

    LDI TEMP,0b10000000

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225

    Re: Verständnisfrage: LDI TEMP, (1<<INT1)|(0<<IN

    Hallo,

    Zitat Zitat von Mitch64
    Code:
    LDI TEMP, (1<<INT1)|(0<<INT0)
    der zweite Teil ist Käse - es wird nur das Bit für INT1 gesetzt, die Null verändert nichts, weil das ganze ja über ODER verknüpft ist. Um das Bit für INT0 zu löschen müsste man
    Code:
    ANDI TEMP, ~(1<<INT0)
    machen, das würde alle Bits (sofern gesetzt) außer dem Bit von INT0 gesetzt lassen.

    Zitat Zitat von Mitch64
    Und was passiert mit den übrigen Bits, die in Temp bereits gesetzt sind? Bleiben die erhalten oder werden die gelöscht?
    Die werden gelöscht.

    Zitat Zitat von Mitch64
    Code:
    LDI Temp,(1<<URSEL)|(3<<UCSZ0)
    Wird hier Bit URSEL (Bit7) und UCSZ1 + UCSZ0 (Bit2+Bit1) gesetzt
    Ja, außerdem wird der Rest gelöscht/nicht gesetzt - im übrigen halte ich dieses Manöver mit (3<<UCSZ0) für gefährlich, da baut man schnell nen Fehler oder übersieht, dass anstelle einer Eins die Drei da steht.

    mfG
    Markus

    Edit: Kurzantwort auf die aktuelle Frage: Ja

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.07.2008
    Ort
    Villingen-Schwenningen
    Beiträge
    143
    hab ich mir fast gedacht, dass der Rest bei (1<<xxx) gelöscht wird.
    Das mit der Tilde war mir aber neu. Man lernt nie aus.

    Danke für die Info!

  6. #6
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Das mir dem 1 << Bitname ist ein aus C entliehene Schreibweise für 1*2^Bitname. Die Schreibweise mit (0 << xxx) ist Geschmackssache:
    Es tut nichts, denn 0*2^xxx = 0, ist also nur eine umständliche Schreibweise für die 0.
    Wnn man es so gewohnt ist, ist es eine elegante Wise sich in Einnerung zu rufen welche Bits noch zu dem Register gehören und nicht gesetzt werden, und man kann es schnell so ändern das die Bits gestzt werden.
    Wenn man die Form nicht kennt, oder nutzt, kann man da leicht übersehen das da eine 0 statt der 1 steht, weil man es nicht anders kennt.

  7. #7
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Geschmackssache:
    Kann man eigentlich garnicht sagen, denn es bleibt dir bei C nix anderes übrig.
    2^bit wäre eine exponentialfunktion, ich glaub "pow(...)".
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  8. #8
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Die Geschmakssche bezoht sich auf die umständliche Null als (0<<xxx). Da kann man natürlich gleich 0 schreibe oder es ganz weglassen.

    An (1<<xxx) hat man sich in C schnell gewöhnt, das ist Standard.

Berechtigungen

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

Solar Speicher und Akkus Tests