Skocz do zawartości

[C] Wyliczanie hexów


Armir

Pomocna odpowiedź

Witam

Zacząłem naukę c i mam problem odnośnie wyliczania wartości w hexie.

Fragment kodu:

sensor[1] = PINA & 0x01; //działa A.0
sensor[2] = PINA & 0x02; //reszta nie działa A.1
sensor[3] = PINA & 0x03; // A.2
sensor[4] = PINA & 0x04; // A.3
sensor[5] = PINA & 0x05; // A.4
sensor[6] = PINA & 0x06; // A.5
sensor[7] = PINA & 0x07; // A.6
sensor[8] = PINA & 0x08; // A.7 

Jak mam wyliczyć wartości w hexie. Umiem wyliczyć 0x01 ale do reszty czujników wyniki wychodzą złe. W kursie nie znalazłem informacji na ten temat. Każdy hex ma odpowiadać za jeden pin. Jak to wyliczacie i czym? To samo dotyczy DDR.

Link do komentarza
Share on other sites

0x02 na pewno nie działa. Liczyłem windowsoskim .

[ Dodano: 11-11-2010, 21:24 ]

Chyba powinno się wyliczyć z 01000000 dla 2, 00100000 dla 3. Z resztą nie wiem. Wiem ,że muszę czytać tylko 1 czujnik.

Link do komentarza
Share on other sites

Po pierwsze, numeruje się od 0. Port ma piny od 0 do 7 i tak samo bajt (np rejestru ma bity od 0 do 7).

Po drugie, żeby obliczyć potrzebną wartość podnosisz 2 do potęgi o numerze pinu. Przykład: chcemy zaświecić diodkę na pinie 3 portu A -> 2^3 = 8. Kod:

sensor[3] = PINA & 0x08;

Przy czym to będzie tak naprawdę 4 nóżka portu A w fizycznym układzie (wspomniana wcześniej numeracja od 0). Może się to początkowo wydawać zagmatwane, ale nie jest trudno się przyzwyczaić 🙂

Prościej jest moim zdaniem pisać tak:

sensor[3] = PINA & (1<<3);

Kompilator i tak przeliczy to na odpowiednią wartość więc spadku wydajności nie ma, a IMHO jest czytelniej. Działa to tak, że 1 przesuwamy bitowo o odpowiednią ilość pozycji w lewo i później liczymy sobie iloczyn.

Aha, ważna rzecz: bity są numerowane od prawej:

00000001 - bit zerowy

10000000 - bit nr 8

  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Hmm, albo zamiast zabawy z hexami można po prostu zastosować biny - prefiks &B jeśli się nie mylę. Prawdę mówiąc, nie wiem, czemu większość używa heksów w C - są ku temu jakieś powody? Imo bin są czytelniejsze i bardziej intuicyjne, np &B11001010 (od razu widać, że wartość 1 mają bity drugi, czwarty, siódmy i ósmy), = 0xCA (dla mnie nic nie widać 😋 ).

  • Lubię! 1
Link do komentarza
Share on other sites

O ile wiem w C nie ma możliwości używania liczb binarnych (w czystym C).

Można używać hexów, oczywiście dziesiętnych oraz ósemkowych.

Jak chodzi o hex-y to kwestia wprawy.

A mają niewątpliwą zaletę - spróbuj zapisać w kodzie binarnym np. maskę dla rejestru ARM-a, liczba jest 32-bitowa...

  • Lubię! 1
Link do komentarza
Share on other sites

Tu chodzi o maskę.

10100010 <- stany czujników

00100000 <- maska

ponieważ interesuje nas 5 czujnik bierzemy maskę 0x20 i operacją AND dostajemy logicznie 1

Link do komentarza
Share on other sites

Mihau 00100000 to jest 0x20, nie 0x18.

Armir, tym że masz 0 i 128 nie przejmowałbym się wcale, w operacjach logicznych 128 (i każda inna liczba różna od 0) i tak jest interpretowana jako 1. Czyli jeśli napiszesz np if(128), to warunek będzie spełniony.

Link do komentarza
Share on other sites

Z logicznymi operacjami nie ma problemu tylko jak chcę zaimplementować pid. Choć pisząc ten post wpadłem na pomysł jak to zrobić. Dzięki wszystkim za pomoc. Tego w kursie mi brakowało.

Link do komentarza
Share on other sites

Binarne zapisuje się 0b0000000, ale nie z każdym kompilatorem to działa. W AVR Studio nie ma problemu.

tak się zapisuje i jest najłatwiej, a raz działa a raz nie, bo zależy jakie standardy języka są włączone, o ile dobrze pamiętam ANSI C nie przewiduje takich zapisów, ale akurat te włączone standardowo w AVR Studio to uwzględniają. Pamiętam, że WinAVR trzeba przestawić.

Link do komentarza
Share on other sites

Nie macie jakiegoś pomysłu żeby zamieniało się to na 0 i 1? Próbowałem jakoś to obejść ale coś nie działa. Musi to być szybkie rozwiązanie bo musi pracować to w lf'ie.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.