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

Bascom Atmega ustawienia Timer1 - problem

radekrybalt 01 Maj 2010 23:08 2819 7
REKLAMA
  • #1 8024778
    radekrybalt
    Poziom 10  
    Witam,
    Piszę program do atmega8 i mam problem z ustawieniem Timer1. Dopiero zaczynam programować więc proszę o wyrozumiałość.
    Chciałbym ustawić tak timer1 aby zaczął liczyć czas od pojawienia się na portd.3 pierwszego impulsu do drugiego impulsu, zapisał wartość do zmiennej, wyzerował się i zaczął zliczać czas od drugiego do trzeciego impulsu zapisał znów wartość do zmiennej i tak w kółko, a zatrzymał by się gdy czas będzie dłuższy między impulsami niż 2 sekundy.

    Część programu już napisałem ale z Timerm nie mogę sobie poradzić.
    Pozdrawiam i czekam na pomoc.
    $regfile = "m8def.dat"
    $crystal = 8000000
    Config Timer1 = Timer , Prescale = 64
    
    
    
    
    Dim Time1 As Single
    Time1 = 0.
    
     Do
    
    
    If Portd.3 = 1 And Time1 > 0.058252 Then
    Portd.0 = 1
    
    end if
    
    If Portd.3 = 1 And Time1 < 0.058252 And Time1 > 0.057692 Then
    Waitus 528
    Portd.0 = 1
    
    end if
    
    If Portd.3 = 1 And 0.057692 > Time1 And Time1 < 0.057143 Then
    Waitus 666
    Portd.0 = 1
    
    end if
    
    If Portd.3 = 1 And 0.057143 > Time1 And Time1 < 0.056338 Then
    Waitus 944
    Portd.0 = 1
    
    End If
    
    Loop
    
  • REKLAMA
  • #2 8026431
    wader_669
    Poziom 28  
    (c) Zbigniew Gibek, 2002-2005 (c) MCS Electronics, 1999-2005 napisał:

    Przeznaczenie:

    Zatrzymuje działanie programu lub określone urządzenie.

    Składnia:

    STOP

    STOP urządzenie

    gdzie:

    urządzenie nazwa symboliczna uruchamianego urządzenia.
    Opis:

    Pierwszy format instrukcji powoduje zatrzymanie działania programu. W tym celu jest wykonywana pusta pętla, podobnie jak w instrukcji END. Jednak przy instrukcji STOP nie są wyłączane przerwania.

    Drugi format instrukcji STOP powoduje wyłączenie (zatrzymanie) podanego urządzenia. Jako parametr należy podać nazwę symboliczną urządzenia. W języku BASCOM BASIC zdefiniowano następujące nazwy urządzeń:

    Nazwa Typ urządzenia
    TIMER0 Licznik TIMER0
    TIMER1 Licznik TIMER1
    COUNTER0 *) Licznik TIMER0
    COUNTER1 *) Licznik TIMER1
    WATCHDOG Licznik układu WATCHDOG
    AC Wbudowany komparator analogowy
    ADC Wbudowany przetwornik A/D
    *) Nazwa COUNTERx może być stosowana zamiennie z TIMERx.

    Uwaga! Instrukcja STOP z parametrem AC lub ADC wyłącza zasilanie urządzenia.


    Dodano po 1 [minuty]:

    i to samo ze start
  • REKLAMA
  • #3 8026778
    landy13
    Poziom 31  
    Program który przedstawiłeś nijak się ma do tego co chcesz osiągnąć. Nie wiadomo co to za zmienna Time1 i po co jest porównywana z jakimiś dziwnymi wartościami.
    Zacznij może tak. Prescaler=64 to za mało żeby odmierzyć dwie sekundy - musi być co najmniej 256. Skoro impulsy przychodzą na PD.3 to aż się prosi żeby wykorzystać przerwanie Int1. W przerwaniu tym robisz:
    Zmienna=Timer1
    Timer1=0
    Return
    a w pętli głównej obrabiasz Zmienną według potrzeb. Jeśli wartość 2s nie jest krytyczna, to można do tego wykorzystać przerwanie od przepełnienia Timera1, które wystąpi ok. 2.1s od ostatniego zerowania (przy zegarze 8MHz i preskalerze 256). Jeśli jednak musi być to dokładnie 2s to można wykorzystać przerwanie od porównania. To taki zgrubny szkielet - po szczegóły zajrzyj do helpa.
    Poczytaj także o różnicach między rejestrami PINx i PORTx - na pewno się przyda.
  • #4 8027230
    radekrybalt
    Poziom 10  
    Napisałem coś takiego. Czy to ma sens? Po pojawieniu się pierwszego zbocza opadającego na Int1 powinno uruchomić Timer1 i po podaniu drugiego zbocza opadającego na wyświetlaczu powinno pokazać wartość Timer1. W symulacji pokazuje na lcd cały czas zero. Gdzie jest problem? Na razie chcę mierzyć tylko czas między przerwaniami
    $regfile = "m8def.dat"
    $crystal = 8000000
    Config Lcd = 16 * 2
    Config Lcdbus = 4
    Config Lcdpin = Pin , Db4 = Portc.1 , Db5 = Portc.4 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.5 , Rs = Portc.6
    
    Config Timer1 = Timer , Prescale = 256
    Config Int1 = Falling
    Enable Interrupts
    Enable Int1
    On Int1 Licznik
    Dim Time1 As Long
    
     Do
    
    Loop
    End
    
    Licznik:
     Stop Timer1
    
    Time1 = Timer1
    Cls
    Lcd Time1
    Waitms 200
    Timer1 = 0
    
    Start Timer1
    Return
  • REKLAMA
  • #5 8027531
    landy13
    Poziom 31  
    Nie ma potrzeby zatrzymywania licznika - wyrzuć
    i
    A już kardynalnym błędem jest w przerwaniu. Także
    Cls
    Lcd Time1 
    jest błędam. "Cls" wyrzuć całkowicie, a "Lcd Time1" wstaw do pętli głównej, oczywiście poprzedzonym odpowiednim "Locate"
    No i pisz listingi w tagach "code".
  • REKLAMA
  • #6 8027554
    janbernat
    Poziom 38  
    Zaczyna mieć jakiś sens.
    Wyrzuć ten waitms200 z przerwania.
    LCD wstaw do głównej pętli.
    Wyrzuć LCDbus- przecież definiujesz piny do LCD.
    Time1 as word- przecież timer1 jest 16-bitowy- zmienna nie będzie dłuższa.
  • #7 8027679
    radekrybalt
    Poziom 10  
    Teraz już działa. Powiedzcie mi jeszcze jak ogólnie przelicza się wartość z timera1 na sekundę?
    Dzięki bardzo za pomoc.

    Pozdrawiam
REKLAMA