const PROGMEM uint16_t program[] = { 0x280D, 0x3FFF, 0x3FFF, 0x3FFF, 0x00FE, 0x0E03, 0x1283, 0x00C2, 0x0804, 0x00C3, 0x080A, 0x00C4, 0x286E, 0x280E, 0x1383, 0x3040, 0x00FD, 0x3000, 0x00FE, 0x30DF, 0x00FF, 0x3020, 0x0084, 0x2103, 0x01CE, 0x01CF, 0x01D0, 0x01D1, 0x01D2, 0x01D3, 0x01D4, 0x01D5, 0x01D6, 0x0183, 0x2823, 0x1683, 0x1381, 0x1283, 0x019F, 0x3006, 0x1683, 0x009F, 0x3004, 0x0085, 0x3001, 0x0086, 0x1283, 0x0185, 0x0186, 0x1683, 0x1281, 0x1181, 0x3007, 0x0481, 0x1283, 0x01D4, 0x01D5, 0x3037, 0x0081, 0x168B, 0x178B, 0x3003, 0x1283, 0x00CD, 0x308A, 0x00CC, 0x3055, 0x00CB, 0x0BCB, 0x2844, 0x0BCC, 0x2844, 0x0BCD, 0x2844, 0x0000, 0x1283, 0x1806, 0x284F, 0x2850, 0x284B, 0x20A7, 0x1283, 0x00CB, 0x084B, 0x00D6, 0x0856, 0x00CB, 0x3004, 0x1003, 0x0CCB, 0x3EFF, 0x1D03, 0x2858, 0x084B, 0x00CC, 0x01CD, 0x084C, 0x00D2, 0x084D, 0x00D3, 0x0856, 0x390F, 0x00CB, 0x01CC, 0x084B, 0x00D0, 0x084C, 0x00D1, 0x284B, 0x280D, 0x1D0B, 0x2871, 0x2872, 0x289E, 0x084E, 0x044F, 0x1903, 0x2877, 0x2878, 0x2883, 0x1085, 0x0850, 0x00C0, 0x0740, 0x3E20, 0x0084, 0x1383, 0x0800, 0x0086, 0x1405, 0x288D, 0x1485, 0x0852, 0x00C0, 0x0740, 0x3E20, 0x0084, 0x1383, 0x0800, 0x0086, 0x1005, 0x084E, 0x044F, 0x1903, 0x2892, 0x2894, 0x3001, 0x2895, 0x3000, 0x00C0, 0x01C1, 0x0840, 0x00CE, 0x0841, 0x00CF, 0x110B, 0x3037, 0x0081, 0x0844, 0x008A, 0x0843, 0x0084, 0x0E42, 0x0083, 0x0EFE, 0x0E7E, 0x0009, 0x1283, 0x01C8, 0x1C06, 0x28AC, 0x28AD, 0x28A9, 0x01C9, 0x01CA, 0x1283, 0x1806, 0x28B3, 0x28B4, 0x28AF, 0x3000, 0x1905, 0x3001, 0x00C7, 0x0847, 0x00C5, 0x0A49, 0x28BE, 0x1003, 0x0DC5, 0x3EFF, 0x1D03, 0x28BC, 0x0845, 0x00C6, 0x0846, 0x04C8, 0x1C06, 0x28C8, 0x28C9, 0x28C5, 0x3001, 0x07C9, 0x1803, 0x0ACA, 0x3000, 0x07CA, 0x084A, 0x3A80, 0x00FF, 0x3080, 0x027F, 0x1D03, 0x28D8, 0x3008, 0x0249, 0x1C03, 0x28DB, 0x28DC, 0x28AF, 0x1283, 0x0848, 0x0008, 0x3480, 0x3400, 0x34F2, 0x3400, 0x3448, 0x3400, 0x3460, 0x3400, 0x3432, 0x3400, 0x3424, 0x3400, 0x3404, 0x3400, 0x34B0, 0x3400, 0x3400, 0x3400, 0x3420, 0x3400, 0x3410, 0x3400, 0x3406, 0x3400, 0x348C, 0x3400, 0x3442, 0x3400, 0x340C, 0x3400, 0x341C, 0x3400, 0x087E, 0x008A, 0x087F, 0x0082, 0x20FF, 0x0080, 0x0A84, 0x0804, 0x067D, 0x1903, 0x3400, 0x0AFF, 0x1903, 0x0AFE, 0x2903 }; const PROGMEM uint16_t configuration = 0xFFB2; //#define READ_MEMORY #define LOAD_CONFIGURATION 0 #define LOAD_DATA 2 #define READ_DATA 4 #define INCREMENT_ADDRESS 6 #define BEGIN_PROGRAMMING 8 #define END_PROGRAMMING 14 #define PGC 6 #define PGD 7 void setup() { pinMode(PGC, OUTPUT); pinMode(PGD, OUTPUT); digitalWrite(PGC, LOW); digitalWrite(PGD, LOW); Serial.begin(9600); } void loop() { char c; Serial.println("Connect 12V to MCLR."); while(Serial.available() == 0); c = Serial.read(); Serial.println("Start Writing..."); #ifdef READ_MEMORY readMemory(); #else writeProgram(); writeConfiguration(); #endif while(true); } void readMemory() { int code, pc = 0; Serial.println(); Serial.println("Read Program code."); sendCommand(LOAD_DATA); sendData(0x3fff); Serial.print("0 : "); for(int i=0; i 24) { Serial.print(i, HEX); Serial.print(" : "); Serial.print(check, HEX); Serial.println(" Error!!"); break; } } } sendCommand(INCREMENT_ADDRESS); } } void writeConfiguration() { int check; uint16_t confbit; sendCommand(LOAD_CONFIGURATION); // アドレス2000h sendData(0x3fff); // 値は何でもいい? // Configuration Wordのアドレス2007hへ移動 for(int i=0; i<7 ; i++) sendCommand(INCREMENT_ADDRESS); Serial.println(); Serial.println("Write Configuration Word."); //コンフィギュレーション書き込み confbit = pgm_read_word(&configuration); confbit &= 0x3fff; //14ビット sendCommand(LOAD_DATA); sendData(confbit); sendCommand(BEGIN_PROGRAMMING); delayMicroseconds(1000); sendCommand(END_PROGRAMMING); // 確認 sendCommand(READ_DATA); check = getData(); if(confbit == check) Serial.println("Correct data."); else Serial.println("Error!!"); Serial.print("EPROM data : "); Serial.println(check, HEX); } void sendCommand(int data) { for(int i=0; i<6; i++) { digitalWrite(PGD, (data >> i) & 1); digitalWrite(PGC, HIGH); delayMicroseconds(5); // 100ns以上待つ digitalWrite(PGC , LOW); delayMicroseconds(5); // 100ns以上待つ } digitalWrite(PGD, LOW); delayMicroseconds(5); // 1μs以上待つ } void sendData(int data) { //スタートビット digitalWrite(PGD , LOW); digitalWrite(PGC, HIGH); delayMicroseconds(5); // 100ns以上待つ digitalWrite(PGC , LOW); delayMicroseconds(5); // 100ns以上待つ for(int i=0; i<14; i++) { digitalWrite(PGD , (data >> i) & 1); digitalWrite(PGC, HIGH); delayMicroseconds(5); // 100ns以上待つ digitalWrite(PGC , LOW); delayMicroseconds(5); // 100ns以上待つ } //ストップビット digitalWrite(PGD , LOW); digitalWrite(PGC, HIGH); delayMicroseconds(5); // 100ns以上待つ digitalWrite(PGC , LOW); delayMicroseconds(5); // 100ns以上待つ digitalWrite(PGD, LOW); delayMicroseconds(200); } int getData() { int data = 0; pinMode(PGD, INPUT); //スタートビット digitalWrite(PGC, HIGH); delayMicroseconds(5); // 100ns以上待つ digitalWrite(PGC , LOW); delayMicroseconds(5); // 100ns以上待つ for(int i=0; i<14; i++) { digitalWrite(PGC, HIGH); delayMicroseconds(5); // 100ns以上待つ digitalWrite(PGC , LOW); data |= (digitalRead(PGD) << i); delayMicroseconds(5); // 100ns以上待つ } //ストップビット digitalWrite(PGC, HIGH); pinMode(PGD, OUTPUT); delayMicroseconds(5); // 100ns以上待つ digitalWrite(PGC , LOW); digitalWrite(PGD, LOW); return data; }