Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

08/04/2015 #1


¿Cómo guardar datos en EEPROM interna del PIC18F4550 en PIC C Compiler?
Hola. Buen día. Quisiera guardar datos en la EEPROM interna del PIC18F45550 en PIC C.
Tengo entendido que se utiliza la directiva #ROM 0x2100 pero al utilizarla en el PIC no me va, en todo caso decidí verificar que en realidad al inicio del programa me estaba lanzando datos y los mandé directamente a un LCD, y como pensé no tenían más que el valor total de cada banco que es 256 bytes.

Aquí dejo el programa. Realicé un ejemplo del libro de PIC C Y Proteus donde hace una cerradura.

De ante mano he verificado en el foro para ver si había temas con el mismo problema y los respondieron pero tengo entendido que utilizaron PICs de gama media y en mi caso estoy utilizando uno de gama alta.
¿Puede ser que los bancos de memoria empiecen con otro número?

Para solucionar este problema en el código, escribí nuevamente la clave de la siguiente manera:
write_eeprom(0,'7');
write_eeprom(1,'2');
write_eeprom(2,'3');
Código PHP:
#include <18f4550.h>

#use delay(clock=4000000)
#use standard_io(a)
#use fast_io(b)
#use fast_io(d)

#rom 0x2100={'7','2','3'}

#fuses XT,NOWDT,NOMCLR,PUT

#include <My_lcd.c>
#include <stdlib.h>


char teclado(void
{  
      
output_b(0b11111110);
      if(
input (PIN_B4)==0)
         return(
'1');
      if(
input (PIN_B5)==0)
         return(
'2');
      if(
input (PIN_B6)==0)
         return(
'3');
      if(
input (PIN_B7)==0)
         return(
'A');
         
       
output_b(0b11111101);
      if(
input (PIN_B4)==0)
         return(
'4');
      if(
input (PIN_B5)==0)
         return(
'5');
      if(
input (PIN_B6)==0)
         return(
'6');     
      if(
input (PIN_B7)==0)
         return(
'B');
         
      
output_b(0b11111011);
      if(
input (PIN_B4)==0)
          return(
'7');
      if(
input (PIN_B5)==0)
          return(
'8');
      if(
input (PIN_B6)==0)
          return(
'9');
      if(
input (PIN_B7)==0)
          return(
'C');
          
      
output_b(0b11110111);
      if(
input (PIN_B4)==0)
          return(
'*');
      if(
input (PIN_B5)==0)
          return(
'0');
        if(
input (PIN_B6)==0)
        return(
'#');
      if(
input (PIN_B7)==0)
          return(
'D');
          
      return (
0);
}
void main()
{
   
char k;
   
int i;
   
char data[3], clave[3];
   
write_eeprom(0,'7');
   
write_eeprom(1,'2');
   
write_eeprom(2,'3');
   
set_tris_a(0b00000001);
   
set_tris_b(0b11110000);
   
lcd_init();
   
port_b_pullups(TRUE);
   while(
TRUE) {
   
i=0;
   
printf(lcd_putc,"\fPulsar tecla 1\n");
   
delay_ms(300);

   while(
i&lt;=2){
      
k=teclado();
         if (
k!=0)
            
            {
delay_ms(200);
            
data[i]=k;
             
i++;
             
printf(lcd_putc,"\fPulsar tecla %u\n",i+1);
             
             
            }
   }
   
delay_ms(300);
   for (
i=0;i&lt;=2;i++){
      
clave[i]=read_eeprom(i);}
   if((
data[0]==clave[0])&&(data[1]==clave[1])&&(data[2]==clave[2]))
      {
printf(lcd_putc,"\fPuerta Abierta");
       
output_high(PIN_A0);
       
delay_ms(500);
       
output_low(PIN_A0);}
  else 
printf(lcd_putc,"\fPuerta Cerrada");
   
delay_ms(1000);
   }

De ante mano, muchas gracias por su tiempo.
08/04/2015 #2
Moderador

Avatar de D@rkbytes

En el PIC18F4550 la dirección inicial para la EEPROM interna es: 0xF00000
18F4550TEMP.ASM dijo:
;************************************************* *****************************
;EEPROM data
; Data to be programmed into the Data EEPROM is defined here

ORG 0xf00000

DE "Test Data",0,1,2,3,4,5

;************************************************* *****************************
Y lógicamente sí cambian los rangos de memoria.
Entonces al usar la directiva #ROM para escribir datos iniciales en la EEPROM interna, sería de esta forma:
#rom 0xF00000 = {0,1,2,3,4,5,6,7,8,9}

18F4550 EEPROM Data.jpg

PD:
La palabra de configuración que estás usando para que el CPU trabaje a 4MHz, no es correcta.
Usa esta:
Código:
#fuses   NOMCLR,NOFCMEN,NOVREGEN,NOPBADEN
#use     delay(crystal = 4MHz)
09/04/2015 #3


Muchas gracias por tu ayuda
Y bueno sobre lo que colocas relacionado al cristal la verdad es que me viene muy bien ya que e realizado programas donde utilizo el crystal y las acciones no me las realizaba al tiempo que yo especificaba.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.