TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: RedPic en 11 de Diciembre de 2007, 03:40:50
-
¿Podría alguien ser tan amable de indicarme en qué página del Datasheet del 18F4550 aparece la dirección de memoria donde empieza la EEPROM interna? :shock:
Gracia que espera le sea concedida para que surta los efectos oportunos, y sin mas por el momento se despide de usted su seguro servidor, beso a vuecencia la mano y quedo a sus pies.
-
Hola Diego :-/ :-/
aparte de encontrar todos tus virus en internet :D :D
de picmania :D :D me encontre esto http://eegeek.net/content/view/27/32/1/1/ :D :D
espero te sirva
-
Hola Diego :-/ :-/
aparte de encontrar todos tus virus en internet :D :D
de picmania :D :D me encontre esto http://eegeek.net/content/view/27/32/1/1/ :D :D
espero te sirva
y si no podia encotrarlo aqui esto
http://ww1.microchip.com/downloads/en/DeviceDoc/39632D.pdf
-
... http://eegeek.net/content/view/27/32/1/1/ :D :D
espero te sirva
¿Tiene algo que ver con la EEPROM?
-
y si no podia encotrarlo aqui esto
http://ww1.microchip.com/downloads/en/DeviceDoc/39632D.pdf
El Datasheet hace años que lo tengo, mi pregunta es si habéis encontrado la dirección donde se encuentra la EEPROM.
-
Que yo recuerde, en ninguna.
La EEPROM la puedes direccionar con
ORG 0xf00000
Entonces esa dirección para llegar a conocerla debo ... ¿esperar la inspiración divina? ¿probar a ver si acierto? No entiendo esto de Microchip :shock:
Lo que quería es cargar la EEPROM desde el programa (en CCS C) con #ROM address ... y no pude encontrar el Address ...
-
#rom int8 0xf00000={1,2,3,0,0,0,0,0,0,0}
Bien, ya os habéis adelantado con la solución.
En cualquier caso, amigo Diego, te digo un método que alguna vez he usado para averiguarlo y que suele ser más rápido que leer la data, sobre todo porque el maestro Sisco ya la leyó antes que yo. Abro winpic800, selecciono el micro en cuestión, escribo en la zona de datos, guardo el hex y lo miro con el Ultraedit para saber dónde apunta :D
-
Que yo recuerde, en ninguna.
La EEPROM la puedes direccionar con
ORG 0xf00000
Entonces esa dirección para llegar a conocerla debo ... ¿esperar la inspiración divina? ¿probar a ver si acierto? No entiendo esto de Microchip :shock:
Lo que quería es cargar la EEPROM desde el programa (en CCS C) con #ROM address ... y no pude encontrar el Address ...
Es así, es un impuesto desde los primeros 18F. La idea es otorgarle un address para que todos los tools y herramientas sepan de qué se trata cuando se habla de una memoria que hace referencia a la eeprom interna
Es digamos una convención pero impuesta por microchip. Es así en todos los 18F.
Recién entro al post pero si tienes dudas para este y otros micros puedes fijarte en su linker file y ver la dirección a la que apunta la eeprom. :) :)
Ej, para el 18f4550
// File: 18f4550.lkr
// Sample linker script for the PIC18F4550 processor
LIBPATH .
FILES c018i.o
FILES clib.lib
FILES p18f4550.lib
CODEPAGE NAME=vectors START=0x0 END=0x29 PROTECTED
CODEPAGE NAME=page START=0x2A END=0x7FFF
CODEPAGE NAME=idlocs START=0x200000 END=0x200007 PROTECTED
CODEPAGE NAME=config START=0x300000 END=0x30000D PROTECTED
CODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF PROTECTED
CODEPAGE NAME=eedata START=0xF00000 END=0xF000FF PROTECTED
ACCESSBANK NAME=accessram START=0x0 END=0x5F
DATABANK NAME=gpr0 START=0x60 END=0xFF
DATABANK NAME=gpr1 START=0x100 END=0x1FF
DATABANK NAME=gpr2 START=0x200 END=0x2FF
DATABANK NAME=gpr3 START=0x300 END=0x3FF
DATABANK NAME=usb4 START=0x400 END=0x4FF PROTECTED
DATABANK NAME=usb5 START=0x500 END=0x5FF PROTECTED
DATABANK NAME=usb6 START=0x600 END=0x6FF PROTECTED
DATABANK NAME=usb7 START=0x700 END=0x7FF PROTECTED
ACCESSBANK NAME=accesssfr START=0xF60 END=0xFFF PROTECTED
SECTION NAME=CONFIG ROM=config
STACK SIZE=0x100 RAM=gpr3
-
Pues yo tengo el mismo problema que RedPIC pero con un 18f2455: no soy capaz de encontrar la dirección en la que comienza la data eeprom.
Aplicando el método sugerido por Nocturno he escrito 8 AA al principio de la memeria de datos y he abierto el archivo HEX generado por WinPIC800 con un editor. Aparece lo siguiente, pero no sé interpretarlo.
:020000040020DA
:020000040030CA
:0E0000003FCF3F1F0087E5000FC00FE00F400D
:0200000400F00A
:10000000AA00AA00AA00AA00AA00AA00AA00AA00A0
:00000001FF
Luego he intentado el método propuesto por Maunix, pero no encuentro el archivo 18f2455.lkr por ningún sitio.
¿Alguien puede echarme una mano? gracias
-
En este post del amigo Jesús viene muy bien explicado el formato HEX:
http://www.todopic.com.ar/foros/index.php?topic=17595.msg118837#msg118837
Si no me equivoco, interprentando esta línea en ese chorizo de bytes que te ha salido, la dirección de tu eeprom es también la 00F0 0000:
:0200000400F00A
-
Gracias Nocturno, he comprobado que efectivamente es la 00f0 0000.
Leyendo el post de jfh entiendo de dónde sale el 00f0, pero no el 0000
-
Pues porque el comando 04 (Extended linear address record) determina la parte alta de la dirección.
La dirección es un dato de 32 bits, y en esa línea sólo se indican los 16 más significativos.
-
Sí eso sí lo entendí, ¿pero en la línea siguiente no deberían ir los otros 16 bits (los menos significativos), es decir el 0000? ¿o es que se asume que los 16 bits menos significativos son todos 0?
-
Exacto, si no los pones se asumen como 0000.
-
hola muchachos, tengo un problemilla con un programita, tengo un programa que al inicio hago
#ROM 0XF00000={'1','2','3','4'}es una clave pero luego cuando quiero rectificarla no me coincide. se supone que desde esa direccion es la direccion cero..no?
-
Hola Jhozate, ¿acaso te sale 0x31, 0x32, ... ? ;-)
-
no, es decir cuando por teclado pido la clave no me reconoce
aqui en codigo
#USE DELAY(CLOCK=48000000)
#USE STANDARD_IO(A)
#USE STANDARD_IO(B)
#USE STANDARD_IO(C)
#USE STANDARD_IO(D)
#INCLUDE "FLEX_LCD420.C"
#INCLUDE <KBD.C>
//#INCLUDE <STDLIB.H>
//#ZERO_RAM
#ROM 0XF00000={'1','2','3','4'}
INT SECUENCIA=0;
INT ERRORES=0;
INT1 FLAG_CLAVE_OK=0;
VOID MAIN()
{
setup_adc_ports(NO_ANALOGS); //NO ENTRADAS ANALOGAS
setup_adc(ADC_OFF);
SETUP_SPI(FALSE);
SETUP_PSP(PSP_DISABLED);
SETUP_COMPARATOR(NC_NC_NC_NC);
SETUP_VREF(FALSE);
port_b_pullups(TRUE);
CHAR K;
INT I;
CHAR DATA[4], CLAVE[4];
LCD_INIT();
KBD_INIT();
LCD_GOTOXY(3,1);
LCD_PUTC("***BIENVENIDO***");
LCD_GOTOXY(8,2);
LCD_PUTC("PARA");
LCD_GOTOXY(3,3);
LCD_PUTC("INGRESAR PASSWORD");
LCD_GOTOXY(3,4);
LCD_PUTC("MARQUE LA TECLA #");
DO
{
K=KBD_GETC();
}WHILE(K!='#');
WHILE(TRUE)
{
K=KBD_GETC();
SWITCH(SECUENCIA)
{
CASE 0:
I=0;
PRINTF(LCD_PUTC,"\fPULSAR TECLA 1\n");
WHILE(I<=3)
{
K=KBD_GETC();
IF(K!=0)
{
DATA[I]=K;
I++;
LCD_GOTOXY(1,1);
PRINTF(LCD_PUTC,"PULSAR TECLA %u\n",I+1);
LCD_GOTOXY(I,2);
LCD_PUTC("*");
}
}
FOR(I=0;I<=3;I++)
{
CLAVE[I]= READ_EEPROM(I);
}
IF ((DATA[0]==CLAVE[0])&&(DATA[1]==CLAVE[1])&&(DATA[2]==CLAVE[2] && DATA[3]==CLAVE[3]))
{
PRINTF(LCD_PUTC,"\fPUERTA ABIERTA");
LCD_GOTOXY(1,2);
LCD_PUTC("BIENVENIDO");
LCD_GOTOXY(1,3);
LCD_PUTC("A");
LCD_GOTOXY(1,4);
LCD_PUTC("CASA");
OUTPUT_HIGH(PIN_A0);
DELAY_MS(1000);
LCD_PUTC("\f");
SECUENCIA=1; //SIGUIENTE PASO
}
ELSE
{
ERRORES++;
IF(ERRORES==3){
OUTPUT_HIGH(PIN_D0);}
LCD_GOTOXY(1,1);
PRINTF(LCD_PUTC,"\fCLAVE ERRONEA");
LCD_GOTOXY(1,2);
LCD_PUTC("PUERTA CERRADA");
LCD_GOTOXY(1,3);
LCD_PUTC("NUMERO DE FALLOS:");
LCD_GOTOXY(1,4);
PRINTF(LCD_PUTC,"%u",ERRORES);
DELAY_MS(1500);
SECUENCIA=0; // VOLVER AL INICIO
}
BREAK;
CASE 1: LCD_GOTOXY(1,1);
LCD_PUTC("QUE DESEA HACER");
LCD_GOTOXY(1,2);
LCD_PUTC("1-PRENDER LUZ");
LCD_GOTOXY(1,3);
LCD_PUTC("2-APAGAR LUZ");
IF(K=='1')
{
OUTPUT_HIGH(PIN_C0);
}
IF(K=='2')
{
OUTPUT_LOW(PIN_C0);
}
BREAK;
}//FIN DEL SWITCH
}//FIN DEL CICLO INFINITO WHILE
}//FIN DEL MAIN PRINCIPAL
-
Ohh pensaba que no manejarías ASCII
Checa esta línea, te faltan paréntesis...
IF ((DATA[0]==CLAVE[0])&&(DATA[1]==CLAVE[1])&&(DATA[2]==CLAVE[2] && DATA[3]==CLAVE[3]))
-
:( sigue igual
-
Eso te pasa porque el CCS es una histérica con el tamaño por defecto de los datos a grabar en la EEPROM.
Proba poniendo:
#ROM int8 0XF00000={'1','2','3','4'}
Y que CCS se apiade de nuestras canas...
-
gracias santiago y bruno :-/ juraria q habia probado eso, pero ya funciona bien, ahora me surge una duda. Durante programa puedo cambiar esos datos, pero entonces cada vez que resetee el pic vuelve el 1 2 3 4?
-
No no. Esos serían los contenidos iniciales de la EEPROM. Si los cambiás no vuelven más a 1,2,3,4 hasta que regrabes el PIC o el programa internamente decida volverlos a 1,2,3,4(alguna rutina de reseteo general de la aplicacion que decidas sobreescriba la EEPROM con esos valores iniciales).
-
:mrgreen: gracias!