Kod: Markera allt
.include "8515def.inc"
;Defines registers
.def TIME=r16
.def TEMP=r17
.def div=r18
.def sekunder=r19
.def minut=r20
.def tiominut=r21
.def timme=r22
.def tiotimme=r23
.def timraknare=r24
.def dygn=r25
.org $0000
rjmp reset
.org OVF0addr
rjmp TimerV0 ; T/C0 overflow vector
;-----------------------------------------------------------------
;
; Register defines for main loop
;-----------------------------------------------------------------
;
; Reset vector - just sets up interrupts and service routines and
; then loops forever.
Reset:
ldi TEMP,low(RAMEND) ; Set stackptr to ram end
out SPL,TEMP
ldi TEMP, high(RAMEND)
out SPH, TEMP
ldi temp, 255 ; gives temp value 255
out ddra, temp ; specifies ports as output only
out ddrc, temp
out ddrd, temp
ldi temp, 15 ; gives temp value 15
out ddrb, temp ; specifies portb as output on low
; 4 bits and input on 4 high bits
; set up registers
clr div
clr sekunder
clr minut
clr tiominut
clr timme
clr tiotimme
clr timraknare
;---------- CODE SNIPPET #2 - Initializing TIMSK,TCCR0,TCNT0 ----
; inserted in the Reset: label, right before the 'sei' call
;----------------------------------------------------------------
ldi TIME,0 ; Start from 0. NB!
out TCNT0,TIME ; set Timer/counter also.
ldi TEMP,(1<<TOIE0) ; timer overflow interrupt enable 0
out TIMSK,TEMP
ldi TEMP,4 ; clock prescaler = clk/256
out TCCR0,TEMP
sei ; enable interrupts and off we go!
rjmp loop ; goes to loop
loop: ; Infinite loop - never terminates
cpi div, 14
breq okasekunder
cpi sekunder, 60
breq okaminut
; cpi minut, 10
; breq okatiominut
; cpi tiominut, 6
; breq okatimme
; cpi timme, 4
; breq okatiotimme
; cpi timraknare, 24
; breq nyttdygn
rcall skicka
rjmp loop
;---------- CODE SNIPPET #3 - handling the Timer overflow int. --
; new subroutine label, inserted at the end of the file
;----------------------------------------------------------------
okasekunder:
inc sekunder
rjmp loop
okaminut:
inc minut
clr sekunder
rjmp loop
okatiominut:
inc tiominut
clr minut
rjmp loop
okatimme:
inc timme
inc timraknare
clr tiominut
rjmp loop
okatiotimme:
inc tiotimme
clr timme
rjmp loop
nyttdygn:
clr sekunder
clr minut
clr tiominut
clr timme
clr tiotimme
clr timraknare
inc dygn
rjmp loop
skicka:
out portc, div
out portd, minut
out porta, sekunder
ret
TimerV0:
out TCNT0,TIME ; reset time
inc sekunder ; increases sekunder by 1
reti ; returns to where it left off
Meningen är att öka registret "sekunder" med ett en gång per sekund. Dvs att få en riktig sekund som bas för en klocka.
Nu är det så att hur jag än vänt och vridit på det så har det antingen blivit strax över eller strax under en sekund. Kristallen är en 32,768kHz klockkristall.