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