to proste
; specjalnie dla urzytkowników forum elektroda

Eagle
; przerwanie t0 z czestoliwoscą 1Hz
; dla kwarcu 4 MHz
; uC = 89s2313
.include "2313def.inc" ; definicje rejestrów
; trochę teorii
; 1 sek przy oscylatorze 4 Mhz to 4 000 000 cykle timer 0 jest 8 bitowy
; wiec 4 000 000 / 256 = 15 625
; sprawdzamy czy prescalerem możemy coś zdziałać podział przez 1,8,64,256,1024
; w żadnym wypadku nie dzieli się bez reszty ( oprócz 15 625 /1 = 15 625
; Więc prescaler ustawiamy na podział przez 1 . Aby odmierzyć 1 sek musi przepełnić się
; 15 625 razy więc definujemy
.equ czas = 15625
.def buf = R16 ; bufor roboczy
.def t0_l = R17 ; młoszy virtualny timera 0
.def t0_h = r18 ; starszy virtualny timera 0
.equ stos = $70 ; a poszalemy sobie z pamiecią
; dekalaracja końca stosu
; no to zaczynamy
.org 0
rjmp reset
.org 6
rjmp irq_t0
reset:
;--------------------------
ldi buf,low(stos) ; ustawieni punktu stosu
out spl,buf
;---------------------------
ldi buf,1<<TOIE0 ; zezwolenie na przerwania od T0
out timsk,buf
ldi buf,1<<CS00 ; prescaker na 1 ( inny podział
out tccr0,buf
sei
rjmp pc ; wieczna pętla
;-----------------przerwanie przy przepełnieniu T0
irq_t0:
push buf
in buf,sreg
; zwiększenie licznika wtórnego
inc t0_l
brne irq_t0_next
inc t0_h
irq_t0_next:
cpi t0_l,low(czas)
ldi buf,high(czas)
cpc t0_h,buf
brne irq_end
clr t0_l
clr t0_h
;--------------------------------------
; tutaj proedurka co ma sie wykonac co 1 sek
;
;
;
;
;
;
;
;-------------------------------------
irq_end:
out sreg,buf
pop buf
reti