mikrocontroller.net

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


Autor: Erdin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 =)!

Autor: Jean Player (fubu1000)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Erdin (Gast)
Datum:

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

Autor: Bastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ADD --> Addieren
ADC --> Addieren ,mit Carry-Bit

Autor: Erdin (Gast)
Datum:

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

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Erdin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Erdin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)...

Autor: tata (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: tata (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. ;-)

Autor: Erdin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Иван S. (ivan)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: tata (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Erdin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jean Player (fubu1000)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Erdin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :).

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: Erdin (Gast)
Datum:

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

Du hast den Nagel auf den Kopf getroffen :D!

Autor: Erdin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: tata (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Erdin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: CPU (Gast)
Datum:

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

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Erdin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Erdin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Erdin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: CPU (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Erdin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Mache jetzt Feierabend!

Tja..

Ausser Spesen nix gewesen...

Autor: tata (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
<ganz_dumme_Frage>
Was ist eigentlich ein Softcore?
</ganz_dumme_Frage>

Autor: Wegstaben Verbuchsler (wegstabenverbuchsler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
<ganz_dumme_Antwort>
Sowas ähnliches wie Hardcore, halt nur weicher ...
</ganz_dumme_Antwort>

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: tata (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. ;-)

Autor: Erdin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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! =)

Autor: Matthias Lipinsky (lippy)
Datum:

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

Autor: Erdin (Gast)
Datum:

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

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.