Vergelijking van een bit versus het instellen van een bit

Eenvoudige vraag, ik wil gewoon zeker weten dat ik het goed begrijp. Ik begrijp dat dit niet noodzakelijkerwijs Arduino-specifiek is.

Met betrekking tot de ATmega2560 doe ik 3 back-to-back A/D-conversies - één onmiddellijk na de vorige afwerkingen. Ik bereik dit door elke keer een enkele conversie aan te roepen.

Ik kwam deze bruikbare code tegen om te wachten tot de conversie is voltooid:

while(ADCSRA & (1<

Ik begrijp dat het wacht op de conversie om te voltooien en dat wanneer dit wordt gedaan de ADSC op 0 wordt gezet. (Daarentegen zou ik kunnen wachten tot ADIF op 1 wordt gezet.) Ik ben niet zo duidelijk over hoe precies dit regel wordt geïnterpreteerd.

Normally when I see something along the lines of (1< it means write a 1 to the ADSC bit.

Maar in dit geval is dat niet het geval.

Waarom niet gewoon schrijven:

while(ADSC);
3

1 antwoord

U begrijpt de betekenis van:

1 << ADSC

Dat betekent eigenlijk Bit-shift 1 achtergelaten door het aantal bits gespecificeerd door de waarde ADSC .

ADSC in this case is 6:

#define ADSC    6

Dus als je dat deed:

while(ADSC);

je zou eigenlijk aan het doen zijn:

while(6);

Wat natuurlijk nooit zal eindigen, omdat 6 niet 0 is, zo is waar.

In plaats daarvan verschuift u 1 links 6 keer, wat in binair zou zijn:

00000001
    << 6
01000000

Dat is natuurlijk 64 of 0x40 in hexadecimaal. Dat is dan ANDed met de waarde van het ADCSRA-register om de waarde van één enkel bit binnen dat register te retourneren. Het is dan het resultaat van dat EN waarmee je de while beheert. Dus het eindigt als:

while(ADCSRA & 0x40);

Wat gelijk is aan:

while(0x40);

als het 7 th -bit is ingesteld, of als het niet is ingesteld:

while(0x00);

En aangezien 0x00 0 is, is dit gelijk aan false wanneer het bit niet is ingesteld en de while voltooid is.

4
toegevoegd
Ik had moeten aangeven omdat ik denk dat het een verschil zal maken, mijn verontschuldigingen, ADSC is een vlag in het ADCSRA-register.
toegevoegd de auteur Ambrose, de bron
Ik leer elke dag iets nieuws. Bedankt!
toegevoegd de auteur Ambrose, de bron
Het is ook een #define voor een nummer. In dit geval is dit het nummer van het ADSC-bit in het register. Je gebruikt het om het register te manipuleren - je kunt het bit niet (gemakkelijk) zelf manipuleren.
toegevoegd de auteur Majenko, de bron
Er is veel steun voor dit in de AVR-bibliotheek. Zie nongnu.org/avr-libc/user-manual/group__avr__sfr. html . Dit helpt ook om de AVR MCU-registers en bitveldsymbolen en -gebruik uit te leggen. loop_until_bit_clear (ADCSRA, ADSC);
toegevoegd de auteur Mikael Patel, de bron