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

Konfiguracja przerwań INT0 w AT89C2051 dla licznika obrotów w Bascom

wasi 15 Gru 2003 23:07 2208 8
REKLAMA
  • #1 438773
    wasi
    Poziom 12  
    Posty: 75
    Ocena: 5
    Cześć.
    Przeglądałem archiwum ale nic dla siebie konkretnego nie znalazłem.
    Mam problem z programem (konfiguracją przerwań). Chciałem wykonać mały i prosty licznik obrotów. Wykonałem przetwornik obrót/impulsy na diodach, zakładam że nie występują w nim "drgania styków" :) Otrzymany sygnał chciałem podać na wejście INT0 i za pomocą Timera zliczać pojawiające się impulsy. Wynik obliczeń po odpowiedniej obróbce wyswietlam na wyświetlaczu LCD. Do pinu P3.5 mam podłączony przycisk. Wszystko jest cacy ale... dlaczego jak
    Dim C As Word
    Config Timer0 = Counter, Gate = External, Mode = 1
    Counter0 = 0
    Enable Interrupts
    Enable Timer0
    Enable Int0
    
    Do
       Debounce P3.5 , 0 , View , Sub
    Loop
    
    View:
       C = Counter0
       Lcd c
    Return
    


    to po kilku impulsach na P3.2 i kliknięciu przycisku wyświetlona jest wartość 0 (nic nie zlicza)

    no i druga opcja: Dlaczego jak:
    
    Dim C As Word
    On Int0 Zliczaj
    Enable Interrupts
    Enable Int0
    
    Do
       Debounce P3.5 , 0 , View , Sub
    Loop
    
    View:
       C = Counter0
       Lcd c
    Return
    
    Zliczaj:
       Incr C
    Return
    


    To zamiast zliczania impulsów to program zlicza czas trwania impulsu? (Im dłużej jest 1 na P3.2 tym większą wartość pokazuje)?

    Zrobiłem też wersją bez obsługi przerwań lecz najprostrzy zestaw warunków zajmuje prockowi 135us a to dość dużo. Procek taktowany 11.059Mhz.

    Szukałem też opisów ustawień rejestrów TCON i TMOD ale nie umiem uzyskać działającej kombinacji (choć wszystkich nie sprawdziłem).

    Kto mi pomoże napisać program. Wolał bym pozostać przy Bascomie ale Asm też może być byle dał się wpisać w Bascomie i działał bo inaczej nie potrafię.
  • REKLAMA
  • REKLAMA
  • #3 439066
    wasi
    Poziom 12  
    Posty: 75
    Ocena: 5
    ad 1. No impulsy podaje na P3.4 ale ustawienia timera na internal by zliczal external nie rozumiem :)
    ad 2. A jak się ustawia to przerwanie na wzwalane zboczem??
    Dzięki. Sugestie sprawdzę.
  • REKLAMA
  • #4 439119
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    w bascomie tak:

    SET TCON.0 Falling edge generates interrupt for INT0.
    RESET TCON.0 Low signal generates interrupt for INT0.
    SET TCON.2 Falling edge generates interrupt for INT1.
    RESET TCON.2 Low signal generates interrupt for INT1.

    w helpie w"additional hardware" mozna to znalezc. "Falling edge" oznacza zbocze opadajace wiec dodaj po inicjalizacji przerwania set tcon.x zaleznie od tego ktore przerwanie.
  • REKLAMA
  • #6 439553
    wasi
    Poziom 12  
    Posty: 75
    Ocena: 5
    No tak. Dzieki serdeczne. Tyle razy czytalem dokumentacje i zawsze jakos tego nie zauwazylem. Ale zawsze lepiej jak ktos to potwierdzi, bo archiwalne posty wskazują ze przerwania mogą nie działać. A o internal/external to myślałem że chodzi o wywoływanie przerwania ale już zrozumiałem. Prace skończyłem to zabieram się do sprawdzenia.

    Dzięki narazie
  • #7 440051
    wasi
    Poziom 12  
    Posty: 75
    Ocena: 5
    Z przerwaniem INT0 sobie poradziłem bez problemu (zlicza i to nawet szybko:), ale przykład z Timerem a'la Counter'em wogóle nie gada. Nie wiem dlaczego. Timer ustawiłem na Internal. Impulsy podawałem na P3.2 i P3.4 ale nic nie dało. próbowałem też włączać i wyłączać przerwanie INT0 razem z Timer0 ale nic się nie zmieniło. Może to już nie istotne, bo chyba w tym rozwiązaniu i tak chyba lepiej będzie wykożystać INT0 (jako bardziej elastyczne) a na Timer0 ustawić pomiar czasu.

    Z czystej ciekawości może ktoś ma pomysła dlaczego Timer przy takich ustawieniach nie chce nic zliczać? Bo ustawienie Zbocze/Stan nie jest chyba dla tego istotne?
  • #8 440113
    ucy74
    Poziom 20  
    Posty: 539
    Pomógł: 22
    Ocena: 10
    Ja trochę nie rozumiem: po co Ci i przerwanie i timer?

    1. Chcesz liczyć timerem to na P3.4 podajesz liczone impulsy, a timer konfigurujesz jako counter i podajesz które zbocze impulsów ma zwiększać stan licznika.
    2. Chcesz liczyć przerwaniem to impulsy podajesz na P3.2 i znowu: podajesz które zbocze ma wyzwalać przerwanie. W przerwaniu zwiększasz dowolną zmienną. Potem możesz ją sobie wyświetlać na LCD.

    3. Jak się uprzesz to możesz, korzystając z dwu przerwań i dwu liczników zliczać (w górę) impulsy z czterech impulsatorów. Można też nie używać przerwań i timerów a sprawdzać szybko stany wszystkich pinów, wtedy to już masz do 15-tu impulsatorów ;-)
  • #9 440725
    wasi
    Poziom 12  
    Posty: 75
    Ocena: 5
    Ad 1. Nie że chce jednocześnie INT0 i Timer0 wykożystać do liczenia tych samych impulsów. Tylko jak wpisuje:
    config Timer=counter gate=internal mode=1
    enable interrupts
    enable timer0
    a impulsy podaje na P3.4 to timer nie liczy nic. Dla pewności załączałem też dodatkowo przerwanie INT0 (rozumiem że to bez sensu). Chyba że ustawienie na zliczanie zbocza ma tu duże znaczenie bo otym zapomniałem w zabawie z Timerkiem.
    Ale ostatecznie stosuje przerwanie na INT0 i inktrementuje sobie zmienna i jest ok.

Podsumowanie tematu

✨ Dyskusja dotyczy konfiguracji przerwań INT0 oraz licznika impulsów w mikrokontrolerze AT89C2051 przy użyciu Bascom. Autor chciał zliczać impulsy z czujnika obrotów podłączonego do wejścia INT0 (P3.2) oraz wyświetlać wynik na LCD. Pojawiły się problemy z liczeniem impulsów za pomocą Timera0 ustawionego jako licznik (counter) z bramką (gate) zewnętrzną, mimo podawania impulsów na P3.4. Wskazano, że tryb gate=external powoduje liczenie impulsów tylko gdy na pinie P3.2 jest stan niski, a timer liczy impulsy na wejściu P3.4. Zalecane jest ustawienie trybu licznika na internal, jeśli impulsy mają być zliczane bez bramkowania. Ponadto, aby przerwanie INT0 działało poprawnie, należy skonfigurować je na wyzwalanie zboczem opadającym (falling edge) poprzez ustawienie odpowiedniego bitu w rejestrze TCON (TCON.0). W praktyce lepszym rozwiązaniem okazało się wykorzystanie przerwania INT0 do inkrementacji zmiennej zliczającej impulsy, zamiast licznika Timer0. Omówiono także różnice między liczeniem impulsów za pomocą przerwań a timerów oraz znaczenie konfiguracji trybu pracy i wyzwalania przerwań w Bascom.
Wygenerowane przez model językowy.
REKLAMA