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



Teraz jest 30 lip 2026, o 11:26


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 
Autor Wiadomość
PostNapisane: 20 lip 2013, o 13:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 cze 2013
Posty: 60
Pomógł: 0

Witam.
Dziś postanowiłem pierwszy i ostatni raz zapytać się o sens warunku pętli while(), gdyż z programowaniem jak z matematyką - nie zrozumiemy granic, to nie zrozumiemy pochodnych, analogicznie - nie zrozumiałem dokładnie dlaczego warunek w pętli while jest negowany operatorem ! i wszystko wraca. :(
Przechodząc do meritum, chodzi o warunek w funkcjach komunikacyjnych I2C z układem RTC, mianowicie w "bluebook'u" na str. 279 postanowiłem przewertować po raz kolejny sens tych zapisów - wszystko jest zrozumiałe do momentu pojawienia się warunku:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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


Ja to widzę tak:
Rejestr TWCR w zapisie binarnym wyglądałby następująco:
TWCR = 0b10100100
1 - TWINT
1 - TWSTA
1 - TWEN

Następnie mamy operację AND, a więc:
TWCR&(1<<TWINT) = 0b10100100 & 10000000
Wynik (bez negacji): 10000000
Wynik (po zanegowaniu): !(10000000) = 01111111

Moje pytanie brzmi:
Funkcja while() jest wykonywana dopóki warunek jest spełniony, a w tym przypadku do momentu gdy nie otrzymamy 0, ale zanegowanie powoduje przecież, że zawsze warunek będzie spełniony ponieważ gdy flaga TWINT nie jest wyzerowana, to wynikiem operacji będzie 0b11111111 , jest to wyrażenie większe od zera.
PS. Wiem, że ja coś źle interpretuję, ale problem w tym, że nie wiem kiedy robię ten koszmarny błąd.

Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 lip 2013, o 14:02 
Offline
Użytkownik

Dołączył(a): 24 kwi 2013
Posty: 454
Pomógł: 30

!, to negacja logiczna (prawda/fałsz), a nie bitowa (~).


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 lip 2013, o 14:03 
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

1. W AVR'ach niektóre bity w rejestrach zeruje się poprzez wpisanie 1 i tak jest zerowany bit TWINT
2. Sprawdź jaka jest różnica pomiędzy ! a ~, bo ten pierwszy to negacja logiczna a ten drugi bitowa i ! 11110000 nie da w wyniku 00001111
3. Ta pętla while( !(TWCR & (1<<TWINT) ) ); to oczekiwanie na ustawienie bitu TWINT przez moduł TWI procesora. Iloczyn logiczny wartości rejestru i 1 przesuniętej o numer bitu da w wyniku 0, gdy ten bit jest 0 i liczbę różną od zera gdy ten bit jest 1. Negacja logiczna służy do dopasowania do aktualnej potrzeby w programie czy chcemy czekać na ustawienie bitu czy na jego wyzerowanie.


Autor postu otrzymał pochwałę

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 lip 2013, o 14:06 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 cze 2013
Posty: 60
Pomógł: 0

#ciamciak# napisał(a):
!, to negacja logiczna (prawda/fałsz), a nie bitowa (~).

Wynika z tego, że warunek jest spełniony gdy wyrażenie jest równe 0? Jeżeli tak, to warunek jest spełniony dopóki flaga TWINT jest nie wyzerowana (tzn. dopóki bit flaga TWINT w rejestrze TWCR jest równa 0)?

------------------------ [ Dodano po: 3 minutach ]

Krauser napisał(a):
2. Sprawdź jaka jest różnica pomiędzy ! a ~, bo ten pierwszy to negacja logiczna a ten drugi bitowa i ! 11110000 nie da w wyniku 00001111

GwynBleidD napisał(a):
O nie nie nie, panie kochany. Pomyliłeś sobie ~ (operator bitowy) z ! (operator logiczny). Wykrzyknik robi z prawdy nieprawdę i odwrotnie, więc dowolną wartość różną od 0 zamieni Ci na 0, a 0 zamieni na 1. Natomiast tylda zrobi dokładnie tak jak piszesz, czyli zamieni każdy z bitów na przeciwny.

Matko! Straszliwy błąd w zrozumieniu był przyczyną wielu problemów! Dzięki, już wszystko jasne. :D



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: 4 ] 

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