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

[atmega8][bascom] Pomiar przesunięcia dwóch sygnałów

rekja 30 Mar 2010 17:43 1554 2
REKLAMA
  • #1 7899483
    rekja
    Poziom 11  
    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.
    
    '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
    
  • REKLAMA
  • #2 7906976
    szun
    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.
  • #3 8221295
    rekja
    Poziom 11  
    Problem rozwiązany.

    Najlepiej sprawdziło się, użycie kilku pętli Do Loop
    
    
    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
    
REKLAMA