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 8 cze 2025, o 16:53


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
    Autor Wiadomość
    PostNapisane: 23 maja 2015, o 13:47 
    Offline
    Użytkownik

    Dołączył(a): 17 maja 2015
    Posty: 26
    Pomógł: 0

    Witam pomoże ktoś zmodyfikować bo się zapętliłem z tym.
    chodzi oto aby po podaniu sygnału wystąpiło jedno wysterowanie wyjścia o zadany czas mimo podawania sygnału na wejście cały czas dopiero po zaniku sygnału na wejściu i ponownym podaniu znów program wykonał się raz mino to że na przykład na wejściu nadal jest sygnał sterujący w poniższym wypadku trzymanie np. przycisku powoduje pętle która cały czas się wykonuje.
    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.

    Już poprawiam sorki ale żeby to ogarnąć trzeba troszkę czasu.



    Ostatnio edytowano 23 maja 2015, o 14:21 przez Fedorian, łącznie edytowano 2 razy

    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 maja 2015, o 14:00 
    Offline
    Moderator zasłużony dla forum.atnel.pl
    Avatar użytkownika

    Dołączył(a): 18 lip 2012
    Posty: 3229
    Lokalizacja: Kraków - obok FAB5 ATMEL'a
    Pomógł: 91

    topic7402.html


    Autor postu otrzymał pochwałę

    _________________
    http://www.jaglarz.info



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 maja 2015, o 15:43 
    Offline
    Użytkownik

    Dołączył(a): 25 lut 2015
    Posty: 252
    Lokalizacja: Lublin
    Pomógł: 23

    Ten kod działa tylko temu break po drugim warunku.
    Masz tutaj wszystko odwrócone.
    Przyciski masz podłaczone do VCC, kiedy standardem jest podłaczanie ich do GND i podciąganie programowe pinów przycików do VCC.
    Takie podciągnięcie daje nam to, że przycisk wciśnięty ustawia 0 na porcie i działa warunek KEY_DOWN przy wciśnięciu.
    U Ciebie logika jest odwrócona. KEY_DOWN spełnione są kiedy klawisz jest nie wciśnięty, czyli defacto sprawdzasz KEY_UP.
    Ale dzieki błędom w kodzie to działa:
    Warunek pierwszy - masz średnik po warunku, czyli nie rób nic, jak klawsz nie wciśnięty - przejdź do następnej komendy _delay...
    Warunek drugi - jak klawsz nie wciśnięty - przerwij, czyli też nie rób nic.
    Dla klawisza wciśnietego przełącz stan diody.

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

    Średnik po warunku daje ostrzeżenie, że oczekiwany jest nawias "wąsaty".
    Na takie ostrzeżenia trzeba zwracać uwagę, bo kod może nie działać tak jak oczekujemy, jak w tym przypadku 1 warunek nie robi nic,
    równie dobrze możesz go wyrzucić.

    Co do zasadniczego pytania, żeby nie działało ciągłe przełaczanie diody przy wciśnietym przycisku konieczna jest zmienna,
    która będzie informowała o zmianie stanu klawisza.

    ------------------------ [ Dodano po: 22 minutach ]

    Na początek zrób podciągniecie pinu przycisku do VCC: PORTB |= KEY_PIN;
    Przycisk podłącz do masy, nie do VCC.
    Wyrzuć średnik z pierwszego warunku.
    Wyrzuć "break;"
    Kod powinien ci działać zgodnie z warunkami.
    I dopiero wtedy możesz kombinować dalej...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 maja 2015, o 16:18 
    Offline
    Użytkownik

    Dołączył(a): 17 maja 2015
    Posty: 26
    Pomógł: 0

    Ok tak zrobię, natomiast przycisk tu był przykładem i ja na pin wejściowy podaje vcc a pin jest podciągnięty rezystorem do masy to akurat jest celowe.
    Tylko nie mogę wykombinować z tą zmienną która nie dopuszczała do ciągłej pętli tylko podaje vcc na wyjściu pojawia się sygnał vcc np. 200ms zanika mimo podawanego dalej sygnału na wejściu i dopiero po odłączeniu vcc z wejścia i ponowne podanie vcc na wejście powoduje wykonanie programu.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 maja 2015, o 16:36 
    Offline
    Użytkownik

    Dołączył(a): 25 lut 2015
    Posty: 252
    Lokalizacja: Lublin
    Pomógł: 23

    :) najpierw zrób porządek z kodem, wrzuć go do przeanalizowania po poprawkach.
    Jak chcesz koniecznie sterować przez podanie przełacznikiem VCC na pin uC, to najlepiej wyrzucić wykrzyknik z deklaracji KEY_DOWN
    i wtedy warunki będą działały na wciśniecie klawisza, jeśli zastosujesz się do wcześniejszych uwag poza podciąganiem pinu do VCC.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 maja 2015, o 16:49 
    Offline
    Użytkownik

    Dołączył(a): 17 maja 2015
    Posty: 26
    Pomógł: 0

    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.

    Tak to wygląda mam nadzieje że poprawiłem to co trzeba powiem że to moje początki więc proszę się nie denerwować jak coś pokręcę.
    Działa tylko że teraz podaje stan wysoki na wejście i mam stan wysoki na wyjściu po ponownym podaniu na wejście stanu wysokiego na wyjściu stan niski, przy podawaniu stanu wysokiego cały czas stan na wyjściu zmienia się o wartość LED_TOG i to działa. Jak teraz przerobić to tak aby po podaniu stanu wysokiego na wejście był stan wysoki na wyjściu o zadany czas i nie wykonywało się to w kółko, za każdym razem trzeba podać stan wysoki i trzeba go zdjąć i to ma być jedno przejście programu.
    Wydaje mi się że trzeba by zdefiniować jeden przebieg pętli while ale kurcze nie wychodzi mi to.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 maja 2015, o 17:29 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 31 mar 2015
    Posty: 310
    Pomógł: 18

    Jak byś dodawał komentarze do każdej linii, toby Ci ułatwiło naukę. Dla nas zaskakujące są niespodzianki - key do plusa, a może dioda do masy.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 maja 2015, o 17:40 
    Offline
    Użytkownik

    Dołączył(a): 25 lut 2015
    Posty: 252
    Lokalizacja: Lublin
    Pomógł: 23

    Proszę czytaj ze zrozumieniem podpowiedzi, które dostajesz.

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

    Jak pisałem, taką linię możesz równie dobrze wyrzucić, bo średnik po warunku mówi nie rób nic.
    Po co więc warunek którego sprawdzenie nic nie daje?
    Kod w nawiasach po nim jest zawsze wykonywany w tym przypadku, tak jakby nie było wcześniej tego if-a.
    Aby kod po warunku był wykonany musisz to zrobić bez średnika:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    To, że przełącza się dioda działa ze spełnienia pierwszego warunku.

    Masz jakąś książkę o C dla AVR?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 maja 2015, o 17:47 
    Offline
    Użytkownik

    Dołączył(a): 17 maja 2015
    Posty: 26
    Pomógł: 0

    TAK czytam sobie Tą niebieską Mirosława Kardasia
    No i troszkę słabo mi to idzie, troszkę więcej różnych przykładów by się przydało.
    Ale powolutku dojdę do tego.
    Tutaj nie chodzi o key.
    Ja podaje vcc z innego układu a nie widzę sensu ładować dodatkowy element w postaci tranzystora.
    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.

    No i właśnie tu zawaliłem ale już to poprawiam.
    Dodam że takie właśnie wytykanie błędów z komentarzem bardziej zapada w pamięć niż nawet literatura tak jak pisałem książka super ale przykładów w różnych permutacjach danego zagadnienia troszkę mało, szczególnie przy starcie bardzo pomaga.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 maja 2015, o 18:05 
    Offline
    Użytkownik

    Dołączył(a): 25 lut 2015
    Posty: 252
    Lokalizacja: Lublin
    Pomógł: 23

    Zajrzyj proszę na blog Mirka:
    http://mirekk36.blogspot.com/2012/10/ob ... w-cd2.html

    Tam na początku masz przykład obsługi klawisza z dodatkową zmienną na zmianę stanu.
    Tylko odwrócisz sobie logikę do swojego przypadku nie key-owego :)

    ------------------------ [ Dodano po: 10 minutach ]

    Info w uzupełnieniu, nie masz chyba co sprawdzać drgania styków, jeśli układ zewnetrzny daje jednoznaczne stany wysoki/niski.
    Czyli jeden if na sprawdzenie stanu wystarczy i pewnie brak delay.
    Ale to Ty wiesz, co dostajesz na wejściu.



    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 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:  
    cron
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO