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.

Atmega8 - Timer1 - pytanie o kierunek zliczania

Inca Roca 28 Wrz 2012 12:27 942 2
  • #1 28 Wrz 2012 12:27
    Inca Roca
    Poziom 2  

    Witam!
    Pierwsze kroki z uC, czyli próba stworzenia zegara matki dla czasomierza podobnego do tego.
    Mechanizm reaguje na impulsy 24V, o odwracanej biegunowości, podawane co mniutę.

    Procesor Atmega8 (bo taki akurat leżał od dawien dawna w szufladzie), IDE - Bascom AVR 1.11.9.5, kompilator 1.11.8.1.
    Na razie jestem na etapie uzyskania impulsów cominutowych na dwu wyjściach (D0 i D1) naprzemian. Impulsy te docelowo będą sterować mostkiem H.

    Prosty programik:

    Code:
    $regfile = "m8def.dat"
    
    $crystal = 2000000

    Config Pind.0 = Output
    Config Pind.1 = Output
    Config Timer1 = Timer , Prescale = 64

    Dim Licz_2s As Byte
    Dim Parz As Bit

    Enable Interrupts

    Enable Timer1

    Load Timer1 , 62500

    Licz_2s = 0
    Parz = 0

    Do
    Loop

    End

    Odmierz_1m:

     Incr Licz_2s
     If Licz_2s = 29 Then
      If Parz = 0 Then Portd.0 = 1
      If Parz = 1 Then Portd.1 = 1
     End If
     If Licz_2s = 30 Then
      Portd.0 = 0
      Portd.1 = 0
      Toggle Parz
      Licz_2s = 0
     End If
     Load Timer1 , 62500

    Return

    nawet działa. Na razie na wewnętrznym oscylatorze, więc dokładność odmierzania czasu jest raczej umowna. Ale, nie w tym rzecz.
    Otóż "Load Timer1" to wartość wpisywana do licznika, od której ma zacząć odliczanie, aż do wygenerowania przerwania po przepełnieniu.

    I tu pytanie: liczy w górę, czy w dół?

    Pytam, bo kiedy wpisywałem liczbę 5000, impulsy wyjściowe pojawiały się co ok. 5 sekund, zaś przy widocznych w kodzie 62500, co ok. minutę, czyli niby ok.
    Tylko dlaczego od tych sześćdziesięciu paru tysięcy do przepełnienia upływa więcej czasu, niż od pięciu tysięcy?
    Czyżby Timer1 liczył w dół?
    A może to kompilator w jakiś sposób konwertuje - np. neguje - podawaną w kodzie wartość?
    Wie ktoś może, o co chodzi?

    Inna sprawa - początkowo procek w ogóle ignorował jakąkolwiek wpisywaną wartość. Jak się okazało, błąd był "syntaktyczny" - chciałem użyć komendy "Load Timer1 = 62500". Niestety, kompilator nie sygnalizował żadnej nieprawidłowości - konwertował normalnie, program się wgrywał i wykonywał, tyle, że rozkaz "Load" był w ogóle ignorowanyi timer liczył pełne 65536 impulsów.

    Pytanie na przyszłość: czy Bascom AVR oferuje więcej takich "niespodzianek"?

    0 2
  • Pomocny post
    #2 28 Wrz 2012 13:37
    Mol
    Poziom 30  

    Ja zawsze wpisuję Timer1 = var i to jest wartość początkowa licznika , a wpisując instrukcję load , podajesz ilość impulsów do zliczenia , a nie wartość początkową timera, kompilator sam wylicza wartość początkową.( chyba ). Timery zliczają w górę.

    0
  • #3 28 Wrz 2012 14:16
    Inca Roca
    Poziom 2  

    To by się zgadzało - w help-ie jest chyba nawet wyjaśnione:

    Cytat:
    So LOAD TIMER0, 10 will load the TIMER0 with a value of 246 so that it will overflow after 10 ticks.

    Wystarczyłoby uczyć się języków :)
    Dzięki!

    0
  Szukaj w 5mln produktów