Hur mycket går det att slakta i denna kod?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
snigelen
Inlägg: 815
Blev medlem: 8 maj 2009, 11:02:14
Ort: Lund

Re: Hur mycket går det att slakta i denna kod?

Inlägg av snigelen »

> boken "Mikroprocessorteknik" av Per Foyer.

Den är med på Bokias bokrea. 169:-
1802
Inlägg: 6835
Blev medlem: 6 februari 2009, 13:52:28

Re: Hur mycket går det att slakta i denna kod?

Inlägg av 1802 »

"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
j.po
Inlägg: 279
Blev medlem: 24 november 2008, 20:40:19
Ort: Halmstad
Kontakt:

Re: Hur mycket går det att slakta i denna kod?

Inlägg av j.po »

nej, Z sätts när resultatet är noll
1802
Inlägg: 6835
Blev medlem: 6 februari 2009, 13:52:28

Re: Hur mycket går det att slakta i denna kod?

Inlägg av 1802 »

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....
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Hur mycket går det att slakta i denna kod?

Inlägg av jesse »

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:

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
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.

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
Nu har du en subrutin med namnet delay. Det anropas så här:

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
1802
Inlägg: 6835
Blev medlem: 6 februari 2009, 13:52:28

Re: Hur mycket går det att slakta i denna kod?

Inlägg av 1802 »

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.
Skriv svar