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.

[atmega][bascom]problem z odliczaniem czasu

cepelia 10 Wrz 2008 10:13 2313 20
  • #1 10 Wrz 2008 10:13
    cepelia
    Poziom 20  

    Nie wiem czy dobrze się wyraziłem ale potrzebuje zrobić coś takiego co po spełnieniu warunku z instrukcji if odliczy odpowiednia ilość czasu i wykona inne zadanie oczywiście nie zatrzymując programu który musi być wykonywany bez przerwy. Tak sobie wymyśliłem ,że użyje funkcji clock z parametrem user i programik który będzie wywoływany co sek będzie zawierał licznik który będzie się zwiększał inkrementalnie a ja sobie będę pobierał wart tego licznika sprawdzał jego wartość po czym w odpowiednim momencie wykonam instrukcje o którą mi chodziło. Ale może jest jakiś prostszy sposób może z użyciem timer1 co by się może udało zrobić zegarek normalny.

    Za wszystkie pomysły serdecznie dziękuje.

    0 20
  • #2 10 Wrz 2008 10:17
    organista
    Poziom 15  

    Może używając timer1 i jakąś zmienną przechowującą ilość przerwań wywołanych przez ten timer - czyli co przerwanie timera zmienna+1 i jeśli osiągnie jakąś tam wartość (czyli ileś tam przerwań timera = jakiś czas (zależny od kwarcu)) to wtedy spełniać ten warunek.

    0
  • #3 10 Wrz 2008 10:31
    cepelia
    Poziom 20  

    no właśnie coś takiego zrobiłem

    Code:

    config clock = user

    if i1 > hse then                           'warunek zalaczenia sprezarki
    if ttsec = 180 then                     ' nie wczesniej jednak jak po 3 min
    lcd "rozruch"                              ' pokazuje stan
    end if
    set portb.5                                 'wlancza przekaznik albo sprezarke                                    'przez moc2030
    endif


    Sectic:
    Incr Ttsec
    Return


    ale problem jest taki ze ta zmienna będzie się zerować , poza tym mógłbyś dać kawałek kodu taki zupełnie przykładowy bo właśnie nie bardzo weiem jak działać z tymi przerwaniami.

    0
  • #4 10 Wrz 2008 11:15
    organista
    Poziom 15  

    Ok, poniżej przykład odliczania jednej sekundy, w zmiennej 'ilesekund' co jedno przerwanie zegara będzie dodawana jedna sekunda. Oto kod:

    Code:

    Dim ilesekund As Byte

    ilesekund = 0

    Config Timer2 = Timer , Async = 1 , Prescale = 128
    On Timer2 Sekunda

    Enable Interrupts
    Enable Timer2

    Do
     'tutaj możesz dać warunek, np. if ilesekund=60 (1 minuta) to coś tam rób.
    Loop

    Sekunda:
       ilesekund = ilesekund+1 'ta zmienna będzie zmieniana co sekundę przy kwarcu 32768Hz i przy   Prescale=128
    Return



    Myślę że wiesz już o co chodzi :)

    0
  • #5 10 Wrz 2008 19:00
    pio_05
    Poziom 11  

    Jakie chcesz odmierzać odcinki tego czasu?
    Jeśli długie np 1h to atmega bez kwarcu będzie dość niedokładna, jeśli odcinki czasu mają być bardzo długie(12h) i ma je odmierzać bardzo dokładnie będziesz niestety musiał użyć jakiegoś RTC.

    0
  • #6 10 Wrz 2008 19:25
    cepelia
    Poziom 20  

    No jest w planie kwarc 8MHz bo odcinki są po kawałku nawet do 12 godzin (pomiędzy odszranianiem) ale tu mi chodziło raczej o krótszy czas około 3 min pozwalający sprężarce na wyrównanie ciśnienia, zrobiłem coś takiego podobnego tyle że na timer0 ale za cholere nie mogę dobrać preskalera i ilości impulsów. Zegar wew atmega8 1MHz poza tym nie zauważyłem różnicy między 8 a 1 MHz w działaniu.



    Code:

      Config Timer0 = Timer , Prescale = 1024
      On Ovf0 Tim_0isr

      Enable Timer0
      Enable Interrupts

      Load Timer0 , 4000

    Do
    wiadomo
    Loop

    end

    Tim_0isr:
    Load Timer0 , 4000

    zliczanie
    sekund

    return



    no i tyle nie bardzo chce mi co sekundę to dzialać , na elektrodzie znalazłem jakieś przykłady i tez d**a. Nie wiem czy to przez ten timer0 czy co. Spróbuję jeszcze na timer1 to wrzucić narazie dzięki za odpowiedzi.

    0
  • #7 10 Wrz 2008 19:59
    Balu
    Poziom 38  

    Nie no... po co myśleć. Po co czytać ds'a każdy timer0 jest 16bitowy...

    0
  • #8 10 Wrz 2008 23:53
    crazy_phisic
    VIP Zasłużony dla elektroda

    Proszę nie odbiegać od tematu. Posty powędrowały do kosza.

    0
  • #9 11 Wrz 2008 08:39
    organista
    Poziom 15  

    A wpisałeś ten kod co Ci napisałem?

    0
  • #10 12 Wrz 2008 07:57
    cepelia
    Poziom 20  

    Tak ale kompilator zwraca mi błąd Unknow parametr async i jeszcze błąd preskalera że niby niedozwolona wartość. W manualu baskoma jest napisane że dla układu M103 1,8,64,256,1024 i takie właśnie mam opcje do wybrania. Używam biblioteki m8def.dat . Układ jest zrobiony na wew zegarze 1MHz.

    Poza tym timer0 jest 8 bitowy. Odsyłam do dokumentacji właśnie.

    0
  • #11 12 Wrz 2008 09:29
    organista
    Poziom 15  

    U mnie wywalał kiedyś ten sam błąd, a niby wszystko się zgadzało...

    Trzeba metodą prób i będów. Proponuje konfigurację timera zrobić tak:

    Code:

    Config Timer0 = Timer , Prescale = 1


    a resztę pozostawić bez zmian o ile się nie mylę.
    W bascomie nic dawno nie pisałem, teraz bawię się w C.

    0
  • #12 12 Wrz 2008 10:13
    cepelia
    Poziom 20  

    Tak też już robiłem dawałem preskale 1dla taimera0 kazałem mu liczyć do 1000000 czyli niby każdy takt zegara i nadal herezje. Jak by się komuś chciało pomagać to siedzę teraz przed kompem i kombinuje więc wszystkie pomysły mile widziane.

    0
  • #13 12 Wrz 2008 10:18
    Freddie Chopin
    Specjalista - Mikrokontrolery

    cepelia napisał:
    kazałem mu liczyć do 1000000

    OMG to jest herezja [; ile bitow trzeba, zeby zmiescic taka liczbe?

    4\/3!!

    0
  • #14 12 Wrz 2008 10:36
    cepelia
    Poziom 20  

    No to w takim razie źle zrozumiałem instrukcję. Napisali w niej
    "możesz za załadować do licznika wartość odpowiadającą ilości impulsów po których licznik sie przepełni "
    więc załadowałem 1000000 impulsów i czekałem aż się przepełni ale się przepełniał troszkę za szybko moim zdaniem.

    0
  • #15 12 Wrz 2008 10:42
    Freddie Chopin
    Specjalista - Mikrokontrolery

    a wiesz czemu niektorzy tak psiocza na bascoma? bo oducza myslenia. procesor jest procesorem i wciaz operuje wg zasad opisanych ... no gdzie? w instrukcji do bascoma czy w datasheecie procka? wydaje sie wam, ze skoro pisze, ze mozna zaladowac dowolna wartosc, to mozna sobie spokojnie wpadkowac tam liczbe 128-bitowa, albo moze lepiej zmiennoprzecinkowa i bedzie git... szkoda ze licznik jest 8 bitowy, ewentualnie 16bitowy...

    najpierw czyta sie instrukcje PROCESORA! potem instrukcje kompilatora... i nawet bascom was od tego nie uratuje... naklepaliscie juz 13 postow o rzeczy, ktora dla osoby zapoznanej z tym dokumentem jest oczywista jak to, ze liczby binarne to tylko 0 i 1.

    4\/3!!

    0
  • #17 12 Wrz 2008 11:05
    cepelia
    Poziom 20  

    Mój błąd ale normalnie to jest tak że jak piszesz kompilatorowi coś np że chcesz odmierzyć tyle to a tyle impulsów to kompilator to właśnie wykonuje. Takie właśnie jest moje wyobrażenie o językach wysokiego poziomu. Jak bym chciał pisać w asmo to bym pewnie na to zwrócił uwagę. Na razie to mój kontakt z prockami tego typu trwa około 2 tyg więc nie jedź po mojej inteligencji bo sie za bardzo nie znamy.
    Poza tym 13 postów to chyba dobrze ,ta skomplikowana umiejętność pisania w narodzie przynajmniej nie zginie.

    0
  • #18 12 Wrz 2008 12:32
    organista
    Poziom 15  

    Cytat:

    naklepaliscie juz 13 postow o rzeczy, ktora dla osoby zapoznanej z tym dokumentem jest oczywista jak to, ze liczby binarne to tylko 0 i 1.

    Dla jednych oczywiste, dla innych nie, kolega Cepelia jak sam napisał, siedzi dopiero w tym dwa tygodnie.

    Proponuję zrobić to na timer1 - jest 16 bitowy, dlatego można go użyć do zliczania większej ilości impulsów lub odmierzania dłuższych okresów czasu.

    Jak go skonfigurować?
    W trybie czasomierza licznik jest taktowany wewnętrznym sygnałem zegarowym. Po każdym takcie wartość licznika jest zwiększana o jeden. Sygnał taktujący jest wynikiem podziału przez x w stosunku do zegara procesora. Dzielnik x może przyjąć jedną z wartości: 1, 8, 64, 256, 1024. Np. x=1024 - licznik jest zwiększany o 1 po 1024 taktach zegara procesora. Jadąc na wewnętrznym kwarcu 1MHz, i timerze1 16 bitowym, proponuję ustawić wartość prescale na 8, wtedy timer będzie zwiększany co 8us, co daje nam wywołanie przerwania co ok. 520ms czyli 0,5s.

    0
  • #19 12 Wrz 2008 12:44
    cepelia
    Poziom 20  

    Dzięki wszystkim za zainteresowanie , najbardziej pomógł kalkulator do którego dostałem linka. Poza tym naprawde to było jakieś małe nieporozumienie pomiędzy mną a bascomem. Myślałem że to policzy jak trzeba.

    rozwiązanie

    timer0 z preskalerem 64
    wywołuje przerwanie raz na 0,016384 sek
    więc liczymy 61 razy i mamy sekunde

    nawet dokładnie do 3 min wystarczy

    dzięki

    0
  • #20 12 Wrz 2008 14:01
    Freddie Chopin
    Specjalista - Mikrokontrolery

    cepelia napisał:
    Takie właśnie jest moje wyobrażenie o językach wysokiego poziomu.

    jest bledne [;

    jesli ja sobie wyobraze, ze C51 ma kontroler kolorowych matryc LCD w rozdzielczosci HD z 128MB pamieci SDRAM, to wcale nie znaczy, ze jezyk wysokiego poziomu mi to zapewni.

    mylisz pojecia. jezyk wysokiego poziomu jest tak samo ograniczony rozmiarem zmiennych jak jezyk jakiegokolwiekinnego poziomu. swoja droga w C dostalbys warninga, ze przekraczasz zakres [; kolejna rzecz, ktora musze zapamietac.

    4\/3!!

    0
  • #21 12 Wrz 2008 15:02
    cepelia
    Poziom 20  

    Jest jeszcze wiele takich rzeczy które muszę zapamiętać.
    Dzięki za pomoc. Pewnie jeszcze się odezwe.

    0