Sida 1 av 1

Mega8515 och SMT160-30 mätfel vid anrop av en delay-funktion

Postat: 17 december 2009, 09:56:48
av Mange86
Hej. Detta blir första posten här.

Sitter med ett projekt på skolan som skapar gråa hår för alla inblandade. Vi har en Mega8515 på ett stk500, en SMT160-30 digital fyrkantsvågsgivare för temperatur och vi har en lcd och knappsatts som ska kopplas in senare. Temperaturen har vi fått ut från givaren och det funkar problemfritt.. Fram tills vi ska implementera en delay för att ge LCD'n lite extratid.

Delayen är implementerad så att den går 64 varv i en inre loop ett valfritt antal gånger som sätts innan funktionen anropas. Denna delay arbetar på andra register än den funktion för att hämta temperaturen.

div16u är atmels och använder r16:r19,
test är definerad som r21, timeout som r20, temp som r17.

Ber om ursäkt för eventuellt konstig konvention, detta är första försöket någonsin på en assemblerkod. Obs: Vi har inte enablat något med interrupts vad vi vet.

Problemet uppstår om vi kör mer än 5 varv på den yttre loopen i delay. Upp till 5 så visas temperaturen korrekt på våra led-lampor. Efter 5 flippar den ur totalt och det mesta och de flesta lampor blinkar o har sig. Vi har prövat byta stk500 utan resultat. Läraren har ingen aning heller vad som kan vara problemet.

Mvh / Magnus & Per

Kod: Markera allt

mainloop:	
		rcall	get_temp
		ldi		timeout,200
		rcall	delay
		rjmp	mainloop

get_temp:
		push 	R16
		push	R17
		push	R18
		push	R19	
		
		rcall	get_hightime
		rcall	get_periodtime
		ldi 	temp,213
		mul		R16,temp
		movw	R16,R0	
		rcall 	div16u		
		subi	R16,68

		com		R16
		out		PORTC,R16
		
		pop 	R19
		pop		R18
		pop		R17
		pop		R16
		ret

get_periodtime:
		ldi		temp,$40
		out		TCCR1B,temp
		clr		temp
		out		TCNT1H,temp
		out		TCNT1L,temp
wait1:	in		temp,TIFR
		sbrs	temp,ICF1
		rjmp	wait1
		ldi		temp,8
		out		TIFR,temp
		ldi		temp,$42
		out		TCCR1B,temp
wait2:	in		temp,TIFR
		sbrs	temp,ICF1
		rjmp	wait2
		ldi		temp,8
		out		TIFR,temp
		in		R18,ICR1L
		in		R19,ICR1H
		ret

get_hightime:
		ldi		temp,$40
		out		TCCR1B,temp
		clr		temp
		out		TCNT1H,temp
		out		TCNT1L,temp
wait3:	in		temp,TIFR
		sbrs	temp,ICF1
		rjmp	wait3
		ldi		temp,8
		out		TIFR,temp
		ldi		temp,2
		out		TCCR1B,temp
wait4:	in		temp,TIFR
		sbrs	temp,ICF1
		rjmp	wait4
		ldi		temp,8
		out		TIFR,temp
		in		R16,ICR1L
		ret

delay:	
		ldi 	test,64
cmain:	dec		test
		brne 	cmain
		dec 	timeout
		brne 	delay
		
		ret

Re: Mega8515 och SMT160-30 mätfel vid anrop av en delay-funktion

Postat: 17 december 2009, 10:26:33
av johano
Har ni initierat stacken korrekt?

/johan

Re: Mega8515 och SMT160-30 mätfel vid anrop av en delay-funktion

Postat: 17 december 2009, 10:29:30
av Mange86
Vid simulering ser stackpeckaren ut att bete sig.
Såhär ser initieringen vi har ut:

Kod: Markera allt

.cseg
.org	0
		rjmp	RESET

RESET:	ldi		temp,low(RAMEND)
		out		SPL,temp
		ldi		temp,high(RAMEND)
		out		SPH,temp

		ser		temp
		out		DDRC,temp
Mvh / Magnus & Per

Re: Mega8515 och SMT160-30 mätfel vid anrop av en delay-funktion

Postat: 20 december 2009, 00:23:51
av Swech
Kommentera koden...

Alla klassiska nybörjarfel finns där,

Kod: Markera allt

      ldi      temp,8
      out      TIFR,temp
Tittar man t.ex. på detta så är det svårt även för er att genomskåda vad egentligen
som händer..... man vet när man skriver men efter ett litet tag blir det helt
obegripligt... i ert fall sätter ni en flagga men man vet tusan inte vilken och inte
varför.
Definiera bitar och bytes med vettiga namn

Swech