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 12 kwi 2025, o 12:14


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 
    Autor Wiadomość
    PostNapisane: 8 kwi 2014, o 19:24 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 11 kwi 2013
    Posty: 67
    Lokalizacja: Rzeszów
    Pomógł: 0

    Witam, od kilku dni uczę się od nowa programowania mikroprocków, i próbuję sobie tworzyć jakies własne programy do sterowania ledami.
    Zrobiłem sobie efekt knight ridera, działa dobrze, jednak prosiłbym Was o sprawdzenie poprawnosci kodu. I zastanawiam się jak zrobić, żeby w dowolnym momencie wyłączyć wszystkie diody, bo teraz muszę trafić na moment jak wszystkie zgasną i dopiero wtedy mogę je wyłączyć. Próbowałem użyć różnych pętli ale nie przyniosło to efektu. Oto mój 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.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 kwi 2014, o 20:01 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 28 sty 2013
    Posty: 426
    Pomógł: 36

    Krystek napisał(a):
    I zastanawiam się jak zrobić, żeby w dowolnym momencie wyłączyć wszystkie diody,

    Rozumiem, że chcesz to zrobić tak, że po naciśnięciu przycisku gasną diody, jednakże nie wiem, czy chcesz dodawać jakiś inny przycisk, czy tym samym. Jeżeli chcesz dodać jeszcze jeden przycisk, to ja bym to 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.

    }



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 kwi 2014, o 21:51 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 07 kwi 2013
    Posty: 418
    Lokalizacja: Rzeszów
    Pomógł: 102

    Sam efekt "odbijania" wartości można zrealizować również bez użycia pętli for:

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

    Inny sposób:

    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: 8 kwi 2014, o 23:02 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 11 kwi 2013
    Posty: 67
    Lokalizacja: Rzeszów
    Pomógł: 0

    Dzięki za nakierowanie na takie coś jak flagi :) Pomyślałem trochę i zrobiłem to swoim sposobem. Program działa w taki sposób, że jeśli wcisnę przycisk 1 to mam wybrany efekt 1 a jak drugi to efekt 2. Coś mi jednak nie pasuje w tym programie, i wydaje mi się że rozwiązałem ten problem jakoś tak topornie. Chciałbym teraz zrobić to na jednym przycisku. Chyba nie obejdzie się bez użycia pętli for, tylko nie bardzo wiem jak ją tutaj zastosować. Program miałby zliczać ile razy wciśnięty został przycisk. Kolego atmel, Twoich składni to w ogóle nie rozumiem, jak na razie są dla mnie za trudne. Poniżej moja składnia:

    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 kwi 2014, o 00:32 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 07 kwi 2013
    Posty: 418
    Lokalizacja: Rzeszów
    Pomógł: 102

    Faktycznie kody na pierwszy rzut oka mogą wydawać się trudne, ale sama idea ich działania jest dość prosta. W pierwszym z nich pomocnicza zmienna k jest flagą informującą o kierunku przesuwu wartości rejestru PORTC. Dla k różnego od zera "dioda" przesuwana jest w prawo, a w przeciwnym wypadku w lewo. W związku z tym, że na początku k = 0 to przesuwanie będzę następowało w prawo, ale jeszcze wcześniej na czas 'a' ms będzie świecić dioda podpięta do pinu PC0 (PORTC na początku zainicjalizowane wartością 1). Przesunięcie tej jedynki w prawo spowoduje wyzerowanie rejestru, gdyż był to jego najmłodszy bit (można powiedzieć że ta jedynka "wypadła" z prawej strony bajtu): 00000001 -> 00000000.
    Następnie natrafiamy na warunek który sprawdza czy PORTC = 0, w tym obiegu pętli jest on prawdziwy (potwierdza to poprzednie zdanie). W takim wypadku wykonujemy dość dziwną operację arytmetyczną, mianowicie dzięki mnożeniu przez składnik k możemy odrzucać liczbę 0x3E (dziesiętnie 62), jeśli tylko k = 0, ponieważ mnożenie jakiejkolwiek wartości przez 0 daje w wyniku 0. Jednak to nie wszystko, bo niezależnie od k dodajemy do otrzymanego wyniku 2. Otrzymujemy w ten sposób możliwość przypisania do rejestru PORTC jednej z dwóch liczb: dla k = 1 będzie to 62 * 1 + 2 = 64, natomiast jeżeli k = 0 wtedy 62 * 0 + 2 = 2. W związku z tym, że na chwilę obecną k = 0 to zapalona zostanie dioda PC1, ponieważ PORTC = 2.
    Teraz wystarczy zanegować logicznie k (z 1 na 0 i z 0 na 1), co oznacza zmianę sposobu przesuwania wartości (moje drugie zdanie to wyjaśnia) zawsze w przypadku osiągnięcia "krawędzi" linijki diodowej ("wypadnięcia" jedynki z lewej lub prawej strony). Analizując dalej ten algorytm przechodzimy do drugiej iteracji pętli w której dalej oczekujemy pewien czas, następnie wykonujemy odpowiednie przesunięcie wartości (tym razem w lewo, gdyż k zostało zanegowane). Kolejny warunek się nie wykona, ponieważ PORTC jest już równy 4 (PC2) itd., aż do momentu osiągnięcia wartości 128 (PC7), po którym nasza jedynka "wypadnie" tym razem z lewej strony: 10000000 -> 00000000. W tym momencie ponownie zostanie wykonany warunek, który do PORT przypisze wartość 64 (pamiętamy, że w dalszym ciągu k = 1), która reprezentuje zapalanie diody PC6. Ponownie negujemy k i tym razem przesunięcia będą następowały w prawo.

    Drugi kod jest moim zdaniem nieco prostszy i opiera się o pewną "sztuczkę" arytmetyczną. Chodzi tutaj o to, że wartość zmiennej b jest ograniczona z góry liczbą 7 natomiast z dołu zerem. Jeżeli zostaną osiągnięte te skrajne wartości wtedy następuje negowanie, ale tym razem arytmetyczne (zmiana znaku liczby na przeciwny). Ponieważ na początku k = 1 to po negacji arytmetycznej będzie miała wartość -1, później 1 itd.. Taki nasz znacznik kierunku dodajemy do pomocniczej zmiennej b, która jest drugim operandem operatora bitowego przesunięcia w lewo (informuje o pozycji/numerze zapalonej diody). Oczywiście dodając 1 dokonujemy niejako inkrementacji, natomiast dodając -1 dekrementacji tej zmiennej.
    Efekt jest taki, że b zmienia się od 0-7, później 7-0 itd., natomiast PORTC zapala kolejne diody "odbijając je od krawędzi".

    Dość długie to moje tłumaczenie, ale chciałem w miarę szczegółowo przedstawić ideę działania tych algorytmów ;-)

    W sprawie zliczania ilości naciśnięć klawisza, rozwiązaniem może być inkrementowanie zmiennej przy każdej reakcji na zbocze opadające. Pewnie nawet sam sobie nie zdajesz sprawy, ale w pewien sposób zrealizowałeś automat skończony (zmienna flaga jest zmienną stanu), który również może zrealizować wszystkie Twoje "zachcianki" sterowania przyciskiem (nawet odstępy czasowe) :) . Nie chcę na razie przedstawiać dodatkowych propozycji kodów, ponieważ znowu niepotrzebnie utrudniłbym zrozumienie tematu :oops:



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 9 kwi 2014, o 12:17 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 11 kwi 2013
    Posty: 67
    Lokalizacja: Rzeszów
    Pomógł: 0

    Wprowadziłem zmiany do mojego kodu stosując pętlę for, zadziałało za pierwszym razem :) Za każdym naciśnięciem przycisku zmienna o nazwie "flaga" zostaje zwiększona o 1, a co za tym idzie zostaje wybrany inny efekt świecenia diodami.

    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.



    Jednak program nie działa tak jakbym tego chciał, nie zawsze ten przycisk odpowiednio "zaskoczy" to znaczy że zamiast wyłączyć diody ( funkcja wylacz ) wraca się do początku programu, czyli wybiera efekt 1 ( funkcja diody). Co może być nie tak ?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 9 kwi 2014, o 12:49 
    Offline
    Nowy
    Avatar użytkownika

    Dołączył(a): 08 mar 2014
    Posty: 22
    Lokalizacja: Kielce / Poznań
    Pomógł: 0

    Ten delay który zastosowales do eliminacji drgań styków nie spełnia zadania. Przeczytaj artykuł "Drgania styków? - To bajki! Na blogu Mirka, tam jest doskonale wyjasnione jak wlasciwie eliminowac drgania stykow nie uzywajac zadnych delayow ;)

    Wysłane z mojego GT-I9300 przy użyciu Tapatalka



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 9 kwi 2014, o 12:56 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 10 sty 2014
    Posty: 447
    Lokalizacja: DKL
    Pomógł: 53

    @damien.em dokładnie, też myślę że tu lezy przyczyna. @Krystek, zobacz ten artykuł, druga część, gdzie Mirek pokazuje jak ładnie obsługiwać przyciski: http://mirekk36.blogspot.com/2012/10/ob ... w-cd2.html

    _________________
    Migracja z punktu B do punktu C
    Pozdrawiam



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

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