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 18 lip 2025, o 21:10


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 27 ] 
    Autor Wiadomość
    PostNapisane: 1 cze 2012, o 11:13 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 28 sty 2012
    Posty: 40
    Pomógł: 0

    Proszę o pomysły jak mogę wyjść z pętli while(1) w której zamieściłem Timer który pozwala mi na mruganie diodą. Nie wiem w jaki sposób opuścić pętlę while tak aby jej zawartość nadal się wykonywała. Zamieszczam krótki kod z próbami, nie udanymi :/

    Składnia: [ Pobierz ] [ Ukryj ]
    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: 1 cze 2012, o 11:31 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 14 lut 2012
    Posty: 598
    Lokalizacja: Warszawa
    Pomógł: 13

    Panie tak to tylko w Erze, czy jakoś tak ;) ........ daj no cały kod ........ bo jak na razie to moża powiedzieć że prościej jest mrygać diodą w przerwaniu.

    Co do pętli while(1) to bedzie się zawsze wykonywac ponieważ warunek jest zawsze spełniany ( poczytaj o tej pętli w książce )
    Zamiast 1 powinien być jakiś warunek który tą pętlę przerwie ............



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 cze 2012, o 11:39 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 28 sty 2012
    Posty: 40
    Pomógł: 0

    Nie wyraziłem się jasno, chodzi mi o to aby ta pętla wykonywała się cały czas ale chcę wiedzieć w jaki sposób mogę do niej wchodzić/wychodzić i modyfikować zmienne inną funkcją zewnętrzną ;)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 cze 2012, o 11:52 
    Offline
    Użytkownik

    Dołączył(a): 11 kwi 2012
    Posty: 118
    Pomógł: 0

    Musisz skorzystać z przerwań, w książce masz to ładnie opisane.

    Czyli pętelka sobie leci wykonuje jakieś tam pierdoły a Ty za pomoca przerwania timera "mrygasz" sobie diodą (zmieniasz stan na pinie)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 cze 2012, o 12:08 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 28 sty 2012
    Posty: 40
    Pomógł: 0

    W tym kodzie jest już zastosowany do mrugania diodą, w książce jest dobrze wytłumaczone tylko w tym konkretnym przypadku nie wiem jak wykorzystać przerwanie aby się wydostać z pętli i wykonywać inne zadania równlolegle.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 cze 2012, o 12:38 
    Offline
    Użytkownik

    Dołączył(a): 11 kwi 2012
    Posty: 118
    Pomógł: 0

    Mozesz sobie zrobić tak:

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



    Ostatnio edytowano 1 cze 2012, o 12:41 przez kirex, łącznie edytowano 3 razy

    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 cze 2012, o 12:38 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 14 lis 2011
    Posty: 534
    Lokalizacja: Mierzyn
    Pomógł: 9

    Kirex - widze ze podprowadziles komus awatar .

    _________________
    pozdrawiam
    Jachu



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 cze 2012, o 12:39 
    Offline
    Użytkownik

    Dołączył(a): 11 kwi 2012
    Posty: 118
    Pomógł: 0

    ee, przecież ja nie mam avatara :p



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 cze 2012, o 12:45 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 14 lis 2011
    Posty: 534
    Lokalizacja: Mierzyn
    Pomógł: 9

    kirex napisał(a):
    ee, przecież ja nie mam avatara :p


    sorki chodzi o kris-a :)

    _________________
    pozdrawiam
    Jachu



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 cze 2012, o 12:46 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 14 lut 2012
    Posty: 598
    Lokalizacja: Warszawa
    Pomógł: 13

    Ok, no to może innaczej, warunkiem wyjścia z pętli (while) jest nie spełnienie warunku while(1) , ponieważ masz "1" to warunek zawsze będzie spełniony, co znaczy że pętla będzie się wykonywała do końca świata i jeden dzień dłużej .....

    Teraz troszkę jaśniej ? ;)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 cze 2012, o 12:50 
    Offline
    Użytkownik

    Dołączył(a): 11 kwi 2012
    Posty: 118
    Pomógł: 0

    Tylko jak wyjdzie z while, "break" powinien wystarczyć, to się program skończy :D
    No chyba, że po dordze jest kolejna nieskończona pętla, to wtedy jeszcze sobie podziała.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 cze 2012, o 12:57 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 14 lut 2012
    Posty: 598
    Lokalizacja: Warszawa
    Pomógł: 13

    kirex napisał(a):
    Tylko jak wyjdzie z while, "break" powinien wystarczyć, to się program skończy :D
    No chyba, że po dordze jest kolejna nieskończona pętla, to wtedy jeszcze sobie podziała.



    Dlatego własnie poprosiłem żeby wrzucił cały kod , z małym opisem co chce uzyskać, bo to mi jakoś nie comprende ;)

    jest sobie jakaś flaga tylko nie wiadomo od czego, domyślam się że to z jakiegoś przerwania ale nie wiadomo czmu ma tyo służyć, widzę jakis licznik tylko nie wiadomo co liczy .......... i dlatego się upieram przy pokazaniu kodu :)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 cze 2012, o 13:49 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 28 sty 2012
    Posty: 40
    Pomógł: 0

    Z pętli się wydostaję tylko gdy z niej wychodzę zostaje przerwana, co można by zrobić aby po wyjściu z niej nie została przerwana?
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
    Opiszę działanie programu do jakiego dążę. Mam menu w którym podaję zmienną "i" która będzie odpowiadała za czas po którym dioda zacznie migać, po wprowadzeniu tej danej chcę wrócić do menu. Udało mi się wydostać z pętli ale zostaje przerwana a chcę aby po wprowadzeniu zmiennej wykonywało się to niezależnie od tego czy cofnę się do menu czy nie.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 cze 2012, o 14:00 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 14 lut 2012
    Posty: 598
    Lokalizacja: Warszawa
    Pomógł: 13

    To więc tak, według mnie brniesz w jakiś ślepy zaułek, ponieważ takie działanie będzie "blokować" uC, a prostym przykładem tego jest delay który wstawiłes do kodu a równocześnie wykorzystujesz SuperDebounce .......... więc ponawiam wklej cały main.c , bez tego naprawdę nie bardzo możemy cię naprowadzić na jakieś rozwiązanie, czy też pomóc w "naprostowaniu" ;) twojego myślenia.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 cze 2012, o 14:09 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 28 sty 2012
    Posty: 40
    Pomógł: 0

    Więc podaję kod źródłowy, moje wypociny :) w main wywołuję funkcję set()
    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: 1 cze 2012, o 14:28 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 14 lut 2012
    Posty: 598
    Lokalizacja: Warszawa
    Pomógł: 13

    Jessuuu, żeby tylko tego Mirek nie zobaczył bo padnie na miejscu .........

    No dobra to po kolei, poczytaj z jakich sekcji powinien skladać się plik main.c , korzystasz z funkcji SuperDepounce ale biblioteki już nie masz podłączonej.

    W tej formie nie ma prawa działać to co napisałeś.

    To na razie tyle,doczytaj o tym popraw plik i zamieść go jeszcze raz ale już poprawiony .


    I żeby było jasne błedów jest tutaj od groma, ale od czegoś musisz zacząć ;)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 cze 2012, o 14:37 
    Offline
    Użytkownik

    Dołączył(a): 04 paź 2011
    Posty: 8615
    Pomógł: 338

    O matko i córko , ..... biedne eclipse ... o kompilatorze nie wspomnę
    Mirek nawet niech tu nie zagląda ... aż się boje o jego serce

    _________________
    Zbuduj swój system [url=https://helion.pl/ksiazki/w-labiryncie-iot-budowanie-urzadzen-z-wykorzystaniem-ukladow-esp8266-i-esp32-andrzej-gromczynski,wlablo.htm#format/d]IOT[/url]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 cze 2012, o 14:39 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 28 sty 2012
    Posty: 40
    Pomógł: 0

    To co widać jest w pliku z rozszerzeniem .h więc superD jest zadeklarowane i działa prawidłowo proszę tylko spojrzeć na funkcję run_dioda i spróbować pomoc



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 cze 2012, o 14:59 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 14 lut 2012
    Posty: 598
    Lokalizacja: Warszawa
    Pomógł: 13

    No to staramy się ......... całkowicie zapomniałeś o sekcjach w mian.c , doczytaj o tym.

    No to super że jest w pliku .h tylko z ciekawości powiedz którym, a skoro jest w tym pliku to po co ci w main.c deklaracja tego ?

    void SuperDebounce(uint8_t * key_state, volatile uint8_t *KPIN,
    uint8_t key_mask, uint16_t rep_time, uint16_t rep_wait
    void (*push_proc)(void), void (*rep_proc)(void) );

    Więc patrzę w run_dioda i widzę to :

    TCCR0 = (1<<WGM01); // tryb pracy CTC
    TCCR0 = (1<<CS02)|(1<<CS00); // preskaler = 1024
    OCR0 = 108; // przerwanie porównania co 10ms (100Hz)
    TIMSK = (1<<OCIE0);

    I odpowiadam NIE MA PRAWA TUTAJ TO BYĆ
    Wniosek ?
    Sprawdź jak powinien wyglądać prawidłowy main.c ....



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 cze 2012, o 15:03 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 28 sty 2012
    Posty: 40
    Pomógł: 0

    dzięki :) poprawię i zobaczę co dalej



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 cze 2012, o 15:05 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 14 lut 2012
    Posty: 598
    Lokalizacja: Warszawa
    Pomógł: 13

    No popraw, i dopiero wtedy będziemy gadać co jest źle ......... a jest duuuużo



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 cze 2012, o 16:00 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27416
    Lokalizacja: Szczecin
    Pomógł: 1043

    kris napisał(a):
    To co widać jest w pliku z rozszerzeniem .h więc superD jest zadeklarowane i działa prawidłowo proszę tylko spojrzeć na funkcję run_dioda i spróbować pomoc


    łeeech ... zajrzałem ;)

    jeśli to wszystko jest w pliku *.h to:

    1. albo na co dzień programujesz w C++ na PC i strasznie myli ci się wszystko - ponieważ tam umieszcza się definicje funkcji

    2. albo właśnie totalnie źle na razie rozumiesz jak rozmieszcza się definicje i deklaracje w plikach *.c i *.h w języku C bo tu jest różnica ;)

    więc trza wrócić do źródeł i jak najszybciej poprawić to

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 2 cze 2012, o 21:01 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 28 sty 2012
    Posty: 40
    Pomógł: 0

    Zrobiłem porządek jeśli coś przegapiłem to niechcący :)
    main.c
    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.
    funkcje.c
    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.
    funkcje.h
    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.



    Ostatnio edytowano 4 cze 2012, o 15:25 przez kris, łącznie edytowano 1 raz

    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 cze 2012, o 09:00 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 14 lut 2012
    Posty: 598
    Lokalizacja: Warszawa
    Pomógł: 13

    No już jest całkiem nie źle :)

    W main.c brakuje pętlii while zaraz za funkcą set()
    W funkcje.h dubluje ci sie deklaracja funcji
    Przerwanie timera wywal do main.c na sam dół
    W funkcjach down.select, up_select, screen powiela ci się kod pomyśl nad utworzeniem nowej funcji z tym kodem. ( latwiej wtedy skupic się tylko nad zmianą wartości, i będzie bardzej optymalnie )





    kris napisał(a):
    Opiszę działanie programu do jakiego dążę. Mam menu w którym podaję zmienną "i" która będzie odpowiadała za czas po którym dioda zacznie migać, po wprowadzeniu tej danej chcę wrócić do menu.

    Ponieważ jakoś dzisiaj jestem lekko nie gramotny wytłumacz dokładnie jak ma to działać.

    Rozumiem że chcesz ustawiać czas po którym ma zacząć migać dioda. Czy ona ma migac później cały czas czy tylko przez z góry założony czas a później gasnąć i czekać na nowe ustawienia ?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 cze 2012, o 15:31 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 28 sty 2012
    Posty: 40
    Pomógł: 0

    Poprawiłem te szczegóły o których napisałeś, a program ma uruchamiać diodę z góry założony czas a później gasnąć i czekać na nowe ustawienia. Chcę stworzyć później większe menu w którym będę mógł wprowadzać dane, potwierdzać je aby się natychmiast wykonywały cofać się do menu i kolejne ustawienia w menu uruchamiać. Chcę aby po zatwierdzeniu ustawień wychodząc do menu nie zostały zatrzymywane bądź przerywane. :)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 cze 2012, o 15:55 
    Offline
    Użytkownik

    Dołączył(a): 04 paź 2011
    Posty: 8615
    Pomógł: 338

    hehe kris ... paskudny podkradaczu avatarów :)
    super :)

    _________________
    Zbuduj swój system [url=https://helion.pl/ksiazki/w-labiryncie-iot-budowanie-urzadzen-z-wykorzystaniem-ukladow-esp8266-i-esp32-andrzej-gromczynski,wlablo.htm#format/d]IOT[/url]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 cze 2012, o 17:55 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 14 lut 2012
    Posty: 598
    Lokalizacja: Warszawa
    Pomógł: 13

    To teraz warto poczytać trochę o timerach programowych skoro to ma być program nie blokujący.
    Jeden bedzie potrzebny do tego żeby odmierzyć czas po jakim ma mrygać dioda, drugi do czasu przez jaki ma mrygac, a trzeci do tego żeby mrygała w odpowienich odstepach czasu.

    ( Można to jeszcze zrealizować za pomocą jednego lub dwóch timerów oraz enum ale timery wydają się fajniejsze ;) )



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

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Google [Bot] i 17 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