Timer

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
PaNiC
Inlägg: 2610
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Timer

Inlägg 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.
Användarvisningsbild
chille
Inlägg: 2469
Blev medlem: 25 juni 2003, 20:54:41
Ort: Stockholm
Kontakt:

Inlägg 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.
Användarvisningsbild
Melker
Inlägg: 410
Blev medlem: 26 maj 2003, 22:17:34
Ort: Umeå

Inlägg 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å.
Användarvisningsbild
erixon
Inlägg: 380
Blev medlem: 27 augusti 2003, 10:21:58

Inlägg av erixon »

Användarvisningsbild
PaNiC
Inlägg: 2610
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg 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.
Skriv svar