Autor Tema: Leer y escribir en memoria  (Leído 4988 veces)

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

Desconectado oscarec60

  • PIC10
  • *
  • Mensajes: 15
Leer y escribir en memoria
« en: 23 de Marzo de 2006, 15:03:00 »
Quien tenga un codigo o alguna referencia de como utilizar la memoria del pic ya que necesito almecenar en memoria un maximo de 32 caracteres leerlos y poderlo sobre escribir, ya tengo el codigo hecho donde los adquiero y los muestro por la lcd pero no se como usar la memoria en C.

Gracias de antemano
Saludos desde Caracas Venezuela...

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Leer y escribir en memoria
« Respuesta #1 en: 23 de Marzo de 2006, 15:07:00 »
Buenas!!!!en el post de Ejemplitos en C para el 16F648A, concretamente en el programa numero 51 se trata del manejo de la eeprom interna del pic, aparte en el post del amigo RedPic, Ejemplitos 16F876A: Indice de contenidos. tambien encontraras programas del tratamiento interno de la eeprom interna del pic.


Suerte!!!Giño
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado javisus

  • PIC10
  • *
  • Mensajes: 18
RE: Leer y escribir en memoria
« Respuesta #2 en: 23 de Marzo de 2006, 15:39:00 »
según se deduce de tu post los caracteres son constantes, je la cosa está fácil:
un ejemplo en MPLAB C18

static rom const char cadena[]="Parece sencillo no?";

//la función que recibe por supuesto es un punterito

void escribir_lcd (rom char * puntero);
{
  //...........(tu subrutina)
}
 

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: Leer y escribir en memoria
« Respuesta #3 en: 24 de Marzo de 2006, 10:01:00 »
Escrito originalmente por javisus
según se deduce de tu post los caracteres son constantes, je la cosa está fácil:
un ejemplo en MPLAB C18

static rom const char cadena[]="Parece sencillo no?";

//la función que recibe por supuesto es un punterito

void escribir_lcd (rom char * puntero);
{
  //...........(tu subrutina)
}
 


No entiendo bien esto.  No soy un experto en el C pero acaso si defines una constante como rom static no se ubica en la program memory?

Es decir, SIEMPRE queda ahi y no es que es una memoria RAM incializada con los valores precargados.

Entonces, para hacer un puntero al dato, hay que en realidad usar la funcion que copia la memoria de programa a la memoria de datos.  Una vez con la memoria de datos se empieza a trabajar con el puntero sobre la RAM.

Extraído literalmente de la hoja de datos.

Cita:

/*
* Copy string s2 in data memory to string s1 in data memory
*/


char *strcpy (auto char *s1, auto const char *s2);

/*
* Copy string s2 in program memory to string s1 in data
* memory
*/

char *strcpypgm2ram (auto char *s1, auto const rom char *s2);

/*
* Copy string s2 in data memory to string s1 in program
* memory
*/

rom char *strcpyram2pgm (auto rom char *s1, auto const char *s2);

/*
* Copy string s2 in program memory to string s1 in program
* memory
*/


rom char *strcpypgm2pgm (auto rom char *s1, auto const rom char *s2);





Ahora bien, leamos esto, extraido de MPLABC18 Compiler User Guide

Cita:
An important consequence of the separate address spaces for MPLAB C18 is that pointers to data in program memory and pointers to data in data memory are not compatible.



Esto significa que no es compatible un puntero a memoria de programa con uno a memoria de datos, entonces en la funcion esa donde se le pasa comp arametro el puntero hay que ser "muy" cuidadoso.


Ejemplito.

Cita:

When using MPLAB C18, a string table in program memory can be declared as:
rom const char table[][20] = { "string 1", "string 2","string 3", "string 4" };
rom const char *rom table2[] = { "string 1", "string 2","string 3", "string 4" };




- 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 javisus

  • PIC10
  • *
  • Mensajes: 18
RE: Leer y escribir en memoria
« Respuesta #4 en: 24 de Marzo de 2006, 12:36:00 »
Buenas tardes Oscarec60,
Primero decirte que la apreciación de Maunix es correcta.
Leí demasiado rápido e post y sobre todo la frase "y poderlo sobre escribir,".
Como creí que querías almacenar unas cuantas cadenas para luego mostrarlas por el lcd, te insté a crear una constante en rom. Como bién extrae nuestro amigo Maunix del " User"s guide"  también puedes crear un array de cadenas.:
"rom const char table[][20] = { "string 1", "string 2","string 3", "string 4" }; "
Por supuesto para gestionar esa cadena has de configurar un puntero en rom y apuntarla.
Claro Clarisssissimo, la memoria del PIC rom y ram fisicamente son distintas,
para acceder a la ram necesitas crear un puntero a datos.
Como también apunta nuestro compañero hay funciones de transferencia entre estas dos memorias.
En fin Oscarec60 quita ese rom const y ya está,
En fin llevo bastante tiempo programando , pero también bastante tiempo sin ir al
oculista.

poco a poco...pero que la cerveza no falte


Desconectado elesep

  • Colaborador
  • PIC10
  • *****
  • Mensajes: 42
RE: Leer y escribir en memoria
« Respuesta #5 en: 25 de Marzo de 2006, 00:31:00 »

 y porque no ocupas esta instruccion si es que ocupas el ccs

write_eeprom (address, value)

y asi puedes ir incrementando la variable address, dependiendo lacapacidad de memoria que posea el pic que ocupes. y para poder leer la direccion ocupas esta otra instruccion.

value = read_eeprom (address)

y con estas dos instrucciones estas listo para poder grabar y poder leer, y ademas mostrarlo por el LCD para que verifiques.

Saludos Elesep

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: Leer y escribir en memoria
« Respuesta #6 en: 25 de Marzo de 2006, 07:12:00 »
Escrito originalmente por elesep

 y porque no ocupas esta instruccion si es que ocupas el ccs

write_eeprom (address, value)

y asi puedes ir incrementando la variable address, dependiendo lacapacidad de memoria que posea el pic que ocupes. y para poder leer la direccion ocupas esta otra instruccion.

value = read_eeprom (address)

y con estas dos instrucciones estas listo para poder grabar y poder leer, y ademas mostrarlo por el LCD para que verifiques.

Saludos Elesep


Todas las opciones son válidas.  Creo que depende mucho de que quiera hacer nuestro amigo.  
En lo personal cuando son mensajes fijos que nunca se modificarán los guardo en la Program Memory.  

La EEPROM la reservo para datos que sean variables pero que me interese conservar entre una ejecución y otra.

Por supuesto esto es cuestion de "criterios" más que otra cosa, no se podría decir que una u otra opción son la "estrictamente correta" Giño  


- 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 oscarec60

  • PIC10
  • *
  • Mensajes: 15
RE: Leer y escribir en memoria
« Respuesta #7 en: 27 de Marzo de 2006, 10:32:00 »
Muchas Gracias por las sugerencias si de hecho yo estoy utilizando CCS. Cualquier cosa les vuelvo a pedir ayuda. Gracias de VerdadSonrisa Gigante
Saludos desde Caracas Venezuela...

Desconectado oscarec60

  • PIC10
  • *
  • Mensajes: 15
RE: Leer y escribir en memoria
« Respuesta #8 en: 27 de Marzo de 2006, 15:53:00 »
Estoy trabajando para hacer una prueba de lectura y escribura utilizando el pic 18f4620, pero por alguna razón no se que pasa y no me hace nada de lo que el codigo hace. Debo tener algún error pero no lo veo por favor ayudenme para solucionar esto. Gracias de antemano


#include <18F4620.h>
#device adc=8
#use delay(clock=20000000)
#fuses NOWDT,WDT128,HS, NOPROTECT, IESO, BROWNOUT, BORV21, NOPUT, NOCPD, NOSTVREN, NODEBUG, NOLVP, NOWRT, NOWRTD, NOEBTR, NOCPB, NOEBTRB, NOWRTC, NOWRTB, NOFCMEN, NOXINST, NOPBADEN, NOLPT1OSC, NOMCLR

#use standard_io(A)
int entrada;
int valor;
void main()
{

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);

   setup_spi(FALSE);

   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);

   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

while (1)
{
   entrada = input_a();
   write_eeprom(00,entrada);
   output_bit(PIN_B0,1);
   delay_ms(1000);
   valor = read_eeprom(00);
   output_bit(PIN_B0,0);
   output_c(valor);
   delay_ms(4000);
  }  









}
Saludos desde Caracas Venezuela...

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: Leer y escribir en memoria
« Respuesta #9 en: 27 de Marzo de 2006, 21:08:00 »
El #use standard_io(A) garantiza que se pongan como salida los pines del PUERTO B ?  Porque no veo ningun seteo del registro TRIS .

Además , porque no pruebas primero si el PIC funciona? con algun while simple que solo encienda un led.

- 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)


 

anything