Die Speicherbereiche des AVR

// kner 2009
// Der AVR ATMEGA8 hat folgende Speicherbereiche
// Register
// SRAM
// IO
// EEPROM
// FLASH
.include <m8def.inc>
.list
.device atmega8
// direkter Zugriff über Adresse
//Register
ldi r16, 7
sts $0005,r16
lds r2,$0005
sts $0006,r2
sts var1, r2
//SRAM
lds r2,$0060
sts $0061,r2
//IO ACHTUNG gefährlich!!!
// besser über die Namen der Register, nicht anonym
lds r2,$0020
sts $0021,r2
//
// indirekter Zugriff über den X Pointer r27/r26
clr r27 ; Clear X high byte
ldi r26,$60 ; Set X low byte to $60
ld r0,X+ ; Load r0 with data space loc. $60(X post inc)
ld r1,X ; Load r1 with data space loc. $61
ldi r26,$63 ; Set X low byte to $63
ld r2,-X
ld r3,-X
// IO Bereich
in r25,$16 ; Read Port B
in r26,PORTC
ldi r16, 15
out $16, r16 ; Write Port B
// Program Memory
// Achtung: der Wert von Table_1 ist 16 (siehe Watch-Fenster)
// LPM braucht aber einen Zeiger auf die Byte-Adresse, nicht die Wort-Adresse
// hier wird daher Table_1 verdoppelt (shift left 1)
ldi r31, high(Table_1<<1); Initialize Z-pointer
ldi r30, low(Table_1<<1)
lpm r16, Z+ ; Load constant from Program
lpm r17, Z ; Memory pointed to by Z (r31:r30)
//EEPROM
// das EEPROM ist nur über IO Ports erreichbar
out $1E,r0 ; Write EEPROM address
sbi $1C,0 ; Set read bit in EECR
in r1,$1D ; Read EEPROM data
ende:
rjmp ende
Table_1:
.dw 0x5876
.equ tab_size=6
.DSEG
.org 0x11 // Start data segment
table: .BYTE tab_size ; reserve tab_size bytes.
var1: .BYTE 1 ; reserve 1 byte to var1







