Zmiana miejsca bitów

0

Witam pisze z zapytaniem małym o poprawność mojego kodu. Mianowicie mam na studiach pierwszy raz język C i zmiana ułożenia bitów na portach atmegi16. I mam zrobić tak aby bity PB0-PB3 zamieniły się miejscami z PB4-PB7. Czy takie rozwiązanie jest choć trochę akceptowalne?

screenshot-20190120185148.png

Pozdrawiam

2

Lepiej byłoby stworzyć pomocniczą zmienną, w której umieściłbyś bity w zmienionej kolejności, a następnie przypisał oryginalnej zmiennej uzyskaną wartość.
Taka drabinka ifów, to jedno z gorszych i mniej czytelnych rozwiązań.

Jeżeli dobrze rozumiem, chcesz aby Twoje rozwiązanie przy wejściu: 1011 0100 dawało: 0100 1011. Jeśli tak, to aby zrobić to, o czym mówiłem wcześniej musisz użyć maski bitowej oraz przesunięcia.

0

Rozumiem, że to miałeś na myśli?
screenshot-20190120191304.png

4

Prawie. Niepotrzebnie jednak mieszasz w to kolejny PORTx. Dodatkowo fajnie byłoby zrobić to maską. Podam Ci przykład:

uint8_t SwapNibblesInByte( uint8_t byte )
{
    uint8_t tmpByte = byte & 0xF0;   /* The hardcoded 0xF0 is our mask that selects only the first nibble */
    tmpByte = tmpByte >> 4;          /* Now selected nibble is moved to the right */

    tmpByte |= byte << 4;            /* Getting next nibble moved to the left - no mask needed here. */

    return tmpByte;
}

Nie testowałem tego, także polecam sprawdzić ;)

0

Po co tak kombinować, skoro wystarczy jedna instrukcja:

PORTB = ((PORTB << 4) & 0xF0) | ((PORTB >> 4) & 0x0F)
1

Przy czym w praktyce takie rozwiązanie będzie zapewne nieakceptowalne ponieważ tymczasowe wartości zapisywane są do rejestrów które bezpośrednio wpływają na stan fizycznych wyprowadzeń mikrokontrolera.
Lepszym rozwiązaniem jest użycie tymczasowych zmiennych, oraz konieczne może okazać się sprawdzenie co tak naprawdę komiplator z kodu wygenerował.

1 użytkowników online, w tym zalogowanych: 0, gości: 1