Fusebit doctor

Dotazy na technické problémy, vlastní řešení technických problémů

Moderátor: Moderátoři

Zpráva
Autor
jankrizan
Příspěvky: 176
Registrován: 30 pro 2007, 00:00

Fusebit doctor

#1 Příspěvek od jankrizan »

Zdravím. Poradí mi niekto, kde zoženiem upravený firmware AVR fusebit doctor-a s čipom Atmega328PB. Používam momentálne verziu 2.11, na čip Atmega328P, tá ho však nemá. Nejaké závany o frmware 2.14 som čítal,(údajne tam je implementovaná), ale nikde ho nemôžem na internete najsť. Ani AI nevie poradiť, dokoncane nemôže dať odkazy, (asi z dôvodu ochrany aut.práv?). Pôvodná 2.11 sa síce dá oklamať určitým postupom (takto sa mi podarilo odblokovať zamknutú Atmega328PB), ale je to preklikávanie cez menu v termináli. Alebo, vie niekto, kto to už robil, kde sa prepíšu v hexe trojica bajtov 1E 95 11(MEGA324AU) na 1E 95 16(MEGA328PB). Signatúry názvu som prepísal, ale tá 16-ka nie je v databáze v HEX-e a tým nevie nájsť správny čip. A kompilátor na zdrojový kod .bas súbory nemám, takže ak aj vie niekto zdrojový kod.bas, ja to neviem skompilovať. Ak je to "tajné", pošlite SZ, a dohodneme sa. Ďakujem.
masar
Příspěvky: 14587
Registrován: 03 pro 2005, 00:00

#2 Příspěvek od masar »

Tady to není?
:wink:
PabloX
Příspěvky: 986
Registrován: 16 kvě 2005, 00:00
Bydliště: Ruzomberok

#3 Příspěvek od PabloX »

.bas som kedysi kompiloval pod Bascom-AVR (čo som si všimol, tak Poliaci ho radi používajú).
jankrizan
Příspěvky: 176
Registrován: 30 pro 2007, 00:00

#4 Příspěvek od jankrizan »

Dik masar, ale nie je. Tá 2.14 je nejaký mne neznámy nezmysel. Aspoň mne to nefunguje.
masar
Příspěvky: 14587
Registrován: 03 pro 2005, 00:00

#5 Příspěvek od masar »

Ten hex v. 14c pochází od autora "Gennadij" a je diskutován v tomto fóru. Možná je určen pro jinou desku (z téhož fóra).
:wink:
samec
Příspěvky: 6823
Registrován: 19 pro 2017, 00:00

#6 Příspěvek od samec »

Tak si tie poistky zapni manuálne trebárs pomocou Arduina. K arduinu budeš potrebovať ešte dva tranzistory alebo jeden optočlen na spínanie 12V.

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. :wink:

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

#7 Příspěvek od jankrizan »

Ono, ja nemám problém s poistkami, ako ich zapnúť, vypnúť a pod. Môj problém je zablokované poistky (zamknuté) na konkretnom čipe. S fusebitom ich aj odomknem aj prepíšem (a TL866A prepíšem kedykoľvek), len to musím robiť pod cudzím názvom čipu - napr.Atmega324PA - ID=1E 95 11, ale môj čip je Atmega328PB - ID=1E 95 16, čo je nový čip a vtedy, keď vyvíjali firmware ešte čip neexistoval. Preto to chcem doplniť do databáze doctora, aby som neklikal s prepisovaním ID čipu. Je pravda, že tých čipov zase toľko nerobím, ale predsa to je zase cool to mať v poriadku (tzv. profesionálne).
jankrizan
Příspěvky: 176
Registrován: 30 pro 2007, 00:00

#8 Příspěvek od jankrizan »

Tak sa mi podarilo zohnať tú verziu 2.14c a v nej je Atmega328PB a aj pár naviac. Akurát nefunguje manual/auto režim, ale to je vec hardweru. S tým sa ešte pohrám a bude to "pravé orechové".

Zpět na „Poradna“