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 9 cze 2025, o 21:26


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 14 ] 
    Autor Wiadomość
    PostNapisane: 1 lut 2012, o 12:46 
    Offline
    Użytkownik
    Avatar użytkownika

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

    Mam problem gdyż chcę wyświetlić np. 3 razy dowolny tekst, pojawia się i znika tak 3 razy, zamieszczam kod poniżej
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Co może być źle w powyższym kodzie?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 lut 2012, o 13:50 
    Offline
    Moderator
    Avatar użytkownika

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

    Myślę, że najpierw to przydałoby się bardziej sprecyzować twoje założenie do tego testowego programu, bo na podstawie opisu i pokazanego kodu można tylko próbować zgadywać. Zwykle tego nie robię - tzn nie zgaduję - ale ponieważ kolega jest chyba nowym użytkownikiem i początkującą osobą - to wyjątkowo spróbuję ;)

    Czy nie chodziło ci przypadkiem o to, żeby trzy razy wyświetlić na LCD jakiś tekst ale w taki sposób, żeby:

    1. pojawił się pierwszy napis na LCD
    2. wyświetlał się przez czas 1 sekundy
    3. skasował się ten tekst
    4. pojawił się drugi napis
    5. wyświetlał się 1 sekundę
    6. itd ???

    Jeśli tak to zastanów się jak u ciebie działa pętla :(

    Po pierwsze kardynalny mega BŁĄD (inicjalizację LCD robisz za każdym razem w pętli) .... kolega nie doczytał w książce (trzeba wrócić do niej jeszcze raz) o tym jak dzieli się funkcję main(). Że najpierw jest część gdzie robi się inicjalizację pinów, portów i różnych modułów, potem ew uruchamia globalne przerwania jeśli są akurat konieczne a dopiero potem robi się pętlę główną.

    A u ciebie gdzie jest inicjalizacja LCD ? na początku main() ???? toż to się raz inicjalizuje i już działa - nie trzeba i wręcz nie można takiej inicjalizacji przeprowadzać wciąż w pętli!

    ok załóżmy że poprawiasz kod i dajesz inicjalizację przed pętlę główną - ale co się dale w nim dzieje.

    1. wyświetlasz tekst
    2. ----!!!!!----- od razu go kasujesz (LCD_cls) po co ? w tym miejscu ?
    3. odczekujesz 1 sekundę (_delay_ms(1000))

    czy nie widzisz tego babola ? ;)

    chyba chodziło ci o:

    1. wyświetlasz tekst
    2. oczekujesz 1 sekundę
    3. dopiero teraz kasujesz tekst i pętla rozpocznie się od nowa

    _________________
    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: 1 lut 2012, o 15:00 
    Offline
    Użytkownik

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

    No właśnie tak jak pisze kolega Mirek

    poczytaj co i jak robi pętla FOR

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


    wiec się zastanów dlaczego 3x robisz inicjacje LCD, wywietlanie i kasowanie ??

    jak już bardzo chcesz żeby to było 3 razy to zrób tak

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

    _________________
    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 lut 2012, o 21:14 
    Offline
    Użytkownik
    Avatar użytkownika

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

    Zastosowałem się do powyższych zasad i nadal nie wykonuje się pętla, wyświetla się cały czas napis Test tak jakby petle wykonano tylko raz
    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 lut 2012, o 21:35 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 22 gru 2011
    Posty: 449
    Pomógł: 4

    A niech kolega doda po instrukcji
    lcd_cls();

    kolejne delay ms (1000).
    I wtedy będzie jasne ile razy pętla się wykona.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 lut 2012, o 21:48 
    Offline
    Użytkownik
    Avatar użytkownika

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

    Już prawie działa teraz wykonuje tylko nieskończoną pętle, cały czas wyświetla napis Test z przerwaniami co 1 s, a pętli for nie wykonuje
    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 lut 2012, o 21:56 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 22 gru 2011
    Posty: 449
    Pomógł: 4

    Chyba pętle for właśnie wykonuje, tylko, że kolega tak to napisał, że po ostatnim wykonaniu tej pętli nic dalej ma się nie odbyć w tym programie. Dopóki jest spełniony warunek
    while (1) pętla będzie wieczna.

    Jeśli ma się ten komunikat wyświetlić tylko trzy razy, to zamiast tego while (1) ja bym spróbował tak:

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


    O może tak

    Edit:

    A zapomniałem, że na końcu oryginalnego kodu kolego można by zastosować np. instrukcję else i po niej czyszczenie ekranu. Czyi pętla wykonałaby się trzy razy, a za czwartym przebiegiem wykona tylko czyszczenie ekranu i zacznie od nowa.



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

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

    Panie kolego ależ wykonuje ci pętlę for() .... tylko jak ty chcesz się przekonać o tym fakcie wzrokowo przy takim kodzie. No toż warto by go chociaż troszkę zmodyfikować. Koledzy ci już podpowiadają, dodałeś po CLS jeszcze Delaya 1s .... a wstaw jeszcze kolejnego Delaya tuż po zakończeniu pętli for() to wtedy co trzy skasowania swojego tekstu będziesz miał dłuższą przerwę ;) albo coś takiego:

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


    wtedy już "nie ma mocnych" - zobaczysz odliczanie od 0 do 2 powtarzające się. Trzeba kombinować

    aha .... korzystaj z rozwijanego pola na górze i kod programu wstawiaj w znaczniki syntax=c zamiast code OK ?

    _________________
    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: 1 lut 2012, o 22:27 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 22 gru 2011
    Posty: 449
    Pomógł: 4

    A czy ta zmienna iteracyjna "i" to musi być dwubajtowa jak liczy tylko do 3 (słownie czech :) )? Można chyba ją zdecydowanie zmieścić w jednym bajcie, prawda?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 lut 2012, o 22:36 
    Offline
    Moderator
    Avatar użytkownika

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

    worner napisał(a):
    A czy ta zmienna iteracyjna "i" to musi być dwubajtowa jak liczy tylko do 3 (słownie czech :) )? Można chyba ją zdecydowanie zmieścić w jednym bajcie, prawda?


    Bardzo słuszna i cenna uwaga. Tyle że jak już to nawet wystarczy typ uint8_t zamiast int8_t. Ale generalnie bardzo dobra zasada żeby myśleć o KAŻDYM bajcie - brawo! ;)

    _________________
    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: 1 lut 2012, o 22:44 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 22 gru 2011
    Posty: 449
    Pomógł: 4

    No tak, racja, że powinno być bez znaku.
    Ale tak generalnie, to z tymi zmiennymi do odliczania w pętlach trzeba uważać. Sam się na początku na nich sparzyłem. Piecze do dzisiaj :)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 lut 2012, o 22:56 
    Offline
    Użytkownik

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

    oj tak .... potrafią zrobić spore zamieszanie , o ile w takim programie to żaden problem , to w większych konstrukcjach .... boli bardzo

    _________________
    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: 2 lut 2012, o 10:30 
    Offline
    Użytkownik
    Avatar użytkownika

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

    pętla się wykonuje dzięki wszystkim za pomoc ;)



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

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

    kris napisał(a):
    pętla się wykonuje dzięki wszystkim za pomoc ;)


    Ja bym tylko proponował, żebyś zwrócił uwagę na to, że wspomniana w pierwszym wątku pętla for() także się wykonywała, tylko nie wpadłeś na pomysł, jak to sobie zwizualizować. Jest to o tyle istotne, żebyś nie popełnił błędu myślowego, że pętla for() dopiero teraz działa - a wcześniej nie działała. Pomoże ci to w dalszym pisaniu programów i korzystaniu z pętli. Nie zawsze przecież muszą być widoczne dla oka efekty działania przeróżnych pętli.

    _________________
    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  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 14 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

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