Ciao a tutti,
domanda breve e concisa:
mi chiedevo se modificando i registri del prescaler dallo sketch c'è il rischio di briccare il micro.
Ho letto un po di thread ma non mi è chiaro :
Ciao a tutti,
domanda breve e concisa:
mi chiedevo se modificando i registri del prescaler dallo sketch c'è il rischio di briccare il micro.
Ho letto un po di thread ma non mi è chiaro :
Risposta breve e concisa: no.
Quanto ne sei sicuro?
avrdude: Yikes! Invalid device signature.
Double check connections and try again, or use -F to override
this check.
Risolto con questa guida.
Per arrivare al blocco ho caricato sull'Attiny questo sketch, che mi ha settato il prescaler a 32, quindi 8MHz/32 = 250kHz
void setup() {
pinMode(0, INPUT);
pinMode(1, INPUT);
pinMode(2, INPUT);
pinMode(3, INPUT);
pinMode(4, INPUT);
digitalWrite(0, HIGH);
digitalWrite(1, HIGH);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
CLKPR = ((1 << CLKPCE)|(0 << CLKPS3)| (0 << CLKPS2)|(0 << CLKPS1)| (0 << CLKPS0));
CLKPR = ((0 << CLKPCE)|(0 << CLKPS3)| (0 << CLKPS2)|(1 << CLKPS1)| (1 << CLKPS0));
}
void loop() {
// put your main code here, to run repeatedly:
}
a questo punto mi sa che si possa briccare
"Brickare" implica che sia irrecuperabile, visto che tu lo hai recuperato evidentemente non era brickato. Quel che scrivi in CLKPR viene perso allo spegnimento, non è permanente, per cui la situazione è SEMPRE recuperabile.
Un modo relativamente comune per "brickare" un ATtiny è settare i suoi fuse in qualche modo che non sei preparato a gestire, tipo disabilitando il reset o settando un clock esterno, ma anche in questo caso puoi recuperarlo con l'High Voltage Programming, che per gli ATtiny non richiede nemmeno chissà quale circuito.
I casi di bricking veri e proprio, quelli irrecuperabili, sono quelli in cui fisicamente danneggi il chip, ad esempio superando i suoi limiti elettrici, tipo mettendo 24v su un pin.
Quel che scrivi in CLKPR viene perso allo spegnimento, non è permanente, per cui la situazione è SEMPRE recuperabile.
ok, però dopo non riesco più a ricarcare più lo sketch. Può essere che il programmatore non faccia in tempo a "prendere possesso del micro" prima che termini il setup con il cambio di clock? Perdona il mio lessico non proprio tecnico farò altri test
In teoria no, visto che il programmatore controlla il pin di reset dell'ATtiny, però non sono così esperto di quel che succede a basso livello durante la procedure di programmazione, per cui boh :D.
Mettendo un delay di 5 secondi prima del cambio del clock riesco a riprogrammare, anche se non al primo tentativo, ce ne vogliono due o tre.. l'errore tra i tentativi è sempre
avrdude: Yikes! Invalid device signature.
Double check connections and try again, or use -F to override
this check.
proverò anche con altri clock
Ho fatto le prove con tutti i clock e mettendo un delay nel setup sono sempre riuscito a riprogrammare, anche se al secondo/terzo tentativo.
La prova l'ho fatta con il bootloader impostato a 1MHz. Con questo clock il consumo è a circa 1600uA.
Fino a 500kHz riesco a riprogrammare al primo colpo, sotto i 500kHz ci vogliono due tentativi. Al primo tentativo esce questo errore avrdude: Yikes! Invalid device signature.
** Double check connections and try again, or use -F to override**
** this check.** ma qualcosa succede, infatti l'assorbimento passa da xxx (dipendente dal clock ovviamente) a 1600uA, cioè quanto consuma a 1Mhz. Al successivo tentativo la programmazione va a buon fine(si deve essere veloci a ripremere carica).
E' tutto, non so cosa succeda ma funziona
Se interessa uso questo sketch
#define clk_8MHz (0 << CLKPCE) | (0 << CLKPS3) | (0 << CLKPS2) | (0 << CLKPS1) | (0 << CLKPS0)
#define clk_4MHz (0 << CLKPCE) | (0 << CLKPS3) | (0 << CLKPS2) | (0 << CLKPS1) | (1 << CLKPS0)
#define clk_2MHz (0 << CLKPCE) | (0 << CLKPS3) | (0 << CLKPS2) | (1 << CLKPS1) | (0 << CLKPS0)
#define clk_1MHz (0 << CLKPCE) | (0 << CLKPS3) | (0 << CLKPS2) | (1 << CLKPS1) | (1 << CLKPS0)
#define clk_500kHz (0 << CLKPCE) | (0 << CLKPS3) | (1 << CLKPS2) | (0 << CLKPS1) | (0 << CLKPS0)
#define clk_250kHz (0 << CLKPCE) | (0 << CLKPS3) | (1 << CLKPS2) | (0 << CLKPS1) | (1 << CLKPS0)
#define clk_125kHz (0 << CLKPCE) | (0 << CLKPS3) | (1 << CLKPS2) | (1 << CLKPS1) | (0 << CLKPS0)
#define clk_62kHz (0 << CLKPCE) | (0 << CLKPS3) | (1 << CLKPS2) | (1 << CLKPS1) | (1 << CLKPS0) //62.5
#define clk_31kHz (0 << CLKPCE) | (1 << CLKPS3) | (0 << CLKPS2) | (0 << CLKPS1) | (0 << CLKPS0) //31.250
#define clk_set (1 << CLKPCE) | (0 << CLKPS3) | (0 << CLKPS2) | (0 << CLKPS1) | (0 << CLKPS0)
void setup() {
pinMode(0, INPUT);
pinMode(1, INPUT);
pinMode(2, INPUT);
pinMode(3, INPUT);
pinMode(4, INPUT);
digitalWrite(0, HIGH);
digitalWrite(1, HIGH);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
delay(5000); // utilizzare sempre per evitare brick del micro. Se il micro bricka utilizzare guida su sketch ArduinoISP low speed
CLKPR = (clk_set);
CLKPR = (clk_1MHz);
}
void loop() {
}