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

Przerwanie od timera - poprawność obliczeń

blackrage 04 Gru 2009 22:24 1182 1
REKLAMA
  • #1 7346223
    blackrage
    Poziom 15  
    Prosiłbym kogoś znającego temat o sprawdzenie moich wyliczeń.

    Do Attiny2313 podpinam kwarc 8Mhz
    dla timera daję preskaler 4, czyli ck/256, czyli timer jest naliczany co 32us
    1s / 0.000032s = 31250 - czyli 31250 naliczeń timera to dokładnie sekunda

    timer1 jest 16 bitowy więc liczy od 0 do 65535, czyli 65536 cykli - więc aby przepełnił się po zliczeniu 31250 ( 1s ) to wartość początkową ustawiam na 65536 - 31250 = 34286

    zgadza się ?

    
    .nolist
    .include "2313def.inc"
    .list
    .listmac
    
    .cseg
    .org 0
    rjmp start
    
    .org 0x0001 reti
    .org 0x0002 reti
    .org 0x0003 reti
    .org 0x0004 reti
    .org 0x0005 rjmp TimerHandle
    .org 0x0006 reti
    .org 0x0007 reti
    .org 0x0008 reti
    .org 0x0009 reti
    .org 0x000A reti
    
    start:
     ldi r16, LOW(RAMEND)
     out SPL, r16 ; inicjacja stosu
    
     ldi r16, 4
     out TCCR1, r16 ; preskaler timera1 na podział przez 256
    
     ; tutaj powinno być ustawienie wartości początkowej ( jeszcze nie doszedłem jak to zrobić dla liczby 16 bitowej
    
     ; tutaj powinno być odblokowanie przerwań dla timer1
    
     sei ; globalne odblokowanie przerwań
    
    ; instrukcje programu
    
    
    TimerHandle :
    
    
    


    wiem że za odblokowanie przerwań odpowiada bit TOIE1 rejertru TIMSK
    czy wystarczy : ldi r16, 0b10000000 out TIMSK, r16 ?
  • REKLAMA
  • Pomocny post
    #2 7346300
    grysek
    Poziom 19  
    Tak obliczenia są w porządku. Wartość do TIMSKu możesz wgrać taki sposób jak napisałeś ale ładniej jest:
    ldi r16, (1<<TOIE1) 
    out TIMSK, r16 


    Pamietaj że po wywowałniu procedury obsługi przerwania musisz odłożyć na stos wskażnik Z. W przerwaniu musisz załadować od nowa TCNT1. Procedure przerwania zawsze koczymy instrukcją reti.

    A co do wartości początkowej wystarczy że zrobisz coś takiego.
    ldi r16, high(34286)
    out TCNT1H, r16
    ldi r16, low(34286)
    out TCNT1L, r16


    pozdrawiam
REKLAMA