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



Teraz jest 20 cze 2026, o 15:31


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 12 ] 
Autor Wiadomość
PostNapisane: 2 mar 2016, o 08:21 
Offline
Nowy

Dołączył(a): 23 lut 2016
Posty: 8
Pomógł: 0

Witam wszystkich na forum.

Korzystam z Atmega328p z zewnętrznym kwarcem 16MHz, mam problem z ustawieniem timera. Potrzebuję rozdzielczość 1us.
Posłyguję się załaczony kodem w Atmel Studio 7. NIestety timer nie wyzwala przerwania tak jak bym się tego spodziewał co 1us, Wszystko dzieje się ok. 5 razy wolniej niż powinno.
Co dziwne (jak dla mnie) gdy użyję w liczniku preskalera wówczas 1sek - odstępy czasu uzyskuję precyzyjnie - jednak ja potrzebuje 1us i tu juz jest problem.
W załączonym kodzie (dla testu ) próbuję zmieniać stan diody co 1 000 000 przerwań generowanych co 1us - czyli co 1s, jednak dioda zmienia stan co ok 4-5sek :cry:
Ustawione fuse bits: FE D9 FF
Proszą Was o analizę tego kodu i wskazówki.

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: 2 mar 2016, o 08:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sty 2016
Posty: 1189
Lokalizacja: Kraków
Pomógł: 95

Nie przeszkadza _delay_ms(100);?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 mar 2016, o 08:45 
Offline
Nowy

Dołączył(a): 23 lut 2016
Posty: 8
Pomógł: 0

Marhef napisał(a):
Nie przeszkadza _delay_ms(100);?


Raczej nie. No chyba że źle myśle, ale delay w main() nie ma wpływu na zlicznie taktów zegara przez timer.
Czy jednak ma ?



Ostatnio edytowano 2 mar 2016, o 08:45 przez adamjac65, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 mar 2016, o 08:45 
Offline
Użytkownik
Avatar użytkownika

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

Witam
W.g mnie za dużo wymagasz od uC.
Sprawdź jak będzie się zachowywało dla wartości zmniejszonych np. o 10
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Zbyt często chcesz wywołać przerwanie i uC nie wydala.
Co ile taktów chcesz mieć przerwanie, a ile taktów zajmuje samo przerwanie.

Pozdr.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 mar 2016, o 08:54 
Offline
Nowy

Dołączył(a): 23 lut 2016
Posty: 8
Pomógł: 0

@kicajek - Trafia do mnie Twoje wyjaśnienie.
Jednaj co zrobić gdy muszę mierzyć długość impulsu z dokładnością do 1us ?
Widziałem przykłady gdzie na zegarze 8Mhz ludzie zliczali co 8 taktów (czyli zabierali 1/8 czau CPU na samo geneowanie pzrerwań) i ponoć działało.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 mar 2016, o 09:37 
Offline
Użytkownik
Avatar użytkownika

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

Witam
Możesz m.in wykorzystać wejście liczące:
Obrazek
...z resztą poczytaj to:http://mdiy.pl/miernik-czestotliwosci-na-avr-od-1hz-do-10mhz/
może coś przystosujesz do swoich potrzeb ( chodzi o samą ideę wykorzystania tego licznika )

Pozdr.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 mar 2016, o 10:12 
Offline
Nowy

Dołączył(a): 23 lut 2016
Posty: 8
Pomógł: 0

kicajek napisał(a):
Witam
Możesz m.in wykorzystać wejście liczące:
Obrazek
...z resztą poczytaj to:http://mdiy.pl/miernik-czestotliwosci-na-avr-od-1hz-do-10mhz/
może coś przystosujesz do swoich potrzeb ( chodzi o samą ideę wykorzystania tego licznika )

Pozdr.


Faktycznie wyrażnie piszą "...Aby uzyskać pomiar do 10MHz, należy użyć kwarcu powyżej 21MHz, np wcześniej wymieniony 22.1184Mhz. Miernik potrafi mierzyć częstotliwość do około 47% wartości kwarcu..."
Więc pozostaje mi poszukać szybszego zegara lub zrezygnować z dokładności pomiaru.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 mar 2016, o 10:53 
Offline
Użytkownik
Avatar użytkownika

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

Witam
adamjac65 napisał(a):
.Aby uzyskać pomiar do 10MHz, należy użyć kwarcu powyżej 21MHz

...ale Ty zdaje się potrzebujesz do 1MHz; czyli od biedy nawet 8MHz wstarczy

Pozdr.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 mar 2016, o 11:08 
Offline
Nowy

Dołączył(a): 23 lut 2016
Posty: 8
Pomógł: 0

kicajek napisał(a):
Witam
adamjac65 napisał(a):
.Aby uzyskać pomiar do 10MHz, należy użyć kwarcu powyżej 21MHz

...ale Ty zdaje się potrzebujesz do 1MHz; czyli od biedy nawet 8MHz wstarczy

Pozdr.


No tak, oczywiście masz rację. 1us na takt to odpowiednio 1MHz
Więc tym bardziej moje 16Mhz powinno dać radę.

Jednak idąc za Twoją wskazówką próbuje niedomaganie wytłumaczyś sobie następujaco:
Co 16 taktów zegara generuję przerwanie, które trwa nie wiadomo jak długo ale pewnie dłużej niż 15 taktów - wiec CPU nie wyrabia się stąd nieprawidłowe zlicznie.

Spróbuję podpiąć mój sygnał pod przerwanie ICP, żeby nie zajmować CPU generowaniem przerwań co 1us



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 mar 2016, o 11:27 
Offline
Moderator
Avatar użytkownika

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

adamjac65 napisał(a):
Co 16 taktów zegara generuję przerwanie, które trwa nie wiadomo jak długo


http://mirekk36.blogspot.com/2013/12/pr ... acego.html

obejrzyj - a później zajrzyj do pliku *.lss i sprawdź sobie ile masz instrukcji asemblerowych w procedurze obsługi przerwania, sprawdź ile każda z nich zajmuje taktów zegara i wtedy od razu będziesz wiedział ile ono się wykonuje. Pamiętaj też że każda procedura obsługi przerwania w C ma jeszcze swój prolog i epilog, który też zajmuje czas

_________________
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: 2 mar 2016, o 13:13 
Offline
Użytkownik
Avatar użytkownika

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

Witam
Ale jeszcze w ramach uściślenia - Ty chcesz badać długość pojedyńczego impulsu ?
...to może puść go na INT'a - start przy narastającym, stop przy opadającym ...zboczu :)

Pozdr.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 mar 2016, o 14:58 
Offline
Nowy

Dołączył(a): 23 lut 2016
Posty: 8
Pomógł: 0

mirekk36 napisał(a):
http://mirekk36.blogspot.com/2013/12/pr ... acego.html


Panie Mirku, dziękuję. Teraz moja wiedza o obsłudze przerwań się ustematyzowała. Nieświadomie robiłem kilka głupot w tej materii.

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

kicajek napisał(a):
Witam
Ale jeszcze w ramach uściślenia - Ty chcesz badać długość pojedyńczego impulsu ?
...to może puść go na INT'a - start przy narastającym, stop przy opadającym ...zboczu :)

Pozdr.


Dokładnie tak robię :D

Problem tkwił w bezsensownym generowaniu przerwań co 1us. Ubzdurałem sobie że tylko w ten sposób otrzymam pomiar dokładny do 1us.
To oczywiście byłą głupota, teraz używam timera w trybie normal, przerwanie leci co 256 taktów, a żeby nie stracić dokładności uwzględniam poza licznikiem inkrementowanym w przerwaniu także ostatnią wartość TCNT0 i jest OK.

Dziękuję wszystkim za pomoc.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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