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



Teraz jest 26 cze 2026, o 16:25


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 
Autor Wiadomość
PostNapisane: 8 cze 2015, o 06:01 
Offline
Użytkownik

Dołączył(a): 20 mar 2015
Posty: 104
Pomógł: 0

Właśnie na to wpadłem. Program steruje 4 serwami w przerwaniu, więc trzeba ustawić prescaler i tu mi się zrodziło takie pytanie:

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


I tak, procesor jest taktowany 16MHz, więc liczę sobie preskaler według takiej zasady:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


No ale przecież procesor jest taktowany 16MHz więc:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Jest to timer 16-bit, więc wiadomo że zakres musi się zmieścić w 0-65335. W związku z tym najlepszym rozwiązaniem tutaj będzie prescaler = 8 i widełki 0-39999, ponieważ wtedy otrzymam najwyższą dokładność. Czy mam rację? Bo wszędzie rozwiązanie tego widziałem 0-19999.

No ale ok, matematyka nie kłamie... Sprawdzam sobie w nocie Atmegi644 i widzę:
Obrazek

Co od razu każe mi zmieniać bit CS10 na CS11 w rejestrze TCCR1B. Robię dalej, przeliczam zakresy i powstaje taki kawałek kodu:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


I nie działa... A przecież powinno... Czy ktoś mądrzejszy ode mnie może mnie nakierować, gdzie zrobiłem babola tudzież czy moje rozumowanie jest złe???



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 cze 2015, o 08:27 
Offline
Użytkownik

Dołączył(a): 10 sie 2013
Posty: 66
Lokalizacja: Szczecin
Pomógł: 7

Czy do sterowania serwami chcesz używać sprzętowego PWM (a taki wybrałeś ustwiając bity WGM)? Jeśli tak, to dedykowane sprzętowe wyjścia PWM w porcie D (Mega644) są tylko 2. Chociaż z drugiej strony jeśli ustawiłeś przerwanie OCIE1A, to raczej chcesz wywołać zwykłe przerwanie od timera i tam dokonywań zmian PWM programowo. A zatem przejdź w tryb CTC, przestawiając bity WGM i zamiast do rejestri ICR1 załaduj wyliczone wartości do OCR1.

_________________
Build:succeeded or up-to-date, 0 failed, 0 skipped



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 cze 2015, o 16:11 
Offline
Użytkownik

Dołączył(a): 20 mar 2015
Posty: 104
Pomógł: 0

daro2020 napisał(a):
A zatem przejdź w tryb CTC, przestawiając bity WGM i zamiast do rejestri ICR1 załaduj wyliczone wartości do OCR1.


Nie wiem w jaki sposób przestawić bity WGM... Przecież są zgodne z tabelą. (???)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 cze 2015, o 20:47 
Offline
Użytkownik

Dołączył(a): 10 sie 2013
Posty: 66
Lokalizacja: Szczecin
Pomógł: 7

Z Twojego kodu wynika, że chcesz uzyskać przerwanie co 2,5ms i tam realizować sterowanie serwo. A więc dajesz:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

No i oczywiście makro dla obsługi przerwania.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Oczywiście dla sprawdzenia czy działa togluj leda w przerwaniu ustawiając tymczasowo preskaler clk/64, co da ok 3 mrugnięcia ledem /sek.

_________________
Build:succeeded or up-to-date, 0 failed, 0 skipped



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 cze 2015, o 11:01 
Offline
Użytkownik

Dołączył(a): 20 mar 2015
Posty: 104
Pomógł: 0

Dokładnie, serwa są sterowane w przerwaniu. Wieczorem jak najbardziej sprawdzę :)

Tylko takie pytanie:

- Wpisałeś do rejestru TCCR1B bit CS10, który odpowiada za prescaler = 1, nie powinno być CS11?

Jak się dostanę do Eclipsa to wyślę cały kod :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 cze 2015, o 11:43 
Offline
Użytkownik

Dołączył(a): 10 sie 2013
Posty: 66
Lokalizacja: Szczecin
Pomógł: 7

8
daro2020 napisał(a):
Wpisałeś do rejestru TCCR1B bit CS10, który odpowiada za prescaler = 1, nie powinno być CS11?

To zależy co ile ms chcesz przerwanie. Ja podałem wartości dla CS10=1 (preskaler=1), a więc 2,5ms. Ustawiając CS11 (preskaler=8) uzyskasz 20ms.

_________________
Build:succeeded or up-to-date, 0 failed, 0 skipped



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 cze 2015, o 09:20 
Offline
Użytkownik

Dołączył(a): 20 mar 2015
Posty: 104
Pomógł: 0

Kod pierwotnie wyglądał tak:

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


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


Niestety w takim wyglądzie w ogóle nie rusza... Kompilator nie wykrywa żadnych błędów. Jakieś inne pomysły, sugestie?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 cze 2015, o 11:22 
Offline
Użytkownik

Dołączył(a): 10 sie 2013
Posty: 66
Lokalizacja: Szczecin
Pomógł: 7

Hmm, zmiksowałeś mój kod, ze swoim i dziwisz się?

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


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


Po prostu skopiuj i wklej, nie cuduj.

_________________
Build:succeeded or up-to-date, 0 failed, 0 skipped



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 cze 2015, o 11:57 
Offline
Użytkownik

Dołączył(a): 20 mar 2015
Posty: 104
Pomógł: 0

No ok, racja. Działa. My bad. Ale zmiana CS10 na CS11 powoduje brak działania. Można jakoś zmienić preskaler na =8?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 cze 2015, o 12:25 
Offline
Użytkownik

Dołączył(a): 10 sie 2013
Posty: 66
Lokalizacja: Szczecin
Pomógł: 7

Panicz74 napisał(a):
...zmiana CS10 na CS11 powoduje brak działania. Można jakoś zmienić preskaler na =8?

Na CS=11 też musi działać tylko, że 8 razy wolniej. Jeśli upierasz się na preskaler=8, to:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Autor postu otrzymał pochwałę

_________________
Build:succeeded or up-to-date, 0 failed, 0 skipped



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 cze 2015, o 13:32 
Offline
Użytkownik

Dołączył(a): 20 mar 2015
Posty: 104
Pomógł: 0

Faktycznie z preskaler = 1 jest lepiej. Dzięki wielkie za pomoc, dużo się wyjaśniło :)



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 4 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