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 lip 2025, o 17:20


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 31 ]  Przejdź na stronę 1, 2  Następna strona
    Autor Wiadomość
    PostNapisane: 22 lut 2012, o 12:18 
    Offline
    Użytkownik

    Dołączył(a): 20 lut 2012
    Posty: 28
    Pomógł: 0

    Cześć wszystkim,

    Chcę, by po wciśnięciu klawisza, na wyświetlaczu pojawiała mi się kolejna cyfra. Jeśli dorzucę pętlę np. for, usunę warunek if (przerwij1()) i _delay_ms(100) to wyświetlają mi automatycznie cyfry aż do osiągnięcia zadanej wartości. Ja chcę natomiast, by zliczało ręcznie (wyświetlało kolejną cyfrę po wciśnięciu klawisza). Ma ktoś pomysł, dlaczego to nie działa?

    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.


    gdzie przerwij1

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

    Dołączył(a): 15 gru 2011
    Posty: 110
    Lokalizacja: Dolnyśląsk
    Pomógł: 0

    Błąd znajduje się w funkcji przerwij1. Przypomnij sobie budowę warunków if.



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

    Dołączył(a): 20 lut 2012
    Posty: 28
    Pomógł: 0

    Qurde, nie widzę.. :/ Funkcję przerwij1 zrobiłem na podstawie książki ze strony 180. Dodałem teraz dodatkowo '{}'nawiasy w wywołaniu funkcji "inkrement_switch" po IFie, ale też nie działa.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 22 lut 2012, o 13:30 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 15 gru 2011
    Posty: 110
    Lokalizacja: Dolnyśląsk
    Pomógł: 0

    To podpowiem że za każdym razy gdy funkcja się kończy zwraca wynik '0' a rozumiem że chcesz by zwracała 1 gdy klawisz jest wciśnięty.



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

    Dołączył(a): 20 lut 2012
    Posty: 28
    Pomógł: 0

    zamieniłem na
    Kod:
    {_delay_ms(80);
    if (SWITCH_ON1) return 0;
    } return 1;
    Wyświetla mi się "0", ale nie zlicza. Chyba coś jeszcze jest nie ok.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 22 lut 2012, o 13:46 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 15 gru 2011
    Posty: 110
    Lokalizacja: Dolnyśląsk
    Pomógł: 0

    Zostaw tak jak było i dodaj przed ostatnim returnem 'else' dalej spróbuj sam :)


    edit: w sensie ta funkcja juz na oko powinna być ok.
    A i przydały by się komentarze żeby wiadomo co ma co robić. Nie tylko dla nas ale dla samego siebie powinieneś komentować kod. Z resztą w książce była o tym mowa.



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

    Dołączył(a): 20 lut 2012
    Posty: 28
    Pomógł: 0

    Kod:
    uint8_t przerwij1(void)
    {
       if (SWITCH_ON1)
          {
          _delay_ms(80);
          if (SWITCH_ON1) return 1;
          } else  return 0;
    }

    Dalej nie działa.. Jaka jest różnica między moją funkcją przerwij1 a tą z książki? Tam nie ma "else". Nie bardzo czaję jaka jest różnica. Jak używałem przerwij1 bez "else" w innych funkcjach, które sobie stworzyłem, to działała.



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

    Dołączył(a): 15 gru 2011
    Posty: 110
    Lokalizacja: Dolnyśląsk
    Pomógł: 0

    Dobra wybacz mój błąd zapomniałem że 'return' kończy funkcje :P

    w ramach przeprosin spróbuje się bardziej wgłębić w to i sprawdzić co jest nie tak.



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

    Dołączył(a): 15 gru 2011
    Posty: 110
    Lokalizacja: Dolnyśląsk
    Pomógł: 0

    aaa panie po pierwszym ifie chyba zapomniałeś o klamrach

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


    zwracasz do funkcji if '1' jeśli był wciśnięty guzik lub zero jeżeli nie.
    U mnie to w ogóle się nie kompiluje



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

    Dołączył(a): 20 lut 2012
    Posty: 28
    Pomógł: 0

    Tak, tak, zorientowałem się po Twojej pierwszej podpowiedzi. Dałem coś takiego:
    Kod:
    if (przerwij1())
       {
       licznik4++;
       _delay_ms(1000);
       cy4=licznik4;
       }
    Ale dalej nie działa. He, he, ale buła :D



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 22 lut 2012, o 15:08 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 15 gru 2011
    Posty: 110
    Lokalizacja: Dolnyśląsk
    Pomógł: 0

    A nie wydaje Ci się że za każdym razem gdy wywołujesz funkcje ' void inkrement_switch (void)' zerujesz wszystkie zmienne 'cyX' ? :)

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



    Co w ogóle teraz się dzieje na wyświetlaczach ?



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

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

    DidekxD napisał(a):
    A i przydały by się komentarze żeby wiadomo co ma co robić. Nie tylko dla nas ale dla samego siebie powinieneś komentować kod. Z resztą w książce była o tym mowa.


    A ja myślę, że od tego trzeba wręcz zacząć bo na prawdę przykro mi ale sam jestem pełen podziwu dla kolegi DidekxD, że coś podpowiada i widzi w tym kodzie - ja niestety na razie nie mogę się połapać - a nie mam na razie dużo czasu na analizę ..... dlatego mnie tu nie widać....

    proszę jak dla mnie jeszcze raz określić cele

    pokazać kod z kometarzami

    umieścić go w znacznikach syntax = c zamiast code (tak jak to zrobiłem za kolegę w pierwszym poście) - nie czyta się go teraz lepiej ?

    To potem postaram się pomóc o ile wcześniej się nie uda komuś innemu.

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

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

    A czy kolega nie zapomniał o pętli nieskończonej while?
    Bo jeśli tak, to program wykona się raz zanim jeszcze wciśnie się przycisk i potem stoi.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 22 lut 2012, o 15:32 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 15 gru 2011
    Posty: 110
    Lokalizacja: Dolnyśląsk
    Pomógł: 0

    Sądzę że to tylko fragment większego kodu. Dla tego nie widać tego o czym wspomniałeś.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 22 lut 2012, o 15:40 
    Offline
    Użytkownik
    Avatar użytkownika

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

    Nie wykluczone, ale skoro nie widać, to warto zapytać.



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

    Dołączył(a): 20 lut 2012
    Posty: 28
    Pomógł: 0

    Ok, a więc wklejam kod z dopisanymi komentarzami, mam nadzieje, ze w miarę zrozumiale opisałem (dla siebie w przyszłości też :D). Pousuwałem inne funkcje, by nie zamydlać interesującego kodu, mam nadzieję, że żadne starocia nie zostawiłem.
    Chodzi mi o to, by każde wciśnięcie przycisku wyświetlało na wyświetlaczu cyfrę o 1 większą
    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: 22 lut 2012, o 17:28 
    Offline
    Użytkownik
    Avatar użytkownika

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

    A dlaczego jest zakomentowana linijka nr 6 załączająca plik opóźnień?

    I jeszcze jedno mi się rzuciło w oczy: każde wejście w funkcję obsługi przycisku
    void inkrement_switch (void)
    powoduje najpierw zerowanie wszystkich wyświetlaczy. A więc już przy drugim wciśnięciu klawisza licznik będzie nadal pokazywał 1.



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

    Dołączył(a): 20 lut 2012
    Posty: 28
    Pomógł: 0

    Linijkę 6 zakomentowałem przypadkowo, jak wysyłałem post z kodem (podczas usuwania zbędnego kodu programu).
    Cytuj:
    I jeszcze jedno mi się rzuciło w oczy: każde wejście w funkcję obsługi przycisku
    void inkrement_switch (void)
    powoduje najpierw zerowanie wszystkich wyświetlaczy. A więc już przy drugim wciśnięciu klawisza licznik będzie nadal pokazywał 1
    To było to :) Usunąłem zerowanie na starcie i śmiga tak jak chciałem:)
    Wielkie dzięki wszystkim za zainteresowanie i okazaną pomoc :)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 22 lut 2012, o 17:51 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 15 gru 2011
    Posty: 110
    Lokalizacja: Dolnyśląsk
    Pomógł: 0

    DidekxD napisał(a):
    A nie wydaje Ci się że za każdym razem gdy wywołujesz funkcje ' void inkrement_switch (void)' zerujesz wszystkie zmienne 'cyX' ? :)

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




    Czyli to o czym wspominałem wyżej :)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 22 lut 2012, o 18:00 
    Offline
    Użytkownik
    Avatar użytkownika

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

    Cieszę się, że mogłem pomóc, choć ja też jestem początkującym i też często potrzebuję pomocy. Tak na marginesie powiem, że również jestem na etapie zabawy wyświetlaczami LED i również miałem zamiar pobawić się przyciskiem i licznikiem wciśnięć. Dlatego też pozwolę sobie skopiować pomysł kolegi i popracować na żywym organizmie. :mrgreen:



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

    Dołączył(a): 20 lut 2012
    Posty: 28
    Pomógł: 0

    Cytuj:
    Czyli to o czym wspominałem wyżej
    Faktycznie :D Tak się skupiłem na napisaniu komentarzy, że nie przetrawiłem trafnej uwagi. Thx :)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 22 lut 2012, o 18:04 
    Offline
    Użytkownik
    Avatar użytkownika

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

    Jednak my, początkujący lepiej umieszczajmy całe swoje kody, bo po lekturze pierwszego postu nie wyłapałbym tego. A jak kolega już umieścił cały kod, to od razu wpadło w oczy.



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

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

    A ja się cieszę, że udało się rozwiązać problem bez mojej pomocy ;) SUPER! i gratulacje

    przy okazji panowie podpowiem wam tajemnicę moją - mnie np najlepiej się uczy i utrwala materiał poprzez to że staram się kogoś uczyć lub podpowiadać - a nawet jeśli popełnię błędy i ktoś mnie poprawi - to co? to tylko z coraz większą korzyścią dla mnie.

    Dlatego takie czynne pomaganie innym - wg mnie potęguje efekt uczenia się samemu ;) - dostrzegacie też 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: 22 lut 2012, o 22:46 
    Offline
    Użytkownik
    Avatar użytkownika

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

    Oczywiście, że dostrzegamy zalety udzielania się na tymże forum w taki właśnie, a nie inny sposób, czyli poprzez pomaganie innym i braniem czynnego udziału w rozwiązywaniu problemów. Już kiedyś to napisałem: nie ma lepszego debbugera nad to forum! Basta.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 lut 2012, o 11:49 
    Offline
    Użytkownik

    Dołączył(a): 20 lut 2012
    Posty: 28
    Pomógł: 0

    Żeby nie zakładać nowego wątku...
    Zmodyfikowałem powyższy kod dodając funkcję dioda. Powoduje ona zaświecenie się diodek od lewej do prawej a potem od prawej do lewej. Chcę osiągnąć taki efekt, że cały czas będzie uruchomiona funkcja dioda() natomiast w momencie załączenia funkcji przerwij() - (wciśnięcie przycisku), wyskoczę z f. dioda() i będę w f. inkrement_switch(). Jeżeli umieszczę IF(przerwij) na końcu f. dioda(), to muszę się idealnie wstrzelić (aż się skończy wykonywać druga pętla for i nie zacznie pierwsza), by wyskoczyć z tej funkcji - w tej wersji wklejam 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.

    Jeżeli zrobię 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.

    to wyskoczę z FOR.
    Jak sobie poradzić w takiej sytuacji? Każda sugestia mile widziana :)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 lut 2012, o 12:10 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 15 lut 2012
    Posty: 193
    Pomógł: 6

    Myślę że w rozdziale pt. "Systemy czasu rzeczywistego" znajdziesz odpowiedz na nurtującą Cię zagadkę

    Pozdrawiam
    KoreX



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 lut 2012, o 12:26 
    Offline
    Użytkownik

    Dołączył(a): 20 lut 2012
    Posty: 28
    Pomógł: 0

    Aha, jeszcze do niego nie doszedłem. Skoro tak, to odkładam to pytanie na potem :D
    Pozdro!



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

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

    Na samym początku powiem, że w wyniku instrukcji z linii 49 i 55 zapali się tylko 7 diod, i zgaśnie tylko 7, a dokładniej jedna zostanie zapalona. Przerabiałem to dość dokładnie. Warunek ten musi wyglądać mniej więcej tak:

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


    Kluczową rolę odgrywa tu deklaracja zmiennej i. Musi ona być typu int, a nie uint.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 lut 2012, o 13:31 
    Offline
    Użytkownik

    Dołączył(a): 20 lut 2012
    Posty: 28
    Pomógł: 0

    Hm, mi działa z uint8_t :) Przeanalizowałem post kolegi sprzed ok. miesiącahttp://forum.atnel.pl/topic128.html.
    Zdaje mi się, że jest mała różnica między naszymi licznikami. Podałeś:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
    ja natomiast
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
    Czyli wg. mnie moje "i" nie dochodzi do -1 (czyli de facto 255), czyli mieszczę się w zakresie uint8_t.



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

    Dołączył(a): 15 gru 2011
    Posty: 110
    Lokalizacja: Dolnyśląsk
    Pomógł: 0

    Tak ale zostaje Ci jedna dioda zapalona :) nie gasi wszystkich :) jak przeanalizujesz moje rozwiązania z tamtego tematu to zobaczysz że podałem dwa rozwiązania :) Takie jak podał kolega worner i takie jak ty, tyle że z dodatkową zmienną która sprawia że wszystkie diody się gaszą :)

    Z resztą.
    Jest na to 1000 sposobów :) (Jak powiedział sam Pan Mirek)



    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: 31 ]  Przejdź na stronę 1, 2  Następna strona

    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:  
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO