16-Bit-PICs -  Speicherorganisation

in Arbeit

zurück zu 16-Bit-PICs , PIC-Prozessoren , Elektronik , Homepage

Einleitung
Programmspeicher
Datenspeicher
EEPROM
 

zurück zu 16-Bit-PICs


Einleitung

Willkommen in der Welt der linearen Adressierung. Wer als Umsteiger aus der Welt der 8-Datenbit-PICs kommt, der vergesse bitte folgende Worte:

Die brauchen wir nicht mehr. Jede Speicherzelle im Flash, EEPROM oder RAM hat nun ihre eigene Adresse.

Die 16-Bit-PICs haben eine Harvard-Archtitektur, und demzufolge getrennt Programm- und Datenspeicher.

nach oben

Programmspeicher
 
Der Programmspeicher ist 24-Bit breit, und wird auch mit einem 24-Bit breiten Adressbus verwaltet. Da aber das LSB (Bit 0) des Adressbusses immer den Wert 0 hat, können nur die oberen 23 Bit effektiv zur Adressierung verwendet werden. Es gibt folglich im Programmspeicher nur gerade Adressen:
  • 0x000000
  • 0x000002
  • 0x000004
  • ...
  • 0xFFFFFE


Man mag sich fragen, warum man dann nicht gleich nur 23 Bit verwendet, aber das hier benutzte Verfahren ist in Prozessoren mit mehr als 8 Bit Datenbreite durchaus üblich. Damit hält man sich normalerweise die Möglichkeit offen, einzelne Bytes zu adressieren.

Der Adressbereich geht also von 0x000000 in Zweierschritten bis 0xFFFFFE. Das sind immerhin noch 8388608 Adressen (8 M). Hinter jeder Adresse kann sich eine 24-Bit große Speicherzelle befinden, die einen Befehl für den PIC beinhalten kann. Damit könnte der Programmspeicher insgesamt 24 MByte groß sein. 

Das ist deutlich mehr als nötig wäre, und so hat man von diesem Adressbereich einiges für PIC-interne Zwecke abgezweigt:

  • Alle Adressen ab 0x800000 sind für den Configuration-Memory des PIC reserviert. Das halbiert den für Programme zur Verfügung stehenden Platz schon einmal. Dem Programm Counter (PC) fehlt deshalb auch das höchstwertige Bit (er ist also nur 23 Bit breit) und kennt nur gerade Adressen bis 0x7FFFFE.

  • .
  • Der EEPROM des PIC (wenn einer vorhanden ist) wird in den Programmspeicherbereich so eingeblendet, dass er unmittelbar vor der Adresse 0x800000 liegt.

  • .
  • die Adressen 0x000000 bis 0x0000FE des Flash werden für Reset und Interrupt-Tabelle benötigt (welche im Prinzip aber schon Teil des Programms sind) so das erst ab 0x000100 der  frei nutzbare Teil des Flash beginnt.
Der verbleibende Adressbereich ist aber immer noch so riesig, dass auch der größte PIC nur einen winzigen Bruchteil dieses Bereiches mit echtem Speicher füllen kann. Zwischen FLASH und EEPROM klafft eine Adress-Lücke. Versucht man dort zu lesen, erhält man den Wert 0.

nach oben

Datenspeicher (RAM)
 
Der Datenspeicher (RAM) ist 16-Bit breit, und wird auch mit einem 16-Bit breiten Adressbus verwaltet. Da aber das LSB (Bit 0) des Adressbusses immer den Wert 0 hat, können nur die oberen 15 Bit effektiv zur Adressierung verwendet werden. Es gibt folglich im Datenspeicher nur 32768 gerade Adressen.
  • 0x0000
  • 0x0002
  • 0x0004
  • ...
  • 0xFFFE
Nun, so ganz richtig ist diese Sichtweise nicht. Es gibt schon auch ungerade Adressen, allerdings benötigt man die nur, wenn man byteweise (und nicht 16-Bit-Wortweise) auf den Datenspeicher zugreifen will. Wie auch immer, die maximale theoretische Größe des Datenspeichers beträgt 32768 Worte oder 64 kByte. Große PICs haben schon heute bis zu 32 kByte RAM, und so ist es  zu erwarten, dass in Zukunft der RAM bis an seine Grenzen ausgebaut wird. 

Die kleinsten 16-Bit-PICs haben aber gerade einmal 512 Byte RAM. Der physisch vorhandene RAM liegt am Anfang des Adressbereichs (ab 0x0000). Hinter dem vorhandenen RAM bleibt eine Lücke im Adressraum, bis zur letzten Adresse 0xFFFE.

Datenspeicher, mehr Infos:

nach oben

EEPROM
Die meisten dsPIC30Fxxx-Typen haben einen EEPROM, in dem Daten abgelegt werden können, die beim Abschalten der Betriebsspannung nicht verloren gehen sollen. Der EEPROM ist 1 kByte  bis 4 kByte groß. Da er aber in 16-Bit-Worten organisiert ist, kann man auch von 512 Worten bis 2 kWorten sprechen.

Der EEPROM wird in den Adressbereich des Programmspeichers eingeblendet. Er liegt dort unmittelbar vor der Adresse 0x800000. Da im EEPROM Daten gespeichert werden, wäre es eigentlich logischer, ihn in den Datenspeicher-Adressbereich einzublenden, aber wir konnten oben schon sehen, dass es im Datenspeicher-Adressbereich zukünftig eng werden könnte, während der Programmspeicher-Adressbereich geradezu gigantisch groß ist.

Der PIC kann natürlich aus dem EEPROM Daten lesen, wenn auch etwas umständlich. Dafür wird der Tabel-Read-Befehl TBLRD verwendet.
 
    MOV    #LOW_ADDR_WORD, W0       ; Init Pointer
    MOV    #HIGH_ADDR_WORD,W1
    MOV    W1,TBLPAG
    TBLRDL [ W0 ], W4               ; read data EEPROM

Danach stehen die unteren 16 Bit (nicht vergessen, der Speicher ist theoretisch 24 Bit weit, auch wenn im EEPROM-Bereich davon nur 16 Bit physisch existieren) im Zielregister (im Beispielcode in W4).

Genauso, wie man aus dem EEPROM lesen kann, kann man natürlich auch aus dem FLASH lesen. Schließlich liegen beide im Programmspeicher-Adressbereich. Dass macht es möglich, im FLASH (der ja viel größer als der EEPROM ist) beim Brennen des PIC große Datenmengen zu speichern.
 

nach oben

zurück zu 16-Bit-PICs , PIC-Prozessoren , Elektronik , Homepage

Autor: sprut
erstellt am: 08.02.2006
letzte Änderung: 08.02.2006

Quelle: Microchip