Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Bascom, AT89C2051 jak zmierzyć czas impulsu?

Charly 23 Oct 2005 19:39 3796 10
  • #1
    Charly
    Level 18  
    Jak zmierzyć czas impulsu występującego na danym pinie? Impuls ujemny czyli n.p. p3.0=0 ?
  • #2
    hunterhouse
    Level 26  
    to zależy jak długi jest ten impuls i jak dokładnie chcesz to zrobić
    najlepiej jest użyć do tego timera i przerwania (bardzo dokładnie ale zabiera dużp peryferiów) jka impuls jest dość długi i niemusi być idealnie zmieżony to można zrobić procedurkę w asm.
    wszystko zależy od parametrów impulsu i oczekiwananej dokładności.

    a tak wogóle to zobacz na elektrodzie (magiczny przycisk szukaj) napewno już o tym było :)
  • #3
    Charly
    Level 18  
    No więc tak, przypuszczam że jestem na forum , a nie w encyklopedii, jakbym chciał gadać z maszyną, a nie z człowiekiem to na pewno bym użył przycisku szukaj, to jest raz, a dwa czas to jest 1 sekunda czyli 1000ms albo jak kto woli 1000000us, dla jasności.
  • #4
    hunterhouse
    Level 26  
    więc tak jak kolega będzie niegrzeczny to napewno nikt ci nie pomoże.

    rozwiązanie twojego problemu może być funkcja bascoma
    Code:
    PULSEIN  var , PINX , PIN , STATE
    

    ale ona jest dość mało dokładna i zależy od kwarcu.

    ja bym ci proponował zrobić tak ustawic timer w tryb timera i tak dobrać preskaler aby napewno nienastąpiło przepełnienie.
    następnie dodać instrukcje warunkową w pętli która po odbioże zbocza opadającego uruchomi timer i będzie czekać na zbocze opadające

    według mnie pominno to wyglądać tak.
    Code:


    do
    if px.x=0 then
    start timerx
    exit do
    loop

    do
    if px.x=1 then
    stop timerx
    exit do
    loop

    i teraz w timerze będziesz miał czas który należy przeliczyć na sekundy zależnie od preskalera i kwarcu.

    zamiast tych pętli można zastosować przerwanie do startowania i stopowania timera.

    w AVR jest taka możliwość aby timer sam liczył czas impulsu wejściowego. ale jak sprawa wygląda w '51 to nie wiem.
  • #5
    Charly
    Level 18  
    No właśnie, nie wiem dlaczego Kolega jest niegrzeczny, natomiast Twoja odpowiedź jak najbardziej będzie mi pomocna, z ty że to pierwsze czyli PulseIn w Bascom 8051 nie występuje, więc użyję Twojej drugiej rady. Jak na razie dzięki.
    P.S.
    Jak się to robi(szukałem i nie znalazłem), żeby dodać Komuś, że mi pomógł ???? Może już za stary jestem ?
  • #6
    zumek
    Level 39  
    hunterhouse wrote:

    ...
    ja bym ci proponował zrobić tak ustawic timer w tryb timera i tak dobrać preskaler aby napewno nienastąpiło przepełnienie.
    ...
    w AVR jest taka możliwość aby timer sam liczył czas impulsu wejściowego. ale jak sprawa wygląda w '51 to nie wiem.

    Oj :D
    Coś Ci się chyba po....myliło ;)

    Piotrek
  • #7
    hunterhouse
    Level 26  
    cytat z noty katalogowej ATMega8
    Quote:
    Input Capture Unit
    The Timer/Counter incorporates an input capture unit that can capture external events
    and give them a time-stamp indicating time of occurrence. The external signal indicating
    an event, or multiple events, can be applied via the ICP1 pin or alternatively, via the
    analog-comparator unit. The time-stamps can then be used to calculate frequency, dutycycle,
    and other features of the signal applied. Alternatively the time-stamps can be
    used for creating a log of the events.


    chodziło mi o to.
    ta funkcja jest dostępna napewno w AVR a czy jest w '51 to już pisałem że nie wiem bo mało się nimi zajmuje.
    mam nadzieje że teraz się rozumiemy :)

    NARA'zie
  • #8
    Charly
    Level 18  
    Coś Ci się chyba po...myliło ;)

    Piotrek[/quote]
    A, witam Kolegę, czytałem już nie raz, ani nie ...(ilość razy) Twoje odpowiedzi co mnie utrwaliło w opinii że jesteś Fachurą, w tych sprawach.
    Myślę że Ty na pewno mi (raczkującemu) w tej dziedzinie mi pomożesz.
  • Helpful post
    #9
    zumek
    Level 39  
    hunterhouse W AVR-ach sprzętowo można zatrzasnąć zawartość timera , ale uruchomić zliczanie trzeba programowo.Natomiast w 51-ce można uruchomić i zatrzymać timer sprzętowo.Jeśli na P3.3 jest stan wysoki i flaga GATE timera1 jest ustawiona , to timer zlicza doputy , dopuki stan na P3.3 nie zmieni się na niski.Problem jest tylko z tym , że Charly chce mierzyć czas trwania stanu niskiego :| Można to obejść , stosując jakikolwiek negator w postaci choćby 1-go tranzystora z "osprzetem".
    Charly
    Nie wiem czy Twój proc ma wykonywać to jedno zadanie , czy ma jeszcze inne "obowiązki" :D
    Spróbuj może tego :?:
    Code:

    $crystal = 12000000
    $regfile = "89c2051.dat"
    Dim T1ov As Byte , Cnt1 As Word
    Config Timer1 = Timer , Mode = 1 , Gate = Internal
    On Timer1 T1_int Nosave
    Enable Timer1
    Enable Interrupts
    Impuls Alias P3.0
    Counter1 = 0

    Do
       While Impuls = 1 : Wend       'czekamy dopuki P3.0=1
       T1ov = 0
       Start Timer1
       While Impuls = 0 : Wend       'czekamy dopuki P3.0=0
       Stop Timer1
       Cnt1 = Counter1
       Counter1 = 0
       'Tu sobie obliczamy jaki to czas uplynąl
       'T1ov * 65536 + Cnt1 = zliczone cykle maszynowe przez T1
       'Dla kwarcu 12MHz czas trwania "0" na P3.0 <= ~1.6 s ,
       'bo jeśli dluższu to T1ov się przepelni i wyjdzie kicha ;)
    Loop

    T1_int:
    Incr T1ov       'ilość przepelnień T1
    Return


    Piotrek

    PS
    Wszystkie dane i numery, bitów dotyczą tytułowego bohatera ;)
  • #10
    Charly
    Level 18  
    O ! Właśnie o coś takiego mi chodziło (nawet trafiłeś z częst. kwarcu), nie, nie na pewno czas powyżej 1 sek nie wchodzi w grę(raczej msek). To już chyba jutro będę sprawdzał w użyciu(południe się zbliża). O dzięki za pomoc i pozdrawiam !!!!
  • #11
    robiw
    Level 26  
    ... " męczysz" temat długości czasu wtrysku ;-)...? robiw