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.

at89c2051, bascom i int0

wasi 15 Dec 2003 23:07 1935 8
  • #1
    wasi
    Level 12  
    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
    Code:
    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:
    Code:

    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ę.
  • #3
    wasi
    Level 12  
    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ę.
  • #4
    szymtro
    Level 30  
    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.
  • #6
    wasi
    Level 12  
    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
    wasi
    Level 12  
    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
    ucy74
    Level 20  
    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
    wasi
    Level 12  
    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.