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



Teraz jest 19 kwi 2024, o 09:03


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 16 ] 
Autor Wiadomość
 Tytuł: PRZYCISKI TIMER
PostNapisane: 28 wrz 2012, o 16:57 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 kwi 2012
Posty: 59
Pomógł: 1

Chcę zrobić 2 opcje na jednym przycisku, gdzie czas zwarcia przycisku do masy jest zliczany przez timer1.
Napisałem wstępnie 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.


Dlaczego to nie działa? Coś nie tak robię z Timerem1, ponieważ gdy usunę z ostatniego warunku OCR1A<15625 - to dioda normalnie reaguje na przycisk sterowany przez PWM.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 wrz 2012, o 17:45 
Offline
Moderator
Avatar użytkownika

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

Spróbuj poczytać to w całości

post16079.html#p16079

_________________
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: 28 wrz 2012, o 18:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 kwi 2012
Posty: 59
Pomógł: 1

Ok dodałem wpis w tamtym temacie, dzięki. Ale też chciałbym wiedzieć dlaczego to rozwiązanie nie działa, co tutaj podałem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 wrz 2012, o 23:11 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 kwi 2012
Posty: 59
Pomógł: 1

Timer1 jest normalnie wyłączony. Załącza go wciśnięcie przycisku KEY2 i w następnym warunku: jeżeli przycisk nadal jest wciśnięty i podczas tego wciśnięcia (zwarcia KEY2 do masy) licznik zliczy mniej niż 15625 impulsów czyli czas trzymania przycisku wciśniętego trwa ogółem nie dłużej niż 2 sekundy - LED powinien zostać zapalony.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 wrz 2012, o 00:15 
Offline
Moderator
Avatar użytkownika

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

if( !(PINB & KEY2) && OCR1A<15625) OCR2=0;

ale to to raczej jest tylko twoje pobożne życzenie a nie warunek, dokładniej mówiąc to zadziała tak:

jeśli klawisz wciśnięty i rejestr OCR1A (który nawiasem mówiąc nie ma NIC WSPÓLNEGO z tykającym rejestrem TCNT1 timera1) jest mniejszy niż 15625 - a pewnie jest - to warunek zawsze jest spełniony gdy tylko wciśniesz klawisz.

Ale żeby ci zaraz nie przyszedł inny pomysł do głowy np:

if( !(PINB & KEY2) && TCNT1<15625) OCR2=0;

bo tuż po wystartowaniu timera i tak zwykle TCNT1 będzie mniejsze niż 15625 - więc znowu zawsze warunek będzie spełniony gdy tylko klawisz będzie wciśnięty - od razu

nie wiem nawet tzn nie potrafię sobie odwzorować w głowie co ty chcesz tą drugą częścią warunku osiągnąć ??? pomyśl dokładnie jak to działa

_________________
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: 29 wrz 2012, o 00:41 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 kwi 2012
Posty: 59
Pomógł: 1

Właśnie trafiłeś co nie tak! :)
Ale jeszcze nie chodzi tak jak należy:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Pomysł nadaje się Twoim zdaniem?
Działa tylko jedna opcja na długie przyciśnięcie klawisza. Na krótkie przyciśnięcie nie działa. Nie rozumiem dlaczego akurat na dłuższe przyciśnięcie działa, a na krótsze już nie skoro warunki są niemalże identyczne tylko ze zmienionymi wartościami impulsów.



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

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

Powiem krótko - to jest bardzo zła droga - nie jestem w stanie tego analizować :(

zwróć tylko uwagę że wszystkie warunki są praktycznie takie same - totalne masło maślane :(

_________________
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: 29 wrz 2012, o 09:32 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 kwi 2012
Posty: 59
Pomógł: 1

Nie wiem dlaczego uważasz, że to masło maślane.. :(
Wytłumaczę kod po kolei.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Timer1 jest wyłączony (nie zlicza impulsów), gdy przycisk KEY2 jest niewciśnięty zgadza się?
W chwili, gdy przycisk KEY2 zostaje wciśnięty, Timer1 zostaje załączony i zaczyna sobie zliczać impulsy zgadza się?
W związku z tym, że Timer1 zlicza impulsy, ja to wykorzystuję w kolejnym warunku i zawczasu obliczyłem, że przy preskalerze 1024 i F_CPU=8MHz otrzymuję ostatecznie sygnał o częstotliwości 78125,5Hz, zgadza się?
Teraz powstaje pytanie ile impulsów musi zliczyć Timer1 aby trwało to 2s, bo taką zwłokę akurat chcę mieć przy długim wciśnięciu klawisza.
2 * 7812,5 = 15625 zgadza się?
I tą wartość wykorzystuję w kolejnym warunku: Jeżeli przycisk KEY2 jest wciśnięty i Timer1 zliczył mniej niż 15625 impulsów, czyli w sumie czas trwania wduszonego przycisku wynosi mniej niż 2 sekundy, to wtedy WYŁĄCZ LED zgadza się?
Ostatni warunek: Jeżeli LED WYŁĄCZONY ---> WYŁĄCZ Timer1 zgadza się?

Druga część w pętli głównej to jest wszystko to samo z dwoma różnicami:
Jeżeli przycisk KEY2 jest wciśnięty i Timer1 zliczył więcej niż 15625 impulsów, czyli w sumie czas trwania wduszonego przycisku wynosi więcej niż 2 sekundy, to wtedy ZAŁĄCZ LED zgadza się?
Ostatni warunek: Jeżeli LED ZAŁĄCZONY ---> WYŁĄCZ Timer1 zgadza się?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 wrz 2012, o 10:12 
Offline
Moderator
Avatar użytkownika

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

Posłuchaj - najwększą hmm wręcz gigantyczną wadą tego rozwiązania (tak dużą jak wieża Eiflfa) .... to fakt że używasz hmmm tracisz / marnujesz 16-bitowy timer sprzętowy na 1 , podkreślam jeden malutki klawisz (tzn sam pomysł już jest nietrafiony i to tragicznie)

toż gdybyś sobie poczytał o podstawach timerów programowych to już dawno dawno byś swój cel osiągnął nie marnując timer1 a wykorzystując jakiś timer 8-bitowy jako podstawę czasu do kilku timerów programowych.

wracając jednak do twojej analizy to pomyśl sobie nad tym jak działają warunki IF bo widzę że nie ogarniasz tego niestety :(

toż gdy w pierwszym warunku wyłączysz timer zerując bity preskalera, to on się zakończy i zacznie się sprawdzanie kolejnego warunku a ponieważ klawisz nadal wciśnięty to znowu preksaler ruszy - no nie widzisz tego ? Dlatego mówię że to masło maślane i nie po to żeby cię urazić czy coś - tylko jak najszybciej odwieść cię od takiego pomysłu.

_________________
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: 29 wrz 2012, o 10:27 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 kwi 2012
Posty: 59
Pomógł: 1

Ja zrobię to na 8-bitowym timerze, tylko chciałem w końcu to uruchomić według tej koncepcji.
Gwyn, coś nie działa ten kod. Przeanalizowałem go:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

ten warunek jest fałszywy, spójrz jeszcze na bit od CTC.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 wrz 2012, o 10:34 
Offline
Moderator
Avatar użytkownika

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

Gwyn, czasem lepiej kogoś odwieść od złego pomysłu, niż próbować iść tokiem złego rozumowania - bo zabrniesz w kozi róg .... zresztą sam widzisz. Toż tym sposobem żeby obsłużyć 4 klawisze to musiałbym wziąć ATmega128 która ma 4 timery sprzętowe a gdybym zechciał 7-8 klawiszy ??? to co? musiałbym chyba sięgnąć po jakiś ARM, który ma z 15 timerów prawda ?

_________________
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: 29 wrz 2012, o 12:09 
Offline
Moderator
Avatar użytkownika

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

Może i ty masz rację - każdy ma inne podejście do tego jak komuś można pomóc.

Ja się nie wzbraniam przed pomocą i bardzo dobrze zdaję sobie sprawę że kolega totalnie początkuje, dlatego piszę o błędach w warunkach.

Zatem jeszcze raz powiem - owszem potrenować warunki IF można - ale nadal ja będę się upierał że takie zastosowanie timera nawet 8-bitowego to zbrodnia ;) .... (ale to jest oczywiście moje zdanie i nikomu go nie narzucam .... każdy zrobi jak zechce ... ja tylko podpowiadam że tak się nie powinno robić)

_________________
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: 29 wrz 2012, o 12:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 kwi 2012
Posty: 59
Pomógł: 1

Ten warunek będzie spełniony jeżeli Timer1 będzie w trybie Normal, ja miałem tryb CTC i wtedy mamy dodatkowy bit, i wtedy iloczyn nie byłby spełniony.
Ale nie działa ten kod.. :/
Sam spróbuj:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Działa tylko jedna opcja, jak u mnie działało na długie przyciśnięcie, tak tutaj działa na krótkie przyciśnięcie. :(

Już mi głowa dymi bo co wymyślę to źle, źle i źle. :(

Myślałem żeby nawet po prostu licznik był ciągle włączony ale zerować go podczas wciśnięcia klawisza i sprawdzać ile impulsów już zostało zliczone:

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


Ale też źle i nie wiem dlaczego to nie działa, mnie się wydaje, że to na moją logikę powinno działać.. Nie umiem myśleć w sposób działający dla procesora.. :/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 wrz 2012, o 16:04 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 kwi 2012
Posty: 59
Pomógł: 1

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


Dzięki wielkie za dotychczasową pomoc. :)
Działa to niestabilnie i niedokładnie. Niestabilnie bo raz działa, raz nie. Niedokładnie, bo czas przycisku wciśniętego jest źle liczony. 7000 impulsów to jest 0.9 sekundy, a czasem na zwarcie 2 sekundowe nie ma reakcji, czasem na 3 sekundowe zwarcie dioda tylko mignie.
I nie rozumiem drugiego stanu, gdy TCNT1<7000. Zgodnie z warunkiem dioda powinna zgasnąć dopiero po puszczeniu przycisku, a gaśnie przy wciśniętym.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 wrz 2012, o 16:14 
Offline
Moderator
Avatar użytkownika

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

O ile w 90% przypadków debouncing to tylko bajka dla niegrzecznych dzieci - to jednak w tym przypadku - gdy w szalejącej pętli while(1) .... odpalany jest timer z taką szybkością ;) to akurat rzeczywiście debouncing może odgrywać ogromną rolę.

_________________
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: 29 wrz 2012, o 16:32 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 kwi 2012
Posty: 59
Pomógł: 1

Dokładnie to było przyczyną! :)
Teraz działa elegancko! Dziękuję.
Chyba już ostatnie pytanie w tym temacie...
Chcę żeby dioda mi się zapaliła gdy trzymam wciśnięty przycisk, a nie dopiero gdy puszczę. Jak tutaj skonstruować warunek? Wrzucałem if'a tam gdzie jest sprawdzane, czy stan pinu jest wyzerowany (zwarcie do masy, ale nie chce to działać jak zwykle).

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

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