TODOPIC
Otros Microcontroladores / Dispositivos programables => Microcontroladores 8 bits => Mensaje iniciado por: robert cristian en 22 de Febrero de 2011, 16:40:32
-
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?
-
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
-
te agradezco belgitaes por la respuesta; me gustaria porfavor opiniones sobre esta parte de un tutorial que encontre buscando en la web.
Reading program flash memory with the Z pointer
There is only one instruction for the read access to the program storage space. It is defined for the pointer
pair Z and it is named LPM (Load from Program Memory). The instruction copies the byte at program flash
address Z to the register R0. As the program memory is organized word-wise (one instruction on one
address consists of 16 bits or two bytes or one word) the least significant bit selects the lower or upper
byte (0=lower byte, 1= upper byte). Because of this the original address must be multiplied by 2 and
access is limited to 15-bit or 32 kB program memory. Like this:
LDI ZH,HIGH(2*address)
LDI ZL,LOW(2*address)
LPM
Following this instruction the address must be incremented to point to the next byte in program memory.
As this is used very often a special pointer incrementation instruction has been defined to do this:
ADIW ZL,1
LPM
En esta parte del tutorial habla del bit menos significativo de la direccion y del motivo de la multiplicacion por dos a la direccion (todavia no me lo tengo claro)
aqui el tutorial: www.avr-asm-download.de/beginner_en.pdf
-
Buenoooooo A Mi Tambien Me Costo Mucho Trabajo Entender Eso
Lectura De La Memoria Flash Con El Puntero Z :
La Memoria Programa Esta Organizada En Palabras De 16 Bits
+00000000: FFFF = 16 Bits ( 2 Bytes)
LPM (Carga De Programa Desde La Memoria )
La Instrucion LPM Sirve Para Leer Unos Valores Ya Colocadas En La Memoria Flash
Y Copia El Byte Al Registro R0
El Registro Z Es Usado Para Tener Acceso A La Memoria De Programa Flash Y
Con La Instrucion LPM El Registro Z Apuntara A Un Byte De La Memoria Flash
Y Cargara Un Byte Indicado Por El Registro Z En El Registro Destino (RD)
Estos 16 Bits Son Usados Como Indicador De Bits
Los 15 Bits Mas Significativos Seleccionan La Direccion En La Memoria
Cuando Sin Embargo Z Es Una Direcion En Byte (ZH = 8 Bits) (ZL = 8 Bits)
Asi Que El Bit Menos Significativo De Z Eligira
El Byte Bajo (ZLSB = 0) o Bien El BYte Alto (ZLSB = 1)
;.........................................................
;Ejemplo:
LDI R16,0x04
OUT SPH,R16
SER R16
OUT SPL,R16
LDI ZH,HIGH(MiClave*2) ; R31 = LSB 1\ = Valor De La Direcion High Byte }
LDI ZL,LOW(MiClave*2) ; R30 = LSB 0/ = Valor De La Direcion Low Byte }
LDI R28,0x60 ; Apunta En La Direcion $60 De La Ram
LDI R16,0x04 ; Contador
PROG_MODE:
MOV R25,R0 ; Carga El Byte Desde La Memoria
LPM R25,Z+ ; Cargalo En R25 ZLSB = 1
MOV R24,R0 ; Carga El Byte Desde La Memoria
LPM R24,Z+ ; Cargalo En R25 ZLSB = 0
PROG:
ST Y+,R25 ;Gravalo En Ram Direcion $60
ST Y+,R24 ;Gravalo En Ram Direcion $61
DEC R16 ;Decrementa El Contador
CPI R16,0x00 ;Compara Los Bytes Que Quedan A Grabar
BREQ PC+0x02 ;Salta A STOP Si Estan Grabados
rjmp PROG_MODE
STOP: rjmp STOP ;FIN DEL PROGRAMA
MiClave:
.DW 0x174E ,0x030C,0x010B,0x0B05
;.....................................................
La Direcion Es Multiplicada Por Dos Antes De Que Sea Puesto En El Registro Z
Ahora Cuando Lo Compilas Abres Tu Codigo Con Un Bloc De Notas
Y Mira Esto Te Lo Explico En La Foto
Veras Que Ahora En La Direcion De La Memoria Se Han Invertidos Los Bytes
Y (4E) Es Ahora Adress High Y (17) Low Adress
Eso Es Debido A Que Cuando Compilas En El Formato Intel
Una Palabra De 16 Bits Se Escribe En El Sentido (Byte LSB Seguido De Byte MSB)
Por Eso Al Leer Tu Codigo En Un Bloc De Notas Los Opcodes Estan Invertidos
Y Claro En Mi Ejemplo Al Gravar R25 Primero En La Direcion RAM $60
El Code Leera Primero La Direcion High Byte Es Decir(4E) Y Lo Gravara En RAM $60
dw 0x174E ; 0x4E Es La Direcion Cuando ZLSB = 1 Value of Address 0x14 (High)
; 0x17 Es La Direcion Cuando ZLSB = 0 Value of Address 0x14 (Low)
-
:-/ biennnnnnnnnnnnnnnnnnnnn!!!, por fin lo entendiiii :-/...te agradezco belgitaes por tus respuestas, me aclararon las cosas, gracias.
saludos: robert V.