mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC18F4520: SRAM- und FLASH-Memory Map


Autor: Sven Scholz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe zwei kurze und knappe Fragen bezüglich der Memory Map des 
PIC18F4520:

a. Wie lautet die Start- und End-Adresse des SRAM Speichers?

Ich denke mal 0x000 - 0x7ff. Sicher bin ich mir da nicht. Ist das denn 
gleichzeitig auch der besagte Boot Block von Seite 263 in dem Datasheet?

b. Die Adressen des 32kB Flash-Speichers bräuchte ich zudem...

Fängt der bei 0x800 an und bei 0x7FFF auf? (Block 0 - Block 3)


Ist das SRAM überhaupt direkt adressierbar?
Wie habe ich mir den Boot Prozess vorzustellen? Stichwort: Reset Vector

Danke.

Autor: Zwirbeljupp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stichwort: Harvard-Architektur. Der Befehlsspeicher ist physisch vom 
Datenspeicher getrennt und beide werden über getrennte Busse 
angesteuert.

a)
Direkte Adressierung macht beim SRAM nur bedingt Sinn, da der Speicher 
bei den PIC16 und PIC18 in Bänke unterteilt ist. Grundsätzlich geht der 
SRAM von 0x000 bis 0xEFF, danach kommen die SFRs.

b)
Der Bootblock liegt im Programmspeicher (FLASH) und geht von 0x000 bis 
0x7FF. Der Programmspeicher vom PIC18F4520 geht von 0x0000 bis 0x7FFF.

Bootprozess? Naja, das es keinen wirklichen "Reset Vector" bei diesem 
PIC gibt, wird der Programmcounter auf 0x000 gesetzt und die SFRs 
initialisiert. Jau und dann gehts ab!

Was hast Du eigentlich vor???

gruß
jupp

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven Scholz wrote:
> Hallo,
>
> ich habe zwei kurze und knappe Fragen bezüglich der Memory Map des
> PIC18F4520:
>
> a. Wie lautet die Start- und End-Adresse des SRAM Speichers?
>
> Ich denke mal 0x000 - 0x7ff. Sicher bin ich mir da nicht.

Falsch, das SRAM (=Data Memory) liegt von 000h - 5ffh (der PIC18F4520 
hat 1536 Bytes RAM).

> Ist das denn gleichzeitig auch der besagte Boot Block von Seite 263 in
> dem Datasheet?

Nein, Der Boot Block liegt im Programm-Memory (=Flash).


> b. Die Adressen des 32kB Flash-Speichers bräuchte ich zudem...

Bitte sehr:
DS39631E-page 53: 0000h - 7fffh, wobei bei 0000h der Reset-Vektor, bei 
0008h der High-Priority Interrupt-Vektor und bei 0018h der Low-Priority 
Interrupt-Vektor sind.

> Fängt der bei 0x800 an und bei 0x7FFF auf? (Block 0 - Block 3)
Nein, siehe oben.

> Ist das SRAM überhaupt direkt adressierbar?
Ja, aber Programmcode kann nicht aus dem RAM ausgeführt werden.
http://de.wikipedia.org/wiki/Harvard-Architektur

> Wie habe ich mir den Boot Prozess vorzustellen? Stichwort: Reset Vector
Der PIC führt die Instruktion aus, die auf dem Reset-Vektor steht, also 
an Adresse 0000h.

Autor: Sven Scholz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich möchte im laufenden Betrieb, also bei Abarbeitung des Programms, den 
Boot Block überschreiben lassen. Ist das generell möglich?

1. Bei der Ausführung meiner Boot Block Überschreibroutine steht der PC 
bei 0x7900. Damit dürfte ich doch dann locker die ersten Adressen 0x000 
- 0x7FF löschen und neu schreiben dürfen oder?

2. Wegen den Interrupt Vektoren: Zum Zeitpunkt des Überschreibens ist 
der globale Interrupt ausgeschaltet. Wird dann trotzdem noch irgendwie 
in 0x008 bzw. 0x0018 nachgesehen bzw. verzweigt?

Im Moment sieht es nämlich stark danach aus. Beim Versuch die ersten 
Speicherzellen des Flashes zu manipulieren kommt es anscheinend zu einem 
Reset. Der PC steht völlig falsch. (PC=0024h)

Und das passiert nur wenn ich die Adressen 0x000 - ca. 0x0040 anrühre. 
Höhere Adressbereich lassen sich neu schreiben.

Hat jemand vielleicht eine Idee, was da schief gehen könnte???

Danke sehr.

Autor: Colt Fish (Firma: TUC) (coltfish)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich möchte im laufenden Betrieb, also bei Abarbeitung des Programms, den
> Boot Block überschreiben lassen. Ist das generell möglich?

Grundsätzlich schon.

> 1. Bei der Ausführung meiner Boot Block Überschreibroutine steht der PC
> bei 0x7900. Damit dürfte ich doch dann locker die ersten Adressen 0x000
> - 0x7FF löschen und neu schreiben dürfen oder?

Naja, bist Du denn sicher, dass der PC nicht vielleicht doch mal zu 
einer Unterfunktion springt, die meinetwegen an der Adresse 0x200 
liegt??? Du musst Dein Programm schon so kompilieren, dass keine 
Programmteile im Bootblock abgelegt werden, andernfalls ist das 
Überschreiben des Blocks Russisches Roulette. Wird der Bootblock nicht 
explizit reserviert, beginnt der Programmcode natürlich direkt hinter 
den Interrupt-Vektoren.

> 2. Wegen den Interrupt Vektoren: Zum Zeitpunkt des Überschreibens ist
> der globale Interrupt ausgeschaltet. Wird dann trotzdem noch irgendwie
> in 0x008 bzw. 0x0018 nachgesehen bzw. verzweigt?

Sind die globalen Interrupts deaktiviert erfolgt kein Sprung zu den 
Interrupt Vektoren.

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.