(25-02-2017 15:55)SP7EZG napisał(a): Warunkiem w if jest mnożenie logiczne. Czym jest wartość 0x0001? Jedynką reprezentującą ilość bitów?
Pętla sprawdza pozycję bitu, jeśli 1 wysyła, jeśli 0 czeka.
Nie. Przy takim zapisie w języku C
czyli przesuwanie bitowe liczby
a w prawo o
b miejsc, wynikiem jest dzielenie. Czyli:
a >> 0 = a
a >> 1 = a/2
a >> 2 = a/4
a >> 3 = a/16
Aby było lepiej dla oczu to przyjmijmy zapis bitowy:
a = 00001111 , co w systemie dziesiętnym jest 15, więc:
00001111 >> 0 = 00001111 // dziesiętnie 15
00001111 >> 1 = 00000111 // dziesiętnie 7
00001111 >> 2 = 00000011 // dziesiętnie 3
00001111 >> 3 = 00000001 // dziesiętnie 1
Natomiast operatorem
& w uproszczeniu maskujemy bity. Więc np. dla przykładu tak:
00001111 & 00000001 = 00000001
10101001 & 00001111 = 00001001
Wracając do przykładu pętli...
Mamy jakąś wartość, dla uproszczenia 8 bitową np.:
Kod:
uint8_t Fpom = 0x55; //zapis binarny dla jasności to 0b01010101
Początkowa wartość
idx wynosi
0 jak pętla robi pierwszy obieg.
W warunku
if jest w pierwszej kolejności obliczane jest wyrażenie
Kod:
( Fpom >> idx ) & 0x0001 )
Co po rozpisaniu da nam:
01010101 >> 0 = 01010101
Ten wynik teraz jest maskowany przez operator
& wartością 0x0001. Uzyskamy taki wynik:
01010101 & 0x0001 = 00000001
Warunek
if po obliczeniu wyrażenia decyduje następująco:
jeśli obliczone wyrażenie da nam wartość różną od 0 ( TRUE ) to wykonaj SET_PIN_DATA,
w przeciwnym wypadku ( wartość obliczonego wyrażenia będzie 0 - FALSE ) wykonaj CLEAR_PIN_DATA
W kolejnym obiegu pętli
idx przyjmie wartość 1, więc mamy tak:
01010101 >> 1 = 00101010
00101010 & 0x0001 = 00000000
idx = 2
01010101 >> 2 = 00010101
00010101 & 0x0001 = 00000001
itd., itd. aż do wysunięcia wszystkich bitów.
Zapamiętaj, że obliczane wyrażenie w warunku
if nie modyfikuje zawartości zmiennej. Obliczenia są wykonywane po cichu na kopii zmiennej.
(25-02-2017 15:55)SP7EZG napisał(a): Pętla sprawdza pozycję bitu, jeśli 1 wysyła, jeśli 0 czeka.
Przecież to jasne jak słońce!
Widzisz dalej nie jest to jasne dla Ciebie. Dlaczego jeśli jest 0 to ma czekać ? Gdzie czeka ? i co czeka ?
Jeśli wynikiem jest 1 to wystawia na linię
DATA wartość 1, jeżeli wynikiem jest 0, to na linię
DATA wystawiana jest wartość 0.
[/code]
(25-02-2017 15:55)SP7EZG napisał(a): Nie denerwuj się proszę....
Bez obawy, nie denerwuje się... Lubię swoją wiedzę przekazywać innym.