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 4 maja 2025, o 13:09


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 16 ] 
    Autor Wiadomość
    PostNapisane: 13 lut 2018, o 22:44 
    Offline
    Użytkownik

    Dołączył(a): 28 maja 2016
    Posty: 469
    Lokalizacja: Katowice
    Pomógł: 1

    Cześć. Napisałem sobie prosty program nie blokujący na podstawie kodu z BB z rozdziału do czasu rzeczywistego. Powołałem sobie timer programowy jak w książce i jeśli w pętli głównej togluję diodę, to wszystko działa. Ale jeśłi chcę sobie migać dwukropkiem na LCD, to jest lipa. Nie miga mi dwukropek na ekranie. Na pewno mam wszystko dobrze podłączone, ponieważ jeśli chcę tylko wyświetlić znak na LCD, to on się wyświetla. Program testuję na zestawie ATB. A tutaj jest mój kodzik. Potrafię już sobie napisać prosty program - stoper. Ale to mnie przerosło ;):
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    _________________
    Nikt nie mówił,że będzie łatwo...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 13 lut 2018, o 22:51 
    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

    Dodałbym zmienną (której stan też zmieniasz z 0 na 1) i w oparciu o to ustawiał dwukropek na wyświetlaczu. To co masz teraz od razu ustawi pusty znak. Przykład:
    Składnia: [ Pobierz ] [ Ukryj ]
    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: 13 lut 2018, o 22:58 
    Offline
    Użytkownik

    Dołączył(a): 28 maja 2016
    Posty: 469
    Lokalizacja: Katowice
    Pomógł: 1

    Dziękuję, za przykład. Przetestowałem i działa. Ale czy możesz mi wyjaśnić dlaczego mój przykład nie chce działać?

    _________________
    Nikt nie mówił,że będzie łatwo...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 13 lut 2018, o 23:19 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 11 mar 2014
    Posty: 1475
    Pomógł: 167

    wojciechgorzolka napisał(a):
    Ale czy możesz mi wyjaśnić dlaczego mój przykład nie chce działać?
    Bo u Ciebie wykonają się wszystkie komendy natychmiast - zatoglujesz diodą, ustawisz sobie pozycje 1,2, wyświetlisz dwukropek, ustawisz zmienną Timer 1, ustawisz pozycję 1,2. wyświetlisz spację (skasujesz dwukropek), ustawisz ponownie zmienną Timer1. I to wszystko od razu. Kasowanie dwukropka powinno być przemiennie z wyświetlaniem i to zawsze po minięciu czasu Timera.

    --
    Pozdrawiam,
    Robert


    Autor postu otrzymał pochwałę


    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 13 lut 2018, o 23:21 
    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

    Twój przykład nie działa, bo wpisanie do timera programowego Timer1 wartości nie oznacza, że tam program się zatrzyma. Wykona się po kolei wszystko co w warunku if(!Timer1) i po wyjściu warunek nie będzie spełniony i kod nie zostanie wykonany dopóki timer sprzętowy nie zmniejszy wartości zmiennej Timer1 do zera. Taki prosty przykład też nie zadziała:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    A taki już tak, ale jest to program blokujący:
    Składnia: [ Pobierz ] [ Ukryj ]
    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: 13 lut 2018, o 23:41 
    Offline
    Użytkownik

    Dołączył(a): 28 maja 2016
    Posty: 469
    Lokalizacja: Katowice
    Pomógł: 1

    Dziękuję Wam za odpowiedź. Znów jestem mądrzejszy o Wasze przykłady. Ja pierwszy raz używam timera zamiast delay i stąd moje błędy. Myślałem,że Timer1 można używać jak delay, ale teraz widzę,że tak nie jest :) Gdy zrobiłem sobie stoper oparty o delay, to wszystko było bardziej proste. Jednak występował problem z klawiszami, bo raz działały,a raz nie. Postanowiłem pójść o krok dalej i zrobić pierwszy program bez delay-ów. Zobaczę co mi z tego wyjdzie. Dziękuję

    _________________
    Nikt nie mówił,że będzie łatwo...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 14 lut 2018, o 07:50 
    Offline
    Użytkownik
    Avatar użytkownika

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

    wojciechgorzolka napisał(a):
    Myślałem,że Timer1 można używać jak delay, ale teraz widzę,że tak nie jest


    Zauważ że tym "delayem" jest objęte tylko to co znajduje się wewnątrz warunku if( timer1){ o tu... }
    Pozostała część kodu żądzi się swoimi prawami czasowymi.

    Wysłane z mojego Lenovo K33a42 przy użyciu Tapatalka



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 14 lut 2018, o 09:43 
    Offline
    Użytkownik

    Dołączył(a): 28 maja 2016
    Posty: 469
    Lokalizacja: Katowice
    Pomógł: 1

    jeśli będę robił zegarek, w którym będę miał trzy klawisze do ustawiania godzin min i itp, i jeśli obsługa tych trzech klawiszy będzie wyglądać identycznie, to czy do każdego klawisza z osobna muszę ustawić osobny timer programowy (timer1, timer2, timer3), czy mogą być wszystkie trzy klawisze np na Timer1? A do tykania sekund ustawię Timer2. Do migania diodą w innym tempie niż tykanie sekund ustawię Timer3. A do buzerka kolejny Timer4.
    Stworzyłem sobie funkcję na bazie przykładu kolegi Krauser:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    i tą funkcyjkę wrzucam zamiast _delay_ms(x);

    _________________
    Nikt nie mówił,że będzie łatwo...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 14 lut 2018, o 10:49 
    Offline
    Moderator
    Avatar użytkownika

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

    wojciechgorzolka napisał(a):
    i tą funkcyjkę wrzucam zamiast _delay_ms(x);

    zrozum timery programowe nie mają na celu ZASTĘPOWANIE kocich delayów

    Timery programowe mają umożliwić uruchamianie pewnych zdarzeń, twoich fragmentów kodu w jakichś interwałach czasowych

    więc twój błąd polega na tym, że ty wciąż próbujesz myśleć o tym jak tu zastąpić delaya - czyli czekać i blokować program ale zrobić to inną metodą.

    Wyobraź sobie lepiej, że masz potrzebę aby coś było wykonywane co 500 ms ... normalnie użyłbyś delaya(500) i blokował całą pętlę główną na 500ms - po co ?

    Za to bierzesz timer programowy , nastawiasz go żeby tykał co 500ms i dzięki temu twój fragment kodu odpala się co 500ms zaś pętla główna zapitala z pełną kosmiczną prędkością procesora, tylko co 500ms wykona to co masz w tym timerze programowym. Teraz może troszkę jaśniej ?

    ------------------------ [ Dodano po: 6 minutach ]

    Tak jak napisał wyżej kolega:
    Krauser napisał(a):
    A taki już tak, ale jest to program blokujący:


    taka pętla jest blokująca i NICZYM się nie różni od kociego delaya
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    _________________
    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: 14 lut 2018, o 11:10 
    Offline
    Użytkownik

    Dołączył(a): 28 maja 2016
    Posty: 469
    Lokalizacja: Katowice
    Pomógł: 1

    Rozumiem,że Timery są właśnie od nie blokowania. Ale dziękuję za sprostowanie przykładu Krausera, ponieważ myślałem,że ten przykład nie blokuje( źle odczytałem post). Ale faktycznie gdy go wczoraj testowałem z tykaniem licznika i dodatkowo miganiem diody, to działało to właśnie blokująco. Wieczorem pewnie znów przysiądę do napisania jakiegoś warunku, który pozwoli mi nie blokować pętlę główną. Czyli trzeba pogłówkować ;)

    _________________
    Nikt nie mówił,że będzie łatwo...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 14 lut 2018, o 11:55 
    Offline
    Moderator
    Avatar użytkownika

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

    wojciechgorzolka napisał(a):
    Czyli trzeba pogłówkować

    Zajrzyj proszę do Bluebooka do rozdziału "Projekt wielozadaniowy" tam masz przecież ŚLICZNIE to nie tylko opisane ale podany przykładowy bardzo prosty kod testowy - masz go na dołączonym nośniku do książki .... widzę że masz zestaw ATB więc jego uruchomienie żeby podpatrzeć co i jak działa za co odpowiada kilka timerów programowych tam użytych to pestka ... wystarczy jak mówię ten rozdział prześledzić a jak będą do niego jakieś pytania to wtedy dopytać tutaj - po co wyważać głową drzwi, gdy dzięki BB są przecież otwarte ;)


    Autor postu otrzymał pochwałę

    _________________
    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: 14 lut 2018, o 12:05 
    Offline
    Użytkownik

    Dołączył(a): 28 maja 2016
    Posty: 469
    Lokalizacja: Katowice
    Pomógł: 1

    :mrgreen: Ołkej. zaglądnę, ale od przepisywanie kodu człowiek się nie nauczy ;) . Oczywiście żartuję sobie, ponieważ korzystam z BB przy tym kodzie.

    _________________
    Nikt nie mówił,że będzie łatwo...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 14 lut 2018, o 14:45 
    Offline
    Użytkownik
    Avatar użytkownika

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

    wojciechgorzolka napisał(a):
    Czyli trzeba pogłówkować ;)

    kurcze,
    ja się zastanawiam czy czasem nie próbujesz przypisać timerom jakichś nadzwyczajnych właściwości. :)
    Powolujesz jakąś zmienną, np timer1.
    W przerwaniu tę zmienną dekrementujesz systematycznie w określonych odstępach czasowych. ( np. przerwanie co 1s a w nim if(timer1) timer1--;

    Pamiętając że pętlą główna będzie wykonywana b szybko, część programu zamykasz w ifie w którym sprawdzasz czy timer1 "spadł" już do 0.

    Jeżeli tak, to: {
    wykonujesz swoje funkcje,
    i przypisujesz do timer1 nową wartość.( np 60).
    Dopiero Za 60 sekund timer1 będzie miał wartość 0.
    , a tylko wtedy ta część kodu objęta klamrami się wykona.
    }
    Pozostała część pętli głównej będzie zapylać z pełną prędkością omijając tego nie spełnionego IFA.
    I tak przez najbliższe 60 s.
    To wszystko, nie doszukują się w tym jakiejś magicznej właściwości. ;)



    Wysłane z mojego Lenovo K33a42 przy użyciu Tapatalka


    Autor postu otrzymał pochwałę


    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 25 lut 2018, o 10:44 
    Offline
    Użytkownik

    Dołączył(a): 31 sty 2018
    Posty: 41
    Lokalizacja: Tarnów
    Pomógł: 0

    mirekk36 napisał(a):
    Zajrzyj proszę do Bluebooka do rozdziału "Projekt wielozadaniowy"

    Czy projekt wielozadaniowy nie jest czasem w Greenbooku ?
    Bo nie mogę go zlokalizować w Bluebooku



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 25 lut 2018, o 11:19 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 26 sty 2016
    Posty: 1168
    Lokalizacja: Kraków
    Pomógł: 93

    To chyba rozdział "Wstęp do systemów czasu rzeczywistego". Tam Mirek opisał program z wykorzystaniem wielu peryferiów



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 25 lut 2018, o 11:45 
    Offline
    Użytkownik

    Dołączył(a): 31 sty 2018
    Posty: 41
    Lokalizacja: Tarnów
    Pomógł: 0

    Marhef napisał(a):
    To chyba rozdział "Wstęp do systemów czasu rzeczywistego".

    Rozumie teraz przeglądnąłem "GB" i tam znalazłem lcd + projekt wielozadaniowy myślałem że to o nim mowa.
    Dzięki za podpowiedź



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

    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