Forum: Projekte & Code Mul16 für ATMega


von Wolfram Q. (quehl)


Angehängte Dateien:

Lesenswert?

ich habe in Assembler für die ATMEGA Serie mit Hardwaremultiplizierer 
ein 16x16 MultiplizierProgramm geschrieben. Dieses habe ich in Form 
eines Macros geschrieben. Das Programm ist noch nicht getestet.
Es gibt hier zwar einige 16x16 Programme, aber diese scheinen den 
Multiplizierer nicht zu benutzen und sind darum länger und langsamer.
Es wundert mich schon etwas, daß es solch ein Programm noch nicht geben 
sollte. Den Bedarf dafür habe ich im AD Wandler gesehen, wo bei 8bit 
eine unzumutbare Ungenauigkeit reinkommt.

Wem das Programm zu kurz und zu schnell ist, empfehle ich, die Sprache C 
oder Basic zu verwenden.

mfg

von Benedikt K. (benedikt)


Lesenswert?

Ein ähnliches Programm gibt es in einer Application Note von Atmel, also 
geben tut es das auf jedenfall schon.

Was an dem Programm schlecht (bzw. nicht ordentlich) ist:
Du sicherst R8 und R9, aber nicht R0 und R1.

von Wolfram Q. (quehl)


Lesenswert?

die Applikationsnote von Atmel, die ich als Link hier aus dem Forum 
gesehen habe, enthielt keine Hardware-Multiplikation. Da wurde bitweise 
verschoben, wie ich das vermute. Und die Ausführungszeiten sprechen auch 
dafür. Das muß wohl eine ältere Note sein, wo es noch keine 
Hardwaremultiplizierer gab.

Das Sichern von R0,R1 habe ich deshalb nicht gemacht, weil ich es nicht 
für sinnvoll hielt, von Atmel reservierte Register für das 
Multiplizieren in einem Programm für andere Zwecke zu verwenden. Wenn 
nicht mehr genug Register frei sind, sollte das RAM verwendet werden, 
zumal die Register unter 16 sowieso nur eingeschränkt verwendbar sind.

mfg

von Benedikt K. (benedikt)


Lesenswert?

Wolfram Quehl wrote:
> die Applikationsnote von Atmel, die ich als Link hier aus dem Forum
> gesehen habe, enthielt keine Hardware-Multiplikation.

Atmel hat eine eigene Webseite, auf die man direkt durch Eingabe von 
www.atmel.com in die Adresszeile des Browsers zugreifen kann (dies 
nurmal so als Tipp). Dort gibt es: AVR201: Using the AVR Hardware 
Multiplier

von W. B. (wb1)


Lesenswert?

Hat das macro nicht einen kleinen bug?
ffff x ffff = fffe0001 macroergebnis = fefe0001
ffff x fffe = fffd0002 macroergebnis = fefd0002
Oder schnalle ich es nur nicht?
MfG
wb1

von Wolfram Q. (quehl)


Lesenswert?

ich wüßte nicht, was da für ein Bug drin sein sollte. Wie bist Du zu dem 
Macroergebnis gekommen? Leider kann ich das nicht mit Studio simulieren. 
Hast Du das simuliert? Oder liegt da nur ein Gedankenfehler vor?
ldi verändert nicht die Flags, so daß ein Übertrag von ADD bei ADC noch 
wirksam bleibt. Dies tritt aber vorher auch schon mal auf.

mfg

von wb1 (Gast)


Lesenswert?

Folgendermaßen im studio

.macro mu16
.
.
.endmacro

ldi r20,0xff
mov r21,r20
mov r22,r20
mov r23,r20
mul16 r21, r20, r23,r22
nop

dann die register r20 bis r23 angesehen, dort steht ja das ergebnis

Ist ja möglich das die Simulation spinnt, ich werds mal mit jtag testen.

MfG
wb1

von W. B. (wb1)


Lesenswert?

Ach mit jtag kommt das gleiche, falsche Ergebnis

von Wolfram Q. (quehl)


Lesenswert?

kann man die Einzelergebnisse in den Reg. nachvollziehen und hier 
posten, damit ich das nachvollziehen kann. Ich hatte das sorgfältig auf 
dem Papier Schritt für Schritt gemacht und kann den Fehler so nicht 
feststellen.
Bei der Analogumsetzung geht das nur bis 03FF und da habe ich ein 
richtiges Ergebnis.

mfg

von Wolfram Q. (quehl)


Angehängte Dateien:

Lesenswert?

Fehler ist berichtigt, siehe Anhang

ein carry wurde nicht berücksichtigt.

mfg

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.