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 15 lip 2025, o 15:13


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
    Autor Wiadomość
    PostNapisane: 16 gru 2014, o 23:40 
    Offline
    Nowy

    Dołączył(a): 09 paź 2014
    Posty: 16
    Pomógł: 0

    Witam forumowiczów!

    Mam problem z realizacją programu do obsługi dwóch rejestrów przesuwających - wyjściowym 74HC595 oraz wejściowym 74HC165.

    Poniżej przedstawiam schemat:
    Obrazek

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



    Chciałbym za pomocą ośmiu przycisków podłączonych do układu 74HC165 sterować zapalaniem/gaszeniem poszczególnych diod. Póki co otrzymałem następujący efekt: wszystkie diody są zapalone na starcie, przyciśnięcie (i ciągłe trzymanie) przycisku powoduje zgaszenie danej diody.

    Bardzo prosiłbym o poradę jak uzyskać odwrotny efekt - tj. na starcie wszystkie diody są zgaszone, a jedno naciśniecie przycisku (bez ciągłego trzymania) powoduje zmianę stanu na przeciwny oraz w jaki sposób można zapisać w tablicy stan wszystkich wyjść (diod), tak by w zależności od poszczególnych wartości (np. jeśli dioda nr 1 i 2 zapalona) program wykonywał dalszą instrukcję?

    Pozdrawiam,
    PG



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 17 gru 2014, o 00:44 
    Offline
    Nowy

    Dołączył(a): 12 paź 2013
    Posty: 20
    Pomógł: 4

    Zmiennej data nie musisz robić globalnie, wystarczy lokalnie w mainie + inicjalizacja zerem;
    Zdefiniuj 2 nowe zmienne w main'ie: temp = 0 i temp1 = 0xFF;
    w pętli:
    Kod:
    data = ~spi_transfer(temp);
    temp ^= data & temp1;
    temp1 = ~data;



    Ostatnio edytowano 17 gru 2014, o 01:05 przez deerjelen, łącznie edytowano 3 razy

    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 17 gru 2014, o 00:53 
    Offline
    Nowy

    Dołączył(a): 09 paź 2014
    Posty: 16
    Pomógł: 0

    Dzięki za odpowiedź, jednak to nie rozwiązuje problemu :(

    Zamiana na
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
    powoduje w dalszym ciągu zapalenie się wszystkich diod, brak jakiejkolwiek reakcji na przyciski oraz widoczne "migotanie".



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 17 gru 2014, o 01:02 
    Offline
    Nowy

    Dołączył(a): 12 paź 2013
    Posty: 20
    Pomógł: 4

    Edytowałem poprzedni post, ale napiszę jeszcze raz:
    Poprzedni mój błąd wynikał z faktu, że przyzwyczajony ostatnim czasem do PLC, myślałem o samym zboczu sygnału -|P|-

    Jeżeli nie będzie działać wgraj:
    spi_transfer(0xFF); i powiedz czy wszystkie świecą, czy nie, to napiszę ostateczną wersję kodu.

    Jeżeli:
    Kod:
    data ^= ~spi_transfer(data);

    powoduje migotanie, wszystkich diod, sugeruje to, że jeżeli nie jest wciśnięty żaden przycisk, zwracana jest wartość 0x00.
    (dziwi mnie tylko fakt, że wciśnięcie przycisku nie robi różnicy. Powinna dioda zastygnąć albo zaświecona, albo zgaszona.)
    Jeżeli to co napisałem 2 linie wyżej to prawda, to jeżeli wyślemy 0xFF, powinny wszystkie diody zgasnąć (według tego, że: data = spi_transfer(data); powoduje świecenie wszystkich diod)

    więc spróbuj teraz:

    Zdefiniuj 2 nowe zmienne w main'ie: temp = 0 i temp1 = 0xFF;
    w pętli:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Aby sprawdzić, która dioda świeci, stosujesz operacje bitowe, tak jak na normalnych wejściach, czyli:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Zapisywać w tablicy tego nie musisz :)



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

    Dołączył(a): 09 paź 2014
    Posty: 16
    Pomógł: 0

    Dzięki za odpowiedź ;)

    Po wgraniu poniższego kodu:

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


    Nadal palą się wszystkie diody i losowo przygasają; reagują na przycisk.

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


    świecą się wszystkie diody.



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

    Dołączył(a): 12 paź 2013
    Posty: 20
    Pomógł: 4

    Możesz wytłumaczyć jak w jaki sposób reagują na przycisk i jak losowo przygasają? Bo gdzieś źle zrozumiałem działanie układu jak mi opisywałeś, przez co nie możemy dojść do rozwiązania.
    Jeżeli 0xFF, tak jak na samym początku zakładałem powoduje świecenie diod, to z linijki data=spi_transfer(data); i faktu, że powoduje ona takie zachowanie jak opisałeś w 1 poście wnioskujemy, że jeżeli przycisk nie jest wciśnięty, to zwraca nam 1 (tak też na początku myślałem). W takim razie linijka data ^= ~spi_transfer(data) powinno działać tak, że jeżeli przycisk nie jest wciśnięty, to nic się nie dzieje, a jeżeli wciśniemy, to dioda zaczyna mrugać(w swoim 2 poście inaczej opisałeś zachowanie, co mnie zmyliło).
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    oraz podciągnięcie przycisków do +5V jakimś rezystorem (chociaż po twoim 1 poście wnioskować można, że wszystko działa tak jak należy od strony elektroniki).
    Przypuszczam, że to powinno rozwiązać sprawę.



    Ostatnio edytowano 17 gru 2014, o 16:47 przez deerjelen, łącznie edytowano 1 raz

    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 17 gru 2014, o 16:45 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 29 sty 2012
    Posty: 777
    Lokalizacja: Karpicko k. Wolsztyna
    Pomógł: 197

    A weź ten problem sobie rozłóż na czynniki pierwsze. Sprawdź najpierw czy dane są wysyłane do rejestru przesuwnego np. w ten sposób
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Jeśli to będzie działać to sprawdź czy dane są odbierane z drugiego rejestru i wyświetlić je np. na LCD
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    albo od razu wysłać do rejestrów jeśli będzie wiadomo że wysyłanie działa
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Druga sprawa. Przyciski zwierają ci wejścia rejestru do masy. A jaki jest stan na tych wejściach jeśli nie wciśniesz żadnego? Może trzeba by wejścia podciągnąć do Vcc poprzez np. rezystory o wartości 10k.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 17 gru 2014, o 16:53 
    Offline
    Nowy

    Dołączył(a): 12 paź 2013
    Posty: 20
    Pomógł: 4

    Też miałem na myśli ekran, tylko nie wiadomo, czy papachili takowy posiada ;d. Moja błędna interpretacja wynikała z faktu iż założyłem sobie, że od strony elektroniki wszystko jest poprawnie, a trzeba tylko kod napisać. Brak rezystora podciągającego na 99% powoduje takie zachowanie, jak papachili opisał. Zdałem sobie sprawę z braku rezystora dopiero po tym, jak papachili odpisał ostatnią wiadomość. Mój przedostatni post powinien rozwiązać sprawę.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 17 gru 2014, o 17:29 
    Offline
    Nowy

    Dołączył(a): 09 paź 2014
    Posty: 16
    Pomógł: 0

    Po raz kolejny dziękuję za odpowiedzi ;)

    A więc po kolei:

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


    działa poprawnie.

    Wyświetlacz LCD posiadam, ale aktualnie jestem poza domem, więc spróbuję wyświetlić wartość zmiennej data poprzez uart na terminalu.

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


    Na terminalu uzyskałem coś takiego:
    Obrazek

    A co do rezystorów podciągających do Vcc - czy są niezbędne? czy vcc powinno być przed przyciskiem a masa za, czy odwrotnie?

    Pozdrawiam

    ------------------------ [ Dodano po: 8 minutach ]

    deerjelen napisał(a):
    Możesz wytłumaczyć jak w jaki sposób reagują na przycisk i jak losowo przygasają? Bo gdzieś źle zrozumiałem działanie układu jak mi opisywałeś, przez co nie możemy dojść do rozwiązania.
    Jeżeli 0xFF, tak jak na samym początku zakładałem powoduje świecenie diod, to z linijki data=spi_transfer(data); i faktu, że powoduje ona takie zachowanie jak opisałeś w 1 poście wnioskujemy, że jeżeli przycisk nie jest wciśnięty, to zwraca nam 1 (tak też na początku myślałem). W takim razie linijka data ^= ~spi_transfer(data) powinno działać tak, że jeżeli przycisk nie jest wciśnięty, to nic się nie dzieje, a jeżeli wciśniemy, to dioda zaczyna mrugać(w swoim 2 poście inaczej opisałeś zachowanie, co mnie zmyliło).
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    oraz podciągnięcie przycisków do +5V jakimś rezystorem (chociaż po twoim 1 poście wnioskować można, że wszystko działa tak jak należy od strony elektroniki).
    Przypuszczam, że to powinno rozwiązać sprawę.


    Postaram się nagrać filmik z działania tego kodu, bo może faktycznie niejasno to opisałem.

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

    Nagranie przedstawiające uzyskany efekt (bez rezystorów podciągających): http://1drv.ms/1vZsN3O



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 17 gru 2014, o 20:25 
    Offline
    Użytkownik

    Dołączył(a): 11 wrz 2013
    Posty: 709
    Zbananowany użytkownik

    Pomógł: 23

    papachili napisał(a):

    A co do rezystorów podciągających do Vcc - czy są niezbędne? czy vcc powinno być przed przyciskiem a masa za, czy odwrotnie?



    A skąd układ "ma wiedzieć" czy ma na wejściu 1 czy 0 jeśli zawieszasz mu nóżkę w powietrzu?
    No chyba, że ma wewnętrzne rezystory podciągające, ale nie sądzę.
    Nie pisz w taki sposób czy przed czy za, bo to prowadzi bardzo często do nieporozumień.

    Daj rezystory 10K podłączone do VCC z jednej strony i bezpośrednio do pinów scalaka z drugiej.
    Do takiego układu dołączasz przycisk, a jego "drugi koniec" do masy

    Sorry za taką "twórczość", ale siedzę przy kompie gdzie nie mam zbyt wielu "narzędzi" aby Ci to schematycznie narysować.
    Mam nadzieję, że wiesz o co "biega" - na pinie scalaka na stałe wymuszany jest stan 1, a po wciśnięciu przycisku masz 0 i płynie malutki prąd przez rezystor 10KOm z VCC do masy.

    --
    Pozdrawiam.
    Grzegorz...



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

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 7 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