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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 10 lip 2025, o 15:49


    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: 27415
    Lokalizacja: Szczecin
    Pomógł: 1043

    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: 27415
    Lokalizacja: Szczecin
    Pomógł: 1043

    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: 27415
    Lokalizacja: Szczecin
    Pomógł: 1043

    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 6 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