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.

BASCOM - timer nie zlicza zadanej wartosci

smithpl 20 Lut 2014 20:31 1263 12
  • #1 20 Lut 2014 20:31
    smithpl
    Poziom 15  

    Nadal nie rozumiem kwestii konfigurowania timera tak aby zliczał tyle ile chcę.
    Poczytałem parę wątków i nadal nie wychodzi.

    Aktulanie na Atmega16 z taktowaniem 4MHz staram sie uzyskać przerwanie co 100ms.
    Dla testów wyświetlam zmiany na LCD

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Jednak przy tej konfiguracji zmiana nie następuje co sekunde :-(

    Może mi ktoś pomóc w zrozumieniu?

    Wg. mnie:
    Przy prescalerze usyskujemy przerwanie co 16us
    wiec 100ms uzyskam po 6250 przerwaniach
    czyli jak dam load timer1 na 250
    to liczac 10 przerwan uzyskam sekunde
    tak?

    0 12
  • #2 20 Lut 2014 20:58
    yokoon
    Poziom 28  

    Witam.

    Liczysz to tak:

    4000000Hz / 64 / 250 = 250Hz = 4ms

    0
  • #3 20 Lut 2014 21:06
    smithpl
    Poziom 15  

    No wlasnie, tylko czemu zmiana na wyswietlaczu nastepuje co 1 sekunde?.
    Jak nie ustawiam load timer to czas miedzy zmianami jest ten sam.

    Rozumiem ze timer1 jest 16bitowy zlicza do 65536.
    Ile nie ustawie load timer1 = 250 czy 65100 to zmiany nastepuja w podobnych odstepach czasu.

    A ja potrzebuje uzyskac rowno 100ms na przerwaniu

    0
  • Pomocny post
    #4 20 Lut 2014 22:11
    Wojtek75
    Poziom 23  

    Robisz prosty błąd w składni. Poczytaj w helpie o Load.
    Nie tak:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    tylko tak:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Z tego co pamiętam można również tak.
    przykładowo:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    co jest równoważne:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Ale to sobie musisz już sam sprawdzić. Coraz rzadziej korzystam z tego środowiska więc mogłem coś pomylić.

    Poza tym skoro potrzebujesz odmierzać stałe odcinki czasu to lepszym wyborem jest tryb CTC nie trzeba wtedy ciągle przeładowywać wartości w rejestrze licznika. Jeżeli masz problemy z wyliczaniem odpowiednich wartości to w sieci masz całą masę różnego typu kalkulatorów które cię wspomogą.

    0
  • #5 21 Lut 2014 14:51
    smithpl
    Poziom 15  

    Super dzieki, faktycznie teraz troszke lepiej :-)

    Dodano po 5 [godziny]:

    Udało się pójść o krok dalej.

    Część programu dotycząca licznika wygląda tak:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Z tego rozumiem że skoro nie podałem load - czyli nie określam ile ma zliczać to zlicza całe 256:

    4000000Hz / 64 / 256 = 250Hz = 4,096....ms
    Czyli po zliczaniu w podprogramie Irq100ms do 120 usyskuje smiane stanu na wyswietlaczu co 491,52... ms czyli około 0,5 sek?

    Dobrze rozumiem?

    I teraz stosując taka wersję:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Uzyskam zmiane stanu co 100ms ?:

    400000/64/250 = 4ms * 25 = 100ms ?

    0
  • #6 21 Lut 2014 16:03
    Wojtek75
    Poziom 23  

    Tak, pod warunkiem oczywiście że program jest napisany w taki sposób że uC się wyrabia i nie gubisz przykładowo części przerwań. Dokładność źródła zegarowego też oczywiście ma znaczenie. Umieszczanie części obsługi wyświetlacza w przerwaniu w takim środowisku jak bascom nie jest zbyt dobrym posunięciem.

    0
  • #7 21 Lut 2014 16:16
    smithpl
    Poziom 15  

    Tak wiem, to tylko test działania, funkcja uzyta bedzie do wystawiania piku co 100ms ( flagi ) ktora bede zliczal w podprogramie :-)
    Na wyświetlaczu było po prostu łatwiej testować efekty zmian w programie.


    Pozostaje mi tylko 1 kwestia, mogę ją rozwiązać stopując zegar ale w ramach nauki zapytam:

    Program obsługuje j.w. timer 100ms.
    Dodatkowo na przerawniu INT1 dostaje impuls od DS1307 co 1 sek.
    Na podstawie tej flagi aktualizuje na LCD czas ( HH:MM:ss )

    Co zaprogramowanej godzinie, układ uruchamia timer2, załącza wyjście i zlicza impulsy 100ms'owe ( z timer2 ) aby odmierzyć czas załączenia np. na 4,3 sekundy

    Jak zabezpieczyć się przed wystąpieniem ( a raczej jak je poprawnie obsłużyć ) 2 w/w przerwań w jednym czasie?

    0
  • #8 21 Lut 2014 19:11
    emarcus
    Poziom 35  

    smithpl napisał:
    Super dzieki, faktycznie teraz troszke lepiej :-)


    Dobrze rozumiem?

    I teraz stosując taka wersję:
    [syntax=basic4gl]
    $crystal = 4000000

    Config Timer2 = Timer , Prescale = 64
    On Timer2 Irq100ms
    Load Timer2, 250
    .................
    Uzyskam zmiane stanu co 100ms ?:

    400000/64/250 = 4ms * 25 = 100ms ?


    Poprawiłeś tylko 'syntax' , czyli sposób wpisywania wartośc początkowej do rejestu timera.
    Rachunek zliczania czasu masz jednak błędny !!!!
    Prz tym taktowaniu (4 MHz) nie masz żadnej możliwości odmierzenia 100ms przez Timer2; nawet przy zastosowaniu maxymalnego prescalera (1024) czas dla pełnego zakresuTimera2 będzie wynosił ok. 65.5 msec./

    Patrz poniżej wyliczenia z calculatora timerów AVR
    Kolejne numery strzałek na rysynku powinny dać dostateczne wyjaśnienie.....
    BASCOM - timer nie zlicza zadanej wartosci

    Aby osiągnąć całkowity zamierzony czas (powiedzmy 4.3 sec) będziesz musiał uporządkować odmierzanie tego, przyjętego jako podstawowego przedziału czasowego i odpwiednio naliczać wymaganą ilość przepełnień.

    e marcus

    0
  • Pomocny post
    #9 21 Lut 2014 19:59
    Wojtek75
    Poziom 23  

    Emarcus on liczy przepełnienia timera, który generuje przerwania, co 4ms i coś tam robi w przerwaniu. Ostatnia linijka postu, który cytujesz.

    0
  • #10 24 Lut 2014 14:50
    smithpl
    Poziom 15  

    Emarus, dokładnie jak pisze Wojtek.

    Przerwanie leci co 4ms
    W podprogramie przerwania zliczam je 25 razy aż osiągnę 100ms i wtedy wystawiam sobie flagę
    irq100ms

    0
  • #11 24 Lut 2014 15:24
    emarcus
    Poziom 35  

    smithpl napisał:
    Emarus, dokładnie jak pisze Wojtek.

    Przerwanie leci co 4ms
    W podprogramie przerwania zliczam je 25 razy aż osiągnę 100ms i wtedy wystawiam sobie flagę
    irq100ms

    Być może masz taki swój "skrót myślowy"; przedstawiony fragment twojego programu tego jednak nie pokazuje.

    e marcus

    0
  • #12 25 Lut 2014 08:06
    smithpl
    Poziom 15  

    emarcux w poscie#5 masz dokładnie podprogram przerwania, który jest uruchamiany co 4ms ( z przerwania ) i zlicza właśnie do 25 po czym to wprowadza znak na LCD:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Tylko moze nie kliknales "rozwiń kod" bo normalnie jest zwinięty w poście

    0
  • #13 25 Lut 2014 16:13
    emarcus
    Poziom 35  

    smithpl napisał:
    emarcux w poscie#5 masz dokładnie podprogram przerwania, który jest uruchamiany co 4ms ( z przerwania ) i zlicza właśnie do 25 po czym to wprowadza znak na LCD:............

    Tylko moze nie kliknales "rozwiń kod" bo normalnie jest zwinięty w poście


    Ja widziałem cały code.....

    Wysłanie jakiejś pośredniej informacji do LCD nie jest równoważne z postawieniem flagi (znacznika).
    Flaga jest to dodatkowa zmienna, którą 'obserwuje' program i przy jej zmianie, zwykle powoduje wykonanie jakiejś czynności, a po jej wykonaniu flaga jest zerowana.
    Taki jest sens i cel stosowania flagi.
    Twojej flagi "-" na LCD processor nawet nie czyta i jest ona bez znaczenia dla dalszego przebiegu programu.

    e marcus

    0