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.
@ 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.
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.
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.
@ 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.
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.
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.
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. ;-)
@ 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.
@ 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.
@ 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?
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?
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
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").