Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Programe Facilmente a Série Atmel AT89 com Arduino Uno – Guia Passo a Passo

Componentes e Materiais

Ferramentas Necessárias

Software e Serviços Online

Sobre o Projeto

Neste tutorial, mostro como gravar seu arquivo .hex no AT89C52 usando um Arduino Uno em poucos passos simples. Para isso, faremos a interface do AT89C52 com o Arduino Uno e adicionaremos indicação via LED conectado ao AT89C52.

Passo 1: Lista de Materiais (BOM)

Todos os componentes estão listados na seção "Componentes e Materiais" acima.

Passo 2: Conexão do Microcontrolador

Conecte o microcontrolador conforme a tabela abaixo:

Pino AT89C52Pino Arduino Uno
Pino 6Pino 5
Pino 7Pino 4
Pino 8Pino 3
Pino 9Pino 2

Consulte a seção Esquemáticos para o diagrama completo do circuito.

Passo 3: Cristal Oscilador

Conecte um cristal de 12 MHz entre os pinos 18 e 19 do AT89C52. Em seguida, conecte dois capacitores de 33pF: um do pino 18 ao GND e outro do pino 19 ao GND do AT89C52.

Passo 4: Alimentação (VCC e GND)

Conecte o pino 5V do Arduino Uno ao pino 40 (VCC) do AT89C52 e o pino GND do Arduino ao pino 20 (GND) do AT89C52.

Passo 5: Interface do LED

Conecte um LED (com resistor limitador de corrente apropriado, ex: 220-330Ω) a uma porta de I/O do AT89C52 (ex: P1.0) para indicação visual. Consulte o diagrama esquemático para detalhes.

Passo 6: Software

Utilizamos o software 8051 SPI Programmer para gravar o arquivo .hex no AT89C52. O link está disponível na seção de software. Carregue o código fornecido no Arduino UNO e seu programador estará pronto.

Código para o Arduino (Programador SPI)

#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;

byte data;
byte AL, AH; // Endereço de 16 bits
byte lockByte; // Bits de proteção
byte SigH, SigL; // Bytes de assinatura

void setup() {
  pinMode(_MISO, INPUT);
  pinMode(_MOSI, OUTPUT);
  pinMode(_CLK, OUTPUT);
  pinMode(RST, OUTPUT);
  Serial.begin(115200);
}

void loop() {
  while (!Serial.available());
  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;
    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);
}

Esquemáticos

Consulte as imagens originais do projeto para os diagramas de conexão completos (circuito do programador e conexão do LED).

Processo de manufatura

  1. Programe Facilmente a Série Atmel AT89 com Arduino Uno – Guia Passo a Passo
  2. Decodifique Sinais PPM de Receptor RC com Arduino: Guia Passo a Passo
  3. Arduino UNO com Shield WiFi: Exibição de Temperatura em Tempo Real na Web via Serial
  4. ThimbleKrox: Controle de Mouse Dedo-Montado com Arduino Micro e MPU-6050
  5. Sistema de Iluminação Ativado por Movimento com Intel Curie (Arduino 101)
  6. Shield de Programação Wireless Arduino com HC-05 Bluetooth – Sem Cabo USB
  7. Sensor de Porta Arduino: Alertas em Tempo Real no Facebook Messenger via IFTTT
  8. Plotter XY Controlado via Web com Arduino e Motores de Passo
  9. Construa uma Calculadora Arduino com Display LCD 16x2 e Teclado
  10. Controle de Ventoinha PWM 4 Pinos 25 kHz com Arduino Uno – Montagem, Código e Teste