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 23 maja 2025, o 15:45


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
    Autor Wiadomość
     Tytuł: Pętla w pętli
    PostNapisane: 27 maja 2019, o 18:26 
    Offline
    Użytkownik

    Dołączył(a): 19 lip 2016
    Posty: 114
    Pomógł: 0

    Witam,
    Zamierzony efekt to po 60 obiegach pętli sekund, jeden obieg pętli minut.
    Problem w tym że działa tylko z wartością 60!?
    Całość działa w co sekundowym przerwaniu.
    Czy to zadziała, co robię źle?

    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: 27 maja 2019, o 20:17 
    Offline
    Użytkownik

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

    Przesuń nawias } ten co jest po b++ na koniec drugiej pętli za b=0 } i zadziala z każdą wartością od b==1 do b==212



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 27 maja 2019, o 20:23 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 06 mar 2015
    Posty: 323
    Lokalizacja: Rybnik
    Pomógł: 23

    Jeżeli cię dobrze zrozumiałem, to tak się tego nie robi.
    Jeżeli chcesz zmieniać stan diody nr.1 co sekundę na przeciwny a stan diody nr.2 co minutę na przeciwny
    a korzystasz z przerwania co 1sekundę to wyrzuć te pętle for z pętli głównej i skorzystaj z procedury przerwania.
    Jak? No tak:
    Skoro przerwanie odbywa się co sekundę to zmieniaj stan pinu PB1 w procedurze obsługi tego przerwania.
    Potem inkrementuj sobie jakąś zmienną np. a , i sprawdzaj if-em czy osiągnęła już wynik np a>59.
    Wtedy jeśli if zostanie spełniony to zmień stan drugiej diody na PB2 na przeciwny i wyzeruj zmienną a.
    Wszystkim zajmie się procedura obsługi przerwania a pętla główna zostanie pusta.
    No i to wszystko.

    _________________
    http://www.avrboss.pl



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 27 maja 2019, o 20:30 
    Offline
    Użytkownik

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

    Przepraszam ale...

    Kolega pisał co robi zle w tym przedstawionym kodzie, nie pytał o inne rozwiazania, bo może to jest jego zamierzony cel, pomigac dioda tak szybko że aż sobie świeci delikatnym swiatełkiem ciagłym.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 27 maja 2019, o 20:47 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 06 mar 2015
    Posty: 323
    Lokalizacja: Rybnik
    Pomógł: 23

    Dlatego też napisałem, że nie wiem czy dobrze zrozumiałem jego problem.

    _________________
    http://www.avrboss.pl



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 maja 2019, o 05:02 
    Offline
    Użytkownik

    Dołączył(a): 19 lip 2016
    Posty: 114
    Pomógł: 0

    Szofer napisał(a):
    Przesuń nawias } ten co jest po b++ na koniec drugiej pętli za b=0 } i zadziala z każdą wartością od b==1 do b==212


    Przesunięcie tego nawiasu powoduje tylko to że, obie pętle pracują razem.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 maja 2019, o 06:12 
    Offline
    Użytkownik

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

    Druga pętla jest po if(b==60) wiec ona działa jak jest spełniony if, czyli w zakresie b=0 do b=212, zauważ że inkrementujesz b w petli for, ona zakonczy sie kiedy "a" osiagnie 212, wiec nie wykona sie drugi if bo w pierwszym if-ie "b" przekroczy wartosc warunku drugiego if-a zanim wyjdzie z pętli i program przejdzie dalej.

    Pozdrawiam



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 maja 2019, o 06:13 
    Offline
    Użytkownik

    Dołączył(a): 07 cze 2016
    Posty: 563
    Pomógł: 143

    Kod, który przedstawiłeś będzie co sekundę uruchamiał pierwszą pętlę (212 * zmiana stanu PB1 co 1ms).
    Warunek if(b==60) będzie spełniony, czyli druga pętla (212 * zmiana stanu PB2 co 1ms) będzie wykonana, gdy:
    ((sek*212)%256)==60
    gdzie:
    sek to sekundy
    (% to operator modulo)
    Nie chce mi się teraz liczyć, po ilu sekundach to nastąpi.

    Jeśli chcesz, aby pierwsza pętla była wykonywana co sekundę, a druga co 60 sekund, 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.


    EDIT:
    Widzę, że kolega Szofer uprzedził mnie i wskazał już miejsce błędu, ale zostawię moją odpowiedź jako uzupełnienie.


    Autor postu otrzymał pochwałę


    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 maja 2019, o 17:37 
    Offline
    Użytkownik

    Dołączył(a): 19 lip 2016
    Posty: 114
    Pomógł: 0

    Wszystko działa jak należy.
    Dodałem jeszcze godziny.
    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.


    Dziękuję wszystkim za pomoc.
    Pozdrawiam



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

    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