ati 2313 timerinterrupt problem

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Rymdninja
Inlägg: 330
Blev medlem: 15 december 2003, 13:41:25
Ort: Göteborg

ati 2313 timerinterrupt problem

Inlägg 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
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

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

Inlägg av chille »

Sen ska väl OCR1A laddas om med rädd värden vid varje interrupt också?
Rymdninja
Inlägg: 330
Blev medlem: 15 december 2003, 13:41:25
Ort: Göteborg

Inlägg 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
Användarvisningsbild
PaNiC
Inlägg: 2565
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

Jo det stämmer att det ska laddas om.
Användarvisningsbild
chille
Inlägg: 2469
Blev medlem: 25 juni 2003, 20:54:41
Ort: Stockholm
Kontakt:

Inlägg 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-)
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg 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.
Rymdninja
Inlägg: 330
Blev medlem: 15 december 2003, 13:41:25
Ort: Göteborg

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