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

ATtiny2313 timer0 przerwanie co 4ms przy 4MHz, ustawienia w Bascom AVR

xifyh 15 Sie 2007 20:17 1902 10
REKLAMA
  • #1 4181536
    xifyh
    Poziom 20  
    Posty: 513
    Pomógł: 3
    Ocena: 66
    Chcę uzyskać w timerze0 przerwanie co 4 ms mam oscylator 4 Mhz na attiny2313, programuje w bascomie. Robie to tak

    
    Config Portb = &B11111111
             Portb = &B11111111
    
    Config Portd = &B1111100
             Portd = &B0111111
    
    Config Timer0 = Timer , Prescale = 64
    Enable Interrupts
    Enable Timer0
    On Timer0 Przerwanie
    
    Dim Liczy As Bit
    Dim 100ms As Byte
    Dim Dziesek As Byte
    Dim Sekjed As Byte
    Dim Sekdzies As Byte
    Dim Minjed As Byte
    Dim Ktorywysw As Byte
    
    
    Do
    
    Loop
    End
    
    Przerwanie:
    Timer0 = 6
    If Pind.0 = 0 Then Liczy = 1
    If Pind.1 = 0 Then Liczy = 0
    If Liczy = 1 Then
       Incr 100ms
       If 100ms = 25 Then
          100ms = 0
          Incr Dziesek
          If Dziesek = 10 Then
             Dziesek = 0
             Incr Sekjed
             If Sekjed = 10 Then
                Sekjed = 0
                Incr Sekdzies
                If Sekdzies = 6 Then
                   Sekdzies = 0
                   Incr Minjed
                      If Minjed = 10 Then Minjed = 0
                End If
              End If
           End If
        End If
    End If
    
    Incr Ktorywysw
    If Ktorywysw = 4 Then Ktorywysw = 0
    Portd.3 = 1
    Portd.4 = 1
    Portd.5 = 1
    Portd.6 = 1
    
    Select Case Ktorywysw
    Case 0:
    Portb = Lookup(dziesek , Tabela)
    Portd.3 = 0
    Case 1:
    Portb = Lookup(sekjed , Tabela)
    Portd.4 = 0
    Case 2:
    Portb = Lookup(sekdzies , Tabela)
    Portd.5 = 0
    Case 3:
    Portb = Lookup(minjed , Tabela)
    Portd.6 = 0
    End Select
    
    Return
    
    Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144
    
    


    Jak widać jest to stoper. Jestem poczatkujacy i nie kumam czemu mi miga wyswietlacz i liczba która ma sie zmienić co 100ms zmienia sie co ~4 sekundy.
  • REKLAMA
  • #2 4181600
    Nostradamus
    Poziom 17  
    Posty: 233
    Pomógł: 14
    Ocena: 4
    a zmieniłes Fuse Bity?? Bo Attiny2313 pracuje standardowo z zegarem chyba 1MHz.
  • #3 4181670
    xifyh
    Poziom 20  
    Posty: 513
    Pomógł: 3
    Ocena: 66
    zmienilem fusebity na 4 Mhz orginalnie było 8 Mhz
  • REKLAMA
  • #4 4181687
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    Oryginalnie był też ustawiony CKDIV8 - jeśli nadal jest zaprogramowany, to teraz procek będzie chodził tak, jak na zegarze 0.5MHz.

    ps. brakuje w kodzie przypisania szybkości zegara - bez tego kompilator bascoma obierze sobie domyślą wartość (chyba, że można podać prędkość zegara też w innym miejscu)
  • #5 4181739
    xifyh
    Poziom 20  
    Posty: 513
    Pomógł: 3
    Ocena: 66
    juz to ustawilem i jest ok, ale i tak nie jest to dokładny stoper. Dzięki za rady :D
  • #6 4181779
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    Najbardziej wątpliwe w pracy tego timera jest przeładowywanie wartości w kodzie programu. Licznik w 4ms zwieksza swoją wartość o 250, więc przypisanie wartości "6" jest sensowne, ale jeśli to przypisanie nastąpi później niż po 64 cyklach od wystąpienia przepełnienia, to przerwania będą wywoływane rzadziej.. Polecał bym tryb pracy CTC.

    ps. zaczynanie nazwy zmiennej od cyfr to zły nawyk.
  • #7 4181820
    xifyh
    Poziom 20  
    Posty: 513
    Pomógł: 3
    Ocena: 66
    W sumie to teraz krytykujesz nie mnie a Piotra Góreckiego - redaktora naczelnego Elektroniki dla wsyztskich, ponieważ ten program jest żywcem przepisany z cyklu mikroprocesorowa osla łączka xD Dodałem teraz zewnętrzny kwarc 4 Mhz i jest idealnie. Testuje razem ze stoperem komórkowym.

    Cytat:

    Polecał bym tryb pracy CTC.


    co to w ogóle jest?

    I jeszcze chciałbym zapytać dlaczego wewnętrzny oscylator 4 Mhz "śpieszy się" ? Gdy podłaczyłem zewnętrzny jest idealnie.
  • REKLAMA
  • #8 4181944
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    Tryb CTC to tryb pracy timera, w którym przerwanie (od porównania, nie przepełnienia) jest wywoływane na skutek zrównania się wartości timera z rejestrem OCRA timera (jest o tym w dokumentacji do attiny2313). Moje wytknięcie jest raczej przypuszczeniem. Jeśli ów redaktor sprawdził, upewnił się, że wartość do timera jest wpisywana w dopuszczalnym zakresie 64 cykli od momentu wystąpienia przerwania, to nie ma problemu. Głównie wytknięcie wynika z tego, że mnie bascom kojarzy się z czymś nieprzewidywalnym czasowo.

    Co do pracy na wewnętrznym zegarze - używam terminu "zegar", nie "oscylator" - zegar wewnętrzny to generator RC, a śpieszyć się on może z powodu rozrzutu produkcyjnego elementów składających się na generator RC. O ile pamiętam, to pomimo kalibrowania w procesie produkcji nadal istnieje rozrzut 1% oraz możliwość zmiany prędkości na skutek zmiany napięcia zasilającego jak i warunków pracy kontrolera (do korygowania prędkości istnieje rejestr OSCCAL, ale do korygowania prędkości potrzeba zewnętrznego sygnału referencyjnego - np kwarc zegarkowy 32768Hz [no i soft])
  • #9 4182799
    xifyh
    Poziom 20  
    Posty: 513
    Pomógł: 3
    Ocena: 66
    Czyli najlepiej jest zastosować jakiś układ dallas do precyzyjnego odmierznia czasu? WIdzialem takie coś w różnych projektach na lampach nixie. Narazie jeszcze nie wiem jak tego używac ale sie dowiem :)

    Teraz przez 10 h pracy mój stoper późni sie o 3 sekundy z zegarem z komputera.
  • REKLAMA
  • #10 4182849
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    Rezonatory kwarcowe są dość dokładne: +/- 50ppm, a w kwarcach zegarkowych około +/- 20ppm. Nie potrzebujesz chyba jakiegoś wzorca czasu z dokładnością zegarów atomowych, więc powinien wystarczyć zewnętrzny kwarc.
  • #11 4186494
    Ch.M.
    Poziom 27  
    Posty: 1009
    Pomógł: 62
    Ocena: 15
    Dokładnie, potrzebny zewnętrzny RTC jeśli chcesz zrobić kalendarz +/-20ppm to już na prawde ogromna dokładność i taki układ zapewne będzie kosztować z kilkanaście złotych. +/-70ppm zapewne kupisz za pare złotych. Dobre sa układy wylutowane z płyt głównych - i całkowicie za darmo. Wewnętrzny oscylator na wzmacniaczach operacyjnych będzie mocno uzależniony od temperatury i od napięcia zasilania, dlatego niespecjalnie nadaje sie do Twojego zastosowania. Juz nie wspomne o Bascomie....
    Jeśli chcesz pod nim coś napisać to znajdz gotowa kość z kalendarzem i alarmem sterowana przez I2C
    Pozdrawiam

Podsumowanie tematu

✨ Dyskusja dotyczy uzyskania przerwania co 4 ms na timerze0 mikrokontrolera ATtiny2313 z zegarem 4 MHz, programowanego w Bascom AVR. Problemem było ustawienie fuse bitów i konfiguracja zegara – domyślnie procesor pracuje z 1 MHz, a dodatkowo może być aktywny dzielnik CKDIV8, co obniża częstotliwość do 0,5 MHz. Zalecane jest poprawne ustawienie fuse bitów i deklaracja częstotliwości zegara w kodzie Bascom. Wątpliwości budzi sposób przeładowywania licznika timer0 – przypisanie wartości bezpośrednio w przerwaniu może powodować nieregularne wywołania przerwań, dlatego sugerowany jest tryb CTC (Clear Timer on Compare Match) z wykorzystaniem rejestru OCRA. Wewnętrzny oscylator RC 4 MHz może mieć rozrzut częstotliwości i wpływ na dokładność pomiaru czasu, co potwierdzono testami z zewnętrznym kwarcem 4 MHz, który zapewnia lepszą precyzję. Wskazano, że wewnętrzny oscylator jest podatny na zmiany napięcia i temperatury, a do precyzyjnego odmierzania czasu lepiej stosować zewnętrzny rezonator kwarcowy lub układ RTC (np. z interfejsem I2C). Wskazano również, że nazwy zmiennych nie powinny zaczynać się od cyfr.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA