10 Bit Zahl in 8 Bit µC bearbeiten

Gast #1043842
Lesenswert?

Hallo!

Habt ihr eine Idee wie man am geschicktesten eine 10 Bit Zahl mit einem 
8 Bit µC addiert? Ich hab mir da sowas vorgestellt, dass ich die 8 LSB 
in einem Register schiebe und die 2 MSB in ein anderes und mit den LSB 
rechne. Falls da bei einer Addition ein Übertrag entstehen würde löst 
dieses eine weitere Addition (Increment) in dem Register mit den MSB 
aus.
Könnte das effizient umgesetzt werden oder habt ihr vielleicht bessere 
oder andere Vorschläge?

Vielen Dank schon mal =)!
Gast #1043893
Lesenswert?

...Einfach immer LSB Register
addieren mit add (falls AVR) und MSB Register addieren mit adc (falls
AVR)...

Muss es nicht gerade umgekehrt sein? Kann ich mir gerade nicht 
vorstellen, wozu die MSB mit Carry addiert werden sollen...
Gast #1043922
Lesenswert?

>>  Und dein Programm wird auch nicht langsamer, nur weil Du 6 Bit zuviel
>> addierst...
> Naja hab aber dann auf jeden Fall Platz verschwendet. Knausere mit den
> Bits ;)...
Äh, nein, ob du nun 1  16 Bit benutzt oder 2  8 Bit, macht keinen 
unterscheid. Oder hast du einen µC mit 2 Bit breiten Registern?
Gast #1043928
Lesenswert?

>>  Und dein Programm wird auch nicht langsamer, nur weil Du 6 Bit zuviel
>> addierst...
> Naja hab aber dann auf jeden Fall Platz verschwendet. Knausere mit den
> Bits ;)...
Äh, nein, ob du nun 1 mal 16 Bit benutzt oder 2 mal 8 Bit, macht keinen
Unterschied. Oder hast du einen µC mit 2 Bit breiten Registern?

Upps, da habe ich wohl ein Format-Befehl gefunden. ;-)
Gast #1043949
Lesenswert?

Doch, ich verschwende Platz, weil ich die restlichen Bits für andere 
Sachen (z.B. Statusbits einer FSM)nutzen will und diese nichts beim 
Addieren verloren habe. Der µC muss so klein wie möglich werden.
Gast #1043953
Lesenswert?

>Doch, ich verschwende Platz, weil ich die restlichen Bits für andere
>Sachen (z.B. Statusbits einer FSM)nutzen will und diese nichts beim
>Addieren verloren habe. Der µC muss so klein wie möglich werden.

Ich würde dir dringend raten, als Zustandsmerker einer FSM eine eigene 
(achtBit)Variable zu verwenden.
#1043966
Lesenswert?

Erdin wrote:
> Doch, ich verschwende Platz, weil ich die restlichen Bits für andere
> Sachen (z.B. Statusbits einer FSM)nutzen will und diese nichts beim
> Addieren verloren habe.

Das ist Quatsch mit Soße.

Wenn Du ne 10Bit-Addition machst, brauchst Du 11Bits für das Ergebnis.
Die restlichen 5 Bits kannst Du meinetwegen für sonstwas benutzen, die 
werden durch die Addition nicht verändert.


> Der µC muss so klein wie möglich werden.

O.k., kleiner als ein ATtiny85 (4*4mm²) geht kaum noch und der hat 32 
Byte Register + 512 Byte SRAM.
Da muß man sich nicht gleich wegen 5 Bits (=0,1%) in die Hose machen.


Ich benutze oft für jedes Flag ein ganzes Byte, weil das Flash und Zeit 
spart.


Peter
#1043968
Lesenswert?

>> Der µC muss so klein wie möglich werden.
>
> Ich würde dir dringend raten, als Zustandsmerker einer FSM eine eigene
> (achtBit)Variable zu verwenden.

Wozu? Wenn er nur ein Bit braucht verschwendet er über 85% wenn er dafür 
ein Byte belegt. Mir erschließt sich daher der Sinn nicht.
Gast #1043969
Lesenswert?

> Doch, ich verschwende Platz, weil ich die restlichen Bits für andere
> Sachen (z.B. Statusbits einer FSM)nutzen will und diese nichts beim
> Addieren verloren habe. Der µC muss so klein wie möglich werden.
Ob du nun die sechs Bits aus einer 8 Bit Variable nutzt oder aus einer 
16 Bit, mit beidem kannst du dir ordentlich in den Fuß schießen.
Rest siehe lippy.
Gast #1043978
Lesenswert?

Ich werde vermutlich aber nicht drumrum kommen mir in einem 8 Bit 
Register mehrere Variablen abspeichern zu müssen. Übrigens benötige ich 
keinen fertigen µC (dann wär ja der Witz verloren), sondern ich bin auf 
der Suche nach einem Softcore bei dem ich dann alles unnötige 
rausschmeißen will um die Chip-Area so klein wie möglich zu kriegen.
Gast #1043989
Lesenswert?

Ich stelle mir das aber so vor, dass ich nicht immer die MSB rechnen 
muss. Sondern nur dann, wenn in den LSB ein Übertrag entstünde. Deswegen 
dachte ich ich nehm bei den LSB adc und falls das Carry gesetzt wird, 
soll er bei MSB einfach inc machen. Ich möchte mit so wenig Befehlen wie 
möglich auskommen. Jede unnötige Addtion kostet unnötig Strom und somit 
Geld :).
Gast #1043995
Lesenswert?

>ch stelle mir das aber so vor, dass ich nicht immer die MSB rechnen
>muss. Sondern nur dann, wenn in den LSB ein Übertrag entstünde. Deswegen
>dachte ich ich nehm bei den LSB adc und falls das Carry gesetzt wird,
>soll er bei MSB einfach inc machen. Ich möchte mit so wenig Befehlen wie
>möglich auskommen. Jede unnötige Addtion kostet unnötig Strom und somit
>Geld :).

Das funktioniert nicht, da ja das MSB (auch wenns nur 2bit sind) auch 
addiert werden muss.
Beispiel:  257 + 510

         Highbyte       Lowbyte
 510:        1            254
 257:        1              1
    -----------------------------
 767         2            255 (kein Übertrag)

Wenn du das Highbyte ignorieren würdest, käme 1:255 = 511 heraus...
#1043997
Lesenswert?

> Übrigens benötige ich keinen fertigen µC (dann wär ja der Witz verloren),
> sondern ich bin auf der Suche nach einem Softcore bei dem ich dann alles
> unnötige rausschmeißen will um die Chip-Area so klein wie möglich zu
> kriegen.

Und das ganze wird eine Rakete, die zum Mond fliegt ...

Mein lieber Mann, ohne dich beleidigen zu wollen, aber jemand der noch 
nicht soviel von der Programmierwelt gesehen hat um zu wissen wie man 10 
Bit Variable addiert, sollte vielleicht am Anfang kleinere Brötchen 
backen.
Gast #1044016
Lesenswert?

Wie man ne 10 Bit Zahl addiert weiß ich schon, und dass man bei den MSB 
aufpassen muss auch. Aber bei meinem Projekt gehe ich davon aus, dass 
sich zwei aufeinanderfolgende Zahlen die es zu addieren gilt nicht 
soweit von einander entfernt sind, dass sich ihre zwei MSB 
unterscheiden. Nur falls im LSB-Bereich ein Carry auftaucht will ich das 
in die MSB addieren. Ich stelle mir das also als ne Art Mini-Interrupt 
vor.
Gast #1044032
Lesenswert?

> Nur falls im LSB-Bereich ein Carry auftaucht will ich das
> in die MSB addieren. Ich stelle mir das also als ne Art Mini-Interrupt
> vor.
Das kommt aber auch darauf an, wie oft das 'MSB-Byte' geändert wird, die 
Auswertung, ob Carry gesetzt/nicht gesetzt braucht ja auch Rechenzeit. 
Ich habe starke Zweifel, dass das wirklich was bringt, sowas endet 
schnell im VerschlimmBessern.
Gast #1044042
Lesenswert?

Da hast du Recht. Ich bin halt gerade am Überlegen was sich am meisten 
lohnt und was im Mittel weniger Rechenauwfand ist. Einfach jedes Mal 
addieren oder nur im Notfall addieren aber überprüfen.
Sehe gerade im Instruction Set vom 8051 dass JC 24 Takte aber ADD nur 12 
Takte braucht. Dann addiert man doch lieber immer und verhaspelt sich 
dann nicht mit dem Rumspringen...
Gast #1044048
Lesenswert?

Das wäre natürlich die beste Variante, aber diese kostet zuviel Geld. 
Müssten ja ein völlig neues Design machen. Lieber ein fertiges Kaufen 
und das unnötige rausschmeißen (und dabei sowas in Kauf nehmen). Einen 
16 Bitter zu nehmen wäre aber totale Platzverschwendung...
Gast #1044056
Lesenswert?

Aber den Adder zu ändern ist doch auch schon ziemliche viel Aufwand. 
Müsste jede Pipeline-Stufe ändern. Ich könnte zwar eine neue 
Mirkoinstruktion basteln, aber die würde ja wieder 2 8-Bit Additionen 
machen...
Persönliche Seite #1044059
Lesenswert?

Erklär doch erstmal was das ziel ist...
Also das man Platz/Strom spart durch so ein bitgefummel wäre mir neu.
Wenns echt aufs lezte Bit ankommt kann man doch gleich ne eigene kleine 
Architektur dafür bauen. Viele Cores sind z.B. nicht derart offen das du 
da überhaupt was machen kannst an der ALU.
Und wie gesagt... 2 8-Bit addidionen sind (in den allermeisten Fällen) 
schneller als ein Vergleich auf Carry und bedingter Sprung! D.h du 
gewinnst genau nix außer das es extrem wartungsunfreundlich wird und 
fehleranfällig.
Gast #1044064
Lesenswert?

Danke!

Das ist mal ne Aussage :)! Jo mittlerweile teile ich auch deine 
Meinung... Werde bestimmt nicht auf die Idee kommen und mir nen Krampf 
machen, nur um dann noch langsamer zu sein ^^.Komme wohl nicht drumherum 
2 Additionen machen zu müssen.

Vielen Dank!

Mache jetzt Feierabend!
Gast #1044459
Lesenswert?

>> <ganz_dumme_Frage>
>> Was ist eigentlich ein Softcore?
>> </ganz_dumme_Frage>
> Das ist eine fertige Beschreibung einer Komponente in einer HDL (VHDL
> oder Verilog). Das kippst du in ein FPGA und hast dann z.B. einen
> Prozessor.
Ach so, danke für die Info.
Ist dann der Bereich "Mikrocontroller und Elektronik" nicht falsch? 
Müsste dann ja eher nach "FPGA, VHDL & Co.". Obwohl, sowas klappt in 
Foren ja eh nie. ;-)
Gast #1044652
Lesenswert?

...Ist dann der Bereich "Mikrocontroller und Elektronik" nicht falsch?
Müsste dann ja eher nach "FPGA, VHDL & Co.". Obwohl, sowas klappt in
Foren ja eh nie. ;-)...

Also ich fand dieses Forum treffender, da es ja nicht drauf ankommt ob 
es ein Soft- oder Hardcore (wird ja später ein echter ASIC) ist, sondern 
dass es sich hier um einen µC handelt der mit Assemblerbefehlen 
gefüttert wird und hier nur um die Effizienz von Vorgehensweisen 
philosophiert wurde.

Aber danke für eure Hilfe! =)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren