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



Teraz jest 25 sty 2025, o 19:50


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 
Autor Wiadomość
PostNapisane: 12 wrz 2013, o 20:30 
Offline
Nowy

Dołączył(a): 12 wrz 2013
Posty: 18
Pomógł: 0

Cześć

próbuje zmierzyć czas trwania impulsu 1,5 ms.
Częstotliwość uC 1Mhz.
Do pomiaru wykorzystuję Timer0 bez preskalera.
W przerwaniu TIMER0_OVF_vect zwiększam licznik o 1.

Zacząłem sobie liczyć:
1 takt -> 1us
1 licznik -> 256taktów -> 256us.
Czyli 1,5 ms wychodzi mi dla licznika = 6 (6x256).

No i to działa poprawnie. Zacząłem sobie trochę eksperymentować, bo ten licznik = 6 to trochę mała rozdzielczość.
A więc na starcie ustawiłem TCNT0 = 156. Czyli timer do przepełnienia powinien policzyć 100 taktów.

Czyli 1,5ms powinno być dla licznika (podbijanego o 1 w TIMER0_OVF_vect) równego 15.
Niestety 1,5ms jest dla około licznika = 18.

Czy ktoś mi może powiedzieć skąd taka różnica i gdzie źle myślę?

Moim podejrzeniem jest ten fragment kodu, że ten timer coś się źle ustawia, może w przerwaniu nie wolno takich rzeczy robić?
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Ogólnie program działa, ale nurtuje mnie to, że nie wiem dlaczego tak :?:
dzięki za pomoc.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 wrz 2013, o 21:02 
Offline
Nowy

Dołączył(a): 12 wrz 2013
Posty: 18
Pomógł: 0

GwynBleidD napisał(a):
100 taktów licznika to 25ms, a nie 1,5! Dla częstotliwości taktowania 1MHz, bo tą zrozumiałem z Twojego postu.


Wg moich wyliczeń i to napisałem w poście, że czas impulsu powinien być równy 1,5ms dla licznika = 15.

Przez słowo licznik mam na myśli zmienną w programie, którą zwiększam o 1 co 100 taktów uC.
Czyli 1 licznik powinien być równy 100us.

Skąd te 25ms? może właśnie coś źle myślę.

Już chyba widzę, kolega pomnożył 100 x 256. I tu się zgadza około 25ms. czyli dla licznika 6 jest około 1,5ms.

Problem mam z drugim przypadkiem, gdzie zmieniam TCTN0.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 wrz 2013, o 22:05 
Offline
Nowy

Dołączył(a): 12 wrz 2013
Posty: 18
Pomógł: 0

Sprowadzamy się chyba do tego co sam wyliczyłem na chłopski rozum, a więc:

preskaler = 1,
ilość zliczeń licznika sprzętowego = 100 (ustawiam TCTN0 = 156),
ilość zliczeń licznika programowego = 15

zgodnie ze wzorem:
1 000 000 / 1 / 100 / 15 =~ 667
i dalej:
1/667 =~ 0,0015 = 1,5ms.

Jak widać obliczenia wyszły tak samo jak mi... (mi ładniej bo bez zaokrągleń :) )
Chyba nie w liczeniu jest problem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 wrz 2013, o 20:27 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

dzielik napisał(a):
TCNT0 = timer_start;

Należy zdawać sobie sprawę, że to nie zostanie wykonane natychmiast. Funkcja przerwania zawiera prolog (kod dodawany przez kompilator), który zawiera kilka instrukcji asemblera. Możesz spróbować:
- użyć operatora +=
- zwiększyć częstotliwość z 1MHz na 8MHz i użyć ustawić preskaler timera na 8
- użyć trybu CTC, wtedy przeładowanie jest automatyczne
Oczywiście najlepsze jest wykorzystanie wejścia ICP, ale warto sobie przećwiczyć to co powyżej.

_________________
Dragonus Cracovus: Biomagia



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


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