logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

proste pytanie z 5 pkt, funkcje sbi, cbi

donelbaron 22 Cze 2009 19:14 1689 5
  • #1 6689506
    donelbaron
    Poziom 15  
    witam, czy może mi ktoś ładnie wytłumaczyć to archaiczne pisanie?
    np. sbi(ADCSR,ADSC); albo cbi(ADCSR,ADSC);

    rozumiem że sbi to pierwsze można ustawić w sposób ADCSR |= 1<<ADSC
    tak? a nie da się prościej? tego zapisu też za bardzo nie rozumiem, da się jakoś szesnastkowo?
  • Pomocny post
    #2 6689772
    arrevalk
    Poziom 25  
    Poczytaj sobie o operatorach logicznych w C.
    
    ADCSR |= 1<<ADSC 

    jest równoważne
    ADCSR = ADCSR | (1<<ADSC)

    czyli do rejestru ADCSR przypisujemy jego wartość po wykonaniu operacji OR z drugim parametrem będącym n krotnym (ADSC) przesunięciem bitowym 1 w lewo. Rejestry będą wyglądały mniej więcej tak(jest to przykład a nie rzeczywiste wartości):
    
    ADCSR =   0b00100101
    ADCS = 6
    1<<ADCS = 0b01000000
    czyli razem
    ADCS |= 1<<ADCS  = 0b01100101

    A te dwa makra sbi oraz cbi to poprostu odpowiednio ustawianie bądź kasowanie odpowiedniego bitu w rejestrze.
  • #3 6690075
    Konto nie istnieje
    Poziom 1  
  • #6 6691917
    snow
    Poziom 31  
    Po podjerzeniu pliku WinAVR\avr\include\compat\deprecated.h możemy przeczytać:

    Cytat:
    /**
    \ingroup deprecated_items
    \def sbi(port, bit)
    \deprecated

    Set \c bit in IO port \c port.
    */
    #define sbi(port, bit) (port) |= (1 << (bit))

    /**
    \ingroup deprecated_items
    \def cbi(port, bit)
    \deprecated

    Clear \c bit in IO port \c port.
    */
    #define cbi(port, bit) (port) &= ~(1 << (bit))
REKLAMA