Sida 1 av 1

ati 2313 timerinterrupt problem

Postat: 6 oktober 2004, 12:06:05
av Rymdninja
Hejsan!
Jag har lite problem med mina timer interrupts på min 2313 krets.
Det jag vill göra är helt enkelt en lite delay. Så jag tänkte att jag använder mig av timer1s compare interrupt som, om jag har fattar rätt, signalerar ett interrupt när timern har räknat upp till värdet såm står skrivet i ett visst register....här kommer koden

Först interrupt vektorn..standard

Kod: Markera allt

	rjmp init
	RETI ; Int0-Interrupt
	RETI ; Int1-Interrupt
	RETI ; TC1-Capture
	rjmp t1compare ; TC1-Comp
	RETI ; TC1-Overflow  
	RETI ; Timer/Counter 0 Overflow, my jump to the service routine
	RETI ; UART Rx complete
	RETI ; UART Data register empty
	RETI ; UART Tx complete
	RETI ; Analog Comparator 
Sedan initieringskoden

Kod: Markera allt

init:
	ldi r16, low(RAMEND)
	out SPL, r16      ;init Stack Pointer	
	ldi r16, 0xFF
	out DDRB, R16; set port B to output all
	out DDRD, R16; set port D to output all
	ldi r16, 0x00	
	out PORTB, R16; disable all output on port B
	out PORTD, R16; disable all outputs on port D


	;; initialize the timer1
	ldi r16, 0b01000000
	out TIMSK, r16 
	

	ldi r16, 0x0e
	out TCCR1B, r16  	; set prescaler CK/1024 and clear on COMPARE MATCH
	ldi r16, 0x00
	out OCR1AL, r16
	ldi r16, 0x20
	out OCR1AH, r16	; sets the outputcomapare to 2^13 = 8192... 
	sei 			; enable interupts

       ;done initializing


Det här verkar väl rätt?

tack o hej

Postat: 6 oktober 2004, 18:25:16
av cykze
TCCR1B ska laddas med 0x0d (inte 0x0e) för att få CTC och en prescaler på 1024. Skriv i binär form så syns det mycket lättare. Sen har du väl inte initierat stackpekaren korrekt? Behövs väl även:

ldi r16, high(RAMEND)
out SPH, r16

Eller det kanske går ändå?

Postat: 7 oktober 2004, 00:07:01
av chille
Sen ska väl OCR1A laddas om med rädd värden vid varje interrupt också?

Postat: 7 oktober 2004, 00:17:24
av Rymdninja
cykze skrev:TCCR1B ska laddas med 0x0d (inte 0x0e) för att få CTC och en prescaler på 1024.
Jo..stämmer det...en liten miss som du antagligen hjälpte mig att spara evigheters debuggande :)

Sen ska väl OCR1A laddas om med rädd värden vid varje interrupt också?
Jag hittar inget om det i databladet...var har du läst det?


go natt

Postat: 7 oktober 2004, 00:33:58
av PaNiC
Jo det stämmer att det ska laddas om.

Postat: 7 oktober 2004, 04:55:31
av chille
Compare interrupt är ju att den kör ett avbrott när den når ett visst värde. Om du inte laddar om värdena i OCR1A kommer den fortsätta att räkna, sen kör den en overflow och börjar om från 0. Resultatet blir att timern får exakt samma frekvens oberoende vilka värden du laddade OCR1A med första gången. Kan bli rätt många timmars felsökande om man gör den missen :-)

Ibland tycker man ju att det vore smidigt om den kunde ladda om värdena själv, men det verkar inte Atmel hålla med om 8-)

Postat: 7 oktober 2004, 08:35:14
av cykze
OCR1A ska inte laddas om. OCR1A är hela tiden konstant. Det som händer är att den vanliga 16-bitars-timern (TCNT1H/L) räknar upp från 0. När det kommer upp till samma värde som OCR1A har så genereras en interrupt. CTC1-flaggan gör så att TCNT1H/L nollställs automatiskt, och allt börjar om.

Det är när man använder sig av en vanlig timer-overflow som man måste ladda om värdet i TCNT1H/L manuellt varje gång om man vill ha korrekta tidssteg.

Postat: 7 oktober 2004, 23:11:55
av Rymdninja
okej.....verkar om om man måste ladda OCR1AH före man laddar OCR1AL för att sätta outputcompare riktigt.....jaja..nu funkar det iaf :)

prace