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 25 lip 2025, o 16:14


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 23 ] 
    Autor Wiadomość
    PostNapisane: 5 sie 2020, o 16:55 
    Offline
    Nowy

    Dołączył(a): 06 lip 2020
    Posty: 10
    Pomógł: 0

    WItam wszystkich.
    Jako, że to mój pierwszy post toteż się przedstawię.
    Nazywam się Grzesiek i zaczynam "przygodę z programowaniem w C", dodam tylko, że wcześniej nie miałem w ogóle styczności z programowaniem.
    Obecnie jestem na etapie studiowania blubooka...

    Teraz do rzeczy:

    Napisałem (na razie niechlujnie :) ) 3 proste programiki i uzyskałem zamierzony efekt.
    Teraz chciałby te wszystkie 3 umieścić w 1 w którym za pomocą zworek będę włączał interesujący mnie "podprogram" czy jak to nazwać.
    Do tego celu zostawiłem 3 piny portu B (PB0-PB2) i za ich pomocą chciałbym mieć możliwość wybrania 1 z trzech programów.
    Pin PB będzie wówczas zwarty do masy (tylko 1, reszta podciągnięta do VCC programowo)
    I tak PB0 zwarty do GND = rusza programik 1 (analogicznie z PB1 i PB2)
    Jak się do tego zabrać?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 5 sie 2020, o 17:03 
    Offline
    Użytkownik

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

    Witaj na forum.

    Możesz skorzystać z "if" lub "switch" w while, albo 3 x "while" również z odpowiednim warunkiem w nawiasach ( ) dla każdego pinu osobno.

    Pozdrawiam.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 5 sie 2020, o 17:11 
    Offline
    Nowy

    Dołączył(a): 06 lip 2020
    Posty: 10
    Pomógł: 0

    A mógł bym prosić i fragment kodu ?
    załóżmy dla jednego pinu... opcja 3x "while"



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 5 sie 2020, o 17:20 
    Offline
    Użytkownik

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

    Warunek dla pinu while (! (PINB & 1<<PB0)) i dalej instrukcja

    Zagladnij tu https://mirekk36.blogspot.com/2012/10/drgania-stykow-to-bajki-wiec-jak-to.html?m=1

    Tylko to trochę na odwrót działa bo musi być 2 zworki na pine PB1 i PB2 wtedy masz 0 (zero) według twoich założeń.


    Autor postu otrzymał pochwałę


    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 5 sie 2020, o 17:28 
    Offline
    Nowy

    Dołączył(a): 06 lip 2020
    Posty: 10
    Pomógł: 0

    Dzięki zabieram się za ćwiczenie :)

    Moje założenie jest takie:
    PB0 - zwarta do masy - rusza program 1, wówczas PB1 i PB2 są podciągnięte do VCC
    PB1 - zwarta do masy - rusza program 2, wówczas PB0 i PB2 są podciągnięte do VCC
    PB2 - zwarta do masy - rusza program 2, wówczas PB0 i PB1 są podciągnięte do VCC

    Działa jak należy ale dopiero po fizycznym podciągnięciu do VCC...
    Jak mam programowo to lusowo odpala programy.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 6 sie 2020, o 16:57 
    Offline
    Użytkownik

    Dołączył(a): 17 mar 2020
    Posty: 70
    Pomógł: 5

    Strzelam, że błąd jest w linijce numer 42.



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

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

    landrynek napisał(a):
    Strzelam, że błąd jest w linijce numer 42.

    o żesz! ;) a ja obstawiałem linijkę nr 13,5 :lol:

    _________________
    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: 8 sie 2020, o 12:02 
    Offline
    Użytkownik

    Dołączył(a): 17 mar 2020
    Posty: 70
    Pomógł: 5

    faktycznie ta 13,5 jakaś podejrzana - ale to chyba pomylił nazwy zmiennych

    niestety nie mogę potwierdzić działania, bo u mnie jakoś się nie kompiluje :/ chyba jakiegoś kodu brakuje :P



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 sie 2020, o 13:51 
    Offline
    Nowy

    Dołączył(a): 06 lip 2020
    Posty: 10
    Pomógł: 0

    Tiaaaa faktycznie się walnąłem i nie ustawiłem odpowiednio bitów portu (jako wejście) a jedynie wszystko podciągłęm do vcc.....


    while (! (PINC & 1<<PC4) | (PINC & 1<<PC5) { instrukcja}....



    Panowie 42 linijka kodu nie działa :)
    A teraz na poważnie czy to prawidłowy zapis jeśli chciałbym aby sprawdzony został warunek dla wejścia PC4 i PC5 (czy oba wejścia mają stan niski)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 sie 2020, o 20:33 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 29 lis 2019
    Posty: 145
    Pomógł: 37

    Gietek napisał(a):
    czy to prawidłowy zapis jeśli chciałbym aby sprawdzony został warunek dla wejścia PC4 i PC5 (czy oba wejścia mają stan niski)

    Sprawdź to pod kątem priorytetu operatorów: https://en.cppreference.com/w/c/languag ... precedence

    _________________
    Think for yourself and question authority.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 9 sie 2020, o 08:33 
    Offline
    Nowy

    Dołączył(a): 06 lip 2020
    Posty: 10
    Pomógł: 0

    Kod poniżej,

    Dla pierwszego i drugiego "while" działa jak zamierzyłem, natomiast nie uruchamia się trzeci "while" dla warunku z pinem PB1...
    Rzucicie okiem fachowca?
    Tylko nie piszcie że ochyda ten kod bo wiem o tym ale jak pisałem w 1 poście....

    pinu PB1 używam do testów a docelowo chciałbym użyć pinów PC4 i PC5 i dla nich stworzyć warunek dla 3 efektu.


    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: 9 sie 2020, o 10:27 
    Offline
    Użytkownik

    Dołączył(a): 29 paź 2017
    Posty: 232
    Pomógł: 26

    No zobacz. Wywaliłem wszystko i zostawiłem same pętle
    Popatrz co wyszło:
    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.

    Popatrz gdzie jest pętla 3


    Autor postu otrzymał pochwałę

    _________________
    Jestem na GG 31324
    Nowy soft, nowa nadzieja.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 9 sie 2020, o 10:40 
    Offline
    Użytkownik

    Dołączył(a): 05 gru 2017
    Posty: 435
    Lokalizacja: Puck
    Pomógł: 7

    Witaj Gietek

    Wstaw kramelkę } w lini 108

    i wywal z lini 344


    Autor postu otrzymał pochwałę


    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 9 sie 2020, o 13:12 
    Offline
    Nowy

    Dołączył(a): 06 lip 2020
    Posty: 10
    Pomógł: 0

    Dzięki po 100 kroć...
    Już zgłupiałem i kombinowałem z przerzucaniem na inne piny mojej zworki.

    To już wiemy gdzie był błąd a teraz jakbyście mogli mi wytłumaczyć jak napisać warunek dla pętli 3, taki który będzie sprawdzał PC4 i PC5 i jeśli oba zwarte do masy to wykona się pętla 3


    chyba że to jest poprawne...

    while (! (PINC & 1<<PC4) | (PINC & 1<<PC5) { instrukcja}....



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 9 sie 2020, o 13:19 
    Offline
    Użytkownik

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

    Pierwsze wyrażenie jeśli będzie 0 a drugie jeśli będzie 1,tak masz to teraz zapisane, zanegować musisz całość



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 9 sie 2020, o 13:36 
    Offline
    Użytkownik

    Dołączył(a): 29 paź 2017
    Posty: 232
    Pomógł: 26

    Jeśli chodzi o wytłumaczenie jak ?
    Chcesz zrobić takie wyrażenie
    Jeśli "a" jest zerem i "b" jest zerem wtedy "prawda" czyli 1.

    Czyli c = (!a) & (!b);

    While (c){
    }

    Oczywiście można to napisać w jednej linijce
    ale chciałeś wyjaśnienie jak

    Tak samo jest jak kolega napisał wyżej
    Jeśli skorzystasz z lub to

    c = ! (a | b); // tylko dwa zera dadzą po zanegowaniu "prawda";

    _________________
    Jestem na GG 31324
    Nowy soft, nowa nadzieja.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 9 sie 2020, o 19:52 
    Offline
    Nowy

    Dołączył(a): 06 lip 2020
    Posty: 10
    Pomógł: 0

    Muszę jeszcze raz spojrzeć do książki bo nie łapie tego...
    Zanegować całość czyli tak?

    ~((! (PINC & (1<<PC5))) | (! (PINC & (1<<PC4))))

    to jest moje "a" (! (PINC & (1<<PC5)))
    To jest moje "b" (! (PINC & (1<<PC4)))
    ~ negacja całości oba a i b umieściłem w okrągłym nawiasie



    Dzięki za cierpliwość :) do mnie....



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 9 sie 2020, o 20:09 
    Offline
    Użytkownik

    Dołączył(a): 29 paź 2017
    Posty: 232
    Pomógł: 26

    Popatrz masz wyrażenie
    (PINC & (1<<PC5))
    Na rejestr PINC nakładasz maskę w tym przypadku 00100000
    czyli możesz uzyskać dwie wartości 1 lub zero.
    Zakładamy że gdy przycisk naciśnięty podłącza pin do masy

    Jeśli założysz że
    a to wartość wyrażenia (PINC & (1<<PC5))
    b to wartość wyrażenia (PINC & (1<<PC4))
    wtedy

    prawda = ! (a | b);
    Tylko gdy dwa piny będą zwarte do zera pojawi się zero które zanegowane da 1

    prawda = ! ((PINC & (1<<PC5)) | (PINC & (1<<PC4)))

    _________________
    Jestem na GG 31324
    Nowy soft, nowa nadzieja.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 10 sie 2020, o 06:48 
    Offline
    Nowy

    Dołączył(a): 06 lip 2020
    Posty: 10
    Pomógł: 0

    Tak to właśnie rozumię - dzięki Twojej podpowiedzi z postów wyżej, jednak po wklepaniu komplilator zgłasza błedy:

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




    ../main.c:108:21: error: expected '(' before '!' token
    ../main.c:108:21: warning: value computed is not used [-Wunused-value]
    ../main.c:109:15: error: expected ';' before '{' token
    make: *** [main.o] Błąd 1

    Natomiast jeśli umieszczę całe wyrażenie w nawiasie while (!((PINC & (1<<PC5)) | (PINC & (1<<PC4)))) to się kompiluje ale uruchamia się pętla która nie powinna i dopiero właściwa (za każdym resetem jeden raz przelatuje pętla dla innego warunku i dopiero ta dla której jest ten warunek)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 10 sie 2020, o 08:24 
    Offline
    Użytkownik

    Dołączył(a): 29 paź 2017
    Posty: 232
    Pomógł: 26

    Zababoliłem.
    Coś za mało nawiasów dałem:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Sprawdź i daj znać.
    Kompilator nie mógł się doliczyć nawiasu :)


    Autor postu otrzymał pochwałę

    _________________
    Jestem na GG 31324
    Nowy soft, nowa nadzieja.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 10 sie 2020, o 16:07 
    Offline
    Nowy

    Dołączył(a): 06 lip 2020
    Posty: 10
    Pomógł: 0

    Działa warunek ale z małym defektem, otóż puszcza jedną pętlę z innym efektem i dopiero właściwa. Po każdym resecie tak samo...

    Nawias znalazłem jak już wyżej pisałem.

    Jak wyeliminować babola ?

    A właściwie to może tak zostać. Nawet mi się podoba :)


    Dziękuję wszystkim aktywnym za POMOC .

    Będzie jeszcze trochę pracy nad tym programem bo mam zamiar za pomocą jeszcze jednej zworki (lub potencjometru - co będzie dla mnie raczej awykonalne na tym etapie mojej przygody z AVR i C) wybiereć delaya np 20ms i 25ms o ile się da....



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 10 sie 2020, o 16:34 
    Offline
    Użytkownik

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

    Nikt, nawet Ja nie dopisałem że, pętla while jeśli ma w nawiasie (0) to się kończy i nie "kręci" się jak to pętla w nieskończoność, dlatego zawsze jak używamy while w naszych "standardowych" zapisach to while(1) i jesli jest 1 to się kręci w nieskończoność, jeśli w warunku (coś) jest to musi to sprawdzić czy to (coś) jest 1 czy 0.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 10 sie 2020, o 17:19 
    Offline
    Nowy

    Dołączył(a): 06 lip 2020
    Posty: 10
    Pomógł: 0

    Szofer napisał(a):
    Pierwsze wyrażenie jeśli będzie 0 a drugie jeśli będzie 1,tak masz to teraz zapisane, zanegować musisz całość



    Domyśliłem się po tym zapisie :)



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

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


    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