Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[Atmega32][Bascom] - Pomiar czasu przejazdu.

Hopen 28 Apr 2013 21:20 2820 10
  • #1
    Hopen
    Level 12  
    Witam,
    Mam mały problem. Pewnie za bardzo kombinuje ale może pomożecie.
    Mianowicie chce mierzyć czas przejazdu pomiędzy bramkami.
    Wykorzystuje Atmega32 (bo taką mam na płytce testowej) a docelowo ma być Atmega8.
    Czas startu i mety wykonuje za pomocą przycisku na przerwaniach INT.
    Niestety program nie liczy mi czasu tylko "coś" sam sobie liczy max do wartości 0,9, są to wartości losowe.
    Kwarc zewnętrzny 16MHz i fuse bity ustawione.

    Code: vbnet
    Log in, to see the code


    W czym może być problem?
  • #2
    xury
    Automation specialist
    Pomyślałeś o tym, że przycisk zanim na stałe załączy styk ma drgania, które zwierają i rozwierają go nawet kilkanaście razy w ciągu kilku milisekund ?
    Po drugie wyświetlanie na LCD w pętli DO...LOOP odbywa się za szybko. LCD potrzebuje czasu na odświeżenie danych oraz na oczyszczenie ekranu.
    Zezwolenie na aktualizację wyświetlacza powinno być zrealizowane po zakończeniu pomiaru.
  • #3
    Hopen
    Level 12  
    Przyciski są tymczasowe tylko, i w programie dopisałem, że są w stanie 1.
    Wynik wyrzuciłem z pętli głównej ale wtedy pokazuje mi tylko 0,0.
  • #4
    xury
    Automation specialist
    Co z tego, że są "w stanie 1"?
    No zgadza się, że przyciski są tylko tymczasowo, ale one mogą załączyć podczas jednego naciśnięcia przerwanie nawet kilkaset razy. W dodatku w przerwaniu masz operację mnożenia na zmiennej SINGLE co nie jest dobrym rozwiązaniem.
    Jeszcze raz sugeruję by wywalić LCD z pętli. Najlepiej ją zostawić pustą.
    Wynik wyświetlać TYLKO po dokonaniu pomiaru, a mnożenie przeprowadzać poza podprogramem obsługi przerwania, i po wywołaniu pierwszego przerwania na danym INT blokować kolejne przerwanie do chwili zakończenia pomiaru.
  • #5
    emarcus
    Level 38  
    Hopen wrote:
    Witam,
    Mam mały problem. Pewnie za bardzo kombinuje ale może pomożecie.
    Mianowicie chce mierzyć czas przejazdu pomiędzy bramkami.
    Wykorzystuje Atmega32 (bo taką mam na płytce testowej) a docelowo ma być Atmega8.
    Czas startu i mety wykonuje za pomocą przycisku na przerwaniach INT.
    Niestety program nie liczy mi czasu tylko "coś" sam sobie liczy max do wartości 0,9, są to wartości losowe.
    Kwarc zewnętrzny 16MHz i fuse bity ustawione.

    Code: vbnet
    Log in, to see the code


    W czym może być problem?


    Czy faktycznie potrzebujesz aż tak wysoką dokładnośc/rozdzielczośc (0.0625uS)?

    Spróbuj przeanalizowac ten przykład:

    [code]
    Code: vbnet
    Log in, to see the code


    Możesz to sobie 'przeformatowac' na swój sposób.

    e marcus
  • #6
    Hopen
    Level 12  
    Koncepcja liczenia się zmieniła.

    Liczenie odbywa za pomocą:
    Code: vbnet
    Log in, to see the code


    Wyświetlanie zrobione w pętli głównej tak samo jak inicjacja startu i stopu stopera.

    Na bieżąco poszerzam program o dodatkowe funkcje.
    Na razie zamykam temat do momentu pojawienia się problemu :)

    Dodano po 51 [minuty]:

    No i napotkałem problem.

    Coś źle robię. Chce zapisać pomiar czasu jako jedna zmienna, która będzie mi potrzebna do następnych obliczeń. Próbowałem tak ale wyskakują błędy.

    Pomiar = Sekundy_d + " " + Sekundy_j "" + Setne_d "" + Setne_j

    Jak i :

    Pomiar= pomiar + str (sekundy_d)
    pomiar = pomiar + str (sekundy_j)

    wtedy to już kosmiczne wyniki mam.

    Jak to zapisać poprawnie ?
  • #7
    emarcus
    Level 38  
    Hopen wrote:
    Koncepcja liczenia się zmieniła.



    Coś źle robię. Chce zapisać pomiar czasu jako jedna zmienna,

    Pomiar = Sekundy_d + " " + Sekundy_j "" + Setne_d "" + Setne_j

    Jak i :

    Pomiar= pomiar + str (sekundy_d)
    pomiar = pomiar + str (sekundy_j)

    wtedy to już kosmiczne wyniki mam.

    Jak to zapisać poprawnie ?


    Po pierwsze: Bascom akceptuje tylko jedną operacje arytmetyczną w jednej linii.
    Po drugie: Żaden kompiler (BASIC albo C) nie akceptuje działań arytmetycznych na różnego rdzaju zmiennych - zmienna numeryczna i string w jednym wielomianie, gdzie wynik jest oczekiwany jako zmienna numeryczna.
    Zmienna string jest traktowana jako text. Tylko my (ludzie) mamy wyuczoną zdolnośc do rozwiąznania wyrażenia: "2 + siedem=___"; processor takiego wyrażenia nie rozpoznaje, dlatego masz wyniki z kosmosu.

    Ps. Co jest złego w przykładzie, który podałem wyżej?

    e marcus
  • #8
    Hopen
    Level 12  
    Złego jest to, że nie jest to mój wynik czasu zapisany jako jedna zmienna w postaci dziesiętnej.

    Potrzebuję tego, aby później porównywać ten wynik zapisanymi z innymi danymi i zależności od tego czasu zmierzonego będzie wykonywać inne zadania.

    Nie wiem jak to rozwiązać.
  • #9
    emarcus
    Level 38  
    Hopen wrote:
    Złego jest to, że nie jest to mój wynik czasu zapisany jako jedna zmienna w postaci dziesiętnej.

    Potrzebuję tego, aby później porównywać ten wynik zapisanymi z innymi danymi i zależności od tego czasu zmierzonego będzie wykonywać inne zadania.

    Nie wiem jak to rozwiązać.


    Więc tak jak pisałem: przeformatuj wynik!
    Zmień wymiar zmiennej 'Del' na:

    Dim Del as single

    dodaj w części rachunkowej wyniku przed 'display delay ' jedno działanie rachunkowe dzielenia microsecund przez 1 000 000 i otrzymasz wynik dziesiętny wyrażony w secundach.

    Del = Del / 1000000
    'Display delay

    wyeliminuj znak µ z wyświetlenia LCD pozostawiając Sec.
    Przed wyświetleniem wyniku możesz go sformatowac do dowolnej ilości miejsc dziesiętnych stosując instrukcje "Format" albo "Fusing".
    W symulatorze powinieneś otrzymac cos takiego:
    [Atmega32][Bascom] - Pomiar czasu przejazdu.

    Czy to zadowoli twoje wymagania?

    e marcus
  • #10
    Hopen
    Level 12  
    Coś mi nie wychodzi chyba w złym momencie kody wpisuje Twoje podpowiedzi kolego "emarcus".

    Code: vbnet
    Log in, to see the code
    [/code]
  • #11
    Hopen
    Level 12  
    nie mogę sobie z tym poradzić.
    Ktoś może wie jak zmodyfikować mój kod aby czas był jako jedna zmienna?

    Dodano po 1 [godziny] 25 [minuty]:

    udało mi się zmienić na zmienna typu string ale niestety tą zmienną nie mogę użyć w działaniach matematycznych :(
    Jak można to zrobić inaczej aby czas minuty i sekundy które u mnie są jako osobne zmienne zamienić na jedną i np.do niej dodać inną zmienną lub podzielić?

    Dodano po 1 [godziny] 38 [minuty]:

    Dziękuję wszystkim temat zamykam, rozwiązałem sprawę :)

    A było to takie proste :D
    Dodanie kilku działań i wyszło.

    Pozdrawiam i dziękuję wszystkim za wszelką pomoc,