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 zmodyfikować przerwanie EXT0 w '51 do pomiaru czasu zasłonięcia bariery?

tomeeh 05 Mar 2007 16:20 1365 10
REKLAMA
  • #1 3645939
    tomeeh
    Poziom 24  
    Posty: 706
    Pomógł: 46
    Ocena: 92
    Witam. Chcę dokonać możliwie dokładnego pomiaru czasu między zdarzeniami wykorzystując mikrokontroler '51. Aby pomiar był dokładny uważam, że jedynym wyjściem jest wykorzystanie przerwań. Ja chciałbym wykorzystać tutaj jedno przerwanie, załóżmy EXT0. Załóżmy również, że przerwanie w µC ma reagować na zbocze (IT0=1).

    Czas jaki chcę zmierzyć, to czas przesłonięcia bariery podczerwieni. Innymi słowy chcę wiedzieć, jak długo był przedmiot, który przesłaniał barierę podczerwieni. Załóżmy, że bariera daje +5V gdy nie ma nic pomiędzy nadajnikiem a odbiornikiem, oraz 0V, gdy droga jest zasłonięta.

    Oto zadanie: W jaki sposób zmodyfikować układ wejściowy przerwania, aby 2 zdarzenia: zasłonięcie (czyli przejście z 5V do 0V), oraz odsłonięcie bariery (przejście z 0V do 5V) powodowało wyzwolenie tego samego przerwania?

    O ile pierwszy warunek jest spełniony - gdyż zasłonięcie powoduje zadziałanie przerwania, pytanie powstaje jak zrobić by przerwania powodowała również zmiana stanu z 0V na 5V?
  • REKLAMA
  • #2 3646301
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    Trzeba dodać dodatkowy odwracacz fazy - np trzy rezystory i tranzystor npn.
    Jeden rezystor będzie podciągał wejście int1 do plusa a tranzystor w wypadku zadziałania będzie zwierał go do masy. Na wejściu dajesz rezystor do bazy i dodatkowo od bazy do masy (np 2k2 wejście, 10k bocznik do masy).
    I teraz jak podasz plus na wejście układu to tranzystor zewrze wyjście do masy - odwracacz fazy.
    Zapewni to dwa zbocza - co prawda na dwóch przerwaniach ale to '51 wiec tak trzeba to zrobić.
  • REKLAMA
  • #3 3646670
    VanThor
    Poziom 19  
    Posty: 224
    Pomógł: 34
    Ocena: 5
    A może zastosujesz zmodyfikowaną '51 firmy Silicon Laboratories (dawniej Cygnal) i wykorzystasz wbudowany moduł PCA posiadający co najmniej 3 kanały Input Capture o programowanym aktywnym zboczu?
    Pomiar może być dokładniejszy niż w przypadku zwykłego C51 (PCA może pracować z wyższą częstotliwością niż standardowo liczniki w C51) i nie musiałbyś kombinować z układami zewnętrznymi.
    Jakbyś poświęcił 2 kanały Input Capture (jeden na zbocze narastające a drugi na opadające) to mógłbyś uzyskać rozdzielczość:
    dt = 1 / fosc,
    gdzie fosc - częstotliwość oscylatora (kwarcu) np. 25MHz.
    W standardowej '51 na przerwaniach nie uzyskasz nic lepszego niż
    dt = 200 / fosc.
  • REKLAMA
  • #4 3646824
    starob
    Poziom 29  
    Posty: 1088
    Pomógł: 128
    Ocena: 137
    Jedna końcówka np.INT0
    sygnał aktywny INT=0
    T0 w trybie 1
    GATE=1 licznik bramkowany INT=0 - licznik liczy
    można ustawić przerwanie INT0 wyzwalane zboczem opadający w celu wykrycia początku zdarzenia.
    Takie rozwiązanie pozwala nie przejmować się wykrywaniem końca zdarzenia.
  • REKLAMA
  • #5 3647285
    tomeeh
    Poziom 24  
    Posty: 706
    Pomógł: 46
    Ocena: 92
    Panowie, dziękuję za odpowiedzi.

    Szymtro: myślałem o takim rozwiązaniu, ale do realizacji twego pomysłu potrzeba dwóch przerwań zewnętrznych. Zgodnie z tym, co napisałem powyżej, chcę wykorzystać tylko jedno, gdyż drugie będzie użyte do obsługi klawiatury.

    VanThor: nie mówię, że się ogranicznam jedynie do mojego ulubionego procesora, ale przesiadając się teraz na inny model (nowy schemat, element biblioteczny, programator, kompilator itp.) kosztowało by mnie to zbyt wiele czasu.

    Starob: ten pomysł uważam za strzał w dziesiątkę. Chciałbym tylko coś wyjaśnić. O ile dobrze rozumiem, to jednak w momencie gdy na /INT0 podana jest jedynka, to wtedy licznik liczy (a nie przy zerze; no chyba że celowo opuściłeś belkę przy napisie INT i negacja negacji dała twierdzenie). I tutaj sprawa jest bardzo ciekawa, bo w momencie gdy ktoś zasłoni barierę, będzie jedynka - a więc licznik liczy. Natomiast zakończenie cyklu spowoduje przejście na zero - tak jak sugerujesz ustawię ten pin również jako przerwanie, a właśnie przejście z 1 na 0 będzie sygnałem dla µC, że przeszkoda zniknęła z bariery (czyli następuje koniec zliczania i można odczytywać stan licznika). Mam nadzieję, że dobrze to rozumiem.
  • #6 3647444
    starob
    Poziom 29  
    Posty: 1088
    Pomógł: 128
    Ocena: 137
    Żeby nie mieszać
    przysłona zasłonięta ma dawać 0 (zaneguj sprzętowo)
    podłączone do pina /INT (jak zwał tak zwał)
    przejście /INT z 1>>0 (zbocze opadające)- przerwanie

    0 na pinie /INT licznik liczy
    prościej nie potrafie
  • #7 3647588
    tomeeh
    Poziom 24  
    Posty: 706
    Pomógł: 46
    Ocena: 92
    Starob, chyba się nie rozumiemy. Wg mnie powinno być tak zrobione, że zasłonięta przesłona ma dawać 1, bo to przy jedynce timer liczy.
    Jako potwierdzenie mego myślenia cytuję fragment datasheeta od ADuC842; dla tych, co im się nie chce otwierać obrazka skopiowany tekst:
    "GATE: Set by software to enable Timer/Counter 0 only while the INT0 pin is high and the TR0 control bit is set.
    Cleared by software to enable Timer 0 whenever the TR0 control bit is set."
    Załączniki:
    • Jak zmodyfikować przerwanie EXT0 w '51 do pomiaru czasu zasłonięcia bariery? int.GIF (4.68 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • Pomocny post
    #8 3647661
    starob
    Poziom 29  
    Posty: 1088
    Pomógł: 128
    Ocena: 137
    Masz racje sam się pogubiłem w tym INT i /INT
    Ale to jeszcze lepiej bo przerwanie wygeneruje się
    w momencie zakończenia pomiaru (o razu masz gotowy wynik i nic więcej nie trzeba sprzwdzać tylko wyzerować licznik do następnego pomiaru)
    Dobrze,że myślisz i nie dajesz sobie wcisnąć głupot:D
  • #9 3647782
    tomeeh
    Poziom 24  
    Posty: 706
    Pomógł: 46
    Ocena: 92
    No właśnie też tak myślałem starob, że generowanie przerwania na początku pomiaru nie ma sensu, bo wcale nie muszę wiedzieć kiedy on się zaczyna. Kluczowe jest natomiast przerwanie na końcu, dzięki któremu wiem, że mogę już odczytać stan liczników i obliczyć sobie czas. Ach, jak pieknie panowie przemyśleli tą '51 w momencie projektowania...

    W każdym razie dzięki za natchnienie, tego mi właśnie było potrzeba.
  • #10 3647931
    domelfm
    Poziom 16  
    Posty: 238
    Pomógł: 5
    Ocena: 28
    Jest jeszcze jedno dość proste rozwiazanie jeżeli masz jakiś wolny port to np mozesz odczytywać sobie stan pinu x i w zalezności od jego stanu zliczasz albo przysłoniecie albo odsłoniecie a przerwanie generujesz sobie np z opuznieniem 10 us poprzez układ który generuje przerwanie w momencie zmiany z 0 na 5v i na odwrót
  • #11 3647950
    tomeeh
    Poziom 24  
    Posty: 706
    Pomógł: 46
    Ocena: 92
    Ten pomysł akurat uważam za bezsensowny, chyba że go do końca nie rozumiem. Napisałeś, że mogę sobie odczytywać stan pinu. W jaki sposób? Zadaniem mego procesora nie będzie przecież jedynie odliczanie czasu, lecz obsługa wyświetlacza, przetwornika AD, analiza wyników. Sprawdzanie portu w pętli to totalna porażka - długa pętla będzie źródłem dużych błędów. Tak jak pisałem - jedyny sensowny sposób to przerwania.

Podsumowanie tematu

✨ Dyskusja dotyczy pomiaru czasu zasłonięcia bariery podczerwieni za pomocą mikrokontrolera rodziny '51, wykorzystując jedno przerwanie zewnętrzne EXT0 reagujące na zbocze sygnału. Problem polega na tym, jak skonfigurować przerwanie, aby reagowało zarówno na zbocze opadające (5V→0V, zasłonięcie bariery), jak i narastające (0V→5V, odsłonięcie bariery) przy użyciu tylko jednego wejścia przerwania. Proponowano kilka rozwiązań: zastosowanie zewnętrznego odwracacza fazy z tranzystorem NPN i rezystorami, co pozwoliłoby na wykrycie obu zboczy, jednak wymagałoby dwóch przerwań; użycie mikrokontrolera Silicon Laboratories z modułem PCA i kanałami Input Capture programowalnymi na różne zbocza, co zwiększyłoby dokładność pomiaru; wykorzystanie licznika Timer0 w trybie GATE, gdzie licznik jest aktywowany stanem wysokim na pinie INT0, a przerwanie generowane jest na zboczu opadającym, co pozwala mierzyć czas trwania stanu wysokiego (zasłonięcie bariery). Dyskutowano także o negacji sygnału sprzętowo, aby uprościć logikę pomiaru. Autor preferuje rozwiązanie z jednym przerwaniem i timerem sterowanym sygnałem z bariery, gdyż inne metody wymagają dodatkowych przerwań lub komplikują program. Pomiar czasu jest kluczowy do określenia długości zasłonięcia bariery podczerwieni, a przerwania są preferowane ze względu na precyzję i efektywność w systemie obsługującym również inne zadania, takie jak wyświetlacz czy przetwornik AD.
Wygenerowane przez model językowy.
REKLAMA