Gracias a la idea de JEAN, y tras el pedido de varias personas que dicen que no entienden el post en ingles… intentaré poner todos los datos para que se puedan seguir y llegar a buen puerto de una forma amena y simple.
lo primero que debemos tener en cuenta es que yo trabajo principalmente con el pic 18f4550… pero tiene que funcionar con el 18f2550.
Teniendo en cuenta que el circuito utilizado y la identificación de PINES es la siguiente.
Equipo grabador, un Pinguino estandart.
el segundo es el circuito del pinguino a grabar, obviamente puede ser un zocalo de, quita y pon, así podremos programar muchos pics.
Los números de pines concuerdan con la imagen superior, dirán ¿porque este orden? y tiene una respuesta muy simple, ya que todo el proyecto viene de mucho mas atrás, y para una consistencia en la identificación de puertas, el PIN1 es por defecto el RB0 sin importar el pin físico donde se encuentre.
El programa que utilizaremos es el siguiente, compilado en la version de IDE 9.05, no muestra indicios de errores y funciona muy bien, digo esto porque si lo compilamos en otra versión de IDE pueden aparecernos problemas.
[sourcecode language=»py»]
// This is a tool to program the pinguino bootloader in a new chip
// with your Pinguino, the self replicating machine !!
// Jean-Pierre MANDON 2010
// Fixed bug 02/07/2011 PGM pin is no longer used
#define PGC 1 // connected to the PGC pin of the blank chip
#define PGD 2 // connected to the PGD pin of the blank chip
#define VPP 3 // connected to the VPP pin of the blank chip
#define VCC 6 // connected to the power on transistor
#define redled 5
uchar bulkerase[48] ={0x00,0x3C,0x0E,0x00,0xF8,0x6E,0x00,0x00,0x0E,0x00,0xF7,0x6E,0x00,0x05,0x0E,0x00,
0xF6,0x6E,0x0C,0x3F,0x3F,0x00,0x3C,0x0E,0x00,0xF8,0x6E,0x00,0x00,0x0E,0x00,0xF7,
0x6E,0x00,0x04,0x0E,0x00,0xF6,0x6E,0x0C,0x8F,0x8F,0x00,0x00,0x00,0x00,0x00,0x00};
uchar startwrite[24]={0x00,0xA6,0x8E,0x00,0xA6,0x9C,0x00,0x00,0x0E,0x00,0xF8,0x6E,0x00,0x00,0x0E,0x00,
0xF7,0x6E,0x00,0x00,0x0E,0x00,0xF6,0x6E};
uchar startwrid[24] ={0x00,0xA6,0x8E,0x00,0xA6,0x8C,0x00,0x30,0x0E,0x00,0xF8,0x6E,0x00,0x00,0x0E,0x00,
0xF7,0x6E,0x00,0x00,0x0E,0x00,0xF6,0x6E};
uchar checkmem[32];
uint address=0;
#define pic_on() digitalWrite(VCC,LOW)
#define pic_off() digitalWrite(VCC,HIGH)
// begin programming mode
// power is on ( VCC and Programing voltage )
void start_pgm()
{
digitalWrite(VPP,HIGH);
delayMicroseconds(4);
}
// end programming mode
// power is on ( VCC and Programing voltage )
void stop_pgm()
{
digitalWrite(PGD,LOW);
digitalWrite(PGC,LOW);
digitalWrite(VPP,LOW);
}
// send a command to the chip
// SPI soft
void send_command(uchar command,uchar lowbyte,uchar highbyte)
{
unsigned char i;
for (i=0;i<4;i++)
{
digitalWrite(PGC,HIGH);
if ((command&1)==1) digitalWrite(PGD,HIGH);
else digitalWrite(PGD,LOW);
digitalWrite(PGC,LOW);
command=command>>1;
}
for (i=0;i<8;i++)
{
digitalWrite(PGC,HIGH);
if ((lowbyte&1)==1) digitalWrite(PGD,HIGH);
else digitalWrite(PGD,LOW);
digitalWrite(PGC,LOW);
lowbyte=lowbyte>>1;
}
for (i=0;i<8;i++)
{
digitalWrite(PGC,HIGH);
if ((highbyte&1)==1) digitalWrite(PGD,HIGH);
else digitalWrite(PGD,LOW);
digitalWrite(PGC,LOW);
highbyte=highbyte>>1;
}
digitalWrite(PGC,LOW);
digitalWrite(PGD,LOW);
}
// special end of command write
// DS39622K Page 20 figure 3.5 (Flash Microcontroller Programming Specification)
void end_writecmd()
{
unsigned char i;
digitalWrite(PGD,LOW);
for (i=0;i<3;i++)
{
digitalWrite(PGC,HIGH);
digitalWrite(PGC,LOW);
}
digitalWrite(PGC,HIGH);
delay(6);
digitalWrite(PGC,LOW);
delayMicroseconds(500);
for (i=0;i<8;i++)
{
digitalWrite(PGC,HIGH);
digitalWrite(PGC,LOW);
}
for (i=0;i<8;i++)
{
digitalWrite(PGC,HIGH);
digitalWrite(PGC,LOW);
}
}
// Read Flash memory
// Pinguino examples Flash folder
uint ReadFlash(uint address)
{
uchar high8,low8;
TBLPTRU=0;
TBLPTRH=address>>8;
TBLPTRL=address;
__asm tblrd*+ __endasm;
low8=TABLAT;
__asm tblrd*+ __endasm;
high8=TABLAT;
return((high8<<8)+low8);
}
//———————————————————–
// begining of the main loop
//———————————————————–
void setup()
{
pinMode(PGC,OUTPUT);
digitalWrite(PGC,LOW);
pinMode(PGD,OUTPUT);
digitalWrite(PGD,LOW);
pinMode(VPP,OUTPUT);
digitalWrite(VPP,LOW);
pinMode(redled,OUTPUT);
digitalWrite(redled,LOW);
pinMode(VCC,OUTPUT);
digitalWrite(VCC,HIGH);
}
void loop()
{
int i;
// erase chip
pic_on();
delay(20);
start_pgm();
digitalWrite(redled,HIGH);
delay(10);
for (i=0;i<48;i+=3) send_command(bulkerase[i],bulkerase[i+1],bulkerase[i+2]);
delay(100);
stop_pgm();
delay(20);
pic_off();
delay(1000);
// read bootloader and write it
pic_on();
delay(1000);
start_pgm();
delay(10);
for (i=0;i<24;i+=3) send_command(startwrite[i],startwrite[i+1],startwrite[i+2]);
while (address<0x1FDF)
{
for (i=0;i<32;i++) checkmem[i]=ReadFlash(address+i);
for (i=0;i<30;i+=2) send_command(0b00001101,checkmem[i],checkmem[i+1]);
send_command(0b00001110,checkmem[30],checkmem[31]);
end_writecmd();
address+=32;
digitalWrite(redled,digitalRead(redled)^1);
delay(4);
}
digitalWrite(redled,HIGH);
for (i=0;i<32;i++) checkmem[i]=ReadFlash(address+i);
for (i=0;i<48;i+=3) send_command(startwrite[i],startwrite[i+1],startwrite[i+2]);
for (i=0;i<30;i+=2) send_command(0b00001101,checkmem[i],checkmem[i+1]);
send_command(0b00001111,checkmem[30],checkmem[31]);
end_writecmd();
// ———- end copying bootloader
// programing configuration bits
for (i=0;i<24;i+=3) send_command(startwrid[i],startwrid[i+1],startwrid[i+2]);
send_command(0b00001111,0x24,0x24);
end_writecmd();
send_command(0,0×01,0x0E);
send_command(0,0xF6,0x6E);
send_command(0b00001111,0x0E,0x0E);
end_writecmd();
send_command(0,0×02,0x0E);
send_command(0,0xF6,0x6E);
send_command(0b00001111,0x3F,0x3F);
end_writecmd();
send_command(0,0×03,0x0E);
send_command(0,0xF6,0x6E);
send_command(0b00001111,0x1E,0x1E);
end_writecmd();
send_command(0,0×05,0x0E);
send_command(0,0xF6,0x6E);
send_command(0b00001111,0x81,0x81);
end_writecmd();
send_command(0,0×06,0x0E);
send_command(0,0xF6,0x6E);
send_command(0b00001111,0x81,0x81);
end_writecmd();
send_command(0,0×08,0x0E);
send_command(0,0xF6,0x6E);
send_command(0b00001111,0x0F,0x0F);
end_writecmd();
send_command(0,0×09,0x0E);
send_command(0,0xF6,0x6E);
send_command(0b00001111,0xC0,0xC0);
end_writecmd();
send_command(0,0x0A,0x0E);
send_command(0,0xF6,0x6E);
send_command(0b00001111,0x0F,0x0F);
end_writecmd();
send_command(0,0x0B,0x0E);
send_command(0,0xF6,0x6E);
send_command(0b00001111,0xA0,0xA0);
end_writecmd();
send_command(0,0x0C,0x0E);
send_command(0,0xF6,0x6E);
send_command(0b00001111,0x0F,0x0F);
end_writecmd();
send_command(0,0x0D,0x0E);
send_command(0,0xF6,0x6E);
send_command(0b00001111,0x40,0x40);
end_writecmd();
// ———- end configuration bits
stop_pgm();
pic_off();
digitalWrite(redled,LOW);
while(1);
}
[/sourcecode]
y lo siguiente es fácil, programaremos el PIC grabador, la imagen nº1, el chip a programar no necesita tener nada… puede ser tal cual viene de fabrica.
podrias especificar por favor si se conecta el chip vacio y luego se graba el pinguino quedando grabados los 2 o bien hay que cargar el sketch conectar el pic vacio y hacer un reset? es decir si hay que grabar el skecht estando ya conectado el pic vacio por que se copia el contenido del pinguino justo cuando se carga el sketch o bien se copia solo al reiniciar la placa con el sketch ya cargado en el pinguino.
gracias
este codigo no funciona da un error en el archivo user.c
en concreto este:
C:\Users\Alex\Downloads\pinguino_beta9-05_windows\pinguino_beta9-05_windows\source\/user.c:1: syntax error: token -> ‘001’ ; column 3
Error mientras compila archivoC:\Users\Alex\Downloads\pinguino_beta9-05_windows\pinguino_beta9-05_windows/NoName0
lo raro es que cada vez cambia el numero de la columna en la que supuestamente se encuentra el error
Hola… buenos días… el código funciona perfectamente en la versión 9.05… si es la que posees por favor re instala o corrige los permisos porque tienes un problema con la compilación…
Si lo necesitas puedo pasarte el archivo HEX para cargar en el micro…
A mi me compila perfectamente.
compilation done
code size: 6128 / 24575 bytes (24% used)
si estoy usando la ultima versión disponible beta. y lo he reprobado 20 veces y nada he descomprimido el zip por si se habia estropeado algún archivo y nada sigue dando el mismo error( no se si usas windows quizás sea que la versión linux si funciona)
te agradecería el hex si, pero como lo cargaria sin codigo al pinguino?(es decir subir el archivo hex sin ningun codigo escrito en el ide)
Cargar el HEX es muy facil, solo lo pones en el mismo directorio donde tienes el PDE (código) y le pones el mismo nombre que el PDE, luego lees el código en el IDE, sin presionar el triángulo le das cargar al pinguino, el IDE buscará si existe un HEX, con el mismo nombre del código leido y lo cargará.
Cual es la version que tienes, me dices que es la ultima beta…. te refieres a la 9.05??? o a la nueva de 32bits.???
este es el link del archivo HEX, http://www.megaupload.com/?d=7Q6BNZJR
Saludos y suerte
si la 9.05 beta que yo sepa es la ultima version
he probado como me has dicho y lo ha cargado al final se ha encendido el led de tun eso es bueno no? voi a probar que se haya cargado y te cuento
nada el chip sige vacio, esperare a que me llege el grabador que compre por ebay, muchas gracias por tu ayuda
mmmm… pero no entiendo algo, si no tienes un grabador, como has grabado el primer pinguino? lo has comprado ya grabado?
igualmente recuerda los pasos… con el pinguino grabado conectado y el virgen también conectado al conjunto, resetea el pinguino principal, y dejandolo 15 segundos te aseguras que ha funcionado… luego para verificar la grabación cambia de posicion los CHIPs.
y recuerda que lo que escribimos en el chip virgen es solo el bootrom, no le ponemos programa, estaría vacío y la unica forma de ver si realmente funciona el grabador, es conectando a windows o linux y ver que es reconocido como un CHIP MICROCHIP.
Saludos.
si lo compre ya grabado, probe si windows lo reconocia y no es asi, he comprado un grabador usb asique nada esperare a que me llege para grabar otros bootloaders que tenia pendientes para probar.
un saludo gracias por todo
Pero se hace necesario el uso de una fuente externa de 12v dc, no hay forma de programar lo en bajo voltaje? y cual es la corriente minima para ese voltaje de 12 v dc?? gracias
no es necesario 12 volts…
funciona con el propio voltaje del USB… 5volts…
igual podrias si es un 18lf4550 bajar a 3.3 volts.