Forum: Mikrocontroller und Digitale Elektronik Ascii und Adressierung


von Daniel B. (und3rt4ker)


Lesenswert?

Hallo!
Nachdem ich einen langen Beitrag geschrieben habe und diesen aus 
versehen gelöscht habe argh fasse ich mich jetzt kurz.

Mein Problem:"Wie kann ich eine beliebige Zahl(<256) mit 5 
multiplizieren(überlauf?) und mit dem Ergebniss eine Speicheradresse 
größer 255 erreichen?"
1
font:
2
.DB   0,   0,   0,   0,   0,    0,   0,  95,   0,   0   ; #32: " ",#33: "!"
3
.DB   0,   7,   0,   7,   0,    20, 127,  20, 127,  20  ; #34: """,#35: "#"
4
.DB  36,  42, 127,  42,  18,    35,  19,   8, 100,  98  ; #36: "$",#37: "%"
5
.DB  54,  73,  85,  34,  80,    0,   5,   3,   0,   0   ; #38: "&",#39: "'"
6
.DB   0,  28,  34,  65,   0,    0,  65,  34,  28,   0   ; #40: "(",#41: ")"
7
.DB  20,   8,  62,   8,  20,    8,   8,  62,   8,   8   ; #42: "*",#43: "+"
8
.DB   0,  80,  48,   0,   0,    8,   8,   8,   8,   8   ; #44: ",",#45: "-"
Ziel: Erreichen der Speicherzelle des ersten bytes des Zeichens ascii36 
("$") mit eingabe seines ascii codes:
Angenommen das Zeichen "$"(Ascii36) soll erreicht werden, dann muss 32 
von ascii36 abgezogen werden, da die tabelle erst bei ascii32
anfängt. Wenn man jetzt die speicherzelle 4(=36-32) anspringt, kommt man 
natürlich beim 4ten byte vom leerzeichen raus und nicht beim ersten byte 
vom "$".
Um zum ersten byte des $ zu gelangen muss man also 4*5(byte)+1 rechnen.
Aber wie rechne ich das? Das mit dem 8bit übersteigenden rechnen 
verstehe ich noch nicht so ganz.

Vielen Dank im Vorraus, an die, die sich meinem Problem widmem!

Mfg Und3rt4ker

von Johannes M. (johnny-m)


Lesenswert?

Was für ein µC soll das sein? Hat der einen Hardware-Multiplier? Wenn 
nicht, dann geht Multiplizieren mit 5 auch durch zweimal nach links 
schieben und Ausgangswert dazuaddieren (x*5 = x*2*2+x). Das Ergebnis ist 
natürlich 16-bittig, d.h. der Überlauf muss bei jeder Operation beachtet 
werden.

von Daniel B. (und3rt4ker)


Lesenswert?

Der µC ist ein Attiny 2313. Kannst du mir evtl ein bsp zeigen, wie man 
ein register "mpr" mit 5 multipliziert und das ergebnis in zwei 
registern ausgibt?


THX, Mfg Und3rt4ker

von Johannes M. (johnny-m)


Lesenswert?

z.B. (ohne Gewähr, nicht getestet):
1
clr r1   ;r1 und r2 löschen
2
clr r2
3
mov r0, mpr  ;Ausgangswert in r0
4
lsl r0   ;16-Bit-Linksshift
5
rol r1
6
lsl r0   ;und nochmal
7
rol r1
8
add r0, mpr  ;Ausgangswert hinzuaddieren
9
adc r1, r2   ;Carry zum High-Byte addieren
Ergebnis (16 Bit) steht dann in r1 (High-Byte) und r0 (Low-Byte)

von Daniel B. (und3rt4ker)


Lesenswert?

jetzt habe ich noch ein problem:

wie kann ich den z-pointer um 32 erniedrigen und den unterlauf 
verarbeiten?

"subi zl, 32" kann ja nur bedingt funktionieren.


Mfg Und3rt4ker

von Spess53 (Gast)


Lesenswert?

Hi

Die 32 must du vor der Multiplikation abziehen. Danach wären es 160.

MfG Spess

von Peter D. (peda)


Lesenswert?

@Unddreirtvierker

> "subi zl, 32" kann ja nur bedingt funktionieren.

subi zl, 32
sbci zh, 0

oder

sbiw zh:zl, 32


Peter

von Daniel B. (und3rt4ker)


Lesenswert?

wenn man
subi zl, 160
sbci zh, 0
nachdem *5 rechnen macht, dann gehts, danke an euch alle freu

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.