// kner 2009 // Der AVR ATMEGA8 hat folgende Speicherbereiche // Register // SRAM // IO // EEPROM // FLASH .include .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