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

[Atmega328] Timer2 - przyśpiesza

maximus22_kr 28 Lis 2011 00:31 2255 26
REKLAMA
  • #1 10191500
    maximus22_kr
    Poziom 18  
    Witam
    Mam uruchamiany zapis na SD przez Timer2.
    Jeśli dobrze wyczytałem w Atmega328 Timer2 jest 8-bitowy.

    Czyli dla kwarcu 8 MHz z preskalerem 64 powinien się przepełniać co 2 ms, a więc chcąc mieć zapis co 2 minuty zmienna Licznik_sd ( typu Word )
    
    Czas:
    Timer2 = Timer2 + 6
    If Licznik_sd = 60000 Then            'Licznik dla zapisu co 120 sekund ( 60000 x 2 )
     Flaga_sd_save = 1
     Licznik_sd = 0
     End If
    Return
    


    Zapis wywołuje tak:
    
    If Flaga_sd_save = 1 Then
     Licznik_symbol_sd = 0    '( Licznik do odliczania czasu wyświetlania symbolu SD )
      Locate 1 , 20
     Lcd Chr(4)
     Pwm1b = 150
    
     Call Write_to_sd()
      Flaga_sd_save = 0
    End If
    
    



    Na razie dla testu zapisuje na karcie datę i godzinę - wynik jest taki:
    "27/Lis/11" "23:51:21 Nd"
    "27/Lis/11" "23:53:23 Nd"
    "27/Lis/11" "23:55:26 Nd"
    "27/Lis/11" "23:57:29 Nd"
    "27/Lis/11" "23:59:31 Nd"
    "28/Lis/11" "00:01:34 Pn"
    "28/Lis/11" "00:03:37 Pn"
    "28/Lis/11" "00:05:39 Pn"
    "28/Lis/11" "00:07:42 Pn"
    "28/Lis/11" "00:09:45 Pn"
    "28/Lis/11" "00:11:47 Pn"
    "28/Lis/11" "00:13:50 Pn"
    "28/Lis/11" "00:15:53 Pn"
    "28/Lis/11" "00:17:55 Pn"
    "28/Lis/11" "00:19:58 Pn"
    "28/Lis/11" "00:22:00 Pn"
    "28/Lis/11" "00:24:03 Pn"

    mam świadomość, że zegar na PCF8563 może spóźniać/przyśpieszać, ustawiłem go dokładnie według zegara w komputerze i porównując go przez godzinę, nic się zmieniło. No i skąd mogą być te 3 sekundy ?
  • REKLAMA
  • #2 10191549
    adiabel
    Poziom 17  
    Nie bierzesz pod uwagę czasu obsługi programu.(tolerancja częstotliwości kwarcu zawsze jest i to nie wiadomo jaka bo jest +/-).
    Skoryguj zmienną "sd" na mniejszą wartość i dalej metodą prób i błędów , bo to jest najłatwiejsze.
    Ja kiedyś liczyłem i udało mi się uzyskać dokładność 1 sek/rok , ale kosztowało mnie to dużo pracy obliczeniowej. Lepiej to zrobić metodą jak wyżej napisałem ; prościej i szybciej.
    Pozdrowienia i powodzenia.
  • #3 10191576
    dondu
    Moderator na urlopie...
    maximus22_kr napisał:
    mam świadomość, że zegar na PCF8563 może spóźniać/przyśpieszać, ustawiłem go dokładnie według zegara w komputerze i porównując go przez godzinę, nic się zmieniło. No i skąd mogą być te 3 sekundy ?

    Z dokładności elementów generujących sygnał taktujący, zarówno mikrokontroler, jak i komputer, który zastosowałeś jako wzorzec czasu: http://mikrokontrolery.blogspot.com/2011/04/stopery-timery-itp.html
  • REKLAMA
  • #4 10191633
    piotr5000
    Poziom 21  
    Czy na pewno ustawiłeś procesor do pracy z kwarcem 8 MHz
    a może RC 8MHz
  • #5 10191817
    mmacura
    Poziom 18  
    Timer przepełnia się dokładnie co 2,048ms a nie co 2ms.
    Przy 60000 zliczeń daje to 2,88 sekundy różnicy.
  • #6 10191896
    modymat
    Poziom 13  
    Musisz wziąć pod uwagę jeszcze cykle, które wykonuje program. Odejmij je od ilości wykonania pętli i sprawdź. Jeśli dalej będzie źle to doświadczalnie ilość cykli mu odejmij i tak chyba najlepiej ;)
  • REKLAMA
  • #7 10192412
    maximus22_kr
    Poziom 18  
    Kolega mmacura
    Do Timer2 załadowałem 6 - Timer2 = Timer2 + 6 ( przynajmniej taki miałem zamiar ), czyli powinno być 250 - co według kalkulatora powinno dać równe 2 ms
  • REKLAMA
  • #8 10192432
    mmacura
    Poziom 18  
    To gdzie dodajesz 6 do Timer2 to jest wnętrze obsługi przerwania od Timer2 czy robisz to tylko jeden raz.
  • #9 10195925
    piotr5000
    Poziom 21  
    Zmień na: timer2 = 6 !
  • #10 10198834
    maximus22_kr
    Poziom 18  
    tzn. mam tak:
    
    Config Timer2 = Timer , Prescale = 64                       ' 1 sekunda = 500
    Timer2 = 6
    On Timer2 Czas                    '250 x 8us = 2 ms , 256 - 250 = 6
    Enable Interrupts
    Enable Timer2
    


    w podprogramie Timer2 mam tak:

    
    Czas:
    Timer2 = Timer2 + 6
    Incr Licznik_sd
    
    Incr Licznik_symbol_sd
    
    If Licznik_sd = 60000 Then         'Licznik dla zapisu co 120 sekund ( 60000 x 2 )
     Flaga_sd_save = 1
     Licznik_sd = 0
     End If
    


    Jak na razie nadal jest te 3 sekundy - ustawienie wartości Licznik_sd na 58700, powoduje, że zbliża się tego co powinno być.
  • #11 10200121
    piotr5000
    Poziom 21  
    ustaw timer = 6 w podprogramie obsługi przerwania bo tam jest on wywoływany
    " co przerwanie"
  • #12 10201399
    SylwekK
    Poziom 32  
    piotr5000 napisał:
    ustaw timer = 6 w podprogramie obsługi przerwania bo tam jest on wywoływany
    " co przerwanie"

    W tym przypadku najprawdopodobniej spowoduje to, że zegar jeszcze bardziej będzie się późnił, gdyż nie będzie dodawał już odliczonych cykli od momentu wywołania przerwania...
  • #13 10201433
    mmacura
    Poziom 18  
    Było już pytanie o ustawienia Fuse Bits ale nie było odpowiedzi więc ponawiam.
    Czy jesteś pewien że pracujesz na zewnętrznym kwarcu a nie na wewnętrznym generatorze 8MHz?
    Dodatkowo pokaż główną pętlę programu - może tam jest jakieś opóźnienie od ustawienia flagi że minęły 2 minuty.
  • #14 10202250
    maximus22_kr
    Poziom 18  
    Fusebit KLA987 jest ustawiony na 101111 : External Osc.

    Pętla główna
    
    Disable Interrupts
    Call Gettime
    Enable Interrupts
    
    
    Locate 1 , 1
    Lcd Czas_pcf
    Locate 2 , 1
    Lcd Data_pcf
    
    '***************************** Warunek określający częstość zapisu na SD
    
    If Flaga_sd_save = 1 And S <> 59 Then
     Licznik_symbol_sd = 0
      Locate 1 , 20
     Lcd Chr(4)
     Pwm1b = 150
     Incr Numer_sd
     Numer = Str(numer_sd)
     Numer = Format(numer , "0000")
     Call Write_to_sd()
      Flaga_sd_save = 0
      Zapisano = 0
    End If
    
    '***************************** Długość świecenie symbolu  karty SD
    
      If Flaga_sd = 1 Then
      Locate 1 , 20
      Lcd " "
      Pwm1b = 50
      Flaga_sd = 0
     End If
    
    


    Symbol karty SD ma się zaświecić na 2 sekundy ( 1000 x 2 ms )- ale jest to również zrobione na Timer2. Jest to w podprogramie Timer2 - sterowane flagą Licznik_symbol_sd
  • #16 10202314
    maximus22_kr
    Poziom 18  
    Między zapisami
    "0001 18:43:28 Sr 30/Lis/11"
    "0002 18:45:29 Sr 30/Lis/11"
    "0003 18:47:31 Sr 30/Lis/11"
    "0004 18:49:32 Sr 30/Lis/11"
    "0005 18:51:33 Sr 30/Lis/11"
    "0006 18:53:35 Sr 30/Lis/11"

    czy w podprogramie Timer2 powinno być
    Timer2 = 6
    albo
    Timer2 = Timer2 + 6

    Bo ten wpis znalazłem w jednym z kursów EP. Tam też było 2 ms - tyle, że na Timer0, ale Timer0 i Timer2 są 8-bitowe.
  • #18 10202359
    maximus22_kr
    Poziom 18  
    teraz jak widać 2 sekundy - manipuluję wartością przepełnień zmiennej Licznik_sd
    - pomiędzy 58000 a 60000

    Załadowanie wartości 6 do Timer2 powinno się odbyć tylko na początku ?
    
    Config Timer2 = Timer , Prescale = 64                       ' 1 sekunda = 500
    Timer2 = 6
    On Timer2 Czas
    '250 x 8us = 2 ms , 256 - 250 = 6
    Enable Interrupts
    Enable Timer2
    


    Z Atmega32 nie miałem takich problemów, co prawda Timer1, ale bez opóźnień miałem zapis co 5 minut
  • #20 10203012
    piotr5000
    Poziom 21  
    jeżeli prescale = 1024
    timer2 = 100

    to przerwanie wywołasz co 19,968 msek
    co setne przerwanie ustawisz flagę zapisz

    w przerwaniu też TIMER2 = 100 !

    Przeładowanie timera będzie następowało w większych odstępach czasu
    To musi działać
  • #22 10204974
    maximus22_kr
    Poziom 18  
    Wygląda tak, jakby to dodawanie + 6 zupełnie go nie ruszało. Reaguje tylko na zmianę wartości zmiennej Licznik_sd.

    Zmieniłem preskaler na 256 i działa jak trzeba, tzn. Licznik_sd = 60000 to daje 8 minut i tyle jest.
  • #23 10204995
    mmacura
    Poziom 18  
    
    Disable Interrupts 
    Call Gettime 
    Enable Interrupts 
    


    Jeżeli funkcja Gettime trwa zbyt długo to gubisz przerwania od timera.
    Jak zmieniłeś preskaler, to masz przerwania co 8ms i pewnie już się wyrabia.
    Co takiego robi w Bascom Gettime, że trzeba wyłączać przerwania?
  • #24 10205011
    maximus22_kr
    Poziom 18  
    gdzieś wyczytałem, że dobrze jest wyłączyć przerwania na czas odczytu czasu, zwłaszcza, że dodatkowo w przerwaniu zewnętrznym INT1 mam obsługę klawiatury PCF8574
  • #25 10205042
    SylwekK
    Poziom 32  
    Zastanawia mnie jeszcze jedno... przecież ten zegar na pcf ma dość stabilne (jak cały zegar) wyjście taktujące. Dlaczego go nie wykorzystałeś? Nawet nie musiał byś wtedy tych dziesiątek tysięcy zliczać.
  • #26 10205127
    maximus22_kr
    Poziom 18  
    Tzn. ma na myśli Kolega wyjście INT PCF8563 ?
    Nigdy z niego nie korzystałem - można go podłączyć pod INT procesora ? - bezpośrednio, czy raczej przez tranzystor ( w dokumentacji wyczytałem, że to wyjście typu Open Drain )
  • #27 10205327
    SylwekK
    Poziom 32  
    Bardziej mi chodziło o CLKOUT i jego konfiguracja na 1Hz.
    Zobacz temat https://www.elektroda.pl/rtvforum/topic1993492.html
    W ostatnim poście @szandi zamieścił fragment konfiguracji tego wyjścia na 1Hz.
    W przerwaniu (a nawet w pętli głównej jeśli jest "przelotowa") na spokojnie mógłbyś sobie zliczać te 120 impulsów i masz 2minuty.
    Aha, wyjście tego clkout trzeba podciągnąć przez rezystor do plusa.
REKLAMA