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



Teraz jest 19 cze 2026, o 07:08


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
Autor Wiadomość
PostNapisane: 29 gru 2014, o 21:11 
Offline
Nowy

Dołączył(a): 14 lis 2014
Posty: 9
Pomógł: 0

Witam,
mam pytanie z dotyczące fragmentu przykładu z wyświetlaczem LCD:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Rozumiem, że zostaje sprawdzony stan panujący na pinie i jeśli jest różny od 0, to ustawiany jest bit w młodszej części zmiennej result na stan wysoki.
Nie jest dla mnie jasne co się dzieje w warunku if(PIN...Użyty jest tam operator &, który zawsze wyzeruje mi zawartość w nawiasie po if. Czy ktoś mógłby wyjaśnić lub rozpisać kiedy otrzymam w tym warunku "true" po którym result przyjmie stan wysoki?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 gru 2014, o 21:56 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 gru 2013
Posty: 185
Pomógł: 6

Po pierwsze operator & nie wyzeruje nam wszystkiego. Służy on nam do pozyskania wartości tylko jednego konkretnego bitu w rejestrze PINx, a to za sprawą (1<<LCD_D4) . Czyli warunek
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

da nam w rezultacie wartość tylko konkretnego bitu w rejestrze PINx czyli stan tego pinu, któremu odpowiada ten bit.
A wygląda to tak:
załóżmy że LCD_D4 jest zdefiniowane jako 4 ( np. PB4 )
Temu wyrażeniu
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
odpowiada zatem 0b 0000 0001 << 4 przesuwanie bitowe to nic innego jak mnożenie przez 2 czyli w rezultacie da nam to liczbę
0b 0001 0000 z kolei dalsza operacja czyli
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
powoduje wyzerowanie wszystkich bitów odczytanych z rejestru PINx oprócz właśnie tego 5 bitu dlatego że 1 & ( cokolwiek ) zawsze zwróci ( cokolwiek ) :D Nie wiem czy moje tłumaczenie jest zrozumiałe, ale mam nadzieję, że coś tam pomoże :D.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 gru 2014, o 21:58 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 sty 2013
Posty: 1760
Pomógł: 196

Witam
Jest to podobne do sprawdzenia naciśnięcia klawisza tyle że bez negacji. Po if'ie podajemy który PIN ma czytać ( PIN(LCD_DxPORT) ) i sprawdzamy czy czy jest tam jedynka ( 1<<LCD_Dx). Jest tam operator & więc po "matematycznemu" iloczyn (AND). Końcowy "result" można było by zapisać np.: result |= (1<<0)|(...). W tych miejscach ( na tych bitach ) gdzie wystąpiła 1 będzie jeden a gdzie jedynki nie było pozostanie zainicjowane 0 ( uint8_t result= 0; )

Pozdr.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 gru 2014, o 10:15 
Offline
Nowy

Dołączył(a): 14 lis 2014
Posty: 9
Pomógł: 0

Dzięki za szybką odpowiedź. Forum ma się więc dobrze :) .
Więc fragment:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

nie zawiera żadnej konfiguracji bitów, a jest tylko wskazaniem portu i pinu który mam być badany?
Natomiast ciąg dalszy:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

nie powoduje maskowania poprzedniej konfiguracji PIN(LCD_D4PORT), a jedynie aktywację bitu 4? Przy badaniu badanie stanu przycisku następowało maskowanie wcześniej ustalonego stanu PIN, a następnie negacja wyniku.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 gru 2014, o 11:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 maja 2013
Posty: 288
Ostrzeżenia: -2
Pomógł: 23

PINx - to jest rejstr wejsciowy pinow mikrokontrolera.
czyli zapis: PIN(x) gdzie x to numer portu.
Np. PIND czyli rejstr wejsciowy portu D.

Załóżmy że mamy nastepujace stany logiczne na tym porcie: 0b00000110.(gdzie najstarszy bit to pin7 a najmlodszy to pin 0)

Teraz zajmiemy sie naszym iloczynem &. (Tutaj musisz sobie poczytac podstawy o operacjach na bitach.) Ten znak to jest iloczyn.
Czyli: & (1<<LCD_4) to nic innego jak przesuniecie bitowe (tu rownież odslyam jw).

LCD_D4 to nic innego jak stala zdefiniowana wczesniej przez nas ,okreslajaca na ktorym pinie portu mamy linie D4 np 2 czyli odzwierciedlenie tego binarnie to: 0b00000010.

Czyli nasz zapis iloczynu &
0b00000110
0b00000010 &
_____________
0b00000010

Zwroci nam :0b00000010 czyli w ten sposob sprawdzilismy ze na naszym Pinie 2 portu D jest logiczna 1.
Czyli nasz warunek jest prawdziwy.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 gru 2014, o 12:28 
Offline
Nowy

Dołączył(a): 14 lis 2014
Posty: 9
Pomógł: 0

Dzięki Wszystkim! Sprawa jasna :D. Pozdrawiam



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 2 gości


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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO