PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ASM Daten lesen/schreiben von/auf SRAM



avr_racer
19.04.2014, 19:07
Hallo Gemeinde,

es kommt doch schon mal öfters vor das man Daten in längerer Form speichern oder lesen muss, hier mal ein kleines Beispiel
wie man es organisieren könnte.

PortB = Ein/Ausgabe
PortD = schreiben/lesen



.include "m8def.inc" ;Atmega8

.def temp0 = r16 ;
.def temp1 = r17 ;
.def temp2 = r18
.def temp3 = r19 ;
.def temp4 = r20
.def cnt = r21

.equ Data = $0060 ;Startzelle festlegen
.equ Dataend = Data+5 ;Endpunkt

.cseg
.org $0000
rjmp stack
.org $0001 ;1
reti;rjmp INT_0
.org $0002 ;2
reti;rjmp INT_1
.org $0003 ;3
reti;rjmp INT_OC2
.org $0004 ;4
reti;rjmp INT_OVF2
.org $0005 ;5
reti;rjmp INT_ICP1
.org $0006 ;6
reti;rjmp INT_OC1A
.org $0007 ;7
reti;rjmp INT_OC1B
.org $0008 ;8
reti;rjmp INT_OVF1
.org $0009 ;9
reti; rjmp INT_OVF0


reti ;a keine SPI Routinen

.org $000b ;b
reti;rjmp INT_URXC
.org $000c ;c
reti;rjmp INT_UDRE
.org $000d ;d
reti;rjmp INT_UTXC
.org $000e ;e
reti;rjmp adc_rdy
.org $000f ;f
reti;rjmp eeprom_rdy
.org $0010 ;10
reti;rjmp ac_int

reti ;11 keine 2wireRoutinen
reti ;12 keine SPMRoutinen

;***************************Init mit allem drumdran*****************
stack: ldi temp1,high(ramend) ;Stackpointer festlegen
out sph, temp1
ldi temp1,low(ramend) ;Stackpointer festlegen
out spl, temp1

start: sbic pind,0
rcall write_sram ;Daten speichern

sbic pind,1
rcall read_sram ;Daten lesen

rjmp start

;Daten schreiben
write_sram:
clr temp0
out portb,temp0
out ddrb,temp0 ;Ausgabe
rcall load_Data_point ;Startpunkt laden
write_sram2:
in temp0,pinb ;Datenquelle ist nur ein Bsp
st x+,temp0 ;von temp0 auf Sram speichern dann +1
cpi xl,Dataend ;vergleiche
brne write_sram2 ;solange != springe
ret

;Daten lesen Ausgabe auf Portc
read_sram:
ldi temp0,$ff
out ddrb,temp0 ;Ausgabe
rcall load_Data_point ;Startpunkt laden
read_sram2:
ld temp0,x+ ;in temp0 laden von Sram dann +1
out portb,temp0 ;Datenausgabe ist nur ein Bsp
cpi xl,Dataend ;vergleiche
brne read_sram2 ;solange != springe
ret

;**Pointer kann X, Y, Z sein
load_Data_point:
ldi xh,high(Data)
ldi xl,low(Data)
ret


Viel Spaß beim Ostereier suchen ;)