TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: pikman en 01 de Octubre de 2006, 12:55:08
-
Hola, gracias por leer este mail, estoy desarrollando una aplicacion donde, necesito usar de los 16K de la flash del PIC18F452, 2K para guardar una tabla de datos, la idea de usar la flash es porque usar una memoria serie hace mas lento el sistema, pues como los datos son absolutamente asimetricos y son 200 y cada uno es una cadena de 10 bytes, entonces si logro esto como las posiciones son de 16 bits usaria ademas la mitad de la memoria, 1000 bytes.
Todo esto me parecio muy sencillo, pero en el momento de hacer algunas pruebas, cuando leo los dato que leo no son los que intento grabar.
direccion=0x0FA0;
w=0;
do
{
dato=string_c[w++];
write_program_eeprom (direccion,dato);
direccion++;
}while (w!=20);
Con este ejemplo intento grabar desde la posiscion 0x0FA0 20 caracteres de un string, alguien utilizo esto alguna vez, de esta manera, desde ya les agradezco alguna respuesta.
-
Hola, gracias por leer este mail, estoy desarrollando una aplicacion donde, necesito usar de los 16K de la flash del PIC18F452, 2K para guardar una tabla de datos, la idea de usar la flash es porque usar una memoria serie hace mas lento el sistema, pues como los datos son absolutamente asimetricos y son 200 y cada uno es una cadena de 10 bytes, entonces si logro esto como las posiciones son de 16 bits usaria ademas la mitad de la memoria, 1000 bytes.
Todo esto me parecio muy sencillo, pero en el momento de hacer algunas pruebas, cuando leo los dato que leo no son los que intento grabar.
direccion=0x0FA0;
w=0;
do
{
dato=string_c[w++];
write_program_eeprom (direccion,dato);
direccion++;
}while (w!=20);
Con este ejemplo intento grabar desde la posiscion 0x0FA0 20 caracteres de un string, alguien utilizo esto alguna vez, de esta manera, desde ya les agradezco alguna respuesta.
Qué es lo que hace esa función "write_program_eeprom" ? Acaso discrimina si un dato de acuerdo a su posición de memoria debe ir en la flash?
-
Hola MAUNIX,
No esta funcion lo que hace es grabar la flash del micro, como lo hacen los bootloaders, solo que pretendo usar la memoria del micro, para grabar datos que tengo que verificar, ademas de que me sobra flash es de 16 bits y la puedo leer mas rapido que una externa, son strigns de 10 bytes, me ha vuelto loco, creo que es un error del CCS no puede ser que no ande, voy a ver si lo puedo lograr asm
saludos
-
Hola MAUNIX,
No esta funcion lo que hace es grabar la flash del micro, como lo hacen los bootloaders, solo que pretendo usar la memoria del micro, para grabar datos que tengo que verificar, ademas de que me sobra flash es de 16 bits y la puedo leer mas rapido que una externa, son strigns de 10 bytes, me ha vuelto loco, creo que es un error del CCS no puede ser que no ande, voy a ver si lo puedo lograr asm
saludos
Entiendo, no uso el CCS así que no te puedo ayudar en este tema puntual del uso de esa función en específico.
De todas formas, tú no habias especificado que usabas CCS y tu pregunta parecía un tanto mas "genérica" sobre el "si se podía" y "cómo se podia hacer" más que del uso de una función en particular.
Grabar la memoria flash es bastante diferente en los 18F que en los 16F. Además en los 18F tu mismo debes hacer la operación de "borrado".
No se qué tipo de documentación trae el CCS y qué cosas expliquen del uso de una función como la que mencionas pero en un 18F el borrado previo a la escritura , es de páginas de 64 bytes. Si la función no tiene esto en cuenta (o si lo tiene te lo debiera aclarar) sería peligroso. Si quieres solo escribir por ejemplo 20 bytes, lo que se hace es leer los 64 bytes en un array, modificar los 20 valores que te interesan y volver a grabar los 64 bytes.
Para leer no hay limitaciones, puedes leer 1 solo byte si quieres.
Saludos
-
Bueno, aca esta la solucion, CCS incluye funciones para leer y escribir la flash del micro, esto es para permitir que se autoprograme, o que la aplicacion sea reflasheable como dicen, pues bien, en mi caso he usado la memoria para datos, pues mi aplicacion debe revisar cadenas de 10 bytes (350) y compararlas para determinar si esta en la base de datos para autorizar una operacion, el uso de una memoria 24 funciono pero es mucho mas lenta, con
la funcion incluida ademas de simplificar el soft la velocidad es mucho mayor, ademas de liberarme 3500 bytes de memoria externa para otros datos.
Aqui les pego la forma de usarlas, aclaro que las he probado solo en un PIC18F452, por lo que lei en el manual hay diferencias con los 16F87x y otros que permiten grabar la flash desde el programa.
Bueno, espero que les sirva, saludos.
// graba el string de 10 bytes en la memoria
write_program_memory(0x2100,string,10);
// graba la word de la posicion de memoria
write_program_eeprom(0x210A,0x0001);
// lee 10 bytes de la memoria
read_program_memory(0x2100,string,10);
// lee la word de la memoria
memoria=read_program_eeprom(0x210A);
-
saludos pickman
a mi me graba solo la primera vez, cuando intento actualizar los datos ya no graba nada
he intentado en assembler y me pasa los mismo, a que se debera?