Zmiana miejsca bitów

Zmiana miejsca bitów
IP
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 4 lata
  • 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:ponad 10 lat
  • Ostatnio:prawie 4 lata
  • 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.


ExtendedVector czyli std::vector<T> z wygodą List<T> z .NET (ForEach, FindAll, itd...)
edytowany 1x, ostatnio: Bartosz36
IP
A tylko, poniższe rozwiązanie już nie zagra w tym PB1,PB2...PB7 zapisać PB7...,PB2,PB1
IP
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 4 lata
  • Postów:17
0

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

Bartosz36
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 4 lata
  • 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ć ;)


ExtendedVector czyli std::vector<T> z wygodą List<T> z .NET (ForEach, FindAll, itd...)
DR
  • Rejestracja:prawie 16 lat
  • Ostatnio:około rok
0

Po co tak kombinować, skoro wystarczy jedna instrukcja:

Kopiuj
PORTB = ((PORTB << 4) & 0xF0) | ((PORTB >> 4) & 0x0F)
edytowany 1x, ostatnio: DRK
MarekR22
dla czytelności, bo dla kompilatora nie ma różnicy.
Azarien
te & 0xF0 są chyba niepotrzebne.
RC
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 3 lata
  • 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ł.

edytowany 1x, ostatnio: RootCause

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.