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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 4 maja 2025, o 08:37


    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 ] [ Zaznacz wszystko ]
    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: 27378
    Lokalizacja: Szczecin
    Pomógł: 1043

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