hola, estoy iniciandome con los avr (atmega8),
he hecho algunos programas sencillos y ahora me gustaria trabajar con tablas,
pero tengo dudas de como trabajan.
precisamente la duda es esta parte del programa:
LDI ZH,HIGH(2*tabla)
LDI ZL,LOW(2*tabla)
lei que siempre se tiene que multiplicar por dos,
pero luego vi aqui : http://www.todopic.com.ar/foros/index.php?topic=27420.80 esta parte de codigo:
ldi r30,low(seg7)
ldi r31,high(seg7)
la pregunta es porque se multiplica por dos ,
y en que casos se hace y que casos no?
;.............................................
; Llamada de la function
;.............................................
ldi xh,$01 ;Inicio Puntero Msb
ldi xl,$00 ;Inicio Puntero Lsb
ldi zh,high(Tabla*2);Inicio Puntero Msb ( La Multiplicacion Es Obligatorio Para Alinear La Direccion Sobre 16 Bits )
ldi zl,low(Tabla*2) ;Inicio Puntero Lsb ( Debido A La Estructura De La Memoria Interna )
.CSEG
.ORG 0x0500
Tabla:
.db 0x89,0x34,0x45,0x12,0x67,0x08,0x54,0x26
Esto es así debido a que el tamaño mínimo del código de operación (opcode) de una
instrucción es de una palabra.
;............................................................................................
Un Mapa De Memoria Es Una Vista Grafica
De Todas Las Posiciones De Memoria En Un Microcontrolador
Es Un Conjunto Ordenados De Registros Que Contienen Datos Numericos
|0 |1 |2 |3 |4 |5 |6 |7 |8 |9 |A |B |C |D |E |F |
$0000|R0|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|
$0010|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|
$0020|__|__|__|__|__|__|__|__|28|__|__|__|__|__|__|__|
$0030|__|__|__|__|__|__|__|__|__|__|3A|3B|3C|3D|3E|3F|
Por Ejemplo Segun El Datasheet Del Avr90S8515 Vemos Que Los Registros De Trabajos
Son 32 Registros Que Van Desde R0 ($00) a R31 ($1F)
|0 |1 |2 |3 |4 |5 |6 |7 |8 |9 |A |B |C |D |E |F | 32 Bytes De Trabajo
$0000|R0|R1|R2|R3|R4|__|__|__|__|__|__|__|__|__|__|R15| $000F
$0010|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|R31| $001F
Estos Registros Contienen Los Datos A Tratar
Como Las Operaciones Aritmeticas Variables Y Banderas De Estados Con El Micro
(Atmel, 1999)
Mapa Corrido De Memoria De Datos
3 Registros Para Punteros De 16 Bits(X=R27:R26 Y=R29:R28 Z=R31:R30)
Que Direccionan 128 KBytes En Palabras De 16 Bits
• Registro X: formado por XH (parte alta de X, que corresponde a R27) y XL
(parte baja de X, que corresponde a R26).
• Registro Y: formado por YH (parte alta de Y, que corresponde a R29) e YL
(parte baja de Y, que corresponde a R28).
• Registro Z: formado por ZH (parte alta de Z, que corresponde a R31) y ZL
(parte baja de Z, que corresponde a R30). Este registro tiene la
peculiaridad de que es usado para acceder a los datos de la flash.
Estos registros dobles permiten direccionar todo el área de memoria, ya sea
flash, eeprom o sram.
|___________|Direcion
|_____R0____|$00
|_____R1____|$01
|_____R2____|$02
|_____R3____|$03
|...........|$...Etc
|____R15____|$0F
|____R16____|$10
|...........|$...Etc
|____R26____|$1A Byte Lsb X
|____R27____|$1B Byte Msb X
|____R28____|$1C Byte Lsb Y
|____R29____|$1D Byte Msb Y
|____R30____|$1E Byte Lsb Z
|____R31____|$1F Byte Msb Z
Ejemplo:Un Mapa De Memoria
El Numero De Registro De La Memoria Es De ( 4K*16 Bytes )
Cada Registro De La Memoria Puede Ser Localizado Por Una Direcion
El Primer Registro Esta Localizado Por La Direcion ;0000
El Registro Siguiente Por La Direcion ;0001 Y Asi Sucesivamente
La Ultima Direcion Esta Localizado Por La Direcion "1FFF"En Hexadecimal
Organizacion De La Memoria
............= $0000 Direcion Baja
. .
. 4KWord .
. 4K * 16 .
. .
. .
. . 4KWord (8KB) De Memoria Flash
. . = 4KWord * 2048 = 8192 Bytes
. .
. .
. .
. . .
. . . .
. . . .
.. . .
. .
.. .
. .
. .
............= $1FFF Direcion Alta
_________________________________________________________________________
|TIPO | FLASH |TAMAÑO | INTERNAL|TAMAÑO |EEPROM |TAMAÑO| TOTAL MEMORIA |
| Micro | END | KB | RAMEND | KB | END | KB | PROGRAMABLE |
|_______|_______|_______|_________|_______|_______|______|_______________|
|90S8515| $1FFF | 8 | $025F | 0,5 | $1FF | 0,5 | 9216 |
| |
|8 Kbytes Of In - System Programable FLASH |
|512 Bytes Of SRAM |
|512 Bytes Of In - System Programable EEPROM |
|________________________________________________________________________|
pero luego vi aqui : http://www.todopic.com.ar/foros/index.php?topic=27420.80
esta parte de codigo:
ldi r30,low(seg7)
ldi r31,high(seg7)
LOW(expression) Primer Byte Bajo De 16 Bits
HIGH(expression) Segundo Byte Alto De 16 Bits
seg7:.db 0x80,0xf1,0x48,0x60,0x31,0x22,0x02,0xb0,0x00,0x20