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 w 2025? 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 18 kwi 2025, o 19:58


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 
    Autor Wiadomość
    PostNapisane: 21 lut 2019, o 12:22 
    Offline
    Nowy
    Avatar użytkownika

    Dołączył(a): 28 kwi 2015
    Posty: 20
    Lokalizacja: Bydgoszcz
    Pomógł: 0

    Witam
    Wykonałem prosty włącznik oświetlenia wykorzystując czujnik zbliżeniowy i ATtiny13.
    Napisałem do niego kod:
    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.

    Program działa, ale nie wiem czy do końca tak jakbym chciał. Wydaje mi sie, że za szybko się przełącza. Wystarczy zwiększyć argument _delay_ms(), czy INT0 przerywa działanie _delay_ms(100) i nic to nie zmieni. Jeśli przerywa to jak opóźnić przełączanie?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 21 lut 2019, o 13:49 
    Offline
    Użytkownik

    Dołączył(a): 05 gru 2017
    Posty: 430
    Lokalizacja: Puck
    Pomógł: 7

    Witaj karlowic

    Nie jestem orłem w te klocki ale na mój rozum
    to wywołujesz przerwanie zewnętrzne w obsłudze przerwania
    ustawiasz flagę na 1

    dalej sprawdzasz czy flaga ma 1 jeśli tak to najpierw przełączasz przekażnik
    potem czekasz 100 ms a następnie zerujesz flagę

    w tym układzie nigdy nie będziesz miał zwłoki bo PIERW WŁĄCZASZ PRZEKAŻNIK A POTEM CZEKASZ

    sprubuj zamienić miejscami _delay_ms(100); z PORTB ^= OUT;

    wtedy będziesz miał oczekiwanie 100 ms a po nim dopiero włączenie przekażnika
    i będziesz mógł regulować delayem czas po jakim ma się załączyć przekażnik



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 22 lut 2019, o 10:33 
    Offline
    Nowy
    Avatar użytkownika

    Dołączył(a): 28 kwi 2015
    Posty: 20
    Lokalizacja: Bydgoszcz
    Pomógł: 0

    miki53 napisał(a):
    w tym układzie nigdy nie będziesz miał zwłoki bo PIERW WŁĄCZASZ PRZEKAŻNIK A POTEM CZEKASZ

    Nie chodzi mi o zwłokę w działaniu włącznika ale co dzieje się po tym działaniu.

    zubik napisał(a):
    blokujesz sobie program na te 100ms

    Właśnie o to mi chodzi w tym programie.
    Światło zapala się po machnięciu ręką. Jeśli palce przylegają do siebie, jest jeden długi impuls i wszystko jest w porządku.Jeśli palce nie przylegają do siebie następuje seria 4 impulsów i włącznik głupieje. Myślałem, że funkcja _delay_ms() zatrzyma działanie procesora na chwilę(czas wystąpienia niepotrzebnych impulsów). Teraz nie wiem, czy 100ms to za mało, czy INT0 przerywa i tak funkcję _delay_ms() czyli wydłużenie czasu nic nie da.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 22 lut 2019, o 13:45 
    Offline
    Użytkownik

    Dołączył(a): 27 cze 2018
    Posty: 116
    Pomógł: 6

    Wyłącz zezwolenie na globalne przerwania po if , włącz je przy wyjściu z If.

    _________________
    sig off ;(



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 22 lut 2019, o 18:13 
    Offline
    Użytkownik

    Dołączył(a): 05 gru 2017
    Posty: 430
    Lokalizacja: Puck
    Pomógł: 7

    Czujnik Ci wariuje gdy rozszerzysz palce ręki bo każdy palec czujnik odbiera jako przeszkodę
    a przestrzeń między palcami jako wolną przestrzeń , w ten sposób szybko ( 4 krotnie )
    wysterowujesz czujnik który włącza i włącza Ci przekażnik i żarówa mruga zamiast się
    włączyć lub wyłączyć

    Zamknięta dłoń jest odbierana przez czujnik jako 1 przeszkoda a palce jako 4 przeszkody

    w tym tempie wywołujesz przerwanie
    teraz trzeba zrobić tak aby to szybkie przełączanie wywołane palcami nie miało wpływu
    na przekażnik

    może w ten sposób ( piszę bez sprawdzania kodu - sprawdz sam )

    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.


    Autor postu otrzymał pochwałę


    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 lut 2019, o 21:11 
    Offline
    Użytkownik

    Dołączył(a): 05 sty 2015
    Posty: 393
    Lokalizacja: Mielec
    Pomógł: 14

    Poco zamrażać wejście, ustawiasz flage na 1 i nie ważne ile razy w ciagu 1sekundy bo caly czas bedzie 1, ważne aby stan wyjścia się nie zmieniał tyle razy co wejście w czasie np 1 sekundy, dlatego zeruj flage na samym końcu. Lub np licznikiem w innym if-ie

    if ( tnc ==100 && flaga ==1) flaga = 0 ;

    Tak można zerować globalną flagę np od wszystkich przerwań.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 lut 2019, o 22:06 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 01 lis 2015
    Posty: 1448
    Lokalizacja: okolice Warszawa
    Pomógł: 149

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

    włącz przerwanie co 1ms,
    w przerwaniu timera co 1 ms dekrementuj zmienną np:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
    co 1 ms zmienna dąży do '0' od zadanej wartości.
    a w kodzie obslugi realizacjii INT'a :
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
    jeżeli jest przerwanie od INT'a, to zawartość ifa wykona sie dopiero wtedy gdy uplynie określony w 'CZEKANIE' czas od poprzedniego przerwania INT'a. jeżeli nie uplynął (przesuwane palce), to za każdym razem ustawi się czas oczekiwania na zadaną wartosć, a zadanie będzie odwleczone o następne 'CZEKANIE'_ms pomimo powtórnego wywolania przerwania INT.

    Przesuwane palce będą wywoływać przerwanie INT, ale też będą odwlekać wykonanie poleceń w nim zawartych.

    oczywiściew możnaby uformować to w funkcję prostą do używania w kolejnych liniach kodu- kolejnych zadaniach.
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    trochę nagryźmoliłem, ale finalnie to kilka linijek kodu.
    taka myśl. :)


    Autor postu otrzymał pochwałę


    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 26 lut 2019, o 21:46 
    Offline
    Nowy
    Avatar użytkownika

    Dołączył(a): 28 kwi 2015
    Posty: 20
    Lokalizacja: Bydgoszcz
    Pomógł: 0

    miki53 napisał(a):
    może w ten sposób ( piszę bez sprawdzania kodu - sprawdz sam )

    Właśnie złożyłem układ na ATB 1.05 i sprawdziłem. Działa jak napisałeś. Najprostsze rozwiązania są najlepsze.
    Opóźnienie 500ms jest niewidoczne dla oka ale wystarczające, żeby przełącznik działał jak należy.
    Wszystkim dziękuję za pomoc. Problem rozwiązany.
    miki53 napisał(a):
    sprubuj zamienić miejscami _delay_ms(100); z PORTB ^= OUT;

    Sprawdziłem program bez zamiany miejscami tych linii i też działa prawidłowo.
    zubik napisał(a):
    Poza tym 100mS to może być trochę mało.

    Kluczowym problemem był za krótki czas opóźnienia. Po wprowadzeniu 500ms program działa prawidłowo.
    INT0 jeśli nawet przerywa działanie funkcji _delay_ms() (a przerywa na pewno) to i tak wraca do niej z powrotem i nic się nie zmienia (flaga dalej będzie równa 1). :)



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

    Strefa czasowa: UTC + 1


    Kto przegląda forum

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