Skocz do zawartości

[C] Wyliczanie hexów


Armir

Pomocna odpowiedź

Żeby nie zakładać nowego tematu. Jak skonfigurować pwm w tryb żeby było do 255 (8 bitowy ?) ? Procek to Atmega8535. Do tej pory miałem:

ICR1  = 255;
OCR1A = 0;
OCR1B = 0;
TCCR1A = (1<<COM1A1)|(1<<COM1B1); //pwm
TCCR1B = (1<<WGM13)|(1<<CS11);

Przy takim ustawieniu OCR1B pracuje dziwnie.

Link do komentarza
Share on other sites

Jeszcze wracając do pinów i zapisu bitowego. Można też stosować makra, które są zamieniane przez preprocesor, więc jeszcze przed kompilacją i uproszczają składnię i pisanie bez zwiększania złożoności programu.

Poniższe trzy linijki są tożsame - sprawdzenie bitu o indeksie 3 (czyli czwartego):

bit3 = PINA & 0x8; //od 0 do 9 nie ma znaczenia, czy piszemy dziesiętnie czy szesnastkowo
bit3 = PINA & 1<<3;
bit3 = PINA & _BV(3);

Każda z tych linijek wygeneruje dokładnie taki sam kod, a wg mnie ostatnia linijka jest najczytelniejsza - widać, że chodzi nam o bit nr 3.

Sprawa druga - zwracana wartość.

Pisząc PINA & _BV(3) wykonujemy operację bitową AND na całym porcie - a jak wiemy, AND zwraca "1" tylko, jeśli oba operandy są równe "1". Zatem cokolwiek by nie było na innych bitach, po "& _BV(3)" zostają nam same zera na pozycjach: 7654210 oraz oryginalny bit na pozycji 3. Ponieważ 2^3 = 8, to w wyniku możemy otrzymać tylko dwie wartości - 0 (dla bitu=0) lub 8 (dla bitu=1).

Teraz zależnie do czego nam ta wartość mamy dwie opcje.

Jeśli chcemy przetestować czy było tam "0" czy "1", to jak już wspomniano, w C 0==false, cokolwiek innego==true.

Zatem

if (PINA & _BV(3)) {//bit ustawiony} else {//bit wyzerowany}

pięknie zadziała.

Jeśli natomiast mamy silną potrzebę w wyniku posiadania wartości "0" lub "1", to są dwa sposoby:

Podany wyżej:

wynik = PINA & _BV(3) ? 1 : 0;

lub ciut szybszy a na pewno mniej bajtów zajmujący:

wynik = (PINA & _BV(3)) >> 3;

czyli bit na pozycji 3 przesuwamy o 3 w prawo, czyli wyląduje na pozycji 0 dając w wyniku "0" lub "1".

Mam nadzieję, że to dogłębne wyjaśnienie się przyda 🙂

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.