Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Enigma en 02 de Septiembre de 2008, 16:12:35
Título: Ayuda con la eeprom interna del 18f4550
Publicado por: Enigma en 02 de Septiembre de 2008, 16:12:35
Hola muchachos que tal... Bueno he estado trabajando con la memoria interna del pic18f4550 y pues he visto unos ejemplitos del ccs que son faciles, pero al parecer no lo es tanto como parece, porque intento hacer un programa que me escriba datos del conversor analógico - digital en la memoria y luego dependiendo de un pulsador colocado en RA5 pues lo lee y lo manda al hyperterminal. La cuestión es que la memoria si se lee, pero al parecer no escribe, porque cuando la mando a leer, lo que hace es ,mndarme por FF, es decir, VACÍA :shock:... Y no entiendo porque... Si alguien me puede echar una manita se lo agradezco... Aquí dejo el código...
#include <18f4550.h> #fuses NOPROTECT,NOCPD,NOLVP,WDT64,XT,NOMCLR #use fast_io (A) #use fast_io (B) #use fast_io (C) #use fast_io (D) #use delay(clock=4000000) #byte PIR1=0xF9E #bit TXIF=PIR1.4 #include "lcd.c" // Libreria de la LCD por el puerto B #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) // Habilita las funciones RS232, velocidad a 9600 baudios #byte portd= 0xF83 #byte portb= 0xF81 #byte portc= 0xF82 //::::::::::::::::::::::::::Declaración de variables::::::::::::::::::::::::::::::::::::: float dato,value,valord; int x=0,cont=0,medida,indicador=0,puntero=0; //:::::::::::::::::::::::::::Programa Principal:::::::::::::::::::::::::::::::::::::::::::
void main (void) { set_tris_a(0xe7); // Puerto A, como b'11100111 set_tris_b(0x00); // Puerto B, como b'00000000 (salida) set_tris_d(0x00); // Puerto D, como b'11111111 (salida) output_a(0); // Limpio el puerto A output_c(0); // Limpio el puerto C output_b(0); // Limpio el puerto B setup_wdt(WDT_ON); // Watchdog Encedido setup_port_a(AN0_ANALOG ); // RA0 son analógicos y los demás son digitales lcd_init(); // Para inicializar el LCD restart_wdt(); // Inicio el perro Guardian
//********************************************************************************* //* //* PROGRAMA PRINCIPAL //* //********************************************************************************* while(true) { restart_wdt(); // Inicio el perro Guardian SLEEP(); // Modo sleep // Se desborda Watchdog y sale del modo Sleep if (restart_cause()==WDT_FROM_SLEEP) // Si el pic despierta por watchdog, entonces... { if(x==0) // Pregunto por bandera { setup_adc(ADC_CLOCK_INTERNAL ); // Tomará el dato contando el tiempo con el reloj interno set_adc_channel(0); // El canal de adquisición del dato es el RA0 delay_ms(10); // Un retardo para capturar bien el dato value=read_adc(); // Leo el dato valord=(value*0.4); // Multiplico el valor por 0.4 para hacer la equivalencia a 2V portd=valord; // Lo mando al puerto D setup_adc (ADC_OFF); // Apago el conversor A/D x=1; // Seteo la bandera } else if (x==1) // Si x es igual a 1 { mostrar: dato=(value*5)/255; // Convierto el valor a decimal y lo guardo printf(lcd_putc,"\f"); // Borro la pantalla LCD printf(lcd_putc,"Voltaje= %2.2g",dato); // Mando a mostrar el valor del conversor en la LCD //printf("\f"); // Limpio pantalla del hyperterminal //printf(" Voltaje= %2.2g V",dato); // Mando a mostrar el valor del conversor delay_ms(10); //WRITE_EEPROM(0,puntero); //indicador= READ_EEPROM(0); // Le mando a indicador el valor de puntero (puntero está en la dirección 00 de la memoria) //if(indicador>5) // Si el puntero (indicador) pasa de 24 posiciones de memoria, no sigo escribiendo (reescribo) //{ //puntero=1; // Si llega a 160 pues reseteo al puntero y reescribo la memoria //} puntero=puntero+8; // Incremento puntero //puntero++; WRITE_EEPROM(puntero,dato); // Escribo los datos en la memoria if(input(PIN_A5)==0) { printf(" \n\r "); printf(" Puntero= %d V",puntero); printf(" \n\r "); printf(" \n\r "); printf(" \n\r "); //printf("\f"); //medida=READ_EEPROM(0x01); printf(" Voltaje= %2u V",READ_EEPROM(puntero)); // Mando a mostrar el valor del conversor } //WRITE_EEPROM(0,puntero); // Escribo el nuevo valor de puntero x=0; // Reseteo la bandera } } } } //////////////////////////////////////////////////////////////////////////////////////////////////////
De antemano gracias...
Atte: Enigma... La llanerita de Guayana :-)
Título: Re: Ayuda con la eeprom interna del 18f4550
Publicado por: Enigma en 02 de Septiembre de 2008, 16:48:56
Bueno respondiendome a mi misma, pues he descubierto que en la memoria si se escriben datos... Pero solo datos especificos, me explico:
En esta parte del programa:
WRITE_EEPROM(puntero,dato); // Escribo los datos en la memoria if(input(PIN_A5)==0) { printf(" \n\r "); printf(" Puntero= %d V",puntero); printf(" \n\r "); printf(" \n\r "); printf(" \n\r "); //printf("\f"); //medida=READ_EEPROM(0x01); printf(" Voltaje= %2u V",READ_EEPROM(puntero)); // Mando a mostrar el valor del conversor }
Cuando en vez de dato, coloco simplemente un número como 0x01, 0x02, 0x03, etc... Pues si me lo escribe en todas las localidades de memoria, puesto que cuando la mando a leer eso es lo que me muestra en el hyperterminal. Ahora, si le coloco lo que está en la variable datos, pues no escribe nada, porque cuando la mando a leer siempre lee 255.... :shock:
Esto se dará por el tipo de dato o algo????? :?
Atte: Enigma... La llanerita de Guayana :-)
Título: Re: Ayuda con la eeprom interna del 18f4550
Publicado por: MLO__ en 02 de Septiembre de 2008, 17:07:50
Hola.
Pues no se si el que dato sea float influya en algo, ya que lo que intentas guardar es un int.
Saludos
EDITO: Es al reves!!! tu intentas guardar un float y la funcion es para guardar int.
Título: Re: Ayuda con la eeprom interna del 18f4550
Publicado por: RedPic en 02 de Septiembre de 2008, 17:26:43
CCS tiene una Librería en el directorio Drivers llamada internal_eeprom.c
Título: Re: Ayuda con la eeprom interna del 18f4550
Publicado por: Enigma en 03 de Septiembre de 2008, 09:39:28
Hola amigos gracias por sus respuestas!! pues si era lo que me temía, al parecer la memoria se tira tres, cuando intento escribir un float; esto porque probe conviertiendo el dato, en una variable entera y cuando lo guardo en memoria, pues wala! se escribe y todo! es posible que sea, porque según he leido por ahí un float mide más de 8 bits y bueno creo que ha de ser por eso! Gracias por sus respuestas! Voy a buscar la libreria que dijo RedPIc, luego comento como me fué... muchas gracias compañeros de camino! :mrgreen:
Atte: Enigma... La llanerita de Guayana :-)
Título: Re: Ayuda con la eeprom interna del 18f4550
Publicado por: firepic en 04 de Septiembre de 2008, 21:41:16
Hola Enigma! No olvides consultar el hilo que colocó richi... si usas versiones no tan recientes del CCS, verás que está igual al código que escribió el maestro Diego, que tiene el bug que Richi mencionó en el otro hilo... si tienes una versión reciente ese detalle ya está corregido. Saludos! :mrgreen:
Título: Re: Ayuda con la eeprom interna del 18f4550
Publicado por: Enigma en 05 de Septiembre de 2008, 11:40:14
Hola muchachos. bueno les comento que he logrado escribir en la eeprom los benditos números tipo float... con alguna modificación que le hice a la libreria que redpic y richi me han mostrado... Pero tengo una duda quizá algo tonta... Según lo que puedo entender, este ciclo :
solamente escribe en cuatro localidades de memoria??? o no es así como lo interpreto?? y disculpen la pregunta :oops:
Atte: Enigma... La llanerita de Guayana :-)
Título: Re: Ayuda con la eeprom interna del 18f4550
Publicado por: RICHI777 en 05 de Septiembre de 2008, 12:43:52
Hola llanera, si es asi, con esa implementación que pusiste solo escribis 4 bytes consecutivos ya que eso lo determina el indice del for ( i ), el problema radica que al no hacer un casteo explicito en la expresión [*(&data + i )] en la segunda pasada del for ese puntero ya no va a apuntar al segundo byte del float sino a cualquier otra cosa fuera del scope del float propiamente dicho.
Saludos !
Título: Re: Ayuda con la eeprom interna del 18f4550
Publicado por: Enigma en 05 de Septiembre de 2008, 14:33:35
Umm... o.k, pero se pudiera escribir en más localidades verdad? en 10 o más.. sin afectar la escritura del float en la memoria cierto????
o me equivoco?
Atte: Enigma... La llanerita de Guayana :-)
Título: Re: Ayuda con la eeprom interna del 18f4550
Publicado por: RICHI777 en 05 de Septiembre de 2008, 14:49:27
Disculpa pero no entiendo que quieres hacer, serias tan amable de ser más especifica. Gracias !
Título: Re: Ayuda con la eeprom interna del 18f4550
Publicado por: firepic en 05 de Septiembre de 2008, 14:55:36
Qué tal! Pues como dice Richi, está un poco confusa la pregunta... Ahora bien, si te refieres a escribir varios números float... pues sí se puede, por supuesto... antes de llamar a la función debes incrementar la dirección... recuerda que deberás incrementarla de 4 en 4 para guardar los float (pues cada variable float ocupa siempre 4 bytes). Ok saludos! Cualquier cosa pregúntale a Richi que es el experto. Mis respetos maestro Richi! :mrgreen:
Título: Re: Ayuda con la eeprom interna del 18f4550
Publicado por: Enigma en 05 de Septiembre de 2008, 15:22:32
Jeje, es que a veces no me doy a entender.... La cuestión era que si puedo escribir en casi toda la memoria!!! es decir en todas sus 256 localidades o menos sin que se afecte el dato tipo float, no se que se afecte por tener poco espacio en memoria o algo!!!
Atte: Enigma... La llanerita de Guayana :-)
Título: Re: Ayuda con la eeprom interna del 18f4550
Publicado por: firepic en 05 de Septiembre de 2008, 15:37:52
Don't worry, be happy! :D Por supuesto, puedes escribir en donde quieras... solo que debes dividir entre cuatro para saber la capacidad de datos float a guardar. Por ejemplo, si la memoria tiene 256 bytes, entonces puedes escribir 64 datos tipo float. Eso en teoría, suponiendo por supuesto que no estás guardando alguna otra cosa... Ok saludos, nos leemos! :mrgreen:
Título: Re: Ayuda con la eeprom interna del 18f4550
Publicado por: Enigma en 05 de Septiembre de 2008, 15:58:37
eeeeeesa es la mujer del hombre!!!!!!!! :D jejeje eso es lo que queria saber!!!! :mrgreen: gracias firepic!!!! y richi!!! jejeje :D
Son los mejores! 8)
Atte: Enigma... La llanerita de Guayana :-)
Título: Re: Ayuda con la eeprom interna del 18f4550
Publicado por: RICHI777 en 05 de Septiembre de 2008, 16:28:32
Hola, gracias por tus comentarios amigo fire :-)
Saludos !
Título: Re: Ayuda con la eeprom interna del 18f4550
Publicado por: firepic en 05 de Septiembre de 2008, 17:02:02
Siempre a la orden Enigma. :lol: Me alegra haberte ayudado aunque sea un poquito. :) Venga Richi! Todavía me acuerdo cuando me ayudaste con lo del GPS y me dijiste que no trabajabas con PIC, guao pero sabes mucho de programación! Me has dejado asombrado con tus últimos aportes, excelentes! :o Saludos a todos, nos leemos! :mrgreen: