Archiv verlassen und diese Seite im Standarddesign anzeigen : Bedeutung bit() bitSet()
robo2000
12.10.2016, 16:21
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.
i_make_it
12.10.2016, 17:03
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.
robo2000
13.10.2016, 07:54
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 :)
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
robo2000
13.10.2016, 11:55
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ß
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.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.