Hur att låsa upp Digispark ATtiny85 och konvertera den till en fasad (1 / 8 steg)
Steg 1: Skiss för hög spänning programmering
En skiss för Uno finns här för upplåsning ATtiny85:
http://www.rickety.us/wp-content/uploads/2010/03/hv_serial_prog.pde
Koden är av Paul Willoughby och ursprungliga artikel för upplåsning kala ATtiny85 ICs här:
http://www.rickety.us/2010/03/Arduino-AVR-High-voltage-Serial-Programmer/
Skiss:
AVR högspännings-seriell programmerare
Ursprungligen skapad av Paul Willoughby 2010-03-20
www.rickety.us slash 2010/03/arduino-avr-high-voltage-serial-programmer/
Inspirerad av Jeff Keyzer mightyohm.com
Seriell programmering rutiner från ATtiny25/45/85 datablad
Önskad fuse konfiguration
#define HFUSE 0xDF / / standard för ATtiny25/45/85
#define LFUSE 0x62
#define RST 13 / / Output till nivå shifter för! ÅTERSTÄLLA från transistor till Pin 1
#define CLKOUT 12 / / Anslut till seriell klocka Input (SCI) stift 2
#define DATAIN 11 / / Anslut till seriella Data Output (SDO) stift 7
#define INSTOUT 10 / / Anslut till seriell instruktion Input (SII) stift 6
#define DATAOUT 9 / / Anslut till seriella Data ingång (SDI) stift 5
#define VCC 8 / / Anslut till VCC stift 8
int inByte = 0; inkommande seriell byte dator
int inData = 0; inkommande seriell byte AVR
void setup()
{
Ställa in kontroll linjer för HV parallell programmering
pinMode (VCC, OUTPUT);
pinMode (RST, OUTPUT);
pinMode (DATAOUT, OUTPUT);
pinMode (INSTOUT, OUTPUT);
pinMode (CLKOUT, OUTPUT);
pinMode (DATAIN, OUTPUT); konfigurerad som indata när i programmeringsläget
Initiera utgångsstift som behövs
digitalWrite (RST, hög); Nivå shifter Invertera, detta stänger av 12V
Starta serieport på 9600 bps:
Serial.BEGIN(9600);
establishContact(); Skicka en byte att upprätta kontakt tills mottagaren svarar
}
void loop()
{
om vi får en giltig byte, kör:
om (Serial.available() > 0) {
få inkommande byte:
inByte = Serial.read();
Serial.println(byte(inByte));
Serial.println ("in programmering Mode\n");
Initiera stift för att ange programmeringsläget
pinMode (DATAIN, OUTPUT); Tillfälliga
digitalWrite (DATAOUT, låg);
digitalWrite (INSTOUT, låg);
digitalWrite (DATAIN, låg);
digitalWrite (RST, hög); Nivå shifter Invertera, detta stänger av 12V
Ange högspännings-seriell programmeringsläget
digitalWrite (VCC, hög); Tillämpa VCC för att börja programmera process
delayMicroseconds(20);
digitalWrite (RST, låg); Slå på 12v
delayMicroseconds(10);
pinMode (DATAIN, indata); Release DATAIN
delayMicroseconds(300);
Programmering-läge
readFuses();
Skriva hfuse
Serial.println ("skriva hfuse");
shiftOut2 (DATAOUT, INSTOUT, CLKOUT, MSBFIRST, 0x40, 0x4C);
shiftOut2 (DATAOUT, INSTOUT, CLKOUT, MSBFIRST, HFUSE, 0x2C);
shiftOut2 (DATAOUT, INSTOUT, CLKOUT, MSBFIRST, 0x00, 0x74);
shiftOut2 (DATAOUT, INSTOUT, CLKOUT, MSBFIRST, 0x00, 0x7C);
Skriva lfuse
Serial.println ("skriva lfuse\n");
shiftOut2 (DATAOUT, INSTOUT, CLKOUT, MSBFIRST, 0x40, 0x4C);
shiftOut2 (DATAOUT, INSTOUT, CLKOUT, MSBFIRST, LFUSE, 0x2C);
shiftOut2 (DATAOUT, INSTOUT, CLKOUT, MSBFIRST, 0x00, 0x64);
shiftOut2 (DATAOUT, INSTOUT, CLKOUT, MSBFIRST, 0x00, 0x6C);
readFuses();
Serial.println ("spännande programmering Mode\n");
digitalWrite (CLKOUT, låg);
digitalWrite (VCC, låg);
digitalWrite (RST, hög); Stänga av 12v
}
}
void establishContact() {
medan (Serial.available() < = 0) {
Serial.println ("Välj en karaktär att fortsätta"); Skicka en inledande sträng
Delay(1000);
}
}
int shiftOut2 (uint8_t dataPin, uint8_t dataPin1, uint8_t clockPin, uint8_t bitOrder, byte val, byte värde1)
{
int i;
int inBits = 0;
Vänta tills DATAIN går hög
medan (! digitalRead(DATAIN));
Starta lite
digitalWrite (DATAOUT, låg);
digitalWrite (INSTOUT, låg);
digitalWrite (clockPin, hög);
digitalWrite (clockPin, låg);
för (jag = 0; jag < 8; i ++) {
om (bitOrder == LSBFIRST) {
digitalWrite (dataPin! (val & (1 << i)));
digitalWrite (dataPin1! (värde1 & (1 << i)));
}
annat {
digitalWrite (dataPin! (val & (1 << (7 - i)));
digitalWrite (dataPin1! (värde1 & (1 << (7 - i)));
}
inBits << = 1;
inBits | = digitalRead(DATAIN);
digitalWrite (clockPin, hög);
digitalWrite (clockPin, låg);
}
Slutet bitar
digitalWrite (DATAOUT, låg);
digitalWrite (INSTOUT, låg);
digitalWrite (clockPin, hög);
digitalWrite (clockPin, låg);
digitalWrite (clockPin, hög);
digitalWrite (clockPin, låg);
återvända inBits;
}
void readFuses() {
Läs lfuse
shiftOut2 (DATAOUT, INSTOUT, CLKOUT, MSBFIRST, 0x04, 0x4C);
shiftOut2 (DATAOUT, INSTOUT, CLKOUT, MSBFIRST, 0x00, 0x68);
inData = shiftOut2 (DATAOUT, INSTOUT, CLKOUT, MSBFIRST, 0x00, 0x6C);
Serial.Print ("lfuse läsningar som");
Serial.println (inData, HEX);
Läs hfuse
shiftOut2 (DATAOUT, INSTOUT, CLKOUT, MSBFIRST, 0x04, 0x4C);
shiftOut2 (DATAOUT, INSTOUT, CLKOUT, MSBFIRST, 0x00, 0x7A);
inData = shiftOut2 (DATAOUT, INSTOUT, CLKOUT, MSBFIRST, 0x00, 0x7E);
Serial.Print ("hfuse läsningar som");
Serial.println (inData, HEX);
Läs Eka
shiftOut2 (DATAOUT, INSTOUT, CLKOUT, MSBFIRST, 0x04, 0x4C);
shiftOut2 (DATAOUT, INSTOUT, CLKOUT, MSBFIRST, 0x00, 0x6A);
inData = shiftOut2 (DATAOUT, INSTOUT, CLKOUT, MSBFIRST, 0x00, 0x6E);
Serial.Print ("Eka läsningar som");
Serial.println (inData, HEX);
Serial.println();
}