Forum: Mikrocontroller und Digitale Elektronik 10 Bit Zahl in 8 Bit µC bearbeiten


von Erdin (Gast)


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 =)!

von Jean P. (fubu1000)


Lesenswert?

Welcher µC und welche Programmiersprache(C, ASM , ..).
Ansonsten für ASM ist deine OK schon gut. Einfach immer LSB Register 
addieren mit add (falls AVR) und MSB Register addieren mit adc (falls 
AVR).

Gruß

von Erdin (Gast)


Lesenswert?

µC und Sprache sind noch gar nicht festgelegt. Es geht nur um die 
prinzipielle Durchführbarkeit...
Wie meinst du MSB mit ADC addieren?

von Bastler (Gast)


Lesenswert?

ADD --> Addieren
ADC --> Addieren ,mit Carry-Bit

von Erdin (Gast)


Lesenswert?

Ach sorry...
hatte gerade an einen ADC gedacht, da ich gerade damit zu tun hab :)!
Jo danke. Habs gerafft!
Vielen Dank!

von Klaus F. (kfalser)


Lesenswert?

Mit der C Programmiersprache ist das kein Problem. Dort sind die integer 
alle mindestens 16 bit groß (auch auf einem 8 Bit uC) und deine 10 Bit 
haben locker Platz.
Und dein Programm wird auch nicht langsamer, nur weil Du 6 Bit zuviel 
addierst.

von Erdin (Gast)


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

von Erdin (Gast)


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

von tata (Gast)


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?

von tata (Gast)


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

von Erdin (Gast)


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.

von Matthias L. (Gast)


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.

von Peter D. (peda)


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

von Иван S. (ivan)


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.

von tata (Gast)


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.

von Erdin (Gast)


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.

von Jean P. (fubu1000)


Lesenswert?

Erdin wrote:
Muss es nicht gerade umgekehrt sein? Kann ich mir gerade nicht
vorstellen, wozu die MSB mit Carry addiert werden sollen...


Nein das ist schon richtig so wie ichs geschrieben habe. LSB's mit add 
und MSB's mit adc.

Gruß

von Erdin (Gast)


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

von Matthias L. (Gast)


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

von Klaus F. (kfalser)


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.

von Klaus F. (kfalser)


Lesenswert?

Außerdem frißt ein Softcore auf einem FPGA in jedem Fall mehr Strom als 
ein kleiner Prozessor den man Schlafen schicken kann.
Es sei denn, Du bist reich genug un Dir ein ASIC machen zu lassen ...

von Erdin (Gast)


Lesenswert?

...Es sei denn, Du bist reich genug un Dir ein ASIC machen zu lassen ...

Du hast den Nagel auf den Kopf getroffen :D!

von Erdin (Gast)


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.

von tata (Gast)


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.

von Erdin (Gast)


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

von CPU (Gast)


Lesenswert?

Wenn Du Dir sowieso einen Controller stricken willst, lege den doch 
gleich als 10-Bit Prozessor aus.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Außerdem kann man ja auf nem Softcore auch ne 10bit Addition einbauen 
die nur 10 bit nuzt und muß sich ums carry keine Gedanken machen ;)

von Erdin (Gast)


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

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Naja... bevor du dir über sowas Sorgen machst schau erstmal nach nem 
Softcore wo du all sowas "rausschmeißen" kannst...
Außerdem ist es so, das meistens der Test auf carry ebenso lange dauert 
wie eine addition (und wenn das carry da ist muß man dann auch 
addieren...) so das man sich nix spart.

von Erdin (Gast)


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

von Erdin (Gast)


Lesenswert?

Habe schon 9 Cores gefunden, die sich konfigurieren lassen... Ich habs 
ja oben gerade angemekrt, dass JC länger braucht als ADD also der Ansatz 
nicht gut war.

von CPU (Gast)


Lesenswert?

Deine Randbedingungen sind denjenigen nicht bekannt, die Dir hier 
antworten. Wenn Du Dein ganzes Projekt (mit Zielen und Constraints) 
erklärst, bekommst Du treffendere Antworten!

von Läubi .. (laeubi) Benutzerseite


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.

von Erdin (Gast)


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!

von Matthias L. (Gast)


Lesenswert?

>Mache jetzt Feierabend!

Tja..

Ausser Spesen nix gewesen...

von tata (Gast)


Lesenswert?

<ganz_dumme_Frage>
Was ist eigentlich ein Softcore?
</ganz_dumme_Frage>

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

<ganz_dumme_Antwort>
Sowas ähnliches wie Hardcore, halt nur weicher ...
</ganz_dumme_Antwort>

von Mike (Gast)


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.

von tata (Gast)


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

von Erdin (Gast)


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! =)

von Matthias L. (Gast)


Lesenswert?

Na ich weiß nicht, ob das sinnvoll ist, in einem ASIC einen µC werkeln 
zu lassen...

von Erdin (Gast)


Lesenswert?

Na kler ist das sinnvoll, wenn man vorhat ca. 20 Millionen Stück davon 
zu produzieren ;)!

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.