Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 4 kwi 2026, o 07:17


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
Autor Wiadomość
PostNapisane: 26 paź 2013, o 17:33 
Offline
Nowy

Dołączył(a): 24 paź 2013
Posty: 4
Lokalizacja: Rajbrot
Pomógł: 0

witam mógłby ktoś opisać kolejne operacje bitowe bo troche się w tym gubie i nie moge sobie dać z tym rady

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Kody wklejamy przy pomocy syntax=c - Różowy J.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 paź 2013, o 19:07 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Pod nazwą PC7 kryje się liczba 7, więc zostanie wykonane 1<<7, czyli 0b00000001 << 7 np.
0b00000001<<0 = 0b00000001
0b00000001<<1 = 0b00000010
0b00000001<<2 = 0b00000100 itd.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

PORTC ^= led_pin to to samo co PORTC = PORTC ^ led_pin oraz PORTC = PORTC ^ 0b10000000
^ to operator bitowy, który ma taką tablicę prawdy:
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0
Mówiąc krótko jak pierwszy z argumentów jest 1 to wynikiem jest przeciwna wartość drugiego argumentu i to jest robione powyżej tylko, że na wszystkich bitach np. 0b11110000 ^ 0b01010101 = 0b(1^0)(1^1)(1^0)(1^1)(0^0)(0^1)(0^0)(0^1) = 0b10100101, a skoro druga liczba to 0b10000000 to na przeciwny zamieniany jest najstarszy bit (pierwszy od lewej)
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Zacznijmy od tego co w nawiasie PINC & key_pin = PINC & 0b01000000 to iloczyn logiczny, który ma taką tablicę prawdy:
0 & 0 = 0 //0*0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
Jeżeli chociaż jeden z argumentów jest 0 to wynik jest 0. Wynik jest obliczany na wszystkich bitach np. 0b11110000 & 0b01010101 = 0b01010000 i służy to tutaj do sprawdzenia stanu 6 bitu PINC, bo działanie 0byXyyyyyy & 0b01000000 = 0b0X000000 i jak X = 1 to wynikiem jest 0b01000000, a jak X jest 0 to wynikiem jest 0b00000000. W języku C każda wartość większa od 0 to prawda, a 0 to fałsz zatem dla X = 1 wyrażenie w nawiasach jest prawdą, a dla X = 0 wynikiem wyrażenia w nawiasach jest fałsz.
! to negacja logiczna, czyli taka która traktuje liczbę jako całość (w porównaniu do operatorów bitowych, które działają na poszczególnych bitach) i zamienia prawdę na fałsz i na odwrót). Całkowity wynik jest jak widać zanegowany.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Tablica prawdy dla sumy bitowej:
0 | 0 = 0 //0+0=0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1
Działanie wykonywane jest na wszystkich bitach np. 0b11110000 & 0b01010101 = 0b11110101. Jak chociaż jeden z argumentów jest 1 to wynik jest 1. Wykorzystane jest to tutaj do ustawienia najstarszego bitu DDRC na 1, a pozostałe będą niezmienione. Nie musimy znać stanu tego bitu. Na pewno po tej operacji będzie 1.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Operator & był omówiony. Kolejny ~służy do negacji wszystkich bitów np. ~0b11110000 = 0b00001111. W wyniku negacji bitowej key_pin otrzymamy ~0b01000000 = 0b10111111. Tutaj z kolei wykorzystane jest to do wyzerowania 6 bitu DDRC (pozostałe zostaną niezmienione). Nie musimy znać jego stanu, po tej operacji na pewno będzie 0.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 paź 2013, o 21:32 
Offline
Nowy

Dołączył(a): 24 paź 2013
Posty: 4
Lokalizacja: Rajbrot
Pomógł: 0

mam jeszcze jedno pytanie wynikiem operacji #define key_down !(PINC & key_pin) jest 10111111 czy 00000000 ????



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 paź 2013, o 21:54 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 paź 2013
Posty: 57
Pomógł: 0

Obrazek

Jest to tak zwana Algebra Boole'a.
Poczytaj. masz jakąś atmege i diody przetestuj.
Więcej się nauczysz podczas tego niż myślisz.

_________________
Chomikujemy



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 paź 2013, o 23:52 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 paź 2013
Posty: 57
Pomógł: 0

GwynBleidD bit
0b1xxxxxxx
0b1xxxxxxx
będzie jedynka1
ale
0b0xxxxxxx
ob0xxxxxxx
będzie już 0
wpólny bit musi być wiekszy od 0

_________________
Chomikujemy



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 paź 2013, o 08:00 
Offline
Nowy

Dołączył(a): 24 paź 2013
Posty: 4
Lokalizacja: Rajbrot
Pomógł: 0

OK dzięki już rozumiem



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO