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