Autor Tema: Vectores de char en PIC16f886  (Leído 4700 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado rbpkirow

  • PIC10
  • *
  • Mensajes: 21
Vectores de char en PIC16f886
« en: 25 de Mayo de 2011, 11:03:39 »
Hola a tod@s.

Estoy teniendo un problema en la compilacion de un programa con el pic 16f886, a ver si alguien me puede ayudar, o explicar porqué me está ocurriendo.

Necesito un vector de char o int (mejor char por memoria) de unos 300 elementos. El problema es que no me deja declarar un vector de mas de 96 elementos. Me ocurre lo siguiente:
Código: [Seleccionar]
#define MAX_ANG 97

// Variables globales
char angulos[MAX_ANG];

#include <htc.h>
#include <math.h>

__CONFIG(FOSC_INTRC_CLKOUT & WDTE_OFF & PWRTE_OFF & MCLRE_ON & CP_OFF & CPD_OFF & BOREN_OFF & IESO_OFF & FCMEN_OFF & LVP_OFF & DEBUG_OFF & BOR4V_BOR40V & WRT_OFF);

void main()
{
for(int i = 0; i<MAX_ANG; i++)
{
angulos[i]=80;
}
} /*main*/


Error   [1250] \main.c; 5. could not find space (97 bytes) for variable _angulos


Como se puede ver, con 97 elementos me devuelve error de espacio, sin embargo, modificando el tamaño a 96 compila correctamente y me indica un uso de espacio de datos de 27%


Código: [Seleccionar]
Memory Summary:
    Program space        used    2Fh (    47) of  2000h words   (  0.6%)
    Data space           used    64h (   100) of   170h bytes   ( 27.2%)
    EEPROM space         used     0h (     0) of   100h bytes   (  0.0%)
    Configuration bits   used     1h (     1) of     2h words   ( 50.0%)
    ID Location space    used     0h (     0) of     4h bytes   (  0.0%)

   
De hecho, si declaro 2 vectores de 96 elementos, tampoco tengo ningun problema y compila correctamente con un uso de 53%


Código: [Seleccionar]
#define MAX_ANG 96

// Variables globales
char angulos[MAX_ANG];
char angulos2[MAX_ANG];

#include <htc.h>
#include <math.h>

__CONFIG(FOSC_INTRC_CLKOUT & WDTE_OFF & PWRTE_OFF & MCLRE_ON & CP_OFF & CPD_OFF & BOREN_OFF & IESO_OFF & FCMEN_OFF & LVP_OFF & DEBUG_OFF & BOR4V_BOR40V & WRT_OFF);

void main()
{
for(int i = 0; i<MAX_ANG; i++)
{
angulos[i]=80;
angulos2[i]=80;
}
} /*main*/



Memory Summary:
    Program space        used    3Ch (    60) of  2000h words   (  0.7%)
    Data space           used    C4h (   196) of   170h bytes   ( 53.3%)
    EEPROM space         used     0h (     0) of   100h bytes   (  0.0%)
    Configuration bits   used     1h (     1) of     2h words   ( 50.0%)
    ID Location space    used     0h (     0) of     4h bytes   (  0.0%)


Alguien me puede explicar porqué motivo no puedo usar un vector de mas de 96 elementos si usando 2 vectores tengo un 50%?

muchas gracias
un saludo


Edito:
Utilizo MPLAB version 8.63 con el compilador PIC16 version 9.81 PRO version (Evaluacion)
« Última modificación: 25 de Mayo de 2011, 11:06:18 por rbpkirow »

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Vectores de char en PIC16f886
« Respuesta #1 en: 25 de Mayo de 2011, 11:31:18 »
Hola, no uso microcontroladores MicroChip, pero por lo que aprendí en este foro la RAM de algunos miembros de la familia no es lineal si no que esta divida en bancos, por eso el compilador te avisa que no podes declarar arrays de un tamaño mayor al mismo. También aprendí que hay compiladores que te permiten ocultar esta restricción dándose cuenta del elemento a acceder y por ende haciendo el correspondiente switch de banco.

Saludos !

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Vectores de char en PIC16f886
« Respuesta #2 en: 25 de Mayo de 2011, 11:48:35 »
  Estoy de acuerdo con Richi777, seguro que el problema se debe a la división de la memoria en bancos. Como no tenés tanta ram en un banco te tira el error. Seguramente con un PIC de la familia 18 no tendrías el error.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Vectores de char en PIC16f886
« Respuesta #3 en: 25 de Mayo de 2011, 13:17:36 »
Yo lo aseguro, es ese el problema, y CCS no hace lo que comenta Richi : "También aprendí que hay compiladores que te permiten ocultar esta restricción dándose cuenta del elemento a acceder y por ende haciendo el correspondiente switch de banco. "  :tongue:

Así que se debe usar un buffer de menor tamaño o cambiar de micro y de la familia 18F.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Vectores de char en PIC16f886
« Respuesta #4 en: 25 de Mayo de 2011, 13:50:40 »
Hola si lo dice Suky tómalo como palabra santa.

Saludos !

Desconectado rbpkirow

  • PIC10
  • *
  • Mensajes: 21
Re: Vectores de char en PIC16f886
« Respuesta #5 en: 25 de Mayo de 2011, 14:40:34 »
Muchisimas gracias a todos.
Estoy estudiando el pic 16f1938 que tiene mas memoria y a primera vista es pin a pin compatible con el 16f886.

Muchas gracias de nuevo.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Vectores de char en PIC16f886
« Respuesta #6 en: 25 de Mayo de 2011, 14:50:49 »
  Según el datasheet que estoy mirando del 193x, sí tenés mas memoria RAM, pero por banco sigue manteniendo el máximo de 96 bytes.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Vectores de char en PIC16f886
« Respuesta #7 en: 25 de Mayo de 2011, 14:52:46 »
Muchisimas gracias a todos.
Estoy estudiando el pic 16f1938 que tiene mas memoria y a primera vista es pin a pin compatible con el 16f886.

Muchas gracias de nuevo.


Si bien el 16F1938 es de arquitectura extendida y permite con punteros direccionar toda la ram sin tener que cambiar de banco, el problema está en que la ram para tus datos no es continua como en los 18F.  Por ende tenes varios puntos donde existen posiciones de memoria que se acceden desde todos los bancos pero la parte util que utilizarías para tus datos no es continua por ende tampoco te servirá para declarar un arreglo tan grande.

saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Vectores de char en PIC16f886
« Respuesta #8 en: 25 de Mayo de 2011, 14:53:04 »
Hola AngelGris, muy bueno el dato.

Saludos !

PD: Competis conmigo para ver quien llega primero a los 1000 post ? :P

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Vectores de char en PIC16f886
« Respuesta #9 en: 25 de Mayo de 2011, 15:01:12 »
Hola Maunix, disculpa mi ignorancia, me podrías explicar como con punteros salvas la no linealidad de la RAM ? Desde ya muchas gracias !

Saludos !

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Vectores de char en PIC16f886
« Respuesta #10 en: 25 de Mayo de 2011, 15:12:11 »
También me gustaría aprenderlo  :)
No contesto mensajes privados, las consultas en el foro

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Vectores de char en PIC16f886
« Respuesta #11 en: 25 de Mayo de 2011, 15:45:00 »
Hola AngelGris, muy bueno el dato.

Saludos !

PD: Competis conmigo para ver quien llega primero a los 1000 post ? :P

 :D :D :D

  Nah, yo no puedo competir en nada...
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Vectores de char en PIC16f886
« Respuesta #12 en: 25 de Mayo de 2011, 15:46:11 »
Hola Maunix, disculpa mi ignorancia, me podrías explicar como con punteros salvas la no linealidad de la RAM ? Desde ya muchas gracias !

Saludos !

Los pic 16f1938 y todos los de arquitectura extendida de la familia 16F tienen doble registro FSR (Low y High) lo que les permite acceder a toda la ram con el formato "indirecto" de direccionamiento.    Eso te permite por un lado cargar en esos registros la posición absoluta (de 0 a 65535) de ram a la cual queres acceder y luego trabajas con el registro INDF para leer o grabar en dicha posición.

Esto lo podes hacer directamente trabajando con el assembly ya que el uso del direccionamiento indirecto (escribís en un lado la dirección y en otro se graba el dato).  Ahora bien para hacerlo en C depende del compilador.  En CCS no tengo ni idea ya que no lo uso, pero no se si estos registros y su modo de direccionamiento esten abiertos al usuario, probablemente si, probablemente no ahora pero si en el futuro, vaya uno a saber.

En C18 esto se hace trabajando con el linkerfile y usando punteros directamente (no accediendo con el nombre de vector[nn])

Si aún así no queda claro , tiro un ejemplo ;)

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Vectores de char en PIC16f886
« Respuesta #13 en: 25 de Mayo de 2011, 15:46:54 »
También me gustaría aprenderlo  :)

Ah no, por cantidad es otro precio  :D :D
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Vectores de char en PIC16f886
« Respuesta #14 en: 25 de Mayo de 2011, 15:53:38 »
dentro de los ejemplos de ccs hay uno que se llama EX_MXRAM.C, cuya finalidad es utilizar toda la ram para crear arreglos. no se si mikroC tenga ejemplo similares.

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek


 

anything