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

Jak napisać zegarek w Bascom na Attiny2313-20PU?

xŁolesxxx 30 Mar 2008 18:03 1913 21
REKLAMA
  • #1 4973627
    xŁolesxxx
    Poziom 14  
    Posty: 163
    Ocena: 2
    Witam od jakiegoś czasu próbuję w Bascom napisać zegarek (lub coś co precyzyjnie odmierza czas), ale niestety nie wychodzi mi to, mógłby mi ktoś pomoc udzielić wskazówki bo już sie powoli gubię
  • REKLAMA
  • #2 4973750
    Michał_z1
    Poziom 16  
    Posty: 190
    Pomógł: 13
    Ocena: 2
    witam.
    W internecie jest takich przykładów mnóstwo, wystarczy poszukać, ale napewno skup się na tym, aby kożystać z przerwań wywołanych zliczaniem taktów generatora kwarcowego.
    pozdrawiam.
  • #3 4973920
    xŁolesxxx
    Poziom 14  
    Posty: 163
    Ocena: 2
    Probowałem timer0 i timer1 ale obliczenia się nie zgadzają z rzeczywistością
  • REKLAMA
  • #4 4973979
    lelekx
    Poziom 30  
    Posty: 1220
    Pomógł: 158
    Ocena: 90
    To nie jest najszczęśliwszy wybór na zegarek. Poszukaj mikrokontrolera z asynchronicznym licznikiem (np. Mega8) - one się do tego nadają wyśmienicie.
  • REKLAMA
  • #5 4974261
    Michał_z1
    Poziom 16  
    Posty: 190
    Pomógł: 13
    Ocena: 2
    xŁolesxxx napisał:
    Probowałem timer0 i timer1 ale obliczenia się nie zgadzają z rzeczywistością

    no tak próbowałem...........lale nie szukałem........ zobacz http://www.edw.com.pl/pdf/k10/81_36.pdf i resztę "opowieści" na stronie wydawnictwa na ten sam temat. O zegarku i odliczaniu czasu było dużo napisane.
    A tak na marginesie kolego lelekx każdy mikro kontroler nadaje się na zegarek, kwestia zliczenia odpowiedniej liczby przerwań, ewentualnie doboru rezonatora taktującego procek.
    pozdrawiam.
  • REKLAMA
  • #6 4974409
    lelekx
    Poziom 30  
    Posty: 1220
    Pomógł: 158
    Ocena: 90
    Niestety rezonatory o wyższych częstotliwościach potrafią mieć spory rozrzut parametrów, pływają też pod wpływem temperatury znacznie bardziej, niż kwarce 32kHz. Na krótkich dystansach używanie ogólnych timerów jest dobrym wyborem, jednak po dobie lub dwóch różnica wskazań takiego zegara względem rzeczywistego czasu może sięgać kilkunastu sekund.
    Asynchroniczny timer w AVRach ma sporo zalet, a najważniejsza z nich to praca mimo wyłączonego głównego rezonatora. Wspaniale spisuje się to przy zasilaniu bateryjnym.
  • #8 4974436
    lelekx
    Poziom 30  
    Posty: 1220
    Pomógł: 158
    Ocena: 90
    Wracając do tematu, może taka dokładność starczy. Skoro masz ATTiny2313, to może warto spróbować.
    W jakim języku piszesz program? Jakiego kompilatora używasz? Wrzuć tu kawałek tego programu (a nawet lepiej cały), przyjrzymy się i doradzimy.
  • #9 4975008
    xŁolesxxx
    Poziom 14  
    Posty: 163
    Ocena: 2
    Język w jakim pisze to Bascom.
    Program Bascom-AVR.



    A oto kod programu, może gdzieś popełniam błąd w obliczeniach, bo ta sekunda to trwa około 3 - 4 sekundy
    Dim Sekjed As Byte
    Config Portb = 255 : Portb = &B255 : Config Portd = &B1111100 : Portd = &B1111111
    Config Timer0 = Timer , Prescale = 64 : Config Timer1 = Timer , Prescale = 64
    Enable Interrupts : Enable Timer0 : Enable Timer1
    On Timer0 Co4ms : On Timer1 Co1s
    Sekjed = 0
    
    
    
    Do : Loop : End
      Co1s:
    Timer1 = 3036
    
    
    
       Cls
       Lcd Sekjed
       Incr Sekjed
    
    
      Return
    
    
    
      Co4ms:
    
      Return
    
  • #11 4975186
    xŁolesxxx
    Poziom 14  
    Posty: 163
    Ocena: 2
    $crystal do czego to służy.
  • #12 4975200
    Balu
    Poziom 38  
    Posty: 4397
    Pomógł: 323
    Ocena: 48
    Ta....
    1) Help, jest ładnie opisane...
    2) Co masz ustawione jako wejście impulsów? (Co zliczają liczniki)?
    3) Portb = &B255 co to za twór?
  • #13 4975262
    xŁolesxxx
    Poziom 14  
    Posty: 163
    Ocena: 2
    Co do drugiej opcji to nie za bardzo wiem o co pytasz.
    $crystal w domyślnych ustawieniach jest na 4mhz.
  • #14 4975289
    Balu
    Poziom 38  
    Posty: 4397
    Pomógł: 323
    Ocena: 48
    Mhm 4MHz, a ile masz w procku? Czyżby 1Mhz?:>
    2) chodziło mi o nakłonienie Cię do przemyśleń, co jest źródłem impulsów które zlicza licznik.. I że to całkiem przypadkiem jest kwarc systemowy... a co za tym idzie, jak nie masz wpisane w programi $crystal=xxxx to pewnie nie wiesz, jaką masz częstotliwość w układzie.
    Naucz się za każdym razem wpisywać całą konfigurację wewnątrz programu.
    3) więc co to za twór?
  • #15 4975308
    xŁolesxxx
    Poziom 14  
    Posty: 163
    Ocena: 2
    Ten twór jest powodem tego że to był zegar pod wyświetlacz led, a został przerobiony na lcd.

    Skoro 4Mhz to 0.25 us
    to czy 1Mhz będzie 1 us ?
    Jak ustawić zliczanie z zewnętrznego kwarcu który ma 4Mhz?
  • #16 4975344
    Balu
    Poziom 38  
    Posty: 4397
    Pomógł: 323
    Ocena: 48
    Bardziej chodziło mi o to, że &B wskazuje na następującą liczbę binarną... 255 to takie nie jest;)

    Jak zmienić zegar? Przede wszystkim, zmienisz zegar całego uC, nie zegar podany na timery, po drugie programator -> zakładka fusebity -> dalej już chyba łatwo:)

    tak 1MHz^-1 = 1uS:)
  • #17 4975390
    xŁolesxxx
    Poziom 14  
    Posty: 163
    Ocena: 2
    z fusbitami nie za bardzo, nawet nie widzę tam zakładki fusbity.


    Nie rozumiem?
    Balu napisał:

    Jak zmienić zegar? Przede wszystkim, zmienisz zegar całego uC, nie zegar podany na timery


    A taktowanie rzeczywiście było 1Mhz
  • #18 4975403
    Balu
    Poziom 38  
    Posty: 4397
    Pomógł: 323
    Ocena: 48
    Cytat:

    Jak ustawić zliczanie z zewnętrznego kwarcu który ma 4Mhz?

    Ja wywnioskowałem, że chcesz zmienić nie zegar systemowy a jedynie zegar samych liczników- tak się nie da (no poza timer2).

    Jak zmienić już Ci piszę:)

    Program -> send to chip-> manual program
    Zakładka Lock and fusebits.
  • #19 4975427
    xŁolesxxx
    Poziom 14  
    Posty: 163
    Ocena: 2
    To już wiem gdzie ale nie za bardzo wijem jak.
  • #21 4977200
    xŁolesxxx
    Poziom 14  
    Posty: 163
    Ocena: 2
    Udało mi się to poustawiać.
    Procesor korzysta z zewnętrznego kwarcu 4Mhz.
    Program wygląda tak
    
    
    Dim Sekjed As Byte , Sekdzies As Byte , Minjed As Byte , Mindzies As Byte , Maxi As Byte
    Dim , Godzjed As Byte , Godzdzies As Byte , Mux As Byte , Migaj As Bit , Uniwers As Byte
    Config Portb = 255 : Portb = &B255 : Config Portd = &B1111100 : Portd = &B1111111
    Config Timer1 = Timer , Prescale = 64
    Enable Interrupts : Enable Timer1
    On Timer1 Co1s
    Sekjed = 0 : Sekdzies = 0 : Minjed = 6 : Mindzies = 5 : Godzjed = 4 : Godzdzies = 1
    Uniwers = 0 : Maxi = 100
    
    Do
    
    
    
    'Lowerline
    ' Lcd
    
    
    
     Loop : End
    
    Co1s:
    
    Timer1 = 3036
    
    
    
       Incr Sekjed : Toggle Migaj
    If Sekjed = 10 Then
       Sekjed = 0
       Incr Sekdzies
       If Sekdzies = 6 Then
          Sekdzies = 0
          Incr Minjed
          If Minjed = 10 Then
             Minjed = 0
             Incr Mindzies
             If Mindzies = 6 Then
                Mindzies = 0
                Incr Godzjed
                If Godzjed = 10 Then
                   Godzjed = 0
                   Incr Godzdzies
    End If : End If : End If : End If : End If
    If Godzdzies = 2 And Godzjed = 4 Then
       Godzdzies = 0 : Godzjed = 0
    End If
    
    
    
    
    
    
    
    
       Cursor On Off
    
       Cls
       Lcd Godzdzies
       Lcd Godzjed
       Lcd ":"
       Lcd Mindzies
       Lcd Minjed
       Lcd ":"
       Lcd Sekdzies
       Lcd Sekjed
    
    Return
    

    1. I mam pytanie czy wszystko dobrze jest obliczone, a szczególnie czy Timer1 = 3036 jest dobrą wartością(aby zegarek chodził prawidłowo).

    2. I kolejne pytanie przy ustawaniu fusebitów co znaczą te wartości:
    2a. CKSEL = 1100
    2b. SUT = 00
    2c. Start-up timer: 14 CK + 4.1ms
    2d. Ext.Crystal Osc

    3. I jeszcze jedno czy w programie musi być deklaracja $crystal
  • #22 4977386
    Balu
    Poziom 38  
    Posty: 4397
    Pomógł: 323
    Ocena: 48
    2) CKSEL ClocKSELect
    SUT StartUpTime
    2c+2d=2a+2b;
    Ładnymi słowy opisane co wybrałeś:)

    3) Nie musi być, ale to jest ZDROWY nawyk.
    Zmieniasz potem urządzenie kompilujesz i zapominasz zmienić częstotliwość w opcjach kompilatora -> dziwisz się potem że nie działa...

    Dodano po 2 [minuty]:

    @2 D O K U M E N T A C J A

Podsumowanie tematu

✨ Dyskusja dotyczy implementacji zegarka w języku Bascom na mikrokontrolerze Attiny2313-20PU. Problemem jest precyzyjne odmierzanie czasu, gdyż próby wykorzystania timerów (Timer0, Timer1) z preskalerem 64 dają błędne wyniki – sekunda trwa około 3-4 sekund. Zalecane jest korzystanie z przerwań generowanych przez zliczanie taktów kwarcowego generatora oraz poprawne ustawienie częstotliwości taktowania procesora za pomocą dyrektywy $crystal, która powinna odpowiadać rzeczywistemu kwarcowi (np. 4 MHz). Wskazano, że brak prawidłowej konfiguracji fusebitów i częstotliwości w programie powoduje błędy w odmierzaniu czasu. Poruszono temat asynchronicznych liczników w mikrokontrolerach AVR (np. Mega8), które lepiej nadają się do precyzyjnego odmierzania czasu, zwłaszcza z kwarcem 32 kHz, ze względu na mniejszą dryft temperatury i stabilność. Użytkownik ostatecznie ustawił procesor na zewnętrzny kwarc 4 MHz i poprawił kod, stosując odpowiednie wartości przeładowania timera (Timer1 = 3036) oraz inkrementację zmiennych sekund, minut i godzin. Podkreślono znaczenie dokładnej konfiguracji zegara systemowego i fusebitów w programatorze, aby timer działał zgodnie z oczekiwaniami.
Wygenerowane przez model językowy.
REKLAMA