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ę.
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
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.
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.
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.
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ę :/
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.
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.
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...
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