mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik asm routine


Autor: Kai Scheddin (zeusosc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jo hi, ich habe hier ein teil einer asm routine von mir,
welche eine datenmatrix transponiert;
Meine creative phase is gerade weg, daher könnt ihr mir vlt
schnell sagen wie ich das in eine schleife umwandle, ohne hyper viel
cycles dazu zubekommen,... thx
;first row of the 8x5
ld r1,z+
ld r22,y
sbrc r1,7
ori r22,0b00010000
st y+,r22

ld r22,y
sbrc r1,6
ori r22,0b00010000
st y+,r22

ld r22,y
sbrc r1,5
ori r22,0b00010000
st y+,r22

ld r22,y
sbrc r1,4
ori r22,0b00010000
st y+,r22

ld r22,y
sbrc r1,3
ori r22,0b00010000
st y+,r22

ld r22,y
sbrc r1,2
ori r22,0b00010000
st y+,r22

ld r22,y
sbrc r1,1
ori r22,0b00010000
st y+,r22

ld r22,y
sbrc r1,0
ori r22,0b00010000
st y+,r22
;end of first row

grüüße

Autor: Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit einer Zählervariablen, einem Vergleich und einem bedingten Sprung.

Autor: Kai Scheddin (zeusosc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der bedingte Sprung ist gerade das problem,..
ich kann ja nur absolut mit
sbrc
 checken ob das bit gesetzt ist oder nicht,...

grüüße

Autor: Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
breq
brne
brlo

Näheres in der Befehlsreferenz.

Autor: Kai Scheddin (zeusosc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die eignen sich gerade nicht für einen vergleich auf einen bit,
da brne auf das Z flag abgleicht das nur mit cp, cpi, sub, subi erzeugt 
wird
breq, brlo ähnlich, ...

wenn ich mich irre bitte ein source beispiel,..

ich habe zwar jetzt ein ART Lösung, aber die cycles vervierfachen sich 
wenn ich mich nicht irre,. und das gilt es noch zu vermeiden:
ldi r23,7
testloop2:
ld r22,y+

;lsr the bit from position to carry
mov r24,r23
mov r25,r1
testloop3:
lsr r25
dec r24
brne testloop3

brcc carry_is_clear
ori r22,0b00010000
st y,r22

carry_is_clear:
dec r23
brne testloop2

grüüße und danke

Autor: Kai Scheddin (zeusosc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm ok danke ich glaube ich habs,..
ldi r23,7
mov r24,r1
tesloop4:
ld r22,y
lsl r24
brcc carry_is_clear2
ori r22,0b00010000
carry_is_clear2:
st y+,r22
dec r23
brne testloop4


danke

Autor: Kai Scheddin (zeusosc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube zwar nicht das es jemanden interressiert,
aber hier eine Komplette routine zur Transponierung
einer 8x5 zu 5x8 Matrix:
;#######################################################################################################
;Routine Reorder_Graph_data
;Transposes the graphic data from 8x5 to 5x8
;(c) Kai Scheddin
; uses follow registers
;ZH,ZL = r31:r30
;YH,YL = r29:r28
;r24 as bitmask for column mask of 5x8 matrix
;r1 as row of 8x5 matrix (also counter or rather rowindex, cause of postinc)
;r23 as counter for row index of 5x8 matrix
;r22 as overlay of stored data and seted element of 5x8 matrix
;#######################################################################################################
Reorder_Graph_data:
.dseg
graph_matrixBW: 
BW1: .byte 5
BW2: .byte 8 
.cseg
;#bw2 has to be completly cleared b4
push r31
push r30
push r29
push r28
push r24
push r23
push r22
push r1

ldi r30,low(bw1)
ldi r31,high(bw1)
ldi r28,low(bw2)
ldi r29,high(bw2)


ldi r24,0b00010000          ;# bitmask and counter
testloop2:
ld r1,z+                    ;# takes row of bw1 and postinc Z pointer
ldi r23,7                   ;# set counter to 7
tesloop3:
ld r22,y                    ;# loads bw2 
lsl r1                      ;# shift r1 left, puts msb to carry
brcc carry_is_clear         
or r22,r24                  ;# sets bitmask to r22
carry_is_clear:
st y+,r22                   ;# store r22 to bw2, and postinc
dec r23                     ;# dec counter
brne testloop3              ;# if NOT bw2 row 7 to 0 is set reloop else...
lsr r24                     ;# shift bitmask to right
brcc testloop2              ;# if carry is set end routine

pop r1
pop r22
pop r23
pop r24
pop r28
pop r29
pop r30
pop r31

ret
;#######################################################################################################

;#######################################################################################################


grüüüße

Autor: Kai Scheddin (zeusosc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
eine korrektur noch:
ldi r28,low(bw2)
ldi r29,high(bw2)
muss unter
ld r1,z+
und
anstatt:
ldi r23,7
muss es
ldi r23,8
heißen,...
grüüße

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kai Scheddin wrote:
> eine korrektur noch:
>
> ldi r28,low(bw2)
> ldi r29,high(bw2)
> 
> muss unter
>
> ld r1,z+
> 
> und
> anstatt:
>
> ldi r23,7
> 
> muss es
>
> ldi r23,8
> 
> heißen,...
> grüüße

Warum benutzt Du eigentlich nicht die übliche Namen (yl, yh) der 
Pointer-Register?

...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.