Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 3 sty 2025, o 01:28


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