problema con el const en ccs

disculpen señores tengo un problema con el publik que estoy haciendo el primero es cuando el vector letra le pongo q lo guarde en la rom que es la directiva const ya no me funciana cuando quemo el pic pero cuando guardo el valor en la ram q es int letra si funciona me gustaria q hay q hacer para guardarlo en la rom y q funciones de antemno gracias al q me pueda colaborar este es el codigo
Código:
#include <16F628a.h>
#use delay(clock=16000000)
#fuses NOWDT,HS,PUT,NOPROTECT,NOBROWNOUT,NOMCLR,NOLVP,NOCPD
#byte porta = 5
#byte portb = 6

int rotar,seg,nn1,nn,cont;    // y para que tenga memoria de donde lleva la rotacion
int public,recorrido,trama,ancho; // nceros es 31  ntrama 1  nceros=8

int letra [50]={ // para el ejemplo era letra [4]
0b10011100,// 01 
0b00100000,
0b10100000,// 01 
0b00011000,
0b10000100,
0b01000100,
0b10000100,           
0b10111000,               //

0b00111000,                //8
0b01000100,
0b01000100,
0b01111100,
0b01000100,
0b01000100,
0b01000100,
0b01000100,
                          
0b01000100,                //16
0b01000100,
0b01000100,
0b01000100,
0b01000100,
0b01000100,
0b01000100,
0b01111100,    
                          
0b01000000,                 //24
0b01000000,
0b01000000,
0b01000000,
0b01000000,
0b01000000,
0b01000000,
0b01111000,

0b11000000,                //32
0b11000000,
0b00000000,
0b11000000,
0b11000000,
0b11000000,
0b11000000,
0b11000000,

0b00000000,                 //40
0b10001000,
0b11001000,
0b10101000,
0b10011000,
0b10001000,
0b10001000,
0b10001000

};                


void main() {
set_tris_a(0x00);
set_tris_b(0x00);
portb=0x00;


cont=0;
trama=0;
public=letra[nn];

while(true){
output_high(pin_a2);    //               * ---->resetea el  74ls164 poniendo todo en cero 
delay_us(2);            //               *                                    
output_low(pin_a2);     // 

public=letra[nn]; 
while(ancho<50){         // es 8 ancho
while(seg<20){            //seg=6
while(trama<8){          // ************ 
                         //            *
                         //            *
                         //            *
recorrido=0x80&public;   //            *         
if(recorrido==0x80){     //            *
output_high(pin_a0);
                         //            *
}                        //            *
else{                    //            *
output_low(pin_a0);      //            *
}
                        //*************    *
output_high(pin_a1);    //  reloj      *   *   
delay_us(2);            //             *   *
output_low(pin_a1);     //**************   *

if (trama<=0){
rotar=0x01;             //  desplazamiento para prender cada transistor
}
                        //               *

if(cont==ancho){        //               * el cont :me sirve para decir cuantos bit saco
if(cont>=8){            //               *
nn=nn1;                 //               *
}                       //               *
nn++;                   //               * de la fila por ej si en la primer pasada saco un bit 
trama++;                //               * en la segunda pasada saco 2 bit de la fila y haci....
portb=rotar;            //               *
delay_ms(1);          //               *
output_high(pin_a2);    //               * ---->resetea el  74ls164 poniendo todo en cero 
delay_us(2);          //               *                                    
output_low(pin_a2);     //               *
portb=0x00;             //               * 
cont=0;                 //               *
rotar=rotar<<1;         //               *
public=letra[nn];       //               *
}
else{
cont++;
public=public<<1;

switch(cont){

case 8:
nn1=nn;
nn=nn+8;
public=letra[nn];
break;  

case 16:
nn=nn+8;
public=letra[nn];
break;

case 24:
nn=nn+8;
public=letra[nn];
break;

case 32:
nn=nn+8;
public=letra[nn];
break;

case 40:
nn=nn+8;
public=letra[nn];
break;                   //                     *

}
}                 //                       *
}                // ************************  
cont=0;
nn=0;
trama=0;
seg++;
public=letra[0];
}
seg=0;
ancho++;
}  
ancho=0;
}  
}
 
Última edición por un moderador:
no estoy muy seguro de haber entendido la consulta, pero para escribir en memoria ROM tienes 2 opciones, escribir en la Eprom del PIC, o en la memoria de código.
Para escribir en la Eprom es el comando write_program_eeprom (address, data)
y para escribir en memoria de programa es write_program_memory( address, data, count )
address es la direccion de la memoria en la que se va a escribir, es un numero de 16bits, data es el dato que se quiere escribir, y count es la cantidad de veces que se quiere escribir data.
Para escribir en la memoria de programa hay que tener en cuenta que esa memoria se maneja por words y no por bytes, por lo que el LSB de la dirección tiene que ser siempre 0
 
no estoy muy seguro de haber entendido la consulta, pero para escribir en memoria ROM tienes 2 opciones, escribir en la Eprom del PIC, o en la memoria de código.
Para escribir en la Eprom es el comando write_program_eeprom (address, data)
y para escribir en memoria de programa es write_program_memory( address, data, count )
address es la direccion de la memoria en la que se va a escribir, es un numero de 16bits, data es el dato que se quiere escribir, y count es la cantidad de veces que se quiere escribir data.
Para escribir en la memoria de programa hay que tener en cuenta que esa memoria se maneja por words y no por bytes, por lo que el LSB de la dirección tiene que ser siempre 0

explicacion

gracias por tu aporte jorge pero mira la cuestion es asi yo los datos los puedo guardar en la ram o en rom del pic que es la memoria flash lo que me pasa es que tengo ese vector llamado letra el cual cuando lo guardo en la ram me funciona y correo el programa pero cuando lo guardo en la rom que es con la directiva const ya no me corre le programa o ya no me funciona
 
la declaración de "letra" y "public" deberían ser int8 en vez de int, porque los valores son de 8 bits y la declaración int es solo para 1 bit... ojalá eso ayude...
 
la declaración de "letra" y "public" deberían ser int8 en vez de int, porque los valores son de 8 bits y la declaración int es solo para 1 bit... ojalá eso ayude...

jorge la cuestion ahi no creo q sea del int por que haci como lo tengo el programa corre pero cuando lo pongo a q el vector se guarde en la rom es cuando ya no funciona entonces la cuestion es q tengo q modificar o agregar al programa para poderlo guardar en la rom el vector y q funciones o dame un ejemplo como lo harias tu para guardar ese vector en la rom
 
Última edición:
intenta agragando esto:
#DEVICE CONST=ROM

parece que hay dos formas de utilizar CONST y hay que definir cual de las dos se quiere usar:

CONST=ROM Uses the CCS compiler traditional keyword CONST definition, making CONST variables located in program memory.

CONST=READ_ONLY Uses the ANSI keyword CONST definition, making CONST variables read only, rather than located in program memory.
 
intenta agragando esto:
#DEVICE CONST=ROM

parece que hay dos formas de utilizar CONST y hay que definir cual de las dos se quiere usar:

CONST=ROM Uses the CCS compiler traditional keyword CONST definition, making CONST variables located in program memory.

CONST=READ_ONLY Uses the ANSI keyword CONST definition, making CONST variables read only, rather than located in program memory.

pregunta
jorge entonces segun lo q me dices como aplico a mi programa declaro el device bueno y lo otro que me dices como lo aplico? o cual de los 2 aplico y como?
 
nada mas declara después de lo fuses
#DEVICE CONST=ROM

le agregue al programa lo q me dijiste pero como q no lee el dato o no almacenando por q cuando lo corro en proteus no muestra nada y cuando lo quemo y lo pruebo tampoco
aqui tengo el circuito en proteus si lo quiere simular y me diga q mas le puedo hacer para q almacene y lea el dato de la rom

Ver el archivo adjunto publi1.rar
Código:
#include <16F628a.h>
#device CONST=ROM 
#use delay(clock=16000000)
#fuses NOWDT,HS,PUT,NOPROTECT,NOBROWNOUT,NOMCLR,NOLVP,NOCPD
#byte porta = 5
#byte portb = 6



int rotar,seg,nn1,nn,cont;    // y para que tenga memoria de donde lleva la rotacion
int public,recorrido,trama,ancho; // nceros es 31  ntrama 1  nceros=8

const int letra [80]={ // para el ejemplo era letra [4]
0b10011100,// 01 
0b00100000,
0b10100000,// 01 
0b00011000,
0b10000100,
0b01000100,
0b10000100,           
0b10111000,               //

0b00111000,                //8
0b01000100,
0b01000100,
0b01111100,
0b01000100,
0b01000100,
0b01000100,
0b01000100,
                          
0b01000100,                //16
0b01000100,
0b01000100,
0b01000100,
0b01000100,
0b01000100,
0b01000100,
0b01111100,    
                          
0b01000000,                 //24
0b01000000,
0b01000000,
0b01000000,
0b01000000,
0b01000000,
0b01000000,
0b01111000,

0b11000000,                //32
0b11000000,
0b00000000,
0b11000000,
0b11000000,
0b11000000,
0b11000000,
0b11000000,

0b00000000,                 //40 hasta aqui
0b10001000,
0b11001000,
0b10101000,
0b10011000,
0b10001000,
0b10001000,
0b10001000,


 
};
 
Última edición por un moderador:
pues corrí el programa tu codigo y en la pantalla de LEDs me escribió "lSAULIN" ese es el resultado que esperabas??
si me sale un poco lento, pero en tiempo real creo que si se vería bien...
 
pues corrí el programa tu codigo y en la pantalla de LEDs me escribió "lSAULIN" ese es el resultado que esperabas??
si me sale un poco lento, pero en tiempo real creo que si se vería bien...

creo jorge q si lo corriste fue con el primer programa q ti di y no el ultimo por q si te fijas bn el corre bn con le primer progrma pero en la ram y con el segundo grabado en la rom como tu me dijiste que compilado da un espacio almacenado de 22% en al rom no da
 
Atrás
Arriba