Memoria externa en c, 8051

Hola que tal!
Poes mi duda es acerca de como en c, hacer que el micro tenga acceso a memoria externa, tomando datos, y tambien escribiendo, alguna vez vi la instruccion, comando o definicon de xdat, pero no supe realmente que era, cualquier aporte gracias.

PD- Uso el uC AT89C52 y el keil
 
Nunca he usado memorias externas en ese micro, solo con el 8088, pero he visto que trabaja de forma similar el demultiplexado de los puertos extarnamente... A fin de cuentas la estructura 8051 tambien la diseño intel....
Con respecto a las instrucciones, creo que nomas se usa una instruccion como tu mencionas para acceder a ella.
Bueno para empezar, te recomiendo que leas el datasheet del 8088 para que veas el demultiplexado de los Adress-Data. Ahi vienen diagramas de conexion y los chips a usar. Los chips los pude conseguir facilmente. Lo que batalle fue en consegir las SRAM. Deja le doy una leida al datasheet del AT89 para ver como se usa su instruccion.
 
Buenas!

Ya se que no es exactamente lo que pedis, pero a mi me pedian eso (hace casi tres años ya)pero en ensamblador...

Recuerdo de un registro de 16 bits llamado "DPTR" en el cual primero tenias que mandar la direccion y despues mandar el dato y para hacer el movimiento de datos creo que se usaba la instruccion MOVX.
Espero que te sirva para algo

Saludos!

NärXEh
 
hay un pin para habilitar el direccionamiento a memoria externa pierdes 2 puertos al momento de habilitar dicho pin y usas el registro dptr esto seria en ensamblador espero te sirva de algo
 
Buenas!

Voy a intentar buscarte mis apuntes sobre eso (manejo de memoria externa con 8051 en asm) pero de todas formas no te prometo nada (son apuntes del 2008).
Lo que si se es que hay una forma de ejecutar codigo ensamblador en c, pero eso deberia de ayudarte alguien q si sepa c.

Saludos!

NärXEh
 
Básicamente hay que agregarle a la declaración de variable la palabra xdata, y decir en que dirección externa está:

Código:
unsigned char xdata nombreVariable _at_ 0x1234;

Saludos,
Gzaloprgm
 
Gracias, mira es una calculadora que checa en la memoria que hay, y de ahi nos escribe el reultado en las direcciones que tengo al inicio del programa


Código:
#include <regx52.h>
xdata unsigned	char mem1 _at_	0xe000;
xdata unsigned	char mem2 _at_	0xe001;
xdata unsigned	char mem3 _at_	0xe002;
xdata unsigned	int  mem4 _at_	0xe003;

void suma			(unsigned char	x,y);
void resta		(unsigned char	x,y);
void multiplicacion	(unsigned char	x,y);
void cociente		(unsigned char	x,y);
void residuo		(unsigned char	x,y);

unsigned int resultado;

main()
{
	if (mem3==0)
	{
		suma(mem1,mem2);
		mem4=resultado;
		goto fin;
	}
	else if	(mem3==1)
	{
		resta(mem1,mem2);
		mem4=resultado;
		goto fin;
	}
	else if	(mem3==2)
	{
		multiplicacion(mem1,mem2);
		mem4=resultado;
		goto fin ;
	}
	else if	(mem3==3)
	{
		cociente(mem1,mem2);
		mem4=resultado;
		goto fin;
	}
	else if (mem3==4)
	{
		residuo(mem1,mem2);
		mem4=resultado;
		goto fin;
	}
	
fin: goto fin ;
}



void suma (unsigned	char x,y)
{
	
		resultado=x+y;
}
void resta (unsigned char x,y)
{
	
		resultado=x-y;
	
}
void multiplicacion (unsigned char x,y)
{
	
		resultado=x*y;
}
void cociente (unsigned	char x,y)
{
	
		resultado=x/y;
}
void residuo (unsigned char x,y)
{
	
		resultado=x%y;
}
 
Veo dos cosas malas en tu código:
Usás GOTO, cosa fea porque hay mejores formas
la variable resultado no es necesaria, podrías escribir directo en memoria...

Saludos,
 
gracias, pero igual no se por que dices lo del goto, que tiene de malo, igual uso el while(1);, para enclavar el sistema no se de verdad por que lo mencionas, creia que el compilador, gastaba menos con un goto que con un while, por que se la pasa comparando :S, igual si ahi ves algo mas ahi me dicen.

A por cierto lo de las funciones si estan de mas, ya lo se, pero es que lo tome de otro archivo que ya tenia igual eso es sencillo, :LOL:!!
 
Atrás
Arriba