> boken "Mikroprocessorteknik" av Per Foyer.
Den är med på Bokias bokrea. 169:-
Hur mycket går det att slakta i denna kod?
Re: Hur mycket går det att slakta i denna kod?
"Du kan föresten ta bort raderna av typen "cpi r17,0x00 ; Jämför r17 med 0", eftersom de kommer direkt efter en instruktion som sätter Z-flaggan i SREG om r17 är noll. De tillför alltså ingenting."
Funkar detta även om man inte räknar från $00-$ff? Tex $05-$55.
;/ Lopop i loop fördröjning.
ldi r17, 0xfe ; nolla ett reg ex. r17
ldi r18, 0xff ; nolla ett reg ex. r18
inc r18 ; öka r18 med 1
inc r17 ; öka r17 med 1
;/ Här kan man lägga en dummy operation för att slöa ner mer
cpi r17,0x00 ; Jämför r17 med 0
brne $0009 ; Hoppa till inc r17 om inte lika
cpi r18,0x00 ;/Jämför r18 med 0
brne $0008 ;/Hoppa till inc r18 om inte lika
Funkar detta även om man inte räknar från $00-$ff? Tex $05-$55.
;/ Lopop i loop fördröjning.
ldi r17, 0xfe ; nolla ett reg ex. r17
ldi r18, 0xff ; nolla ett reg ex. r18
inc r18 ; öka r18 med 1
inc r17 ; öka r17 med 1
;/ Här kan man lägga en dummy operation för att slöa ner mer
cpi r17,0x00 ; Jämför r17 med 0
brne $0009 ; Hoppa till inc r17 om inte lika
cpi r18,0x00 ;/Jämför r18 med 0
brne $0008 ;/Hoppa till inc r18 om inte lika
Re: Hur mycket går det att slakta i denna kod?
Misstänkte det. Och jag vill ha min kod universell. Men å andra sidan kan man justera mot just noll, så funkar det utan cpi. Gäller bara att komma ihåg....
Re: Hur mycket går det att slakta i denna kod?
Den där koden gör inte "loop i loop": Du laddar r17 och r18 före loopen. Sedan räknar du ner båda. Men r17 måste ju sättas till rätt värde varje gång den ska börja om. Därför måste det sättas efter att du gjort inc r18.
Kom igen nu. Nu får du lära dig att använda labels. Så här enkelt är det:
Hur vill du göra koden mer "generell?". Du menar att du vill kunna välja hur lång tid det ska vara fördröjning?
Jag skulle valt att göra en subrutin som skapar en fördröjning som kör x varv, då x är ett värde som ligger i r18.
r17 kan sättas till 255. Då får du totalt 256*r18 varv.
Nu har du en subrutin med namnet delay. Det anropas så här:
Kom igen nu. Nu får du lära dig att använda labels. Så här enkelt är det:
Kod: Markera allt
;/ Lopop i loop fördröjning.
ldi r17, 0xfe ; nolla ett reg ex. r17
ldi r18, 0xff ; nolla ett reg ex. r18
yttre_loop:
inc r18 ; öka r18 med 1
inre_loop:
inc r17 ; öka r17 med 1
;/ Här kan man lägga en dummy operation för att slöa ner mer
cpi r17,0x00 ; Jämför r17 med 0
brne inre_loop ; Hoppa till inc r17 om inte lika
cpi r18,0x00 ;/Jämför r18 med 0
brne yttre_loop ;/Hoppa till inc r18 om inte lika
Jag skulle valt att göra en subrutin som skapar en fördröjning som kör x varv, då x är ett värde som ligger i r18.
r17 kan sättas till 255. Då får du totalt 256*r18 varv.
Kod: Markera allt
;/ Lopop i loop fördröjning.
delay:
ldi r17, 0x255 ; sätt hur många inre varv som ska köras.
inre_loop:
nop ;/ Här kan man lägga en dummy operation för att slöa ner mer
dec r17 ; minska r17 med ett.
brnz inre_loop ; Hoppa till inc r17 om inte noll.
dec r18 ; minska r18 med ett.
brnz delay ;/Hoppa till inc r18 om inte noll
ret
Kod: Markera allt
ldi r18, 50 ; sätt r18 till antal varv. (Jag räknar varv i decimalform - det är lättare att förstå än hexadecimalt.)
rcall delay ; kör 50 varv
ldi r18, 10
rcall delay ; kör 10 varv
Re: Hur mycket går det att slakta i denna kod?
Har du missat denna tråd? http://elektronikforumet.com/forum/view ... =7&t=62007 Tex raden alfa: .DB 0,1,"01234567",0,0,0 börjar den med en label?
Att göra loopiloop till en subrutin där man sätter registerna och sen anropar tillhör planerna. Jag vill nog inte låsa den inre loopen till 255. Liksom att välja rätt register. De 2 sista skall man undvika märkte jag. Samma som X och Y.
Att göra loopiloop till en subrutin där man sätter registerna och sen anropar tillhör planerna. Jag vill nog inte låsa den inre loopen till 255. Liksom att välja rätt register. De 2 sista skall man undvika märkte jag. Samma som X och Y.