Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Attiny 2313 zegarek na timer0

Marcin1326 24 Sep 2006 22:37 1607 3
  • #1
    Marcin1326
    Level 13  
    Witam,
    Próbuję uruchomić zegarek na procku ATtiny2313. Problem w tym że zegarek (stoper) działa za wolno - nie chodzi tu o precyzyjne odmierzanie czasu ale dziesiątki sekund zmieniają sie z prędkością sekund.
    Program jest z mikroprocesorowej oślej łączki z edw. Tam użyty był at90s2313, ale jeżeli dobrze wyczytałem w nocie katalogowej to timer0 w obu działa tak samo. Czy ktoś wie w czym tkwi błąd? Wewnętrzny oscylator jest ustawiony na 4Mhz, więc teorytycznie powinno to chodzić.
    Aha - w orginalny program był na wyświetlaczach LED a nie LCD- jeśli ma to znaczenie.

    Program:

    
    'C012a      Bardzo prosty stoper 0,1-sekundowy
    
    Dim Dziesek As Byte , Sekjed As Byte , Sekdzies As Byte , Minjed As Byte
    Dim 100ms As Byte , Ktorywysw As Byte , Licz As Bit
    Config Portb = 255 : Portb = &B11111111 : Config Portd = &B1111100 : Portd = &B1111111
    Config Timer0 = Timer , Prescale = 64 : Enable Interrupts : Enable Timer0
    Dziesek = 0 : Sekjed = 0 : Sekdzies = 0 : Minjed = 0
    On Timer0 Co4ms
    
    Config Lcd = 16 * 2
    
    Do : Loop : End                                             'to jest główny program - pusta nieskończona pętla
    
    Co4ms:                                                      'procedura obsługi przerwania od Timera T/C0 wykonywana co 4ms
    Timer0 = 6                                                  'załaduj do Timera0, żeby zliczył 250 (=256-6) impulsów
    If Pind.0 = 0 Then Licz = 1                                 'sprawdź stan S1 i ewentualnie rozpocznij zliczanie czasu
    If Pind.1 = 0 Then Licz = 0                                 'sprawdź stan S2 i ewentualnie zakończ zliczanie czasu
    If Licz = 1 Then                                            'tylko wtedy, gdy stoper ma liczyć czas
       Incr 100ms                                               'co 4ms zwiększ wartość licznika o nazwie 100ms
       If 100ms = 25 Then                                       'skróc cykl licznika 100ms właśnie do 100ms
          100ms = 0                                             'czyli 0,1 sekundy
          Incr Dziesek                                          'co 0,1s zwiększ stan licznika dziesiatych części sekundy
          If Dziesek = 10 Then                                  'ten licznik liczy do dziesieciu
             Dziesek = 0                                        'czyli cykl trwa 1 sekundę
             Incr Sekjed                                        'co 1 sekundę  zwiększ licznik jednostek sekund
             If Sekjed = 10 Then
                Sekjed = 0                                      'co 10 sekund
                Incr Sekdzies                                   'zwiększ stan licznika dziesiatek sekund
                   If Sekdzies = 6 Then                         'liczy do 6 bo minuta ma 60 sekund
                      Sekdzies = 0
                      Incr Minjed                               'co 60 sekund zwiększ stan licznika minut
                         If Minjed = 10 Then Minjed = 0         '0...9 minut
                   End If                                       'więc maksymalny stan licznika to:
             End If                                             '9 minut, 59 sekund i 9 dziesiatych sekundy
    
          End If
       End If
    End If
    
    Cls
    Lcd Minjed ; " " ; Sekdzies ; Sekjed ; " " ; Dziesek ; 100ms
    
    Return                                                      'koniec procedury obsługi przerwania
  • Helpful post
    #2
    ja_dzik
    Level 18  
    Problem pewnie tkwi w tym ze masz żle ustawione fusebity. Jest taka opcja ze moża sygnał zegarowy dzielic prze 8
    i wtedy procesor pracuje 8 razy wolniej. Zamias sie bawic w fusebitach mozesz po prostu zmienic program. Zamiast:
    Prescale = 64

    wpisz:
     Prescale = 8

    W załączniku są pokazene ustawienia fusebitów. Strzałką zaznaczyłem fusebi odpowiedzialny za dzielenie sygnału zegarowego przez 8. W twoim przypadku powinno byc zmienione na: "Divide clock by 8 disabled"
    Pozdrawiam.
  • #3
    Marcin1326
    Level 13  
    Dzięki wielkie! Znalazłem już tego wrednego fusebita i go przełączyłem :D. Wszystko śmiga jak trzeba.
  • #4
    ja_dzik
    Level 18  
    Ciesze sie bardzo ze mogłem pomóc.