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
Für solche Fälle hat irgendein Gott den Logarithmus erfunden. Dein Ergebnis wird aber trotzdem falsch sein.
@ 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.
Ja danke. Ich hab schon lange kein Mathe mehr gehabt. Wie gebe ich die Berechnung in den Taschenrechner oder im Terminal ein?
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
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.
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.
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. ;-)
:
Bearbeitet durch User
@ 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?
Da steht's doch:
1 | .equ FLASHEND = 0x3fff ; Note: Word address |
2 | ^^^^^^^^^^^^ |
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").
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.