아두이노 우노로 Atmel AT89 시리즈 손쉽게 프로그래밍하기 - 단계별 가이드
부품 및 소모품
| 아두이노 우노 (Arduino UNO) |
1개 |
| LED (범용) |
1개 |
필요한 도구 및 장비
앱 및 온라인 서비스
| 아두이노 IDE (Arduino IDE) |
| 8051 SPI 프로그래머 (8051 SPI Programmer) |
프로젝트 소개
이 튜토리얼에서는 아두이노 우노를 사용하여 AT89C52에 헥스 파일을 업로드하는 방법을 몇 가지 간단한 단계로 보여드리겠습니다. 이를 위해 AT89C52를 아두이노 우노와 연결하고, AT89C52에 연결된 LED를 통해 상태 표시를 구현합니다.
1단계: 자재 목록 (Bill of Materials)
- 아두이노 우노 (Arduino UNO)
- AT89C52 마이크로컨트롤러
- 10uF 커패시터
- 점퍼 와이어
- 8.2kΩ 저항
- 510Ω 저항 (원문의 '510 ohm Capacitor'는 저항으로 수정)
- LED
- 12 MHz 크리스털
- 33pF 커패시터 2개
2단계: 마이크로컨트롤러 연결
아래와 같이 마이크로컨트롤러를 연결하세요:
| AT89C52 핀 |
아두이노 우노 핀 |
| 핀 6 |
핀 5 |
| 핀 7 |
핀 4 |
| 핀 8 |
핀 3 |
| 핀 9 |
핀 2 |
3단계: 크리스털 연결
ATMEL의 핀 18과 19 사이에 크리스털을 연결한 다음, 핀 18과 19에서 ATMEL의 그라운드로 각각 33pF 커패시터를 연결하세요. 전체 회로도는 회로도 섹션을 참조하세요.
4단계: VCC 및 GND 연결
아두이노 우노의 5V 핀을 ATMEL의 40번 핀에, GND 핀을 20번 핀에 연결하세요.
5단계: LED 인터페이싱
회로도 섹션에 제공된 회로도의 도움을 받아 LED를 연결하세요.
6단계: 소프트웨어
89C52에 헥스 파일을 업로드하려면 8051 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; // 16비트 주소
byte lockByte; // 락 비트 저장용
byte SigH, SigL; // 시그니처 바이트
void setup() {
pinMode(_MISO, INPUT);
pinMode(_MOSI, OUTPUT);
pinMode(_CLK, OUTPUT);
pinMode(RST, OUTPUT);
Serial.begin(115200); // 호스트 PC 설정에 따라 다름
}
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);
}
회로도
회로도 이미지는 원문 프로젝트 페이지에서 확인할 수 있습니다.