Forum: Offtopic Adresszähler für 32 KiB ausrechnen.


von Frank T. (frankatmicro)


Lesenswert?

Hallo zusammen.
Ich arbeite gerade ein Buch über uc-Programmierung durch, bin am Anfang 
und habe jetzt folgende Aufgabe:

Wie viel Bit muss der Adresszähler besitzen um die 32 KiB des ATmega32A
zu adressieren? Berechne die höchste Adresse im Speicher (Bezeichnung
" FLASHEND " ).

Als Adresszähler interpretiere ich die Zweierpotenzen, die groß genug 
sind, um die 32KiB adressieren zu können.
Also erstmal die Größe ermitteln: 32 x 1024 = 32768 Bytes

Jetzt soll ich also herrausfinden, wieviele zweierpotenzen in Reihe die 
32768 abdecken können.
Wie rechnet man das?

Ich könnte natürlich 2h0 + 2h1 + 2h2 + 2h3 usw. ausrechnen, aber es 
sollte doch kompakter gehen.

: Verschoben durch User
von Cyblord -. (cyblord)


Lesenswert?

Log zur Basis 2.

von Verne (Gast)


Lesenswert?

Für solche Fälle hat irgendein Gott den Logarithmus erfunden. Dein 
Ergebnis wird aber trotzdem falsch sein.

von Falk B. (falk)


Lesenswert?

@ Frank Thie (frankatmicro)

>Also erstmal die Größe ermitteln: 32 x 1024 = 32768 Bytes

Jo.

>Jetzt soll ich also herrausfinden, wieviele zweierpotenzen in Reihe die
>32768 abdecken können.
>Wie rechnet man das?

2^X = 32768

->

X = log2 32768 = 15, denn 2^15 = 32768

Zusatztrick. Der AVR hat einen 16 Bit breiten Flash, d.h. pro Adresse 
liegen 2 Bytes, also braucht man 1 Adressbit weniger.

von Frank T. (frankatmicro)


Lesenswert?

Ja danke.

Ich hab schon lange kein Mathe mehr gehabt.

Wie gebe ich die Berechnung in den Taschenrechner oder im Terminal ein?

von Karl H. (kbuchegg)


Lesenswert?

Die wenigsten Taschenrechner können einen Logarithmus zur Basis 2 
ausrechnen. Meistens nur einen zur Basis 10, bzw. zur Basis e

Aber wer in Mathe aufgepasst hat, kennt den Ausweg
Man kann den Logarithmus zu einer beliebigen Basis b ausrechnen, wenn 
man irgendeinen Logarithmus ausrechnen kann
1
 log_b(x) = log(x) / log(b)

Also Logarithmus von x dividiert durch den Logarithmus der Basis b 
ergibt den Logarithmus von x zur Basis b.
Es spielt dabei keine Rolle zu welcher Basis man seinen Logarithmus 
ausrechnen kann. Hauptsache man kann.

: Bearbeitet durch User
von Cyblord -. (cyblord)


Lesenswert?

Oder man nimmt einfach Wolfram Alpha.

von Georg A. (georga)


Lesenswert?

Wenn man öfter als einmal im Jahr was programmiert, sollten man die 
Zweierpotenzen mindestens bis 2^16 auswendig können. Und zumindest ein 
paar grössere (2^20, 2^24, 2^32) als solche erkennen können.

von Frank T. (frankatmicro)


Lesenswert?

@  cyblord
Guter Tip mit Wolfram Alpha.

log2 32768 ergibt 15.

@ Karl Heinz.

Mein Taschenrechner kann e^x und 10^x.
Würde mich mal interessieren, wie ich jetzt laut deiner Formel vorgehen 
müsste.

@  Georg A
Ich fange ja erst an. Aber Danke für den Rat. Ich werde mir die Potenzen 
mal ausrechnen und aufschreiben.

von Dennis S. (eltio)


Lesenswert?

Verne schrieb:
> Für solche Fälle hat irgendein Gott den Logarithmus erfunden. Dein
> Ergebnis wird aber trotzdem falsch sein.

Da bin ich auf die Erklärung gespannt.

von Frank T. (frankatmicro)


Lesenswert?

Wegen der addition wahrscheinlich.

Ich dachte: 2^0 + 2^1 + 2^3 usw.

Wie es jetzt aussieht, zählt nur das höchste Bit, also hier 2^15.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Frank Thie schrieb:
> Mein Taschenrechner kann e^x und 10^x.
> Würde mich mal interessieren, wie ich jetzt laut deiner Formel vorgehen
> müsste.

Hat de Taschenrechner vielleicht eine "INV"- oder eine "2nd"-Taste oder
so etwas ähnliches? Dann liefert mit hoher Wahrscheinlichekeit "INV"
"10^x" den Zehner- und "INV" "e^x" den natürlichen Logarithmus. Welchen
von beiden du zur Berechnung des Zweierlogarithmus nach der Formel von
Karl Heinz verwendest, ist egal.

von (prx) A. K. (prx)


Lesenswert?

Frank Thie schrieb:
> Ich dachte: 2^0 + 2^1 + 2^3 usw.

Passt schon. Fast. 2^0 + 2^1 + ... + 2^14 + 1

> Wie es jetzt aussieht, zählt nur das höchste Bit, also hier 2^15.

Nur ist Bit 14 das höchste Bit. ;-)

: Bearbeitet durch User
von Frank T. (frankatmicro)


Lesenswert?

@ Yalu X.

In Mathe war ich nie besonders gut und in abstrakten Angelegenheiten, 
die mir überhaupt nichts sagen, auch nicht. Darum die Nachfrage zur 
Formel, die mich aber nur noch am Rande interessierte, weil ja das 
Ergebnis über Wolfram Alpha herrauszufinden ist.

Und darum habe ich ja überhaupt die Eingangsfrage gestellt, um mir von 
den grundsätzlichen Gegebenheiten der ucś einen Eindruck zu verschaffen 
um darauf meine Vorstellung aufzubauen.

@ A.K.

Ja, erstaunlich. 2^15 ist die Akkumulation aller Potenzen bis 2^14 +1.

Aber die binäre Schreibweise währe doch:
0b0111111111111111
Also währe die 15. 1 = 2^15 also verstehe ich deine Aussage bezüglich 
des 14. Bit nicht.

von Falk B. (falk)


Lesenswert?

@ Frank Thie (frankatmicro)

>Ja, erstaunlich. 2^15 ist die Akkumulation aller Potenzen bis 2^14 +1.

Das ist in jedem Stellenwertsystem so.

100 = 9*10 +9*1 +1

>Aber die binäre Schreibweise währe doch:
>0b0111111111111111
>Also währe die 15. 1 = 2^15 also verstehe ich deine Aussage bezüglich
>des 14. Bit nicht.

In der Informatik beginnt man meist bei Null und nicht bei 1. Also sind 
15 Bit die Bit 0-14.

von Frank T. (frankatmicro)


Lesenswert?

@ Falk Brunner
Ja, OK, aber wie gesagt war Mathe nie mein Lieblingsfach und so freue 
ich mich immer über das Erkennen einfacher( mathematischer) Wahrheiten.

>In der Informatik beginnt man meist bei Null und nicht bei 1. Also sind
>15 Bit die Bit 0-14.

Ja stimmt, ich hatte auf deutsch gezählt, war ein Mißverständniss 
meinerseits.

>Wie viel Bit muss der Adresszähler besitzen um die 32 KiB des ATmega32A
>zu adressieren?

Also kann ich sagen 15 Bit, nähmlich die Bits 0 - 14.

Aber wie beantworte ich den 2. Teil:

>Berechne die höchste Adresse im Speicher (Bezeichnung " FLASHEND " ).

Wie rechne ich?

32768/16=2048-16=2032 = Gesammtgröße / Adresszähler - 1Word = grösste 
ansprechbare Adresse?

von Frank T. (frankatmicro)


Lesenswert?

Ich hab jetzt folgendes in m32def.inc gefunden:

; ***** DATA MEMORY DECLARATIONS 
*****************************************
.equ  FLASHEND  = 0x3fff  ; Note: Word address
.equ  IOEND  = 0x003f
.equ  SRAM_START  = 0x0060
.equ  SRAM_SIZE  = 2048
.equ  RAMEND  = 0x085f
.equ  XRAMEND  = 0x0000
.equ  E2END  = 0x03ff
.equ  EEPROMEND  = 0x03ff
.equ  EEADRBITS  = 10
#pragma AVRPART MEMORY PROG_FLASH 32768
#pragma AVRPART MEMORY EEPROM 1024
#pragma AVRPART MEMORY INT_SRAM SIZE 2048
#pragma AVRPART MEMORY INT_SRAM START_ADDR 0x60

Jetzt ist aber 0x3fff = 16383 als FLASHEND angegeben

Der ATmega32 hat aber 32Kib, also 32768 Bytes.

Da könnte ich doch eine 0x8000 als höchste Adresse erwarten.

Was sehe ich noch nicht, oder wo ist der Fehler?

von Yalu X. (yalu) (Moderator)


Lesenswert?

Da steht's doch:
1
.equ  FLASHEND  = 0x3fff  ; Note: Word address
2
                                  ^^^^^^^^^^^^

von Frank T. (frankatmicro)


Lesenswert?

OK, durch die 2 Bites zur Adressierung halbieren sich die Adressen, muss 
mich halt noch orientieren. Danke.

Danke auch an alle, die mir hier weitergeholfen haben.

Vor allem hat sich mein Schrecken über die Hex-zahlen aufgelöst, bzw die 
Umrechnungen zwischen dez, hex und bin.

Habe hier eine gute Seite gefunden, die auch die Rechenschritte 
darstellt und bis auf die Eingabe in den Taschenrechner runterbricht. 
Sehr hilfreich.

http://www.arndt-bruenner.de/mathe/scripts/Zahlensysteme.htm

Gruß
Frank

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Frank Thie schrieb:
> OK, durch die 2 Bites zur Adressierung halbieren sich die Adressen

Es gibt keine "Bites".

Es gibt Bits (Plural von "Bit") und Bytes (Plural von "Byte").

von Frank T. (frankatmicro)


Lesenswert?

Sorry, Bytes war gemeint.

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.