TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: allennet en 21 de Junio de 2021, 05:42:00
-
Hola a todos, tengo un problema en ccs 5 en lectura de tablas en rom hice la depuracion en proteus y no envia nada
BYTE CONST DETE0 [10]= {1,2,3,4,5,6,7,8,9};
BYTE CONST DETE1 [10]= {1,2,3,4,5,6,7,8,9};
BYTE CONST DETE2 [10]= {1,2,3,4,5,6,7,8,9};
BYTE CONST DETE3 [10]= {1,2,3,4,5,6,7,8,9};
short F_EnviaP(byte *tabl[])
{
for(i=0; i<10; i++)
{
printf(*tabl[i]); //aqui no envia nada lo probe en proteus, me base xc8 q si funciona :?
}
if(kbhit()==0) return 1;
else return 0
}
void F_De_Bu()
{
if(F_EnviaP(DETEC0))
{
output_high(led);
}
else output_low(led);
}
la otra solucion seria usar switch en la funcion F_EnviaP y agregar una variable de entrada para q elija q tabla de la rom se envia, pero se hace mas largo el codigo :?
-
F_EnviaP(DETEC0)
cuando es
F_EnviaP(DETE0)
---------------------
Por que el kbhit??
if(kbhit()==0)
Parece que no tiene nada que ver con lo que tenes..
------------------
BYTE ????????????
En el manual no especifica ningún tipo Byte... Existe una directiva Byte, sino es cualquiera de C estandar mas las aberraciones de CCS
short __ int1
char ___ unsigned int8
int ___ int8
long ___ int16
long long ____ int32
float ___ float32
-----------------
Por ultimo, no entiendo porque dos funciones.
-
Gracias x responder, Si me equivoque, aqui esta igual no funciona pero compila sin errores
#define led PIN_B0
BYTE CONST DETE0 [10]= {1,2,3,4,5,6,7,8,9}; // en la ayuda de ccs, constant data table, pone byte
BYTE CONST DETE1 [10]= {1,2,3,4,5,6,7,8,9};
BYTE CONST DETE2 [10]= {1,2,3,4,5,6,7,8,9};
BYTE CONST DETE3 [10]= {1,2,3,4,5,6,7,8,9};
short F_EnviaP(byte *tabl[])
{
for(i=0; i<10; i++)
{
printf(*tabl[i]); //aqui no envia nada lo probe en proteus, me base de un ejemplo de xc8 q si funciona :?
}
while(!kbhit()){}
if(getc()==0)
return 1;
else return 0
}
void F_De_Bu()
{
if(F_EnviaP(&DETE0))
{
output_high(led);
}
else output_low(led);
}
-
CCS no te permite punteros a una tabla en rom.
- Tienes que ingresar para ver archivos adjuntos -
Por otro lado, usas printf para sacar 1 caracter en lugar de un string y mezclas de entre & y * .
Si lo que querés es sacar texto debería ser mas o menos asi:
#define led PIN_B0
#define MAX_CHARS 6
BYTE CONST dETE[][MAX_CHARS] = {"test0",
"test1",
"test2",
"test3"} ;
short F_EnviaP(byte inx)
{
printf(DETE[inx]);
while(!kbhit()) ;
if(getc()==0)
return 1;
else
return 0 ;
}
void F_De_Bu(void)
{
if(F_EnviaP(0)) // indice del texto.
output_high(led);
else
output_low(led);
}
------------------------------------------------------------------------
Aunque ahora que lo miro de nuevo, este ejemplo no sirve porque guarda el texto en ram :(
Corregido, me faltó especificar el número máximo de caracteres + 1
-
Si vos tenés un arreglo del tipo:
unsigned int8 DETE0 [10]= {1,2,3,4,5,6,7,8,9};
Se me ocurre que podrías imprimirlo como.
// En el encabezado...
// Declaración para trabajar con punteros a constantes.
#device PASS_STRINGS=IN_RAM
fprintf(RS232,"Arreglo:%s",DETE0);
// Sino....
for(int8 i=0; i<10; i++) {
fprintf(RS232,"Arreglo:%u",DETE0[i]);
}
Para acceder a un dato pre-almacenado en la EEPROM.
#ROM int8 getenv("EEPROM_ADDRESS") = {'1','2','3','4','5','6','7','8','9'} // El dato almacenado empieza en la dir 0 de la EEPROM.
// Necesitás copiar a RAM cada vez que lees.
char CMD[20]="";
// Cuando copias al buffer, necesitás indicarle desde donde empieza el dato y que largo tiene. Es medio engorroso, quizás pueda
// mejorarse.
void EEPROMcpyRAM(int8 start_cmd, int8 cmd_length){
memset(CMD,'\0', sizeof(CMD));
for(int8 i=0;i<cmd_length;i++) {
CMD[i]=read_eeprom(i+start_cmd);
}
}
// Para poder usarlo.
EPROMcpyRAM(0,9); // Empieza en la posición 0 y tiene 9 elementos.
fprintf(RS232,"Arreglo EEPROM:%s",CMD);
-
Gracias x las soluciones, pero esas usan ram, al final use switch en la funcion y quedo asi.
#define led PIN_B0
BYTE CONST DETE0 [10]= {1,2,3,4,5,6,7,8,9}; // en la ayuda de ccs, constant data table, pone byte
BYTE CONST DETE1 [10]= {1,2,3,4,5,6,7,8,9};
BYTE CONST DETE2 [10]= {1,2,3,4,5,6,7,8,9};
BYTE CONST DETE3 [10]= {1,2,3,4,5,6,7,8,9};
short F_EnviaP(unsigned int tabl)
{
switch(tabl)
{
case 0:
for(i=0; i<10; i++)
putc(DETE0[i]);
break;
case 1:
for(i=0; i<10; i++)
putc(DETE1[i]);
break;
case 2:
for(i=0; i<10; i++)
putc(DETE2[i]);
break;
case 3:
for(i=0; i<10; i++)
putc(DETE3[i]);
break;
}
while(!kbhit()){}
if(getc()==0)
return 1;
else return 0
}
void F_De_Bu()
{
if(F_EnviaP(0))
{
output_high(led);
}
else output_low(led);
}