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? 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 9 lip 2025, o 18:44


    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 7 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