11
/* PIC programmer using Arduino This program is distibuted "AS IS", I offer no garantee. By Ronan Gaillard */ #define CLOCK 9 #define DATA 8 #define VPP1 6 #define VPP2 5 #define VPP3 4 #define PGM 10 //HIGH/LOW voltage select mode #define MCLR 11 //LOW voltage only void setup() { pinMode(CLOCK, OUTPUT); pinMode(VPP1, OUTPUT); pinMode(VPP2, OUTPUT); pinMode(VPP3, OUTPUT); pinMode(DATA, OUTPUT); pinMode(PGM, OUTPUT); Serial.begin(9600); Serial.println("Started"); //Serial.println("Send s to start (please put Vpp first)"); while(true) { if (Serial.available() > 0) { if(Serial.read()=='s')//HIGH VOLTAGE MODE { //VIN should be around 12V max. is 13.5V digitalWrite(VPP1, HIGH); digitalWrite(VPP2, HIGH); digitalWrite(VPP3, HIGH); Serial.print("D"); break; }

PIC Programmer Using Arduino

  • Upload
    ganesh

  • View
    22

  • Download
    0

Embed Size (px)

DESCRIPTION

it is program that can be use to program pic microcontroller using

Citation preview

Page 1: PIC Programmer Using Arduino

/*PIC programmer using ArduinoThis program is distibuted "AS IS", I offer no garantee.By Ronan Gaillard*/#define  CLOCK  9#define  DATA   8#define  VPP1   6#define  VPP2   5#define  VPP3   4#define  PGM    10 //HIGH/LOW voltage select mode#define  MCLR   11 //LOW voltage only

void setup() {                  pinMode(CLOCK, OUTPUT);     pinMode(VPP1, OUTPUT); pinMode(VPP2, OUTPUT);  pinMode(VPP3, OUTPUT);  pinMode(DATA, OUTPUT);    pinMode(PGM, OUTPUT);  

 Serial.begin(9600); Serial.println("Started"); //Serial.println("Send s to start (please put Vpp first)");while(true){  if (Serial.available() > 0)  {   if(Serial.read()=='s')//HIGH VOLTAGE MODE  {   //VIN should be around 12V max. is 13.5V       digitalWrite(VPP1, HIGH);  digitalWrite(VPP2, HIGH);  digitalWrite(VPP3, HIGH);

    Serial.print("D");   break;  }   else//low voltage mode  { digitalWrite(PGM, LOW); digitalWrite(VPP1, LOW);  digitalWrite(VPP2, LOW);   digitalWrite(MCLR, LOW);  digitalWrite(VPP3, LOW);

Page 2: PIC Programmer Using Arduino

  delayMicroseconds(20);  digitalWrite(VPP1, HIGH);  digitalWrite(VPP2, HIGH);  digitalWrite(VPP3, HIGH);  delayMicroseconds(3);  digitalWrite(PGM, HIGH);    delayMicroseconds(3);    digitalWrite(MCLR, HIGH);    Serial.print("D");   break;  }   }  }}

void loop() {  char command = '\0';   if (Serial.available() > 0) {        command = Serial.read();        switch(command)    {    case 'b' :     BulkEraseProgramMemory();            Serial.print('D');    break;        case 'E' :      EndOfProgramming();      Serial.print('D');      break;        case 'r' :           char valeur[16];      ReadDataFromProgramMemory(valeur);      for(int i=0; i<14;i++)      {       Serial.print(valeur[i]);       }      //Serial.print("D");    break;        case 'l' :

Page 3: PIC Programmer Using Arduino

      char WritingValue[14];      for(int i=0;i<14;i++)      {       while(Serial.available() == 0)       {       }               WritingValue[i] = Serial.read();       }                 LoadDataCommandForProgramMemory(WritingValue);                  Serial.print('D');      break;          case 'w' :      BeginProgrammingOnlyCycle();      Serial.print('D');    break;          case 'W' :      BeginEraseProgrammingCycle();      Serial.print('D');    break;          case 'i' :      IncrementAddress();      Serial.print('D');      break;          case 'c' :      char ConfigValue[14];      for(int i=0;i<14;i++)      {       while(Serial.available() == 0)       {       }               ConfigValue[i] = Serial.read();       }      LoadConfiguration(ConfigValue);      BeginProgrammingOnlyCycle();            Serial.print('D');      break;          case 'R' :      

Page 4: PIC Programmer Using Arduino

          digitalWrite(VPP1, LOW);      digitalWrite(VPP2, LOW);      digitalWrite(VPP3, LOW);            delay(3);            digitalWrite(VPP1, HIGH);      digitalWrite(VPP2, HIGH);      digitalWrite(VPP3, HIGH);            Serial.print("D");          break;              }  } 

}void WriteBit(char nb){ digitalWrite(CLOCK, HIGH); if(nb!='0') {   digitalWrite(DATA,HIGH); } delayMicroseconds(3); digitalWrite(CLOCK, LOW); delayMicroseconds(3);    digitalWrite(DATA,LOW); }

byte ReadBit(){ byte valeur = 0;  digitalWrite(CLOCK, HIGH); delayMicroseconds(3); if(digitalRead(DATA)==HIGH) {  valeur = '1';  } else {

Page 5: PIC Programmer Using Arduino

   valeur = '0'; } digitalWrite(CLOCK, LOW); delayMicroseconds(3);  return valeur;}void ReadDataFromProgramMemory(char valeur[]){ digitalWrite(DATA,LOW);  //Command  WriteBit('0'); WriteBit('0'); WriteBit('1'); WriteBit('0'); WriteBit('0'); WriteBit('0');  pinMode(DATA, INPUT); delayMicroseconds(3);  //DATA ReadBit(); for(int i =13;i>=0;i--) {   valeur[i] = ReadBit(); } ReadBit();    pinMode(DATA, OUTPUT);   }

void LoadDataCommandForProgramMemory(char valeur[]){ digitalWrite(DATA,LOW);  //Command  WriteBit('0'); WriteBit('1'); WriteBit('0'); WriteBit('0');

Page 6: PIC Programmer Using Arduino

 WriteBit('0'); WriteBit('0');   delayMicroseconds(3);  //DATA WriteBit('0');//always 0 for(int i =13;i>=0;i--) {   WriteBit(valeur[i]); } WriteBit('0');//always 0 (stop bit)  delayMicroseconds(3);   

   }void BeginProgrammingOnlyCycle(){ digitalWrite(DATA,LOW);  WriteBit('0'); WriteBit('0'); WriteBit('0'); WriteBit('1'); WriteBit('1'); WriteBit('0');   delayMicroseconds(3); 

 

  delay(20);}

void BeginEraseProgrammingCycle(){ digitalWrite(DATA,LOW);  WriteBit('0');

Page 7: PIC Programmer Using Arduino

 WriteBit('0'); WriteBit('0'); WriteBit('1'); WriteBit('0'); WriteBit('0');   delayMicroseconds(3); 

 

  delay(20);}

void BulkEraseProgramMemory(){ digitalWrite(DATA,LOW);  WriteBit('1'); WriteBit('0'); WriteBit('0'); WriteBit('1'); WriteBit('0'); WriteBit('0');   delayMicroseconds(3);    delayMicroseconds(3);  delay(20);}

void FullEraseProgramMemory(){ char Erase [] = {'1','1','1','1','1','1','1','1','1','1','1','1','1','1'}; LoadDataCommandForProgramMemory(Erase); BulkEraseProgramMemory(); BeginProgrammingOnlyCycle();}

void IncrementAddress(){ digitalWrite(DATA,LOW);

Page 8: PIC Programmer Using Arduino

  WriteBit('0'); WriteBit('1'); WriteBit('1'); WriteBit('0'); WriteBit('0'); WriteBit('0');   delayMicroseconds(3);}

void LoadDataCommandForDataMemory(char valeur[]){ digitalWrite(DATA,LOW);  //Command  WriteBit('1'); WriteBit('1'); WriteBit('0'); WriteBit('0'); WriteBit('0'); WriteBit('0');   delayMicroseconds(3);  //DATA WriteBit('0');//always 0 for(int i =13;i>=0;i--) {   WriteBit(valeur[i]); } WriteBit('0');//always 0 (stop bit)  delayMicroseconds(3);   

   }void LoadConfiguration(char valeur[]){ digitalWrite(DATA,LOW); 

Page 9: PIC Programmer Using Arduino

 //Command  WriteBit('0'); WriteBit('0'); WriteBit('0'); WriteBit('0'); WriteBit('0'); WriteBit('0');   delayMicroseconds(3);  //DATA WriteBit('0');//always 0 for(int i =13;i>=0;i--) {   WriteBit(valeur[i]); } WriteBit('0');//always 0 (stop bit)  delayMicroseconds(3);   

   }

void EndOfProgramming(){ digitalWrite(DATA,LOW);  //Command  WriteBit('1'); WriteBit('1'); WriteBit('1'); WriteBit('0'); WriteBit('1'); WriteBit('0');  delayMicroseconds(3);}

Page 10: PIC Programmer Using Arduino