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



Teraz jest 27 lis 2024, o 04:17


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 
Autor Wiadomość
PostNapisane: 22 sty 2018, o 16:35 
Offline
Nowy

Dołączył(a): 28 lis 2017
Posty: 7
Pomógł: 0

Cześć.
Mój problem wygląda tak że napisałem prosty program aby moja ATmega88 mierzyła częstotliwość. Do testów wygenerowałem sygnał PWM o częstotliwości dokładnie 31250 Hz z innego uC i podałem ten sygnał na mój "miernik częstotliwości". Wynik wyświetlany na LCD niestety pokazuje błędną wartość 2025. Podając inne częstotliwości zauważyłem taką zależność że wynik zawsze jest mniejszy ok. 15.5 razy od rzeczywistej wartości. Sprawdziłem jeszcze ten sam soft na ATmedze328 i o dziwo wyniki były inne niż na ATmedze88. Dla sygnału PWM o częstotliwości 31250 pomiar wykazał 16023 Hz i w ogóle wyniki dla innych częstotliwości były niecałe 2 razy mniejsze. Z racji że nie jestem ekspertem w tych sprawach spodziewam się że rozwiązanie może być banalne. Dodam jeszcze że oba uC taktowane były tym samym kwarcem. Będę wdzięczny za każdą wskazówkę.

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: 22 sty 2018, o 16:41 
Offline
Moderator
Avatar użytkownika

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

DIAGNOZA jest prosta jak DRUT, źle napisałeś kod ...

wystarczy spojrzeć chociażby na polecenie sprintf wydawane w przerwaniu, że już o TAKIEJ MASAKRZE jak użycie (kompletnie niepotrzebnie) typu float to samobójstwo ... Ja bym powiedział, że twój program poprawnie działa - albo inaczej ... przewidywalnie ...

propozycje dla ciebie:

1. ZAPOMNIJ że prockach istnieje taki typ zmiennych jak float i uwierz, że bez niego da radę WSZYSTKO zrobić ;) no może prawie wszystko i to z tym, żebyś miał wyniki zmiennoprzecinkowe

2. Obejrzyj sobie ten poradnik:


3. i jeszcze te:
https://www.youtube.com/watch?v=_-rNu2pFTJk
https://www.youtube.com/watch?v=meu-XF5sSOY
https://www.youtube.com/watch?v=J82_Zop9cjE

żebyś zrozumiał jak działają przerwania w prockach i dlaczego nie robi się takiej masakry w przerwaniach ...

domyślam się po tym kodzie, że przesiadasz się świeżo dopiero z andruino na C i pewnie stąd takie błędy

Polecam ci książkę:

http://atnel.pl/mikrokontrolery-avr-jezyk-c.html

od niej warto zacząć

_________________
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: 22 sty 2018, o 17:32 
Offline
Nowy

Dołączył(a): 28 lis 2017
Posty: 7
Pomógł: 0

Dziękuje za odpowiedz Panie Mirku.
Jeśli chodzi o tego float'a rzeczywiście jest tutaj zbędny. Był wcześniej int i funkcja itoa do konwersji na chary i wróciłem do tego. Idąc za Pańskimi radami wyrzuciłem z przerwania ISR(TIMER0_OVF_vect) if'a i wrzuciłem go do while'a. Niestety wyniki pomiarów są identyczne jak wcześniej.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 sty 2018, o 18:53 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 2586
Pomógł: 128

A poprawnie ustawiłeś częstotliwość? Nie masz właczonego jakiegoś podzielnika (jak np /16 lub /2 i /8)?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 sty 2018, o 19:02 
Offline
Nowy

Dołączył(a): 28 lis 2017
Posty: 7
Pomógł: 0

Jeśli pytasz o częstotliwość taktowania procka to zawsze wył. w mkAVR Calculatorze CKDIV 8. A jeśli pytasz o częstotliwość sygnału PWM to wybrałem prescaler /1 czyli 8Mhz/256/1=31250hz. Chyba że nie o to pytasz.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 sty 2018, o 21:32 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1031
Lokalizacja: Trójmiasto
Pomógł: 190

pajmon napisał(a):
if'a i wrzuciłem go do while'a.
i bardzo dobrze ale...
Pytanie czy ten cały if w pętli while wyrabia się w czasie poniżej 1 sekundy (mamy tam operacje na wyświetlaczu +sprint+ wykonywanie pętli jest "siekane" przerwaniami) bo jeśli się nie wyrabia to całość się będzie rozjeżdżać. Musiałbyś po każdym pomiarze zatrzymywać zliczanie wyrzucić wyniki na wyświetlacz i dopiero inicjować kolejny pomiar.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 sty 2018, o 22:27 
Offline
Nowy

Dołączył(a): 28 lis 2017
Posty: 7
Pomógł: 0

xentis a masz jakąś propozycje jak to zrobić? Ja zrobiłem tak że na początku if'a wyzerowałem wszystkie wykorzystane rejestry liczników i na końcu znowu je ustawiłem ale wyniki pomiarów bez zmian takie same ale nie wiem czy dobrze to robię :/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 sty 2018, o 08:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1031
Lokalizacja: Trójmiasto
Pomógł: 190

widzisz zerowanie liczników niewiele tu daje ponieważ w czasie wykonywania ifa przerwania nadal działają i nadal owe liczniki zapełniają, a jeśli if się długo (za długo) wykonuje to zauważ że zanim się skończy wykonywać to w pewnym momencie może dojść do takiej sytuacji że zmienna "overflow" międzyczasie przyjmie już wartość powyżej 122 więc if nie zostanie wywołany przez co cały mechanizm "obróci" dwa razy zanim pobierzesz z niego wynik i go znowu wyzerujesz.
Co do rozwiązania to na początku tego ifa możesz np zatrzymywać oba liczniki wpisując do ich rejestrów "0" pod parametry CSXX, natomiast pod koniec ifa już po wyzerowaniu wszystkiego ponownie je załączyć do pracy. Wówczas będzie pewność że to co ląduje na wyświetlaczu jest efektem pojedynczego cyklu.
Reasumując pomiar będzie wyglądał tak:
1 - start pomiaru
2 - stop pomiaru po jego dokonaniu
3 - obróbka wyniku i jego wyświetlenie
Całość będzie się cyklicznie wykonywać od 1 do 3 przy czym czas wykonywania pkt 3 wpływać będzie jedynie na odświeżanie wyniku na wyświetlaczu a nie na sam pomiar.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 sty 2018, o 09:59 
Offline
Nowy

Dołączył(a): 28 lis 2017
Posty: 7
Pomógł: 0

xentis ja właśnie tak zrobiłem. Na początku if'a wpisałem TCCR0B=0 i TCCR1B=0 a na końcu ustawiłem zgodnie z wcześniejszymi ustawieniami i to nie pomogło.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 sty 2018, o 10:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1031
Lokalizacja: Trójmiasto
Pomógł: 190

ok to może problemem jest taki mały chochlik opisany tu http://atnel.pl/domyslna-promocja-do-typu-int.html
Masz wogule jakiś przyrząd którym możesz dokonać pomiaru częstotliwości (poza oczywiście budowanym)?
Spróbuj zacząć może od testowania tego na niższych częstotliwościach, a dopiero jak będzie działać ok zwiększać - będzie łatwiej szukać problemu...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 sty 2018, o 13:18 
Offline
Nowy

Dołączył(a): 28 lis 2017
Posty: 7
Pomógł: 0

Jutro będę miał dostęp do generatora i oscyloskopu więc może to mi pomoże w odnalezieniu problemu.



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 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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO