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

Jak zliczać impulsy z dwóch wejść i czas trwania z trzeciego w 89C2051?

_Arecki_ 02 Lis 2005 22:10 2176 11
REKLAMA
  • #1 1950107
    _Arecki_
    Poziom 15  
    Posty: 247
    Pomógł: 1
    Ocena: 110
    Witam

    Czy da się w 89C2051 uzyskać coś takiego:
    potrzebuję zliczać impulsy z dwóch wejść i do tego zliczać czas trwania impulsu z trzeciego wejścia, a poza tym wszystko wyświetlać co jakiś czas (powiedzmy co 0,5s)
    Można jeden timer użyć jako timer wewnętrzny (wyświetlanie co jakiś czas), a drugi jako timer bramkowany zewnętrznie (do liczenia czasu trwania impulsu), ale wtedy tracę jedno wejście int.
    Czy da się to jakoś inaczej rozwiązać? (oprócz badania w pętli głównej stanu portu)

    Przejrzałem archiwum, szukałem w necie, ale nie znalazłem nic zadowalającego.

    PS.
    Próbowałem różne konfiguracje:
    Config Timer0 = Timer , Mode = 1 , Gate = Internal
    - nie reaguje na żadne sygnały zew. liczy impulsy wew.
    Config Timer0 = Timer , Mode = 1 , Gate = External
    - bramkowany przez Int0, liczy impulsy wew.
    Config Timer0 = Counter , Mode = 1 , Gate = Internal
    - liczy impulsy z P3.4 (liczy zbocza, a nie czas trwania impulsu)
    Config Timer0 = Counter , Mode = 1 , Gate = External
    - to co wyżej, ale bramkowany dodatkowo poprzez Int0

    Takie efekty uzyskałem w bascomie, czy w asm można skonfigurować timery inaczej?
    Chciałbym mieć 2 wejścia przerwań i trzecie wejście do bramkowania timera/countera.

    PS2.
    Jeszcze jedno pytanie, co to jest "timer 0 input" lub "timer 1 input"?
    Oto fragment dokumentacji:
    P3.2 INT0 interrupt 0 input/timer 0 gate control
    P3.3 INT1 interrupt 1 input/timer 1 gate control
    P3.4 T0 timer 0 input or counter input
    P3.5 T1 timer 1 input or counter input
    Czy to jest generowanie przerwania dla timera, gdy skonfigurowany jest jako external?

    Pozdrawiam
    Arek
  • REKLAMA
  • #2 1952204
    Zaquadnik
    Poziom 27  
    Posty: 998
    Pomógł: 103
    Ocena: 25
    Timer input jest to wejście zegarowe dla timera, który w tym trybie jest po prostu taktowany jakimś zegarem zewnętrznym. Czas trwania impulsu zliczasz wykorzystując właśnie bramkowanie, natomiast jeśli chodzi o zliczanie równoczesne impulsów z zewnątrz to musiałbyś mieć 2 timery, nie 1. Można zrobić to tak: wejścia przerwań zewnętrznych reagują na zbocza opadające. Można, generując przerwania, w procedurach ich obsługi zwyczajnie zliczać impulsy w dowolnych rejestrach (rozkaz inc) (oczywiście wypadałoby pościć sygnał na wejścia INT poprzez inwertery, jeśli zależy Ci na zboczu narastającym). Tutaj są jednak ograniczenia, bo częstotliwość przebiegu nie może przekraczać tak na oko 1/4 częstotliwości cyklu rozkazowego (fosc/12) (wykonanie rozkazów call i reti). Do szybszego przebiegu zawsze możesz wykorzystać wolny timer. A jeśli bardzo zależy Ci na liczeniu szybszych przebiegów to użyj mikrokontrolera opartego na rdzeniu 8052 (np. AT89S52 lub AT89C52), on ma 3 timery i takie coś załatwisz bez problemów sprzętowo. W asemblerze bez problemów załatwisz takie coś. Tam możesz skonfigurować wszystko jak Ci sie podoba ;) Jak będziesz potrzebował pomocy, to pisz :) Pozdrawiam.
  • #3 1952415
    _Arecki_
    Poziom 15  
    Posty: 247
    Pomógł: 1
    Ocena: 110
    Zaquadnik napisał:
    (...) Czas trwania impulsu zliczasz wykorzystując właśnie bramkowanie, natomiast jeśli chodzi o zliczanie równoczesne impulsów z zewnątrz to musiałbyś mieć 2 timery, nie 1. (...)


    Mam dwa timery, problem w tym, że mam za mało wejść int :)
    Ten uC ma dwa timery i dwa wejścia int, tyle że bramkowanie timera następuje poprzez wejście int, przez co jeśli korzystam z bramkowania timera to automatycznie odpada mi jedno wejście int.

    Pozdrawiam
    Arek
  • REKLAMA
  • #4 1952530
    nojmi
    Poziom 20  
    Posty: 473
    Pomógł: 9
    Ocena: 18
    Brakuje Ci jednego wejcia int. Ja bym przy nadejciu impulsu z jednego zrodla zerowal jednoczesnie int i jakis tam inny pin procesora. Przy nadejsciu impulsu z drugiego zrodla zerowal tylko int. W zaleznosciu od stanu tego innego pinu przy wywolaniu przerwania naliczal bym inne impulsy.
  • REKLAMA
  • #5 1952639
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Gdybyś podał parametry graniczne impulsów o których wspominasz , to było by łatwiej coś wykoncypować :D

    Piotrek
  • REKLAMA
  • #6 1952653
    _Arecki_
    Poziom 15  
    Posty: 247
    Pomógł: 1
    Ocena: 110
    nojmi, Twoje rozwiązanie jest bardzo ciekawe, jednak wadą jego jest możliwość pominięcia impulsu, jeśli obydwa przyjdą jednocześnie.
    Co prawda w moim przypadku nie występują one często, jeden z f = 30 - 200Hz, drugi f = 0 - 700Hz (ten musiałby iść przez układ różniczkujący, bo przy f bliskim/równym 0 czas impulsu jest bardzo długi i może blokować wejście int).
    Pomyśle nad tym, jeśli nie wyjdzie to co chcę zrobić.

    Pozdrawiam
    Arek
  • #7 1952732
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Impulsy o takich częstotliwościach , spokojnie policzysz jednym timerem nie gubiąc ani jednego.Warunek- częstotliwość przerwań tego timeramusi być większa od częstotliwości "najszybszego" impulsu , czyli w Twoim przypadku 1000Hz spoko wystarczy Równocześnie ten timer może odmierzać czas odświerzania wyświetlacza czyli 3 w 1 :D

    Piotrek
  • #8 1952783
    _Arecki_
    Poziom 15  
    Posty: 247
    Pomógł: 1
    Ocena: 110
    Czy możesz zdradzić w jaki sposób można to zrobić?
    Czy mam sprawdzać przy każdym przerwaniu timera, czy na którymś z wejść nie pojawił się impuls?
    Zbyt częste generowanie przerwań jest niewskazane, ponieważ program ma po za tym wykonywać inne instrukcje, a do tego ma być jeszcze pomiar długości impulsu na drugim timerze (w miarę dokładny pomiar).

    Arek
  • #9 1952918
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Wydaje mi sie , że ... Twój projekt ma chyba coś wspólnego z samochodem hmmm...:?:
    Do rzeczy:
    _Arecki_ napisał:
    Czy możesz zdradzić w jaki sposób można to zrobić?
    Czy mam sprawdzać przy każdym przerwaniu timera, czy na którymś z wejść nie pojawił się impuls?

    Gdybyś zliczał impulsy kierując się stanem pinu , wyszły by Ci herezje.
    Trzeba programowo zliczać zmianę stanu pinu z np. "1" na "0" lub na odwrót.
    _Arecki_ napisał:

    Zbyt częste generowanie przerwań jest niewskazane, ponieważ program ma po za tym wykonywać inne instrukcje, a do tego ma być jeszcze pomiar długości impulsu na drugim timerze (w miarę dokładny pomiar).

    Arek

    Częstotliwość występowania przerwań , ma drugorzędne znaczenie jeśli chodzi o "wydajność" programu głównego.Zasadnicze znaczenie ma stosunek czasu wykonania się przerwania , do czasu(częstości) z jakim zostaje wywołane.Zresztą to wszystko zależy od tego , co proc ma do wykonania.

    Piotrek

    PS
    Mała poprawka ;)
    Częstotliwość przerwań nie 1000Hz , 2x700 < 1500 :D
  • #10 1952990
    _Arecki_
    Poziom 15  
    Posty: 247
    Pomógł: 1
    Ocena: 110
    zumek napisał:
    Wydaje mi sie , że ... Twój projekt ma chyba coś wspólnego z samochodem hmmm...:?:

    Zgadza się.

    zumek napisał:
    Gdybyś zliczał impulsy kierując się stanem pinu , wyszły by Ci herezje.
    Trzeba programowo zliczać zmianę stanu pinu z np. "1" na "0" lub na odwrót.

    Tak właśnie napisałem "sprawdzanie czy nie pojawił się impuls", czyli wykrycie zmiany stanu, problem jeśli impuls jest krótszy niż okres sprawdzania.

    zumek napisał:

    Częstotliwość występowania przerwań , ma drugorzędne znaczenie jeśli chodzi o "wydajność" programu głównego.Zasadnicze znaczenie ma stosunek czasu wykonania się przerwania , do czasu(częstości) z jakim zostaje wywołane.

    No tak, ale każde wywołanie przerwania zmniejsza ilość czasu na wykonywanie programu głównego, do tego dochodzi czas przejścia do przerwania i powrotu z niego.

    No ale dość tego teoryzowania, okaże się w praktyce czy działa.

    zumek napisał:
    PS
    Mała poprawka ;)
    Częstotliwość przerwań nie 1000Hz , 2x700 < 1500 :D

    Częstotliwość Nyquista?

    Pozdrawiam
    Arek
  • Pomocny post
    #11 1953061
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Czyli zgodnie doszliśmy do wniosku , że stan pinu wejściowego , należy testować =>1 dla każdego z jego stanów.Najlepiej gdy sygnał jest prostokątny(50/50).

    Piotrek
  • #12 2268402
    _Arecki_
    Poziom 15  
    Posty: 247
    Pomógł: 1
    Ocena: 110
    Ostatecznie zrobiłem tak jak proponował zumek.

    Cały problem i jego rozwiązanie opisane jest w powyższych postach, więc nie będę się tu rozpisywał.
    Mam nadzieję, że przydadzą się te informacje komuś.

    Bardzo dziękuję wszystkim za pomoc.

    Temat zamykam.

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy problemu zliczania impulsów z dwóch wejść oraz pomiaru czasu trwania impulsu z trzeciego wejścia w mikrokontrolerze 89C2051, który posiada ograniczoną liczbę timerów i wejść przerwań zewnętrznych (INT). Użytkownik rozważał wykorzystanie jednego timera jako wewnętrznego do okresowego wyświetlania danych oraz drugiego timera bramkowanego zewnętrznie do pomiaru czasu trwania impulsu, jednak bramkowanie wymaga użycia wejścia INT, co ogranicza dostępność przerwań do zliczania impulsów. Wskazano, że do zliczania impulsów z dwóch źródeł jednocześnie potrzebne byłyby co najmniej dwa timery lub więcej wejść przerwań, których 89C2051 nie posiada. Zaproponowano alternatywne rozwiązanie polegające na zliczaniu impulsów w procedurach obsługi przerwań zewnętrznych reagujących na zbocza sygnału, wykorzystując rejestry do inkrementacji liczników. Wskazano ograniczenia częstotliwości impulsów ze względu na czas obsługi przerwań i cykl rozkazowy. Zaproponowano także metodę rozróżniania impulsów z dwóch źródeł poprzez zerowanie i sprawdzanie stanu dodatkowego pinu procesora w obsłudze przerwania INT, co pozwala na rozróżnienie źródła impulsu mimo braku dodatkowego wejścia INT. Omówiono, że impulsy o częstotliwościach do około 700 Hz można zliczać jednym timerem z przerwaniem o odpowiednio wysokiej częstotliwości, który jednocześnie odmierza czas odświeżania wyświetlacza. Podkreślono konieczność programowego wykrywania zboczy sygnału (zmian stanu pinu) zamiast badania stanu pinu, aby uniknąć błędów w zliczaniu. Ostatecznie autor zastosował rozwiązanie zaproponowane przez innego uczestnika dyskusji, które spełniło wymagania projektu.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA