Project tutorial
Programming Atmel AT89 Series Via Arduino

Programming Atmel AT89 Series Via Arduino © GPL3+

This Project will show you how to Burn Hex File For Atmel Microcontroller using Arduino Uno.

  • 11,071 views
  • 2 comments
  • 19 respects

Components and supplies

Necessary tools and machines

09507 01
Soldering iron (generic)

Apps and online services

About this project

In this Tutorial I will show you how to Burn Your Hex File To AT89c52 using Arduino Uno in just few easy steps. For this we have to interface AT89c52 to Arduino Uno and give it led indications via interfacing LED to At89c52.

Step 1: Bill Of Materials

  • Arduino UNO
  • AT89C52 Microcontroller
  • 10uF Capacitor
  • Jumper Wires
  • 8.2kohm Resistor
  • 510 ohm Capacitor
  • LED
  • 12 MHz Crystal
  • 2 x 33pF Capacitor

Step 2: Connecting Microcontroller

Connect the micro controller as mentioned below:

  • At89c52 Arduino Uno
  • Pin 6 Pin 5
  • Pin 7 Pin 4
  • Pin 8 Pin 3
  • Pin 9 Pin 2

Step 3: Crystal

Connect a Crystal across Pin 18 and 19 of Atmel and then connect two 33pf capacitors from pin 18 and 19 to Ground of Atmel. See Schematics Section For Full Circuit Diagram.

Step 4: VCC And GND

Connect 5v Pin of Arduino Uno to 40th pin of Atmel and GND pin to 20th Pin of Atmel.

Step 5: Interfacing LED

Interface LED with the help of Circuit Diagram provided in Schematics Section.

Step 6: Software

We need 8051 SPI Programmer to Burn Hex File To 89c52. The Link is Provided in Software Section. Upload Code provided to Arduino UNO and your Programmer is ready.

Code

Untitled fileC/C++
#define dummyData 0xAA
#define RDY 75
#define NRDY 76

const int _MISO = 4;
const int _MOSI = 5;
const int _CLK = 3;
const int RST = 2;

/* Variable definition block */

byte data;
byte AL,AH; // 16-bit address
byte lockByte; // embed lock bits here
byte SigH,SigL; // Signature Bytes

void setup()
{
pinMode(_MISO, INPUT);
pinMode(_MOSI, OUTPUT);
pinMode(_CLK, OUTPUT);
pinMode(RST, OUTPUT);
Serial.begin(115200); // depends on the setting of the host PC

}



void loop()
{ 
  while (!Serial.available()); // wait for character
        if (Serial.available() > 0)
        switch (Serial.read())
        {
        case 'p': Serial.write(progEnable());
                  break; 
        case 'r': readProgmem(); 
                  Serial.write(data);
                  break;
        case 'a': while(!Serial.available());
                  AL = Serial.read();
                  break; 
        case 'A': while(!Serial.available()); 
                  AH = Serial.read();
                  break; 
        case 'd': while(!Serial.available()); 
                  data = Serial.read();
                  break; 
        case 'S': AH = 0;
                  AL = 0;
                  SigH = readSign();
                  Serial.write(SigH);
                  break; 
        case 's': AH = 2;
                  AL = 0;
                  SigL = readSign();
                  Serial.write(SigL);
                  AH = 1;
                  AL = 0;
                  SigL = readSign();
                  Serial.write(SigL);
                  break; // read SigL
        case 'o': digitalWrite(RST,1);break; 
        case 'c': digitalWrite(RST,0);break; 
        case 'e': eraseChip();
                  Serial.write(RDY);
                  break; 
        case 'j': break;
        case 'w': writeProgmem();
                  break;
        }



}


unsigned char SendSPI(unsigned char data)
{ 
  uint8_t retval = 0;
  uint8_t intData = data;
  int t;
  
    for (int ctr = 0; ctr < 7; ctr++)
      { 
         if (intData & 0x80) digitalWrite(_MOSI,1);
            else digitalWrite(_MOSI,0);

        digitalWrite(_CLK,1); 
        delayMicroseconds(1); 

        t = digitalRead(_MISO); 
        digitalWrite(_CLK,0);

        if (t) retval |= 1; else retval &= 0xFE;
            retval<<=1;
            intData<<= 1;
        delayMicroseconds(1); 
    }


  if (intData & 0x80) digitalWrite(_MOSI,1);
    else digitalWrite(_MOSI,0);
  
    digitalWrite(_CLK,1);
    delayMicroseconds(1); 

    t = digitalRead(_MISO);
    digitalWrite(_CLK,0);
    
    if (t) retval |= 1; 
    else retval &= 0xFE;

    return retval; 
}


byte progEnable()
{ 
    SendSPI(0xAC);
    SendSPI(0x53);
    SendSPI(dummyData);
    
   return SendSPI(dummyData);
}

void eraseChip()
{
     SendSPI(0xAC);
     SendSPI(0x9F);
     SendSPI(dummyData);
     SendSPI(dummyData);
     
     delay(520);
}

void readProgmem()
{

    SendSPI(0x20);
    SendSPI(AH);
    SendSPI(AL);
    data = SendSPI(dummyData);
}

void writeProgmem()
{
    SendSPI(0x40);
    SendSPI(AH);
    SendSPI(AL);
    SendSPI(data);
}

void writeLockBits()
{
    SendSPI(0xAC);
    SendSPI(lockByte);
    SendSPI(dummyData);
    SendSPI(dummyData);
}

void readLockBits()
{ 
    SendSPI(0x24);
    SendSPI(dummyData);
    SendSPI(dummyData);
    lockByte = SendSPI(dummyData);
}

byte readSign()
{
    SendSPI(0x28);
    SendSPI(AH);
    SendSPI(AL);
    return SendSPI(dummyData);
}

Schematics

Interfacing LED
1637818 orig 8nihzlfpli
Connecting Atmel to Arduino UNO
89s52ckt wdpsrwqpf5

Comments

Similar projects you might like

ATtiny13/13a/25/45/85 Programming Shield

Project tutorial by Viktor S

  • 3,919 views
  • 0 comments
  • 9 respects

Programming ATtiny13 with Arduino Uno

by Tauno Erik

  • 31,873 views
  • 14 comments
  • 31 respects

Programming the ATtiny85 (Using an Arduino Uno)

Project tutorial by Ian Cumming

  • 3,448 views
  • 3 comments
  • 7 respects

Programming Arduino Pro Mini Using UNO

by WolfxPac

  • 2,999 views
  • 0 comments
  • 6 respects

Programming ATmega8 Using Arduino IDE

Project tutorial by Hami Mahdavinataj

  • 20,852 views
  • 4 comments
  • 17 respects

Hacking Qualcomm (Quick Charge) QC 2.0/3.0 With ATtiny85

Project tutorial by Shahariar

  • 13,572 views
  • 15 comments
  • 46 respects
Add projectSign up / Login