Odpowiedz 
 
Ocena wątku:
  • 0 Głosów - 0 Średnio
  • 1
  • 2
  • 3
  • 4
  • 5
Sterowanie syntezą LM7001 z Arduino
SQ8MVY Offline
Paweł
****

Liczba postów: 724
Dołączył: 30-07-2011
Post: #10
RE: Sterowanie syntezą LM7001 z Arduino
(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
Kod:
a >> b
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.

73 Paweł
(Ten post był ostatnio modyfikowany: 25-02-2017 17:07 przez SQ8MVY.)
25-02-2017 16:41
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
Odpowiedz 


Wiadomości w tym wątku
RE: Sterowanie syntezą LM7001 z Arduino - SQ8MVY - 25-02-2017 16:41

Skocz do:


Użytkownicy przeglądający ten wątek: 7 gości