Das eBook Angewandte Mikroelektronik wurde von Hans Lohninger zur Unterstützung verschiedener Lehrveranstaltungen geschrieben. Weitere Informationen finden sie hier.


Experiment: RAM-Test

Dieses Experiment überprüft die Anwesenheit einer RAM-Zelle an einer bestimmten Adresse im Mikrocomputer. Dazu wird derselbe Aufbau verwendet, wie im vorigen Experiment (Abbildung EXPINV). Der von PIN eingelesene Wert wird nun an der Stelle MEMO in das RAM geschrieben. Dieser abgespeicherte Wert wird sofort wieder gelesen und am Port POUT ausgegeben. Falls an der Adresse MEMO ein funktionsfähiges RAM vorhanden ist, müssen die LED-Anzeige, die mit POUT verbunden ist, und die Tasten-LEDs für jede eingestellte Bitkombination das selbe anzeigen.

Der Wert von MEMO - und damit die getestete Adresse - kann mit den DIP-Switches variiert werden. Mit dem DIP-Switch wird das obere Byte der Test-Adresse eingestellt, das untere Byte wird auf null gesetzt. Der RAM-Test muss im Adressbereich des EPROMs (0000H-8000H) versagen und im RAM-Bereich erfolgreich sein. In Speicherbereichen, wo kein RAM installiert ist, ändern die LEDs an POUT ihren Zustand nicht entsprechend den Eingangskombinationen.

;===================================================
;---- Experiment: RAM-Test -------------------------
;===================================================
;
            .GLOBAL RAMTST
RAMTST:     IN      A,(DIPSW)               ;Testadresse lesen
            LD      H,A
            LD      L,0                     ;HL enthält Adresse
            IN      A,(PIN)                 ;Wert von PIN einlesen
            LD      (HL),A                  ;Wert in RAM speichern
            LD      A,(HL)                  ;gespeich. Wert lesen
            OUT     (POUT),A                ;Wert an POUT ausgeben
            JR      RAMTST                  ;Schleife 

Der Leser wird, falls in seinem System nur 8k x 8 RAM installiert sind, verblüfft feststellen, dass in Adressbereichen, wo der RAM-Test eigentlich versagen müsste (z.B. bei Adresse 0C000H), dieser trotzdem erfolgreich durchgeführt wird. Der Grund für dieses Verhalten liegt darin, dass die Selektionslogik für die Speicherbausteine nur unterscheidet zwischen dem Adressbereich des EPROMs und dem Adressbereich des RAMs - nicht belegte Adressen werden trotzdem selektiert. Man nennt solche scheinbar besetzten Adressen im Fachjargon auch 'gespiegelte Adressen'.

In der Praxis führt man Speichertests in ähnlicher Form durch, nur dass die Erzeugung und Überprüfung von Bitmustern der Computer übernimmt. Im Folgenden wird ein solches RAM-Testprogramm gezeigt. Es ist als Unterprogramm geschrieben, das als Eingangsparameter die erste und die letzte zu prüfende Adresse verlangt und als Ergebnis das Carry-Flag setzt, falls ein Speicherfehler aufgetreten ist. In diesem Fall gibt HL die Adresse des fehlerhaften Bytes an. Bei nicht gesetztem Carry-Flag trat innerhalb der angegebenen Grenzen kein Fehler auf.

Der folgende kleine Programmausschnitt zeigt eine Möglichkeit, diesen RAM-Test durchzuführen. Zuerst werden die Register HL und DE mit der Start- und der Endadresse geladen, dann der RAM-Test durchgeführt und dann, falls ein Fehler aufgetreten ist, wird die Adresse des fehlerhaften Bytes ausgedruckt.

...
            LD      HL,MEMST                ;Startadresse
            LD      DE,MEMEND               ;Endadresse
            CALL    RAMTST                  ;RAM-Test durchführen
            CALL    C,PRTHL                 ;Fehler: Adresse drucken
... 

Das Unterprogramm RAMTST benötigt als Eingabe die Start- und die Endadresse innerhalb derer der Test durchgeführt werden soll. Beim Test werden zwei komplementäre Bitmuster in jede Speicherzelle geschrieben, so dass jedes Bit im überprüften Speicherbereich einmal auf null und einmal auf eins gesetzt wird.

;================================================== 

;------ RAM-Test ----------------------------------

;==================================================

;

;ENTRY: HL ... Startadresse ; DE ... Endadresse ;EXIT: CF = 0 ---> alles OK ; CF = 1 ---> Fehler auf Adresse HL ; RAMTST: LD A,055H ;Muster 01010101 laden LD (HL),A ; und speichern CP (HL) ;prüfen, ob korrekt JR NZ,$L1 ;wenn nicht ----> EXIT LD A,0AAH ;Muster 10101010 laden LD (HL),A ; und speichern CP (HL) ;prüfen, ob korrekt JR NZ,$L1 ;wenn nicht ----> EXIT INC HL ;nächste Adresse PUSH HL XOR A SBC HL,DE ;vergleiche Endadresse POP HL JR C,RAMTST ;nächster Durchlauf ? JR Z,RAMTST SCF ;fehlerfrei ----> CF=0 CCF RET $L1: SCF ;Fehler ----> CF=1 RET


Last Update: 2008-05-31