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



Teraz jest 25 mar 2026, o 05:04


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 23 ] 
Autor Wiadomość
PostNapisane: 12 paź 2015, o 18:18 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lip 2014
Posty: 58
Pomógł: 0

Hej,
czy jest jakiś problem z jednoczesnym użyciem timerów 0 1 i 2 na atmedze16?
Sam timer 0 działa, sam timer 2 działa a jak uruchamiam timer0 i 2 to już nie bardzo ^^
Timerem 1 jescze się nie zająłem ze względu, ze jest troszkę bardziej skomplikowany.
Poniżej kod:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



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


W przypadku gdy oba timery są ustawione jak powyzej - dioda od timera0 całkiem gaśnie.
Gdy konfiguruję każdy z timerów z osobna - działa jak należy - zależnie od wartości pwmx diody świecą jasno lub ciemno.
Wydaje mi się, że timery powinny działąć równolegle. ale czemu u mnie nie działają?
Ktoś ma jakieś pomysły?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 paź 2015, o 18:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 25 gru 2011
Posty: 204
Lokalizacja: Boguchwała
Pomógł: 3

A gdzie zezwolenie na przerwania ? A main to inny plik ? Nie bardzo kumam jak to poukładałeś.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 paź 2015, o 18:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lip 2014
Posty: 58
Pomógł: 0

Tak, main to inny plik. w main jest podana wyżej pętla główna
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

zezwolenie na przerwania tzn sei(); znajduje się w pliku main.

------------------------ [ Dodano po: 9 minutach ]

Może napiszę co chcę zrobić.
Chciałbym uruchomić 3 timery (w tym wykorzystać A oraz B timera1) tak aby każdy z timerów kontrolował wypełnienie pwm.
Działanie sprawdzam na diodach, dlatego też wyjścia pwm podpięte są do LED1-LED4.
Chcę przy tym, aby były w miarę możliwości niezależne (wiem ze A i B timera1 nie będą tak do końca - ale możliwie jak najbardziej niezależne)
PS. Jak trzeba będzie to mogę dołączyć i cały kod. Wydaje mi się, że to co jest wyżej wystarczy do sprawdzenia czy przypadkiem nie robię jakiegoś błędu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 paź 2015, o 19:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 25 gru 2011
Posty: 204
Lokalizacja: Boguchwała
Pomógł: 3

Błąd możesz mieć w linijkach kodu, którego nie pokazujesz.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 paź 2015, o 19:37 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 sty 2013
Posty: 1760
Pomógł: 196

Witam
grochal7 napisał(a):
Może napiszę co chcę zrobić.Chciałbym uruchomić 3 timery... ... tak aby każdy z timerów kontrolował wypełnienie pwm.

Jeśli te trzy timer'y chcesz wykorzystać w celach testowych to nie przyglądałem się Twojemu kodowi, lecz jeśli chcesz tylko mieć trzy niezależne kanały PWM to wystarczy Ci jeden timer i w nim umieścić wszystkie trzy kanały.
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: 12 paź 2015, o 19:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lip 2014
Posty: 58
Pomógł: 0

To tylko testy, potem wykorzystam to do innego celu, gdzie konieczne będą 4 niezależne timery.

No to pokazuję całość: (chociaż szczerze wątpię że akurat tam jest coś nie tak)
main.c
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

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


------------------------ [ Dodano po: 1 minucie ]

Podkreślam, że np gdy uruchamiam timer0 lub timer2 oddzielnie to działa - gdy uruchamiam oba timery razem to nie dziala. Działa/nie działa znaczy, ze dioda nie świeci we właściwy sposób. jedna z nich po prostu gaśnie.

------------------------ [ Dodano po: 5 minutach ]

Pod porty pc2-pc5 podpięte mam 4 diody. Chcę powyższym kodem regulować ich jasność. KAŻDĄ DIODĘ INNYM "TIMEREM".
Wiem, że można zrobic to jedyn timerem, ale zależy mi na tej niezależności.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 paź 2015, o 20:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 25 gru 2011
Posty: 204
Lokalizacja: Boguchwała
Pomógł: 3

Wydaje mi się, że chodzi o jakieś priorytety (priorytety to raczej w przerwaniach zewnętrznych).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 paź 2015, o 20:43 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 mar 2014
Posty: 334
Lokalizacja: Rybnik
Pomógł: 55

Ale tak na logikę, ustalasz prescaler na 1, ładujesz wartość 3 do rejestru OCR. Policz, z jaką częstotliwością będzie wywoływane przerwanie? Teraz zastanów się, ile będzie trwała Twoja procedura obsługi przerwania? Czy widzisz coś nie tak?


Autor postu otrzymał pochwałę

_________________
Amatorska stacje meteorologiczna



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 paź 2015, o 20:54 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lip 2014
Posty: 58
Pomógł: 0

Ups...
Liczę tu jeszcze raz a tu błędzik!
Zamiast preskalera 1024 wrzuciłem 1 i oto problem...
Czyli to już rozwiązane.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 paź 2015, o 15:02 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lip 2014
Posty: 58
Pomógł: 0

Dość ciekawa sytuacja spotkała mnie podczas ustawiania timerów.
Miałem dziś dostęp do oscyloskopu i sprawdzałem czasy jakie generują timery.
I zaskok, bo zdarzały się takie sytuacje- gdy ustawiałem timer1 zmieniały się czasy timera 0 czy też timera2.

Może tak, potrzebuję ustawić 3 przerwania na 100kHz oraz jedno na około 400Hz.
poniżej mój kod (który nie do końca działą, ten timer 1...)
konfiguracja timerów:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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


Podkreślam, ze sprawdzałem to na oscyloskopie a nie na diodach ^^

------------------------ [ Dodano po: 10 minutach ]

Wiem, że sporo osób ma problem z tym timerem1.
Wiem, że OCRA1 powinno być większe od OCRB1.
W sumie to nie do końca tak byłoby...
Skoro licznik timera1 liczy to po jakimś tam czasie wykona się jedno przerwanie(dajmy t1), on liczy dalej i wykona sie drugie przerwanie(dajmy t2 od poprzedniego przerwania - więc w sumie t1+t2). Więc pierwsze przerwanie nie wykona się po czasie t1 tylko również po czasie t1+t2? (oczywiście t1, t2 to czas 1, czas 2)

------------------------ [ Dodano po: 15 minutach ]

Obrazek
W sensie coś takiego?
A może inaczej zrobić...
Na timerze 1 zrobić dwa przerwania 100kHz, na tiumerze 0 kolejne 100kHz a na timerze 2 400Hz?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 paź 2015, o 11:00 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lip 2014
Posty: 58
Pomógł: 0

Opadają ręce, wciąż ten timer ;/
Jak włączam przerwania timera2 to timer0 przestaje działać...
Jak nie mam uruchomionego timera2 to timer0 oraz 1 działają bez zarzutu..
Czyżbym źle je konfigurował?
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Przebiegi sprawdzam na oscyloskopie..



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 paź 2015, o 11:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2012
Posty: 193
Pomógł: 6

Masz zdefiniowany dobry procesor w ustawieniach projektu?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 paź 2015, o 11:37 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lip 2014
Posty: 58
Pomógł: 0

KoreX napisał(a):
Masz zdefiniowany dobry procesor w ustawieniach projektu?

Oczywiście.

Teraz ustawiłem timer2 w ten 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.

Troszkę się pozmieniało...
Wszystkie przerwania działają, jednak częstotliwości trochę nie tak jak trzeba..



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 paź 2015, o 13:37 
Offline
Moderator
Avatar użytkownika

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

Panie - nie ma w procku ATmega16 czterech niezależnych timerów sprzętowych i nigdy ich nie uzyskasz ... tak sobie myślę, że może coś ci się pomyliło ?

Dlatego zrewiduj swoje założenia

grochal7 napisał(a):
Podkreślam, że np gdy uruchamiam timer0 lub timer2 oddzielnie to działa - gdy uruchamiam oba timery razem to nie dziala. Działa/nie działa znaczy, ze dioda nie świeci we właściwy sposób. jedna z nich po prostu gaśnie.


Ja ci proponuję działać SPOKOJNIE i po kolei - a nie rzucasz kod do sterowania milionem timerów a pytasz o problem z dwoma które ci jak mówisz nie działają ....

Zacznij od TYLKO tych dwóch, pokaż co robisz - prosty przejrzysty kod - a nie takie jak wyżej jakieś (sorki masakry ;) .... ) gdzie pełno pokomentowanych rzeczy i weź tu się domyślaj co jest dobrze a co nie

przy dwóch timerach Timer0 i Timer2 WSZYSTKO MUSI działać ;) od tego zacznij jak mówię i rozwiązuj problem po kolei

Później pójdziesz po Timer1 - tylko doczytaj sobie nawet na tym forum, było już po stokroć poruszane zagadnienie związane z kanałem B, którego ty próbujesz używać jako niezależnego CTC ... nie zaglądając przy okazji też do noty o co chodzi w tym przypadku. Ale jak mówię po kolei a nie wszystko naraz bo tylko się bałagan robi w wątku i nikt nie wie o co chodzi

_________________
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: 16 paź 2015, o 14:29 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lip 2014
Posty: 58
Pomógł: 0

Ok, każdy z timerów konfigurowałem pojedynczo. Osobno timer0 osobno timer1 (kanały A i B) i osobno timer2. Działają prawidłowo- każdy z osobna. Także timer1, którego kanały a i b są wzgledem siebie zależne. Problem polega na tym, że gdy łącze kod z konfiguracji timerów (ten działający) w jeden - coś nie trybi. Jak wroce do siebie wstawie raz jeszcze cały kod, który umieszczony jest też wyżej.
Napisane z fona

------------------------ [ Dodano po: 2 minutach ]

Połączyłem też timer 0 i timer 1. Działają prawidłowo. Dopiero po dołączeniu timera2 zaczynają się problemy.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 paź 2015, o 15:05 
Offline
Moderator
Avatar użytkownika

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

zrozum - w KAŻDYM timerze kanały A i B są od siebie zależne i nie można w pełni wykorzystać kanału B

Więc na spokojnie - jak ci pasują 3 timery z kanałem A w CTC to przygotuj najprostszy kod ;) i go pokaż a nie opisuj ....

_________________
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: 16 paź 2015, o 17:11 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lip 2014
Posty: 58
Pomógł: 0

Ok, wróciłem do siebie, niestety nie mam w tej chwili możliwości sprawdzenia działania - nie mam oscyloskopu ;/
Poniżej kod konfiguracji 3 timery kanały A w CTC:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Wydaje się ok?

3 timery nie wystarczą, zdecydowanie potrzebuję - tak jak pisałem wcześniej - 3x przerwanie co 100 000Hz oraz jedno co 400 Hz.
W jaki sposób dodać kolejny kanał do timera 1?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 paź 2015, o 17:36 
Offline
Moderator
Avatar użytkownika

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

grochal7 napisał(a):
Wydaje się ok?

Ty zadajesz pytania na forum? czy zagadki ?

Proponuję zadawać pytania - czyli najpierw SAM sprawdź a później zadaj pytanie a nie odwrotnie ... bo później będziesz się dziwił, dlaczego nikt mi nie odpisuje ....

szanuj swój czas i czas innych ok ?

Jak sprawdzisz to wtedy napisz ....

a jak chcesz więcej timerów sprzętowych to nie mówi mi, że nie wiesz co się robi ? .... bierze się procek , który ma ich więcej - np ATmega128 albo nawet ATmega1284P jeśli ma być w obudowie takiej jak ATmega16

_________________
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: 16 paź 2015, o 23:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

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


Przerwanie Timer2_COMP, które posiada najwyższy priorytet, wykonuje się prawie w równych odcinkach czasu. Prawie bo co kilka przerwań następuje wydłużenie czasu zgłoszenia następnego przerwania.

Przerwanie Timer1_COMPA (niższy priorytet niż Timer2_COMP) wykonuje się mniej regularnie, przerwanie Timer1_COMPB jeszcze mniej regularnie i z dużo mniejszą częstotliwością.
Natomiast przerwanie Timer0_COMP (najmniejszy priorytet) wcale się nie wykonuje.

Ale wystarczyło zwiększyć preskaler Timera2 i Timera1 z 1 na 8 i wszystkie przerwania zaczęły ładnie się wykonywać.

Z tego wynika, że trochę przesadziłeś z tymi 100kHz. Może gdybyś zwiększył taktowanie np. do 20MHz to miałoby to szansę zadziałać.

Ale najlepiej będzie jak napiszesz co chcesz osiągnąć, że ci jest potrzebna taka duża częstotliwość przerwań. Może wtedy się okaże, że nie tędy droga.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 paź 2015, o 11:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lip 2014
Posty: 58
Pomógł: 0

Bingo. Do tego doszedłem wczoraj wieczorem.
Sprawdziłem to sobie na diodach - po prostu timer w przerwaniu zwiększał licznik do danej wartości i po doliczeniu zmieniał stan diody i zerował licznik.
Sprawdziłem dla przerwania 10kHz, 20kHz oraz 30kHz - wszystko działało. Natomiast dla większych - już nie. Wtedy zapaliłą się lampka i domyśliłem się o co chodzi.
Planuję wrzucić kwarc 16Mhz, powinien dać radę.
A do czego mi ta częstotliwość przerwań?
Do sterowania serw.
Każdy z timerów (odmierzający 100kHz) ma za zadanie obsłużyć 6 serwomechanizmów.
Większa częstotliwośc przerwań pozwala mi uzyskać większą dokładność ustawiania tych serw. W przypadku 100kHz otrzymam około 130-150 możliwych do uzyskania pozycji. (dla przykładu dla częstotliwości przerwań 200KHz liczba możliwych pozycji to 260-300) Ostatni timer ma odmierzać czas który pozwala na "wybór" obsługiwanego serwa. Tym sposobem w ciągu okresu dla działania serw (20ms) obsłużę 6 serw -przerwanie co 20ms/6=3,333ms. (możliwe jest max 8 może 9 serw dla każdego timera - czyli dla atmegi 16 mogę tym sposobem obsłużyć do 24serw lub nawet 27 dla 24 serw przerwanie na ostatnim timerze wykonywałoby się co 2,5ms (bo 20ms/8=2,5ms)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 paź 2015, o 14:38 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lip 2014
Posty: 58
Pomógł: 0

Sprawdzam dla kwarcu 16Mhz i przerwań co 100kHz
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


I co widzę, dla prescalera /8 coś idzie wyciągnąć (max dla 60kHz - działały wszystkie przerwania, dla prescalera/1 już praktycznie nic nie działa.

Zastanawiam się czy nie dałoby się tego jakoś inaczej rozwiązać. Dla 60kHz osiągnę około 70 możliwych pozycji dla serw. Mało troszkę.
W tygodniu będę mógł sprawdzić działanie dla kwarców 14,7 oraz 18,4 MHz- tym sprzyjającym UARTowi - tylko czy przetaktowanie procka wchodzi w grę?

jacekk232 napisał(a):
Ale najlepiej będzie jak napiszesz co chcesz osiągnąć, że ci jest potrzebna taka duża częstotliwość przerwań. Może wtedy się okaże, że nie tędy droga.

Może rzeczywiście nie tędy droga i można to ruszyć w jakiś inny sposób. Ale jak na razie nic lepszego nie wymyśliłem ;p



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 paź 2015, o 21:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

Jeśli chcesz obsłużyć aż tyle serw to może zainteresuj się tym 992-kanałowy sterownik serwomechanizmów


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 paź 2015, o 16:20 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lip 2014
Posty: 58
Pomógł: 0

No ciekawie ;) Być może trzeba będzie właśnie tym układem się zainteresować ;)
Dzięki!



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 3 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