-         

+ Antworten
Ergebnis 1 bis 6 von 6

Thema: Bedeutung bit() bitSet()

  1. #1

    Bedeutung bit() bitSet()

    Anzeige

    Hallo

    ich habe folgenden Code in C für Arduino nano ( ATMega328P) und wäre dankbar wenn mir diesen jemand erklären könnte.

    PRR = bit(PRTIM1); //?
    ADCSRA &= ~ bit(ADEN); // ?
    bitSet(PRR, PRADC); //hab ich so verstanden das im Register PRR das Bit PRADC auf 1 gesetzt wird.

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von i_make_it
    Registriert seit
    29.07.2008
    Ort
    Raum DA
    Alter
    48
    Beiträge
    2.092
    http://forum.arduino.cc/index.php?topic=253324.0

    PRR = bit(PRTIM1); // only keep timer 0 going
    ADCSRA &= ~ bit(ADEN); bitSet(PRR, PRADC); // Disable the ADC to save power


    http://www.gammon.com.au/forum/?id=11497

    Important note! You must use the PRR after setting ADCSRA to zero, otherwise the ADC is "frozen" in an active state.

    Power Reduction Register (PRR)

    • Bit 7 - PRTWI: Power Reduction TWI
    • Bit 6 - PRTIM2: Power Reduction Timer/Counter2
    • Bit 5 - PRTIM0: Power Reduction Timer/Counter0
    • Bit 4 - Res: Reserved bit
    • Bit 3 - PRTIM1: Power Reduction Timer/Counter1
    • Bit 2 - PRSPI: Power Reduction Serial Peripheral Interface
    • Bit 1 - PRUSART0: Power Reduction USART0
    • Bit 0 - PRADC: Power Reduction ADC


    ftp://bits.usc.edu/ee109/documents/ADC.pdf

    ADCSRA - ADC Control and Status Register A
    Bit 7 - The ADEN bit enables the ADC module. Must be set to 1 to do any ADC operations.


    Google, copy and paste.
    Hallo, kurz und schmerzlos, hoffe es hilft weiter.
    Geändert von i_make_it (12.10.2016 um 17:16 Uhr)

  3. #3
    Danke für die schnelle Antwort, aber bevor ich irgend ein Forum bemühe, Suche ich stundenlang bei Google. den Text kenne ich aber vielleicht bin ich auch nur zu blöd den Sinn zu erfassen !? Für mich erschließt sich der Befehl bit in diesem Zusammenhang nicht. Bit gibt den Bitwert der Variablen (x) zurück, hab ich zumindest so verstanden. Also was macht die Zeile PRR = bit(PRTIM1) genau? Mein English ist auch nicht so toll, dass ich ohne Übersetzer auskomme. Vielleicht liegt es auch daran. Für mich heißt die Zeile, PRR(obwohl Register) ist eine Variable die den Bitwert von PRTIM1 zugewiesen bekommt Bit3 im Register PRR also 8 !? Ich sehe schon das schmunzeln vor den Bildschirmen, aber wer nicht fragt bleibt dumm

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    41
    Beiträge
    1.134
    Hi,

    wie Du schon richtig erkannt hast, liefert bit(PRTIM1) den Wert 8 zurück.
    Darüber, dass Bit 3 im Register PRR dann 8 sein soll, musste ich in der Tat etwas schmunzeln...
    Ein Bit kann nämlich nur den Wert 0 oder 1 annehmen.

    Zur Erklärung stellt man am besten den Wert 8 als 8-stellige Binärzahl dar (8-Stellig, weil das Register 8 Bit groß ist):
    0b00001000

    Dabei steht die 0 ganz links für das Bit 7 (PRTWI) und die 0 ganz links für das Bit 0 (PRADC).
    Demnach wird also mit dem Befehl
    PRR = bit(PRTIM1) das Bit PRTIM1 im Register PRR auf 1 gesetzt und alle anderen Bits des Registers auf 0.

    Der Befehl
    ADCSRA &= ~ bit(ADEN)
    ist etwas komplizierter. Fangen wir zunächst wieder mit bit(ADEN) an: das gibt den Binärwert 0b10000000.
    Die Tilde (~) ist ein Operator, der das Einerkomplement der Binärzahl bildet. Anders gesagt: aus 0 wird 1 und aus 1 wird 0.
    Damit erhalten wir für ~bit(ADEN) 0b01111111.

    Nun zum Operator &=
    Hierbei handelt es sich um eine Kurzschreibweise. ADCSRA &= x; ist dasselbe wie ADCSRA = ADCSRA & x;
    Setzt man alles zusammen erhält man ADCSRA = ADCSRA & 0b01111111;
    Das Ergebnis der Operation ist, dass nur das Bit 7 (ADEN) auf 0 gesetzt wird und ansonsten jedes Bit des Registers so bleibt, wie es ist.

    bitSet(PRR, PRADC); hast Du ja schon richtig interpretiert.

    Gruß,
    askazo
    - Das Leben ist zu kurz, um in C zu programmieren -

  5. #5
    erstmal vielen Dank für die Erklärung, ich glaub jetzt hab auch ich es verstanden.
    mir war nicht klar das der Befehl bit() etwas setzt, dachte er liefert nur etwas zurück.Heist er fragt ab wo das bit steht und setzt es 1 und alle anderen 0.

    Also mit bit kann ich das ganze Register auf einmal neu setzen.
    Mit bitSet kann ich nur ein Bit (das angegebene)auf 1 setzen.

    Gruß

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    41
    Beiträge
    1.134
    Naja, Du hast es fast verstanden...

    Der Befehl bit() alleine setzt gar nichts - er ermittelt aus der Position eines Bits seine Wertigkeit. bit(0) liefert 1 zurück, bit(1) liefert 2, bit(2) liefert 4 usw...
    Das setzem erfolgt letztendlich nur durch die Zuweisung PRR =

    PRR = bit(3);
    macht also dasselbe wie
    PRR = 8;

    Aber ansonsten war's richtig.
    - Das Leben ist zu kurz, um in C zu programmieren -

+ Antworten

Ähnliche Themen

  1. Atmel µC xxx-AU/Cu/Aur/Cur - Bedeutung?
    Von Cysign im Forum AVR Hardwarethemen
    Antworten: 5
    Letzter Beitrag: 30.07.2016, 18:36
  2. Begriffe und deren Bedeutung
    Von crAy0nd0pe im Forum Robby RP6
    Antworten: 2
    Letzter Beitrag: 30.12.2007, 14:58
  3. BitSet Eclipse Plugin
    Von Surveyor im Forum Open Source Software Projekte
    Antworten: 22
    Letzter Beitrag: 23.10.2007, 23:41
  4. Bedeutung von Kondensatordaten??
    Von Löli im Forum Motoren
    Antworten: 6
    Letzter Beitrag: 13.03.2006, 14:25
  5. Bedeutung der verschiedenen AVR PIN´s?
    Von Frank im Forum AVR Hardwarethemen
    Antworten: 8
    Letzter Beitrag: 27.01.2004, 17:00

Stichworte

Berechtigungen

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