logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[C] Projekt pulsometru - timer1

Eres1989 02 Sty 2012 12:56 1906 5
  • #1 10336976
    Eres1989
    Poziom 10  
    Witam,
    Postanowiłem tutaj napisać, ponieważ mam problem z timerem1. Napisałem program zgodny z algorytmem, który umieściłem poniżej (układ ma zliczać impulsy na wejściu, następnie je uśredniać, a wynik wyświetlać). Póki co testuje go na ISISie i jedyne co pojawia mi się na wirtualnym wyświetlaczu to wynik -1. Tak jak wspomniałem w pierwszym zdaniu, podejrzewam, że coś poknociłem z inicjacją timera :/
    Dodatkowo, aby to sprawdzić napisałem kolejny program, aby zweryfikować swoje podejście do zagadnienia zliczania. Po odpaleniu go w symulatorze - owszem, widać było jak zmienna b inkrementuje się zgodnie z przerwaniami (b wzrastało), jednak były to stanowczo za wolne zmiany (przy pomiarze trwającym 1 sekunde, timer zliczył zaledwie 40 przepełnień, choć winien ich zliczyć 1000 => jedno przepełnienie winno wystąpić przy 1ms).
    Czy mógłby ktoś sprawdzić chociaż pobieżnie mój kod i stwierdzić gdzie robie błąd (błedy) ? Z góry dziękuje, pozdrawiam.

    P.S. Używam AVR Studio 5 do kompilacji i programuje ATmege16 (choć docelowo będzie to ATmega8).
    Algorytm:
    [C] Projekt pulsometru - timer1

    Kod programu:
    [code]
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #2 10340027
    Eres1989
    Poziom 10  
    Nikt nie wie gdzie może być błąd ? :|
  • #3 10343311
    Wojtek75
    Poziom 24  
    Algorytm sobie daruje.

    Co do kodu.
    To jest źle:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Chcesz skorzystać z Timer1 odwołujesz się do właściwego rejestru TCCR1B ale ustawiasz bity prescalera których w tym rejestrze nie ma. Za to znajdują się w rejestrze Timer0. Sprawdź w nocie jak ma wyglądać ta konfiguracja prawidłowo.
  • #4 10348988
    Eres1989
    Poziom 10  
    Witam,
    Dokonałem zmiany zgodnie z danymi katalogowymi na:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Wynik działania: t=240000/b (gdzie b: ilość zliczonych przepełnień), nadal wynosi -1. Dodatkowo wyświetliłem sobie samą ilość zliczeń (b) i wychodzi cały czas 0 - jedynie w tym wątku dokonała się jakaś zmiana bo wczoraj ciągle pojawiała się wartość ujemna :|
  • #5 10349099
    snnaap
    Poziom 25  
    Eres1989 napisał:
    Witam,
    Dokonałem zmiany zgodnie z danymi katalogowymi na:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Wynik działania: t=240000/b (gdzie b: ilość zliczonych przepełnień), nadal wynosi -1. Dodatkowo wyświetliłem sobie samą ilość zliczeń (b) i wychodzi cały czas 0 - jedynie w tym wątku dokonała się jakaś zmiana bo wczoraj ciągle pojawiała się wartość ujemna :|



    Co się stanie jak b=0 ?? Dzielisz przez zero:D i dlatego masz wynik -1;
    Przeanalizuj swój program jeszcze raz.
    Taka mała podpowiedz - ważny jest czas impulsu podawanego na PORTD.
    Co się stanie gdy czas impulsu jest zbyt długi?
  • #6 10349200
    Eres1989
    Poziom 10  
    Cytat:
    Co się stanie jak b=0 ?? Dzielisz przez zero:D i dlatego masz wynik -1;

    No racja, z mojego zdania wyszło troche masło maślane :D Ehh przysiąde jutro do tego i będę skrupulatnie sprawdzał kod linia po linii (dzisiaj już czasu nie mam).
REKLAMA