Fusebit doctor
Moderátor: Moderátoři
-
jankrizan
- Příspěvky: 176
- Registrován: 30 pro 2007, 00:00
Fusebit doctor
-
PabloX
- Příspěvky: 986
- Registrován: 16 kvě 2005, 00:00
- Bydliště: Ruzomberok
-
jankrizan
- Příspěvky: 176
- Registrován: 30 pro 2007, 00:00
-
masar
- Příspěvky: 14586
- Registrován: 03 pro 2005, 00:00
-
samec
- Příspěvky: 6822
- Registrován: 19 pro 2017, 00:00
Tu máš program pre Arduino od umelej inteligencie. Dátové linky sú zoptimalizované na 3 (viď komentáre v kóde). Bity 5, 2 a 1, ktoré sú stále nulové pripojíš na GND.
Kód: Vybrat vše
// Definícia riadiacich pinov
const int pinVCC = 2; // Ovládanie 5V napájania čipu
const int pinRESET_12V = 3; // Ovládanie 12V tranzistora pre RESET
const int pinXA0 = 4;
const int pinXA1 = 5;
const int pinBS1 = 6;
const int pinXTAL1 = 7; // Hardvérové hodiny
const int pinWR = 8; // Zápisový pulz
// Definícia vašich optimalizovaných dátových pinov
const int pinDATA_A = 9; // Bit 7
const int pinDATA_B = 10; // Bit 6
const int pinDATA_C = 11; // Bity 4, 3, 0 spojené spolu
const int ledPin = 13; // Vstavaná LED pre signalizáciu úspechu
// Pomocná funkcia na pulznutie hodín XTAL1 (vyžadované pre vnútornú logiku čipu)
void pulsHodiny() {
digitalWrite(pinXTAL1, HIGH);
delayMicroseconds(2);
digitalWrite(pinXTAL1, LOW);
delayMicroseconds(2);
}
// Pomocná funkcia na pulznuťie zápisu (WR)
void pulsZapis() {
digitalWrite(pinWR, LOW);
delayMicroseconds(2); // Oficiálne minimum je 250 ns, 2 us je bezpečný nadštandard
digitalWrite(pinWR, HIGH);
delayMicroseconds(2);
}
// Funkcia na nastavenie dátovej zbernice podľa vašej logiky
void nastavZbernicu(byte hodnota) {
// Ak posielame 0x80 (0b10000000) alebo 0xD9 (0b11011001), bit 7 je HIGH
digitalWrite(pinDATA_A, (hodnota & 0x80) ? HIGH : LOW);
// Ak posielame 0x40 (0b01000000) alebo 0xD9 (0b11011001), bit 6 je HIGH
digitalWrite(pinDATA_B, (hodnota & 0x40) ? HIGH : LOW);
// Ak posielame 0xD9, bity 4,3,0 sú HIGH. Pri 0x80 a 0x40 sú LOW
digitalWrite(pinDATA_C, (hodnota & 0x01) ? HIGH : LOW);
}
void setup() {
// Inicializácia všetkých pinov na VÝSTUP
pinMode(pinVCC, OUTPUT);
pinMode(pinRESET_12V, OUTPUT);
pinMode(pinXA0, OUTPUT);
pinMode(pinXA1, OUTPUT);
pinMode(pinBS1, OUTPUT);
pinMode(pinXTAL1, OUTPUT);
pinMode(pinWR, OUTPUT);
pinMode(pinDATA_A, OUTPUT);
pinMode(pinDATA_B, OUTPUT);
pinMode(pinDATA_C, OUTPUT);
pinMode(ledPin, OUTPUT);
// 1. BEZPEČNÝ ŠTART: Všetko na nulu, WR na HIGH (neaktívny)
digitalWrite(pinVCC, LOW);
digitalWrite(pinRESET_12V, LOW);
digitalWrite(pinXA0, LOW);
digitalWrite(pinXA1, LOW);
digitalWrite(pinBS1, LOW);
digitalWrite(pinXTAL1, LOW);
digitalWrite(pinWR, HIGH);
nastavZbernicu(0x00);
delay(50); // Čas na vybitie kondenzátorov
// 2. VSTUP DO HVPP REŽIMU (Vysokonapäťová sekvencia)
digitalWrite(pinRESET_12V, HIGH); // Pusť 12V na RESET
delayMicroseconds(10); // t_HV_RESET (min 100 ns)
digitalWrite(pinVCC, HIGH); // Pusť 5V na VCC
delayMicroseconds(300); // t_VCC_HVP (min 300 µs) na stabilizáciu čipu
// ==========================================
// KROK 1: CELKOVÉ VYMAZANIE ČIPU (CHIP ERASE)
// ==========================================
// A. Načítanie príkazu na zbernicu (Command)
digitalWrite(pinXA1, HIGH);
digitalWrite(pinXA0, LOW);
digitalWrite(pinBS1, LOW);
nastavZbernicu(0x80); // Príkaz pre Chip Erase
pulsHodiny(); // Zapísanie typu akcie do čipu
pulsZapis(); // Vykonanie zápisu príkazu
// B. Spustenie samotného mazania
digitalWrite(pinXA1, LOW);
digitalWrite(pinXA0, LOW);
pulsZapis();
delay(15); // Čakanie 15 ms na fyzické dokončenie vymazania kremíka (min 10 ms)
// ==========================================
// KROK 2: ZÁPIS FUSE HIGH BYTE (0xD9)
// ==========================================
// A. Načítanie príkazu na zápis poistiek (Write Fuse)
digitalWrite(pinXA1, HIGH);
digitalWrite(pinXA0, LOW);
digitalWrite(pinBS1, LOW);
nastavZbernicu(0x40); // Príkaz: Zapíš poistku
pulsHodiny();
pulsZapis();
// B. Načítanie hodnoty poistky (Data)
digitalWrite(pinXA1, LOW);
digitalWrite(pinXA0, HIGH);
nastavZbernicu(0xD9); // Hodnota: 0xD9 (SPIEN povolené, reset funkčný)
pulsHodiny();
// C. Aktivácia zápisu špecificky pre HIGH bajt poistiek (BS1 = HIGH)
digitalWrite(pinXA1, LOW);
digitalWrite(pinXA0, LOW);
digitalWrite(pinBS1, HIGH); // BS1 = 1 prepína logiku na High Byte
pulsZapis();
delay(10); // Čakanie 10 ms na dokončenie fyzického zápisu do EEPROM bunky poistiek
// ==========================================
// 3. BEZPEČNÉ UKONČENIE A ODPOJENIE
// ==========================================
digitalWrite(pinXA1, LOW);
digitalWrite(pinXA0, LOW);
digitalWrite(pinBS1, LOW);
nastavZbernicu(0x00);
digitalWrite(pinVCC, LOW); // 1. Vypni 5V napájanie
delayMicroseconds(10);
digitalWrite(pinRESET_12V, LOW); // 2. Vypni 12V z pinu RESET
// Signalizácia úspechu - LED bude rýchlo blikať
for(int i=0; i<20; i++) {
digitalWrite(ledPin, HIGH); delay(100);
digitalWrite(ledPin, LOW); delay(100);
}
}
void loop() {
// Prázdna slučka, aby sa program nespúšťal znova a znova
}
-
jankrizan
- Příspěvky: 176
- Registrován: 30 pro 2007, 00:00
-
jankrizan
- Příspěvky: 176
- Registrován: 30 pro 2007, 00:00