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

ATmega32 i timer1. Odmierzanie czasu w przybliżeniu 1s.

grzesio14 07 Sie 2006 12:47 1383 2
REKLAMA
  • #1 2888787
    grzesio14
    Poziom 14  
    Posty: 138
    Witam.
    Chcę za pomocą Timera1 odmierzyć czas w przybliżeniu 1 s (dokładność do 0,1 s).


    • Wprowadzam następującą konfiguracje:
      ldi Temp, 0x29 ;załadowanie do r16 wartości
      ldi R20, 0x29 ;załadowanie do r17 wartości
      out TCNT1H, Temp ;wpisanie do rejestru TCNT1L wartości
      out TCNT1L, R20 ;wpisanie do rejestru TCNT1H wartości
      out TCCR1A,r29 ;wpisanie do rejestru TCCR1A wartości 0 - zwykły licznik
      ldi Temp,0x05 ;;załadowanie do r16 wartości 5
      out TCCR1B,Temp ;wpisanie do rejestru TCCR1B wartości 5 - konfiguracja licznika- prescaler
      ldi Temp,0x04 ;załadowanie do r16 wartości 5
      out TIMSK,Temp ;wpisanie do rejestru TIMSK wartości 4 - uaktywnienie przerwania po przepełnieniu licznika
      ldi Temp,0x00 ;załadowanie do r16 wartości 0
      out TIFR,Temp ;wpisanie do rejestru TIFR wartości 0 - Flaga przepełnienia licznika

      ;Obsługa przerwania wygląda zaś następująco:

      lpm Tem,Z
      out PORTC, Tem ; wyświetl liczbę z tabeli na port C
      adiw ZH:ZL,1 ; zwieksz o 1 Z
      reti



    Efekt jest taki, że kolejne znaki pobierane są i wyświetlane z większą prędkością niż zadana.
    Stwierdziłem również, że zmiana wartości rejestrów TCNT1 nie ma istotnego wpływu na szybkość wyświetlania.
    Jedynie zmiana prescalera zmienia szybkość wyświetlania.
    Przejrzyjcie listing i powiedzcie co jest źle lub czego brak.
    Grzegorz.
  • REKLAMA
  • #2 2889002
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Drogi kolego.
    Jeśli już chcesz pisać programy w asemblerze , to musisz się bardziej przyłożyć , oraz dokładnie zapoznać się z budową wewnętrzną proca , z funkcjami jego rejestrów , sposobami dostępu do nich , itd. itp.
    Tyle jeśli chodzi o ględzenie :)
    Twój problem wiąże się z tym , że w przerwaniu nie ładujesz do licznika wartości początkowej , takiej jak przy "rozruchu". Poza tym , jeśli używasz jakiś rejestrów w przerwaniu i jednocześnie korzystasz z nich w programie , głównym , to zanim ich użyjesz zachowaj je na stosie. Zachowanie rejestru SREG w przerwaniu , to niemal obowiązek.Natomiast jeśli chcesz skasować jakiś bit w rejestrze TIFR , to musisz na jego miejsce wpisać 1 , a nie 0.
    Tyle narazie .

    Piotrek
  • #3 3573533
    grzesio14
    Poziom 14  
    Posty: 138
    Dzięki za pomoc.
    działa.
    Grzegorz.
REKLAMA