Sida 1 av 1

Timer

Postat: 2 april 2004, 15:08:16
av PaNiC
Vissa bitar av denna kod är snodd från AVRFreaks.

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
Nu är inte koden särskilt snygg men ni förstår nog ändå..
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.

Postat: 2 april 2004, 16:03:44
av chille
RTC kanske? skulle nog vara enklare iaf. tror texas/dallas har en 1-wire som ser ut som en vanlig trissa och inte kräver några externa komponenter.

Postat: 2 april 2004, 16:17:01
av Melker
Är lite osäker på om detta blir rätt, men tycker att det borde stämma. 32768/256/128 = en sekund. Prescaler på 256 och sedan är det bara räkna till 128 så har du en sekund, om jag tänkt rätt alltså.

Postat: 2 april 2004, 19:27:17
av erixon

Postat: 3 april 2004, 22:59:31
av PaNiC
Melker skrev:Är lite osäker på om detta blir rätt, men tycker att det borde stämma. 32768/256/128 = en sekund. Prescaler på 256 och sedan är det bara räkna till 128 så har du en sekund, om jag tänkt rätt alltså.
Det tyckte jag också skulle räcka.. Men inte.
Nästa steg är en riktig RTC. Men jag tyckte att jag kunde få detta att fungera ordentligt först.

Vad jag däremot inte är säker på är om allt verkligen är friskt i min STK500... Jag kör nu med en 2,4576MHz kristall och det går alldeles för sakta även med den...

2457600/1024/40/60=1.