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
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