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



Teraz jest 11 sty 2025, o 14:58


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