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 12 lip 2025, o 03:29


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 
    Autor Wiadomość
    PostNapisane: 20 sie 2015, o 18:08 
    Offline
    Użytkownik

    Dołączył(a): 15 lut 2012
    Posty: 224
    Lokalizacja: Opole
    Pomógł: 24

    Witajcie

    Mam problem z czujnikami modHCS-SR04.Gdy próbuję odczytać odległość czujnika od przeszkody dostaję mocno zaniżoną wartość lub wartość całkowicie losową.

    Finalnie muszę obsłużyć 4 czujniki więc tryb ICP odpada - wybrałem przerwania PCINT. Procek to ATmega 644PA, taktowanie 8 Mhz wewn. zegar (Zestaw ATB ;) )

    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.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 20 sie 2015, o 20:53 
    Offline
    Uzytkownik zasłużony dla forum.atnel.pl
    Avatar użytkownika

    Dołączył(a): 16 lip 2012
    Posty: 2088
    Lokalizacja: Leżajsk / Kraków
    Pomógł: 411

    Preskaler 1 i mała wartość porównania sprawia, że nie działa to dokładnie. Od momentu zgłoszenia przerwania do pierwszej instrukcji w funkcji obsługi przerwania minie więcej czasu. Spróbuj podejść inaczej do tematu. Przykładowo po wysłaniu impulsu zapamiętujesz wartość timera, który działa normalnie i bez swoich przerwań, a w przerwaniu od zmiany stanu odejmujesz aktualną i starą wartość. W książkach Mirka można było wyczytać, że nie jest ważne która z wartości jest większa, bo wynik i tak będzie poprawny dla obliczeń na liczbach 16-bitowych.

    W pętli głównej rozbuduj sprawdzanie w jakim aktualnie stanie znajduje się pomiar (teraz masz 2 stany dodaj jeszcze 1), a to pozwoli pozbyć się _delay_ms(60);


    Autor postu otrzymał pochwałę

    _________________
    Dragonus Cracovus: Biomagia



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

    Dołączył(a): 15 lut 2012
    Posty: 224
    Lokalizacja: Opole
    Pomógł: 24

    Dzięki Krauser, teraz obliczanie odległości działa poprawnie (sensor1), ale tylko dla jednego czujnika - od reszty cały czas dostaję zero, nawet przy włączeniu pomiaru tylko dla jednego czujnika (w skrócie: działa tylko sensor1, od reszty dostaję 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.


    Krauser napisał(a):
    W pętli głównej rozbuduj sprawdzanie w jakim aktualnie stanie znajduje się pomiar (teraz masz 2 stany dodaj jeszcze 1), a to pozwoli pozbyć się _delay_ms(60);

    To zrobiłem w przerwaniu bo, nie do końca wiem o jaki stan chodzi.



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

    Dołączył(a): 16 lip 2012
    Posty: 2088
    Lokalizacja: Leżajsk / Kraków
    Pomógł: 411

    Generalnie chodziło mi o to, żeby nie zerować nigdzie TCNT1. Timer po prostu sobie liczy. Zerowanie TCNT1 jest błędem ponieważ jest to licznik wspólny i wtedy jeden pomiar psuje drugi. Jak wystąpi przerwanie to należy w zależności od aktualnego stanu tylko zapamiętać wartość TCNT1, albo obliczyć różnicę:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Na razie to przetestuj. Przydałoby się wyrzucić to _delay_us(10) z przerwania. Tak się nie ucz. Mimo, że 10 us to niby nic, ale nabierzesz złych nawyków. Powinno to wyglądać tak:
    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łę

    _________________
    Dragonus Cracovus: Biomagia



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 sie 2015, o 14:14 
    Offline
    Użytkownik

    Dołączył(a): 15 lut 2012
    Posty: 224
    Lokalizacja: Opole
    Pomógł: 24

    Działa, tylko że problem z zerem na reszcie czujników pozostał.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 sie 2015, o 16:16 
    Offline
    Uzytkownik zasłużony dla forum.atnel.pl
    Avatar użytkownika

    Dołączył(a): 16 lip 2012
    Posty: 2088
    Lokalizacja: Leżajsk / Kraków
    Pomógł: 411

    Niby używasz przerwań INT0 (PD2), INT1 (PD3) i INT2 (PB3), a w kodzie masz:
    ps19 napisał(a):
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Sprawdź to na spokojnie.

    _________________
    Dragonus Cracovus: Biomagia



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

    Dołączył(a): 15 lut 2012
    Posty: 224
    Lokalizacja: Opole
    Pomógł: 24

    Aktualny 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.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 sie 2015, o 17:25 
    Offline
    Uzytkownik zasłużony dla forum.atnel.pl
    Avatar użytkownika

    Dołączył(a): 16 lip 2012
    Posty: 2088
    Lokalizacja: Leżajsk / Kraków
    Pomógł: 411

    Niesłusznie zakładasz, że jak tylko wykona się linia sensor1.stan_pomiaru = 1; to pomiar jest już w kolejnej instrukcji wykonany i gotowy.

    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łę

    _________________
    Dragonus Cracovus: Biomagia



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 sie 2015, o 19:45 
    Offline
    Użytkownik

    Dołączył(a): 15 lut 2012
    Posty: 224
    Lokalizacja: Opole
    Pomógł: 24

    Krauser napisał(a):
    Niesłusznie zakładasz, że jak tylko wykona się linia sensor1.stan_pomiaru = 1; to pomiar jest już w kolejnej instrukcji wykonany i gotowy.


    Faktycznie :o

    Niestety to nie to - osobno działa, ale jak podłączone jest więcej niż jeden czujnik to dostaję odczyt tylko z jednego czujnika



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 sie 2015, o 22:22 
    Offline
    Uzytkownik zasłużony dla forum.atnel.pl
    Avatar użytkownika

    Dołączył(a): 16 lip 2012
    Posty: 2088
    Lokalizacja: Leżajsk / Kraków
    Pomógł: 411

    Chcesz powiedzieć, że jak w powyższym przykładzie na starcie ustawisz:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

    to masz odczyt z sensora 1, a dla sensor_nr = 1 z sensora 2.

    Możesz jeszcze spróbować inaczej wyłączać/włączać te przerwania, nie poprzez PCMSKx tylko przez rejestr PCICR

    _________________
    Dragonus Cracovus: Biomagia



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 sie 2015, o 22:52 
    Offline
    Użytkownik

    Dołączył(a): 15 lut 2012
    Posty: 224
    Lokalizacja: Opole
    Pomógł: 24

    Już działa, zmieniłem czujniki na nowe i zaczęło działać normalnie.

    Działa zarówno z wyłączaniem przerwań przez rejestr PCICR oraz PCMSKx.
    Dziękuję za pomoc.



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