Zmiana miejsca bitów

Zmiana miejsca bitów
IP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 17
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

Bartosz36
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 348
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.

IP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 17
0

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

Bartosz36
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 348
4

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

Kopiuj
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ć ;)

DR
  • Rejestracja: dni
  • Ostatnio: dni
0

Po co tak kombinować, skoro wystarczy jedna instrukcja:

Kopiuj
PORTB = ((PORTB << 4) & 0xF0) | ((PORTB >> 4) & 0x0F)
RC
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6
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ł.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.