Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[atmega8][bascom]pomiar impulsów

13 Wrz 2010 13:37 1656 2
  • Poziom 8  
    Problem polega na tym, aby pomierzyć ilość impulsów jaka upływa pomiędzy kolejnymi pomiarami czujnika. Chodzi o to żeby timer1 zliczający impulsy po wykonaniu pomiaru przez czujnika wyświetlał ich ilość, a następnie zliczał kolejne impulsy upływające do wykonania 2 pomiaru itd. Zamiast czasu podawać na monitor zliczone impulsy pomiędzy kolejnymi pomiarami. Poniżej załączam kod programu z obsługą czujnika plus odmierzanie 1s przez timer1. Ktoś ma jakieś pomysły jak to zrealizować ??

    Code:

       $regfile = "m8def.dat"
       $crystal = 8000000
       $lib "i2c_twi.lbx"
       $baud = 9600

       'deklaracja adresu I2C dla czujnika
       ...
       ...

       'globalne zezwolenie na przerwania
       Enable Interrupts

       'konfiguracja interfejscu I2C
       Config Scl = Portc.5
       Config Sda = Portc.4
       Config Twi = 100000
       I2cinit

       'deklaracja procedur i funkcji 
       Declare Sub Sonar_pomiar
       Declare Function Sonar_odczyt() As Word
     
       'pętla głowna
       'odbsługa timera1 do odmierzania czasu 1s

       Dim I As Integer
       Dim Sekundy As Long
       Tccr1a = &H00
       Tccr1b = &H0C

       Ocr1ah = &H7A    'wpisujemy wartość 31250 (7A12) po zliczeniu której mamy 1s
       Ocr1al =  &H12

       On Oc1a Odmierzamy
       Enable Compare1a

       Tcnt1h = &H00
       Tcnt1l =  &H00
       
       Do

       For I = 1 To 5000
       Call Sonar_pomiar
       Print "pomiar " ; I ; "  dystans  " ; Sonar_odczyt() ; "   sekundy  " ;  Sekundy
       Next I
       Loop

       Odmierzamy:
       Incr Sekundy
       Return

      'procedura wykonania pomiaru przez czujnik
       ...
       ...


     'funkcja odbioru pomiaru w postaci 2 bajtów i zapisu do zmiennej typu word
      ...
      ...

  • Poziom 11  
    witam
    jest proste w asm ale w c też nie powinno być problemu.
    Przerwania INT0 i INT1 mogą być wyzwalane zmianą stanu napięcia wysokim
    lub stanem niskim .
    Odpowiednio ustawić bit w rejestrze MCUCSR.
    Ustawić bit aktywujący przerwanie w rejestrze GICR.
    mierzysz czas przez odczyt TIMERa
  • Poziom 8  
    Po długim analizowaniu problemu narodziło mi się coś takiego:

    Code:

       'pętla główna
     
       Dim I As Integer
       Dim Impulsy As Long
       Dim Sek As Integer
       Tccr1a = &H00            'ustawianie trybu pracy timera1
       Tccr1b = &H0C

       Ocr1ah = &H7A            'załadowanie liczby 31250 do licznika
       Ocr1al =  &H12            'przykładowa liczba do odmierzania (1s)

       Tcnt1h = &H00            ' zerowania rejestrów do zliczania
       Tcnt1l = &H00

       Do
       Disable Compare1a
       For I = 1 To 5000
       Impulsy = Timer1     'odczyt aktualnej zawartości licznika

       Tcnt1h = &H00        'zerowanie rejestrów
       Tcnt1l = &H00

       Sek = Impulsy / 31.25     'przeliczenie impulsów na milisekundy
       Call Sonar_pomiar
       Print " pomiar ";I;"  dystans  ";Sonar_odczyt();"  impulsy ";Impulsy;" ms "; Sek
       Next I
       Enable Compare1a
       Loop


    Odziw program napisany w ten sposób zlicza mi ilość impulsów pomiędzy pomiarami oraz wyświetla czas. Po weryfikacji okazało się, że odmierza z dużą dokładnością co do jednego taktu. Choć zauważyłem że jak umieszczam dodatkowe linie poleceń w pętli głównej pomiędzy przerwaniami, ilość zliczonych impulsów zwiększa się, tak jakby dodatkowe polecenie w pętli głównej wydłużyło czas operacji zliczania. Są to małe wartości równe po przeliczeniu 2-3 ms.