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 przesunięcia dwóch sygnałów

30 Mar 2010 17:43 1371 2
  • Poziom 10  
    Witam. Próbuję napisać program odpowiedzialny za pomiar odcinków czasowych pomiędzy impulsami sygnału S1 i S2 (zgodnie z załącznikiem).

    Proszę o prześledzenie kodu, wszelkie uwagi i sugestie mile widziane. Nie mam pewności co do poprawności pobierania wartości licznika TIMER1 za pomocą TCNT1.
    Code:

    'program do pomiaru okresu sygnałów podpiętych do PD.2(INT0) i PD.3(INT1).

    $regfile = "M8def.dat"
    $crystal = 8000000
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db7 = Portc.0 , Db6 = Portc.1 , Db5 = Portc.2 , Db4 = Portc.3 , E = Portc.4 , Rs = Portc.5

    Dim A(5) As Word                                            'czas pomiędzy impulsami s1 s21 s22 s23 s24 s25
    Dim B(5) As Byte                                            'przepełnienia impulsów s1 s21 s22 s23 s24 s25
    Dim Przep As Byte                                           'przepełenienie
    Dim Index As Byte                                           'index talicy

    Config Int0 = Rising                                        'sygnał s1 - narastające zbocze  (Falling - opadające)
    Config Int1 = Rising                                        'sygnał s2 - narastające zbocze

    Config Pind.2 = Input
    Config Pind.3 = Input                                       'A tu ustawiamy podciąganie wejść przez rezystory wewnątrz procesora
    Set Portd.2
    Set Portd.3
    Config Timer1 = Timer , Prescale = 1024

    Przep = 0
    Index = 1
    Timer1 = 0                                                  'Ustawiamy licznik
    Stop Timer1

    Enable Interrupts
    Enable Int0
    Enable Int1

    On Int0 S1                                                  'pomiar czasu sygnału s1
    On Int1 S2                                                  'pomiar czasu sygnału s2
    On Timer1 P1

    Cls
    Lcd "OK"
    Waitms 500
                                                                  'głowna pętla
    Do
    Loop
    End


    S1:                                                         'było przerwanie- impuls s1 - licznik zaczyna liczyć

    Timer1 = 0
    Start Timer1
    Return


    S2:                                                         'było drugie przerwanie- impuls s2

    A(index) = Tcnt1                                            'odczytanie wartości licznika
    B(index) = Przep
    Incr Index                                                  'interesują mnie czasy tylko dla jednego okresu S1
    If Index = 6 Then
    Stop Timer1
    Cls                                                         'wyświetlamy zawartość licznika
    Lcd "tu beda wyswietlane wyniki obliczen"                   'będzie dopisany kawałek kodu odpowiedzialny za przeliczenie
    Waitms 15                                                   'czasów na interesujące mnie przesunięcie między sobą sygnału S1 i S2
    Index = 1
    Przep = 0
    End If
    Return


    P1:                                                         'było przepełnienie timer1

    Incr Przep                                                  'zliczanie przepełnienia zegara
    Return
  • Poziom 19  
    Podaj więcej informacji, do czego chcesz wykorzystać ten program .
    Bo moim zdaniem :
    Jeśli się chce coś skomplikować to chyba Tobie się udało.
  • Poziom 10  
    Problem rozwiązany.

    Najlepiej sprawdziło się, użycie kilku pętli Do Loop
    Code:


    Do
    Loop Until S2 = 0

    Do
    Loop Until S2 = 1
    Timer1 = 0

    Do
    Do
    Loop Until S1 = 1
    Do
    Loop Until S1 = 0
    Incr A
    L(a) = Icr1l
    H(a) = Icr1h
    Loop Until A = 6

    Do
    Loop Until S2 = 1

    ' Wykonanie obliczeń oraz wyświetlenie wyniku
    Wait 1
    A = 0


    Loop