Navigation

Mitglieder Online

· Gäste Online: 1

· Mitglieder Online: 0

· Anzahl Mitglieder: 107
· Neuestes Mitglied: Klimparfed

Neueste Artikel

Login

Benutzername

Passwort



Noch kein Mitglied?
Hier klicken um Dich zu registrieren.

Passwort vergessen?
Um ein neues Passwort anzufordern klicke hier.

Latest Downloads

Forum Themen

Neueste Themen
· Multi-Master IIC Int...
· HCS08 im DIP Gehäuse
· Rotary Encoder
· Serial Software Buffer
· Embedded World 3-5.3...
Heisseste Themen
Keine Themen erstellt

Die HC08 CPU

Der Aufbau der HC08 CPU

Die HC08 CPU ist eine klassische 8 Bit CPU mit einem Adressraum von 64 Kilobyte und einer von Neumann Architektur. Das bedeutet Programmcode und Daten teilen sich eine Bus.

Der externe Takt wird durch vier geteilt und ergibt dann den sogenannten Bustakt. Innerhalb eines Bustaktes kann ein kompletter Buszyklus ausgeführt werden. Also ein Byte aus dem Speicher geladen oder in den Speicher geschrieben werden. Die maximale Busfrequenz der CPU08 beträgt 8 MHz. Bei manchen Controllern auch ein wenig mehr.

Die CPU hat 5 Register :

Den Akkumulator, das zentrale Register in dem alle Operationen ausgeführt werden können ist 8 Bit breit.

Akkumulator A
7
65
4
3
21 0


Das Indexregister, welches bei diversen Adressierungsarten genutzt werden kann und mit einigen Befehlen auch als Universalregister benutzt werden kann.
Das Indexregister ist entweder als X-Register 8 Bit breit oder als H:X - Register zusammengefaßt 16 Bit breit und kann somit den gesamten 64K Adressraum indizieren.

Indexregister H:X
H X
15 14
13
12
11
10
9
8
7
6
5
4
3
2
1
0


Der Stackpointer ist 16 Bit breit und zeigt auf den Anfang des Stacks. Der Stack kann somit den gesamten Adressraum adressieren, muß aber im RAM liegen. Der Stackpointer wird nach dem Reset mit der Adresee 0x00FF geladen, dies hat den Grund die Kompatibilität zum 68HC05 zu wahren. Der Stackpointer sollte dann auf eine anderen Adresse gesetzt werden um die Bereich der Zero Page für Variablen nutzen zu können.

Der Stackpointer SP

15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0


Der Programmzähler ist 16 Bit breit und zeigt auf die Adresse des Befehls oder Operanden der als nächstes gealden werden soll.
Nach einem Reset wird die Adresse die an Stelle $FFFF und $FFFE steht in den Prorammzähler geladen. Die Adresse im Resetvektor ist die Adresse an der der erste Befehl nach einem Reset ausgeführt wird.

Der Programmzähler PC

15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0


Das Condition Code Register ( CCR ) enthält Flags die anzeigen ob eine Bestmmte Bedingung Wahr oder Falsch ist

Folgende Flags sind enthalten :

Overflow Flag (V)
Das Overflow Flag wird gesetzt wenn es einen Zweierkomplement Überlauf gibt, also wenn im Akkumulator Bit 7 gesetzt wird, weil dann aus einer Positiven eine Negative Zahl werden würde.

Half Carry Flag (H)
Das Half Carry Flag wird gesetzt wenn ein Überlauf von Bit3 zu Bit4 im Akkumulator stattfindet. Das Half Carry Flag wird für BCD Arithmetik gebraucht.

Interrupt Mask (I)
Wird dieses Flag gesetzt sind alle Maskierbaren interrupts gesperrt. Wenn ein Interrupt auftritt wird dieses Bit nach dem Sichern der Register auf dem Stack automatisch gesetzt. Wenn diese Bit 0 ist, so sind Interrupts zugelassen.

Negative Flag (N)
Dieses Bit wird gesetzt, wenn das ergebnis einer Operation Negativ ist, das heißt wenn Bit 7 des Akkumulators 1 ist.

Zero Flag (Z)
Dieses Flag wird immer dann gesetzt wenn das Ergebnis einer Operation 0 ist.

Carry/Borrow Flag (C)
Das Carry Flag wird gesetzt wenn es bei einer Addition ein Ergebnis gibt welches nicht in 8 Bit passt oder wenn bei einer Subtrktion ein Bit geborgt werden muß.

Das Condition Code Register CCR

V 1 1
H I
N
Z
C



Die CPU verfügt über folgende Adressierungsarten .

Inhärent : Inhärente Befehle haben keinen Operanden oder der Operand befindet sich bereits im Befehl. Ein Inhärenter Befehl wird in einem Buszyklus ausgeführt. Ein beispiel hierfür ist das löschen des Carry Flags CLC.

Immediate : Immediate Instruktionen werden direkt von einem 8 oder 16 Bit Wert gefolgt. Das Laden des Akkumulators mit einem Wert ist zum Beispiel so ein Befehl. LDA #20 ist ein 2 Byte Befehl und benötigt 2 Bustakte, LDHX #1234 wäre ein 3 Byte Befehl der 3 Bustakte benötigt.

Direkte Adressierung : Bei der Direkten Adresierung folgt auf den Befehle eine 8 Bit Adresse, dadurch können diese Befehle nur auch die unteren 256 Byte ( Zero Page ) angewandt werden. Diese Befehle benötigen 2 Buszyklen. LDA $40 lädt den Akkumulator mut dem Wert der an Adresse $40 steht.

Extended Adressierung : Funktioniert wie die Direkte Adressierung, nur wird hier eine 16 Bit Adresse verwendet. Daher werden 3 Buszyklen benötigt. LDA $2345 wäre so ein Befehl.

Relative Adressierung : Die sedingten Sprünge ( Branch befehle ) verwenden diese Adressierung. Wenn die Bedingung erfüllt ist, wird der Vorzeichenbehaftet Operand der dem Befehl folgt zum Program Counter hinzuaddiert. Somit kann in einem Bereich von -128 bis +127 Byte verzweigt werden.

Indizierte Adressierung ohne Offset : hier wird als Operand direkt das Indexregister verwendet. JMP ,X ist ein Sprung an die Adresse im Indexregsiter H:X.

Indizierte Adressierung mit 8 Bit Offset : Bei der Indizierten Adressierung wird zu der im Befehl angegebenen Adresse noch der 8 Bit Wert des Indexregisters X addiert. Ein Beispiel ist LDA $20,X. diese Adressierungsart ist besinders in Schleifen sehr effektiv, hier können durch hochzählen des Indexregsiters dann speicherbereiche adressiert werden.

Indizierte Adressierung mit 16 Bit Offset : Hier wird im Befehl eine 16 Bit Adresse angegeben nd des Indexregistr hinzuaddiert. LDa $2000,X wäre ein Bespiel um Daten aus der Adresse $2000 plus dem Inhalt des H:X Regsites zu laden.

Stackpointer mit 8 Bit Offset : Hier wird der Stackpointer als Indexregister verwendet.

Stackpointer mit 16 Bit Offset : Wie die Indizierte Adressierung aber mit dem Stackpointer als Indexregister.

Immediate to Direct Adressierung : Hier wird ein im Befehl angegebener Wert diirekt in den Speicher geschrieben. Das ganze geht nur in der Zero Page MOV #FF, DDRA, speichert den Wert FF im Datenrichtungsregister von Port A.

Memory to Memory Direct to Direct : Auch hier kann nur die Zero Page Adressiert werden. MOV $F0,$F1 speichert den Wert von Adresse F0 an Adresse F1.

Memory to Memory Indiziert zu Direkt mit Postincrement : Hier wird der Inhalt der Adresse auf die das Indexregister Zeigt an eine Adresse in der Zero PAge kopiert und das Indexregister um 1 hochgezählt.

Memory to Memory Indiziert mit Postinkrement zu Direkt : Hier wird der Inhalt der Adresse auf die das Indexregister Zeigt an eine Adresse in der Zero Page kopiert und das Indexregieter um 1 erhöht.

Indiziert mit Postincrement : Funktioniert wie die Indizierte Adressierung aber das Indexregister wir Hochgezählt.

Indiziert mit 8 Bit Offset und Postincrement : Wie indiziert mit 8 Bit Offset aber das Indexregister wird hochgezählt.

Desweiteren verfügt jeder HC08 Controller über einen ROM und eine RAM Speicherbereich. Der ROM Bereich ist normalerweise FLASH ROM manche Controller haben zusätzlich noch eine EEPROM Bereich.

Die größe der RAM Bereiches geht von 128 Byte bis zu 4 Kilobyte, die Größe des FLASH Bereiches geht von 1 bis 60 kilobyte.

Jeder HC08 Controller hat noch 2 Bereiche in denen sich die Register für die Peripherie befinden und einen oder zwei ROM Bereiche für den Monitor Code und ein paar Hilfsroutinen.

Am oberen Ende des Adressbereichen befinden sich der Resetvektor und bis zu 127 Interrupvektoren, je nachdem welche Peripherie der Controller hat sind das bis zu 256 Bytes, die im Bereich FF00 bis FFFF liegen können.

Der Speicherbereich von 0x0000 bis 0x00FF wird Zero PAge genannt. In diesem Bereich befinden sich sich einige Register für die Peripherie und RAM. Die Zero Page kann besonders schnell angesprochen werden, weil es hierfür extra befehle gibt, die mit einem Byte für die Adresse auskommen. Statt 0x00C0 reicht dann 0xC0 als Adresse aus.

Wer sich ntensiver in die Assemblerprogrammierung einlesen möchte, der sllte das Datenblatt oder das CPU08 Reference Manual zu rate ziehen. Wer bereits Erfahrungen mit der 68HC05 Familie gemacht hat sollte sich schnell zurechtfinden können.

Nach dem einschalten wird normalerweise die Adresse die im Resetvektor ( $FFFE $FFFF ) steht in den Program Counter geladen und mit der Programmausführung begonnen. Wenn die Bedingungen für den Monitormode zutreffen, wird nach dem Reset der Inhalt der Adresse, $FEFE und $FEFF in den Programmcounter geladen und der Monitorcode ausgeführt.

Weiter gehts mit den konfigurationsregistern Link
Seitenaufbau: 0.05 Sekunden
690,337 eindeutige Besuche