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 {TEXT}05,r16
lds r2,{TEXT}05
sts {TEXT}06,r2
sts var1, r2
//SRAM
lds r2,{TEXT}60
sts {TEXT}61,r2
//IO ACHTUNG gefährlich!!!
// besser über die Namen der Register, nicht anonym
lds r2,{TEXT}20
sts {TEXT}21,r2
//
// indirekter Zugriff über den X Pointer r27/r26
clr r27 ; Clear X high byte
ldi r26, ; Set X low byte to
ld r0,X+ ; Load r0 with data space loc. (X post inc)
ld r1,X ; Load r1 with data space loc.
ldi r26, ; Set X low byte to
ld r2,-X
ld r3,-X
// IO Bereich
in r25, ; Read Port B
in r26,PORTC
ldi r16, 15
out , 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 E,r0 ; Write EEPROM address
sbi C,0 ; Set read bit in EECR
in r1,D ; 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