Very interesting project!
Ditto... must keep an eye on this as my Pic programmer uses serial and my new PC doesn't...
Keep it up Soranne, nice project...
Mike
Hi, watchinofoye
I was also trying to build an Arduino PIC programmer for the PIC18F2550. So far without much success.
Here is my code:
/*
* Trying to build an arduino pic programmer for the PIC18F2550
* Programming specifications: http://ww1.microchip.com/downloads/en/DeviceDoc/39622L.pdf
* Author: Ingmar Jager
*/
//Pin layout
int pgc = 9; // program clock
int pgd = 8; // program data
int pgm = 10; // program mode
int MCLR = 11; //Master Clear Reset / Vpp
void setup()
{
Serial.begin(9600);
pinMode(pgc, OUTPUT);
pinMode(pgd, OUTPUT);
pinMode(pgm, OUTPUT);
pinMode(MCLR, OUTPUT);
delay(500);
enterProgramming();
delay(500);
tableRead(0x3F, 0xFF, 0xFF);
delay(500);
tableRead(0x3F, 0xFF, 0xFF);
exitingProgramming();
}
/*
* @param: three bytes which form the tablepointer address
*/
void setTablePTR(int addr_upper_byte,int addr_half_byte,int addr_lower_byte)
{
Serial.print("Set TablePTR to: 0x");
Serial.print(addr_upper_byte, HEX);
Serial.print(addr_half_byte, HEX);
Serial.println(addr_lower_byte, HEX);
writeBits(4, 0x0); // 4 bit command
writeBits(16, 0x0E00 + addr_upper_byte); // 16 bit data payload: load address
writeBits(4, 0x0);
writeBits(16, 0x6EF8); // set TBLPTR_U to addr_upper_byte
writeBits(4, 0x0);
writeBits(16, 0x0E00 + addr_half_byte);
writeBits(4, 0x0);
writeBits(16, 0x6EF7); //TBLPTR_H
writeBits(4, 0x0);
writeBits(16, 0x0E00 + addr_lower_byte);
writeBits(4, 0x0);
writeBits(16, 0x6EF6); //TBLPTR_L
}
/*
* Read byte from the given address
*/
void tableRead(int high_byte, int mid_byte, int low_byte)
{
setTablePTR(high_byte,mid_byte,low_byte);
writeBits(4, 0x8); //1000 = Read and no increment
writeBits(8, 0x00);
pinMode(pgd, INPUT);
delayMicroseconds(5); //P6
byte data = 0;
//actual read
Serial.print("Read bits from LSB to MSB: ");
for (int i = 0; i < 8; i++)
{
digitalWrite(pgc, HIGH);
delayMicroseconds(3); //P14
if (digitalRead(pgd)==HIGH)
{
Serial.print("1");
data += (1 << i);
}
else
{
Serial.print("0");
}
digitalWrite(pgc, LOW);
delayMicroseconds(3);
}
delayMicroseconds(5); //P5A
pinMode(pgd, OUTPUT);
Serial.println();
Serial.print("Reading result: ");
Serial.println(data);
}
/* Write LSB to MSB
* @param n = number of bits to write
* @param value = value to write in n bits
*/
void writeBits(int n, int value)
{
digitalWrite(pgc, HIGH);
for (int i = 0; i < n; i++) {
if( (boolean) ((value >> i) & 1))
digitalWrite(pgd,HIGH);
}
delayMicroseconds(3);
digitalWrite(pgc, LOW);
delayMicroseconds(3);
digitalWrite(pgd,LOW);
delayMicroseconds(5); //P5A
}
/*
* Entering low voltage programming signals
*/
void enterProgramming()
{
digitalWrite(pgc, LOW);
digitalWrite(pgd, LOW);
digitalWrite(pgm, LOW);
digitalWrite(MCLR, LOW);
delayMicroseconds(20);
digitalWrite(pgm, HIGH);
delayMicroseconds(3);//P15
digitalWrite(MCLR, HIGH);
delayMicroseconds(3);//P12
Serial.println("Entered Low Voltage Programming");
}
/*
* Exiting low voltage programming signals
*/
void exitingProgramming()
{
digitalWrite(pgc, LOW);
digitalWrite(pgd, LOW);
delayMicroseconds(1); //P16
digitalWrite(MCLR, LOW);
delayMicroseconds(1); //P18
digitalWrite(pgm, LOW);
Serial.println("Exiting Low Voltage Programming");
}
void loop()
{
}
I'm trying to read the deviceID on address 0x3FFFFF. According to the programming specifications the DEVID1 = 010x xxxx and DEVID2 = 0x12.
When I run my program, this is the output:
Entered Low Voltage Programming
Set TablePTR to: 0x3FFFFF
Read bits from LSB to MSB: 00000000
Reading result: 0
Set TablePTR to: 0x3FFFFF
Read bits from LSB to MSB: 00011111
Reading result: 248
Exiting Low Voltage Programming
So the first time I try to read the ID register it returns 0. However the second time the result is 00011111 (248). If I read it a third time it is 0 again. So I'm not quite sure what is happening here.
Have you got some better results?
I have been having issues with the GUI version.
When I Burn a hex to the pic, it seems to work (tx light on usb adapter flashes, etc) and the program says "Finished!" after a short time.
However, when I hit "Read from PIC" all lines (0-49) say 00000000000000
I'm using a PIC16F628A
ive been looking for something like this for a long time; great work!
I wrote a similar sketch for the PIC18F2550 ( a slight modification can adopt it to almost all pic18F2/4 family). the sketch and the instruction can be found over here:
Hi soranne,
sorry, I don´t speak english very good
I know how to get 12V from USB port, There are two ways:
1.-With a coil and a zenner
2.- With capacitors, Diodes and a zenner
the first option are more easy but it is more difficult to get the coil.
I will post here how to make
reggards.
I wrote a similar sketch for the PIC18F2550 ( a slight modification can adopt it to almost all pic18F2/4 family). the sketch and the instruction can be found over here:
Damn ! Project already done !
Well, I'll still try to do it, at least to understand the ICSP method and achieve implementation by myself.
But, even so I am disgusted ! >.< I was caught up again ! Just my luck !
Hey all! sorry for answering so late but I have been busy with a lot of homework :s
I have to say I am not sure I will be able to work again on this project because it involves a lot of time (coding a programming method for nearly every pic!).
What Is suggest is that someone who is really motivated gathers all the programming methods for each pic to make one nice prog.
Hope I can help again!
hi soranne where i can find your program c# to load pic?
also what is latest state your project?
and soranne your project page (https://sites.google.com/site/thehighspark/arduino-pic18f ) is broken
is there any alternatif link??
Dear mahk,
I am sorry this page is not my project.
hey soranne can you give me alink for this project(circuit,program)
i need this project for my thesis in school
All the infromation I have is on the first page
Hi!
A good project!
In case interested, I've created an Arduino programmer for PIC32 series. The details are found at Google Code Archive - Long-term storage for Google Code Project Hosting..
Cheers!
Hi Soranne!
I think you save me! Please tell me that I can program a PIC18F452 or a PIC16F88 (with I prefer) using your project.
diogo0880:
Hi Soranne!I think you save me! Please tell me that I can program a PIC18F452 or a PIC16F88 (with I prefer) using your project.
Hey!
Of course you can! But depending on the protocol they use you may need to adapt a bit the code.
But personnaly I would prefer the beaglebone to the raspberry pi
The beaglebone looks more like an arduino (you can easily access the inputs/outputs and and shields) and is more powerful than a raspberry pi, even if it's a bit more expensive.
How do i connect the pic16f684? I checked the datasheet and it doesnt have pins labeled as RB4 RB6 AND RB7?
Hi all,
Mine is PIC16F887
Im trying to program it using your programmer (the .exe application) and have few question.
How to send the command "s" ? i want to program using low voltage.
and how to wire it? here's what I got from my PIC datasheet.(attached)
hoping someone can give me circuit suggesstion. thanks