Pfad: Home => AVR-Übersicht => Hardware => RAM

; ************************************************

; TestRam testet exteres RAM auf dem STK-200 board

; zählt RAM-Positionen durch Schreiben von AA und
; 55 in die einzelnen Positionen, verifiziert den
; Inhalt und gibt bei erfolgreichem Test das MSB
; der obersten RAM-Adresse auf den LEDs aus
; ************************************************

; Erläuterungen zum RAM-Zugriff

; Der MUX-IC 74HC573 und das RAM 62256-70 müssen bestückt sein.
; Port A ist abwechselnd Adress-Bus für das LSB der RAM-Adresse
; und den Datenbus (Multiplex)
; Port C ist der obere Adress-Bus
; Port D Bit 6 ist /RD (Read) am SRAM
; Bit 7 ist /WR (Write) am SRAM
; Die Leitung ALE (Adress Latch Enable) wird verwendet, Pin 30
; Wenn das gesamte externe RAM ok ist, dann müssen die LEDs am
; Ende alle an sein bis auf das achte. Die höchste Adresse
; ist dann bei einem 32k-SRAM 7FFF.

; 8515-Bibliothek laden

.NOLIST
.INCLUDE "8515def.inc"
.LIST

; Register

.def   mp = R16 ; Multi-Purpose
.def   soll = R17 ; enthält abwechselnd AA und 55

; Reset-/Interrupt-Vektor

   RJMP   main

; Unterprogramme


; Hauptprogramm

main:   LDI   mp,LOW(RAMEND) ;Initiate Stackpointer
   OUT   SPL,mp ; wegen verwendeten Unterprogrammen
   LDI   mp,HIGH(RAMEND)
   OUT   SPH,mp

; Port B steuert die LEDs an

   LDI   mp,0xFF ; Alles Ausgänge
   OUT   DDRB,mp ; an Datenrichtungsregister Port B

; Geht wieder nicht complilieren:
;   SBI   MCUCR,SRE ; Setze das SRAM-Bit im MCU-Register
; Ersatz:
   IN   mp,MCUCR ; Lese MCU-Control-Register
   ORI   mp,0x80 ; Setze Bit 7
   OUT   MCUCR,mp
; Wenn das verwendete SRAM langsamer als 70 ns ist und deshalb
; einen zusätzlichen WAIT-state haben muss, dann muss
; auch das Bit 6 im Port MCUCR gesetzt sein, d.h. der ORI-Befehl
; lautet dann: ORI mp,0xC0 ; Setze Bit 7 und Bit 6

   LDI   XL,LOW(RAMEND) ; Register XL ist R26, LSB RAM-Adresse
   LDI   XH,HIGH(RAMEND) ; Register XH ist R27, MSB RAM-Adresse

   LDI   soll,0b10101010 ; Bitmuster für Test

loop:
   INC   XL
; Erhöhe Adresszähler um 1
   BRNE   check ; Nicht Null, MSB ok
   INC   XH ; Erhöhe MSB der Adresse
   BREQ   check ; Null, MSB übergelaufen, raus
check:
   ST   X,soll
; schreibe Bitmuster in SRAM
   LD   mp,X ; Lese die gleiche SRAM-Adresse
   CP   mp,soll ; Vergleiche gelesen mit geschrieben
   BRNE   Zurueck ; Nicht gleich, raus
   COM   soll ; Drehe alle Bits im Bitmuster um (XOR FF)
   ST   X,soll ; Noch mal mit 0101.0101
   LD   mp,X ; Auslesen
   CP   mp,soll ; Vergleichen
   BRNE   Zurueck ; Nicht gleich, raus
   COM   soll ; wieder umdrehen
   RJMP   loop ; Weitermachen

Zurueck:
   LD   mp,-X
; Pointer X um eins zurücksetzen, Ergebnis egal
Ungleich:
   COM   XH
; XOR FF der obersten RAM-Adresse
   OUT   PORTB,XH ; auf die LEDs
ende:   RJMP   ende ; Loop für immer


©2002 by http://www.avr-asm-tutorial.net