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



Teraz jest 28 lis 2024, o 07:44


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 
Autor Wiadomość
PostNapisane: 14 wrz 2012, o 22:47 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 14 wrz 2012
Posty: 24
Pomógł: 0

Witam, niedawno zacząłem przygodę i oczywiście napotykam ciągle jakieś problemy. Tym na którym utknąłem jest funkcja sprawdzająca naciśnięcie przycisku !(PINC & (1<<PC6)) użyta i opisana w przykładowym programie z książki. Niestety wyjaśnienie jej działania jest, jak dla mnie, mało czytelne. Konkretnie chodzi o to co oznacza zapis PINC bo pozostałe składniki oraz działania są oczywiście czytelne. Korci mnie aby przetestować jakąś własną funkcję służącą temu celowi , ale póki nie rozumiem jak działa to od strony procesora nie dam rady. Proszę oczywiście o wyrozumiałość bo być może część z Was uzna, że pytanie jest trywialne (bo jest) albo że skoro jest funkcja i działa to nie ma konieczności wnikać w szczegóły tylko jej używać i iść dalej.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 wrz 2012, o 23:13 
Offline
Użytkownik

Dołączył(a): 15 lut 2012
Posty: 344
Lokalizacja: Bydgoszcz
Pomógł: 11

Ogólnie to witaj na naszym forum :).

Odnośnie twojego pytania to chodzi o to że PINC oznacza pin do którego jest podłączony przycisk a to za znakiem & to numer tego pinu do którego przycisk podłączyłeś.

Pozdrawiam!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 wrz 2012, o 23:33 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 14 wrz 2012
Posty: 24
Pomógł: 0

Michał dziękuję za odpowiedź, ale chodzi mi o to,że kontroler odczyta informacje o wciśniętym przycisku w sytuacji kiedy całe to wyrażenie przyjmie pewną wartość (prawdopodobnie 1). Ponieważ w nawiasie mamy iloczyn logiczny, a przesunięcie bitowe które jest częścią tego iloczynu moim zdaniem ma wartość 1 całe zaś wyrażenie jest zanegowane(!), to wynika że PINC ma wartość zero. Jak jest naprawdę próbuję dociec.
Pozdr.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 wrz 2012, o 23:47 
Offline
Użytkownik

Dołączył(a): 15 lut 2012
Posty: 344
Lokalizacja: Bydgoszcz
Pomógł: 11

Ono nie jest zanegowane, chodzi o to że warunek sprawdza czy wartość warunku jest równa 0 czyli czy przycisk jest zwarty do masy.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 wrz 2012, o 00:14 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27314
Lokalizacja: Szczecin
Pomógł: 1041

Zgred napisał(a):
Konkretnie chodzi o to co oznacza zapis PINC.


Przyznaję, że niechcący zabrakło w książce opisu podstawowych rejestrów które związane z KAŻDYM portem, ale proszę bardzo tutaj kolega ma małe uzupełnienie do książki:

http://mirekk36.blogspot.com/2012/01/av ... stawy.html

a teraz, już kolega wie, że PINC to rejestr wejściowy prawda? czyli jeśli klawisz jest wciśnięty na PC6 to znaczy że bit nr.6 jest = 0 a zatem rozpatrzmy wyrażenie

( PINC & (1<<PC6) )

przyjmie ono wartość FALSE ponieważ

PINC 0bx0xx xxxx
AND 0b0100 0000
-------------------
wynik wyrażenia = 0b0000 0000

a zatem FALSE

jednak w warunku if mamy jeszcze negację w postaci wykrzyknika

if( ! (PINC & (1<<PC6)) ) ...

a zatem to FALSE zamieni nam się na TRUE (jeśli klawisz jest wciśnięty - prawda ? ..... w takim razie warunek spełniony ;)

---------------

rozważmy co będzie gdy klawisz nie jest wciśnięty czyli na linii PC6 utrzymuje się stan wysoki

PINC 0bx1xx xxxx
AND 0b0100 0000
-------------------
wynik wyrażenia = 0b0100 0000

tak więc ponieważ wynik jest większy od 0, to znaczy TRUE, ale znowu mamy negację !(wyrażenie) zatem, z TRUE zrobi się FALSE czyli warunek IF nie zostanie spełniony

czy teraz jaśniej ?

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 wrz 2012, o 20:50 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 14 wrz 2012
Posty: 24
Pomógł: 0

Witam, dzięki za odpowiedź oczywiście wiele mi wyjaśniła, ale nie byłbym sobą gdybym się do czegoś nie przyczepił. Wyjaśnię tylko, że moja dociekliwość wynika z chęci dogłębnego poznania tematu i jego pełnego zrozumienia. Do rzeczy: oczywiście PINC - reprezentuje rejestr wejściowy portu C - to jasne, ale skoro używamy go w wyrażeniu logicznym to musi mieć jakąś wartość (0 lub 1). Napisał Pan w przykładzie że naciśnięcie przycisku powoduje zerowanie odpowiedniego bitu takiego rejestru, w takim razie dlaczego w warunku nie wystarczy wstawić samego PINC (if (!PINC)- sprawdziłem nie działa) ? a konieczne jest wstawienie wyrażenia (pomijam znak negacji, bo w tym wypadku użycie przycisku albo zapala , albo gasi diodę). Podobnie nie działa wstawienie jako warunek samego przesunięcia bitowego i próba zerowania go za pomocą przycisku. Czyli jeśli nie użyję wyrażenia logicznego w postaci iloczynu (PINC & (1<<PC6)) nie uzyskam jakby fizycznego dostępu do rejestru wejściowego z poziomu przycisku . Co oznacza, tak mi się wydaje, że naciśnięcie przycisku zeruje albo neguje całe to wyrażenie. I teraz pytanie : czy istnieją alternatywne (wyrażenia) czy też to o którym tu mowa należy uznać za aksjomat?

Pozdrawiam

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 wrz 2012, o 21:28 
Offline
Użytkownik

Dołączył(a): 15 lut 2012
Posty: 344
Lokalizacja: Bydgoszcz
Pomógł: 11

Pozwól że ja dołożę kolejne trzy grosze... Samo napisane (if (!PINC) mówi tylko że chodzi ci o jakiś PINC a ty musisz napisać o który konkretniej ci chodzi(czyli do tego &PC6), bo kompilator ani sam uC nie ma fizycznej możliwości sprawdzenia o który PIN tobie chodzi.
Jeśli chodzi o ostatnie zdanie o alternatywę to jest specjalne makro bit_is_clear ale daruj sobie to rozwiązanie bo jest ono pamięciożerne i nieczytelne...

Pozdrawiam!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 wrz 2012, o 21:53 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27314
Lokalizacja: Szczecin
Pomógł: 1041

Nie żaden aksjomat - tylko jeszcze do końca nie zrozumiałeś - ale już tłumaczę ;)

PINC to jest REJESTR. A co to jest REJESTR ??? to jest jeden bajt czyli 8 bitów .... zgadza się ? czy tego nie kojarzyłeś ??? A zatem KAŻDY bit w tym rejestrze odpowiada kolejnym pinom portu, np,

PC0 ----> to jest najmłodyszy bit nr.0 po prawej stronie
PC1 ----> to jest bit nr.1
PC1 ----> to jest bit nr.2

i tak dalej

co zatem wg ciebie miałoby znaczyć wyrażenie

if( !PINC ) ....

pomyśl - chcesz sprawdzać pin PC6 czyli TYLKO bit nr 6 w tym rejestrze .... załóżmy że inne bity (są do nich podłączone nie wciśnięte klawisze) mają wartość = 1 a TYLKO bit nr.6 (PC6) jest wciśnięty - zwarty do masy i w tym bicie jest 0 a zatem cały rejestr ma wartość:

0b10111111

co wg ciebie da warunek

if( ! 0b10111111 )

ja ci od razu podpowiem że w tym momencie rejestr ma logiczną wartość TRUE ponieważ 0b10111111 jest większe od zera, ale negujemy to za pomocą wykrzyknika i dostajemy FALSE - a zatem warunek nie będzie spełniony jeśli klawisz jest wciśnięty. A chyba nie o to ci chodziło hmmmmm ???

dlatego nie możesz pisać ani nawet myśleć że:

Cytuj:
to jasne, ale skoro używamy go w wyrażeniu logicznym to musi mieć jakąś wartość (0 lub 1)


bo wyżej ci udowodniłem że REJESTR jako zbiór 8 bitów nie przyjmuje TYLKO wartości 0 lub 1 - rozumiesz teraz ???

dlatego MUSIMY sprawdzać co się dzieje na konkretnym bicie rejestru PINC, gdzie każdy bit jak pisałem wyżej odwzorowuje jeden pin od PC0 ... do .... PC7

teraz zobacz zakładamy, że znowu mamy wartość (w trakcie wciśniętego klawisza) gdzie PINC = 0b10111111, a zatem

wyrażenie

( PINC & (1<<PC6) )

da nam wartość:

0b10111111 PINC
0b01000000 PC6 AND
---------------------------
0b00000000

czyli = ZERO (FALSE)

a teraz w warunku mamy negację logiczną czyli wykrzyknik - więc negujemy i mamy TRUE ;) warunek spełniony gdy wciśnięty klawisz

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 wrz 2012, o 22:13 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 14 wrz 2012
Posty: 24
Pomógł: 0

A widzi Pan i to mi już wyjaśnia wszystko, ponieważ moja wersja programu działa na pinie zero, więc powinien zadziałać mi warunek if(PINC==0b11111110) ?.... i działa. Być może to nie jest elegancki sposób , ale musiałem to sprawdzić.

Dziękuje i pozdrawiam

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 wrz 2012, o 22:29 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27314
Lokalizacja: Szczecin
Pomógł: 1041

Zgred napisał(a):
A widzi Pan i to mi już wyjaśnia wszystko, ponieważ moja wersja programu działa na pinie zero, więc powinien zadziałać mi warunek if(PINC==0b11111110) ?.... i działa. Być może to nie jest elegancki sposób , ale musiałem to sprawdzić.

Dziękuje i pozdrawiam


Ale co ty mówisz ;) tu nawet nie chodzi czy to elegancki sposób czy nie ;) ... zastanów się - a co będzie gdy na innych pinach pojawią się zera - bo będą to piny podpięte do całkiem innych rzeczy niż klawisze ??? - to KLAPA - już w ten sposób nie sprawdzisz klawisza. Dlatego potrzebne jest MASKOWANIE

to się nazywa maskowanie

( PINC & (1>>PC0) )

maskujemy TYLKO jeden PIN, który chcemy sprawdzić w tym przypadku twój PC0

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 wrz 2012, o 22:58 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 14 wrz 2012
Posty: 24
Pomógł: 0

To w takim razie muszę przeanalizować powtórnie sprawę maskowania, a na razie "iloczyn logiczny" pozostawię w spokoju, póki działa:)))

Jeszcze raz dziękuje i pozdrawiam

_________________
sig off ;(



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

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