Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Atmega8/16... INT0 jak poprawnie uruchomić licznik impulsów...

topstar 09 Maj 2013 15:20 1677 4
  • #1 09 Maj 2013 15:20
    topstar
    Poziom 18  

    WItam , otóż borykam się z problemem uruchomienia INT0 ,który ma zliczać impulsy(1 sekunda) z wyjścia INT PCF8583(stan niski), i co powiedzmy 15 impulsów(15s) ma wykonywać się podprogram. Mógłby ktoś pokazać mi jak skonfigurować INT0 w Bascom ?
    Dziękuje i pozdrawiam :D

    0 4
  • #2 09 Maj 2013 17:14
    tmf
    Moderator Mikrokontrolery Projektowanie

    A może prościej te impulsy podawać na wejście zegarowe timera, ustawionego tak, że top=15 i po zdarzeniu overflow generuje ci przerwanie?
    Oczywiście można też zrobić to na int, tak jak planujesz, ale mój sposób jest całkowicie sprzętowy. W Bascomie nie pomogę, ale może skoro zaczynasz to warto zacząć od c?

    0
  • #3 09 Maj 2013 21:30
    topstar
    Poziom 18  

    Właśnie mam już cały program gotowy w bascomie , nie umiem w tej chwili na tyle dobrze C żeby napisać obsługę PCF, dwóch DS18B20 plus MPX4115. Także chodzi właśnie mi tylko o rozwiązanie pomiaru ciśnienia co 5-10 minut.

    Ok doszedłem wkońcu jak to zrobić .

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    W pętli głównej dałem:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Nie wiem czy to dobre rozwiązanie, ale ważne że spełnia moje oczekiwania.

    0
  • #4 10 Maj 2013 07:39
    emarcus
    Poziom 35  

    topstar napisał:
    Właśnie mam już cały program gotowy w bascomie , nie umiem w tej chwili na tyle dobrze C żeby napisać obsługę PCF, dwóch DS18B20 plus MPX4115. Także chodzi właśnie mi tylko o rozwiązanie pomiaru ciśnienia co 5-10 minut.

    Ok doszedłem wkońcu jak to zrobić .
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    W pętli głównej dałem:
    If Timer1 = 20 Then 'jesli timer zliczy 20 impulsow(20s)
    Timer1 = 0 ' zeruje timer
    Gosub Mpx4115 'skok do podprogramu odczytu cisnienia
    End If
    [/syntax]
    Nie wiem czy to dobre rozwiązanie, ale ważne że spełnia moje oczekiwania.


    Skoro program spełnia oczekiwania programisty, to musi byc dobry!

    Niemniej jednak te 3 przedstawione fragmenty są pozbawione logicznego sensu.
    Popatrz na tę linię kodu:
    Config Timer1 = Counter , Edge = Falling , Prescale = 1024

    Jeżęli timer1 pracuje jako counter zliczający impulsy zewnętrzne z portu B.1, to te impulsy nie idą przez prescaler lecz bezpośrednio i są zliczane w tej ilości jak występują na tym pinie.

    Dalej,
    On Timer1 Licz - w tej instrukcji "Timer1" reprezentuje interrupt OVF1.
    Aby ta częśc programu została wykonana (skok do subrutyny Licz) wymagane jest:
    Enable interrupts oraz,
    Enable Timer1 albo enable OVF1.
    zatem nie nastąpi skok do subrutyny.
    Mimo tego sama subrutyna nie zawiera nic więcej oprócz incrementacji Rejestru timera1, (TCNT1), który jest incrementowany po każdym impulsie na PB.1.

    Przeanalizujmy jeszcze następny fragment:\
    Cytat:

    W pętli głównej dałem:
    If Timer1 = 20 Then 'jesli timer zliczy 20 impulsow(20s)
    Timer1 = 0 ' zeruje timer

    Z czego wynika że zawartośc rejestru Timer1 nigdy nie przekroczy wartości 20 i nigdy nie dojdzie do jego przepełnienia, a zatem skok do subrutyny: "On Timer1 Licz" jest tutaj również blokowany.
    Wobec powyższego, efektem jest 20-secundowy cykl odczytu ciśnienia a nie jak zakładano 5 do 10 min.
    Timer1/Counter1 musiałby zliczac 300 do 600 impulsów.

    e marcus

    0
  • #5 10 Maj 2013 07:42
    topstar
    Poziom 18  

    Oczywiście w finalnej wersji mam zliczanie 600 impulsów tam tylko chodziło mi o krótki odcinek czasu ,aby sprawdzić czy działa. No i fakt nie potrzebny jest preskaler oraz podprogram licz.

    0