Пн май 10, 2021 17:11:31
// Желаемая конфигурация предохранителя
//Фьюзбит доктор для Меги 8/48/88/168/328
//После лечения чип снова виден для ISP программатора
//нужные фьюзы раскоментировать ненужные закоментировать
//#define HFUSE 0xD9 // дефолтные фьюзы для ATmega 8
//#define LFUSE 0xE1 // дефолтные фьюзы для ATmega 8
//#define HFUSE 0xDF // дефолтные фьюзы для ATmega 168
//#define LFUSE 0x62 // дефолтные фьюзы для ATmega 168
#define HFUSE 0xD9 // дефолтные фьюзы для ATmega 328
#define LFUSE 0x62 // дефолтные фьюзы для ATmega 328
/*
HVFuse - Use High Voltage Programming Mode to Set Fuses on ATmega48/88/168
09/23/08 Jeff Keyzer http://mightyohm.com
The HV programming routines are based on those described in the
ATmega48/88/168 datasheet 2545M-AVR-09/07, pg. 290-297
This program should work for other members of the AVR family, but has only
been verified to work with the ATmega168. If it works for you, please
let me know! http://mightyohm.com/blog/contact/
*/
// Desired fuse configuration
#define HFUSE 0xDF // Default for ATmega48/88/168, for others see
#define LFUSE 0x62 // http://www.engbedded.com/cgi-bin/fc.cgi
// Pin Assignments
#define DATA PORTD // PORTD = Arduino Digital pins 0-7
#define DATAD DDRD // Data direction register for DATA port
#define VCC 8
#define RDY 12 // RDY/!BSY signal from target
#define OE 11
#define WR 10
#define BS1 9
#define XA0 13
#define XA1 18 // Analog inputs 0-5 can be addressed as
#define PAGEL 19 // digital outputs 14-19
#define RST 14 // Output to level shifter for !RESET
#define BS2 16
#define XTAL1 17
#define BUTTON 15 // Run button
void setup() // run once, when the sketch starts
{
// Set up control lines for HV parallel programming
DATA = 0x00; // Clear digital pins 0-7
DATAD = 0xFF; // set digital pins 0-7 as outputs
pinMode(VCC, OUTPUT);
pinMode(RDY, INPUT);
pinMode(OE, OUTPUT);
pinMode(WR, OUTPUT);
pinMode(BS1, OUTPUT);
pinMode(XA0, OUTPUT);
pinMode(XA1, OUTPUT);
pinMode(PAGEL, OUTPUT);
pinMode(RST, OUTPUT); // signal to level shifter for +12V !RESET
pinMode(BS2, OUTPUT);
pinMode(XTAL1, OUTPUT);
pinMode(BUTTON, INPUT);
digitalWrite(BUTTON, HIGH); // turn on pullup resistor
// Initialize output pins as needed
digitalWrite(RST, 1); // Level shifter is inverting, this shuts off 12V
}
void loop() // run over and over again
{
while(digitalRead(BUTTON) == HIGH) { // wait until button is pressed
}
// Initialize pins to enter programming mode
digitalWrite(PAGEL, LOW);
digitalWrite(XA1, LOW);
digitalWrite(XA0, LOW);
digitalWrite(BS1, LOW);
digitalWrite(BS2, LOW);
// Enter programming mode
digitalWrite(VCC, HIGH); // Apply VCC to start programming process
digitalWrite(WR, HIGH); // Now we can assert !OE and !WR
digitalWrite(OE, HIGH);
delay(1);
//chip erase
digitalWrite(RST, 0);
digitalWrite(XA1, 1);
digitalWrite(XA0, 0);
digitalWrite(BS1, 0);
sendcmd(B10000000);
delay(1);
digitalWrite(XTAL1, HIGH);
digitalWrite(WR, 0);
delay(100);
//chip erase
sendcmd(B01000000); // Send command to enable fuse programming mode
writefuse(HFUSE, true);
// Now we program LFUSE
sendcmd(B01000000);
writefuse(LFUSE, false);
delay(1000); // wait a while to allow button to be released
// Exit programming mode
digitalWrite(RST, 1);
// Turn off all outputs
DATA = 0x00;
digitalWrite(OE, LOW);
digitalWrite(WR, LOW);
digitalWrite(PAGEL, LOW);
digitalWrite(XA1, LOW);
digitalWrite(XA0, LOW);
digitalWrite(BS1, LOW);
digitalWrite(BS2, LOW);
digitalWrite(VCC, LOW);
}
void sendcmd(byte command) // Send command to target AVR
{
// Set controls for command mode
digitalWrite(XA1, HIGH);
digitalWrite(XA0, LOW);
digitalWrite(BS1, LOW);
//DATA = B01000000; // Command to load fuse bits
DATA = command;
digitalWrite(XTAL1, HIGH); // pulse XTAL to send command to target
delay(1);
digitalWrite(XTAL1, LOW);
//delay(1);
}
void writefuse(byte fuse, boolean highbyte) // write high or low fuse to AVR
{
// if highbyte = true, then we program HFUSE, otherwise LFUSE
// Enable data loading
digitalWrite(XA1, LOW);
digitalWrite(XA0, HIGH);
delay(1);
// Write fuse
DATA = fuse; // set desired fuse value
digitalWrite(XTAL1, HIGH);
delay(1);
digitalWrite(XTAL1, LOW);
if(highbyte == true)
digitalWrite(BS1, HIGH); // program HFUSE
else
digitalWrite(BS1, LOW);
digitalWrite(BS2, LOW);
digitalWrite(WR, LOW);
delay(1);
digitalWrite(WR, HIGH);
delay(100);
}
Пн май 10, 2021 21:12:13
но потом решил дописать программу получше, но в итоге опять её залочил
Пн май 10, 2021 21:53:10
Пн май 10, 2021 22:16:27
parovoZZ писал(а):из программы аврки не лочатся.
Пн май 10, 2021 22:41:25
Вт май 11, 2021 08:02:36
Вт май 11, 2021 09:06:02
Вт май 11, 2021 09:37:13
NStorm писал(а):slav0n, это бред. Это не из программы. Из программы невозможно поменять фьюзы.
Вт май 11, 2021 09:44:29
Вт май 11, 2021 10:01:22
writefuse(HFUSE, true);
#define HFUSE 0xDF // Default for ATmega48/88/168, for others see
Вт май 11, 2021 10:26:55
Вт май 11, 2021 11:56:50
Вт май 11, 2021 12:37:34
Вт май 11, 2021 13:10:35
Вт май 11, 2021 13:47:55
Михаил_avr, подключайтесь по терминалу (UART) к доктору и смотрите вывод.
Вт май 11, 2021 14:33:01
Вт май 11, 2021 14:46:22
но потом решил дописать программу получше, но в итоге опять её залочил
Вт май 11, 2021 14:51:42
Вт май 11, 2021 14:54:01
Вт май 11, 2021 14:57:22