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



Teraz jest 24 lut 2025, o 20:37


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 20 ] 
Autor Wiadomość
PostNapisane: 11 cze 2012, o 19:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 lis 2011
Posty: 302
Lokalizacja: Kraków
Pomógł: 6

Zrobiłem sobie w przerwaniu Timer programowy taki sam jak w projekcie wielozadaniowym.
Wiem jak go używać, jednak chce zrobić coś takiego, że dioda pali się 0,5s nie świeci 1s.
Oczywiście chce to zrobić na tych timerach.
Czy mógłby mi ktoś pomóc.
Chociaż naprowadził. ;)

_________________
Zapraszam:
filiporlo.blogspot.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 cze 2012, o 19:54 
Offline
Moderator
Avatar użytkownika

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

Nie wiem - tak na szybko najprostszy sposób - tak na gorąco jaki mi przychodzi - to zrobić dwa takie timery programowe.

I jednym z nich odpalać diodę na 0,5s a gdy timer doliczy do zera i ją zgasi to odpalać drugi odpalać na 1,5s i jak doliczy do zera to odpalać ten pierwszy - i tak się będzie w kółko kręciło ;)

_________________
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: 11 cze 2012, o 20:17 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 lis 2011
Posty: 302
Lokalizacja: Kraków
Pomógł: 6

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


Tylko jak je wyzwalać raz ten raz ten?
Przecież ten timer2 zaraz wyłączy diodę.

_________________
Zapraszam:
filiporlo.blogspot.com



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

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

No to wprowadź pan jakąś zmienną żeby sobie zrobić jakąś maszynkę stanów ;) ... pokońbinuj troszkę - może tak?

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

_________________
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: 12 cze 2012, o 14:50 
Offline
Użytkownik

Dołączył(a): 26 kwi 2012
Posty: 67
Lokalizacja: Drawski / Gorzów
Pomógł: 0

mirekk36 napisał(a):
Nie wiem - tak na szybko najprostszy sposób - tak na gorąco jaki mi przychodzi - to zrobić dwa takie timery programowe.

I jednym z nich odpalać diodę na 0,5s a gdy timer doliczy do zera i ją zgasi to odpalać drugi odpalać na 1,5s i jak doliczy do zera to odpalać ten pierwszy - i tak się będzie w kółko kręciło ;)


Dwa timery programowe? Co co za pomysł?
Użyć jednego timera 8 bitowca, który załóżmy przepełnia się co 4ms (250Hz). Teraz w głównej pętli żeby odmierzyć 0,5s trzeba odliczyć 125 przerwań timera a w celu uzyskania 1,5s odliczyć 450przerwań. Zmienna użyta do odliczania oczywiście jest inkrementowana w przerwaniu i to jedyna czynnośc wykonywana w tym przerwaniu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 cze 2012, o 15:07 
Offline
Moderator
Avatar użytkownika

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

main.c napisał(a):
Dwa timery programowe? Co co za pomysł?


Może jednak kolega pokusi się i doczyta co to są timery programowe, do czego się ich używa i dlaczego tak istotne bywa korzystanie z nich we własnych programach.

Ten sposób który kolega opisał jest oczywiście jednym z wielu tysięcy poprawnych merytorycznie sposobów (ale tak samo mógłbym napisać, że co to za pomysł z tym timerem sprzętowym ???? skoro wystarczyłoby nawet 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.


(bo to też przecież jest poprawne merytorycznie - nieprawdaż?)

- tyle że kolega właśnie sobie nie zdaje sprawy albo nie potrafi nazwać tego co robi - to też jest w pewnym sensie timer programowy co kolega opisuje. Tyle, że nie znając tego pojęcia kolega nie potrafi na razie przynajmniej ustandaryzować swoich działań i siup w oderwaniu od całego założenia proszę bardzo - wykorzystajmy timer 8-bitowy. A skąd kolega wie, że już przypadkiem wszystkie timery sprzętowe nie są zajęte ?

Tymczasem posługując się timerami programowymi możemy spokojnie dyskutować na nieco innym poziomie abstrakcji - tzn w oderwaniu trochę od sprzętowych zasobów i o to tu chodzi - to jest chyba najważniejsza myśl jaką staram się przekazać w książkach.

Dlatego polecam lekturę w tym zakresie - bo jak już człowiek zaskoczy - to potem ciężko zrezygnować z takiego podejścia do pisania własnych programów ;)

_________________
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: 12 cze 2012, o 16:06 
Offline
Użytkownik

Dołączył(a): 01 cze 2012
Posty: 72
Lokalizacja: Gdańsk
Pomógł: 2

Ja bym zastosował jeden licznik w trybie CTC. W pocedurze przerwań, na zmiane, wpisywać wielkość do której ma zliczać timer (raz mniejszą, raz większą). Na początku zdefiniować zmienna, która będzie wskazywała jaką liczbę wpisać w rejestr licznika i pod koniec procedury przerwania, tą zmienną, negować.

Oczywiście to zależy jaka dokładność jest nam potrzebna, żeby co chwile nie zmieniać preskaler licznika.

To tak na "szypkęsa" mi się w głowie zrodziło :D



Oj, wychodzi czytanie bez zrozumienia :oops: chodzi o liczniki programowe...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 cze 2012, o 16:35 
Offline
Użytkownik

Dołączył(a): 26 kwi 2012
Posty: 67
Lokalizacja: Drawski / Gorzów
Pomógł: 0

mirekk36 napisał(a):
Ten sposób który kolega opisał jest oczywiście jednym z wielu tysięcy poprawnych merytorycznie sposobów (ale tak samo mógłbym napisać, że co to za pomysł z tym timerem sprzętowym ???? skoro wystarczyłoby nawet 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.


(bo to też przecież jest poprawne merytorycznie - nieprawdaż?)


"Prawdaż" kolego Mirku.
Do stworzenia timera programowego (czyli nic innego jak utworzenia zmiennej inkrementowanej co określony czas) niezbędne jest użycie timera sprzętowego, nieprawdaż? Zaproponowałem 8bitowego w którym można utworzyć x timerów sprzętowych. To samo kolega przedstawia w swojej książce więc nie rozumiem Kolegi tonu odnośnie tego co zaproponowałem.
Pojęcie timer sprzętowy to nic innego jak zwykła zmienna zwiększana lub też zmniejszana (w zależności od pomysłu autora) kiedy dedykowany do tego licznik przepełni się i tym samym odliczony zostanie stały interwał czasowy.
W pętli programu zawarłbym warunek, że jeśli zmienna np. timer_01 będzie równa 0, to na pin portu do którego podłączona katoda diody, wysyłam logiczne zero powodując jej załączenia; kiedy zmienna timer_01 (lub jak kto woli timer programowy) osiągnie wartość 125 (zakładam, ża timer napędzający pozostałe timery sprzętowe przepełnia się co 4ms) wyłączam diodę a kiedy timer_01 osiągnie wartość 375 ponownie zeruję pin portu i zeruję zmienną. Cykl zaczyna się od początku.
To jest moja propozycja realizacji pierwotnego zadania, która pierwsza przyszła mi do głowy. Jeżeli to co jest zawarte w książce jest jedynie słuszne i nie ma tutaj miejsca na dyskusję to każda odpowiedź automatycznie powinna brzmieć: przeczytaj raz jeszcze materiał ze strony xxx.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 cze 2012, o 16:45 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 lis 2011
Posty: 302
Lokalizacja: Kraków
Pomógł: 6

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

Pod ADC0 podpinam albo GND lub Vcc, żeby wypróbować.
Jeżeli ZW podłącze do Vcc to dioda świeci przez 10s, jednak jeżeli ZW odłączę to dioda świeci 7,5s.
Jeżeli wpisałem na sztywno wartość jedynie w spełnionym warunku jeżeli ZW = 0 to odlicza i to i to 10s.
Dlaczego tak się dzieje?

_________________
Zapraszam:
filiporlo.blogspot.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 cze 2012, o 18:46 
Offline
Moderator
Avatar użytkownika

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

main.c --> to nie żaden jakiś ton z mojej strony - po prostu jak się coś pisze a nie rozmawia to łatwiej o nieporozumienia, a sam napisałeś:

main.c napisał(a):
Dwa timery programowe? Co co za pomysł?


jak ja to miałem potraktować? jako jaki ton?

Tak czy inaczej ja przepraszam jeśli coś źle odebrałeś i nie miałem zamiaru się wyrzymać na tobie czy ironizować. Ale musisz mnie zrozumieć - że ja nie znam wszystkich i jak ktoś tak napisze to podejrzewam po prostu, że nie wie czegoś i staram się wytłumaczyć albo na coś naprowadzić. Poza tym jak sam teraz piszesz to dokładnie - mechanizm takich zmiennych odpowiednio obsługiwanych w przerwaniu już może być timerem programowym. Tyle że ja czuję o co chodzi autorowi pytania i widzę że oparł się dokładnie na tym o czym pisałem w książce i tym tokiem podążam bo to także dobra droga i w ogóle założyłem że w przerwaniu już ma wszystko załatwione, ma zmienne itd - chodzi jak widać tylko o logikę realizacji zadania.

Wiadomo że można ją wykonać na milion różnych sposobów. Ale proszę się też nie dziwić że reaguję tak a nie inaczej na nieco zaczepną podpowiedź jaką zacytowałem wyżej .... Proponuję więc jak już nieco bardziej gładko wchodzić do dyskusji i np zaproponować swoje rozwiązanie - wtedy nie byłoby tego drobnego być może nieporozumienia


filipo96 --> sorki ale ja nie jestem w stanie przynajmniej na razie przeanalizować tego :( ... ale poradzę ci żebyś zamiast na docelowym układzie - potestował to najpierw na dużo prostszym programie i bez tego adc - szybciej wyłapiesz błąd

_________________
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: 12 cze 2012, o 19:14 
Offline
Użytkownik

Dołączył(a): 26 kwi 2012
Posty: 67
Lokalizacja: Drawski / Gorzów
Pomógł: 0

mirekk36 napisał(a):
jak ja to miałem potraktować? jako jaki ton?


Przepraszam, mogłem rzeczywiście w inny sposób napisać. Masz 100% rację bo sam nie przepadam za takim tonem odpowiedzi. Nie obraziłem się. Skłoniło mnie to do zweryfikowania swojej wiedzy nt. timera programowego więc nie ma tego złego co by na dobre nie wyszło. Na początku przeoczyłem, że autor wspomniał o timerze programowym i uszło to mojej uwadze.

Do autora - proszę przeprowadź ze swojej strony analizę kodu i wytypuj wg Ciebie podejrzany fragment bo rzeczywiście mało kto będzie czytał go od A do Z i szukał potencjalnej przyczyny zwłaszcza, że tylko Ty masz hardware zmontowany.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 cze 2012, o 19:41 
Offline
Moderator
Avatar użytkownika

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

main.c napisał(a):
Do autora - proszę przeprowadź ze swojej strony analizę kodu i wytypuj wg Ciebie podejrzany fragment .................. zwłaszcza, że tylko Ty masz hardware zmontowany.


Przyznam szczerze, że to jest bardzo bardzo cenna uwaga, zdecydowanie łatwiej i szybciej coś pomóc na bardziej konkretnym przypadku niż całym kodzie .... a o tym że brak schematu powoduje już całkowitą amnezję ... hmm myślałem że to tylko ja tak mam na starość ;) .... ale to nie programy na PC, gdzie każdy zna peryferia i system. Tutaj każdy szczegół sprzętowy się liczy.

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

Dołączył(a): 06 lis 2011
Posty: 302
Lokalizacja: Kraków
Pomógł: 6

OK zachowałem się trochę nie w porządku, ale coś wykryłem :idea: .
Mogę powiedzieć, że wykryłem błąd mam wrażenie, że pomiar napięcia. Jest tylko poprawny przed pętlą nieskończoną.
Następne pomiary w przerwaniu są jakieś błędne, gdyż pierwsze "świecie" led jest poprawne kolejne nie.
Jeżeli usunąłem linie pobierania wartości od ADC w przerwaniu wszystko ładnie ruszyło. Jednak wartości wtedy się nie odświeżają. To oczywiste.
Dlaczego tak się dzieje??

_________________
Zapraszam:
filiporlo.blogspot.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 cze 2012, o 21:32 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 lis 2011
Posty: 302
Lokalizacja: Kraków
Pomógł: 6

Zadaje sobie teraz pytanie czy ma to jakiś związek z tym, że pomiar robię co 20ms i w żaden sposób nie uśredniam tego wyniku.
Czy robić to częściej np. pętla nieskończona lub tryb "free runing mode"?
Czy zrobić uśrednianie wyniku tak jak w książce gdzie był użyty do uśredniania różnicowego pomiaru?

_________________
Zapraszam:
filiporlo.blogspot.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 cze 2012, o 21:39 
Offline
Moderator
Avatar użytkownika

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

Ja przyznaję, że teraz to już się całkiem pogubiłem. Zaczęło się od timerów programowych a teraz o ADC ;) .... ale powiem tak. Uśrednianie wyniku pomiarów nie ma NIC wspólnego z tym że działa pomiar ADC lub że nie działa.

Stosowanie jest dowolne czy free runing mode czy nie, wszystko zależy od potrzeb albo preferencji programisty.

Najpierw doprowadź program żeby działał ci bez zająknięcia a potem zajmiesz się uśrednianiem wyniku jeśli to okaże się konieczne - bo przecież to nie jest jakaś obligatoryjna potrzeba w każdym przypadku.

_________________
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: 12 cze 2012, o 21:45 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 lis 2011
Posty: 302
Lokalizacja: Kraków
Pomógł: 6

Program działa BEZ zająknięcia jak ustalę stałe wartości.
Jeżeli zostawię pobieranie wartości w przerwaniu 10ms.
To zachowuje się dziwnie raz tak raz tak.
Dlatego mam pytanie czy 10ms to nie za rzadko + brak uśredniania wyników?
Może dać pobieranie wyników w pętli lub włączyć tryb free runing mode i uśredniać wynik.

_________________
Zapraszam:
filiporlo.blogspot.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 cze 2012, o 22:21 
Offline
Użytkownik

Dołączył(a): 29 mar 2012
Posty: 595
Lokalizacja: Jaworzno
Pomógł: 39

Weź kolego załóż sobie nowy projekt dotyczący tylko timerów. Poświęć jeden, czy dwa dni tylko na dopracowanie kodu z timerami. Jak to przewałkujesz i będziesz pewny że działa tak jak chcesz, to wtedy tą część kodu możesz nawet przekleić do tego programu z którym się męczysz od kilku dni. Ja bym jednak radził działający kod wkleić do nowego/czystego projektu. To samo z ADC. Na tym forum ludzie są życzliwi i skłonni do pomocy, ale wyważ sobie zanim wkleisz dłuższy kod, czy ktoś może poświęcić aż tyle czasu na analizę linijka po linijce Twojego programu. Tym bardziej że jak Mirek zauważył, zacząłeś temat od timerów, a teraz pytasz z "innej beczki" o ADC.

Powodzenia
PP

_________________
Pozdrawiam
PP



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 cze 2012, o 09:41 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2012
Posty: 598
Lokalizacja: Warszawa
Pomógł: 13

filipo96 napisał(a):
Zrobiłem sobie w przerwaniu Timer programowy taki sam jak w projekcie wielozadaniowym.
Wiem jak go używać, jednak chce zrobić coś takiego, że dioda pali się 0,5s nie świeci 1s.
Oczywiście chce to zrobić na tych timerach.
Czy mógłby mi ktoś pomóc.
Chociaż naprowadził. ;)



Taki mały przykładzik dla twoich diodek :)

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 to na jednym timerze, zamiast wartości możesz podstawić dodatkowe zmienne do których załadujesz pomiar z ADC i powstanie regulacja czasu którą usiłujesz zrobić.

Timer sprzętowy oczywiście ustawiony w tryb CTC, natomiast timer programowy zliczający do 0 i w dodatku 16 bitowy.
ADC ustaw na 10 bitów wtedy maksymalny wynik pomiaru będzie miał wartośc 1024 co daje nam maksymalnie 10,24 sekundy przy założeniu że timer sprzętowy cyka sobie co 10ms. Odczyt ADC dla dwóch portów też możesz sobie zrobić na timerze programowym np. co 0,5 sekundy a nawet co 1 sekundę ( wydaje mi się że częstsze pomiary nie są potrzebne, no chyba że tak chcesz) a wyniki pomiarów wtedy podstawiasz do zmiennych o których wcześniej wspominałem.
Dzięki takiej konstrukcji pozbędziesz się tego
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


A wręcz uzyskasz płynną regulację czasu ze skokiem co 10 ms ;)

Uhhhh, jak nic mi się nie pomerdało to powinno zadziałać, w końcu ja tez się uczę, a umiem już naprawdę dużo, bo mrygam juz 5 diodami :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 cze 2012, o 13:30 
Offline
Moderator
Avatar użytkownika

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

Malutki_27 napisał(a):
A wręcz uzyskasz płynną regulację czasu ze skokiem co 10 ms ;)

Uhhhh, jak nic mi się nie pomerdało to powinno zadziałać, w końcu ja tez się uczę, a umiem już naprawdę dużo, bo mrygam juz 5 diodami :)


Jestem pod mega wrażeniem ;) .... z jednej strony kolega doszedł co jest nie tak i jeszcze zaproponował alternatywnie lepsze i prostsze rozwiązanie. Aż miło się na to patrzy ;)

_________________
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: 13 cze 2012, o 15:06 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2012
Posty: 598
Lokalizacja: Warszawa
Pomógł: 13

:oops:

Eeeee, jak to mówi Sunriver "To są jakieś pomówienia" ;)



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

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