Vector en matriz en 8051

Buenas tardes,

Soy estudiante de Electrónica y tengo la duda de si es posible integrar una array dentro de cada casilla de una matriz en un 8051.

Si es así, cual es el número de bits máximo que puede tener la array?

Muchas gracias.
 
No acabo de entender lo que preguntas.
El 8052 es un microcontrolador de 8 bits, en cada dirección de memoria caben 8 bits. Por programación en C, ensamblador o como quieras puedes configurar cadenas o grupos de números/datos a tu antojo.
Es un microcontrolador con arquitectura harvard, no von neuman como los ordenadores "normales". El límite "normal" de este microprocesador son 64kB de rom para programas y 64kB de ram para datos + 256 bytes de memoria interna + 128 SFR. Pero los hay de todas las formas y colores y con mapas de memoria bastante complejos.
En general no he visto integrados mas de 8kB de RAM, con 64kB de flash para programas si que son comunes e incluso con 128kB haciendo bancos, según los modelos pueden llevar eeprom que normalmente solapa con la ram y toda la memoria integrada en el chip puede conmutarse para acceder a memoria externa. La Flash también se puede usar para almacenar datos en los modelos IAP.
Hay mil derivados así que es difícil dar una respuesta concreta sin que des mas datos.
 
Muchas gracias por la respuesta, me explico un poco más:

La idea es mapear un laberinto con robots seguidores de línea. El laberinto esta dividido en segmentos de 10 cm, cada uno de estos segmentos equivale a una celda de la matriz. Intento crear una matriz de 60x60, y dentro de cada posición necesito tener disponibles 12 bits para guardar información de cada tramo, de manera que el micro pueda leer y escribir información de todo tipo.

Entonces en teoría necesitaría 60*60*2 = 7.2 kB. Debería tener memoria más que suficiente no?

Muchas gracias de nuevo
 
La pega es que hay pocos derivados con tanta ram. Puedes usar 12 bits justos; al 8052 se le da bien manejar nibbles pero de todos modos te vas a 5400 bytes que es mas de 4kB
También lo puedes guardar en la flash si el derivado es IAP o si la matriz la grabas tu y no el robot en tiempo de ejecución. Depende de como tengas que manejar la matriz.
 
He estado mirando diferentes modelos, a ver que os parece:

Primero había pensado en el modelo AT89C5131 de Atmel, con lo siguiente: Flash EEPROM: 32kB para el programa i RAM: 1024 Bytes. En teoría, según lo comentado no debería tener suficiente memoria, pero he compilado dicha matriz con uVision3 y no me da problemas(declarada con XDATA). Pero no tengo claro si el robot podrá modificar y leer la matriz mientras este recorriendo el laberinto.

También he encontrado otro modelo: LPC2148, con 40kB de RAM estática i 512kB de Flash EEPROM.

Es importante que tenga entrada USB (estos dos si tienen). Lo que me extraña es que el segundo es, creo, inusualmente barato (7$) por la memoria que tiene. Aparte, este segundo me aparece sin stock en Farnell y tendría que pedirlo a USA.
 
No me suena que los compiladores tengan "noción" de si el código desborda o no los límites. Si necesitas 8k no cabe en 1.
El LPC es ARM no es '52 solo conozco uno con mas de 64kB ya que es el límite "natural" de los micros de 8 bits; un contador de programa de 16 bits.
Hay muy pocos derivados '52 con usb pero tampoco lo veo muy útil en un robot que supongo autónomo, yo pondría un bluetooth a la uart.

Me suena que en la web de keil había un buscador paramétrico de '52
 
Pero ese circuito tampoco tiene un core '52; es 16 bits risc

La verdad es que si va a programar en C no tiene demasiada importancia que cpu usar y quizás sería conveniente cambiar a algo mas potente que un '52
Además el 8052 no se desenvuelve demasiado bien con la memoria externa ya que solo dispone de direccionamiento por registro, un solo DPTR de 16 bits como estándard, aunque hay muchos derivados con 2 o incluso 8 DPTRs
 
Última edición:
No me suena que los compiladores tengan "noción" de si el código desborda o no los límites...

El keil te avisa y no te deja compilar.

Tal vez (ya no me acuerdo como era el asunto con el 8052), al estar declarandolo como xdata, el keil lo está tomando como memoria externa y no como la interna. Aunque también recuerdo que había que hacer una declaración similar con la memoria RAM del 8052 que iba más allá de los 128 bytes originales del 8051.

Si podés pasarte a un uC que maneje más memoria como un ARM, no lo dudes, vas a dar menos vueltas y como trabajas en C el cambio no es tan terrible (tal como dijo Scooter), vas a tener diferencias sin lugar a duda, pero nada que no se pueda entender usando las hojas de datos y ejemplos que andan dando vuelta por internet.
 
Muchas gracias por vuestra ayuda,

Estoy un poco confuso, he estado buscando información por internet, pero no acabo de aclararme con tantos modelos, parámetros, familias y subfamilias...

Básicamente lo que quiero es un micro que se pueda programar en C, que tenga suficiente memoria RAM para la matriz y que no sea muy complicado de cargarle el programa (por eso antes he comentado lo del USB, ya que el único micro que he programado ha sido un at89c5131 de atmel, y en la página web te daban todas las herramientas necesarias para poder cargar el programa).

Precisamente una cosa que me intriga es que en muchos integrados que compruebo no encuentro casi ninguna explicación de como cargar el programa en la memoria del micro. No sé si eso se da por supuesto, pero yo no sé cómo hacerlo...

Alguna recomendación?
Sé que pido algo muy concreto pero en la universidad solo hemos tocado ese micro así que todo lo demás me pilla de nuevo...

Gracias de nuevo!
 
Tampoco es que yo sea un erudito; solo he programado versiones romless con programadoes de eprom y luego el at89c51rd, rd2, id etc que son casi iguales de atmel y se programan via uart.
Si la matriz es estática la puedes meter sin pegas en la rom, si es dinámica, ya sabes...
 
Última edición:
En los ARM de la serie LPC la programación es más sencilla que un 8051, ya que se hace a través del puerto serie del uC (es decir tiene un puerto serie que bootloader y con solo un RS232 programás).

En los AVR, la programación es bastante similar al 8052 (de la empresa atmel, más que nada la serie "S"), es mediante SPI y lo podés hacer por puerto paralelo o por serie, pero si lo haces por puerto serie necesitas todos los pines del puerto para realizar el SPI (osea no es RS232 como en el ARM).

Habría que ver que opciones tenés en PIC, se que algunos se programan con puerto paralelo (y me imagino que con serie también).

Mi recomendación en cuanto a la programación, es tratar de conseguir un uC que sea ISP (In System Programming), es decir un uC que no tengas que sacarlo y ponerlo a cada rato para programarlo, sino que desde el mismo circuito final puedas hacerlo.
 
Muchos 8052 se programan por la uart normal sin nada especial mas que poner el modo bootloader; pulsar reset con cierto pin a 1, de hecho muchos cables lo hacen ya solos.
 
Hola!

Primero deciros que he tardado tanto en contestar porque quería contrastar bien toda la información que he encontrado, aún así, tengo dudas...
He escogido dos posibles candidatos a microcontrolador para mi proyecto, a ver que os parecen:

El NXT LPC2141 es un micro con arquitectura ARM, lo que pasa es que no entiendo muy bien como puedo meterle el código. El compilador que usaría sería el keil 4, pero luego para flashear he leído que se podría usar un programa llamado Bluewind FLASHER, aunque en la "Getting Started Guide" proporcionada por el fabricante dice que se necesita una "Development Board" i un "JTAG debugger" para hacerlo. Creeis que se podría hacer sin alguno de estos dos componentes o mejor me hago con ellos y me ahorro dolores de cabeza?

Por otro lado, el ATmega640 de Atmel tiene arquitectura AVR. En este caso he encontrado más información de como meterle el programa, tanto en paralelo como en serie, pero no acabo de entender cómo enchufar el micro al PC y qué programa se encargará de leer la información de los distintos pines y de controlar todo el proceso. Para esto último, la misma página de Atmel proporciona un programa llamado Atmel Studio, pero igualmente para conectarlo al PC dice que es necesario un "Debugger" y un "Development Kit".

Cuál de los dos creeis que es mejor opción en cuanto a simplicidad, tanto de meterle el código como luego de configurarlo y programarlo?

Tengo el tiempo un poco justo para programarlo todo, creeis que me llevará demasiado tiempo aprender a como usar correctamente cualquiera de las dos arquitecturas?

Puede que sea mejor usar el AT89C5131 (arquitectura 8051, se le mete el código por USB muy fácilmente) que ya he usado anteriormente añadiéndole una memoria externa para guardar la matriz?


Muchísimas gracias!
 
Para programar el LPC solo necesitas un max232 como interfaz entre la uart del uC y el puerto serie de tu PC. Después podés usar el programa Flash Magic para programarlo.

De los dos que mencionaste, sin dudas el Atmega te va a resultar mucho más familiar, ya que esa familia es una evolución del 8051 y por otro lado si tenés poco tiempo para aprender, un ARM no es la mejor opción.

¿Qué te puede resultar distinto del Atmega respecto al 8051?

- Manejo de los puertos, no funciona a modo de bits como en el 8051, sino que tenés que usar máscaras (nada complicado, si tenés experiencia en C). Sin embargo tenés la gran ventaja de poder configurar los puertos en forma individual, es decir en un 89s52 (familia cercana al 8051 que mencionaste), cuando usabas el P1.0 como entrada, eso implicaba que hasta el puerto P1.3 (es decir el nibble) todos funcionaban de esa forma, con los Atmega no.

- Los registros tienen un nombre distinto, pero nada raro si usas las hojas de datos.
 
Los puertos '52 son todos semi bidireccionales bit a bit, no se configuran. Al menos yo no conozco ningún derivado en el que se configure. Se pueden usar uno a uno como entrada o salida. Incluso como entrada y salida; así se hace el interface de un teclado PS2 con solo dos pines sin tener que estar reconfigurando continuamente.

Puedes usar memoria externa pero pierdes dos puertos y dos líneas, osea 18 lineas.
También se puede hacer direccionamiento de 8 bits y entonces se pierde solo 1 puerto y dos líneas para 256 bytes y añadir algunos pines para direccionar algo mas; para 8k necesitarías 13 líneas mas RD y WR, en total solo 15 en lugar de 18. Si eliges un derivado con memoria interna se puede simultanear y entonces quizás te sirva con 4k externos y por lo tanto 14 líneas.

Después de tanto marear resulta que sin salir de atmel hay uno con 8k de ram:
http://www.atmel.com/devices/AT89C51RE2.aspx
http://www.atmel.com/Images/doc7663.pdf

No tiene USB pero es programable via uart, osea que basta con un max 233 o 232 y un puerto serie o un adaptador usb-serie. Los que yo usé funcionaban así perfectamente.
Tienes también 128kB de Flash
 
Última edición:
Scooter dijo:
Los puertos '52 son todos semi bidireccionales bit a bit, no se configuran. Al menos yo no conozco ningún derivado en el que se configure. Se pueden usar uno a uno como entrada o salida. Incluso como entrada y salida; así se hace el interface de un teclado PS2 con solo dos pines sin tener que estar reconfigurando continuamente.

Como experiencia (tal vez hice algo mal), cuando quise usar un LCD 2x16 en modo de 4bits, usando una parte de un nibble de un puerto y la otra para manejar otro cosa, el display no podia inicializar. Después veo si encuentro el código si te interesa.
 
Atrás
Arriba