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

Asembler (AVR Studio) - jak korzystać z Timera i Countera??

pit_com 14 Sty 2005 21:29 3141 1
REKLAMA
  • #1 1138969
    pit_com
    Poziom 15  
    Posty: 189
    Pomógł: 3
    Ocena: 6
    Jakie komendy obsługują timer i counter w procku 90s2313 pod Asemblerem?? Proszę o pomoc!
  • REKLAMA
  • #2 1139033
    Elektrooonik
    Poziom 29  
    Posty: 1212
    Pomógł: 127
    Ocena: 83
    AVR studio (asembler) to nie Bascom... tu nie ma czegoś takiego jak komendy do obsługi sprzętowych liczników, musisz używać rozkazów uP i konfigurować odpowiednie rejestry i przede wszystkim odpowiednio używać przerwań, bo one są chyba najważniejszym elementem, którego używa się przy pracy z licznikami.

    Musisz wziąć notkę katalogową tego atmelka i przejrzeć, które rejestry są odpowiedzialne za jego pracę, z tego co pamiętam to trzeba skonfigurowac rejestr (dla timera 0) TCCR0, w rejestrze TCNT0 jest aktualna liczba zliczonych impulsów, w rejestrze TIMSK oraz SREG (flaga I) należy skonfigurowac przerwania.

    Procedura obsługi przerwania dla timera 0 jest umieszczona pod adresem 6 w pamieci programu. Ponizej zamieszczam prosciutki programik - efekt swietlny bięgnący punkt na porcie B, a opóźnienie zrealizowane jest własnie z uzyciem Timera0.

    .include  "2313def.inc"
     
    .cseg
    .def acc = r16
    .def zmienna = r17
    .def licznik_przerwan = r19
    .org 0x00
     rjmp start
    .org 0x06
     rjmp timer0
    .org 0x0B
    
      start:
    
      ldi acc,127 ; inicjacja stosu
      out SPL,acc ; programowego
     
      ldi acc,0xFF ; cały port B jako wyjściowy
      out DDRB,acc ; wszystkie wyjścia portu B
      out PORTB,acc ; w stanie wysokim
     
      ldi acc,0b1111011
      out DDRD,acc
     
      ldi acc,0b1111100 
      out PORTD,acc 
    
      ldi acc, 0
      out TCCR0, acc ; timer0 zatrzymany
    
      sei ; ustaw wskaˇnik globalnego zezwolenia na
          ; przerwania
    
      ldi acc, 2
      out TIMSK, acc ; odblokuj przerwanie od timera 0
    
    
      ldi zmienna, 1
      ldi acc, 15
    
      main:
      com zmienna
      out portb, zmienna
      rcall opoznienie
      com zmienna
     
      sbrc zmienna, 0
      cbr r18, 1
      sbrc zmienna, 7
      sbr r18, 1
    
    
      sbrc r18, 0
      lsr zmienna
      sbrs r18, 0
      lsl zmienna
    
      rjmp main
    
     opoznienie:
    
     ldi acc, 0
     out TCNT0, acc ; wpisz wartosć początkową licznika
    
     ldi acc, 2
     out TIMSK, acc ; odblokuj przerwanie od timera 0
    
     ldi acc, 4
     out TCCR0, acc ;ustaw preskaler timera0 na 256 i wystartuj timer0
    
     odliczaj_czas:
     cpi licznik_przerwan, 10 ; odmierzaj czas  0,16384 s
     brne odliczaj_czas
    
     ldi acc, 0
     out TCCR0, acc ; po uplywie 0,16384 wylacz timer0
    
     clr licznik_przerwan ; wyzeruj licznik przerwan timera0
    
     ret ;wroc do glownej procedury (petli)
    
     timer0: ;procedura obslugi przerwania jest wywolywana co 16,384 ms
     inc licznik_przerwan ;zwieksz o 1 licznik przerwan timera0
     reti


    Program ten napisalem dosc dawno, a Timer-a uzyłem tylko po to by nauczyc go uzywac, normalnie opóźnienie mozna zrealizowac w nieco prostrze sposoby.
REKLAMA