mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Dezimalzahl in Hexzahl umrechnen


Autor: Stefan KM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich möchte gern eine Dezimalzahl in eine Hexzahl umrechnen.
Wie kann ich dies am einfachsten realisieren. Ich möchte zu einer 16bit 
Adresse (EEProm im ATMega64) einen Index addieren, um die nächste 
Speicherzelle beschreiben zu können...

Danke euch

Stefan

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dezimal und Hex sind nur verschiedene Darstellungsformen ein und 
derselben Information.

Programmiersprache?

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du den Wert bereits als unsigned int vorliegen hast, dann ist die 
Arbeit bereits fast getan:

   char *pBaseAddress = EEPROM_ADDRESS;
   unsigned iIndex = 5;

Die nächste Schreibadresse ist dann:

   pBaseAddress + iIndex

Autor: Stefan KM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde gern ohne Pointer arbeiten wollen

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du willst eine Adresse berechnen - der dafür vorgesehene Datentyp ist 
ein Pointer.

Den kannst du natürlich auch in ein unsigned int umwandeln - per 
typecast.

Der cast ändert am Bitmuster überhaupt nichts, ändert nur die 
Typinformation, die der Compiler zur Übersetzungszeit in seinen Tabellen 
mitführt.

Das ist alles nur eine Frage der Interpretation:

Das Bitmuster 0x41 man interpretieren als dezimal 65, oktal 0101, binär 
1000001, ASCII 'A' usw, usf.

Du kannst aber auch ein Array nehmen, wenn die Startadresse zur 
Übersetzungszeit bekannt ist.

Für den Compiler ist eine Array-Variable eine Pointer-Konstante, während 
ein Pointer eine Variable ist.

Entsprechend kann man in C über einen Pointer indizieren:

   pBaseAddress + iIndex == &pBaseAddress[iIndex]

oder

   *(pBaseAddress + iIndex) == pBaseAddress[iIndex]

& ist der Adressoperator, * der Dereferenzieroperator.
Die erste Zeile vergleicht die Adressen, die zweite die Inhalte der 
Arrayelemente, die adressiert werden.

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du in deinem Programm z.B. folgendes schreibst:

   int i = 25;

dann reserviert der Compiler Speicherplatz für ein int, nimmt die 25 aus 
deinem Quelltext und wandelt sie in die Interndarstellung deines 
Prozessors für 25 (0x19, wenn man es hexadezimal ausdrückt) um und 
erzeugt eine Befehlssequenz, die die 0x19 zur Laufzeit des Programmes in 
die Speicherzelle schreibt, die er für i reserviert hat.

Ich weiß, daß das am Anfang nicht leicht ist, aber du must strikt 
zwischen Übersetzungszeit und Laufzeit unterscheiden.

Der Compiler erledigt üblicherweise alles zur Übersetzungszeit, was er 
überhaupt erledigen kann. Zur Laufzeit wird "nur" das gemacht, was übrig 
bleibt.

Beispiel: Du schreibst

   int i = 20 + 5;

Der Compiler sieht, daß er es mit einem Konstanten-Ausdruck zu tun hat 
und berechnet den zur Übersetzungszeit. Zur Laufzeit wird dann nur noch 
die Binärdarstellung des Wertes in die Speicherzelle geschrieben.

Tipp: Um nachzuvollziehen, was zur Laufzeit passiert, kannst du einen 
Debugger nehmen und dein C-Programm Schrittweise ausführen lassen. Wenn 
du nach jedem Schritt die Variablen ansiehst, die benutzt wurden, dann 
lernst sehr schnell, was dahinter steckt.

Autor: Stefan_KM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achtung Leute. Die letzten beiden Beitäge sind nicht von mir, da spielt 
jemand einen Trittbrettfahrer. Finde ich nicht sehr nett.

Was ich machen wollte: ich habe intern eine Uhr, wobei jedes Segment ein 
unsigned char darstellt. Ich möchte jetzt die Zeit (bytes in dez) im 
EEprom speichern, der eine 16bit Adressierung hat. Zusätzlich möchte ich 
maximal 10 Zeiten speichern, und danach die erste Zeit wieder 
überschreiben. So eine Art Ringregister. Ich habe 6 Segment, die 
zusammengehören und das Ganze 10 mal somit also 60 Byte.

Ich möchte nun z.B. die 5. Zeit abrufen, d.h. Speichersegment 24-29 dez.
Und wie komme ich jetzt an diese Adresse heran?

Ich Berechen einfach folgendes unsigned int x= (24%16)+((24/16))<<4;
Anstelle der 24 werden dann die folgenden Werte bis 29 durchlaufen und 
abgespeichert und schon habe ich eine Dez-Zahl - in eine Hex- Zahl 
umgewandelt und das Ganze ohne Pointer.

Danke für Eure Beiträge

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> abgespeichert und schon habe ich eine Dez-Zahl - in eine Hex- Zahl
> umgewandelt und das Ganze ohne Pointer.

Genau darum geht es.
Du bruachst nichts umwandeln.
Im Rechner sind alles nur Zahlen. Einfach nur Zahlen.

Dezimal, Hex, Binär: Das alles kommt erst ins Spiel wenn
diese Zahlen angezeigt werden sollen. Dann spielt es eine
Rolle ob du das Dezimal, Hex, binär oder meinetwegen zur
Basis 29 angezeigt haben willst. Angezeigt! Im Rechner
sind es immer noch: einfach nur Zahlen.


@ Stefan KM (Gast) [IP: 141.76.45.35

Was soll der Scheiss?
Wenn du Verwirrung stiften willst, dann mach das woanders.
Wenn du den originalen Stefan zum registrieren bringen willst,
dann sag ihm das ins Gesicht anstatt da so dämlich seinen
Namen zu übernehmen.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Troll ist ein alter Bekannter und meisten wie hier über Anon-Proxys 
unterwegs, weil seine echte IP 212.201.44.249 auch schon auf der 
schwarzen Liste (Anmeldezwang) steht.

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso werden jetzt auch Beiträge mit Themenbezug weggeputzt???

Andereseits bleiben Passagen stehen, die sich auf gelöschte Beiträge 
beziehen.

Was spricht denn dagegen, Trollereien als solche zu kennzeichnen und 
einfach stehen zu lassen? Dann wäre zumindest nachträglich noch 
nachvollziehbar, was hier vorging.

Sehr nützlich finde ich auch, wenn nachträglich bekannt gegeben wird, 
welche Pseudonyme auf denselben Troll zurückgehen.

Man könnte auch Beiträge kennzeichnen, die als über einen Anonymisierer 
geschickt erkannt wurden.

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...hat mich auch gewundert, aber letztendlich stand die lösung ja 
schonmal da....

d.

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.