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

Wystawinie zmiennej bitowej na nóżkę portu?

maciej_kaz 04 Kwi 2010 12:16 1319 7
REKLAMA
  • #1 7918943
    maciej_kaz
    Poziom 12  
    Witam.

    Możliwe, że pytanie nie trzyma poziomu ale mimo usilnych starań nie daje rady, a mianowicie - czy jest możliwe w winavr bezpośrednie przepisanie zmiennej bitowej na nóżkę portu w celu sprawdzenie zawartości zmiennej np na PORTD pin 7??
    Wiem, że można to zrobić korzystając, za pomocą sprawdzenia stanu zmiennej w instrukcji warunkowej i późniejsze ustawienie bitu, ale możliwe, że jest prostszy sposób.

    Pozdrawiam.
  • REKLAMA
  • #2 7919056
    tadzik85
    Poziom 38  
    Nigdzie się z taką metodą nie spotkałem.
  • REKLAMA
  • #3 7919121
    nenpa8lo
    Poziom 17  
    W C zawsze wpisujesz zawartość do portu (8,16,32-bit), to o czym mówisz można zrobić w asemblerze AVR komendą 'set'
  • REKLAMA
  • #4 7919878
    nojmi
    Poziom 20  
    maciej_kaz napisał:
    czy jest możliwe w winavr bezpośrednie przepisanie zmiennej bitowej na nóżkę portu w celu sprawdzenie zawartości zmiennej np na PORTD pin 7??

    
    #define SetBit( var_name, position )      ( var_name |= (1<<position) )

    i dalej dla Twojego przykładu:
    SetBit(PORTD, 7);


    Do tego masz jeszcze do dyspozycji:
    #define ClrBit( var_name, position )      ( var_name &= ((1<<position)^255) )
    #define ValBit( var_name, position )      ( var_name & (1<<position) )
  • #5 7920538
    rpal
    Poziom 27  
    Ja nei do końca kumam o czym kolega pisze do portu i z portu to kolega raczej "sypie" całe 8-bitowe dane a nie poszczególne bity no może z wyjątkiem assemblera cbi i sbi. Może lepiej się zainteresować strukturą w C bo tam można definiować pola bitowe i nieco na około przypisywać i pobierać dane z portów ?
  • REKLAMA
  • #6 7920806
    mirekk36
    Poziom 42  
    rpal napisał:
    Ja nei do końca kumam o czym kolega pisze do portu i z portu to kolega raczej "sypie" całe 8-bitowe dane a nie poszczególne bity no może z wyjątkiem assemblera cbi i sbi.


    Jakiego zaraz asemblera, a co w C nie można ustawiać pojedynczych bitów w kodzie????

    PORTA |= (1<<PB3);


    czy

    PORTC &= ~(1<<PB3);


    co za problem ???
  • Pomocny post
    #7 7920957
    BoskiDialer
    Poziom 34  
    Rozwiązanie z postu powyżej jest najlepszym według mnie:
    if(v)
      PORTB |= (1<<PB3);
    else
      PORTB &=~(1<<PB3);

    Żeby jednak traktować pojedynczy bit portu jako osobną zmienną można wykorzystać fakt, że rejestry io posiadają swój adres w przestrzeni danych, przez co można uzyskać adres i rzutować wskaźnik na jakąś bardziej zdatną strukturę:
    struct bits {
    	uint8_t b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1;
    };
    #define bPORTB (*((volatile struct bits*)&PORTB))
    
    int main(void)
    {
    [...]
    	bPORTB.b0 = 1;
    	bPORTB.b1 = 0;
    	bPORTB.b2 = v;
    	v = bPORTB.b4;
    [...]
    }

    Pojedyncze bity będą zachowywać się jak zmienne a więc mogą występować jako l-value oraz r-value, jednak nie można uzyskać ich adresu jak i należy pamiętać, że kod w niektórych przypadkach będzie kompilowany do pobrania całego rejestru, zmodyfikowania jednego bitu i zapisania rejestru - ze wszystkimi konsekwencjami (ma znaczenie głównie przy rejestrach flag przerwań, gdzie wpisanie aktualnej wartości powoduje skasowanie wszystkich flag z tego rejestru, co jednak tutaj nie ma zastosowania).
  • #8 7923561
    maciej_kaz
    Poziom 12  
    Dzięki wielkie BoskiDialer, właśnie o takie coś mi chodziło.

    Pozdrawiam.

    Temat zamykam.
REKLAMA